さて、続いてパーティーアタックの実装に入る。
FFでは当たり前の世界。うっかり味方にブレイク、ブレクガアタックでござる。
まず、選択ロジックだが、どうやって探すか・・・・
あれだ、データベースのアイテムとかで、全体とか、単体とか指定しているところがあるべ。 きっと、スクリプトでそのパラメーターを判断しているところがあるだよ。
調べるとRPG::UsableItem.scopeがそれだな。 よし、こいつを検索だ。
おりょ、引っかからんよ。
ならば「戦う」とかコマンド実行するところを探してみよう。
これは引っかかった。BattleManagerでバトルの処理を行ってるようだ
↓ここで戦うコマンド入力開始 Scene_Battle.command_fight
↓ここでメニューハンドラーを渡しているようだ Scene_Battle.create_party_command_window
↓ここでアクターコマンドウィンドウの作成しているっぽい Scene_Battle.create_actor_command_window
↓ここで「攻撃」 Scene_Battle.command_attack
↓これで味方選択 Scene_Battle.select_actor_selection
↓これで敵選択 select_enemy_selection
↓となると仮説。Scene_Battleを下のように変更すると、パーティー攻撃しかできなくなるのでは?。 #-------------------------------------------------------------------------- # ● コマンド[攻撃] #-------------------------------------------------------------------------- def command_attack BattleManager.actor.input.set_attack select_actor_selection 味方キャラ選択を追加 #select_enemy_selection ←敵キャラ選択はコメントアウト end
選択は変わったが、実際にバトルが始まるとパーティアタックは行われなかったよ。
もう少し調査してみよう。
↓で敵キャラ決定の処理をしているらしい。 Scene_Battle.on_enemy_ok #-------------------------------------------------------------------------- # ● 敵キャラ[決定] #-------------------------------------------------------------------------- def on_enemy_ok BattleManager.actor.input.target_index = @enemy_window.enemy.index @enemy_window.hide @skill_window.hide @item_window.hide next_command end ※BattleManager.actorはGame_Actor ※BattleManager.actor.input はGame_Action
わかったこと ・アクションはGame_Actionで決定する。 ・敵/味方を選択するウィンドでは敵/味方のIndexしか取得できない。敵か味方かはチェックしてない。
では、Game_Action.@target_indexが実際に操作されるのはどこだ? 調べてみる
↓敵に対するターゲットはここで決定する Game_Action.targets_for_opponents
↓味方に対するターゲットはここで決定する Game_Action.targets_for_friends
↓ここで敵味方を分けているっぽい Game_Action.make_targets
↓となると仮説、以下にすれば戦闘中は味方しか戦えないはず #-------------------------------------------------------------------------- # ● ターゲットの配列作成 #-------------------------------------------------------------------------- def make_targets if !forcing && subject.confusion? [confusion_target] elsif item.for_opponent? #targets_for_opponents←敵の選択判断をコメントアウト targets_for_friends←味方の選択判断を追加 elsif item.for_friend? targets_for_friends else [] end end
と思ったらエラーになった。 なぜだ。targets_for_friendsを調べてみる。 #-------------------------------------------------------------------------- # ● 味方に対するターゲット #-------------------------------------------------------------------------- def targets_for_friends if item.for_user? ← 使用者? [subject] elsif item.for_dead_friend? ← 戦闘不能の味方? if item.for_one? ← 単体? [friends_unit.smooth_dead_target(@target_index)] else friends_unit.dead_members end elsif item.for_friend? ← 味方? if item.for_one? ← 単体? [friends_unit.smooth_target(@target_index)] else ← 全体 friends_unit.alive_members end end end
[elsif item.for_friend?]で味方かどうか調べてる。 味方じゃないと判断したら、この関数はnilを戻すようになっとった。 ↓じゃ、こうすればいいんじゃね。 #-------------------------------------------------------------------------- # ● 味方に対するターゲット #-------------------------------------------------------------------------- def targets_for_friends if item.for_user? [subject] elsif item.for_dead_friend? if item.for_one? [friends_unit.smooth_dead_target(@target_index)] else friends_unit.dead_members end else#if item.for_friend? ← コメントアウト if item.for_one? [friends_unit.smooth_target(@target_index)] else friends_unit.alive_members end end end
想定通り、戦闘中全員味方を攻撃しだした。
ということで、パーティーアタックをするときは・・・・ 1.Window選択で、敵、味方を選べるようにする。 2.選んだあとはGame_Actionに選んだのは味方であるか、敵であるかを記録する。 3.targets_for_opponents/targets_for_friendsでうまいことやる(←なんだよ、それ)
という感じで実装すればよいのだ。
 |