01-24-2014, 08:07 AM 
	
	
	DoubleX RMVXA Substitute Edit
Version: v1.01b
IntroductionVersion: v1.01b
In the default setting, if more than one battler in the same side have the substitute flag, the one with the lowest id(the leftmost one) will always do the job, even if his/her/its hp isn't the highest among them all.
With this script, it's the one with the highest hp that'll always do the job, thus increasing the effectiveness of the substitute flag if more than one battler in the same side have it.
(v1.00b+)Substitute flag applies to magic reflection and counterattack as well.
(v1.00d+)Battlers resisting state with death_state_id take the substitute role.
Features
* Plug and play(You don't need to edit anything in this script but you may still do so)
Screenshots
Believe it or not, in the following 2 screenshots, Eric, Terence and Ernest have substitute flag while Isabelle doesn't.
Default setting:
![[Image: bandicam2014-01-0221-08-47-281.jpg]](http://i402.photobucket.com/albums/pp101/AvatarArcaneKLOTZ/bandicam2014-01-0221-08-47-281.jpg) 
 With this script:
![[Image: bandicam2014-01-0221-11-18-906.jpg]](http://i402.photobucket.com/albums/pp101/AvatarArcaneKLOTZ/bandicam2014-01-0221-11-18-906.jpg) 
 Script
 script
  			Code:
#==============================================================================|
#  ** DoubleX RMVXA Substitute Edit v1.01b                                     |
#------------------------------------------------------------------------------|
#  * Changelog                                                                 |
#    v1.01b(GMT 1200 21-7-2014):                                               |
#    - Compatible with DoubleX RMVXA Formulae Edit                             |
#    v1.01a(GMT 0700 4-7-2015):                                                |
#    - Lets users set if the substitute only triggers if the skill/item hits   |
#    - Improved this script's readibility                                      |
#    v1.00h(GMT 0200 5-7-2014):                                                |
#    - Improved the compatibility with DoubleX RMVXA Counterattack Edit        |
#    v1.00g(GMT 0500 14-3-2014):                                               |
#    - Substitute flag applies to mp damage also                               |
#    v1.00f(GMT 1200 8-2-2014):                                                |
#    - Substitute flag doesn't apply to item targeting friends                 |
#    v1.00e(GMT 0900 16-1-2014):                                               |
#    - Fixed a & b bug in damage formula of counterattack skills               |
#    v1.00d(GMT 0000 9-1-2014):                                                |
#    - Battlers resisting state with death_state_id take the substitute role   |
#    v1.00c(GMT 0400 5-1-2014):                                                |
#    - Compatible with DoubleX RMVXA Counterattack Edit(by putting below it)   |
#    v1.00b(GMT 0000 5-1-2014):                                                |
#    - Substitute flag applies to MRF and CNT also                             |
#    v1.00a(GMT 1200 2-1-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:                                                                |
#    - nothing special                                                         |
#------------------------------------------------------------------------------|
#  * Functions                                                                 |
#    - Alters the effect of special flag substitute to be the one with the     |
#      highest hp among all having this flag to take the substitute role       |
#------------------------------------------------------------------------------|
#  * 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 aliasing or rewriting:                                            |
#    - item_apply under Game_Battler                                           |
#    - substitute_battler under Game_Unit                                      |
#    - invoke_item, invoke_counter_attack, invoke_magic_reflection or          |
#      check_substitute under Scene_Battle                                     |
#    may have compatibility issues with this script                            |
#    Place this script above those aliasing any of these methods if possible   |
#==============================================================================|
($imported ||= {})["DoubleX RMVXA Substitute Edit"] = true
#==============================================================================|
#  ** You only need to edit this part as it's about what this script does      |
#------------------------------------------------------------------------------|
module DoubleX_RMVXA
  module Substitute_Edit
#------------------------------------------------------------------------------|
#  * (v1.01a+)Hit_Substitute, default = false                                  |
#    If Hit_Substitute is true, substitute won't trigger if the skill/item     |
#    would miss the original target                                            |
#------------------------------------------------------------------------------|
    Hit_Substitute = false
  end # Substitute_Edit
end # DoubleX_RMVXA
#==============================================================================|
#  ** You need not edit this part as it's about how this script works          |
#------------------------------------------------------------------------------|
#------------------------------------------------------------------------------|
#  * (v1.00g+)Edit class: Game_Temp                                            |
#------------------------------------------------------------------------------|
class Game_Temp
  
  #----------------------------------------------------------------------------|
  #  New public instance variable                                              |
  #----------------------------------------------------------------------------|
  attr_accessor :substitute_edit
end # Game_Temp
if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
#------------------------------------------------------------------------------|
#  * (v1.01a+)Edit class: Game_Battler                                         |
#------------------------------------------------------------------------------|
class Game_Battler < Game_BattlerBase
  #----------------------------------------------------------------------------|
  #  Rewrite method: item_apply                                                |
  #----------------------------------------------------------------------------|
  def item_apply(user, item)
    @result.clear
    @result.used = item_test(user, item)
    @result.missed = @result.used && rand >= item_hit(user, item)
    @result.evaded = !@result.missed && rand < item_eva(user, item)
    return unless @result.hit?
    # Added to apply substitute only if the skill/item would hit the target
    if SceneManager.scene_is?(Scene_Battle)
      substitute = SceneManager.scene.apply_substitute(self, item)
      return substitute.item_apply(user, item) if substitute != self
    end
    #
    unless item.damage.none?
      @result.critical = rand < item_cri(user, item)
      # Added to be compatible with DoubleX RMVXA Formulae Edit
      if $imported["DoubleX RMVXA Formulae Edit"] && @result.critical
        @user = user
      end
      #
      make_damage_value(user, item)
      execute_damage(user)
    end
    item.effects.each {|effect| item_effect_apply(user, item, effect) }
    item_user_effect(user, item)
  end # item_apply
end # Game_Battler
end # if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
#------------------------------------------------------------------------------|
#  * Edit class: Game_Unit                                                     |
#------------------------------------------------------------------------------|
class Game_Unit
  #----------------------------------------------------------------------------|
  #  Rewrite method: substitute_battler                                        |
  #----------------------------------------------------------------------------|
  def substitute_battler
    # Rewritten to return the one with highest hp among all with substitute flag
    member_hp = member_temp_hp = 0
    member_temp = []
    members.each { |member|
      next unless member.substitute?
      if $game_temp.substitute_edit == :mp
        break member_hp = 0 if member.mp == 0
        member_hp = member.mp if member_hp < member.mp
      elsif $game_temp.substitute_edit == :hp
        if member.state_resist?(member.death_state_id)
          member_temp.push(member)
          break member_temp_hp = 0 if member.hp == 0
          member_temp_hp = member.hp if member_temp_hp < member.hp
        else
         member_hp = member.hp if member_hp < member.hp
        end
      end
    }
    if member_temp.empty?
      member_temp_hp = member_hp
      member_temp = members
    end
    if $game_temp.substitute_edit == :mp
      member_temp.find {|m| m.substitute? && m.mp == member_temp_hp}
    elsif $game_temp.substitute_edit == :hp
      member_temp.find {|m| m.substitute? && m.hp == member_temp_hp}
    end
    #
  end # substitute_battler
end # Game_Unit
#------------------------------------------------------------------------------|
#  * Edit class: Scene_Battle                                                  |
#------------------------------------------------------------------------------|
class Scene_Battle < Scene_Base
  if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
  #----------------------------------------------------------------------------|
  #  (v1.01a+)Rewrite method: invoke_item                                      |
  #----------------------------------------------------------------------------|
  def invoke_item(target, item)
    if rand < target.item_cnt(@subject, item)
      invoke_counter_attack(target, item)
    elsif rand < target.item_mrf(@subject, item)
      invoke_magic_reflection(target, item)
    else
      # Rewritten to apply the item effects to the target first
      apply_item_effects(target, item)
      #
    end
    @subject.last_target_index = target.index
  end # invoke_item
  end # if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
  #----------------------------------------------------------------------------|
  #  Rewrite method: invoke_counter_attack                                     |
  #----------------------------------------------------------------------------|
  def invoke_counter_attack(target, item)
    icnte = $imported["DoubleX RMVXA Counterattack Edit"]
    cnte = DoubleX_RMVXA::Counterattack_Edit if icnte
    @log_window.display_counter(target, item)
    @cnt_subject = target if icnte && cnte::Keep_Ani
    if icnte
      attack_skill = $data_skills[target.counterattack_skill_id]
    else
      attack_skill = $data_skills[target.attack_skill_id]
    end
    # Rewritten to apply substitute to cnt
    repeats = icnte && cnte::Keep_Times ? attack_skill.repeats : 1
    if attack_skill.for_opponent?
      if icnte && cnte::Keep_Scope
        scope = targets_for_opponents_counterattack_edit(target, attack_skill)
      else
        scope = [@subject]
      end
      show_animation(scope, item.animation_id) if icnte && cnte::Keep_Ani
      scope.each { |s|
        repeats.times {
          if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
            s.item_apply(target, attack_skill)
            @log_window.display_action_results(s, attack_skill)
          else
            sub = apply_substitute(s, attack_skill)
            sub.item_apply(target, attack_skill)
            @log_window.display_action_results(s, attack_skill) if sub == s
          end
        }
      }
    elsif attack_skill.for_friend?
      if icnte && cnte::Keep_Scope
        scope = targets_for_friends_counterattack_edit(target, attack_skill)
      else
        scope = [target]
      end
      show_animation(scope, item.animation_id) if icnte && cnte::Keep_Ani
      scope.each { |s|
        repeats.times {
          s.item_apply(target, attack_skill)
          @log_window.display_action_results(s, attack_skill)
        }
      }
    end
    #
    @cnt_subject = nil if icnte && cnte::Keep_Ani
    refresh_status
  end # invoke_counter_attack
  #----------------------------------------------------------------------------|
  #  Rewrite method: invoke_magic_reflection                                   |
  #----------------------------------------------------------------------------|
  def invoke_magic_reflection(target, item)
    @subject.magic_reflection = true
    @log_window.display_reflection(target, item)
    # Rewritten to apply substitute on mrf
    if DoubleX_RMVXA::Substitute_Edit::Hit_Substitute
      apply_item_effects(@subject, item)
    else
      apply_item_effects(apply_substitute(@subject, item), item)
    end
    #
    @subject.magic_reflection = false
  end # invoke_magic_reflection
  #----------------------------------------------------------------------------|
  #  (v1.00g+)Rewrite method: check_substitute                                 |
  #----------------------------------------------------------------------------|
  def check_substitute(target, item)
    # Rewritten to check substitute only if item is for opponents
    if item && item.damage
      if item.damage.to_hp?
        $game_temp.substitute_edit = :hp
      elsif item.damage.to_mp?
        $game_temp.substitute_edit = :mp
      end
    end
    return true unless item
    return false unless item.for_opponent?
    return false if item.certain?
    return false unless item.damage
    target.hp < target.mhp / 4 && item.damage.to_hp? || 
    target.mp < target.mmp / 4 && item.damage.to_mp?
    #
  end # check_substitute
end # Scene_Battle
#==============================================================================|Instructions
Open the script editor and put this script into an open slot between Materials and Main. Save to take effect.
FAQ
None
Compatibility
Scripts aliasing or rewriting method:
- substitute_battler under class Game_Unit
- invoke_counter_attack or invoke_magic_reflection under class Scene_Battle
may have compatibility issues with this script
Place this script above those aliasing any of these methods if possible
Credits and Thanks
None
Author's Notes
None
Terms and Conditions
None other than not claiming this script as created by anyone except DoubleX or his alias

 
 
 DoubleX RMVXA Substitute Edit
 DoubleX RMVXA Substitute Edit
 

