vx ace用反動ダメージ募集

アバター
alan
記事: 82
登録日時: 2015年12月29日(火) 21:41
お住まい: 神奈川

vx ace用反動ダメージ募集

投稿記事by alan » 2016年1月31日(日) 10:33

スキルが命中後に、反動を受ける
コモンやスクリプトを探していたのですが
中々見付からないので、募集します。

ツクール2000からの、ツクラーです。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: vx ace用反動ダメージ募集

投稿記事by faida » 2016年1月31日(日) 23:18

こんばんは。
一応作ってみました。

コード: 全て選択

=begin
◆概要
受けたダメージのいくらかを反射して攻撃者に与えます。

◆機能
・メモ欄に<ダメージ反射 n%>と入力すると、バトラーは受けたダメージのn%だけ
攻撃者に反射します。
・メモ欄に<攻撃者ダメージ反射 n%>と入力すると、バトラーは与えたダメージのn%だけ
反射してダメージを受けます。
・「ダメージ反射」の直前に「物理」もしくは「魔法」と書くと、それしか反射しなくなり
ます。
記入例)
やいばのよろい風ステート => <物理ダメージ反射 25%>
魔法ダメージを100%反射 => <魔法ダメージ反射 100%>
呪 わ れ ま し た => <攻撃者ダメージ反射 50%>
・メモ欄に<反射ダメージ無効>と入力すると、反射した分のダメージは無効になります。
例えば<ダメージ反射 20%>と併用すると、反射したバトラーのダメージは80%に
なります。
・スキル/アイテム/ステートのみ反射時のメッセージを変更できます。
<反射時:s>で文章をsにできます(メッセージを表示する場合のみ)。

◆仕様
・MPダメージも反射。
・反動ダメージは未実装。
・まず全体の反射率で計算してから、個々の対応反射を加算する。
・100%以上反射してもダメージ無効は回復にはなりません。あ、でもそれ面白そう……。
・「攻撃者ダメージ反射」はダメージ無効できません。
・反射メッセージはスキル/アイテム優先(もろはの剣とかね)。

◆使用上の注意
・○……新規定義 ★……エイリアス

=end

module Vocab
  Reflect = "与えたダメージが反射される!"
  AtDamage = "反動でダメージ!"
end

module FAI_Reflect
  # 跳ね返した時のメッセージを表示する
  SHOW_REFLECT_MESSAGE = true
  # 反動のメッセージを表示する
  SHOW_ATK_DMG_MESSAGE = true
 
  # ダメージ反射
  REFLECT_T = /<ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # ダメージ反射:物理
  PHY_REFLECT_T = /<物理ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # ダメージ反射:魔法
  MAG_REFLECT_T = /<魔法ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # 攻撃者ダメージ反射
  REFLECT_A = /<攻撃者ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # 攻撃者ダメージ反射:物理
  PHY_REFLECT_A = /<攻撃者物理ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # 攻撃者ダメージ反射:魔法
  MAG_REFLECT_A = /<攻撃者魔法ダメージ反射\s*([\+\-]?\d+)\s*[%%]>/i
  # 反動
  ATTACKER_DAMAGE = /<反動\s*([\+\-]?\d+)\s*([%%])*>/i
  # 反射ダメージ無効
  REFLECT_NO_DAMAGE = /<反射ダメージ無効>/i
  # 反射時メッセージ
  REFLECT_MESSAGE = /<反射時\:(.+)>/i
end

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ メモ判定
  #--------------------------------------------------------------------------
  def reflectrate
    @reflect_rate_t = 0; @phy_reflect_rate_t = 0; @mag_reflect_rate_t = 0
    @reflect_rate_a = 0; @phy_reflect_rate_a = 0; @mag_reflect_rate_a = 0
    @attacker_damage = 0; @attacker_damage_rate = 0;
    @reflect_no_damage = false; @reflect_message = ""
    self.note.each_line { |line|
    case line
    when FAI_Reflect::REFLECT_T; @reflect_rate_t = $1.to_i / 100.0
    when FAI_Reflect::PHY_REFLECT_T; @phy_reflect_rate_t = $1.to_i / 100.0
    when FAI_Reflect::MAG_REFLECT_T; @mag_reflect_rate_t = $1.to_i / 100.0
    when FAI_Reflect::REFLECT_A; @reflect_rate_a = $1.to_i / 100.0
    when FAI_Reflect::PHY_REFLECT_A; @phy_reflect_rate_a = $1.to_i / 100.0
    when FAI_Reflect::MAG_REFLECT_A; @mag_reflect_rate_a = $1.to_i / 100.0
    when FAI_Reflect::ATTACKER_DAMAGE
      $2 ? @attacker_damage_rate = $1.to_i / 100.0 : @attacker_damage = $1.to_i
    when FAI_Reflect::REFLECT_NO_DAMAGE; @reflect_no_damage = true
    when FAI_Reflect::REFLECT_MESSAGE; @reflect_message = $1
    when "fai_damage_reflect"
      @reflect_rate = 10.0; @phy_reflect_rate = 10.0; @mag_reflect_rate = 5.0
    end
    }
  end
  #--------------------------------------------------------------------------
  # ○ ダメージ反射
  #--------------------------------------------------------------------------
  def reflect_rate_t; reflectrate if !@reflect_rate_t; @reflect_rate_t; end
  #--------------------------------------------------------------------------
  # ○ 物理ダメージ反射
  #--------------------------------------------------------------------------
  def phy_reflect_rate_t
    reflectrate if !@phy_reflect_rate_t; @phy_reflect_rate_t
  end
  #--------------------------------------------------------------------------
  # ○ 魔法ダメージ反射
  #--------------------------------------------------------------------------
  def mag_reflect_rate_t
    reflectrate if !@mag_reflect_rate_t; @mag_reflect_rate_t
  end
  #--------------------------------------------------------------------------
  # ○ 攻撃者ダメージ反射
  #--------------------------------------------------------------------------
  def reflect_rate_a; reflectrate if !@reflect_rate_a; @reflect_rate_a; end
  #--------------------------------------------------------------------------
  # ○ 攻撃者物理ダメージ反射
  #--------------------------------------------------------------------------
  def phy_reflect_rate_a
    reflectrate if !@phy_reflect_rate_a; @phy_reflect_rate_a
  end
  #--------------------------------------------------------------------------
  # ○ 攻撃者魔法ダメージ反射
  #--------------------------------------------------------------------------
  def mag_reflect_rate_a
    reflectrate if !@mag_reflect_rate_a; @mag_reflect_rate_a
  end
  #--------------------------------------------------------------------------
  # ○ 反動
  #--------------------------------------------------------------------------
  def attacker_damage
    reflectrate if !@attacker_damage; @attacker_damage
  end
  def attacker_damage_rate
    reflectrate if !@attacker_damage_rate; @attacker_damage_rate
  end
  #--------------------------------------------------------------------------
  # ○ 反射ダメージ無効
  #--------------------------------------------------------------------------
  def reflect_no_damage
    reflectrate if @reflect_no_damage.nil?; @reflect_no_damage
  end
  #--------------------------------------------------------------------------
  # ○ 反射メッセージ
  #--------------------------------------------------------------------------
  def reflect_message
    reflectrate if !@reflect_message; @reflect_message
  end
end

#==============================================================================
# ■ BattleManager
#==============================================================================

module BattleManager
  def self.subject
    SceneManager.scene_is?(Scene_Battle) ?
    SceneManager.scene.instance_variable_get(:@subject) : nil
  end
end

#==============================================================================
# ■ Game_ActionResult
#==============================================================================

class Game_ActionResult
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :hp_dmg_ref                # HP ダメージ(反射)
  attr_accessor :mp_dmg_ref                # MP ダメージ(反射)
  attr_accessor :attack_dead               # 反射による死亡
  #--------------------------------------------------------------------------
  # ★ 命中系フラグのクリア
  #--------------------------------------------------------------------------
  alias ref_clear_hit_flags clear_hit_flags
  def clear_hit_flags
    ref_clear_hit_flags
    @attack_dead = false
  end
  #--------------------------------------------------------------------------
  # ★ ダメージ値のクリア
  #--------------------------------------------------------------------------
  alias ref_clear_damage_values clear_damage_values
  def clear_damage_values
    ref_clear_damage_values
    @hp_dmg_ref = 0; @mp_dmg_ref = 0
  end
  #--------------------------------------------------------------------------
  # ○ HP 反射ダメージの文章を取得
  #--------------------------------------------------------------------------
  def hp_ref_damage_text
    if @hp_dmg_ref > 0
      fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
      sprintf(fmt, @battler.name, @hp_dmg_ref)
    else
      fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      sprintf(fmt, @battler.name)
    end
  end
  #--------------------------------------------------------------------------
  # ○ MP 反射ダメージの文章を取得
  #--------------------------------------------------------------------------
  def mp_ref_damage_text
    if @mp_dmg_ref > 0
      fmt = @battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
      sprintf(fmt, @battler.name, Vocab::mp, @mp_dmg_ref)
    else
      ""
    end
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ○ オプション [ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def reflect_rate(user = nil, item = nil)
    n = ([item]+feature_objects).compact.inject(0){|r, s|r + s.reflect_rate_t}
    n += user.reflect_rate_a(item) if user; n
  end
  #--------------------------------------------------------------------------
  # ○ オプション [物理ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def phy_reflect_rate(user = nil, item = nil)
    n=([item]+feature_objects).compact.inject(0){|r, s|r + s.phy_reflect_rate_t}
    n += user.phy_reflect_rate_a(item) if user; n
  end
  #--------------------------------------------------------------------------
  # ○ オプション [魔法ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def mag_reflect_rate(user = nil, item = nil)
    n=([item]+feature_objects).compact.inject(0){|r, s|r + s.mag_reflect_rate_t}
    n += user.mag_reflect_rate_a(item) if user; n
  end
  #--------------------------------------------------------------------------
  # ○ オプション [攻撃者ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def reflect_rate_a(item = nil)
    ([item]+feature_objects).compact.inject(0){|r, s|r + s.reflect_rate_a}
  end
  #--------------------------------------------------------------------------
  # ○ オプション [攻撃者物理ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def phy_reflect_rate_a(item = nil)
    return 0 if item && !item.physical?
    ([item]+feature_objects).compact.inject(0){|r, s|r + s.phy_reflect_rate_a}
  end
  #--------------------------------------------------------------------------
  # ○ オプション [攻撃者魔法ダメージ反射] のレート取得
  #--------------------------------------------------------------------------
  def mag_reflect_rate_a(item = nil)
    return 0 if !item || item.physical?
    ([item]+feature_objects).compact.inject(0){|r, s|r + s.mag_reflect_rate_a}
  end
  #--------------------------------------------------------------------------
  # ○ 軽減するダメージのレート取得
  #--------------------------------------------------------------------------
  def reduce_reflected_damage(item = nil)
    if !item || item.physical?
      n = ([item]+feature_objects).compact.select{|s|s.reflect_no_damage
        }.inject(1.0){|r, s|r - (s.reflect_rate_t + s.phy_reflect_rate_t)
      }
    else
      n = ([item]+feature_objects).compact.select{|s|s.reflect_no_damage
        }.inject(1.0){|r, s|r - (s.reflect_rate_t + s.mag_reflect_rate_t)
      }
    end
    [n, 0.0].max
  end
  #--------------------------------------------------------------------------
  # ○ (確実に)攻撃者に反射があるか?
  #--------------------------------------------------------------------------
  def attack_reflect?(item = nil)
    reflect_rate_a(item) > 0 || phy_reflect_rate_a(item) > 0 ||
    mag_reflect_rate_a(item) > 0
  end
  #--------------------------------------------------------------------------
  # ○ ステートオプション [反射時メッセージ] の取得
  #--------------------------------------------------------------------------
  def reflect_message(user = nil, item = nil)
    return item.reflect_message if item && !item.reflect_message.empty?
    if user && user.reflect_message != Vocab::Reflect
      return user.reflect_message if user.attack_reflect?(item)
    end
    if feature_objects.find{|s|!s.reflect_message.empty?}
      feature_objects.find{|s|!s.reflect_message.empty?}.reflect_message
    else
      Vocab::Reflect
    end
  end
  #--------------------------------------------------------------------------
  # ★ ダメージ計算
  #--------------------------------------------------------------------------
  alias ref_make_damage_value make_damage_value
  def make_damage_value(user, item)
    ref_make_damage_value(user, item)
    user.result.hp_dmg_ref = @result.hp_damage * reflect_rate(user, item)
    user.result.mp_dmg_ref = @result.mp_damage * reflect_rate(user, item)
    if item.physical?
      user.result.hp_dmg_ref += @result.hp_damage * phy_reflect_rate(user, item)
      user.result.mp_dmg_ref += @result.mp_damage * phy_reflect_rate(user, item)
    else
      user.result.hp_dmg_ref += @result.hp_damage * mag_reflect_rate(user, item)
      user.result.mp_dmg_ref += @result.mp_damage * mag_reflect_rate(user, item)
    end
    user.result.hp_dmg_ref = user.result.hp_dmg_ref.to_i
    user.result.mp_dmg_ref = user.result.mp_dmg_ref.to_i
    @result.hp_damage *= reduce_reflected_damage(item)
    @result.mp_damage *= reduce_reflected_damage(item)
    @result.hp_damage = @result.hp_damage.to_i
    @result.mp_damage = @result.mp_damage.to_i
  end
  #--------------------------------------------------------------------------
  # ★ ダメージの反映
  #--------------------------------------------------------------------------
  alias ref_execute_damage execute_damage
  def execute_damage(user)
    ref_execute_damage(user)
  end
end

#==============================================================================
# ■ Window_BattleLog
#==============================================================================

class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # ★ 行動結果の表示
  #--------------------------------------------------------------------------
  alias ref_display_action_results display_action_results
  def display_action_results(target, item)
    subject = BattleManager.subject
    return if subject.result.attack_dead # 既に行動キャラが死んでいるか?
    ref_display_action_results(target, item)
  end
  #--------------------------------------------------------------------------
  # ★ HP ダメージ表示
  #--------------------------------------------------------------------------
  alias ref_display_hp_damage display_hp_damage
  def display_hp_damage(target, item)
    return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
    ref_display_hp_damage(target, item)
    subject = BattleManager.subject
    return if subject.result.hp_dmg_ref == 0
    subject.hp -= subject.result.hp_dmg_ref
    SceneManager.scene.refresh_status
    subject.perform_damage_effect
    if FAI_Reflect::SHOW_REFLECT_MESSAGE
      t = target.reflect_message(subject, item)
      add_text(t); wait; add_text(subject.result.hp_ref_damage_text)
    else
      add_text(subject.result.hp_ref_damage_text)
    end
    wait
    if subject.dead?
      state = $data_states[subject.death_state_id]
      state_msg = subject.actor? ? state.message1 : state.message2
      subject.perform_collapse_effect; subject.result.attack_dead = true
      replace_text(subject.name + state_msg)
      wait
      wait_for_effect
    end
  end
  #--------------------------------------------------------------------------
  # ★ MP ダメージ表示
  #--------------------------------------------------------------------------
  alias ref_display_mp_damage display_mp_damage
  def display_mp_damage(target, item)
    return if target.dead? || target.result.mp_damage == 0
    ref_display_mp_damage(target, item)
    subject = BattleManager.subject
    return if subject.result.mp_dmg_ref == 0
    subject.mp -= subject.result.mp_dmg_ref
    SceneManager.scene.refresh_status
    if FAI_Reflect::SHOW_REFLECT_MESSAGE
      add_text(target.reflect_message(subject, item))
      wait
      add_text(target.result.mp_ref_damage_text)
    else
      add_text(target.result.mp_ref_damage_text)
    end
    wait
  end
end

おそらくイメージと違うかもしれません。
ご要望などありましたら遠慮なくどうぞ。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
alan
記事: 82
登録日時: 2015年12月29日(火) 21:41
お住まい: 神奈川

Re: vx ace用反動ダメージ募集

投稿記事by alan » 2016年2月01日(月) 15:16

イメージと合致しました、有難う御座います!
ツクール2000からの、ツクラーです。

“VX / Ace:スクリプト素材のリクエスト” へ戻る