#==============================================================================| # ** DoubleX RMVXA Random Cast v1.00a | #------------------------------------------------------------------------------| # * Changelog | # v1.00a(GMT 0800 26-8-2014): | # - 1st version of this script finished | #------------------------------------------------------------------------------| # * Author | # DoubleX | #------------------------------------------------------------------------------| # * Terms of use | # None other than not claiming this script as created by anyone except | # DoubleX or his alias | #------------------------------------------------------------------------------| # * Prerequisites | # Scripts: | # - none | # Knowledge: | # - Use of notetags | #------------------------------------------------------------------------------| # * Functions | # - Lets users cast random skills on targetswhen the current skill hits them| #------------------------------------------------------------------------------| # * Manual | # To use this script, open the script editor and put this script into an | # open slot between ▼ Materials and ▼ Main. Save to take effect. | #------------------------------------------------------------------------------| # * Compatibility | # Scripts rewriting Vocab CounterAttack or aliasing or rewriting method: | # - load_database under module DataManager | # - apply_item_effects under class Scene_Battle | # may have compatibility issues with this script | # Place this script above those aliasing any of these method if possible | #==============================================================================| ($doublex_rmvxa ||= {})["Random Cast"] = 10001 #------------------------------------------------------------------------------| # * Notetag <random cast: id, cp, cr, cs, cc> for states(1), weapons(2), | # armors(3), enemies(4), actors(4), classes(5) and skills(6):(the larger the| # number, the higher the priority) | # To make a battler has cp% chance to cast skill with id id and cr% cost | # to a target when the current skill of that battler hits that target, put | # the above notetag into the related actor's, class's, skill's, equip's, | # enemy's or state's notebox in the database. | # Setting cs as 0 and 1 makes cr negative and positive respectively | # cc is the random cast condition explained in the below user editable zone | # Skills invoked via random cast only hit that target an only hit once | # That target can't counter nor reflect those skills. | # If more than 1 such notetag is placed in the same actor's, class's, | # skill's, equip's, nemy's or state's notebox, the 1st notetag meeting its | # requirements will be used and all the others will be ignored. All those | # noteboxes will be scanned from the 1st line to the last line. | #------------------------------------------------------------------------------| #==============================================================================| # ** You only need to edit this part as it's about what this script does | #------------------------------------------------------------------------------| module DoubleX_RMVXA module Random_Cast #------------------------------------------------------------------------------| # * Random Cast Condition(cc in random cast notetag): | # To make <random cast: id, cp, cr, cs, cc> work, the requirements in cc | # must be met. These requirements are ruby scripts like those in events. | # The below CCX are examples of writing such codes and abtracting them in | # random cast notetags to aid users in understanding and using cc there. | # To use CCX, set the value of cc in random cast notetag as CCX. | # Users can set their own CCX(or whatever names they set) to be used by cc. | # CCX names must start with letters and only have alphanumeric characters. | # CCX is evaluated in the new method random_cast under class Game_Battler. | #------------------------------------------------------------------------------| # CC1, default = "true" # cc is always true CC1 = "true" # CC2, default = "item.id != database.random_cast_id[index]" # cc is true if and only if the current skill id isn't equal to id CC2 = "item.id != database.random_cast_id[index]" # CC3, default = "!item.physical? && !item.magical?" # cc is true if and only if the current skill isn't physical nor magical CC3 = "!item.physical? && !item.magical?" # CC4, default = CC2 + " || " + CC3 # cc is true if and only if CC2 or CC3 is true CC4 = CC2 + " || " + CC3 # CC5, default = "actor? && [x, y, z].include?(id)" # cc is true if and only if the caster is an actor with id x, y or z CC5 = "actor? && [x, y, z].include?(id)" # CC6, default = "(" + CC4 + ") && " + CC5 # cc is true if and only if CC4 and CC5 is true CC6 = "(" + CC4 + ") && " + CC5 # CC7, default = "!" + CC6 # cc is true if and only if CC6 is false CC7 = "!" + CC6 # CC8, default = "enemy? && self.enemy_id == x" # cc is true if and only if the caster is an enemy with id x CC8 = "enemy? && self.enemy_id == x" # CC9, default = "rand(999) < luk" # cc is true if and only if the random number(0 - 998) isn't small than luk CC9 = "rand(999) < luk" end # Random_Cast end # DoubleX_RMVXA #==============================================================================| #==============================================================================| # ** You need not edit this part as it's about how this script works | #------------------------------------------------------------------------------| module DoubleX_RMVXA module REGEXP module BASEITEM Data = ["id", "chance", "cost", "sign", "condition"] RANDOM_CAST = /<(?:RANDOM_CAST|random cast):[ ](\w+(?:\s*,\s*\w+)*)>/i end # BASEITEM end # REGEXP end # DoubleX_RMVXA module Vocab RandomCast = "%s randomly casts %s!" end # Vocab class << DataManager #----------------------------------------------------------------------------| # Alias method: load_database | #----------------------------------------------------------------------------| alias load_database_random_cast load_database def load_database load_database_random_cast # This part is added by this script to load random cast notetags load_notetags_random_cast # end # load_database #----------------------------------------------------------------------------| # New method: load_notetags_random_cast | #----------------------------------------------------------------------------| def load_notetags_random_cast for group in [$data_actors, $data_classes, $data_skills, $data_weapons, $data_armors, $data_enemies, $data_states] for obj in group obj.load_notetags_random_cast if obj end end end # load_notetags_random_cast end # DataManager class RPG::BaseItem include DoubleX_RMVXA::Random_Cast include DoubleX_RMVXA::REGEXP::BASEITEM #----------------------------------------------------------------------------| # New public instance variables | #----------------------------------------------------------------------------| Data.each { |data| eval("attr_reader :random_cast_" + data) } attr_reader :random_cast_note #----------------------------------------------------------------------------| # New method: load_notetags_random_cast | #----------------------------------------------------------------------------| def load_notetags_random_cast Data.each { |data| eval("@random_cast_" + data + " = []") } @random_cast_note = 0 self.note.split(/[\r\n]+/).each { |line| case line when RANDOM_CAST id = 0 chance = 0 condition = nil cost = nil sign = nil $1.scan(/\w+/).each_with_index { |input, index| case index when 0 id = input.to_i if input.to_i > 0 next when 1 chance = input.to_f / 100.0 if input.to_f > 0 next when 2 cost = input.to_f / 100.0 next when 3 sign = input.to_i if [0, 1].include?(input.to_i) when 4 condition = eval(input.to_s) else break end } if id != 0 && chance != 0 && cost && sign && condition Data.each { |data| eval("@random_cast_" + data + ".push(" + data + ")") } @random_cast_note += 1 end end } end # load_notetags_random_cast end # RPG::BaseItem class Game_Battler < Game_BattlerBase include DoubleX_RMVXA::Random_Cast include DoubleX_RMVXA::REGEXP::BASEITEM #----------------------------------------------------------------------------| # New public instance variables | #----------------------------------------------------------------------------| Data.each { |data| eval("attr_reader :random_cast_" + data) } #----------------------------------------------------------------------------| # New method: set_random_cast | #----------------------------------------------------------------------------| def set_random_cast(item) Data.each_with_index { |data, index| eval("@random_cast_" + data + " = " + (index > 1 ? "nil" : "0")) } states.each { |state| random_cast(state, item) } return if random_cast? if actor? [weapons, armors].each { |equips| next if !equips equips.each { |equip| random_cast(equip, item) } return if random_cast? } random_cast(actor, item) return if random_cast? random_cast(self.class, item) return if random_cast? elsif enemy? random_cast(self.enemy, item) return if random_cast? end if item random_cast(item, item) return if random_cast? end end # set_random_cast #----------------------------------------------------------------------------| # New method: random_cast | #----------------------------------------------------------------------------| def random_cast(database, item) database.random_cast_note.times { |index| next if !random_cast_payable?(database.random_cast_id[index], database.random_cast_cost[index], database.random_cast_sign[index], ) || !eval(database.random_cast_condition[index]) return Data.each { |data| eval("@random_cast_" + data + " = database.random_cast_" + data + "[index]") } if rand < database.random_cast_chance[index] } end # random_cast #----------------------------------------------------------------------------| # New method: random_cast_payable? | #----------------------------------------------------------------------------| def random_cast_payable?(skill_id, cost_rate, cost_sign) rate = cost_rate * (cost_sign * 2 - 1) tp >= (skill_tp_cost($data_skills[skill_id]) * rate).to_i && mp >= (skill_mp_cost($data_skills[skill_id]) * rate).to_i end # random_cast_payable? #----------------------------------------------------------------------------| # New method: random_cast? | #----------------------------------------------------------------------------| def random_cast? @random_cast_id != 0 && @random_cast_chance != 0 && @random_cast_cost end # random_cast? #----------------------------------------------------------------------------| # New method: use_random_cast | #----------------------------------------------------------------------------| def use_random_cast(item) rate = @random_cast_cost * (@random_cast_sign * 2 - 1) self.mp -= (skill_mp_cost(item) * rate).to_i self.tp -= (skill_tp_cost(item) * rate).to_i item.effects.each {|effect| item_global_effect_apply(effect) } end # use_random_cast end # Game_Battler class Window_BattleLog < Window_Selectable #----------------------------------------------------------------------------| # New method: display_random_cast | #----------------------------------------------------------------------------| def display_random_cast(target, item) add_text(sprintf(Vocab::RandomCast, target.name, item.name)) wait back_one end # display_random_cast end # Window_BattleLog class Scene_Battle < Scene_Base #----------------------------------------------------------------------------| # Alias method: apply_item_effects | #----------------------------------------------------------------------------| alias apply_item_effects_random_cast apply_item_effects def apply_item_effects(target, item) apply_item_effects_random_cast(target, item) # This part is added by this script to apply random cast if target is hit and random_cast? is true apply_random_cast(target, item) if item.is_a?(RPG::Skill) && target.result.hit? && !@subject.magic_reflection # end # apply_item_effects_random_cast #----------------------------------------------------------------------------| # New method: apply_random_cast | #----------------------------------------------------------------------------| def apply_random_cast(target, item) @subject.set_random_cast(item) return if !@subject.random_cast? random_cast = $data_skills[@subject.random_cast_id] @log_window.display_random_cast(@subject, random_cast) @subject.use_random_cast(random_cast) refresh_status show_animation([target], random_cast.animation_id) target.item_apply(@subject, random_cast) refresh_status @log_window.display_action_results(target, random_cast) end # apply_random_cast end # Scene_Battle #==============================================================================|