スキルが命中後に、反動を受ける
コモンやスクリプトを探していたのですが
中々見付からないので、募集します。
vx ace用反動ダメージ募集
vx ace用反動ダメージ募集
ツクール2000からの、ツクラーです。
Re: vx ace用反動ダメージ募集
こんばんは。
一応作ってみました。
おそらくイメージと違うかもしれません。
ご要望などありましたら遠慮なくどうぞ。
一応作ってみました。
コード: 全て選択
=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」と記名していただければ
利用可能です。
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。