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.
#==============================================================================
# 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:
# http://usuarios.multimania.es/kisap/english_list.html
#==============================================================================
=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