sacred-ritual-academy/Scripts/BMSP_.rb
2025-03-18 19:45:34 -05:00

532 lines
No EOL
24 KiB
Ruby
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# ■ BMSP ダメージイベント[DAMAGEEVENT] Ver1.02 2013/10/20
#------------------------------------------------------------------------------
#  ダメージを受けるタイミングでイベントを実行することができます.
#==============================================================================
#------------------------------------------------------------------------------
# ■内容
# ダメージを受けるタイミングでイベントを実行することができます.
# 特定のダメージにエフェクトを付加したり,
# キャラクターの台詞やボイスを入れたりすることができます.
#
# 位置:特に指定はありません
#
# ■使用方法
# スクリプトに丸ごと貼り付けていただければ使用できます.
#
# ●コモンイベントの作成方法
# ・コモンイベントの名前
# なんでも構いません.わかりやすい名前を付けて下さい
# ・トリガー
# なし
# ・実行内容
# 一行目に注釈を作成してください.
# 内容は
# ==ダメージイベント:%types%:%timing%==
# と記述します.
#
# %types%は以下のタイプを任意個"|"で区切って記述します.
# ここに書かれたタイプの状況すべてでイベントが実行される可能性が生まれます.
# 反撃:反撃時に実行されます.
# 反射:反射時に実行されます.
# 身代わり:身代わり時に実行されます.
# 失敗:失敗時に実行されます.
# 会心:会心時に実行されます.
# ミス:ミス時に実行されます.
# 回避:回避時に実行されます.
# HPHPダメージ時に実行されます
# MPMPダメージ時に実行されます
# TPTPダメージ時に実行されます
# ステート付加:ステート付加時に実行されます.
# ステート解除:ステート解除時に実行されます.
#
# %timing%は「表示前」もしくは「表示後」で置き換えます.
# 表示前:メッセージ表示直前にコモンイベントを実行します
# 表示後:メッセージ表示直後にコモンイベントを実行します
#
# 二行目から注釈でないイベントコマンドまでは条件を表す注釈となります.
# 注釈1つにつき必ず満たすべき条件を書きます
# また注釈内1行につきいづれかを満たせば良い条件を書きます
# 例
# 注釈条件1
# 条件2
# 注釈条件3
# この例では条件1かつ条件3を満たすときまたは
# 条件2かつ条件3を満たすときにこのイベントが実行されます
# 条件以降については任意のイベントコマンドを並べることが出来ます.
#
# ●条件の書き方
# 条件部分はevalで評価しているのでrubyに書ける式を自由に書くことが出来ます
# 各タイプに応じて特殊な変数を使用することができます.
# □反撃
# ・subject
# 反撃を行うアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# 反撃をされるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 反撃時に行う行動(スキル)を参照できます.(RPG::Skill)
#
# □反射
# ・subject
# 反射を行うアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# 反射をされるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 反射を行うアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □身代わり
# ・subst
# 身代わりを行うアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# 身代わりをされるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
#
# □失敗
# ・target
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □会心
# ・subject
# クリティカル攻撃を行うアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# クリティカル攻撃を受けるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □ミス
# ・target
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □回避
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# 回避を行うアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・action
# 回避するアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □HP
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# HPダメージを受けるアクター・エネミーを参照できます(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □MP
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# MPダメージを受けるアクター・エネミーを参照できます(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □TP
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# TPダメージを受けるアクター・エネミーを参照できます(Game_ActorGame_Enemy)
# ・action
# 使用したアイテム・スキルを参照できます.(RPG::ItemRPG::Skill)
#
# □ステート付加
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# ステートを付加されるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・state
# 付加されるステートを参照できます.(RPG::State)
#
# □ステート解除
# ・subject
# アイテム・スキルを使用したアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・target
# ステートを解除されるアクター・エネミーを参照できます.(Game_ActorGame_Enemy)
# ・state
# 解除されるステートを参照できます.(RPG::State)
#
# 各タイプで使用可能な変数から参照できる値や,
# その他の情報の参照についてはスクリプトエディタや
# ヘルプのVX Ace データ構造から各自が確認してください.
#
# 例ID1のアクターが大ダメージを受けたときにボイス再生
# 注釈:==ダメージイベント:HP:表示後==
# 注釈target.actor? && target.id == 1
# 注釈target.result.hp_damage * 100 / target.mhp >= 50
# SE の演奏xxxx
#
# 例:会心の一撃によるダメージは画面をフラッシュ
# 注釈:==ダメージイベント:HP:表示前==
# 注釈target.result.critical
# 画面のフラッシュxxxx
#
# もし条件の書き方がよくわからなければ掲示板(http://blueredzone.bbs.fc2.com/)
# あたりにでも書いて頂ければ条件式もお作りします.
#
# ■注意
# このスクリプトでは
# 「Scene_Battle」「Window_BattleLog」
# のメソッドを改変しています.
# ■情報
# このスクリプトはgentlawkによって作られたものです
# 利用規約はhttp://blueredzone.comをご覧ください
#------------------------------------------------------------------------------
module BMSP
@@includes ||= {}
@@includes[:DamageEvent] = 1.02
module DamageEvent
#▲▽▲▽▲▽▲▽▲▽▲▽▲▽▲▽
#詳細設定
#▲▽▲▽▲▽▲▽▲▽▲▽▲▽▲▽
/==:(.+):(|)==/o
#--------------------------------------------------------------------------
# ● 対象コモンイベントの初期化
#--------------------------------------------------------------------------
def self.init_commons
types = [:counter, :reflection, :substitute, :failure, :critical, :miss, :evasion,
:hp_damage, :mp_damage, :tp_damage, :added_st, :removed_st]
@commons = {}
types.each do |type|
@commons[type] = {:before=>[], :after=>[]}
end
$data_common_events.each do |common|
next if common.nil?
types,timing,cond = self.check_damageevent(common)
next if types.nil?
types.each do |type|
@commons[type][timing].push([common, cond])
end
end
end
#--------------------------------------------------------------------------
# ● 条件にマッチするコモンイベントを取得
#--------------------------------------------------------------------------
def self.commons(type, timing, binding)
init_commons if @commons.nil?
return @commons[type][timing].select{ |common,cond|
check_condition(cond, binding)
}.map{|cc| cc.first }
end
#--------------------------------------------------------------------------
# ● ダメージイベントかチェックして情報を取得
#--------------------------------------------------------------------------
def self.check_damageevent(common_event)
list = common_event.list
index = 0
return nil if list[index].code != 108 # 注釈じゃない
define_comment = list[index].parameters[0]
index += 1
while list[index].code == 408
index += 1
end
return nil unless define_comment =~ /==:(.+):(|)==/o
types = $1.split('|')
timing = $2 == "表示前" ? :before : :after
# 対象タイプを変換
types.map!{|type| self.translate_type(type)}.compact!
return nil if types.empty?
# 条件文を抽出
cond = []
size = -1
while list[index].code == 108
size += 1
cond[size] = [list[index].parameters[0]]
index += 1
while list[index].code == 408
cond[size].push(list[index].parameters[0])
index += 1
end
end
return types,timing,cond
end
#--------------------------------------------------------------------------
# ● 条件を満たすかチェック
#--------------------------------------------------------------------------
def self.check_condition(formulas, binding)
return formulas.inject(true){|ret, subformulas|
ret && subformulas.inject(false){|r, formula|
r || binding.eval(formula)
}
}
end
#--------------------------------------------------------------------------
# ● タイプ変換
#--------------------------------------------------------------------------
def self.translate_type(type)
case type
when "反撃" ; :counter
when "反射" ; :reflection
when "身代わり" ; :substitute
when "失敗" ; :failure
when "会心" ; :critical
when "ミス" ; :miss
when "回避" ; :evasion
when "HP" ; :hp_damage
when "MP" ; :mp_damage
when "TP" ; :tp_damage
when "ステート付加"; :added_st
when "ステート解除"; :removed_st
else nil
end
end
#--------------------------------------------------------------------------
# ● 条件を評価
#--------------------------------------------------------------------------
def self.eval(formulas, use, user, targets)
return formulas.inject(true){|ret, subformulas|
ret && subformulas.inject(false){|r, formula|
r || Kernel.eval(formula)
}
}
end
#--------------------------------------------------------------------------
# ● バグの例外クラス
#--------------------------------------------------------------------------
class BUG < StandardError
end
#--------------------------------------------------------------------------
# ● 導入スクリプトの例外クラス
#--------------------------------------------------------------------------
class REQUIRE < StandardError
end
end
#--------------------------------------------------------------------------
# ● 必須スクリプトのチェック
#--------------------------------------------------------------------------
class << self
if method_defined?(:check_require)
alias damageevent_check_require check_require
end
end
def self.check_require(require, version)
return true
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
attr_reader :bmsp_damageevent_subject
#--------------------------------------------------------------------------
# ● ログウィンドウの作成
#--------------------------------------------------------------------------
alias bmsp_damageevent_create_log_window create_log_window
def create_log_window
bmsp_damageevent_create_log_window
@log_window.method_bmsp_damageevent_execute_common_event =
method(:bmsp_damageevent_execute_common_event)
end
#--------------------------------------------------------------------------
# ● コモンイベントの実行
#--------------------------------------------------------------------------
def bmsp_damageevent_execute_common_event(common_event)
interpreter = Game_Interpreter.new
interpreter.setup(common_event.list)
loop do
interpreter.update
wait_for_message
wait_for_effect if $game_troop.all_dead?
break unless interpreter.running?
update_for_wait
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の実行
#--------------------------------------------------------------------------
alias bmsp_damageevent_execute_action execute_action
def execute_action
@bmsp_damageevent_subject = @subject
bmsp_damageevent_execute_action
end
#--------------------------------------------------------------------------
# ● 反撃の発動
#--------------------------------------------------------------------------
alias bmsp_damageevent_invoke_counter_attack invoke_counter_attack
def invoke_counter_attack(target, item)
@bmsp_damageevent_subject = target
bmsp_damageevent_invoke_counter_attack(target, item)
@bmsp_damageevent_subject = @subject
end
#--------------------------------------------------------------------------
# ● 魔法反射の発動
#--------------------------------------------------------------------------
alias bmsp_damageevent_invoke_magic_reflection invoke_magic_reflection
def invoke_magic_reflection(target, item)
@bmsp_damageevent_subject = target
bmsp_damageevent_invoke_magic_reflection(target, item)
@bmsp_damageevent_subject = @subject
end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● コモンイベント呼び出し用メソッドの設定
#--------------------------------------------------------------------------
def method_bmsp_damageevent_execute_common_event=(method)
@method_bmsp_damageevent_execute_common_event = method
end
#--------------------------------------------------------------------------
# ● 文章の追加
#--------------------------------------------------------------------------
alias bmsp_damageevent_add_text add_text
def add_text(text)
/.*`(.*)'/ =~ caller[0]
bmsp_dagameevent_execute_event($1, :before)
bmsp_damageevent_add_text(text)
bmsp_dagameevent_execute_event($1, :after)
end
#--------------------------------------------------------------------------
# ● フック対象メソッドのマッチ
#--------------------------------------------------------------------------
def bmsp_dagameevent_match(method, timing)
case method
when "display_counter" ; type = :counter
when "display_reflection" ; type = :reflection
when "display_substitute" ; type = :substitute
when "display_failure" ; type = :failure
when "display_critical" ; type = :critical
when "display_miss" ; type = :miss
when "display_evasion" ; type = :evasion
when "display_hp_damage" ; type = :hp_damage
when "display_mp_damage" ; type = :mp_damage
when "display_tp_damage" ; type = :tp_damage
when "display_added_state" ; type = :added_st
when "display_removed_state" ; type = :removed_st
else; return []
end
BMSP::DamageEvent.commons(type, timing, @bmsp_damageevent_binding)
end
#--------------------------------------------------------------------------
# ● マッチするイベントの実行
#--------------------------------------------------------------------------
def bmsp_dagameevent_execute_event(method, timing)
commons = bmsp_dagameevent_match(method, timing)
commons.each do |common|
SceneManager.scene.method(:bmsp_damageevent_execute_common_event).call(common)
end
end
#--------------------------------------------------------------------------
# ● 反撃の表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_counter display_counter
def display_counter(subject, action)
target = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_counter(subject, action)
end
#--------------------------------------------------------------------------
# ● 反射の表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_reflection display_reflection
def display_reflection(subject, action)
target = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_reflection(subject, action)
end
#--------------------------------------------------------------------------
# ● 身代わりの表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_substitute display_substitute
def display_substitute(subst, target)
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_substitute(subst, target)
end
#--------------------------------------------------------------------------
# ● 失敗の表示
#--------------------------------------------------------------------------
# alias bmsp_damageevent_display_failure display_failure
# def display_failure(target, action)
# @bmsp_damageevent_binding = binding
# bmsp_damageevent_display_failure(target, action)
# end
#--------------------------------------------------------------------------
# ● クリティカルヒットの表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_critical display_critical
def display_critical(target, action)
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_critical(target, action)
end
#--------------------------------------------------------------------------
# ● ミスの表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_miss display_miss
def display_miss(target, action)
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_miss(target, action)
end
#--------------------------------------------------------------------------
# ● 回避の表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_evasion display_evasion
def display_evasion(target, action)
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_evasion(target, action)
end
#--------------------------------------------------------------------------
# ● HP ダメージ表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_hp_damage display_hp_damage
def display_hp_damage(target, action)
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_hp_damage(target, action)
end
#--------------------------------------------------------------------------
# ● MP ダメージ表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_mp_damage display_mp_damage
def display_mp_damage(target, action)
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_mp_damage(target, action)
end
#--------------------------------------------------------------------------
# ● TP ダメージ表示
#--------------------------------------------------------------------------
alias bmsp_damageevent_display_tp_damage display_tp_damage
def display_tp_damage(target, action)
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_damageevent_display_tp_damage(target, action)
end
#--------------------------------------------------------------------------
# ● ステート付加の表示(再定義)
#--------------------------------------------------------------------------
def display_added_states(target)
target.result.added_state_objects.each do |state|
state_msg = target.actor? ? state.message1 : state.message2
target.perform_collapse_effect if state.id == target.death_state_id
next if state_msg.empty?
subject = SceneManager.scene.bmsp_damageevent_subject
@bmsp_damageevent_binding = binding
bmsp_dagameevent_execute_event("display_added_state", :before)
replace_text(target.name + state_msg)
bmsp_dagameevent_execute_event("display_added_state", :after)
wait
wait_for_effect
end
end
#--------------------------------------------------------------------------
# ● ステート解除の表示(再定義)
#--------------------------------------------------------------------------
def display_removed_states(target)
target.result.removed_state_objects.each do |state|
next if state.message4.empty?
subject = SceneManager.scene.instance_eval{@subject}
@bmsp_damageevent_binding = binding
bmsp_dagameevent_execute_event("display_removed_state", :before)
replace_text(target.name + state.message4)
bmsp_dagameevent_execute_event("display_removed_state", :after)
wait
end
end
end