Shyno19 Ninja (niveau 5)
Messages postés : 220 Date d'inscription : 21/09/2011 Jauge LPC :
| Sujet: [XP] Compétences passives à la FF9+bonus Ven 22 Fév 2013 - 14:56 | |
| Bonjour Après plusieurs mois d'absence et un reformatage de mon pc je reviens =) Je viens vous proposer un script de gestion d’habilité (ou compétences) passives. L'auteur est Sh4k4 du forum RPG créative dont voici le lien du script : Lien vers le cript Je met aussi le scipt ici car j'ai fait une petite correction(pas très importante) qui pourrait en aider certains : - Code:
-
# Défini si le menu est entièrement transparent où non, utile pour ceux qui font des Custom Menu System en event. TRANSPARENT = false
# Défini l'endroit où l'on retourne en sortant. # RETOUR = 0 signifie que l'on retourne sur le menu. # RETOUR = 1 signifie que l'on retourne sur la map directement, pour ceux qui font des Custom Menu System event RETOUR = 0
# Nombre de Points gagné du niveau 1 à 10. POINTS_PAR_NIVEAU = 1 # A partir du niveau 20, ces points sont doublés, au niveau 30, ils sont triplés, etc...
#=============================================================================== # ¦ Gestions d'abilités passives (FF9-like) #------------------------------------------------------------------------------- # Auteur : Sh4k4 # Version : 1.0 # Logiciel : RMXP # Date : 27/06/2008 #------------------------------------------------------------------------------- # Permet d'attribuer à chaque classe un arbre d'abilités qui seront ainsi disponibles et activables # avec des CP que l'on gagne à chaque niveau. # On peut les activer et les désactiver (on récupère alors les CP pour les réattribuer ailleurs)
# ¤INSTALLATION # Il suffit de copier coller ce script au dessus de Main. # # # ¤UTILISATION # # Si vous utilisez un Custom Menu System en event, utilisez $scene = Scene_Ability.new(0) pour ouvrir le menu des abilités. # On remplace 0 par l'index du héros du groupe. # 0 = héros 1 du groupe, 1 = 2eme héros du groupe, etc # # Il faut simplement que vous créeiez la listes des abilités pour chaque classe. # Pour cela, regarder un peu plus bas.
# On peut modifier les variables tout en haut du script pour régler à sa guise.
#======================================================================== # Gestion des listes d'abilités de chaque classe. #========================================================================
class Scene_Title alias init5 main def main init5 $game_abilities = [] for i in 1...$data_classes.size $game_abilities[i] = [] end
#======================================================================== # IMPORTANT !!! # C'est ici que vous allez créer vos listes d'abilités pour chaque classe. #======================================================================== # Voici comment cela fonctionne : # # $game_abilities[ID CLASSE].push(Ability.new("NOM ABILITE", Niveau requit, Points requits, [N° Effet, Valeur d'effet], "Description de l'abilité"))
# ID CLASSE doit être remplacé par l'ID de la classze à qui on attribue l'abilité.
# "NOM ABILITE" doit être remplacé par le nom de l'abilité entre guillemets.
# Niveau requit correspond au niveau à partir duquel l'abilité devient disponible. # on ne peut voir l'abilité dans le menu qu'une fois le niveau atteint.
# Points requits correspond au nombre de CP nécessaire pour activer l'abilité.
# N° Effet à remplacer par un N° Effet pour choisir l'effet de l'abilité, voir plus bas.
# Valeur d'effet valeur qui va avec le N° Effet, elle indique le nombre voulu. Par exemple # si le N° Effet correspond à un ajout de Force, la Valeur d'effet sert à # indiquer le nombre de Force ajouté. Pour un statut ajouté, ça signifiera # l'ID du statut que l'on souhaite ajouter. # # Description de l'abilité correspond à la description qui s'affichera. # # # =begin
N° Effets :
1 : ATK + x 2 : FORCE + x 3 : INTELLIGENCE + x 4 : DEXTERITE + x 5 : AGILITE + x 6 : DEF PHYSIQUE + x 7 : DEF MAGIQUE + x 8 : PV + x 9 : PM + x 10 : EVA 11 : AUTO STATUT x x correspond à la Valeur d'effet, spécifiée juste après le N° Effet.
Donc, prenons un exemple. On veut attribuer une abilité qui ajoute 5 de Force disponible au niveau 5 pour la classe Combatant et qui requiert l'attribution de 2 CP.
On procède ainsi :
$game_abilities[1].push(Ability.new("Force brute", 5, 2, [2,5], "Augmente la force de 5."))
On veut maintenant attribuer un statut Autor-barrière disponible au niveau 10, pour la classe Combattant, et qui requiert 5 CP.
$game_abilities[1].push(Ability.new("Auto-Barrière", 10, 5, [11,14], "Confère automatiquement le statut Barrière."))
(note: 14 correspond à l'ID du statut Barrière) Si le statut a une durée définie sur un nombre de tour, il se terminera après le nombre de tour et ne se remettra pas automatiquement. Si vous voulez un auto-Barrière avec un statut Barrière qui dure tout le combat il faut alors retirer les durées au statut (après copié collé Barrière par exemple)
Vous pouvez attribuer autant d'abilités que vous voulez, et aux classes que vous voulez. =end #---------------------------------------------------------------------------------------------- # Début de la gestion des listes d'abilités. #---------------------------------------------------------------------------------------------- $game_abilities[1].push(Ability.new("Force brute", 5, 2, [2,5], "Augmente la force de 5.")) $game_abilities[1].push(Ability.new("Niv+", 1, 1, [11,61], "Augmente l'EXP reçu de 50%.")) $game_abilities[1].push(Ability.new("Auto-Barrière", 10, 5, [11,14], "Confère automatiquement le statut Barrière.")) $game_abilities[1].push(Ability.new("Maîtrise d'arme", 8, 8, [1,10], "Augmente l'attaque de 10.")) $game_abilities[2].push(Ability.new("Santé", 5, 2, [8,50], "Augmente les PV max de 50.")) # à vous ........ #---------------------------------------------------------------------------------------------- # Fin de la gestion des listes d'abilités. #---------------------------------------------------------------------------------------------- end end
#======================================================================== # Modification des modules RPG #======================================================================== module RPG class Skill attr_accessor:ap end end
module RPG class Weapon attr_reader:skills def skills @skills = [] if @skills == nil return @skills end end end
#======================================================================== # Modification de Game_Actor pour gérer des ajouts de stats et les points d'abilités. #======================================================================== class Game_Actor < Game_Battler attr_accessor :ability_cp attr_accessor :add_atk attr_accessor :add_str attr_accessor :add_int attr_accessor :add_dex attr_accessor :add_agi attr_accessor :add_maxhp attr_accessor :add_maxsp attr_accessor :add_pdef attr_accessor :add_mdef attr_accessor :add_hit attr_accessor :add_eva attr_accessor :autostate
alias init4 setup def setup(actor_id) actor = $data_actors[actor_id] @ability_cp = 0 @add_atk = 0 @add_str = 0 @add_int = 0 @add_dex = 0 @add_agi = 0 @add_maxhp = 0 @add_maxsp = 0 @add_pdef = 0 @add_mdef = 0 @add_hit = 0 @add_eva = 0 @autostate = [] @level = actor.initial_level @table = [] for i in 1...99 u = i - 1 @table[u] = 1 if i == 1 @table[i] = @table[u] + POINTS_PAR_NIVEAU + POINTS_PAR_NIVEAU * (i/10) end @ability_cp = @table[actor.initial_level] init4(actor_id) end def base_maxhp return $data_actors[@actor_id].parameters[0, @level] + @add_maxhp end def base_maxsp return $data_actors[@actor_id].parameters[1, @level] + @add_maxsp end def base_str n = $data_actors[@actor_id].parameters[2, @level] + @add_str weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] n += weapon != nil ? weapon.str_plus : 0 n += armor1 != nil ? armor1.str_plus : 0 n += armor2 != nil ? armor2.str_plus : 0 n += armor3 != nil ? armor3.str_plus : 0 n += armor4 != nil ? armor4.str_plus : 0 return [[n, 1].max, 999].min end def base_dex n = $data_actors[@actor_id].parameters[3, @level] + @add_dex weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] n += weapon != nil ? weapon.dex_plus : 0 n += armor1 != nil ? armor1.dex_plus : 0 n += armor2 != nil ? armor2.dex_plus : 0 n += armor3 != nil ? armor3.dex_plus : 0 n += armor4 != nil ? armor4.dex_plus : 0 return [[n, 1].max, 999].min end def base_agi n = $data_actors[@actor_id].parameters[4, @level] + @add_agi weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] n += weapon != nil ? weapon.agi_plus : 0 n += armor1 != nil ? armor1.agi_plus : 0 n += armor2 != nil ? armor2.agi_plus : 0 n += armor3 != nil ? armor3.agi_plus : 0 n += armor4 != nil ? armor4.agi_plus : 0 return [[n, 1].max, 999].min end def base_int n = $data_actors[@actor_id].parameters[5, @level] + @add_int weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] n += weapon != nil ? weapon.int_plus : 0 n += armor1 != nil ? armor1.int_plus : 0 n += armor2 != nil ? armor2.int_plus : 0 n += armor3 != nil ? armor3.int_plus : 0 n += armor4 != nil ? armor4.int_plus : 0 return [[n, 1].max, 999].min end def base_atk weapon = $data_weapons[@weapon_id] return weapon != nil ? weapon.atk + @add_atk: 0 end def base_pdef weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] pdef1 = weapon != nil ? weapon.pdef : 0 pdef2 = armor1 != nil ? armor1.pdef : 0 pdef3 = armor2 != nil ? armor2.pdef : 0 pdef4 = armor3 != nil ? armor3.pdef : 0 pdef5 = armor4 != nil ? armor4.pdef : 0 return pdef1 + pdef2 + pdef3 + pdef4 + pdef5 + @add_pdef end def base_mdef weapon = $data_weapons[@weapon_id] armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] mdef1 = weapon != nil ? weapon.mdef : 0 mdef2 = armor1 != nil ? armor1.mdef : 0 mdef3 = armor2 != nil ? armor2.mdef : 0 mdef4 = armor3 != nil ? armor3.mdef : 0 mdef5 = armor4 != nil ? armor4.mdef : 0 return mdef1 + mdef2 + mdef3 + mdef4 + mdef5 + @add_mdef end def base_eva armor1 = $data_armors[@armor1_id] armor2 = $data_armors[@armor2_id] armor3 = $data_armors[@armor3_id] armor4 = $data_armors[@armor4_id] eva1 = armor1 != nil ? armor1.eva : 0 eva2 = armor2 != nil ? armor2.eva : 0 eva3 = armor3 != nil ? armor3.eva : 0 eva4 = armor4 != nil ? armor4.eva : 0 return eva1 + eva2 + eva3 + eva4 + @add_eva end
def exp=(exp) @exp = [[exp, 9999999].min, 0].max while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0 @level += 1 @ability_cp += POINTS_PAR_NIVEAU + POINTS_PAR_NIVEAU * (@level / 10) for j in $data_classes[@class_id].learnings if j.level == @level learn_skill(j.skill_id) end end end while @exp < @exp_list[@level] @level -= 1 end @hp = [@hp, self.maxhp].min @sp = [@sp, self.maxsp].min end end
#======================================================================== # La classe objet des abilités. #======================================================================== class Ability attr_accessor :active def initialize(name,level,points,effect,description="") @name = name @level = level @points = points @effect = effect @description = description end def name return @name end def level return @level end def points return @points end def effect_number return @effect unless @effect.class == Array return @effect[0] end def effect_intensity return nil unless @effect.class == Array return @effect[1] end def description return @description end end #======================================================================== # Modification de Scene_Battle pour les Auto-status #======================================================================== class Scene_Battle alias init3 main def main for actor in $game_party.actors for state in actor.autostate actor.add_state(state) end end init3 end end
#======================================================================== # Modification de la fenêtre de SkillStatus pour afficher les CP du héros. #======================================================================== class Window_SkillStatus < Window_Base def refresh self.contents.clear draw_actor_name(@actor, 4, -4) draw_actor_state(@actor, 140, 0) draw_actor_hp(@actor, 284, 0) draw_actor_sp(@actor, 460, 0) cx = self.contents.text_size(@actor.name).width / 2 self.contents.font.size = 12 tex = "CP: " + @actor.ability_cp.to_s cx -= self.contents.text_size(tex).width / 2 self.contents.draw_text(4+cx,12,60,32,tex) self.contents.font.size = $fontsize end end
#======================================================================== # La fenêtre où sont affichés les abilités. #======================================================================== class Window_Ability < Window_Selectable def initialize(actor) super(0, 128, 640, 352) @actor = actor @column_max = 2 refresh self.index = 0 if $game_temp.in_battle self.y = 64 self.height = 256 self.back_opacity = 160 end end def ability return @data[self.index] end def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] for i in 0...$game_abilities[@actor.class_id].size ability = $game_abilities[@actor.class_id][i] if ability != nil @data.push(ability) if @actor.level >= ability.level end end @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) self.contents.font.name = $fontface self.contents.font.size = $fontsize for i in 0...@item_max draw_item(i) end end end
def draw_item(index) ability = @data[index] self.contents.font.color = normal_color self.contents.font.color = disabled_color unless ability.active unless @actor.ability_cp >= ability.points x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon("036-Item05") if ability.active == true opacity = 255 else opacity = 40 end self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 204, 32, ability.name, 0) self.contents.draw_text(x + 232-15, y, 48, 32, "CP : " + ability.points.to_s, 2) end def update_help @help_window.set_text(self.ability == nil ? "" : self.ability.description) end end
#======================================================================== # La Scene qui correspond au menu où l'ont gère les abilités. #======================================================================== class Scene_Ability def initialize(actor_index = 0, equip_index = 0) @actor_index = actor_index end def main @actor = $game_party.actors[@actor_index] @spriteset = Spriteset_Map.new if TRANSPARENT == true @help_window = Window_Help.new @status_window = Window_SkillStatus.new(@actor) @skill_window = Window_Ability.new(@actor) @help_window.opacity = 0 if TRANSPARENT == true @status_window.opacity = 0 if TRANSPARENT == true @skill_window.opacity = 0 if TRANSPARENT == true @skill_window.help_window = @help_window Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @help_window.dispose @status_window.dispose @skill_window.dispose @spriteset.dispose if TRANSPARENT == true end def update @help_window.update @status_window.update @skill_window.update if @skill_window.active update_skill return end end def update_skill if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) $scene = Scene_Menu.new(0) if RETOUR == 0 $scene = Scene_Map.new if RETOUR == 1 return end if Input.trigger?(Input::C) @skill = @skill_window.ability if @skill == nil or (@actor.ability_cp < @skill.points and not @skill.active) $game_system.se_play($data_system.buzzer_se) return end if @skill.active != true Audio.se_play("Audio/SE/005-System05") @actor.ability_cp -= @skill.points check_effect(@skill, @actor, 1) @skill.active = true @skill_window.refresh @status_window.refresh else Audio.se_play("Audio/SE/005-System05",100,50) @actor.ability_cp += @skill.points check_effect(@skill, @actor, 0) @skill.active = false @skill_window.refresh @status_window.refresh end return end if Input.trigger?(Input::R) $game_system.se_play($data_system.cursor_se) @actor_index += 1 @actor_index %= $game_party.actors.size $scene = Scene_Ability.new(@actor_index) return end if Input.trigger?(Input::L) $game_system.se_play($data_system.cursor_se) @actor_index += $game_party.actors.size - 1 @actor_index %= $game_party.actors.size $scene = Scene_Ability.new(@actor_index) return end end def check_effect(skill, actor, type) @ability = skill @actor = $game_actors[actor.id] @type = type case @skill.effect_number when 1 @actor.add_atk += @skill.effect_intensity if @type == 1 @actor.add_atk -= @skill.effect_intensity if @type == 0 when 2 @actor.add_str += @skill.effect_intensity if @type == 1 @actor.add_str -= @skill.effect_intensity if @type == 0 when 3 @actor.add_int += @skill.effect_intensity if @type == 1 @actor.add_int -= @skill.effect_intensity if @type == 0 when 4 @actor.add_dex += @skill.effect_intensity if @type == 1 @actor.add_dex -= @skill.effect_intensity if @type == 0 when 5 @actor.add_agi += @skill.effect_intensity if @type == 1 @actor.add_agi -= @skill.effect_intensity if @type == 0 when 6 @actor.add_pdef += @skill.effect_intensity if @type == 1 @actor.add_pdef -= @skill.effect_intensity if @type == 0 when 7 @actor.add_mdef += @skill.effect_intensity if @type == 1 @actor.add_mdef -= @skill.effect_intensity if @type == 0 when 8 @actor.add_maxhp += @skill.effect_intensity if @type == 1 @actor.add_maxhp -= @skill.effect_intensity if @type == 0 when 9 @actor.add_maxsp += @skill.effect_intensity if @type == 1 @actor.add_maxsp -= @skill.effect_intensity if @type == 0 when 10 @actor.add_eva += @skill.effect_intensity if @type == 1 @actor.add_eva -= @skill.effect_intensity if @type == 0 when 11 @actor.autostate.push(@skill.effect_intensity) if @type == 1 @actor.add_state(@skill.effect_intensity) if @type == 0 for state in @actor.autostate @actor.remove_state(@skill.effect_intensity) @actor.autostate.delete(state) if state == @skill.effect_intensity end end end end
end
#============================================================================= # Sauvegarde des abilités. #============================================================================= class Scene_Save < Scene_File alias save2 write_save_data def write_save_data(file) save2(file) Marshal.dump($game_abilities, file) end end
class Scene_Load < Scene_File alias read2 read_save_data def read_save_data(file) read2(file) $game_abilities = Marshal.load(file) end end Pour l'utilisation de ce script je vous laisse allez voir l'explication de son auteur(lien ci-dessus) Ensuite j'ai mit bonus dans le titre, en fait dans RM que ce soit xp ou les autres, les statuts confèrent que des bonus défensifs pour ce qui est des éléments comme le feu. Je viens donc rajouter d'autre fonctionnalité d'auto-state, tel que les attaque élémentaire et l'Exp multiplier : Statut elem : - Code:
-
class Game_Actor < Game_Battler def element_set weapon = $data_weapons[@weapon_id] elements = weapon != nil ? weapon.element_set.dup : [] if @states.include?(17) elements = [1] end return elements end end Dans ce tout petit script à placer en dessous de celui de Sh4k4 à la ligne : - if @states.include?(17) 17 étant l'ID du Statut à remplacer ou non - elements = [1] 1 étant l'ID de l'élément. Donc ici, si le hero a le statut 17, ses attaque feront des dégats de feu. Pour rajouter des status mettre en dessous de elements = [1] : - elsif @states.include?(ID_Statut) elements = [ID_element] Voila pour celui-la Ensuite pour le statut qui rajoute de l'exp multiplier dont voici le script qui est de Siegfried : - Code:
-
class Scene_Battle ID_DES_STATUTS = [60, 61] MODIF_XP = [1, 0.5] def start_phase5 # Shift to phase 5 @phase = 5 # Play battle end ME $game_system.me_play($game_system.battle_end_me) # Return to BGM before battle started $game_system.bgm_play($game_temp.map_bgm) # Initialize EXP, amount of gold, and treasure exp = 0 gold = 0 treasures = [] # Loop for enemy in $game_troop.enemies # If enemy is not hidden unless enemy.hidden # Add EXP and amount of gold obtained exp += enemy.exp gold += enemy.gold # Determine if treasure appears if rand(100) < enemy.treasure_prob if enemy.item_id > 0 treasures.push($data_items[enemy.item_id]) end if enemy.weapon_id > 0 treasures.push($data_weapons[enemy.weapon_id]) end if enemy.armor_id > 0 treasures.push($data_armors[enemy.armor_id]) end end end end Petite explication du script : ID_DES_STATUTS = [60, 61] on met ici les ID des Statuts MODIF_XP = [1, 0.5] Ici les ID des multiplicateur, 1 est l'Exp normal que l'on va gagner s'addition en plus, donc si un monstre nous rapporte 20 exp en fait on gagnera 40 exp. 0.5 est l'exp normal diviser par deux que l'on rajoute en plus, donc si un monstre rapporte 20 d'exp, nous en gagnerons 30. Et ainsi de suite(en tout cas c'est comme ça que ça marche chez moi). J'ai oublier de preciser que ses 3 scripts sont parfaitement dissociable. On peut maintenant dire que ce script ressemble quasiment à l'identique à celui de ff9 =) Sur ce je vous souhaite une bonne aprem. Cordialement Shyno. |
|
Jin Ancien staffeux
Messages postés : 8557 Date d'inscription : 08/12/2010 Jauge LPC :
| Sujet: Re: [XP] Compétences passives à la FF9+bonus Ven 22 Fév 2013 - 17:04 | |
| Sh4k4 est d'accord pour que tu le post ? - Citation :
- Interdiction de diffusion ailleurs sans mon accord, merci.
Sinon, j'ai pas regardé ta modif, mais est ce que tu as modifié la suppression du statut une fois la compétence désactivé ? Sinon, je posterai la mienne de modif ( si Sh4k4 est d'accord) |
|