Merit Experience Gain
DescrizioneStanchi della divisione "paritaria" dei Punti Esperienza alla fine delle battaglie?
Con questo script gli eroi del gruppo guadagnano EXP in base all'effettiva efficacia in combattimento: così un personaggio addormentato, paralizzato, o che pensa solo a difendersi, riceverà molti meno EXP di un eroe molto attivo! ^^
Questo sistema garantisce una certa varietà anche agli incontri casuali: per esempio è possibile far avanzare rapidamente di livello un personaggio, costringendolo in battaglia a fare il lavoro sporco tutto da solo... mentre gli altri stanno beati a guardare. ^^
Inoltre è possibile impostare diversi valori per accelerare/rallentare l'avanzamento di Combattenti/Incantatori, ecc., e molto altro.
Dal momento che stavo sviluppando lo script per il mio "Twilight War", e che mi costava poco adattarlo, ho deciso di postarlo qui, sperando possa interessare a qualcuno.
Autore
Shuuchan
(C'est moi!)
Allegati
Ecco lo script:
Merit Experience Gain
Istruzioni per l'uso
Inserire lo script sotto "Materials". Seguire le indicazioni all'interno dello script per le (poche) impostazioni da effettuare.
#===============================================================================
# ** Merit Experience Gain
#-------------------------------------------------------------------------------
# by Shuuchan
# versione 1.0
# 18-07-2008
# RGSS2 / RPG Maker VX
#===============================================================================
#===============================================================================
# Inserire questo script sotto "Materials" nella sezione "Script Editor"
#===============================================================================
#===============================================================================
# Definizione variabili: NON TOCCARE!! -_*
#-------------------------------------------------------------------------------
class Game_Actor < Game_Battler
attr_accessor :merit
attr_accessor :gain_rate
attr_accessor :act_kind
attr_accessor :ritard
attr_accessor :solit
attr_accessor :extrabattle_exp
attr_accessor :extraexp_mult
attr_accessor :special_exp_item
attr_accessor :mult_item
#===============================================================================
#===============================================================================
# ___________________________
# ** IMPOSTAZIONI GENERALI **
#
#-------------------------------------------------------------------------------
# ** Descrizione del funzionamento dello script:
#-------------------------------------------------------------------------------
#
# Questo script permette di suddividere i punti esperienza tra gli eroi del
# proprio gruppo in proporzione ai meriti del singolo eroe in battaglia. In tal
# modo eroi che si difendono passivamente o sono penalizzati nell'agire (per
# paralisi, cecità, ecc.) ottengono meno EXP di quelli che si sono... impegnati
# più a fondo! ^^
# Per tornare al metodo di distribuzione classico basterà usare il seguente Call
# Script:
#
# $merit_exp = false
#
# Questo può essere utile per l'assegnazione di punti esperienza di Boss, ecc.
# Per riattivare lo script basterà poi usare lo stesso Call Script con "true",
# ovvero: $merit_exp = true
#
#-------------------------------------------------------------------------------
# ** Descrizione delle categorie di personaggi
#-------------------------------------------------------------------------------
#
# É possibile diversificare il guadagno di punti esperienza da eroe ad eroe,
# assegnando ai personaggi le seguenti categorie:
#
# COMBATTENTI: ideale per i Guerrieri e per quelle classi che fanno un uso quasi
# nullo di abilità. Guadagnano punti esperienza soprattutto con
# la semplice azione "Attacco".
# SEMI_COMBAT: quasi come i Combattenti, ma con l'uso di qualche abilità.
# Ideale per Paladini e classi simili.
# INCANTATORI: ideale per i Maghi e per quelle classi che fanno uso di un'ampia
# gamma di abilità. Guadagnano EXP soprattutto tramite l'uso di
# "Abilità", specialmente di quelle offensive.
# SEMI_INCANT: quasi come gli Incantatori, ma con una maggiore propensione per
# l'attacco normale. Ideale per i Sacerdoti, e per quelle classi
# che hanno più abilità "di utilità" che offensive.
# MULTICLASSE: una via di mezzo tra Semi_Incantatori e Semi_Combattenti.
#
# Per assegnare una determinata categoria ad un personaggio basta inserirne l'ID
# nella sezione qui sotto. Se, per esempio, volessi inserire gli eroi n° 1, 3
# e 7 tra i Combattenti e il n° 4 tra gli Incantatori, dovrei scrivere:
#
# COMBATTENTI = [1, 3, 7]
# INCANTATORI = [4]
#
# Gli eroi non inseriti nelle categorie appartengono alla categoria "standard",
# che non garantisce bonus sugli EXP né per l'uso di abilità né per l'attacco.
# Quindi un eroe "standard" riceverà in genere meno EXP se inserito in una
# compagnia di eroi "categorizzati". É comunque possibile creare compagnie
# costituite esclusivamente di eroi "standard".
COMBATTENTI = [1,2]
SEMI_COMBAT = []
MULTICLASSE = []
SEMI_INCANT = []
INCANTATORI = [3,4]
#-------------------------------------------------------------------------------
# ** Bilanciamento per la distribuzione dei Punti Esperienza
#-------------------------------------------------------------------------------
#
# Lo script è stato concepito per essere bilanciato e garantire, a parità di
# "meriti" in battaglia, più o meno la stessa quantità di EXP a tutti gli eroi.
# In ogni caso è possibile modificare il seguente parametro per eventuali
# aggiustamenti.
#
BILANCIAM = 0 # Impostabile da -5 a 5. Numeri negativi favoriscono gli
# Incantatori e sfavoriscono i Combattenti durante la
# distribuzione dei punti esperienza. Viceversa numeri
# positivi favoriscono i Combattenti a scapito degli
# Incantatori. Su "0" gli Incantatori sono lievemente
# svantaggiati (come in quasi tutti i giochi di ruolo
# "occidentali", che controbilanciano la potenza degli
# "incantesimi" rallentando l'avanzamento di livello di
# chi li lancia).
#-------------------------------------------------------------------------------
# ** Altre Impostazioni
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
RITARDATARI = true # Se impostato su "true" favorisce gli eroi con livello più
# basso durante la distribuzione dei punti esperienza.
# Ideale per evitare che singoli eroi molto forti diventino
# troppo in fretta di alto livello, lasciando indietro gli
# altri membri del gruppo.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
SOLITARIO = false # Se impostato su "true" favorisce gruppi con pochi eroi,
# che quindi guadagneranno più punti esperienza rispetto a
# gruppi numerosi.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
$MAX_DMG = 400 # Massimo danno/guarigione considerato durante la
# distribuzione di punti esperienza. Danni o guarigioni di
# maggior consistenza saranno ricondotti a questo valore,
# e l'eccedenza non verrà calcolata per la spartizione
# degli EXP.
# Utile per evitare che abilità molto potenti consentano di
# guadagnare un eccessivo numero di EXP.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
EXP_ITEM = true # Se impostato su "true", gli eroi aumenteranno un po'
# il proprio "merito" in battaglia anche usando degli
# oggetti.
ITEM_MULTIPLIER = 5 # Impostabile da 1 in su (è comunque sconsigliabile
# inserire valori più grandi di 20).
# Controlla la quantità di EXP ottenuti usando oggetti
# in battaglia: maggiore il valore, maggiori gli EXP
# ottenuti.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
EXTRA_BATTLE_EXP = true # Se impostato su "true", gli eroi guadagneranno una
# piccola quantità di punti esperienza utilizzando
# abilità anche fuori da una battaglia.
EXTRA_EXP_MULTIPLIER = 1 # Impostabile da 1 in su (è comunque sconsigliabile
# inserire valori più grandi di 5).
# Controlla la quantità di EXP ottenuti tramite
# l'EXTRA_BATTLE_EXP: maggiore il valore, maggiori
# i punti esperienza ottenuti per l'uso di abilità
# fuori da una battaglia.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# ** FINE DELLE IMPOSTAZIONI **
#===============================================================================
def setup(actor_id)
actor = $data_actors[actor_id]
@actor_id = actor_id
@name = actor.name
@character_name = actor.character_name
@character_index = actor.character_index
@face_name = actor.face_name
@face_index = actor.face_index
@class_id = actor.class_id
@weapon_id = actor.weapon_id
@armor1_id = actor.armor1_id
@armor2_id = actor.armor2_id
@armor3_id = actor.armor3_id
@armor4_id = actor.armor4_id
@level = actor.initial_level
@exp_list = Array.new(101)
make_exp_list
@exp = @exp_list[@level]
@skills = []
@merit = 0
@ritard = RITARDATARI
@solit = SOLITARIO
@special_exp_item = EXP_ITEM
@mult_item = ITEM_MULTIPLIER
@extrabattle_exp = EXTRA_BATTLE_EXP
@extraexp_mult = EXTRA_EXP_MULTIPLIER
equilibrio = BILANCIAM
if COMBATTENTI.include?(actor_id)
act_kind = 1
@gain_rate = 10 + (equilibrio +1)
elsif INCANTATORI.include?(actor_id)
act_kind = 2
@gain_rate = 10 - (equilibrio +1)
elsif SEMI_COMBAT.include?(actor_id)
act_kind = 3
@gain_rate = 10 + (equilibrio +1)/2
elsif SEMI_INCANT.include?(actor_id)
act_kind = 4
@gain_rate = 10 - (equilibrio +1)/2
elsif MULTICLASSE.include?(actor_id)
act_kind = 5
@gain_rate = 10
else
act_kind = 0
@gain_rate = 10
end
for i in self.class.learnings
learn_skill(i.skill_id) if i.level <= @level
end
clear_extra_values
recover_all
end
end
#===============================================================================
class Scene_Title < Scene_Base
alias specialexp_cr_game_obj create_game_objects
def create_game_objects
specialexp_cr_game_obj
$specialexp_min_lev = 200
$merit_exp = true
end
end
#===============================================================================
class Game_Battler
alias specialexp_att_effect attack_effect
def attack_effect(attacker)
specialexp_att_effect(attacker)
if @hp_damage.abs < $MAX_DMG
mer = @hp_damage.abs
else
mer = $MAX_DMG
end
if attacker.is_a?(Game_Actor)
if (attacker.ritard == true) and ($specialexp_min_lev < 200 and $specialexp_min_lev > 0)
pialla = ((attacker.level) - $specialexp_min_lev + 1).to_f
else
pialla = 1
end
attacker.merit += (mer.to_f/pialla + (attacker.gain_rate).to_f*10).round
if (attacker.act_kind == 1)
attacker.merit += ((mer.to_f/pialla) * (attacker.gain_rate).to_f/10).round
elsif (attacker.act_kind == 3)
attacker.merit += (((mer.to_f/pialla) * ((attacker.gain_rate).to_f/10)*2)/3).round
elsif (attacker.act_kind == 5)
attacker.merit += (((mer.to_f/pialla) * (attacker.gain_rate).to_f/10)/2).round
elsif (attacker.act_kind == 4)
attacker.merit += (((mer.to_f/pialla) * (attacker.gain_rate).to_f/10)/3).round
elsif attacker.act_kind == 2
attacker.merit -= (mer.to_f/pialla) * (1/((20 - attacker.gain_rate).to_f)).round
end
end
end
#-------------------------------------------------------------------------------
alias specialexp_sk_effect skill_effect
def skill_effect(user, skill)
specialexp_sk_effect(user, skill)
if @hp_damage.abs < $MAX_DMG
mer = @hp_damage.abs + @mp_damage.abs
else
mer = $MAX_DMG
end
if user.is_a?(Game_Actor)
if ($game_temp.in_battle == false) and (user.extrabattle_exp == true)
tempexp = ((user.level) * (user.extraexp_mult) * (user.gain_rate).to_f/10).round
user.gain_exp(tempexp, true)
end
if (user.ritard == true) and ($specialexp_min_lev < 200 and $specialexp_min_lev > 0)
pialla = ((user.level) - $specialexp_min_lev + 1).to_f
else
pialla = 1
end
user.merit += (mer.to_f/(2 * pialla) + (user.gain_rate).to_f*10).round
if (user.act_kind == 2)
user.merit += (mer.to_f/(2 * pialla) * ((user.gain_rate).to_f/10)).round
elsif (user.act_kind == 4)
user.merit += ((mer.to_f/(2 * pialla) * (((user.gain_rate).to_f/10))*2)/3).round
elsif (user.act_kind == 5)
user.merit += ((mer.to_f/(2 * pialla) * ((user.gain_rate).to_f/10))/2).round
elsif (user.act_kind == 3)
user.merit += ((mer.to_f/(2 * pialla) * ((user.gain_rate).to_f/10))/3).round
elsif user.act_kind == 1
user.merit -= ((mer.to_f/(2 * pialla)) * (1/((20 - user.gain_rate).to_f))).round
end
end
end
#-------------------------------------------------------------------------------
alias specialexp_it_effect item_effect
def item_effect(user, item)
specialexp_it_effect(user, item)
if user.is_a?(Game_Actor)
if (user.ritard == true) and ($specialexp_min_lev < 200 and $specialexp_min_lev > 0)
pialla = ((user.level) - $specialexp_min_lev + 1).to_f
else
pialla = 1
end
if (user.level > 10) or (user.level <= 0)
molt_ogg = 10
else
molt_ogg = user.level
end
if user.special_exp_item == true
user.merit += ((molt_ogg).to_f/pialla) * (20 * user.mult_item) * ((user.gain_rate).to_f/10).round
end
end
end
end
#===============================================================================
class Scene_Battle < Scene_Base
alias specialexp_start process_battle_start
def process_battle_start
$specialexp_min_lev = 200
for eroe in $game_party.members
eroe.merit = 0
$specialexp_min_lev = eroe.level if eroe.level < $specialexp_min_lev
end
specialexp_start
end
def process_victory
@info_viewport.visible = false
@message_window.visible = true
RPG::BGM.stop
$game_system.battle_end_me.play
unless $BTEST
$game_temp.map_bgm.play
$game_temp.map_bgs.play
end
display_gold
display_drop_items
display_specialexp_level_up
battle_end(0)
end
def display_gold
gold = $game_troop.gold_total
$game_party.gain_gold(gold)
text = sprintf(Vocab::Victory, $game_party.name)
$game_message.texts.push('\|' + text)
if gold > 0
text = sprintf(Vocab::ObtainGold, gold, Vocab::gold)
$game_message.texts.push('\.' + text)
end
wait_for_message
end
def display_specialexp_level_up
total_exp = $game_troop.exp_total
total_merit = 0
membri = 0
$game_message.new_page
for actor in $game_party.existing_members
total_merit += actor.merit
membri += 1
membri = 2 if actor.solit
end
for actor in $game_party.existing_members
if $merit_exp == true
autoexp_a = total_exp * ((actor.merit).to_f / total_merit.to_f) * membri
else
autoexp_a = total_exp
end
exp_a = autoexp_a.round
if exp_a > 0
nome = actor.name + ": "
text = sprintf(Vocab::ObtainExp, exp_a)
$game_message.texts.push('\.' + nome + text)
end
end
for actor in $game_party.existing_members
if $merit_exp == true
autoexp_b = total_exp * ((actor.merit).to_f / total_merit.to_f) * membri
else
autoexp_b = total_exp
end
exp_b = autoexp_b.round
last_level = actor.level
last_skills = actor.skills
actor.gain_exp(exp_b, true)
end
wait_for_message
end
end
#===============================================================================
# FINE DELLO SCRIPT
#===============================================================================
Compatibilità
Questo sistema dovrebbe essere compatibile con la maggior parte dei BS (sia frontali che laterali), purché strutturati a turni come il BS standard dell'RPGVX.
Lo script NON É COMPATIBILE con gli ABS, e in generale con quei BS che modificano pesantemente la struttura a turni.
Bugs e Conflitti Noti
Incompatibilità con gli ABS
Altri Dettagli
Fatemi sapere se ci sono problemi, e se vi piace il sistema.
EDIT: come al solito nella fretta avevo postato la versione precedente a quella definitiva. Quella presente ora è quella corretta...
Modificato da shuuchan, 18 July 2008 - 17:47 PM.