Recharge Skills
Version: 1.0.1
Author: modern algebra
Date: 1 March 2013
Version History
- <Version 1.0.1> 01.03.2013 - Fixed bug where skill charges wouldn't clear after battle
- <Version 1.0> 11.12.2010 - Original Release
Description
This allows you to make it so that skills can be set to need to recharge after use. In other words, you can make it so that once an actor uses Heal, he or she cannot use Heal again for x number of turns. This script will also allow you to make items, weapons, and states that can increase or reduce the amount of time it takes to recharge a skill, as well as create items and skills that can immediately recharge any skills that are charging.
Features
- Allows you to set it so that once a skill is used, that actor can't use it again for however many turns
- You can set it up so that the basic charge time can be modified by equipment, state, class, or actor, thus allowing you to make armor that makes skills take a longer time to charge up, or set it up so that some classes can recharge skills faster, etc...
- Can create refresh skills and items that will reset all charge times so the actor can use them again
Instructions
Place this script in its own slot in the Script Editor, above Main and below other custom scripts.
See the header of the script for use instructions.
Script
#==============================================================================
# Recharge Skills
# Version: 1.0.1
# Author: modern algebra (rmrk.net)
# Date: 1 March 2013
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Description:
#
# This allows you to make it so that skills can be set to need to recharge
# after use. In other words, you can make it so that once an actor uses Heal,
# he or she cannot use Heal again for x number of turns. This script will
# also allow you to make items, weapons, and states that can increase or
# reduce the amount of time it takes to recharge a skill, as well as create
# items and skills that can immediately recharge any skills that are charging
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Instructions:
#
# Place this script in its own slot in the Script Editor (F11), above Main
# but below any other custom scripts you might have.
#
# Configuration is fairly easy. To specify how long a skill needs to take to
# recharge, all you need to do is place the following code in its notebox:
# \charge[x]
# where x is the number of turns you want it to be unavailable for after
# using it. It must be a positive integer.
#
# Example:
# \recharge[2] # Will wait two turns before you can use this skill again
#
# To set either an item or skill so that, when used, it will refresh all
# skills and get rid of any remaining charges so that all skills will be
# available, all you need to do is put the following code in the notebox:
# \refresh
#
# To set a weapon, armor, state, or enemy to reduce or increase the default
# charge times of a skill, all you need to do is use the following code:
# \recharge[x]
#
# You can also specify recharge modifiers by class or actor. See the
# Configurable Region at line 57 for instructions on setting those up. All
# recharge modifiers stack, so if your class normally adds 1 and an armor the
# actor wears adds 2, then it will take 3 extra turns to recharge the skill.
# Also, recharge mods will only add to skills that have a recharge time to
# begin with.
#==============================================================================
#==============================================================================
# *** RPG
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# New Constants - CLASS_RECHARGE_MODS, ACTOR_RECHARGE_MODS
# Modified classes - UsableItem, Skill, Weapon, Armor, State, Enemy
#==============================================================================
module RPG
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# CONFIGURABLE REGION
#``````````````````````````````````````````````````````````````````````````````
# Here, you can set recharge modifiers for classes and actors, thus allowing
# the recharge times to be different depending on which actor and what class.
# They both work the same basic way:
#
# CLASS_RECHARGE_MODS
# Each line should look as follows (omitting the < and >):
#
# <class ID> => <modifier>,
#
# class ID : the ID of the class you want to modify. So, by default,
# 1 would be Paladin, 2 would be Warrior, 3 would be Priest, etc...
# modifier : this can either be an integer or a positive decimal number.
# If an integer, it will add it to the number of turns. If a decimal
# number, it will multiply it by the number of turns.
#
# If you don't do a line for a class, then it defaults to 0 modifier.
# Remember to put a comma after EVERY one of these lines, except the last.
#
# EXAMPLES:
# 2 => 1,
# Whenever an actor with class 2 uses a skill, it will take one extra turn
# to recharge than it would normally. So, if a skill should take 3 turns
# to recharge, it will take 4 turns for actors with this class.
# 7 => 0.5,
# Whenever an actor with class 7 uses a skill, it will take only half as
# long to recharge as it would normally. If a skill takes 6 turns
# normally, it will take 3 turns to recharge for actors with this class.
#
# ACTOR_RECHARGE_MODS
# This works the same way, except with actor ID instead of class ID:
#
# <actor ID> => <modifier>,
# actor ID : the ID of the actor. So, by default, 1 would be Ralph,
# 2 would be Ulrika, etc...
# modifier : same as at line 71.
#
# If you don't do a line for a class, then it defaults to 0 modifier.
# Remember to put a comma after EVERY one of these lines, except the last.
#
# EXAMPLES:
# 4 => -2,
# Whenever Actor 4 uses a skill, it takes 2 less turns to charge. So if
# the skill normally takes 5 turns, it will take only 3 turns for actor 4.
# 7 => 2.5,
# Whenever Actor 7 uses a skill it 250% longer to recharge. So if a skill
# normally takes 2 turns, it will take 5 turns for actor 7.
#
# You can also change an actor's recharge modifier in game with a script call:
# $game_actors[<actor ID>] = <modifier>
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CLASS_RECHARGE_MODS = { # <- Do not touch.
1 => 0,
2 => 1.0,
} # <- Do not touch.
ACTOR_RECHARGE_MODS = { # <- Do not touch.
1 => 0,
2 => 1.0,
} # <- Do not touch.
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# END CONFIGURABLE REGION
#//////////////////////////////////////////////////////////////////////////////
CLASS_RECHARGE_MODS.default = 0
ACTOR_RECHARGE_MODS.default = 0
#==============================================================================
# ** UsableItem
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new method - refresh_charges?
#==============================================================================
class UsableItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Refresh
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh_charges?
return (self.note[/\\REFRESH/i] != nil)
end
end
#==============================================================================
# ** Skill
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new method - charge_time
#==============================================================================
class Skill
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Charge Time
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def recharge_time
return self.note[/\\CHARGE\[(\d+)\]/i] != nil ? $1.to_i : 0
end
end
#==============================================================================
# ** Weapon, Armor, State, Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new method - recharge_mod
# aliased method - ma_reset_note_values (if have Note Editor)
#==============================================================================
["Weapon", "Armor", "State", "Enemy"].each { |class_name|
RS_REGEXP = "/\\\\RECHARGE\\[(-?\\d+)(%?)\\]/i"
CLDEF = <<__END__
class #{class_name}
def recharge_mod
if !@recharge_mod
if self.note[#{RS_REGEXP}] != nil
if $2.empty?
@recharge_mod = $1.to_i
else
x = $1.to_f / 100.0
@recharge_mod = x >= 0 ? x : -1*x
end
else
@recharge_mod = 0
end
end
return @recharge_mod
end
if self.method_defined? (:ma_reset_note_values)
alias ma_rchrg_restnot_8ik3 ma_reset_note_values
def ma_reset_note_values (*args)
ma_rchrg_restnot_8ik3 (*args) # Run Original Method
@recharge_mod = nil
end
end
end
__END__
eval (CLDEF)
}
end
#==============================================================================
# ** Game_Battler
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - initialize; skill_can_use?; skill_test; skill_effect;
# item_test; item_effect
# new methods - set_skill_recharge; update_skill_recharge; recharge_mod
#==============================================================================
class Game_Battler
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_skilchrg_initz_5tg2 initialize
def initialize (*args)
@sc_turns_count = {}
@sc_turns_count.default = 0
ma_skilchrg_initz_5tg2 (*args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Check if Can Use Skill
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias malgbr_chrgskil_canus_9dv4 skill_can_use?
def skill_can_use? (skill, *args)
return false if @sc_turns_count[skill.id] > 0
return malgbr_chrgskil_canus_9dv4 (skill, *args) # Return Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Skill Test
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mal_rchrgskl_tst_4wp9 skill_test
def skill_test (user, skill, *args)
return true if skill.refresh_charges? && !@sc_turns_count.empty?
return mal_rchrgskl_tst_4wp9 (user, skill, *args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Skill Effect
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mgba_rchrgskil_efct_2ok7 skill_effect
def skill_effect (user, skill, *args)
@sc_turns_count.clear if skill.refresh_charges?
mgba_rchrgskil_efct_2ok7 (user, skill, *args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Item Test
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias mogb_rchrg_itmtest_6yh2 item_test
def item_test (user, item, *args)
return true if item.refresh_charges? && !@sc_turns_count.empty?
return mogb_rchrg_itmtest_6yh2 (user, item, *args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Item Effect
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias malga_rechrge_itmeffect_5th3 item_effect
def item_effect (user, item, *args)
@sc_turns_count.clear if item.refresh_charges?
malga_rechrge_itmeffect_5th3 (user, item, *args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Set Charge
# skill : the skill used
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def set_skill_recharge (skill)
return if skill.recharge_time == 0
@sc_turns_count[skill.id] = skill.recharge_time
direct, percent = recharge_mod
@sc_turns_count[skill.id] += direct
@sc_turns_count[skill.id] = (@sc_turns_count[skill.id] * percent).round
@sc_turns_count[skill.id] += 1
@sc_turns_count.delete (skill.id) if @sc_turns_count[skill.id] < 1
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Clear Charge
# skill : the skill used
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def clear_skill_recharge(skill_id = 0)
if skill_id == 0
@sc_turns_count.clear
else
@sc_turns_count.delete(skill_id)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Update Charges
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def update_skill_recharge
for i in @sc_turns_count.keys
@sc_turns_count[i] -= 1
@sc_turns_count.delete (i) if @sc_turns_count[i] <= 0
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Recharge Mod
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def recharge_mod
direct, percent = 0, 1.0
states.each { |state|
x = state.recharge_mod
x.is_a? (Float) ? percent *= x : direct += x
}
return direct, percent
end
end
#==============================================================================
# ** Game_Actor
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased method - setup
# redefined super method - recharge_mod
#==============================================================================
class Game_Actor
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
attr_accessor :base_recharge
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Actor Setup
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias malgb_rechrg_initz_8ik2 setup
def setup (*args)
malgb_rechrg_initz_8ik2 (*args) # Run Original Method
@base_recharge = RPG::ACTOR_RECHARGE_MODS[@actor_id]
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Recharge Mod
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def recharge_mod
direct, percent = super
class_mod = RPG::CLASS_RECHARGE_MODS[class_id]
class_mod.is_a? (Float) ? percent *= class_mod : direct += class_mod
@base_recharge.is_a? (Float) ? percent *= @base_recharge : direct += @base_recharge
equips.compact.each { |equip|
x = equip.recharge_mod
x.is_a? (Float) ? percent *= x : direct += x
}
return direct, percent
end
end
#==============================================================================
# ** Game_Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# redefined super method - recharge_mod
#==============================================================================
class Game_Enemy
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Recharge Mod
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def recharge_mod
direct, percent = super
x = enemy.recharge_mod
x.is_a? (Float) ? percent *= x : direct += x
return direct, percent
end
end
#==============================================================================
# ** Scene_Battle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - execute_action_skill; turn_end
#==============================================================================
class Scene_Battle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Execute Battle Action: Skill
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modrn_chrg_exactskil_5th3 execute_action_skill
def execute_action_skill (*args)
modrn_chrg_exactskil_5th3 (*args) # Run Original Method
@active_battler.set_skill_recharge (@active_battler.action.skill)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * End Turn
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias morba_chrgskl_endturn_4tx1 turn_end
def turn_end (*args)
if args[0] && args[0].is_a? (Game_Battler) # Tankentai ATB Compatibility
args[0].update_skill_recharge
else
($game_troop.members + $game_party.members).each { |battler| battler.update_skill_recharge }
end
morba_chrgskl_endturn_4tx1 (*args) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * End Battle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias marc_batlend_4kb6 battle_end
def battle_end(*args)
$game_party.members.each { |actor| actor.clear_skill_recharge }
marc_batlend_4kb6(*args) # Call Original Method
end
end
Credit
Thanks
Support
Please post in this topic for any bug reports or suggestions. Do not PM me.
Known Compatibility Issues
If using this script with the Note Editor, then it should be placed below the General Compatibility Patch.
If using this script with Tankentai ATB, this script must be below it in the Script Editor.
This script is untested with YEM, but is probably incompatible with that battle system.