################# 基本コマンドすら使えなくなるステートの作成 ################# # # # 一部コマンドが使えなくなるステートを作成します。 # # # # 一応、すべての行動ができなくなった場合の対処もしていますが、 # # それなら別に「行動できない」ステートで実現した方が早いと思います。 # # まぁ、多くのステートに掛かった結果、一切行動ができなくなることはあるけど。 # # # ############################################################################## module Annex ANTI_ATTACK_STATE = ["ドンアク", "攻撃不可"] # 攻撃不可ステート ANTI_SKILL_STATE = ["スキル封印", "ドンアク"] # スキル不可ステート ANTI_GUARD_STATE = ["特攻"] # 防御不可ステート ANTI_ITEM_STATE = ["道具封印"] # アイテム不可ステート ANTI_STATE_ALL_KILLED_COMMAND = "されるがまま" # 一切の行動が出来ない時のコマンド名 end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ スキルの使用可能判定 # skill_id : スキル ID #-------------------------------------------------------------------------- alias battle_command_sys_skill_can_use? skill_can_use? def skill_can_use?(skill_id) # スキル使用不可ステートの場合はfalse if anti_skill_state? return false end return battle_command_sys_skill_can_use?(skill_id) end #-------------------------------------------------------------------------- # ◎ 追加:攻撃不可能ステートに掛かっているかの確認 #-------------------------------------------------------------------------- def anti_attack_state? return check_state_by_array(Annex::ANTI_ATTACK_STATE) end #-------------------------------------------------------------------------- # ◎ 追加:スキル不可能ステートに掛かっているかの確認 #-------------------------------------------------------------------------- def anti_skill_state? return check_state_by_array(Annex::ANTI_SKILL_STATE) end #-------------------------------------------------------------------------- # ◎ 追加:道具不可能ステートに掛かっているかの確認 #-------------------------------------------------------------------------- def anti_item_state? return check_state_by_array(Annex::ANTI_ITEM_STATE) end #-------------------------------------------------------------------------- # ◎ 追加:防御不可能ステートに掛かっているかの確認 #-------------------------------------------------------------------------- def anti_guard_state? return check_state_by_array(Annex::ANTI_GUARD_STATE) end #-------------------------------------------------------------------------- # ◎ 追加:全行動が不可能になっているかの確認 #-------------------------------------------------------------------------- def all_killed? if not anti_attack_state? return false end if not anti_skill_state? return false end if not anti_item_state? return false end if not anti_guard_state? return false end return true end #-------------------------------------------------------------------------- # ◎ 追加 指定された名前のステートのIDを取得 # state_name : ステート名 #-------------------------------------------------------------------------- def get_state_id(state_name) for i in $data_states next if i == nil if i.name == state_name return (i.id) end end return 0 end #-------------------------------------------------------------------------- # ◎ 追加 指定された名前のステートになっているかの確認 # state_name : ステート名 #-------------------------------------------------------------------------- def state_name?(state_name) id = get_state_id(state_name) return state?(id) end #-------------------------------------------------------------------------- # ◎ 追加:複数のステートのうちどれか一つでも含まれているかの確認 # state_names : ステート名の配列 #-------------------------------------------------------------------------- def check_state_by_array(state_names) # 一つでも含まれていればtrueを返す for name in state_names if state_name?(name) return true end end return false end end #============================================================================== # □ 追加:Window_Battle_Command #============================================================================== class Window_Battle_Command < Window_Command #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize width = 160 s1 = $data_system.words.attack s2 = $data_system.words.skill s3 = $data_system.words.guard s4 = $data_system.words.item commands = [s1, s2, s3, s4] super(width, commands) end #-------------------------------------------------------------------------- # ● コマンドの再設定 # actor : そのコマンドを扱うアクター #-------------------------------------------------------------------------- def reset(actor) # コマンド名を一旦戻す @commands[0] = $data_system.words.attack # すべてのコマンドが使用不可能ならばコマンド名を変更 if actor.all_killed? @commands[0] = Annex::ANTI_STATE_ALL_KILLED_COMMAND end refresh # ステートを確認して、使えない場合文字色をdisabled_colorにする if actor.anti_attack_state? and not actor.all_killed? disable_item(0) end if actor.anti_skill_state? disable_item(1) end if actor.anti_guard_state? disable_item(2) end if actor.anti_item_state? disable_item(3) end end end #============================================================================== # ■ Scene_Menu #============================================================================== class Scene_Menu #-------------------------------------------------------------------------- # ● メイン処理 (再定義) #-------------------------------------------------------------------------- def main # コマンドウィンドウを作成 s1 = $data_system.words.item s2 = $data_system.words.skill s3 = $data_system.words.equip s4 = "ステータス" s5 = "セーブ" s6 = "ゲーム終了" @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) @command_window.index = @menu_index # パーティ人数が 0 人の場合 if $game_party.actors.size == 0 # アイテム、スキル、装備、ステータスを無効化 @command_window.disable_item(0) @command_window.disable_item(1) @command_window.disable_item(2) @command_window.disable_item(3) end # ☆ココから追加 # パーティー全員がアイテム使用不可の場合 if anti_item_state_all? # アイテムを無効化 @command_window.disable_item(0) end # パーティー全員がスキル使用不可の場合 if anti_skill_state_all? # アイテムを無効化 @command_window.disable_item(1) end # ☆ココまで追加 # セーブ禁止の場合 if $game_system.save_disabled # セーブを無効にする @command_window.disable_item(4) end # プレイ時間ウィンドウを作成 @playtime_window = Window_PlayTime.new @playtime_window.x = 0 @playtime_window.y = 224 # 歩数ウィンドウを作成 @steps_window = Window_Steps.new @steps_window.x = 0 @steps_window.y = 320 # ゴールドウィンドウを作成 @gold_window = Window_Gold.new @gold_window.x = 0 @gold_window.y = 416 # ステータスウィンドウを作成 @status_window = Window_MenuStatus.new @status_window.x = 160 @status_window.y = 0 # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @command_window.dispose @playtime_window.dispose @steps_window.dispose @gold_window.dispose @status_window.dispose end #-------------------------------------------------------------------------- # ○ フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias battle_command_sys_update_command update_command def update_command # C ボタンが押された場合 if Input.trigger?(Input::C) # 全員がアイテム使用不可なのにアイテムを使おうとした場合 if @command_window.index == 0 and anti_item_state_all? # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 全員がスキル使用不可なのにアイテムを使おうとした場合 if @command_window.index == 1 and anti_skill_state_all? # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end end battle_command_sys_update_command end #-------------------------------------------------------------------------- # ◎ 追加:パーティー全員がアイテム使用不可か確認 #-------------------------------------------------------------------------- def anti_item_state_all? # 誰か一人でもアイテム使用可能ならばfalseを返す for actor in $game_party.actors return false if not actor.anti_item_state? end return true end #-------------------------------------------------------------------------- # ◎ 追加:パーティー全員がスキル使用不可か確認 #-------------------------------------------------------------------------- def anti_skill_state_all? # 誰か一人でもスキル使用可能ならばfalseを返す for actor in $game_party.actors return false if not actor.anti_skill_state? end return true end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 (再定義) #-------------------------------------------------------------------------- def main # 戦闘用の各種一時データを初期化 $game_temp.in_battle = true $game_temp.battle_turn = 0 $game_temp.battle_event_flags.clear $game_temp.battle_abort = false $game_temp.battle_main_phase = false $game_temp.battleback_name = $game_map.battleback_name $game_temp.forcing_battler = nil # バトルイベント用インタプリタを初期化 $game_system.battle_interpreter.setup(nil, 0) # トループを準備 @troop_id = $game_temp.battle_troop_id $game_troop.setup(@troop_id) # アクターコマンドウィンドウを作成 # ☆ココから変更 @actor_command_window = Window_Battle_Command.new # ☆ココまで変更 @actor_command_window.y = 160 @actor_command_window.back_opacity = 160 @actor_command_window.active = false @actor_command_window.visible = false # その他のウィンドウを作成 @party_command_window = Window_PartyCommand.new @help_window = Window_Help.new @help_window.back_opacity = 160 @help_window.visible = false @status_window = Window_BattleStatus.new @message_window = Window_Message.new # スプライトセットを作成 @spriteset = Spriteset_Battle.new # ウェイトカウントを初期化 @wait_count = 0 # トランジション実行 if $data_system.battle_transition == "" Graphics.transition(20) else Graphics.transition(40, "Graphics/Transitions/" + $data_system.battle_transition) end # プレバトルフェーズ開始 start_phase1 # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # マップをリフレッシュ $game_map.refresh # トランジション準備 Graphics.freeze # ウィンドウを解放 @actor_command_window.dispose @party_command_window.dispose @help_window.dispose @status_window.dispose @message_window.dispose if @skill_window != nil @skill_window.dispose end if @item_window != nil @item_window.dispose end if @result_window != nil @result_window.dispose end # スプライトセットを解放 @spriteset.dispose # タイトル画面に切り替え中の場合 if $scene.is_a?(Scene_Title) # 画面をフェードアウト Graphics.transition Graphics.freeze end # 戦闘テストからゲームオーバー画面以外に切り替え中の場合 if $BTEST and not $scene.is_a?(Scene_Gameover) $scene = nil end end #-------------------------------------------------------------------------- # ○ アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias battle_command_sys_phase3_setup_command_window phase3_setup_command_window def phase3_setup_command_window # リフレッシュ @actor_command_window.reset(@active_battler) # 呼び戻す battle_command_sys_phase3_setup_command_window end #-------------------------------------------------------------------------- # ○ フレーム更新 (アクターコマンドフェーズ : 基本コマンド) #-------------------------------------------------------------------------- alias battle_command_sys_update_phase3_basic_command update_phase3_basic_command def update_phase3_basic_command # C ボタンが押された場合 if Input.trigger?(Input::C) # アクターコマンドウィンドウのカーソル位置で分岐 case @actor_command_window.index when 0 # 攻撃 # 全行動が抑制されている場合は選択可能。 if @active_battler.all_killed? # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アクションを設定 @active_battler.current_action.kind = 0 @active_battler.current_action.basic = 3 # 次のアクターのコマンド入力へ phase3_next_actor else bool = @active_battler.anti_attack_state? end when 1 # スキル bool = @active_battler.anti_skill_state? when 2 # 防御 bool = @active_battler.anti_guard_state? when 3 # アイテム bool = @active_battler.anti_item_state? end if bool == true # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end end # 呼び戻し return battle_command_sys_update_phase3_basic_command end #-------------------------------------------------------------------------- # ○ アイテムアクション 結果作成 #-------------------------------------------------------------------------- alias battle_command_sys_make_item_action_result make_item_action_result def make_item_action_result # 道具使用不可ステートの場合ステップ1に戻る。 if @active_battler.anti_item_state? # ステップ 1 に移行 @phase4_step = 1 return end battle_command_sys_make_item_action_result end #-------------------------------------------------------------------------- # ○ 基本アクション 結果作成 #-------------------------------------------------------------------------- alias battle_command_sys_make_basic_action_result make_basic_action_result def make_basic_action_result # 全コマンド抑制状態の場合 if @active_battler.all_killed? # 強制的に「何もしない」に変更 @active_battler.current_action.basic = 3 end case @active_battler.current_action.basic # 攻撃の場合 when 0 # 攻撃不可ステートに掛かっている場合 if @active_battler.anti_attack_state? # 強制的に何もしないに変更 @active_battler.current_action.basic = 3 end when 1 # スキル if @active_battler.anti_skill_state? # 強制的に何もしないに変更 @active_battler.current_action.basic = 3 end when 2 # 防御 if @active_battler.anti_guard_state? # 強制的に何もしないに変更 @active_battler.current_action.basic = 3 end end # 呼び戻し battle_command_sys_make_basic_action_result end end