=begin
#===============================================================================
Title: Skill Change
Author: Hime
Date: Sep 26, 2013
--------------------------------------------------------------------------------
** Change log
Sep 26, 2013
- added support for per-target mode
- added support for multiple skill changes for a single skill
- added support for action targets
May 19, 2013
- Initial release
--------------------------------------------------------------------------------
** Terms of Use
* Free to use in non-commercial projects
* Contact me for commercial use
* No real support. The script is provided as-is
* Will do bug fixes, but no compatibility patches
* Features may be requested but no guarantees, especially if it is non-trivial
* Credits to Hime Works in your project
* Preserve this header
--------------------------------------------------------------------------------
** Description
This script allows you to set a skill to execute a different skill if
certain conditions are met, with some probability.
For example, if your actor's HP is less than 50%, then there might be a chance
that each attack will be a special "critical attack" instead.
--------------------------------------------------------------------------------
** Installation
Place this script below Materials and above Main
--------------------------------------------------------------------------------
** Usage
Tag your skills with something of the form
id: 3
chance: 0.5
condition: a.hp < a.mhp * 0.5
Where
`id` is the skill ID to change it to
`chance` is the probability that it will be changed, as a percent
`condition` is a formula that must be satisfied
The following variables are available
a - attacker
b - list of targets**
Be careful about the targets. Because a skill can target multiple targets,
it is given as a list of targets. For example if you want to check if the
first target has state 5 applied, you would check
b[0].state?(5)
If per-target skill change mode is ON, then you don't need to worry about
the indexing and can just treat b as the target.
#===============================================================================
=end
$imported = {} if $imported.nil?
$imported["TH_SkillChange"] = true
#===============================================================================
# ** Configuration
#===============================================================================
module TH
module Skill_Change
# Per target skill change mode. Checks the skill for each enemy individually
# This is an add-on and you probably won't need it unless your skill change
# skills can target multiple battlers
Per_Target_Mode = false
Regex = /(.*?)<\/skill change>/im
end
end
#===============================================================================
# ** Rest of script
#===============================================================================
module RPG
class Skill
def skill_change_data
load_notetag_skill_change unless @skill_change_data
return @skill_change_data
end
def load_notetag_skill_change
@skill_change_data = []
res = self.note.scan(TH::Skill_Change::Regex)
res.each do |result|
chance = 1
condition = "true"
data = result[0].strip.split("\r\n")
for option in data
case option
when /id:\s*(\d+)/i
id = $1.to_i
when /chance:\s*(.*)/i
chance = $1.to_f
when /condition:\s*(.*)/i
condition = $1
end
end
changeData = Data_SkillChange.new(id)
changeData.chance = chance
changeData.condition = condition
@skill_change_data << changeData
end
end
end
end
class Data_SkillChange
attr_accessor :id
attr_accessor :chance
attr_accessor :condition
def initialize(id)
@id = id
@chance = 1
@condition = "false"
end
def condition_met?(a, b, v=$game_variables, s=$game_switches)
return false if @condition.empty?
eval(@condition)
end
end
class Game_Battler < Game_BattlerBase
def change_skill
item = current_action.item
return unless item.is_a?(RPG::Skill)
targets = current_action.make_targets
item.skill_change_data.each do |changeData|
if changeData.condition_met?(self, targets) && rand < changeData.chance
current_action.set_skill(changeData.id)
return
end
end
end
end
class Scene_Battle < Scene_Base
alias :th_skill_change_use_item :use_item
def use_item
@subject.change_skill
th_skill_change_use_item
end
end
#-------------------------------------------------------------------------------
# Per target add-on. This is...pretty bad.
#-------------------------------------------------------------------------------
if TH::Skill_Change::Per_Target_Mode
class Game_Battler < Game_BattlerBase
def change_skill(target, item)
return unless item.is_a?(RPG::Skill)
item.skill_change_data.each do |changeData|
if changeData.condition_met?(self, target) && rand < changeData.chance
current_action.set_skill(changeData.id)
return
end
end
current_action.set_skill(item.id)
end
end
class Scene_Battle < Scene_Base
#---------------------------------------------------------------------------
# Need to change how items are used
#---------------------------------------------------------------------------
def use_item
orig_item = @subject.current_action.item
@log_window.display_use_item(@subject, orig_item)
@subject.use_item(orig_item)
refresh_status
targets = @subject.current_action.make_targets.compact
# everything up to here is the same. This is where it gets complex
targets.each do |target|
@subject.change_skill(target, orig_item)
item = @subject.current_action.item
show_animation([target], item.animation_id)
item.repeats.times { invoke_item(target, item) }
end
end
end
end