king-exit/Scripts/_.74.rb
2024-08-31 14:17:23 -05:00

555 lines
No EOL
17 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.

#==============================================================================
# ■ RGSS3 オートリザレクション特徴 Ver2.00 by 星潟
#------------------------------------------------------------------------------
# 戦闘不能に陥った際、一定確率で自動回復する特徴を作成します。
# 著しくゲームバランスを損ねる場合がありますので、ご利用は計画的に。
# なお、イベントコマンドのHP増減による戦闘不能や
# ステート付与による戦闘不能では動作しないようにしています。
#
# また、自動蘇生効果発動時に破損する装備品や
# 解除するステートを作成することもできます。
# (特に素材を導入していない限りは、戦闘不能時にステートは自動消滅します。
# 戦闘不能時にステートが解除されないような素材を導入されている場合のみ
# 解除するステート設定は有効です)
#==============================================================================
# ★自動蘇生特徴設定例(アクター・装備品・ステート・エネミー用)
#------------------------------------------------------------------------------
# <自動蘇生:500,42,25>
#
# 戦闘不能になった際、アニメーションID42を再生しつつ
# 25の確率でHP500の状態で蘇生します。
#------------------------------------------------------------------------------
# <自動蘇生:self.mhp*3/4,0>
#
# 戦闘不能になった際、アニメーションは表示せず
# 100の確率でHPが最大HPの75の状態で蘇生します。
#==============================================================================
# ★自動蘇生破損特徴設定例(装備品・ステート用)
#------------------------------------------------------------------------------
# <自動蘇生破損:75>
#
# この装備・ステートで自動蘇生が発動した際
# 75の確率で破壊/解除されます。
#------------------------------------------------------------------------------
# <自動蘇生破損:$game_variables[1]>
#
# この装備・ステートで自動蘇生が発動した際
# 変数1の値分の確率で破壊/解除されます。
#------------------------------------------------------------------------------
# Ver1.01
# オートリザレクションを特徴化。
# Ver2.00
# 注釈を全面的に追加。
# キャッシュ化による軽量化を実施。
# HP回復量・発動確率にスクリプトによる計算を行えるように変更。
# 装備・ステートに対し、自動蘇生発動時に破壊/解除される確率を
# 指定できるように機能を拡張。
#==============================================================================
module A_Resurrection
#死亡時自動蘇生の設定用キーワードを指定。
WORD1 = "自動蘇生"
#死亡時自動蘇生が発動した際の破壊/解除率設定用キーワードを指定。
WORD2 = "自動蘇生破損"
#自動回復させる場合にHP回復量を表示するか否かを指定。
#true …… 表示する false ……表示しない
RE_HPDIS = true
#スリップダメージによる戦闘不能でも自動回復するか否かを指定。
#true …… する false ……しない
SLIP_REC = true
#死亡時自動蘇生時に装備品が破壊された場合のキーワードを指定。
TEXT = "は砕け散った!"
#装備品が破壊された場合のSEを指定。
#指定順は[SE名,音量,ピッチ]。
SE = ["Crash",80,100]
end
class Game_ActionResult
attr_accessor :a_resurrection
#--------------------------------------------------------------------------
# ダメージ値のクリア
#--------------------------------------------------------------------------
alias clear_damage_values_a_resurrection clear_damage_values
def clear_damage_values
#本来の処理を実行。
clear_damage_values_a_resurrection
#自動蘇生データを初期化する。
a_resurrection_clear
end
#--------------------------------------------------------------------------
# 自動蘇生データを初期化
#--------------------------------------------------------------------------
def a_resurrection_clear
@a_resurrection = [0,0,nil]
end
end
module BattleManager
#--------------------------------------------------------------------------
# 蘇生可能タイミングかどうかを判定。
#--------------------------------------------------------------------------
def self.resurrection
#ターン中、もしくはターン終了時はtrue、そうでない場合はfalse
@phase == :turn or @phase == :turn_end
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ステート付与
#--------------------------------------------------------------------------
alias add_state_a_resurrection add_state
def add_state(state_id)
#ステートIDが死亡ステートでなく
#蘇生可能なタイミングであり
#なおかつまだ死亡していない場合は分岐。
if state_id == death_state_id && BattleManager.resurrection && !state?(death_state_id)
#自動蘇生データを取得。
data = a_resurrection_check(state_id)
#本来の処理を実行。
add_state_a_resurrection(state_id)
#自動蘇生データのHP回復量が0以上の場合は行動結果に反映。
@result.a_resurrection = data if data[0] > 0
else
#本来の処理を実行。
add_state_a_resurrection(state_id)
end
end
#--------------------------------------------------------------------------
# 自動蘇生データ生成
#--------------------------------------------------------------------------
def a_resurrection_check(state_id, regenerate = false)
#自動回復処理中でなく、なおかつHPが0でなく、戦闘不能状態でもない場合は
#デフォルトの配列を返す。
return [0,0,nil] if !regenerate && (self.hp != 0 or state_id != death_state_id)
#特徴別に判定。
feature_objects.each {|f| hash = f.a_resurrection
#特徴の自動蘇生データのハッシュから発動率を計算する。
hash.each_value {|value| next unless eval(value[2]) > rand(100)
#HP回復量を計算。
data = eval(value[0]).to_i
#HP回復量が0以上の場合のみ続行。
next unless data > 0
#HP回復量、アニメーションID、特徴データを返す。
return [data, value[1],f]}}
#デフォルトの配列を返す。
[0,0,nil]
end
#--------------------------------------------------------------------------
# 自動蘇生データ
#--------------------------------------------------------------------------
def a_resurrection
#自動蘇生データを返す。
@result.a_resurrection
end
#--------------------------------------------------------------------------
# ターン終了
#--------------------------------------------------------------------------
alias regenerate_hp_a_resurrection regenerate_hp
def regenerate_hp
#スリップダメージによる死亡からの自動蘇生を行う場合
#自動蘇生データを取得し、そうでない場合はデフォルトの配列を返す。
@result.a_resurrection = A_Resurrection::SLIP_REC ? a_resurrection_check(death_state_id, true) : [0,0]
#本来の処理を実行。
regenerate_hp_a_resurrection
#本来の処理を行った上でHPが0でないか死亡していない場合は
#デフォルトの配列を返す。
@result.a_resurrection = [0,0,nil] if self.hp != 0 or !state?(death_state_id)
end
#--------------------------------------------------------------------------
# 破損率確率の計算
#--------------------------------------------------------------------------
def a_r_break_rate(f)
eval(f.a_r_break_rate)
end
end
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# スキル/アイテムの効果を適用
#--------------------------------------------------------------------------
alias apply_item_effects_a_resurrection apply_item_effects
def apply_item_effects(target, item)
#本来の処理を実行。
apply_item_effects_a_resurrection(target, item)
#自動蘇生データを取得。
data = target.a_resurrection
#HP回復量が0より大きい場合は処理を続行。
return unless data[0] > 0
#ログウィンドウをクリア。
@log_window.clear
#指定したアニメーションを再生。ID0の場合は再生しない。
show_animation([target], data[1]) if data[1] > 0
#対象のHPを回復。
target.hp = data[0]
#ステータスウィンドウの更新。
refresh_status
#自動蘇生を表示。
@log_window.display_a_resurrection(target)
#自動蘇生による破損の表示。
@log_window.display_a_r_break(target, data[2])
end
#--------------------------------------------------------------------------
# ターン終了
#--------------------------------------------------------------------------
alias turn_end_a_resurrection turn_end
def turn_end
#スリップダメージによる死亡からの蘇生フラグを取得。
@te_a_resurrection = A_Resurrection::SLIP_REC
#本来の処理を実行。
turn_end_a_resurrection
#スリップダメージによる死亡からの蘇生フラグを消去。
@te_a_resurrection = nil
end
#--------------------------------------------------------------------------
# イベント処理
#--------------------------------------------------------------------------
alias process_event_te_a_resurrection process_event
def process_event
#スリップダメージによる死亡からの蘇生フラグが有効な場合
#ここで蘇生処理を実行する。
te_a_resurrection_execute if @te_a_resurrection
process_event_te_a_resurrection
end
def te_a_resurrection_execute
#全ての戦闘メンバー別に処理。
all_battle_members.each do |battler|
#自動蘇生のデータを取得。
data = battler.result.a_resurrection
#自動蘇生のHP回復量が0より大きい場合
if data[0] > 0
#ログウィンドウをクリア。
@log_window.clear
#指定したアニメーションを再生。ID0の場合は再生しない。
show_animation([battler], data[1]) if data[1] > 0
#対象のHPを回復。
battler.hp = data[0]
#ステータスウィンドウの更新。
refresh_status
#自動蘇生の表示。
@log_window.display_a_resurrection(battler)
#ログウィンドウのクリア。
@log_window.wait_and_clear
#自動蘇生による破損の表示。
@log_window.display_a_r_break(battler,data[2])
end
end
end
end
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# 自動蘇生時のHP回復表示
#--------------------------------------------------------------------------
def a_resurrection_hp_recovery(target)
#回復ではなくダメージである場合や
#回復量を表示しない設定である場合は処理しない。
return unless target.result.hp_damage > 0 or A_Resurrection::RE_HPDIS
#回復SEを実行。
Sound.play_recovery
#回復メッセージを表示。
add_text(target.result.hp_damage_text)
#ウェイトを実行。
wait
end
#--------------------------------------------------------------------------
# 自動蘇生の表示
#--------------------------------------------------------------------------
def display_a_resurrection(target)
#結果を書き換える。
target.result.used = true
target.result.critical = false
target.result.success = true
target.result.hp_damage = -target.result.a_resurrection[0]
#死亡ステートデータを取得。
state = $data_states[target.death_state_id]
#最終行を取得。
last_line_number = line_number
#自動蘇生時のHP回復表示。
a_resurrection_hp_recovery(target)
#戦闘不能ステート解除メッセージを表示。
add_text(target.name + state.message4) unless state.message4.empty?
#ウェイトを実行。
wait if line_number > last_line_number
#行を戻す。
back_to(last_line_number)
end
#--------------------------------------------------------------------------
# 自動蘇生破損の表示
#--------------------------------------------------------------------------
def display_a_r_break(target, feature)
#該当する特徴の破損判定を実行。
return unless target.a_r_break_rate(feature) > rand(100)
#最終行を取得。
last_line_number = line_number
#特徴が装備品である場合
if feature.is_a?(RPG::EquipItem)
#なんらかの原因で既に装備解除されている状況を考え
#装備品別に自動蘇生に用いた装備品を装備しているか否かを判定。
return unless target.equips.include?(feature)
#ウェイトを実行。
wait
#該当する装備を破棄。
target.discard_equip(feature)
#SEの配列を用意。
array = A_Resurrection::SE
#SEを演奏。
RPG::SE.new(array[0],array[1],array[2]).play
#設定に応じてメッセージを表示。
add_text(feature.name + A_Resurrection::TEXT) unless A_Resurrection::TEXT.empty?
#ウェイトを実行。
wait
#行を戻す。
back_to(last_line_number)
#対象がステートである場合
elsif feature.is_a?(RPG::State)
#そのステートが付与されていない場合は飛ばす。
return unless target.state?(feature.id)
#ウェイトを実行。
wait
#該当するステートを解除。
target.remove_state(feature.id)
#ステート解除メッセージを表示。
add_text(target.name + feature.message4) unless feature.message4.empty?
#ウェイトを実行。
wait
#行を戻す。
back_to(last_line_number)
end
end
end
class RPG::BaseItem
#--------------------------------------------------------------------------
# 自動蘇生データ
#--------------------------------------------------------------------------
def a_resurrection
#キャッシュが存在する場合はキャッシュを返す。
return @a_resurrection if @a_resurrection
#ハッシュを作成。
@a_resurrection = {}
#メモ欄からデータを取得する。
@note.each_line {|l|
memo = l.scan(/<#{A_Resurrection::WORD1}[:](\S+)>/).flatten
#正常なデータを取得できた場合はそのデータを分解する。
if memo != nil && !memo.empty?
data = memo[0].split(/\s*,\s*/)
#要素数が決定的に足りない場合は飛ばす。
next if data.size < 2
#要素が1足りない場合は確率の省略とみなし、文字列の100を代入。
data.push("100") if data.size < 3
#アニメーションIDは整数とする。
data[1] = data[1].to_i
#ハッシュにデータを関連付ける。
@a_resurrection[@a_resurrection.size] = data
end
}
#データを返す。
@a_resurrection
end
#--------------------------------------------------------------------------
# 自動蘇生時破損確率
#--------------------------------------------------------------------------
def a_r_break_rate
#キャッシュが存在する場合はキャッシュを返す。
return @a_r_break if @a_r_break
#メモ欄からデータを取得する。
memo = @note.scan(/<#{A_Resurrection::WORD2}[:](\S+)>/).flatten
#正常なデータを取得できた場合はそのデータを。そうでない場合は"0"とする。
@a_r_break = memo != nil && !memo.empty? ? memo[0] : "0"
#データを返す。
@a_r_break
end
end