Code:
# All Stats Modified XP Version
# v 1.0 - 2014-05-16 (Y-M-D)
# Scripter : Kyonides-Arkanthos
# This script allows you modify your heroes' stats in ways not included in the
# RMXP Hero / Weapon / Armor Databases.
# You may reduce Slip Damage caused by poisonous swamps or floors full of
# little spikes by equipping a piece of any kind of armor.
# Your hero may reduce any skill mp alias sp cost, weapons or armors may help
# you with this. Don't forget to properly setup the reduction percentage.
# Nonetheless you may want to increase your hero's HP by reducing his SP if he
# or she is a fighter or lancer or vice versa if he or she is a cleric or mage.
# If you increase a hero's Strength STR, your hero may see how his Intelligence
# INT gets reduced by the same amount. Dexterity DEX affects Agility AGI while
# AGI affects DEX directly.
# All Modified Stats are calculated based on their base value for the current
# hero's level and will get updated if the hero levels up or down.
# Please Don't Forget to Properly Setup the Weapons or Armors in the Database!!
# Believe me when I tell you that's the easiest part of the setup.
# MODIFIED SCRIPT CLASSES
# Game_Actor Window_Skill Scene_Equip Default Scene_Battle
module All_Stats
# DID YOU INCLUDE A CUSTOM BATTLE SYSTEM? Yes : true, No : false or nil
CUSTOM_BATTLE_SYSTEM = false
# Armor : { ID => Percentage, ID => Percentage, etc. }
SLIP_DAMAGE_REDUCTION_ITEMS = { 50 => 10, 51 => 25, 52 => 50}
# [ Weapon or Armor ] = { ID => Percentage, ID => Percentage, etc. }
MP_SAVING_ITEMS = { 33 => 10, 34 => 20, 35 => 33, 36 => 50, 37 => 75 }
# DO NOT MODIFY THE FOLLOWING TWO LINES
ITEMS = { :HP => {}, :SP => {}, :STR => {},
:DEX => {}, :AGI => {}, :INT => {} }
# YOU MAY MODIFY THE FOLLOWING LINES
# [ STAT ][ Weapon or Armor ] = { ID => Percentage, ID => Percentage, etc. }
ITEMS[:HP][:weapon] = { 1 => 10 }
ITEMS[:HP][:armor] = { 38 => 10, 44 => 25 }
ITEMS[:SP][:weapon] = {}
ITEMS[:SP][:armor] = { 39 => 10, 45 => 25 }
ITEMS[:STR][:weapon] = {}
ITEMS[:STR][:armor] = { 40 => 10, 46 => 25 }
ITEMS[:DEX][:weapon] = {}
ITEMS[:DEX][:armor] = { 41 => 10, 47 => 25 }
ITEMS[:AGI][:weapon] = {}
ITEMS[:AGI][:armor] = { 42 => 10, 48 => 25 }
ITEMS[:INT][:weapon] = {}
ITEMS[:INT][:armor] = { 43 => 10, 49 => 25 }
# DO NOT MODIFY THE FOLLOWING LINES
INDEX = { :weapon => {}, :armor => {} }
ITEMS.keys.each {|stat|
ITEMS[stat][:weapon].each {|w| INDEX[:weapon][w[0]] = stat }
ITEMS[stat][:armor].each {|a| INDEX[:armor][a[0]] = stat } }
end
module Calculate
def self.skill_sp_cost(user, sp_cost, consume_sp=true)
if user.is_a?(Game_Actor)
ids = [user.weapon_id, user.armor1_id, user.armor2_id,
user.armor3_id, user.armor4_id]
for id in ids
if All_Stats::MP_SAVING_ITEMS.keys.include?(id)
sp_cost -= sp_cost * All_Stats::MP_SAVING_ITEMS[id] / 100
end
end
ids.clear
end
return consume_sp ? user.sp -= sp_cost : sp_cost
end
end
class Game_Actor
alias kyon_stats_modif_gm_actor_setup setup
def setup(actor_id)
kyon_stats_modif_gm_actor_setup(actor_id)
@hp_mod = { :weapon => {}, :armor => {} }
@sp_mod = { :weapon => {}, :armor => {} }
@str_mod = { :weapon => {}, :armor => {} }
@dex_mod = { :weapon => {}, :armor => {} }
@agi_mod = { :weapon => {}, :armor => {} }
@int_mod = { :weapon => {}, :armor => {} }
update_all_modified_stats
end
alias kyon_stats_modif_gm_actor_level= level=
def level=(level)
kyon_stats_modif_gm_actor_level=(level)
update_all_modified_stats
end
def equip(equip_type, id)
case equip_type
when 0 # Weapon
if id == 0 or $game_party.weapon_number(id) > 0
$game_party.gain_weapon(@weapon_id, 1)
previous_id = @weapon_id
@weapon_id = id
$game_party.lose_weapon(id, 1)
update_modified_stats(:weapon, previous_id, id)
end
when 1 # Shield
if id == 0 or $game_party.armor_number(id) > 0
update_auto_state($data_armors[@armor1_id], $data_armors[id])
$game_party.gain_armor(@armor1_id, 1)
previous_id = @armor1_id
@armor1_id = id
$game_party.lose_armor(id, 1)
update_modified_stats(:armor, previous_id, id)
end
when 2 # Head
if id == 0 or $game_party.armor_number(id) > 0
update_auto_state($data_armors[@armor2_id], $data_armors[id])
$game_party.gain_armor(@armor2_id, 1)
previous_id = @armor2_id
@armor2_id = id
$game_party.lose_armor(id, 1)
update_modified_stats(:armor, previous_id, id)
end
when 3 # Body
if id == 0 or $game_party.armor_number(id) > 0
update_auto_state($data_armors[@armor3_id], $data_armors[id])
$game_party.gain_armor(@armor3_id, 1)
previous_id = @armor3_id
@armor3_id = id
$game_party.lose_armor(id, 1)
update_modified_stats(:armor, previous_id, id)
end
when 4 # Accessory
if id == 0 or $game_party.armor_number(id) > 0
update_auto_state($data_armors[@armor4_id], $data_armors[id])
$game_party.gain_armor(@armor4_id, 1)
previous_id = @armor4_id
@armor4_id = id
$game_party.lose_armor(id, 1)
update_modified_stats(:armor, previous_id, id)
end
end
end
def update_modified_stats(kind, previous_id, new_id)
stat = All_Stats::INDEX[kind]
if stat.keys.include?(new_id)
item = All_Stats::ITEMS[stat[new_id]][kind][new_id]
case stat[new_id]
when :HP
@hp_mod[kind][new_id] = self.base_maxsp * item / 100
self.maxhp += @hp_mod[kind][new_id]
self.maxsp -= @hp_mod[kind][new_id]
when :SP
@sp_mod[kind][new_id] = self.base_maxhp * item / 100
self.maxsp += @sp_mod[kind][new_id]
self.maxhp -= @sp_mod[kind][new_id]
when :STR
@str_mod[kind][new_id] = self.base_int * item / 100
self.str += @str_mod[kind][new_id]
self.int -= @str_mod[kind][new_id]
when :DEX
@dex_mod[kind][new_id] = self.base_agi * item / 100
self.dex += @dex_mod[kind][new_id]
self.agi -= @dex_mod[kind][new_id]
when :AGI
@agi_mod[kind][new_id] = self.base_dex * item / 100
self.agi += @agi_mod[kind][new_id]
self.dex -= @agi_mod[kind][new_id]
when :INT
@int_mod[kind][new_id] = self.base_str * item / 100
self.int += @int_mod[kind][new_id]
self.str -= @int_mod[kind][new_id]
end
elsif stat.keys.include?(previous_id)
case stat[previous_id]
when :HP
self.maxhp -= @hp_mod[kind][previous_id]
self.maxsp += @hp_mod[kind][previous_id]
@hp_mod[kind].delete(previous_id)
when :SP
self.maxsp -= @sp_mod[kind][previous_id]
self.maxhp += @sp_mod[kind][previous_id]
@sp_mod[kind].delete(previous_id)
when :STR
self.str -= @str_mod[kind][previous_id]
self.int += @str_mod[kind][previous_id]
@str_mod[kind].delete(previous_id)
when :DEX
self.dex -= @dex_mod[kind][previous_id]
self.agi += @dex_mod[kind][previous_id]
@dex_mod[kind].delete(previous_id)
when :AGI
self.agi -= @agi_mod[kind][previous_id]
self.dex += @agi_mod[kind][previous_id]
@agi_mod[kind].delete(previous_id)
when :INT
self.int -= @int_mod[kind][previous_id]
self.str += @int_mod[kind][previous_id]
@int_mod[kind].delete(previous_id)
end
end
end
def update_all_modified_stats
update_modified_stats(:weapon, 0, @weapon_id)
update_modified_stats(:armor, 0, @armor1_id)
update_modified_stats(:armor, 0, @armor2_id)
update_modified_stats(:armor, 0, @armor3_id)
update_modified_stats(:armor, 0, @armor4_id)
end
def skill_can_use?(skill_id)
sp_cost = $data_skills[skill_id].sp_cost
sp_cost = Calculate.skill_sp_cost(self, sp_cost, false)
# If there's not enough SP, the skill cannot be used.
return false if sp_cost > self.sp
# Unusable if incapacitated
return false if dead?
# If silent, only physical skills can be used
return false if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
# Get usable time
occasion = $data_skills[skill_id].occasion
# If in battle
if $game_temp.in_battle
# Usable with [Normal] and [Only Battle]
return (occasion == 0 or occasion == 1)
# If not in battle
else
# Usable with [Normal] and [Only Menu]
return (occasion == 0 or occasion == 2)
end
end
def slip_damage_effect
# Set damage
self.damage = self.maxhp / 10
### Modification ###
slip_dmg_items = All_Stats::SLIP_DAMAGE_REDUCTION_ITEMS
for equip_id in [@weapon_id, @armor1_id, @armor2_id, @armor3_id, @armor4_id]
next unless slip_dmg_items.include?(equip_id)
self.damage -= self.damage * slip_dmg_items[equip_id] / 100
end
### End of Modification ###
# Dispersion
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Subtract damage from HP
self.hp -= self.damage
# End Method
return true
end
end
class Window_Skill
def draw_item(index)
skill = @data[index]
if @actor.skill_can_use?(skill.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
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(skill.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
sp_cost = Calculate.skill_sp_cost(@actor, skill.sp_cost, false)
self.contents.draw_text(x + 232, y, 48, 32, sp_cost.to_s, 2)
end
end
class Scene_Skill
def update_skill
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to menu screen
$scene = Scene_Menu.new(1)
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get currently selected data on the skill window
@skill = @skill_window.skill
# If unable to use
if @skill == nil or not @actor.skill_can_use?(@skill.id)
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# If effect scope is ally
if @skill.scope >= 3
# Activate target window
@skill_window.active = false
@target_window.x = (@skill_window.index + 1) % 2 * 304
@target_window.visible = true
@target_window.active = true
# Set cursor position to effect scope (single / all)
if @skill.scope == 4 || @skill.scope == 6
@target_window.index = -1
elsif @skill.scope == 7
@target_window.index = @actor_index - 10
else
@target_window.index = 0
end
# If effect scope is other than ally
else
# If common event ID is valid
if @skill.common_event_id > 0
# Common event call reservation
$game_temp.common_event_id = @skill.common_event_id
# Play use skill SE
$game_system.se_play(@skill.menu_se)
### Modification ###
# Use up SP
Calculate.skill_sp_cost(@actor, @skill.sp_cost)
### End of Modification ###
# Remake each window content
@status_window.refresh
@skill_window.refresh
@target_window.refresh
# Switch to map screen
$scene = Scene_Map.new
return
end
end
return
end
# If R or L button was pressed
if Input.trigger?(Input::R)
# Play cursor SE
$game_system.se_play($data_system.cursor_se)
# To next actor
@actor_index += 1
@actor_index %= $game_party.actors.size
# Switch to different skill screen
$scene = Scene_Skill.new(@actor_index)
return
elsif Input.trigger?(Input::L)
# Play cursor SE
$game_system.se_play($data_system.cursor_se)
# To previous actor
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# Switch to different skill screen
$scene = Scene_Skill.new(@actor_index)
return
end
end
def update_target
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Erase target window
@skill_window.active = true
@target_window.visible = false
@target_window.active = false
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# If unable to use because SP ran out
unless @actor.skill_can_use?(@skill.id)
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# If target is all
if @target_window.index == -1
# Apply skill use effects to entire party
used = false
for i in $game_party.actors
used |= i.skill_effect(@actor, @skill)
end
end
# If target is user
if @target_window.index <= -2
# Apply skill use effects to target actor
target = $game_party.actors[@target_window.index + 10]
used = target.skill_effect(@actor, @skill)
end
# If single target
if @target_window.index >= 0
# Apply skill use effects to target actor
target = $game_party.actors[@target_window.index]
used = target.skill_effect(@actor, @skill)
end
# If skill was used
if used
# Play skill use SE
$game_system.se_play(@skill.menu_se)
# Use up SP
Calculate.skill_sp_cost(@actor, @skill.sp_cost)
# Remake each window content
@status_window.refresh
@skill_window.refresh
@target_window.refresh
# If entire party is dead
if $game_party.all_dead?
# Switch to game over screen
$scene = Scene_Gameover.new
return
end
# If command event ID is valid
if @skill.common_event_id > 0
# Command event call reservation
$game_temp.common_event_id = @skill.common_event_id
# Switch to map screen
$scene = Scene_Map.new
return
end
end
# If skill wasn't used, play buzzer SE
$game_system.se_play($data_system.buzzer_se) unless used
return
end
end
end
class Scene_Equip
def refresh
# Set item window to visible
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# Get currently equipped item
item1 = @right_window.item
# Set current item window to @item_window
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# If right window is active
if @right_window.active
# Erase parameters for after equipment change
@left_window.set_new_parameters(nil, nil, nil)
end
### Modification ###
# If item window is active
if @item_window.active and @last_item != @item_window.item
# Replaced Actual Hero with a Duplicate to avoid unintended statistics
# modifications that could reach the maximum value allowed by the game
@temp_actor = @actor.dup
# Get currently selected item
@last_item = item2 = @item_window.item
# Change equipment
last_hp = @temp_actor.hp
last_sp = @temp_actor.sp
@temp_actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
# Get parameters for after equipment change
new_atk = @temp_actor.atk
new_pdef = @temp_actor.pdef
new_mdef = @temp_actor.mdef
# Return equipment
@temp_actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
@temp_actor.hp = last_hp
@temp_actor.sp = last_sp
### End of Modification ###
# Draw in left window
@left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
end
end
end
unless All_Stats::CUSTOM_BATTLE_SYSTEM
class Scene_Battle
def make_skill_action_result
# Get skill
@skill = $data_skills[@active_battler.current_action.skill_id]
# If not a forcing action
unless @active_battler.current_action.forcing
# If unable to use due to SP running out
unless @active_battler.skill_can_use?(@skill.id)
# Clear battler being forced into action
$game_temp.forcing_battler = nil
# Shift to step 1
@phase4_step = 1
return
end
end
### Modification ###
# Use up SP
Calculate.skill_sp_cost(@active_battler, @skill.sp_cost)
### End of Modification ###
# Refresh status window
@status_window.refresh
# Show skill name on help window
@help_window.set_text(@skill.name, 1)
# Set animation ID
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# Set command event ID
@common_event_id = @skill.common_event_id
# Set target battlers
set_target_battlers(@skill.scope)
# Apply skill effect
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
end
end
end