#============================================================================== # ■ RGSS3 特定ステート身代わり特徴 Ver2.00 by 星潟 #------------------------------------------------------------------------------ # このスクリプトを導入することで # 特徴を有するオブジェクトのメモ欄に特定の書式を記入する事で # 特定のステートを受けた際、一定確率でそのステートを無効化し # そして特徴が設定されたオブジェクトを # 一定確率で消滅させる特徴を作成できるようになります。 # ステートIDを1にしても、HPが0になった際の戦闘不能は防げません。 # HPが0になった際の戦闘不能については # ステートIDを0と指定する事で、HP1扱いで戦闘不能を免れる事が出来ます。 # # また、オブジェクトが装備品かステートでない場合は # オブジェクトを消滅させる効果はなくなります。 # なお、消滅率の設定を記入しなかった場合、消滅率は0%として扱われます。 #============================================================================== # <ステート防止:2,75,50> # # 攻撃・スキルによる毒状態を75%の確率で防ぐ。 # 防いだ際、50%の確率でこの特徴を有する装備・ステートは消滅する。 #------------------------------------------------------------------------------ # <ステート防止:1,50,25> # # ダメージ以外のステート付与による戦闘不能状態を50%の確率で防ぐ。 # 防いだ際、25%の確率でこの特徴を有する装備・ステートは消滅する。 #------------------------------------------------------------------------------ # <ステート防止:3,25> # # 攻撃・スキルによる暗闇状態を25%の確率で防ぐ。 # 防いだ際もこの特徴を有する装備・ステートは消滅しない。 #============================================================================== module StaDifState #ステートのメモ欄に設定する為のキーワードを設定 Word = "ステート防止" #既に付与されているステートについては防止効果を働かせないかどうか #true => 防止する #false => 防止しない Set = true #ステートを防いだ際のメッセージを指定。 ST_D1 = "%sは%sから守られた!" #戦闘不能をHP1で防いだ際のメッセージを指定。 ST_D2 = "%sは奇跡的に耐えた!" #ステートを防いだ際、装備品が破損した場合のメッセージを指定。 ST_D_IB = "%sは砕け散った!" end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # スキル/アイテムの効果適用 #-------------------------------------------------------------------------- alias item_apply_state_deflect item_apply def item_apply(user, item) @state_deflect_mode = true item_apply_state_deflect(user, item) @state_deflect_mode = nil end #-------------------------------------------------------------------------- # ステートの付加可能判定 #-------------------------------------------------------------------------- alias state_addable_state_deflect? state_addable? def state_addable?(state_id) data = state_addable_state_deflect?(state_id) return false if $game_party.in_battle && data && sds_state_check(state_id) data end #-------------------------------------------------------------------------- # ステート身代わり判定 #-------------------------------------------------------------------------- def sds_state_check(state_id) return false if !@state_deflect_mode or (!StaDifState::Set && state?(state_id)) feature_objects.each {|f| f.substitute_diffence_state.each {|a| sid = eval(a[0]) l = hp != 0 if sid == (l ? state_id : 0) if eval(a[1]) > rand(100) revive unless l $game_troop.state_deflect_state_name.push($data_states[state_id].name) $game_troop.state_deflect_item.push(f.clone) if eval(a[2]) > rand(100) if f.is_a?(RPG::State) $game_troop.state_deflect_item_type.push(l ? 0 : 3) elsif f.is_a?(RPG::EquipItem) discard_equip(f) $game_troop.state_deflect_item_type.push(l ? 1 : 4) end else $game_troop.state_deflect_item_type.push(l ? 2 : 5) end return true end end}} false end end class Game_Troop < Game_Unit attr_accessor :state_deflect_state_name attr_accessor :state_deflect_item attr_accessor :state_deflect_item_type #-------------------------------------------------------------------------- # クリア #-------------------------------------------------------------------------- alias clear_st_state_deflect clear def clear clear_st_state_deflect @state_deflect_state_name = [] @state_deflect_item = [] @state_deflect_item_type = [] end end class Game_ActionResult #-------------------------------------------------------------------------- # 命中系フラグのクリア #-------------------------------------------------------------------------- alias clear_hit_flags_st_state_deflect clear_hit_flags def clear_hit_flags clear_hit_flags_st_state_deflect $game_troop.state_deflect_state_name = [] $game_troop.state_deflect_item = [] $game_troop.state_deflect_item_type = [] end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # 失敗の表示 #-------------------------------------------------------------------------- alias display_failure_st_state_deflect display_failure def display_failure(target, item) display_failure_st_state_deflect(target, item) number = 0 revived = false $game_troop.state_deflect_state_name.each_with_index {|name,i| d = $game_troop.state_deflect_item_type[i] if revived == false && d >= 3 && d <= 5 data = sprintf(StaDifState::ST_D2, target.name, name) revived = true elsif d >= 0 && d <= 2 data = sprintf(StaDifState::ST_D1, target.name, name) end i == 0 ? add_text(data) : replace_text(data) wait di = $game_troop.state_deflect_item[i] dt = $game_troop.state_deflect_item_type[i] if di != 0 if dt == 0 or dt == 3 target.remove_state(di.id) replace_text(target.name + di.message4) unless di.message4.empty? elsif dt == 1 or dt == 4 data = sprintf(StaDifState::ST_D_IB, di.name) replace_text(data) end wait end} end end class RPG::BaseItem #-------------------------------------------------------------------------- # ステート身代わり #-------------------------------------------------------------------------- def substitute_diffence_state @substitute_diffence_state ||= create_substitute_diffence_state end #-------------------------------------------------------------------------- # ステート身代わりデータ作成 #-------------------------------------------------------------------------- def create_substitute_diffence_state array = [] note.each_line {|l| t = /<#{StaDifState::Word}[::](\S+)>/ =~ l ? $1.to_s : "" a = t.split(/\s*,\s*/).inject([]) {|r,i| r.push(i)} case a.size when 2;a.push("0") when 3 else;next end array.push(a)} array end end