# # ステート変化を防止するステート #  (C)2007 TYPE74RX-T # #============================================================================== # ★ 再定義ポイント #------------------------------------------------------------------------------ # class Game_Battler # def add_state #============================================================================== module RPG class State alias rx_rgssb18_initialize initialize def initialize # メソッドを呼び戻す rx_rgssb18_initialize # ★ ステート防御用ステートかどうかの判定 @rx_resist_state = false end #-------------------------------------------------------------------------- # ★ ステート防御用ステートかどうかの判定 #-------------------------------------------------------------------------- def rx_resist_state if @name.include?("-s") @rx_resist_state = true return @rx_resist_state end return @rx_resist_state end #-------------------------------------------------------------------------- # ★ 特殊設定用文字列を取り除いた名前を取得 #-------------------------------------------------------------------------- def name new_name = @name.split(/[\s\-]+/) return new_name[0] end end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias rx_rgssb18_initialize initialize def initialize # メソッドを呼び戻す rx_rgssb18_initialize # ★ ステート防御情報 @rx_resist_states = [] end #-------------------------------------------------------------------------- # ★ ステート防御情報 #-------------------------------------------------------------------------- def rx_resist_states return @rx_resist_states end #-------------------------------------------------------------------------- # ● ステートの付加 # state_id : ステート ID # force : 強制付加フラグ (オートステートの処理で使用) #-------------------------------------------------------------------------- def add_state(state_id, force = false) # 無効なステートの場合 if $data_states[state_id] == nil # メソッド終了 return end # 強制付加ではない場合 unless force # 既存のステートのループ for i in @states # 新しいステートが既存のステートのステート変化 (-) に含まれており、 # そのステートが新しいステートのステート変化 (-) には含まれない場合 # (ex : 戦闘不能のときに毒を付加しようとした場合) if $data_states[i].minus_state_set.include?(state_id) and not $data_states[state_id].minus_state_set.include?(i) # メソッド終了 return end end end # このステートが付加されていない場合 unless state?(state_id) # ステート ID を @states 配列に追加 @states.push(state_id) # オプション [HP 0 の状態とみなす] が有効の場合 if $data_states[state_id].zero_hp # HP を 0 に変更 @hp = 0 end # 全ステートのループ for i in 1...$data_states.size # ステート変化 (+) 処理 if $data_states[state_id].plus_state_set.include?(i) #++++++++++++++++++++++++++++★改造事項++++++++++++++++++++++++++++ # ステート防御するステートなら if $data_states[state_id].rx_resist_state # ステート防御情報をステート防御配列に追加 @rx_resist_states.push(i) else add_state(i) end end # ステート変化 (-) 処理 if $data_states[state_id].minus_state_set.include?(i) # ステート防御するステートなら if $data_states[state_id].rx_resist_state # ステート防御情報をステート防御配列に追加 @rx_resist_states.push(i) else remove_state(i) end end #++++++++++++++++++++++++++★改造ここまで++++++++++++++++++++++++++ end # レーティングの大きい順 (同値の場合は制約の強い順) に並び替え @states.sort! do |a, b| state_a = $data_states[a] state_b = $data_states[b] if state_a.rating > state_b.rating -1 elsif state_a.rating < state_b.rating +1 elsif state_a.restriction > state_b.restriction -1 elsif state_a.restriction < state_b.restriction +1 else a <=> b end end end # 強制付加の場合 if force # 自然解除の最低ターン数を -1 (無効) に設定 @states_turn[state_id] = -1 end # 強制付加ではない場合 unless @states_turn[state_id] == -1 # 自然解除の最低ターン数を設定 @states_turn[state_id] = $data_states[state_id].hold_turn end # 行動不能の場合 unless movable? # アクションをクリア @current_action.clear end # HP および SP の最大値チェック @hp = [@hp, self.maxhp].min @sp = [@sp, self.maxsp].min end #-------------------------------------------------------------------------- # ● ステートの解除 # state_id : ステート ID # force : 強制解除フラグ (オートステートの処理で使用) #-------------------------------------------------------------------------- alias rx_rgssb18_remove_state remove_state def remove_state(state_id, force = false) # メソッドを呼び戻す rx_rgssb18_remove_state(state_id, force) # ★ ステート防御するステートならステート防御情報を #  ステート防御配列から削除 if $data_states[state_id].rx_resist_state for i in $data_states[state_id].plus_state_set @rx_resist_states.delete(i) end end end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● ステート防御判定 # state_id : ステート ID #-------------------------------------------------------------------------- alias rx_rgssb18_state_guard? state_guard? def state_guard?(state_id) # ★ ステート防御配列に指定のステート ID が含まれていれば if @rx_resist_states.include?(state_id) return true end # メソッドを呼び戻す rx_rgssb18_state_guard?(state_id) end end