Advanced Armor System
Descrizione
Questo script aggiunge delle funzionalità alle armature quali il prevenire un colpo critico oppure l'assorbire un elemento al posto di ridurne semplicemente l'effetto.
Autore
Avon Valentino (Io)
Allegati
#Advanced Armor System creato da Valentino Avon #Se usate questo script, creditatemi :) ARMATURE_PREVIENI_CRITICO = [33] #ID delle armature che non permettono il subire un colpo critico. ARMATURA_ASSORBE_ELEMENTO = [34,35] #ID delle armature che al posto di difendere da un elemento lo assorbono. #Il danno sarà assorbito per metà. #============================================================================== # ** Game_Actor #------------------------------------------------------------------------------ # This class handles the actor. It's used within the Game_Actors class # ($game_actors) and refers to the Game_Party class ($game_party). #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :name # name attr_reader :character_name # character file name attr_reader :character_hue # character hue attr_reader :class_id # class ID attr_reader :weapon_id # weapon ID attr_reader :armor1_id # shield ID attr_reader :armor2_id # helmet ID attr_reader :armor3_id # body armor ID attr_reader :armor4_id # accessory ID attr_reader :level # level attr_reader :exp # EXP attr_reader :skills # skills attr_accessor :assorbe attr_accessor :dimezza #-------------------------------------------------------------------------- # * Object Initialization # actor_id : actor ID #-------------------------------------------------------------------------- def initialize(actor_id) super() setup(actor_id) @assorbe = false @dimezza = false end def previeni_critico? for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id] armor = $data_armors[i] if armor != nil if ARMATURE_PREVIENI_CRITICO.include?(armor.id) return true end end end return false end #-------------------------------------------------------------------------- # * Setup # actor_id : actor ID #-------------------------------------------------------------------------- def setup(actor_id) actor = $data_actors[actor_id] @actor_id = actor_id @name = actor.name @character_name = actor.character_name @character_hue = actor.character_hue @battler_name = actor.battler_name @battler_hue = actor.battler_hue @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 = [] @hp = maxhp @sp = maxsp @states = [] @states_turn = {} @maxhp_plus = 0 @maxsp_plus = 0 @str_plus = 0 @dex_plus = 0 @agi_plus = 0 @int_plus = 0 # Learn skill for i in 1..@level for j in $data_classes[@class_id].learnings if j.level == i learn_skill(j.skill_id) end end end # Update auto state update_auto_state(nil, $data_armors[@armor1_id]) update_auto_state(nil, $data_armors[@armor2_id]) update_auto_state(nil, $data_armors[@armor3_id]) update_auto_state(nil, $data_armors[@armor4_id]) end #-------------------------------------------------------------------------- # * Get Element Revision Value # element_id : element ID #-------------------------------------------------------------------------- def element_rate(element_id) # Get values corresponding to element effectiveness table = [0,200,150,100,50,0,-100] result = table[$data_classes[@class_id].element_ranks[element_id]] # If this element is protected by armor, then it's reduced by half for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id] armor = $data_armors[i] if armor != nil and armor.guard_element_set.include?(element_id) and ARMATURA_ASSORBE_ELEMENTO.include?(armor.id) self.assorbe = true #result /= -2 end end for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id] armor = $data_armors[i] if armor != nil and armor.guard_element_set.include?(element_id) self.dimezza = true unless self.assorbe #result /= 2 end end # If this element is protected by states, then it's reduced by half for i in @states if $data_states[i].guard_element_set.include?(element_id) result /= 2 end end # End Method return result end end #============================================================================== # ** Game_Battler (part 3) #------------------------------------------------------------------------------ # This class deals with battlers. It's used as a superclass for the Game_Actor # and Game_Enemy classes. #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # * Applying Normal Attack Effects # attacker : battler #-------------------------------------------------------------------------- def attack_effect(attacker) # Clear critical flag self.critical = false # First hit detection hit_result = (rand(100) < attacker.hit) # If hit occurs if hit_result == true # Calculate basic damage atk = [attacker.atk - self.pdef / 2, 0].max self.damage = atk * (20 + attacker.str) / 20 # Element correction self.damage *= elements_correct(attacker.element_set) #assorbe/dimezza self.damage /= 100 if self.dimezza and self.is_a?(Game_Actor) self.damage /= 2 self.dimezza = false end if self.assorbe and self.is_a?(Game_Actor) self.damage /= -2 self.assorbe = false end # If damage value is strictly positive if self.damage > 0 #-------------------- Previene Critico if attacker.is_a?(Game_Enemy) if self.previeni_critico? == false self.critical = rand(100) < 4 * atk_critcal / self.agi end end if attacker.is_a?(Game_Actor) self.critical = rand(100) < 4 * atk_critcal / self.agi end self.damage *= 2 if self.critical and attacker.is_a?(Game_Actor) if self.critical and attacker.is_a?(Game_Enemy) if self.previeni_critico? == false self.damage *= 2 end end #----------------------- Previene Critico # Guard correction if self.guarding? self.damage /= 2 end end # Dispersion if self.damage.abs > 0 amp = [self.damage.abs * 15 / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # Second hit detection eva = 8 * self.agi / attacker.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) end # If hit occurs if hit_result == true # State Removed by Shock remove_states_shock # Substract damage from HP self.hp -= self.damage # State change @state_changed = false states_plus(attacker.plus_state_set) states_minus(attacker.minus_state_set) # When missing else # Set damage to "Miss" self.damage = "Miss" # Clear critical flag self.critical = false end # End Method return true end #-------------------------------------------------------------------------- # * Apply Skill Effects # user : the one using skills (battler) # skill : skill #-------------------------------------------------------------------------- def skill_effect(user, skill) # Clear critical flag self.critical = false # If skill scope is for ally with 1 or more HP, and your own HP = 0, # or skill scope is for ally with 0, and your own HP = 1 or more if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1) # End Method return false end # Clear effective flag effective = false # Set effective flag if common ID is effective effective |= skill.common_event_id > 0 # First hit detection hit = skill.hit if skill.atk_f > 0 hit *= user.hit / 100 end hit_result = (rand(100) < hit) # Set effective flag if skill is uncertain effective |= hit < 100 # If hit occurs if hit_result == true # Calculate power power = skill.power + user.atk * skill.atk_f / 100 if power > 0 power -= self.pdef * skill.pdef_f / 200 power -= self.mdef * skill.mdef_f / 200 power = [power, 0].max end # Calculate rate rate = 20 rate += (user.str * skill.str_f / 100) rate += (user.dex * skill.dex_f / 100) rate += (user.agi * skill.agi_f / 100) rate += (user.int * skill.int_f / 100) # Calculate basic damage self.damage = power * rate / 20 # Element correction self.damage *= elements_correct(skill.element_set) #----assorbe/dimezza if self.is_a?(Game_Actor) if self.dimezza self.damage /= 2 self.dimezza = false end if self.assorbe self.damage /= -2 self.assorbe = false end end #----assorbe/dimezza self.damage /= 100 # If damage value is strictly positive if self.damage > 0 # Guard correction if self.guarding? self.damage /= 2 end end # Dispersion if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # Second hit detection eva = 8 * self.agi / user.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100 hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # Set effective flag if skill is uncertain effective |= hit < 100 end # If hit occurs if hit_result == true # If physical attack has power other than 0 if skill.power != 0 and skill.atk_f > 0 # State Removed by Shock remove_states_shock # Set to effective flag effective = true end # Substract damage from HP last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # State change @state_changed = false effective |= states_plus(skill.plus_state_set) effective |= states_minus(skill.minus_state_set) # If power is 0 if skill.power == 0 # Set damage to an empty string self.damage = "" # If state is unchanged unless @state_changed # Set damage to "Miss" self.damage = "Miss" end end # If miss occurs else # Set damage to "Miss" self.damage = "Miss" end # If not in battle unless $game_temp.in_battle # Set damage to nil self.damage = nil end # End Method return effective end end
Demo Link
http://www.mediafire...sgttwasxut4gilh
Script Link
http://www.mediafire...2r83p7zq8orreai
Istruzioni per l'uso
Sono tutte inserite all'interno dello script... Ma non dovrebbe essere una difficile configurazione. Se usate questo script creditatemi!
Bugs e Conflitti Noti
Potrebbe andare in conflitto con dei battle system diversi dal default ma non dovrebbe essere difficile renderlo compatibile.
Altri Dettagli
Script semplice ma magari può essere utile a qualcuno...
Modificato da Dilos, 27 April 2013 - 01:20 AM.
Script monoriga sistemato.