【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

アバター
much
記事: 62
登録日時: 2017年11月09日(木) 01:01

【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

投稿記事by much » 2024年1月01日(月) 04:18

自分のターンが回ってきたときに、コマンドを選択するようなプラグインを作りたいと思ったのですが、
下記のように実装して、うまくいきませんでした。
Scene_Battle.startActorCommandSelectionを呼び出すことができないのですがどうすればいいでしょうか?

●作成スクリプト内容
//processTurnを改変して、コマンド選択のメソッドを差し込む

コード: 全て選択

var _alias_bu_battle_manager_process_turn = BattleManager.processTurn;
BattleManager.processTurn = function() {
    var subject = this._subject;
    var action = subject.currentAction();
    if (action) {
        action.prepare();
        if (action.isValid()) {
            this.startAction();
        }
        //アクターのターンになったら、コマンド入力画面を表示する
        else if(subject instanceof Game_Actor && action._item.isNull()){
            Scene_Battle.startActorCommandSelection();
        }
        subject.removeCurrentAction();
    } else {
        subject.onAllActionsEnd();
        this.refreshStatus();
        this._logWindow.displayAutoAffectedStatus(subject);
        this._logWindow.displayCurrentState(subject);
        this._logWindow.displayRegeneration(subject);
        this._subject = this.getNextSubject();
    }
};


●エラー内容

コード: 全て選択

TypeError: Scene_Battle.startActorCommandSelection is not a function
    at Function.BattleManager.processTurn (BattleUpdate.js:21)
    at Function.BattleManager.updateTurn (rpg_managers.js:2434)
    at Function.BattleManager.update (BattleUpdate.js:42)
    at Scene_Battle.updateBattleProcess (rpg_scenes.js:2265)
    at Scene_Battle.update (rpg_scenes.js:2257)
    at Scene_Battle.update (MOG_BattleHud.js:2457)
    at Function.SceneManager.updateScene (rpg_managers.js:2024)
    at Function.SceneManager.updateMain (rpg_managers.js:1983)
    at Function.SceneManager.update (rpg_managers.js:1907)

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

投稿記事by Plasma Dark » 2024年1月01日(月) 10:24

Scene_Battle自体がstartActorCommandSelection関数を持つのではなく、Scene_BattleのprototypeがstartActorCommandSelection関数を持ちます。
Scene_Battle.startActorCommandSelection is not a function は読んでそのまま。そんな関数は存在しない、と言われているわけですね。

ただ、入力ウィンドウに関する処理は戦闘の流れに深く結びついてしまっているので、そのまま startActorCommandSelection を呼び出したとて、お望みの仕様は実現できないように思います。
(おそらく、入力中アクターを表す関数の戻り値がnullのために、呼び出した時点で別のエラーが起きます)

戦闘の流れは非常に複雑なので、改造するにしても仕様の定義をしっかりとしなければ、あっという間に破綻してしまいます。
「ターンが回ってきたとき」とはどういうタイミングであるか、更にコマンド選択をさせてその結果何をするのか、より詳細に言語化しなければ、実装のアプローチを根本から間違えてしまいかねません。

「ターンが回ってきたとき」は、プレイヤーがパーティメンバーの行動コマンドの選択を完了した後、対象となるアクターの行動を処理するタイミングで間違いないでしょうか。
そうであるとして、そこで更に選択したコマンドは何のために使うのでしょう。
アバター
much
記事: 62
登録日時: 2017年11月09日(木) 01:01

Re: 【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

投稿記事by much » 2024年1月04日(木) 17:55

回答ありがとうございます!

>「ターンが回ってきたとき」は、プレイヤーがパーティメンバーの行動コマンドの選択を完了した後、対象となるアクターの行動を処理するタイミングで間違いないでしょうか。
>そうであるとして、そこで更に選択したコマンドは何のために使うのでしょう。

アクターの行動を処理するタイミングで間違いないのですが、

通常の戦闘フローは
1. 「戦闘」「逃走」の選択
2. アクターのコマンドを一括選択
3. update turnで順にアクターのアクションを実行

ですが、
これを
1. 「戦闘」「逃走」の選択
2. update turnで順にアクターのアクションを実行
3. プレイヤーのターンの場合、アクターのコマンドを選択しアクションを実行

という風に改変したいです。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

投稿記事by Plasma Dark » 2024年1月04日(木) 21:05

いわゆるCTBに近いものでしょうか。

砂川さんがCTBプラグインを公開されているので、そちらを試してみても良いかもしれません。
https://newrpg.seesaa.net/article/472859369.html

自分で何とかするとなると、戦闘の流れをまるごと作り変えることになるので、かなりハードルが高いです。
BattleManagerで使う_phaseの整理をして、コマンド選択が終わった後の処理や、キャンセルした際の処理も変える必要があります。
コマンド選択・行動の順序はそれぞれのバトラーの敏捷性をもとにキューを作る感じになるでしょうか。
行動の速度補正に意味を持たせるのであれば、優先度付きのキューを使うなど、考えることが増えます。

何にせよ、元の仕組みをちょっといじれば達成できるという類のものではなさそうです。
アバター
much
記事: 62
登録日時: 2017年11月09日(木) 01:01

Re: 【JavaScriptエラー】自分のターンが回ってきたらコマンドを選択する

投稿記事by much » 2024年1月24日(水) 22:56

確かに!CTBもリアルタイムでコマンド入力ができるのでソース参考になりそうです!ありがとうございます!

“MV:質問” へ戻る