RMVX

스테이터스 커스텀 스크립트 관련 질문입니다.

by T.C.O.L posted Oct 31, 2010
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

#===============================================================================
#
# Yanfly Engine RD - Custom Status Properties
# Last Date Updated: 2009.06.24
# Level: Normal, Hard, Lunatic
#
# Status effects seriously don't get enough love in RPG's, both commercial and
# RPG Maker projects. This script will provide more than your bread and butter
# status effect traits. Here are some things this script can do.
#
# - Status effects can raise MaxHP and MaxMP by percentile and set values. Or
#   even lower them if that's what's desired.
# - HP and MP degeneration if the usual slip damage is too heavy or light. You
#   can even create HP and MP regeneration.
# - If the attack, defense, spirit, and agility rate limit of 200% is too low
#   for you, you can break the limit and go to something absurd like 1,000,000%.
# - A status effect that prevents the battler from dying even if the battler is
#   at 0 HP, essentially granting the battler a form of immortality.
# - Status effects that greatly reduce HP and/or MP damage given to battlers.
#   They can even completely nullify HP and/or MP damage.
# - Can convert a portion of the received HP damage into MP damage and vice
#   versa: MP to HP damage.
# - Make battlers vanish from battle and have them return to battle after the
#   status effect wears off.
# - A condition similar to berserk and confused, but makes allows the battler
#   to use skills using auto battle AI.
# - Custom status effect properties that trigger during any of these five
#   situations: applying, while the status is on, when status leaves naturally,
#   upon removal, and reacting to attack and skill damage.
# - State stacking. Some effects will stack. The amount they stack will depend
#   on the effect the states will produce. Explained below.
#
# I hope you find different ways to use these status effects to spice up one of
# the most overlooked mechanics in many, many RPG's out there.
#
#===============================================================================
# Updates:
# ----------------------------------------------------------------------------
# o 2009.05.12 - Three more Lunatic effect types:
#                Begin Effect: Occurs at the start of a turn.
#                Shock Effect: Occurs after taking an attack or turn.
#                Close Effect: Occurs at the end of a turn.
# o 2009.05.02 - Aliased regen and degen to slip_damage_effect rather than
#                remove states auto since it provides more compatibility.
# o 2009.04.28 - State stacking capabilities added.
# o 2009.04.23 - Improved functionality on HECO stat minimums.
# o 2009.04.19 - Upgrade Pack 1
#                Added shorter way to use atk/def/spi/agi_f rates.
#                Added a state-type hash for the module. Optional usage.
#                Included Add/Sub set values for atk/def/spi/agi.
#                Included Per/Add/Sub for Hit/Eva/Cri/Odds.
#                Included Undead HP/MP. Added Absorb HP/MP.
#                Included Death Upon HP/MP Damage/Healing.
#                Included HP/MP Pain/Healing Rates.
#                Included Super Guard, Pharmacology, Fast Attack, Anti-State.
#                Included Double EXP Gain, Half MP Cost, Prevent Critical.
# o 2009.04.18 - Improved REGEXP cache.
# o 2009.04.15 - Finished script and publicized.
# o 2009.04.13 - Started script.
#===============================================================================
# How to Use: Normal Mode
#===============================================================================
#
# Simply input these into the States Notebox and you'll get the effects you're
# looking for. These directly affect stats and don't do anything else funky that
# you don't have to worry about.
#
# <max stack x>
# By default, everything has a maximum stack of of 1. Stacking a state more than
# once will increase its effect. For states that increase by a percentile, the
# stack effect will increase its effect after a difference with 100. This means
# that if a state with 110% attack rate gets stacked, the 10% gets multipled
# instead of the full 110%. Stacking it twice will get 120%. Thrice nets 130%.
# Set changes will stack completely. +50ATK will stack as +100, then +150, and
# so on. Max stack will set the maximum amount of times the state can stack.
# States that can be stacked will be marked as <<STACKABLE>>.
#
# <maxhp per x>, <maxhp add x>, <maxhp sub x>
# <maxmp per x>, <maxmp add x>, <maxmp sub x>
# Sets rate for MaxHP or MP by x percentage, adds x value, or subtracts x value.
# <<STACKABLE>>
#
# <hp degen per x>, <hp degen set x>, <hp regen per x>, <hp regen set x>
# Causes battler to gain or lose HP by x percentage or x amount each turn.
# <<STACKABLE>>
#
# <mp degen per x>, <mp degen set x>, <mp regen per x>, <mp regen set x>
# Causes battler to gain or lose MP by x percentage or x amount each turn.
# <<STACKABLE>>
#
# <atk per x>, <def per x>, <spi per x>, <agi per x>
# <atk add x>, <def add x>, <spi add x>, <agi add x>
# <atk sub x>, <def sub x>, <spi sub x>, <agi sub x>
# These raise and lower the respective stat by a percentile value if using "per"
# or a static value if using "add" or "sub" tags. Value changed is equal to x.
# <<STACKABLE>>
#
# <hit per x>,  <hit add x>,  <hit sub x>
# <eva per x>,  <eva add x>,  <eva sub x>
# <cri per x>,  <cri add x>,  <cri sub x>
# <odds per x>, <odds add x>, <odds sub x>
# These raise and lower the HECO stats by a percentile value if using "per" or
# a static value if using "add" or "sub" tags. Value changed is equal to x.
# <<STACKABLE>>
#
#===============================================================================
# How to Use: Hard Mode
#===============================================================================
#
# Input these into the state notebox as well. These perform unique traits so
# be alert as to what to expect.
#
# <immortality>
# Causes the character affected to be immortal so long as it's on. Immortal
# characters can go to 0 HP but still be able to act. If a character is at 0 HP,
# and the status effect is removed, then that character will die.
#
# <vanish>
# Vanish will remove a character from battle for a bit (until the status effect
# is removed). Until then, that character cannot be targetted, attacked, or
# anything. Even if you target the vanished character with a skill/item, it will
# pick someone else. If there are no other allies but the character is vanished,
# the battle will end as a game over or victory depending on which side has
# insufficient battlers.
#
# <auto battle>
# Causes the character to act as if auto battle is checked. Auto battle will
# make the character attack on its own, but willing to use skills unlike berserk
# and confuse. If the character becomes berserk or confused while having auto
# battle, it won't do anything other than attack, just like normally berserk or
# confused. Once removed, character becomes controllable again.
#
# <half mp cost>
# This gives the battler a Half MP Cost effect. Pretty much the same effect as
# if the battler was equipping a Half MP Cost piece of equipment.
#
# <super guard>
# If the battler defends, damage received will be taken as one quarter of its
# original damage. This is the same effect as if Super Guard was checked under
# the Actors tab in the database.
#
# <pharmacology>
# This doubles the effectiveness of items. It's essentially the same as having
# Pharamcology checked under the Actors tab in the database.
#
# <double exp gain>
# This allows the actor to get double experience if the state is on. It's
# essentially the same as having Double Exp Gain checked in an equip.
#
# <fast attack>
# This raises the initiative for the battler if it is performing a regular
# attack (unless you customize that). It's essentially the same as having a
# weapon with fast attack checked.
#
# <prevent critical>
# Attacks cannot cause critical hits against the battler. This is the same as
# having armour with Prevent Critical checked.
#
# <anti state>
# This prevents the battler from gaining any more states until the anti-state
# is off. States can still be removed but cannot be added onto the battler.
#
# <absorb hp>, <absorb mp>
# If the battler deals HP damage or MP damage (for the respective states),
# all damage is converted to absorbed damage regardless of HP or MP type. This
# does not affect undead.
#
# <death on hp dmg>, <death on mp dmg>
# If dealt any HP or MP damage (for the respective tags, the affected battler
# will die instantly (or if the battler is immortal, HP dropped to 0).
#
# <death on hp heal>, <death on mp heal>
# Similar to the above, if healed for HP or MP, the affected battler will die
# instantly (or if the battler is immortal, HP will be dropped to 0).
#
# ------------------------------------------------------------
# The following are mods that affect damage taken.
# ------------------------------------------------------------
#
# <hp pain rate x>, <hp heal rate x>
# This raises or lowers the amount of HP damage or healing the battler will
# take in. This is calculated above the rest of the HP modifying attributes.
# <<STACKABLE>>
#
# <super armour>
# Reduces damage dealt to character by adjustable values down below. Super
# does not reduce damage dealt to the character outside of the normal battle
# mechanics and directly adjusting character HP.
#
# <invincible hp>
# When a character is invincible, that character cannot take HP damage at all.
# The character can still die via directly applying the death status and will
# still take HP degen damage. Use with <immortality> if you want an unkillable
# and undamagable status effect.
#
# <hpdmg to mpdmg x>
# Shifts x percent of HP damage over to MP damage. All of this occurs after the
# react effects and HP damage reductions. If there isn't enough MP, it'll go
# back to HP for remaining damage. Both HP and MP damage will show.
#
# <undead hp x>
# If the target's HP is to be healed, that recovery is converted into damage.
# x is the percentage of the damage dealt. For example, if a battler is to be
# healed for 100, <undead hp 80> would make the battler take 80 damage with no
# HP recovered. <undead hp 100> would allow for 100% conversion. This ignores
# any kind of super armour and invincible HP properties. This also prevents
# absorption for both HP and MP.
#
# <mp pain rate x>, <mp heal rate x>
# This raises or lowers the amount of MP damage or healing the battler will
# take in. This is calculated above the rest of the MP modifying attributes.
# <<STACKABLE>>
#
# <super barrier>
# Functions similar to super armour, but reduces MP damage instead. Does not
# reduce MP damage dealt to character outside of normal battle mechanics and
# directly adjusting character MP.
#
# <invincible mp>
# Just like the effect for its HP counterpart, this prevents any MP damage at
# all if dealt. This does not protect against manually lowering MP and skills
# that cost MP will still lower MP.
#
# <mpdmg to hpdmg x>
# Pretty much the opposite of its HP counterpart, this will convert a percent of
# any potential MP damage to HP damage. This will not kill the battler, but will
# leave the battler at 1 HP minimum.
#
# <undead mp x>
# Similar to <undead hp x>, this converts MP recovery into MP damage by x
# percentage. For example, if the battler is to be healed for 100 MP, the tag
# <undead mp 75> would make the battler take 75 MP damage instead. This ignores
# any super barrier and invincible MP properties. This also prevents absorption
# for both HP and MP.
#
#===============================================================================
#
# Compatibility
# - Works With: KGC LimitBreak
# - Alias: Game_Battler, initialize, maxhp, maxmp, atk, def, spi, agi
# - Alias: Game_Battler, add_state, remove_state, remove_states_auto
# - Alias: Game_Battler, execute_damage, slip_damage_effect
# - Alias: Game_Actor, hit, eva, cri, odds, a lot of equip traits
# - Alias: Game_Enemy, hit, eva, cri, odds
# - Alias: Scene_Battle, start
# - Overwrites: Game_Actor, state_probability
# - Overwrites: Game_Enemy, state_probability
#
#===============================================================================

$imported = {} if $imported == nil
$imported["CustomStatusProperties"] = true

module YE
  module BATTLE
     
    # This part allows you to quickly change the state probability success
    # rate rankings without needing to do too much in the core script.
    STATE_A = 100
    STATE_B = 80
    STATE_C = 60
    STATE_D = 40
    STATE_E = 20
    STATE_F = 0
     
    # These values determine how much HP damage that status effects with the
    # super armour property reduces HP damage by.
    SUPER_ARMOUR_PER = 90   # Reduces HP damage by 90%.
    SUPER_ARMOUR_SUB = 50   # Reduces HP damage by 50 HP.
    SUPER_ARMOUR_MIN = 1    # Minimum HP damage given to super armour.
     
    # These values determine how much MP damage that status effects with the
    # super barrier property reduces MP damage by.
    SUPER_BARRIER_PER = 80  # Reduces MP damage by 80%.
    SUPER_BARRIER_SUB = 10  # Reduces MP damage by 10 MP.
    SUPER_BARRIER_MIN = 1   # Minimum MP damage given to the super barrier.
   
  end #module BATTLE
  module HASH
   
    # This part is entirely optional, but it helps categorize status effects
    # if you ever decide to clump them together in mass. I do this since it's
    # easier to find if a state belongs to a certain collection of elements.
   
    STATE_TYPE = {  # Input the states into any category you want here.
      "Death"      => [ 1],
      "Conditions" => [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
      "Buffs"      => [ 9, 10, 11, 12],
      "Debuffs"    => [13, 14, 15, 16],
     
    } # Do not remove this
   
  end #module HASH
end #module YE

#===============================================================================
# How to Use: Lunatic Mode
#===============================================================================
#
# This section is for all the lunatic scripters out there who want to do a bit
# more with your status effects. Put these into your status effect's notebox
# and then head over to the next section to script your own custom effects.
#
# <apply effect x>
# Apply effects occur whenever states are added to the battler. These also
# trigger from the event editor. Find "run_apply_effect" to script your own
# custom effects.
#
# <begin effect x>
# Begin effects occur at the start of a turn. These will always trigger so long
# as the state exists on the battler. Find "run_begin_effect" to script your
# own begin effects.
#
# <while effect x>
# While effects occur each turn after the battler performs an action. These
# do not trigger from the event editor and do not trigger if the battler is
# vanished. Find "run_while_effect" to script your own custom effects.
#
# <react effect x>
# React effects occur whenever the battler is the target of an attack or skill.
# The effect does not trigger if it's just a script dealing damage to it without
# an attack or skill base. Find "run_react_effect" to script your own effects.
# Be careful about scripting react effects to cause damage since it can make an
# endless chain of react effects. Apply anti_react if needed.
#
# <shock effect x>
# Shock effects after the battler has finished taking an attack unlike the react
# effect where it triggers before an attack. Find "run_shock_effect" to script
# your own shock effects.
#
# <close effect x>
# Close effects occur at the end of a turn. These will always trigger so long
# as the state exists on the battler. Find "run_close_effect" to script your
# own close effects.
#
# <leave effect x>
# Leave effects occur if the status effect leaves naturally after the turn
# limit is up. These won't trigger if you manually erase them. Erase effects
# will still occur even after a leave effect. Find "run_leave_effect" to script
# your own custom effects.
#
# <erase effect x>
# Erase effects occur whenever states are removed from the battler. Like the
# apply effects, these trigger with the event editor. Find "run_erase_effect"
# to script your own custom effects.
#
# ------------------------------------------------------------------------------
# There are functions unique to this script for Game_Battler:
# ------------------------------------------------------------------------------
# msgwait
#   Causes $scene_battle to wait 30 frames. If you want it to wait more, change
#   it to msgwait(x) where x is the frames you want it to wait.
#
# status_damage(hp_dmg, mp_dmg, target, attacker, anti_react = true,
#   absorb = false)
#   This allows you to damage the target and display it properly with death
#   animations and all if you decide for that to be the custom effect. Set the
#   anti_react flag to true (it's true by default) to prevent endless react
#   chains and potentially put your game into an endless loop.
#
# set_state_turns(state_id, new_turns)
#   This allows you to manually adjust the state's turns. Note that if you set
#   it to zero or lower, it'll be readjusted to 1 to prevent bugs.
#
# state_turns?(state_id)
#   This returns whatever number of turns is left for the state.
#
#===============================================================================

class Game_Battler
 
  def run_apply_effect(state)
    state_effect_id = state.apply_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state apply effects
    #---------------------------------------------------------------------------
    when 1
      self.hp = self.mp
      text = sprintf("%s's HP becomes %s's MP!", self.name, self.name)
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_begin_effect(state)
    state_effect_id = state.begin_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state apply effects
    #---------------------------------------------------------------------------
    when 1
      text = "It's the start of the turn!"
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_while_effect(state)
    state_effect_id = state.while_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state while effects
    #---------------------------------------------------------------------------
    when 1
      self.hp += self.mp
      text = sprintf("%s heals %d HP!", self.name, self.mp)
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_react_effect(state)
    state_effect_id = state.react_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state react effects
    #---------------------------------------------------------------------------
    when 1
      if @hp_damage > 0
        self.add_state(9)
      end
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_shock_effect(state)
    state_effect_id = state.shock_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state shock effects
    #---------------------------------------------------------------------------
    when 1
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_close_effect(state)
    state_effect_id = state.close_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state close effects
    #---------------------------------------------------------------------------
    when 1
      text = "It's the end of the turn!"
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_leave_effect(state)
    state_effect_id = state.leave_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state leave effects
    #---------------------------------------------------------------------------
    when 1
      self.mp += self.maxmp / 2
      text = sprintf("%s's recovers %d MP!", self.name, self.maxhp / 2)
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
  def run_erase_effect(state)
    state_effect_id = state.erase_effect
    line_number = $message__window.line_number if $game_temp.in_battle
    case state_effect_id
    #---------------------------------------------------------------------------
    # //////////////////////////////////////////////////////////////////////////
    # This is where you begin adding in your own state erase effects
    #---------------------------------------------------------------------------
    when 1
      self.hp = self.maxhp
      text = sprintf("%s's HP becomes %d!", self.name, self.maxhp)
      $message__window.add_instant_text(text)
      msgwait
     
    when 2
      text = "A poisonous gas appears!"
      $message__window.add_instant_text(text)
      $scene.display_animation($game_troop.existing_members, 31)
      $scene.wait_for_animation
      mini_line = $message__window.line_number
      hpdmg = self.atk + self.spi
      for member in self.action.opponents_unit.existing_members
        status_damage(hpdmg, 0, member, self, true, true)
        $message__window.back_to(mini_line)
      end
     
    #---------------------------------------------------------------------------
    # This is the part you guys shouldn't touch afterwards.
    # //////////////////////////////////////////////////////////////////////////
    #---------------------------------------------------------------------------
    end
    $message__window.back_to(line_number) if $game_temp.in_battle
  end
 
end # Game_Battler

#===============================================================================
# Editting anything past this point may potentially result in causing computer
# damage, incontinence, explosion of user's head, coma, death, and/or halitosis.
# Therefore, edit at your own risk.
#===============================================================================

module YE
  module REGEXP
    module STATE
       
      # These adjust State Stacking
      MAX_STACK = /<(?:MAX_STACK|max stack)[ ]*(d+)>/i
     
      # These adjust MaxHP and MaxMP.
      MAXHP_PER = /<(?:MAXHP_PER|maxhp per)[ ]*(d+)>/i
      MAXMP_PER = /<(?:MAXMP_PER|maxmp per)[ ]*(d+)>/i
      MAXHP_ADD = /<(?:MAXHP_ADD|maxhp add)[ ]*(d+)>/i
      MAXMP_ADD = /<(?:MAXMP_ADD|maxmp add)[ ]*(d+)>/i
      MAXHP_SUB = /<(?:MAXHP_SUB|maxhp sub)[ ]*(d+)>/i
      MAXMP_SUB = /<(?:MAXMP_SUB|maxmp sub)[ ]*(d+)>/i
       
      # These adjust Attack, Defense, Spirit, and Agility.
      ATK_PER = /<(?:NEW_ATK_RATE|new atk rate|ATK_PER|atk per)[ ]*(d+)>/i
      DEF_PER = /<(?:NEW_DEF_RATE|new def rate|DEF_PER|def per)[ ]*(d+)>/i
      SPI_PER = /<(?:NEW_SPI_RATE|new spi rate|SPI_PER|spi per)[ ]*(d+)>/i
      AGI_PER = /<(?:NEW_AGI_RATE|new agi rate|AGI_PER|agi per)[ ]*(d+)>/i
      ATK_ADD = /<(?:ATK_ADD|atk add)[ ]*(d+)>/i
      DEF_ADD = /<(?:DEF_ADD|def add)[ ]*(d+)>/i
      SPI_ADD = /<(?:SPI_ADD|spi add)[ ]*(d+)>/i
      AGI_ADD = /<(?:AGI_ADD|agi add)[ ]*(d+)>/i
      ATK_SUB = /<(?:ATK_SUB|atk sub)[ ]*(d+)>/i
      DEF_SUB = /<(?:DEF_SUB|def sub)[ ]*(d+)>/i
      SPI_SUB = /<(?:SPI_SUB|spi sub)[ ]*(d+)>/i
      AGI_SUB = /<(?:AGI_SUB|agi sub)[ ]*(d+)>/i
       
      # These adjust Hit, Evasion, Critical, and Odds
      if $imported["LimitBreak"]
        HECOLIMIT = KGC::LimitBreak::ACTOR_PARAMETER_LIMIT
      else
        HECOLIMIT = 999
      end
      HIT_PER  = /<(?:HIT_PER|hit per)[ ]*(d+)>/i
      HIT_ADD  = /<(?:HIT_ADD|hit add)[ ]*(d+)>/i
      HIT_SUB  = /<(?:HIT_SUB|hit sub)[ ]*(d+)>/i
      EVA_PER  = /<(?:EVA_PER|eva per)[ ]*(d+)>/i
      EVA_ADD  = /<(?:EVA_ADD|eva add)[ ]*(d+)>/i
      EVA_SUB  = /<(?:EVA_SUB|eva sub)[ ]*(d+)>/i
      CRI_PER  = /<(?:CRI_PER|cri per)[ ]*(d+)>/i
      CRI_ADD  = /<(?:CRI_ADD|cri add)[ ]*(d+)>/i
      CRI_SUB  = /<(?:CRI_SUB|cri sub)[ ]*(d+)>/i
      ODDS_PER = /<(?:ODDS_PER|odds per)[ ]*(d+)>/i
      ODDS_ADD = /<(?:ODDS_ADD|odds add)[ ]*(d+)>/i
      ODDS_SUB = /<(?:ODDS_SUB|odds sub)[ ]*(d+)>/i
       
      # These adjust HP/MP Degen and Regen.
      HP_DEGEN_PER = /<(?:HP_DEGEN_PER|hp degen per)[ ]*(d+)>/i
      HP_DEGEN_SET = /<(?:HP_DEGEN_SET|hp degen set)[ ]*(d+)>/i
      HP_REGEN_PER = /<(?:HP_REGEN_PER|hp regen per)[ ]*(d+)>/i
      HP_REGEN_SET = /<(?:HP_REGEN_SET|hp regen set)[ ]*(d+)>/i
      MP_DEGEN_PER = /<(?:MP_DEGEN_PER|mp degen per)[ ]*(d+)>/i
      MP_DEGEN_SET = /<(?:MP_DEGEN_SET|mp degen set)[ ]*(d+)>/i
      MP_REGEN_PER = /<(?:MP_REGEN_PER|mp regen per)[ ]*(d+)>/i
      MP_REGEN_SET = /<(?:MP_REGEN_SET|mp regen set)[ ]*(d+)>/i
       
      # These are the unique effects.
      IMMORTALITY   = /<(?:IMMORTALITY|immortality)>/i
      VANISH        = /<(?:VANISH|vanish)>/i
      AUTO_BATTLE   = /<(?:AUTO_BATTLE|auto battle)>/i
      HALF_MP_COST  = /<(?:HALF_MP_COST|half mp cost)>/i
      SUPER_GUARD   = /<(?:SUPER_GUARD|super guard)>/i
      PHARMA        = /<(?:PHARMACOLOGY|pharmacology)>/i
      DOUBLE_EXP    = /<(?:DOUBLE_EXP_GAIN|double exp gain)>/i
      FAST_ATTACK   = /<(?:FAST_ATTACK|fast attack)>/i
      PREVENT_CRIT  = /<(?:PREVENT_CRITICAL|prevent critical)>/i
      ANTI_STATE    = /<(?:ANTI_STATE|anti state)>/i
      ABSORB_HP     = /<(?:ABSORB_HP|absorb hp)>/i
      ABSORB_MP     = /<(?:ABSORB_MP|absorb mp)>/i
      DEATH_HPDMG   = /<(?:DEATH_ON_HP_DMG|death on hp dmg)>/i
      DEATH_MPDMG   = /<(?:DEATH_ON_MP_DMG|death on mp dmg)>/i
      DEATH_HPHEAL  = /<(?:DEATH_ON_HP_HEAL|death on hp heal)>/i
      DEATH_MPHEAL  = /<(?:DEATH_ON_MP_HEAL|death on mp heal)>/i
       
      # This affects damage taken.
      HP_PAIN_RATE  = /<(?:HP_PAIN_RATE|hp pain rate[ ]*(d+))>/i
      HP_HEAL_RATE  = /<(?:HP_HEAL_RATE|hp heal rate[ ]*(d+))>/i
      MP_PAIN_RATE  = /<(?:MP_PAIN_RATE|mp pain rate[ ]*(d+))>/i
      MP_HEAL_RATE  = /<(?:MP_HEAL_RATE|mp heal rate[ ]*(d+))>/i
      UNDEAD_HP     = /<(?:UNDEAD_HP|undead hp[ ]*(d+))>/i
      UNDEAD_MP     = /<(?:UNDEAD_MP|undead mp[ ]*(d+))>/i
      SUPER_ARMOUR  = /<(?:SUPER_ARMOUR|super armour|super armor)>/i
      SUPER_BARRIER = /<(?:SUPER_BARRIER|super barrier)>/i
      INVINCIBLE_HP = /<(?:INVINCIBLE_HP|invincibility_hp)>/i
      INVINCIBLE_MP = /<(?:INVINCIBLE_MP|invincibility_mp)>/i
      HPDMG_MPDMG   = /<(?:HPDMG_TO_MPDMG|hpdmg to mpdmg[ ]*(d+))>/i
      MPDMG_HPDMG   = /<(?:MPDMG_TO_HPDMG|mpdmg to hpdmg[ ]*(d+))>/i
       
      # These here are the custom state effects.
      APPLY_EFFECT  = /<(?:APPLY_EFFECT|apply effect)[ ]*(d+)>/i
      WHILE_EFFECT  = /<(?:WHILE_EFFECT|while effect)[ ]*(d+)>/i
      LEAVE_EFFECT  = /<(?:LEAVE_EFFECT|leave effect)[ ]*(d+)>/i
      ERASE_EFFECT  = /<(?:ERASE_EFFECT|erase effect)[ ]*(d+)>/i
      REACT_EFFECT  = /<(?:REACT_EFFECT|react effect)[ ]*(d+)>/i
      SHOCK_EFFECT  = /<(?:SHOCK_EFFECT|shock effect)[ ]*(d+)>/i
      CLOSE_EFFECT  = /<(?:CLOSE_EFFECT|close effect)[ ]*(d+)>/i
      BEGIN_EFFECT  = /<(?:BEGIN_EFFECT|begin effect)[ ]*(d+)>/i
       
    end #module STATE
  end # module REGEXP
end # module YE

#===============================================================================
# RPG::State
#===============================================================================

class RPG::State
 
  #--------------------------------------------------------------------------
  # Yanfly_Cache_CSP
  #--------------------------------------------------------------------------
  def yanfly_cache_csp
    @maxhp_per = 100; @maxhp_set = 0; @maxmp_per = 100; @maxmp_set = 0
    @atk_per = 100; @def_per = 100; @spi_per = 100; @agi_per = 100
    @atk_set = 0; @def_set = 0; @spi_set = 0; @agi_set = 0
    @hit_per = 100; @hit_set = 0; @eva_per = 100; @eva_set = 0
    @cri_per = 100; @cri_set = 0; @odds_per = 100; @odds_set = 0
    @apply_effect = 0; @while_effect = 0; @leave_effect = 0; @erase_effect = 0
    @react_effect = 0; @half_mp_cost = false; @super_guard = false
    @hp_degen_per = 0; @hp_degen_set = 0; @hp_regen_per = 0; @hp_regen_set = 0
    @mp_degen_per = 0; @mp_degen_set = 0; @mp_regen_per = 0; @mp_regen_set = 0
    @immortality = false; @vanish = false; @auto_battle = false;
    @pharmacology = false; @double_exp_gain = false; @fast_attack = false
    @prevent_critical = false; @anti_state = false; @super_armour = false
    @absorb_hp = false; @absorb_mp = false; @super_barrier = false
    @invincible_hp = false; @invincible_mp = false; @hpdmg_mpdmg = 0;
    @mpdmg_hpdmg = 0; @undead_hp = 0; @undead_mp = 0; @death_hpdmg = false;
    @death_mpdmg = false; @death_hpheal = false; @death_mpheal = false;
    @hp_pain_rate = 0; @mp_pain_rate = 0; @hp_heal_rate = 0; @mp_heal_rate = 0
    @max_stack = 1; @shock_effect = 0; @close_effect = 0; @begin_effect = 0
   
    self.note.split(/[rn]+/).each { |line|
      case line
      when YE::REGEXP::STATE::MAX_STACK
        @max_stack = $1.to_i
      when YE::REGEXP::STATE::MAXHP_PER
        @maxhp_per = $1.to_i
      when YE::REGEXP::STATE::MAXHP_ADD
        @maxhp_set = $1.to_i
      when YE::REGEXP::STATE::MAXHP_SUB
        @maxhp_set = $1.to_i * -1
     
      when YE::REGEXP::STATE::MAXMP_PER
        @maxmp_per = $1.to_i
      when YE::REGEXP::STATE::MAXMP_ADD
        @maxmp_set = $1.to_i
      when YE::REGEXP::STATE::MAXMP_SUB
        @maxmp_set = $1.to_i * -1
     
      when YE::REGEXP::STATE::ATK_PER
        @atk_per = $1.to_i
      when YE::REGEXP::STATE::ATK_ADD
        @atk_set = $1.to_i
      when YE::REGEXP::STATE::ATK_SUB
        @atk_set = $1.to_i * -1
         
      when YE::REGEXP::STATE::DEF_PER
        @def_per = $1.to_i
      when YE::REGEXP::STATE::DEF_ADD
        @def_set = $1.to_i
      when YE::REGEXP::STATE::DEF_SUB
        @def_set = $1.to_i * -1
        
      when YE::REGEXP::STATE::SPI_PER
        @spi_per = $1.to_i
      when YE::REGEXP::STATE::SPI_ADD
        @spi_set = $1.to_i
      when YE::REGEXP::STATE::SPI_SUB
        @spi_set = $1.to_i
         
      when YE::REGEXP::STATE::AGI_PER
        @agi_per = $1.to_i
      when YE::REGEXP::STATE::AGI_ADD
        @agi_set = $1.to_i
      when YE::REGEXP::STATE::AGI_SUB
        @agi_set = $1.to_i * -1
         
      when YE::REGEXP::STATE::HIT_PER
        @hit_per = $1.to_i
      when YE::REGEXP::STATE::HIT_ADD
        @hit_set = $1.to_i
      when YE::REGEXP::STATE::HIT_SUB
        @hit_set = $1.to_i * -1
         
      when YE::REGEXP::STATE::EVA_PER
        @eva_per = $1.to_i
      when YE::REGEXP::STATE::EVA_ADD
        @eva_set = $1.to_i
      when YE::REGEXP::STATE::EVA_SUB
        @eva_set = $1.to_i * -1
         
      when YE::REGEXP::STATE::CRI_PER
        @cri_per = $1.to_i
      when YE::REGEXP::STATE::CRI_ADD
        @cri_set = $1.to_i
      when YE::REGEXP::STATE::CRI_SUB
        @cri_set = $1.to_i * -1
         
      when YE::REGEXP::STATE::ODDS_PER
        @odds_per = $1.to_i
      when YE::REGEXP::STATE::ODDS_ADD
        @odds_set = $1.to_i
      when YE::REGEXP::STATE::ODDS_SUB
        @odds_set = $1.to_i * -1
     
      when YE::REGEXP::STATE::APPLY_EFFECT
        @apply_effect = $1.to_i
      when YE::REGEXP::STATE::WHILE_EFFECT
        @while_effect = $1.to_i
      when YE::REGEXP::STATE::LEAVE_EFFECT
        @leave_effect = $1.to_i
      when YE::REGEXP::STATE::ERASE_EFFECT
        @erase_effect = $1.to_i
      when YE::REGEXP::STATE::REACT_EFFECT
        @react_effect = $1.to_i
      when YE::REGEXP::STATE::SHOCK_EFFECT
        @shock_effect = $1.to_i
      when YE::REGEXP::STATE::CLOSE_EFFECT
        @close_effect = $1.to_i
      when YE::REGEXP::STATE::BEGIN_EFFECT
        @begin_effect = $1.to_i
         
      when YE::REGEXP::STATE::HP_DEGEN_PER
        @hp_degen_per = $1.to_i
      when YE::REGEXP::STATE::HP_DEGEN_SET
        @hp_degen_set = $1.to_i
      when YE::REGEXP::STATE::HP_REGEN_PER
        @hp_regen_per = $1.to_i
      when YE::REGEXP::STATE::HP_REGEN_SET
        @hp_regen_set = $1.to_i
         
      when YE::REGEXP::STATE::MP_DEGEN_PER
        @mp_degen_per = $1.to_i
      when YE::REGEXP::STATE::MP_DEGEN_SET
        @mp_degen_set = $1.to_i
      when YE::REGEXP::STATE::MP_REGEN_PER
        @mp_regen_per = $1.to_i
      when YE::REGEXP::STATE::MP_REGEN_SET
        @mp_regen_set = $1.to_i
         
      when YE::REGEXP::STATE::IMMORTALITY
        @immortality = true
      when YE::REGEXP::STATE::VANISH
        @vanish = true
      when YE::REGEXP::STATE::AUTO_BATTLE
        @auto_battle = true
      when YE::REGEXP::STATE::HALF_MP_COST
        @half_mp_cost = true
      when YE::REGEXP::STATE::SUPER_GUARD
        @super_guard = true
      when YE::REGEXP::STATE::PHARMA
        @pharmacology = true
      when YE::REGEXP::STATE::DOUBLE_EXP
        @double_exp_gain = true
      when YE::REGEXP::STATE::FAST_ATTACK
        @fast_attack = true
      when YE::REGEXP::STATE::PREVENT_CRIT
        @prevent_critical = true
      when YE::REGEXP::STATE::ANTI_STATE
        @anti_state = true
      when YE::REGEXP::STATE::ABSORB_HP
        @absorb_hp = true
      when YE::REGEXP::STATE::ABSORB_MP
        @absorb_mp = true
         
      when YE::REGEXP::STATE::SUPER_ARMOUR
        @super_armour = true
      when YE::REGEXP::STATE::SUPER_BARRIER
        @super_barrier = true
      when YE::REGEXP::STATE::INVINCIBLE_HP
        @invincible_hp = true
      when YE::REGEXP::STATE::INVINCIBLE_MP
        @invincible_mp = true
      when YE::REGEXP::STATE::HPDMG_MPDMG
        @hpdmg_mpdmg = $1.to_i
        @hpdmg_mpdmg = 100 if @hpdmg_mpdmg > 100
      when YE::REGEXP::STATE::MPDMG_HPDMG
        @mpdmg_hpdmg = $1.to_i
        @mpdmg_hpdmg = 100 if @mpdmg_hpdmg > 100
      when YE::REGEXP::STATE::UNDEAD_HP
        @undead_hp = $1.to_i
      when YE::REGEXP::STATE::UNDEAD_MP
        @undead_mp = $1.to_i
         
      when YE::REGEXP::STATE::DEATH_HPDMG
        @death_hpdmg = true
      when YE::REGEXP::STATE::DEATH_MPDMG
        @death_mpdmg = true
      when YE::REGEXP::STATE::DEATH_HPHEAL
        @death_hpheal = true
      when YE::REGEXP::STATE::DEATH_MPHEAL
        @death_mpheal = true
         
      when YE::REGEXP::STATE::HP_PAIN_RATE
        @hp_pain_rate = $1.to_i
      when YE::REGEXP::STATE::MP_PAIN_RATE
        @mp_pain_rate = $1.to_i
      when YE::REGEXP::STATE::HP_HEAL_RATE
        @hp_heal_rate = $1.to_i
      when YE::REGEXP::STATE::MP_HEAL_RATE
        @mp_heal_rate = $1.to_i
     
      end
    }
  end # end yanfly_cache_csp
 
  #--------------------------------------------------------------------------
  # max stack
  #--------------------------------------------------------------------------
  def max_stack
    yanfly_cache_csp if @max_stack == nil
    return @max_stack
  end

  #--------------------------------------------------------------------------
  # maxhp mods
  #--------------------------------------------------------------------------
  def maxhp_per
    yanfly_cache_csp if @maxhp_per == nil
    return @maxhp_per
  end
 
  def maxhp_set
    yanfly_cache_csp if @maxhp_set == nil
    return @maxhp_set
  end
 
  #--------------------------------------------------------------------------
  # maxmp mods
  #--------------------------------------------------------------------------
  def maxmp_per
    yanfly_cache_csp if @maxmp_per == nil
    return @maxmp_per
  end
 
  def maxmp_set
    yanfly_cache_csp if @maxmp_set == nil
    return @maxmp_set
  end
 
  #--------------------------------------------------------------------------
  # New Stat Rates
  #--------------------------------------------------------------------------
  def atk_per
    yanfly_cache_csp if @atk_per == nil
    return @atk_per
  end
 
  def def_per
    yanfly_cache_csp if @def_per == nil
    return @def_per
  end
 
  def spi_per
    yanfly_cache_csp if @spi_per == nil
    return @spi_per
  end
 
  def agi_per
    yanfly_cache_csp if @agi_per == nil
    return @agi_per
  end
 
  def atk_set
    yanfly_cache_csp if @atk_set == nil
    return @atk_set
  end
 
  def def_set
    yanfly_cache_csp if @def_set == nil
    return @def_set
  end
 
  def spi_set
    yanfly_cache_csp if @spi_set == nil
    return @spi_set
  end
 
  def agi_set
    yanfly_cache_csp if @agi_set == nil
    return @agi_set
  end
 
  #--------------------------------------------------------------------------
  # Hit, Eva, Cri, Odds
  #--------------------------------------------------------------------------
  def hit_per
    yanfly_cache_csp if @hit_per == nil
    return @hit_per
  end
 
  def hit_set
    yanfly_cache_csp if @hit_set == nil
    return @hit_set
  end
 
  def eva_per
    yanfly_cache_csp if @eva_per == nil
    return @eva_per
  end
 
  def eva_set
    yanfly_cache_csp if @eva_set == nil
    return @eva_set
  end
 
  def cri_per
    yanfly_cache_csp if @cri_per == nil
    return @cri_per
  end
 
  def cri_set
    yanfly_cache_csp if @cri_set == nil
    return @cri_set
  end
 
  def odds_per
    yanfly_cache_csp if @odds_per == nil
    return @odds_per
  end
 
  def odds_set
    yanfly_cache_csp if @odds_set == nil
    return @odds_set
  end
 
  #--------------------------------------------------------------------------
  # Custom Apply Effect
  #--------------------------------------------------------------------------
  def apply_effect
    yanfly_cache_csp if @apply_effect == nil
    return @apply_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom While Effect
  #--------------------------------------------------------------------------
  def while_effect
    yanfly_cache_csp if @while_effect == nil
    return @while_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom Leave Effect
  #--------------------------------------------------------------------------
  def leave_effect
    yanfly_cache_csp if @leave_effect == nil
    return @leave_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom Erase Effect
  #--------------------------------------------------------------------------
  def erase_effect
    yanfly_cache_csp if @erase_effect == nil
    return @erase_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom React Effect
  #--------------------------------------------------------------------------
  def react_effect
    yanfly_cache_csp if @react_effect == nil
    return @react_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom Shock Effect
  #--------------------------------------------------------------------------
  def shock_effect
    yanfly_cache_csp if @shock_effect == nil
    return @shock_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom Close Effect
  #--------------------------------------------------------------------------
  def close_effect
    yanfly_cache_csp if @close_effect == nil
    return @close_effect
  end
 
  #--------------------------------------------------------------------------
  # Custom Begin Effect
  #--------------------------------------------------------------------------
  def begin_effect
    yanfly_cache_csp if @begin_effect == nil
    return @begin_effect
  end
 
  #--------------------------------------------------------------------------
  # HP Degen/Regen
  #--------------------------------------------------------------------------
  def hp_degen_per
    yanfly_cache_csp if @hp_degen_per == nil
    return @hp_degen_per
  end
 
  def hp_degen_set
    yanfly_cache_csp if @hp_degen_set == nil
    return @hp_degen_set
  end
 
  def hp_regen_per
    yanfly_cache_csp if @hp_regen_per == nil
    return @hp_regen_per
  end
 
  def hp_regen_set
    yanfly_cache_csp if @hp_regen_set == nil
    return @hp_regen_set
  end
 
  def dr_hp?
    return true if hp_degen_per > 0
    return true if hp_regen_per > 0
    return true if hp_degen_set > 0
    return true if hp_regen_set > 0
  end
 
  #--------------------------------------------------------------------------
  # MP Degen/Regen
  #--------------------------------------------------------------------------
  def mp_degen_per
    yanfly_cache_csp if @mp_degen_per == nil
    return @mp_degen_per
  end
 
  def mp_degen_set
    yanfly_cache_csp if @mp_degen_set == nil
    return @mp_degen_set
  end
 
  def mp_regen_per
    yanfly_cache_csp if @mp_regen_per == nil
    return @mp_regen_per
  end
 
  def mp_regen_set
    yanfly_cache_csp if @mp_regen_set == nil
    return @mp_regen_set
  end
 
  def dr_mp?
    return true if mp_degen_per > 0
    return true if mp_regen_per > 0
    return true if mp_degen_set > 0
    return true if mp_regen_set > 0
  end
 
  #--------------------------------------------------------------------------
  # Immortality
  #--------------------------------------------------------------------------
  def immortality
    yanfly_cache_csp if @immortality == nil
    return @immortality
  end
 
  #--------------------------------------------------------------------------
  # Vanish
  #--------------------------------------------------------------------------
  def vanish
    yanfly_cache_csp if @vanish == nil
    return @vanish
  end
 
  #--------------------------------------------------------------------------
  # Auto Battle
  #--------------------------------------------------------------------------
  def auto_battle
    yanfly_cache_csp if @auto_battle == nil
    return @auto_battle
  end
 
  #--------------------------------------------------------------------------
  # Half MP Cost
  #--------------------------------------------------------------------------
  def half_mp_cost
    yanfly_cache_csp if @half_mp_cost == nil
    return @half_mp_cost
  end
 
  #--------------------------------------------------------------------------
  # Super Guard
  #--------------------------------------------------------------------------
  def super_guard
    yanfly_cache_csp if @super_guard == nil
    return @super_guard
  end
 
  #--------------------------------------------------------------------------
  # Pharmacology
  #--------------------------------------------------------------------------
  def pharmacology
    yanfly_cache_csp if @pharmacology == nil
    return @pharmacology
  end
 
  #--------------------------------------------------------------------------
  # Double EXP Gain
  #--------------------------------------------------------------------------
  def double_exp_gain
    yanfly_cache_csp if @double_exp_gain == nil
    return @double_exp_gain
  end
 
  #--------------------------------------------------------------------------
  # Fast Attack
  #--------------------------------------------------------------------------
  def fast_attack
    yanfly_cache_csp if @fast_attack == nil
    return @fast_attack
  end
 
  #--------------------------------------------------------------------------
  # Prevent Critical
  #--------------------------------------------------------------------------
  def prevent_critical
    yanfly_cache_csp if @prevent_critical == nil
    return @prevent_critical
  end
 
  #--------------------------------------------------------------------------
  # Anti State
  #--------------------------------------------------------------------------
  def anti_state
    yanfly_cache_csp if @anti_state == nil
    return @anti_state
  end
 
  #--------------------------------------------------------------------------
  # Absorb HP/MP
  #--------------------------------------------------------------------------
  def absorb_hp
    yanfly_cache_csp if @absorb_hp == nil
    return @absorb_hp
  end
 
  def absorb_mp
    yanfly_cache_csp if @absorb_mp == nil
    return @absorb_mp
  end
 
  #--------------------------------------------------------------------------
  # super_armour
  #--------------------------------------------------------------------------
  def super_armour
    yanfly_cache_csp if @super_armour == nil
    return @super_armour
  end
 
  #--------------------------------------------------------------------------
  # super_barrier
  #--------------------------------------------------------------------------
  def super_barrier
    yanfly_cache_csp if @super_barrier == nil
    return @super_barrier
  end
 
  #--------------------------------------------------------------------------
  # invincible_hp
  #--------------------------------------------------------------------------
  def invincible_hp
    yanfly_cache_csp if @invincible_hp == nil
    return @invincible_hp
  end
 
  #--------------------------------------------------------------------------
  # invincible_mp
  #--------------------------------------------------------------------------
  def invincible_mp
    yanfly_cache_csp if @invincible_mp == nil
    return @invincible_mp
  end
 
  #--------------------------------------------------------------------------
  # HP Damage to MP Damage
  #--------------------------------------------------------------------------
  def hpdmg_mpdmg
    yanfly_cache_csp if @hpdmg_mpdmg == nil
    return @hpdmg_mpdmg
  end
 
  #--------------------------------------------------------------------------
  # MP Damage to HP Damage
  #--------------------------------------------------------------------------
  def mpdmg_hpdmg
    yanfly_cache_csp if @mpdmg_hpdmg == nil
    return @mpdmg_hpdmg
  end
 
  #--------------------------------------------------------------------------
  # Undead HP/MP
  #--------------------------------------------------------------------------
  def undead_hp
    yanfly_cache_csp if @undead_hp == nil
    return @undead_hp
  end
 
  def undead_mp
    yanfly_cache_csp if @undead_mp == nil
    return @undead_mp
  end
 
  #--------------------------------------------------------------------------
  # death on hp/mp damage/heal
  #--------------------------------------------------------------------------
  def death_hpdmg
    yanfly_cache_csp if @death_hpdmg == nil
    return @death_hpdmg
  end
 
  def death_mpdmg
    yanfly_cache_csp if @death_mpdmg == nil
    return @death_mpdmg
  end
 
  def death_hpheal
    yanfly_cache_csp if @death_hpheal == nil
    return @death_hpheal
  end
 
  def death_mpheal
    yanfly_cache_csp if @death_mpheal == nil
    return @death_mpheal
  end
 
  #--------------------------------------------------------------------------
  # HP/MP Pain/Heal Rate
  #--------------------------------------------------------------------------
  def hp_pain_rate
    yanfly_cache_csp if @hp_pain_rate == nil
    return @hp_pain_rate
  end
 
  def mp_pain_rate
    yanfly_cache_csp if @mp_pain_rate == nil
    return @mp_pain_rate
  end
 
  def hp_heal_rate
    yanfly_cache_csp if @hp_heal_rate == nil
    return @hp_heal_rate
  end
 
  def mp_heal_rate
    yanfly_cache_csp if @mp_heal_rate == nil
    return @mp_heal_rate
  end
 
end #end RPG::State

#===============================================================================
# Game_Actor
#===============================================================================

class Game_Actor < Game_Battler
 
  #--------------------------------------------------------------------------
  # alias auto_battle
  #--------------------------------------------------------------------------
  alias auto_battle_csp auto_battle unless $@
  def auto_battle
    for state in states
      return true if state.auto_battle
    end
    return auto_battle_csp
  end
 
  #--------------------------------------------------------------------------
  # alias half_mp_cost
  #--------------------------------------------------------------------------
  alias half_mp_cost_csp half_mp_cost unless $@
  def half_mp_cost
    for state in states
      return true if state.half_mp_cost
    end
    return half_mp_cost_csp
  end
 
  #--------------------------------------------------------------------------
  # alias super_guard
  #--------------------------------------------------------------------------
  alias super_guard_csp super_guard unless $@
  def super_guard
    for state in states
      return true if state.super_guard
    end
    return super_guard_csp
  end
 
  #--------------------------------------------------------------------------
  # alias pharmacology
  #--------------------------------------------------------------------------
  alias pharmacology_csp pharmacology unless $@
  def pharmacology
    for state in states
      return true if state.pharmacology
    end
    return pharmacology_csp
  end
 
  #--------------------------------------------------------------------------
  # alias double_exp_gain
  #--------------------------------------------------------------------------
  alias double_exp_gain_csp double_exp_gain unless $@
  def double_exp_gain
    for state in states
      return true if state.double_exp_gain
    end
    return double_exp_gain_csp
  end
 
  #--------------------------------------------------------------------------
  # alias fast_attack
  #--------------------------------------------------------------------------
  alias fast_attack_csp fast_attack unless $@
  def fast_attack
    for state in states
      return true if state.fast_attack
    end
    return fast_attack_csp
  end
 
  #--------------------------------------------------------------------------
  # alias prevent_critical
  #--------------------------------------------------------------------------
  alias prevent_critical_csp prevent_critical unless $@
  def prevent_critical
    for state in states
      return true if state.prevent_critical
    end
    return prevent_critical_csp
  end
 
  #--------------------------------------------------------------------------
  # Added State Success Rate
  #--------------------------------------------------------------------------
  def state_probability(state_id)
    if $data_states[state_id].nonresistance
      return 100
    else
      a = YE::BATTLE::STATE_A
      b = YE::BATTLE::STATE_B
      c = YE::BATTLE::STATE_C
      d = YE::BATTLE::STATE_D
      e = YE::BATTLE::STATE_E
      f = YE::BATTLE::STATE_F
      rank = self.class.state_ranks[state_id]
      return [0,a,b,c,d,e,f][rank]
    end
  end
 
  #--------------------------------------------------------------------------
  # alias hit/eva/cri/odds for actors
  #--------------------------------------------------------------------------
  alias hit_actor_csp hit unless $@
  def hit
    n = hit_actor_csp
    states.each { |state|
      id = state.id
      n *= (state.hit_per + ((state.hit_per - 100) * state_stack(id))) / 100.0
      n += state.hit_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 0].max, limit].min
    return n
  end
 
  alias eva_actor_csp eva unless $@
  def eva
    n = eva_actor_csp
    states.each { |state|
      id = state.id
      n *= (state.eva_per + ((state.eva_per - 100) * state_stack(id))) / 100.0
      n += state.eva_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 0].max, limit].min
    return n
  end
 
  alias cri_actor_csp cri unless $@
  def cri
    n = cri_actor_csp
    states.each { |state|
      id = state.id
      n *= (state.cri_per + ((state.cri_per - 100) * state_stack(id))) / 100.0
      n += state.cri_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 0].max, limit].min
    return n
  end
 
  alias odds_actor_csp odds unless $@
  def odds
    n = odds_actor_csp
    states.each { |state|
      id = state.id
      n *= (state.odds_per + ((state.odds_per - 100) * state_stack(id))) / 100.0
      n += state.odds_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
end #Game_Actor

#==============================================================================
# Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
 
  #--------------------------------------------------------------------------
  # alias hit/eva/cri/odds for enemies
  #--------------------------------------------------------------------------
  alias hit_enemy_csp hit unless $@
  def hit
    n = hit_enemy_csp
    states.each { |state|
      id = state.id
      n *= (state.hit_per + ((state.hit_per - 100) * state_stack(id))) / 100.0
      n += state.hit_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  alias eva_enemy_csp eva unless $@
  def eva
    n = eva_enemy_csp
    states.each { |state|
      id = state.id
      n *= (state.eva_per + ((state.eva_per - 100) * state_stack(id))) / 100.0
      n += state.eva_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  alias cri_enemy_csp cri unless $@
  def cri
    n = cri_enemy_csp
    states.each { |state|
      id = state.id
      n *= (state.cri_per + ((state.cri_per - 100) * state_stack(id))) / 100.0
      n += state.cri_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  alias odds_enemy_csp odds unless $@
  def odds
    n = odds_enemy_csp
    states.each { |state|
      id = state.id
      n *= (state.odds_per + ((state.odds_per - 100) * state_stack(id))) / 100.0
      n += state.odds_set * (state_stack(id) + 1)
    }
    limit = YE::REGEXP::STATE::HECOLIMIT
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  #--------------------------------------------------------------------------
  # Overwrite State Probability
  #--------------------------------------------------------------------------
  def state_probability(state_id)
    if $data_states[state_id].nonresistance
      return 100
    else
      a = YE::BATTLE::STATE_A
      b = YE::BATTLE::STATE_B
      c = YE::BATTLE::STATE_C
      d = YE::BATTLE::STATE_D
      e = YE::BATTLE::STATE_E
      f = YE::BATTLE::STATE_F
      rank = enemy.state_ranks[state_id]
      return [0,a,b,c,d,e,f][rank]
    end
  end
 
end # game_enemy

#===============================================================================
# Game_Battler
#===============================================================================

class Game_Battler
 
  #--------------------------------------------------------------------------
  # Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :state_stack        # This affects state stacking.
 
  #--------------------------------------------------------------------------
  # state stack
  #--------------------------------------------------------------------------
  def state_stack(state_id)
    @state_stack = {} if @state_stack == nil
    @state_stack[state_id] = 0 if @state_stack[state_id] == nil
    if @state_stack[state_id] > $data_states[state_id].max_stack - 1
      @state_stack[state_id] = $data_states[state_id].max_stack - 1
    end
    @state_stack[state_id] = 0 if @state_stack[state_id] < 0
    return @state_stack[state_id]
  end
 
  #--------------------------------------------------------------------------
  # state stack up
  #--------------------------------------------------------------------------
  def state_stack_up(state_id, up = 1)
    return unless self.state?(state_id)
    @state_stack = {} if @state_stack == nil
    @state_stack[state_id] = 0 if @state_stack[state_id] == nil
    @state_stack[state_id] += up
  end
 
  #--------------------------------------------------------------------------
  # reset state stack
  #--------------------------------------------------------------------------
  def reset_state_stack(state_id)
    @state_stack = {} if @state_stack == nil
    @state_stack[state_id] = 0
  end

  #--------------------------------------------------------------------------
  # alias maxhp
  #--------------------------------------------------------------------------
  alias maxhp_csp maxhp unless $@
  def maxhp
    n = maxhp_csp
    states.each { |state|
      id = state.id
      n *= (state.maxhp_per + ((state.maxhp_per - 100) * state_stack(id))) / 100.0
      n += state.maxhp_set * (state_stack(id) + 1)
    }
    n = [[Integer(n), 1].max, maxhp_limit].min
    @hp = n if @hp > n
    return n
  end
 
  #--------------------------------------------------------------------------
  # alias maxmp
  #--------------------------------------------------------------------------
  alias maxmp_csp maxmp unless $@
  def maxmp
    n = maxmp_csp
    states.each { |state|
      id = state.id
      n *= (state.maxmp_per + ((state.maxmp_per - 100) * state_stack(id))) / 100.0
      n += state.maxmp_set * (state_stack(id) + 1)
    }
    limit = (defined?(maxmp_limit) ? maxmp_limit : 9999)
    n = [[Integer(n), 0].max, limit].min
    @mp = n if @mp > n
    return n
  end
 
  #--------------------------------------------------------------------------
  # alias attack
  #--------------------------------------------------------------------------
  alias atk_csp atk unless $@
  def atk
    n = atk_csp
    states.each { |state|
      id = state.id
      n /= state.atk_rate / 100.00
      n *= (state.atk_rate + ((state.atk_rate - 100) * state_stack(id))) / 100.0
      n *= (state.atk_per + ((state.atk_per - 100) * state_stack(id))) / 100.0
      n += state.atk_set * (state_stack(id) + 1)
    }
    limit = (defined?(parameter_limit) ? parameter_limit : 999)
    n = [[Integer(n), 1].max, limit].min
    return n
  end

  #--------------------------------------------------------------------------
  # alias defense
  #--------------------------------------------------------------------------
  alias def_csp def
  def def
    n = def_csp
    states.each { |state|
      id = state.id
      n /= state.def_rate / 100.00
      n *= (state.def_rate + ((state.def_rate - 100) * state_stack(id))) / 100.0
      n *= (state.def_per + ((state.def_per - 100) * state_stack(id))) / 100.0
      n += state.def_set * (state_stack(id) + 1)
    }
    limit = (defined?(parameter_limit) ? parameter_limit : 999)
    n = [[Integer(n), 1].max, limit].min
    return n
  end

  #--------------------------------------------------------------------------
  # alias spirit
  #--------------------------------------------------------------------------
  alias spi_csp spi unless $@
  def spi
    n = spi_csp
    states.each { |state|
      id = state.id
      n /= state.spi_rate / 100.00
      n *= (state.spi_rate + ((state.spi_rate - 100) * state_stack(id))) / 100.0
      n *= (state.spi_per + ((state.spi_per - 100) * state_stack(id))) / 100.0
      n += state.spi_set * (state_stack(id) + 1)
    }
    limit = (defined?(parameter_limit) ? parameter_limit : 999)
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  #--------------------------------------------------------------------------
  # alias agility
  #--------------------------------------------------------------------------
  alias agi_csp agi unless $@
  def agi
    n = agi_csp
    states.each { |state|
      id = state.id
      n /= state.agi_rate / 100.00
      n *= (state.agi_rate + ((state.agi_rate - 100) * state_stack(id))) / 100.0
      n *= (state.agi_per + ((state.agi_per - 100) * state_stack(id))) / 100.0
      n += state.agi_set * (state_stack(id) + 1)
    }
    limit = (defined?(parameter_limit) ? parameter_limit : 999)
    n = [[Integer(n), 1].max, limit].min
    return n
  end
 
  #--------------------------------------------------------------------------
  # absorb hp/mp
  #--------------------------------------------------------------------------
  def absorb_hp
    for state in states
      if state.absorb_hp
        return true
      end
    end
    return false
  end
 
  def absorb_mp
    for state in states
      if state.absorb_mp
        return true
      end
    end
    return false
  end
 
  #--------------------------------------------------------------------------
  # death on hp/mp damage/heal
  #--------------------------------------------------------------------------
  def death_hpdmg
    for state in states
      if state.death_hpdmg
        return true
      end
    end
    return false
  end
 
  def death_mpdmg
    for state in states
      if state.death_mpdmg
        return true
      end
    end
    return false
  end
 
  def death_hpheal
    for state in states
      if state.death_hpheal
        return true
      end
    end
    return false
  end
 
  def death_mpheal
    for state in states
      if state.death_mpheal
        return true
      end
    end
    return false
  end

  #--------------------------------------------------------------------------
  # alias super_guard
  #--------------------------------------------------------------------------
  alias super_guard_battler_csp super_guard unless $@
  def super_guard
    for state in states
      return true if state.super_guard
    end
    return super_guard_battler_csp
  end
 
  #--------------------------------------------------------------------------
  # alias half_mp_cost
  #--------------------------------------------------------------------------
  alias half_mp_cost_battler_csp half_mp_cost unless $@
  def half_mp_cost
    for state in states
      return true if state.half_mp_cost
    end
    return half_mp_cost_battler_csp
  end
 
  #--------------------------------------------------------------------------
  # alias fast_attack
  #--------------------------------------------------------------------------
  alias fast_attack_battler_csp fast_attack unless $@
  def fast_attack
    for state in states
      return true if state.fast_attack
    end
    return fast_attack_battler_csp
  end
 
  #--------------------------------------------------------------------------
  # alias prevent_critical
  #--------------------------------------------------------------------------
  alias prevent_critical_battler_csp prevent_critical unless $@
  def prevent_critical
    for state in states
      return true if state.prevent_critical
    end
    return prevent_critical_battler_csp
  end
 
  #--------------------------------------------------------------------------
  # anti_state
  #--------------------------------------------------------------------------
  def anti_state
    for state in states
      return true if state.anti_state
    end
    return false
  end
 
  #--------------------------------------------------------------------------
  # overwrite apply_state_changes
  #--------------------------------------------------------------------------
  def apply_state_changes(obj)
    plus = obj.plus_state_set
    minus = obj.minus_state_set
    for i in plus
      next if state_resist?(i)
      next if dead?
      next if i == 1 and @immortal
      if state?(i)
        @remained_states.push(i)
        state_stack_up(i) if rand(100) < state_probability(i)
        next
      end
      if rand(100) < state_probability(i)
        add_state(i)
        @added_states.push(i)
      end
    end
    for i in minus
      next unless state?(i)
      remove_state(i)
      @removed_states.push(i)
    end
    for i in @added_states & @removed_states
      @added_states.delete(i)
      @removed_states.delete(i)
    end
  end
 
  #--------------------------------------------------------------------------
  # alias add state
  #--------------------------------------------------------------------------
  alias add_state_csp add_state unless $@
  def add_state(state_id)
    state = $data_states[state_id]
    return if state == nil
    return if state_ignore?(state_id)
    return if self.anti_state
    state_stack_up(state_id) if state?(state_id)
    #---
    add_state_csp(state_id)
    #---
    state = $data_states[state_id]
    unless @hidden
      run_apply_effect(state) if state.apply_effect > 0
    end
    apply_hidden(state) if state.vanish
    @immortal = true if state.immortality
  end

  #--------------------------------------------------------------------------
  # apply_hidden
  #--------------------------------------------------------------------------
  def apply_hidden(hidden_state)
    @hidden = true
    for state in states
      if state != hidden_state
        if state_turns?(state.id) != nil and state_turns?(state.id) > 0
          remove_state(state.id)
        end
      end
    end
    @hidden = true
  end

  #--------------------------------------------------------------------------
  # alias remove state
  #--------------------------------------------------------------------------
  alias remove_state_csp remove_state unless $@
  def remove_state(state_id)
    reset_state_stack(state_id)
    remove_state_csp(state_id)
    state = $data_states[state_id]
    #---
    unless @hidden
      run_erase_effect(state) if state.erase_effect > 0
    end
    #---
    if state.immortality
      remove_immortal = false
      for state in states
        remove_immortal = true if state.immortality
        break if state.immortality
      end
      @immortal = remove_immortal
    end
    #---
    if state.vanish
      @hidden = false
    end
    #---
  end
 
  #--------------------------------------------------------------------------
  # alias remove states auto
  #--------------------------------------------------------------------------
  alias remove_states_auto_csp remove_states_auto unless $@
  def remove_states_auto
    clear_action_results
    for state in states
      unless @hidden
        run_while_effect(state) if state.while_effect > 0
      end
    end
    for i in @state_turns.keys.clone
      if @state_turns[i] == 0
        unless @hidden
          run_leave_effect($data_states[i]) if $data_states[i].leave_effect > 0
        end
      end
    end
    remove_states_auto_csp
  end
 
  #--------------------------------------------------------------------------
  # alias slip damage effect
  #--------------------------------------------------------------------------
  alias slip_damage_effect_csp slip_damage_effect unless $@
  def slip_damage_effect
    for state in states
      unless @hidden or dead?
        degen_regen(state) if state.dr_hp? or state.dr_mp?
      end
    end
    slip_damage_effect_csp
    for state in states
      run_close_effect(state) if state.close_effect > 0
    end
  end
 
  #--------------------------------------------------------------------------
  # alias execute damage
  #--------------------------------------------------------------------------
  alias execute_damage_csp execute_damage unless $@
  def execute_damage(user, anti_react = false)
    if @hidden
      @hp_damage = 0
      @mp_damage = 0
    end
    @undead = false
    react_states = []
    hp_rate_states = []
    hp_dmg_states = []
    hp_con_states = []
    mp_rate_states = []
    mp_dmg_states = []
    mp_con_states = []
    for state in states # push into categories to reduce unnecessary checks
      react_states.push(state) if state.react_effect > 0
      hp_rate_states.push(state) if state.hp_pain_rate > 0
      hp_rate_states.push(state) if state.hp_heal_rate > 0
      hp_dmg_states.push(state) if state.super_armour
      hp_dmg_states.push(state) if state.invincible_hp
      hp_con_states.push(state) if state.hpdmg_mpdmg > 0
      hp_con_states.push(state) if state.undead_hp > 0
      mp_rate_states.push(state) if state.mp_pain_rate > 0
      mp_rate_states.push(state) if state.mp_heal_rate > 0
      mp_dmg_states.push(state) if state.super_barrier
      mp_dmg_states.push(state) if state.invincible_mp
      mp_con_states.push(state) if state.mpdmg_hpdmg > 0
      mp_con_states.push(state) if state.undead_mp > 0
    end
    for state in react_states # first go for react effects
      unless @hidden
        run_react_effect(state) if state.react_effect > 0 and not anti_react
      end
    end
    for state in hp_rate_states # go for HP rate adjustment
      hp_rate_effect(1, state) if state.hp_pain_rate > 0
      hp_rate_effect(2, state) if state.hp_heal_rate > 0
    end
    for state in hp_dmg_states # go for HP effects
      super_armour_effect if state.super_armour
      @hp_damage = 0 if state.invincible_hp and @hp_damage > 0
    end
    for state in hp_con_states # go for HP<->MP effects
      run_hpdmg_mpdmg(state.hpdmg_mpdmg) if @hp_damage > 0
      undead_effect_hp(state.undead_hp) if state.undead_hp > 0
    end
    for state in mp_rate_states # go for MP rate adjustment
      mp_rate_effect(1, state) if state.mp_pain_rate > 0
      mp_rate_effect(2, state) if state.mp_heal_rate > 0
    end
    for state in mp_dmg_states # go for MP effects
      super_barrier_effect if state.super_barrier
      @mp_damage = 0 if state.invincible_mp and @mp_damage > 0
    end
    for state in mp_con_states # go for MP<->HP effects
      run_mpdmg_hpdmg(state.mpdmg_hpdmg) if @mp_damage > 0
      undead_effect_mp(state.undead_hp) if state.undead_mp > 0
    end
    @absorbed = true if user.absorb_hp and @hp_damage > 0
    @absorbed = true if user.absorb_mp and @mp_damage > 0
    @absorbed = false if @undead
    #--------------
    execute_damage_csp(user)
    #--------------
    self.hp = 0 if @hp_damage > 0 and self.death_hpdmg
    self.hp = 0 if @mp_damage > 0 and self.death_mpdmg
    self.hp = 0 if @hp_damage < 0 and self.death_hpheal
    self.hp = 0 if @mp_damage < 0 and self.death_mpheal
  end
 
  #--------------------------------------------------------------------------
  # HP/MP Rate Effect
  #--------------------------------------------------------------------------
  def hp_rate_effect(rate_case, state)
    if rate_case == 1
      rate = state.hp_pain_rate
      if @hp_damage > 0
        @hp_damage *= (rate + ((rate - 100) * state_stack(id)))
        @hp_damage /= 100
      end
    else
      rate = state.hp_heal_rate
      if @hp_damage < 0
        @hp_damage *= (rate + ((rate - 100) * state_stack(id)))
        @hp_damage /= 100
      end
    end
  end
 
  def mp_rate_effect(rate_case, state)
    if rate_case == 1
      rate = state.mp_pain_rate
      if @mp_damage > 0
        @mp_damage *= (rate + ((rate - 100) * state_stack(id)))
        @mp_damage /= 100
      end
    else
      rate = state.mp_heal_rate
      if @mp_damage < 0
        @mp_damage *= (rate + ((rate - 100) * state_stack(id)))
        @mp_damage /= 100
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # Undead HP/MP effects
  #--------------------------------------------------------------------------
  def undead_effect_hp(rate)
    if @hp_damage < 0
      @hp_damage *= -1
      @hp_damage *= rate
      @hp_damage /= 100
    end
    @undead = true
  end
  def undead_effect_mp(rate)
    if @mp_damage < 0
      @mp_damage *= -1
      @mp_damage *= rate
      @mp_damage /= 100
    end
    @undead = true
  end
 
  #--------------------------------------------------------------------------
  # HP Damage to MP Damage
  #--------------------------------------------------------------------------
  def run_hpdmg_mpdmg(percent)
    hpdmg = @hp_damage * (100 - percent) / 100
    mpdmg = @mp_damage + @hp_damage - hpdmg
    if mpdmg > self.mp
      extra = mpdmg - self.mp
      mpdmg = self.mp
      hpdmg += extra
    end
    @hp_damage = hpdmg
    @mp_damage = mpdmg
  end
 
  #--------------------------------------------------------------------------
  # MP Damage to HP Damage
  #--------------------------------------------------------------------------
  def run_mpdmg_hpdmg(percent)
    mpdmg = @mp_damage * (100 - percent) / 100
    hpdmg = @hp_damage + @mp_damage - mpdmg
    if hpdmg > (self.hp + 1)
      extra = hpdmg - self.hp - 1
      hpdmg = self.hp - 1
      mpdmg += extra
    end
    @hp_damage = hpdmg
    @mp_damage = mpdmg
  end
 
  #--------------------------------------------------------------------------
  # Super Armour Effect
  #--------------------------------------------------------------------------
  def super_armour_effect
    if @hp_damage > 0
      @hp_damage *= YE::BATTLE::SUPER_ARMOUR_PER
      @hp_damage /= 100
      @hp_damage -= YE::BATTLE::SUPER_ARMOUR_SUB
      min_dmg = YE::BATTLE::SUPER_ARMOUR_MIN
      @hp_damage = min_dmg if @hp_damage < min_dmg
      @hp_damage = 1
    end
  end
 
  #--------------------------------------------------------------------------
  # Super Barrier Effect
  #--------------------------------------------------------------------------
  def super_barrier_effect
    if @mp_damage > 0
      @mp_damage *= YE::BATTLE::SUPER_BARRIER_PER
      @mp_damage /= 100
      @mp_damage -= YE::BATTLE::SUPER_BARRIER_SUB
      min_dmg = YE::BATTLE::SUPER_BARRIER_MIN
      @mp_damage = min_dmg if @mp_damage < min_dmg
      @mp_damage = 1
    end
  end
 
  #--------------------------------------------------------------------------
  # HP/MP Degen/Regen
  #--------------------------------------------------------------------------
  def degen_regen(state)
    id = state.id
    if state.dr_hp? and not @hidden
      dr_hp = 0
      if state.hp_degen_per > 0
        dr_hp += self.maxhp * (state.hp_degen_per * (state_stack(id) + 1)) / 100
      end
      if state.hp_regen_per > 0
        dr_hp -= self.maxhp * (state.hp_regen_per * (state_stack(id) + 1)) / 100
      end
      if state.hp_degen_set > 0
        dr_hp += state.hp_degen_set * (state_stack(id) + 1)
      end
      if state.hp_regen_set > 0
        dr_hp -= state.hp_regen_set * (state_stack(id) + 1)
      end
      dr_hp = self.hp - 1 if dr_hp > self.hp
      self.hp -= dr_hp
    end
    if state.dr_mp? and not @hidden
      dr_mp = 0
      if state.mp_degen_per > 0
        dr_mp += self.maxmp * (state.mp_degen_per * (state_stack(id) + 1)) / 100
      end
      if state.mp_regen_per > 0
        dr_mp -= self.maxmp * (state.mp_regen_per * (state_stack(id) + 1)) / 100
      end
      if state.mp_degen_set > 0
        dr_mp += state.mp_degen_set * (state_stack(id) + 1)
      end
      if state.mp_regen_set > 0
        dr_mp -= state.mp_regen_set * (state_stack(id) + 1)
      end
      self.mp -= dr_mp
    end
  end
 
  #--------------------------------------------------------------------------
  # hp_damage=, mp_damage=, set_absorb_true
  #--------------------------------------------------------------------------
  def hp_damage=(value)
    @hp_damage = value
  end
 
  def mp_damage=(value)
    @mp_damage = value
  end
 
  def set_absorb_true
    @absorbed = true
  end

  #--------------------------------------------------------------------------
  # status_damage
  #--------------------------------------------------------------------------
  def status_damage(hp_dmg, mp_dmg, target, attacker, anti_react = true,
    absorb = false)
    target.hp_damage = hp_dmg
    target.mp_damage = mp_dmg
    target.set_absorb_true if absorb
    target.execute_damage(attacker, anti_react)
    $scene.display_damage(target)
    $scene.display_added_states(target)
  end
 
  #--------------------------------------------------------------------------
  # msgwait
  #--------------------------------------------------------------------------
  def msgwait(value = 0)
    if value > 0
      $scene.wait(value)
    elsif $imported["CustomSkillEffects"]
      $scene.wait(YE::BATTLE::MSGWAIT)
    else
      $scene.wait(30)
    end
  end
 
  #--------------------------------------------------------------------------
  # state_turns
  #--------------------------------------------------------------------------
  def set_state_turns(state_id, new_turns)
    new_turns = 1 if new turns <= 0
    @state_turns[state_id] = new_turns
  end
 
  def state_turns?(state_id)
    return @state_turns[state_id]
  end
 
end

#===============================================================================
# Scene_Battle
#===============================================================================

class Scene_Battle < Scene_Base
 
  #--------------------------------------------------------------------------
  # alias start
  #--------------------------------------------------------------------------
  alias start_csp start unless $@
  def start
    start_csp
    $message__window = @message_window
  end
 
  #--------------------------------------------------------------------------
  # return active battler
  #--------------------------------------------------------------------------
  def active_battler
    return @active_battler
  end
 
  #--------------------------------------------------------------------------
  # alias start main
  #--------------------------------------------------------------------------
  alias start_main_csp start_main unless $@
  def start_main
    start_main_csp
    for member in $game_party.existing_members
      for state in member.states
        member.run_begin_effect(state) if state.begin_effect > 0
      end
    end
    for member in $game_troop.members
      for state in member.states
        member.run_begin_effect(state) if state.begin_effect > 0
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # alias display_damage
  #--------------------------------------------------------------------------
  alias display_damage_csp display_damage unless $@
  def display_damage(target, obj = nil)
    display_damage_csp(target, obj)
    for state in target.states
      target.run_shock_effect(state) if state.shock_effect > 0
    end
  end
 
end #Scene_Battle

#===============================================================================
#
# END OF FILE
#
#===============================================================================

이 스크립트 중 1585 줄인...

 

  if @state_stack[state_id] > $data_states[state_id].max_stack - 1 << ---- 이 부분에서 지금 버그가 발생합니다.

 

전투 중 타겟에게 공격을 가하면 이렇게 버그가 발생하더군요... 해결법 아시는분 ㅜㅜ