#============================================================================== # Consume MP in combat by all actions # By gerkrt/gerrtunk, sournote103(idea) # Version: 2.1 # License: GPL, credits # Date: 16/05/2011 # For the latests updates or bugs fixes of this script check here: # [url]http://usuarios.multimania.es/kisap/english_list.html[/url] #============================================================================== =begin ---------INTRODUCTION---------- This script can make that when you execute any actions in combat your MP is consumed based in a large number of options (actors, classes, equipment, skill or item used, fixed value and event variables) like for example in Final Fantasy: The Four Heroes of Light. --------INSTRUCTIONS------------ Exist 6 actions with his own identificative code to use: :attack :defend :escape :skill :item :general General is a general default configurationthats applied always, when you are doing any action. You can configure how many and how will be reduced the MP based in these options that use these codes: :actors :classes :weapons :shields :helmets :armors :accesories :variables :fixed Plus these two that are used only when using a skill or item: :skill :item In each of these configuration lists, you will put what actor id, or class id,etc (the id is the value in the database) modify that action and how they do that. The program sums all the values of the list each time and independently, so you can have a armor that sums to attack and item, but reduces defense, and does nothing with the rest, for example, and make other things also. You dont have to use all of them anyway. This is a sample configuration, that you have to add anytime you want to configure any of that options. id of X(armor, helmet, actor...) => [type(+ or %), value(normal or decimal)], 55 => [2, 0.50], Each configuration can work in two ways: If the first value is 1: it will add to the actual sp the value you put If the value is 2, it will apply a % based changue, so if you write 0.50 for example it will be reduced to 50% and 1.50 150%. Note that you can make negative things using negative numbers, but it will never reduce beyond 0 or 1%. For configuring you only to have to add each time: 55 => [2, 0.50], Where 55 is the id of the actor, weapon or armor or whatever, 2 the type to use, and 0.50 or 50 the value to use. Note that in :variables the code is different because the value is in the event variable: 55 => [2], 2 is the type. Also when you are using in % the event variables its values will be divided by 100, so it became decimals compatible with the rest. If var 55 was 25, it will be 0.25. :fixed is different also, it add a value based only on the action and nothing more, so you dont need the id, but it use the normal way of + or %. :fixed => [1, 40] Finally, first is summed the normal value, and later applied the % value. They way the formula works it sums all the % and normals values before suming nothing. Also the skill reduces the sp in the normal way first, and later using this script. ----SYNTAX NOTES---- Actions = { :attack => { # Attack config :weapons => { 1 => [1, -150], 2 => [2, 0.50] }, :armors => { 13 => [1, -150], 2 => [2, 0.50] }, :shields => { 1 => [2, 0.50] }, :fixed => [1, 40] }, # End of attack config To add new option for attack, you have to include it before the last } with the , that makrs the end of any action, like defense or item too. To add a new option like this: :helmets => { 1 => [2, 0.50] }, Do this: :attack => { # Attack config :weapons => { 1 => [1, -150], 2 => [2, 0.50] }, :armors => { 13 => [1, -150], 2 => [2, 0.50] }, :shields => { 1 => [2, 0.50] }, :helmets => { 1 => [2, 0.50] }, :fixed => [1, 40] }, # End of attack config So the the option have a , at the end of the {} To include effects for each id, you have to add a new line each time, adding a coma at the end. Note that each id have to be unique. id, type, effect :helmets => { 1 => [2, 0.50], 2 => [2, 0.50], 3 => [2, 0.50] }, =end module Wep Actions = { # Actions start :attack => { # Attack config :weapons => { 1 => [1, -150], 2 => [2, 0.50] }, :armors => { 13 => [1, -150], 2 => [2, 0.50] }, :shields => { 1 => [2, 0.50] }, :fixed => [1, 40] }, # End of attack config :defense => { # Defense config :weapons => { 1 => [1, -150], 2 => [2, 0.50] }, :armors => { 13 => [1, -150], 2 => [2, 0.50] }, :shields => { 1 => [2, 0.50] }, :actors => { 1 => [1, -150], 2 => [2, 0.50] }, :classes => { 1 => [1, -150], 2 => [2, 0.50] }, :variables => { 1 => [1], 2 => [2] }, :fixed => [1, 40] },# End of defend config :escape => {# Escape config },# End of escape config :item => {# Item config },# End of item config :skill => {# Skill config },# End of skill config :general => {# General config :actors => { 1 => [2, 1.0], 2 => [2, 1.50] }, :classes => { 4 => [1, -150], 2 => [2, 1.50] } }, # End of general config } # End of action # 6 accions # iteres segons el codi,sumant tot, i executant segons el subcodi, i rula be # hiperfacil! # fer que lo de accions usi codi dels hashes, hipersimple aleshores # tu pases :defend i amb aixo, extreu de un hash de acciones, la bona, i ale def self.test(action_type, actor, extra=false) v = 0 r = 0.0 #actor.sp = 24 # Sum the desired action for key, arr in Actions[action_type] # + Actions[:general] #p key, arr # Set id of the item or whatever based in key used. Make needed checks. if key == :weapons and actor.weapon_id != 0 id = actor.weapon_id elsif key == :shields and actor.armor1_id != 0 id = actor.armor1_id elsif key == :helmets and actor.armor2_id != 0 id = actor.armor2_id elsif key == :armors and actor.armor3_id != 0 id = actor.armor3_id elsif key == :accesories and actor.armor4_id != 0 id = actor.armor4_id elsif key == :actors id = actor.actor_id elsif key == :classes id = actor.class_id elsif key == :items id = extra elsif key == :skills id = extra elsif key == :fixed if arr[0] == 1 v += arr[1] else r += arr[1] end next elsif key == :variables # If variables, iterate in subarray for key2, val in arr #p key, val if val[0] == 1 v += $game_variables[key2] #p 'var v', v else r += ($game_variables[key2].to_f / 100) #p 'var r', r, ($game_variables[key2].to_f / 100), key2, $game_variables[key2] end end next else next end #p arr, id # Each time check if value exist and extract it if arr[id] != nil if arr[id][0] == 1 v += arr[id][1] else r += arr[id][1] end #p 'c', v, r end end # Sum the general option always for key, arr in Actions[:general] #p key, arr # Set id of the item or whatever based in key used. Make needed checks. if key == :weapons and actor.weapon_id != 0 id = actor.weapon_id elsif key == :shields and actor.armor1_id != 0 id = actor.armor1_id elsif key == :helmets and actor.armor2_id != 0 id = actor.armor2_id elsif key == :armors and actor.armor3_id != 0 id = actor.armor3_id elsif key == :accesories and actor.armor4_id != 0 id = actor.armor4_id elsif key == :actors id = actor.actor_id elsif key == :classes id = actor.class_id elsif key == :items id = extra elsif key == :skills id = extra elsif key == :variables # If variables, iterate in subarray for key2, val in arr #p key, val if val[0] == 1 v += $game_variables[key2] #p 'var v', v else r += ($game_variables[key2].to_f / 100) #p 'var r', r, ($game_variables[key2].to_f / 100), key2, $game_variables[key2] end end next else next end #p arr, id # Each time check if value exist and extract it if arr[id] != nil if arr[id][0] == 1 v += arr[id][1] else r += arr[id][1] end #p 'c', v, r end end #p 'valfin', v, r # Reduce actor sp #p actor.sp actor.sp= actor.sp + v actor.sp= actor.sp * (1.0 + r).to_i #actor.sp= actor.sp.to_i #actor.sp = 9999 if actor.sp > 9999 #p 'final', actor.sp # comprova q r no sigui negatiu end end class Scene_Battle #-------------------------------------------------------------------------- # * Frame Update (party command phase: escape) #-------------------------------------------------------------------------- def update_phase2_escape # Calculate enemy agility average enemies_agi = 0 enemies_number = 0 for enemy in $game_troop.enemies if enemy.exist? enemies_agi += enemy.agi enemies_number += 1 end end if enemies_number > 0 enemies_agi /= enemies_number end # Calculate actor agility average actors_agi = 0 actors_number = 0 for actor in $game_party.actors if actor.exist? actors_agi += actor.agi actors_number += 1 Wep.test (:escape, actor) end end if actors_number > 0 actors_agi /= actors_number end # Determine if escape is successful success = rand(100) < 50 * actors_agi / enemies_agi # If escape is successful if success # Play escape SE $game_system.se_play($data_system.escape_se) # Return to BGM before battle started $game_system.bgm_play($game_temp.map_bgm) # Battle ends battle_end(1) # If escape is failure else # Clear all party member actions $game_party.clear_actions # Start main phase start_phase4 end end #-------------------------------------------------------------------------- # * Make Basic Action Results #-------------------------------------------------------------------------- def make_basic_action_result # If attack if @active_battler.current_action.basic == 0 # Set anaimation ID @animation1_id = @active_battler.animation1_id @animation2_id = @active_battler.animation2_id # If action battler is enemy if @active_battler.is_a?(Game_Enemy) if @active_battler.restriction == 3 target = $game_troop.random_target_enemy elsif @active_battler.restriction == 2 target = $game_party.random_target_actor else index = @active_battler.current_action.target_index target = $game_party.smooth_target_actor(index) end end # If action battler is actor if @active_battler.is_a?(Game_Actor) if @active_battler.restriction == 3 target = $game_party.random_target_actor elsif @active_battler.restriction == 2 target = $game_troop.random_target_enemy else index = @active_battler.current_action.target_index target = $game_troop.smooth_target_enemy(index) end end # Set array of targeted battlers @target_battlers = [target] # Apply normal attack results for target in @target_battlers target.attack_effect(@active_battler) end return end # If guard if @active_battler.current_action.basic == 1 # Display "Guard" in help window @help_window.set_text($data_system.words.guard, 1) # Reduce MP if is a MP consumer and a actor if @active_battler.is_a? Game_Actor Wep.test (:defense, @active_battler) end return end # If escape if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2 # Display "Escape" in help window @help_window.set_text("Escape", 1) # Escape @active_battler.escape return end # If doing nothing if @active_battler.current_action.basic == 3 # Clear battler being forced into action $game_temp.forcing_battler = nil # Shift to step 1 @phase4_step = 1 return end end end class Game_Actor attr_reader :actor_id attr_reader :class_id end class Game_Battler #-------------------------------------------------------------------------- # * Applying Normal Attack Effects # attacker : battler #-------------------------------------------------------------------------- def attack_effect(attacker) # Clear critical flag self.critical = false # Reduce MP if is a MP consumer and a actor if attacker.is_a? Game_Actor Wep.test(:attack, attacker) end # 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) self.damage /= 100 # If damage value is strictly positive if self.damage > 0 # Critical correction if rand(100) < 4 * attacker.dex / self.agi self.damage *= 2 self.critical = true end # 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 # Reduce MP if is a MP consumer and a actor if self.is_a? Game_Actor Wep.test(:skill, self, skill) end # 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) 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 #-------------------------------------------------------------------------- # * Application of Item Effects # item : item #-------------------------------------------------------------------------- def item_effect(item) # Clear critical flag self.critical = false Wep.test(:item, self, item) # If item scope is for ally with 1 or more HP, and your own HP = 0, # or item scope is for ally with 0 HP, and your own HP = 1 or more if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or ((item.scope == 5 or item.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 |= item.common_event_id > 0 # Determine hit hit_result = (rand(100) < item.hit) # Set effective flag is skill is uncertain effective |= item.hit < 100 # If hit occurs if hit_result == true # Calculate amount of recovery recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp if recover_hp < 0 recover_hp += self.pdef * item.pdef_f / 20 recover_hp += self.mdef * item.mdef_f / 20 recover_hp = [recover_hp, 0].min end # Element correction recover_hp *= elements_correct(item.element_set) recover_hp /= 100 recover_sp *= elements_correct(item.element_set) recover_sp /= 100 # Dispersion if item.variance > 0 and recover_hp.abs > 0 amp = [recover_hp.abs * item.variance / 100, 1].max recover_hp += rand(amp+1) + rand(amp+1) - amp end if item.variance > 0 and recover_sp.abs > 0 amp = [recover_sp.abs * item.variance / 100, 1].max recover_sp += rand(amp+1) + rand(amp+1) - amp end # If recovery code is negative if recover_hp < 0 # Guard correction if self.guarding? recover_hp /= 2 end end # Set damage value and reverse HP recovery amount self.damage = -recover_hp # HP and SP recovery last_hp = self.hp last_sp = self.sp self.hp += recover_hp self.sp += recover_sp effective |= self.hp != last_hp effective |= self.sp != last_sp # State change @state_changed = false effective |= states_plus(item.plus_state_set) effective |= states_minus(item.minus_state_set) # If parameter value increase is effective if item.parameter_type > 0 and item.parameter_points != 0 # Branch by parameter case item.parameter_type when 1 # Max HP @maxhp_plus += item.parameter_points when 2 # Max SP @maxsp_plus += item.parameter_points when 3 # Strength @str_plus += item.parameter_points when 4 # Dexterity @dex_plus += item.parameter_points when 5 # Agility @agi_plus += item.parameter_points when 6 # Intelligence @int_plus += item.parameter_points end # Set to effective flag effective = true end # If HP recovery rate and recovery amount are 0 if item.recover_hp_rate == 0 and item.recover_hp == 0 # Set damage to empty string self.damage = "" # If SP recovery rate / recovery amount are 0, and parameter increase # value is ineffective. if item.recover_sp_rate == 0 and item.recover_sp == 0 and (item.parameter_type == 0 or item.parameter_points == 0) # If state is unchanged unless @state_changed # Set damage to "Miss" self.damage = "Miss" end 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