#============================================================================== # RGSS2_SRPG2拡張 行動回数拡張 統合版 # 2011/11/23「味方行動回数増加」と「再行動スキル・アイテム」を統合 機能追加 # C Winter (http://ccwinter.blog.fc2.com/) # # ・SRPG中にステートを付加した場合、反映されるのは次のターン以降 # ・防御は行動回数全消費(その後に別の行動をすると防御が無効になるため) # ・一度でも行動を行えば、移動キャンセルは不可能 #============================================================================== #============================================================================== # ■ 設定項目 #============================================================================== module TSRPG #接触イベント(宝箱など)起動時、0なら行動回数消費無し(移動のみ) #1なら行動回数1消費、2なら行動回数全消費(1か2はデフォルトと同じ) EVENT_TOUCH_MODE = 2 #複数回行動できる敵が全行動スキルを使用した場合、残り行動回数を無くすかどうか #(敵の複数回行動は、移動と行動終了→残り行動回数を消費→移動行動の両方を回復 # となっているので、複数移動回数も無くすことになります。) USE_ACTION_REST = true end class RPG::UsableItem def no_act_action?; return @note =~ /<無行動>/i ? true : false; end def all_act_action?; return @note =~ /<全行動>/i ? true : false; end def not_repair_act_action?; return @note =~ /<行動回復不可>/i ? true : false; end def not_repair_move_action?; return @note =~ /<移動回復不可>/i ? true : false; end def target_not_repair_act; return @note =~ /<対象行動回復不可>/i ? true : false; end def target_not_repair_move; return @note =~ /<対象移動回復不可>/i ? true : false; end def refresh_act; return @note =~ /<行動回復,(\-*\d+)>/i ? $1.to_i : 0; end def refresh_move; return @note =~ /<移動回復,(\-*\d+)>/i ? $1.to_i : 0; end def gain_act; return @note =~ /<行動増加,(\-*\d+),(\-*\d+)>/i ? $~.to_a : 0; end def gain_move; return @note =~ /<移動増加,(\-*\d+),(\-*\d+)>/i ? $~.to_a : 0; end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler def ex_act; return 0; end def ex_move; return 0; end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor def ex_act n = 0 for state in states a = state.note =~ /<行動回数=(\-*\d+)>/i ? $1.to_i : 0 n += a end return n end def ex_move n = 0 for state in states a = state.note =~ /<移動回数=(\-*\d+)>/i ? $1.to_i : 0 n += a end return n end end #============================================================================== # ■ Game_SrpgEvent #============================================================================== class Game_SrpgEvent < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :ex_act_rest # attr_accessor :ex_move_rest # attr_accessor :action_flag #一度でも行動したか(移動キャンセルの判定用) attr_accessor :can_reflesh_act # attr_accessor :can_reflesh_move # #-------------------------------------------------------------------------- # ○ 味方ユニットとしてセット #-------------------------------------------------------------------------- alias ex_act_set_actor set_actor def set_actor(id) ex_act_set_actor(id) @ex_act_rest = unit.ex_act @ex_move_rest = unit.ex_move @action_flag = false @can_reflesh_act = true @can_reflesh_move = true end #-------------------------------------------------------------------------- # ○ 敵ユニットとしてセット #-------------------------------------------------------------------------- alias ex_act_set_enemy set_enemy def set_enemy(id) ex_act_set_enemy(id) @ex_act_rest = unit.ex_act @ex_move_rest = unit.ex_move @action_flag = false @can_reflesh_act = true @can_reflesh_move = true end #-------------------------------------------------------------------------- # ○ ターン切り替え時のリフレッシュ #-------------------------------------------------------------------------- alias ex_act_refresh_turn refresh_turn def refresh_turn @ex_act_rest = unit.ex_act @ex_move_rest = unit.ex_move @action_flag = false @can_reflesh_act = true @can_reflesh_move = true ex_act_refresh_turn end #-------------------------------------------------------------------------- # ○ 移動のキャンセルが可能かどうかを返す #-------------------------------------------------------------------------- alias ex_act_can_move_cancel? can_move_cancel? def can_move_cancel? return false if @action_flag #一度でも行動していれば不可 ex_act_can_move_cancel? end #-------------------------------------------------------------------------- # ○ 移動前の位置に戻す #-------------------------------------------------------------------------- alias ex_act_undo_move undo_move def undo_move if @move_end @move_end = false else @ex_move_rest += 1 end ex_act_undo_move end end #============================================================================== # ■ Scene_Srpg #============================================================================== class Scene_Srpg < Scene_Base #-------------------------------------------------------------------------- # ● 移動先までのルートを作成 #-------------------------------------------------------------------------- alias ex_act_make_move_route make_move_route def make_move_route(x, y) ex_act_make_move_route(x, y) @event.set_last_pos #移動前の座標を記憶 if @event.ex_move_rest > 0 @event.ex_move_rest -= 1 @event.move_end = false end end #-------------------------------------------------------------------------- # ● 行動の実行 #-------------------------------------------------------------------------- alias ex_act_execute_action execute_action def execute_action(x, y) ex_act_execute_action(x, y) @event.action_flag = true obj = @event.unit.action.obj if obj.is_a?(RPG::BaseItem) and obj.no_act_action? @event.ex_act_rest += 1 #<無行動> end if obj.is_a?(RPG::BaseItem) and obj.all_act_action? @event.ex_act_rest = 0 #<全行動> @event.action_rest = 0 if TSRPG::USE_ACTION_REST == true end if obj.is_a?(RPG::BaseItem) and obj.not_repair_act_action? @event.can_reflesh_act = false #<行動回復不可> end if obj.is_a?(RPG::BaseItem) and obj.not_repair_move_action? @event.can_reflesh_move = false #<移動回復不可> end if @event.ex_act_rest > 0 @event.ex_act_rest -= 1 @event.action_end = false end end #-------------------------------------------------------------------------- # ● スキル(アイテム)の実行 #-------------------------------------------------------------------------- alias ex_refresh_act_execute_action_obj execute_action_obj def execute_action_obj(targets) obj = @event.unit.action.obj for event in targets if obj.refresh_act > rand(100) and event.can_reflesh_act event.action_end = false #<行動回復> end if obj.refresh_move > rand(100) and event.can_reflesh_move event.move_end = false #<移動回復> end gain_act_point = obj.gain_act[1].to_i gain_act_rate = obj.gain_act[2].to_i if gain_act_rate > rand(100) and event.can_reflesh_act if event.action_end #<行動増加> event.action_end = false gain_act_point -= 1 end event.ex_act_rest += gain_act_point unless gain_act_point < 0 end gain_move_point = obj.gain_move[1].to_i gain_move_rate = obj.gain_move[2].to_i if gain_move_rate > rand(100) and event.can_reflesh_move if event.move_end #<移動増加> event.move_end = false gain_move_point -= 1 end event.ex_move_rest += gain_move_point unless gain_move_point < 0 end if obj.target_not_repair_act event.can_reflesh_act = false #<対象行動回復不可> end if obj.target_not_repair_move event.can_reflesh_move = false #<対象移動回復不可> end end ex_refresh_act_execute_action_obj(targets) end #-------------------------------------------------------------------------- # ○ 防御の実行 #-------------------------------------------------------------------------- alias ex_act_execute_action_guard execute_action_guard def execute_action_guard @event.ex_act_rest = 0 #残り行動回数を0に @event.can_reflesh_act = false #<行動回復不可> ex_act_execute_action_guard end #-------------------------------------------------------------------------- # ● 再定義 決定ボタンが押されたとき #-------------------------------------------------------------------------- def update_cursor_decide case $game_srpg.scene_state when 0 # ニュートラル event = $game_srpg.alive_unit_xy(@cursor_x, @cursor_y) if event != nil # ユニットがセルにいればユニットコマンドを開く Sound.play_decision @event = event if event.enemy_flag # 対象がエネミーなら移動範囲を表示 make_movable_cell # 移動可能を作成 @effect_cell.clear @spriteset.refresh_area # エリア表示の更新 end change_scene_state(60) # キャラコマンド状態へ移行 else # ユニットのいないセルならメニューを開く Sound.play_decision change_scene_state(50) # メニューコマンド状態へ移行 end when 1 # 移動先セルの決定 if @movable_cell[[@cursor_x, @cursor_y]] != nil and @movable_cell[[@cursor_x, @cursor_y]] != "" Sound.play_decision make_move_route(@cursor_x, @cursor_y) # 移動ルートを作成し、移動開始 @spriteset.clear_flash # エリア表示をクリア # 地形効果をセット @event.unit.set_tile_effect($game_srpg.tile_effect(@cursor_x, @cursor_y)) while(@event.move_route_forcing) # 移動完了までウェイト Graphics.update # ゲーム画面を更新 Input.update # 入力情報を更新 $game_srpg.update # マップを更新 @spriteset.update # スプライトセットを更新 @message_mini_window.update # ミニメッセージウィンドウ更新 end # 移動先に接触起動のイベントがあれば起動 for event in $game_srpg.events_xy(@cursor_x, @cursor_y) if event.trigger == 1 or event.trigger == 2 event.start wait_for_event # イベントが終わるまでウェイト if TSRPG::EVENT_TOUCH_MODE == 1 ###接触イベント @event.action_flag = true @event.action_end = true if @event.ex_act_rest > 0 @event.ex_act_rest -= 1 @event.action_end = false end elsif TSRPG::EVENT_TOUCH_MODE == 2 @event.action_flag = true @event.action_end = true @event.ex_act_rest = 0 @event.can_reflesh_act = false #<行動回復不可> end end end if not @event.action_end # 未行動の場合キャラコマンド状態へ if @event.move_end ###移動終了後かどうかでカーソル位置 change_scene_state(60, 1) else change_scene_state(60, 0) end elsif @event.move_end and @event.action_end change_scene_state(5) # 移動と行動が終わっていれば向き選択 else change_scene_state(0) # ニュートラルへ移行 end else Sound.play_buzzer end when 2..4 # 攻撃位置の決定 if attack?(@cursor_x, @cursor_y) Sound.play_decision obj = @event.unit.action.obj if obj.is_a?(RPG::BaseItem) and obj.for_dead_friend? change_scene_state(54) # 蘇生対象選択状態へ移行 else change_scene_state(70) # シーンの状態を行動確認に変更 end else Sound.play_buzzer end when 5 # 向き変更の決定 if @attack_cell.include?([@cursor_x, @cursor_y]) @spriteset.clear_flash # エリア表示をクリア Sound.play_decision @event.turn_cell(@cursor_x, @cursor_y) if auto_end? and $game_variables[TSRPG::GAME_RESULT] == 0 change_scene_state(51) # ターン終了確認状態へ移行 else change_scene_state(0) # ニュートラルへ移行 end else Sound.play_buzzer end end end end