「ワールドピース&ピース」リメイク計画6

この記事執筆時点では「シミュレーションバトル」の基本的な動きの部分を作り終え、次は「プログレッションバトル」の基本制作に入っています。

制作中の画面(シミュレーションバトル)
制作中の画面(プログレッションバトル)

オリジナル版ではマップのその場でシームレスに戦うバトルでしたが、リメイク版ではフロントビュータイプにしようかなと思っています。正直大量のスプライトアニメーションが用意できればシームレスでもよかったのですが、さすがに時間も手間も限られているため、フロントビュータイプの方がよさそうです。

あとプログレッションバトルに登場するキャラが、主人公トレスを除き人外(?)なので、まあ見栄えを出すのも難しかったり…

さてところでせっかくなので、MZユーザーに役に立ちそうな豆知識でも共有しようかと思います。もっと良いやり方があるという可能性ももちろんあると思いますが、一つの参考になればと思い記事を執筆しました。何かのヒント等になりましたら幸いです。

「変数の操作」のスクリプトを扱いをラクにする

エディタで値を操作する「ゲーム変数($gameVariables)」に「スクリプト」というコマンドがあります。あれはエディタでは操作できない(=設定されていない)様々なパラメータを自在に扱えるたいへん便利なものですが、ちょっと扱いが面倒くさいですよね。入力欄も小さいし、何より「スクリプト」の多用はゲームの動作性・制作管理性を考えても、別の方法をとってみたいところ。

「ワールドピース&ピース」では少し挙動を書き換えて、分かり易い形にしています。

rmmz_objects.js v1.7.0  

//元の処理を保持
    const _Game_Interpreter_command122 = Game_Interpreter.prototype.command122;

//イベントエディタのコマンド122(変数の操作)の挙動を少し変える
    Game_Interpreter.prototype.command122 = function(params) {

        if (params[3] === 4) {//オペランドが「スクリプト」であれば
            const value = this.command122_getEvalValue(params[4]);//「スクリプト」に記述された文字列(キーワード)を取得し値を返す
            const startId = params[0];//操作するゲーム変数の開始ID
            const endId = params[1];//操作するゲーム変数の終了ID
            const operationType = params[2];//「操作」を取得(代入なのか加算なのかなど)
            for (let i = startId; i <= endId; i++) {
                this.operateVariable(i, operationType, value);
            }
            return true;
        } else {

            //オペランドが「スクリプト」でなければ、元の処理を呼ぶ
            return _Game_Interpreter_command122.call(this, params);
        }
    };

//新しく以下を作成    
Game_Interpreter.prototype.command122_getEvalValue = function(script) {
        switch (script) {//「script(キーワード)」で分岐
            case "変数102のアクターの武器のアニメIDを取得"://キーワードが「変数102のアクターの武器のアニメIDを取得」であれば

//本来「スクリプト」で書いていた内容を実行
//この場合だと「ゲーム変数102に格納された番号のアクターが装備している武器の戦闘アニメIDを取得、ただしもし装備していなかったらID40を返す」という内容
                const weaponId =                            $gameActors.actor($gameVariables.value(102))._equips[0]._itemId;
                return weaponId === 0 ? 40 : $dataWeapons[weaponId].animationId;

            //設定がない場合は元の処理を呼ぶ
            default:
                return eval(script);
        }
    }

あとはこのように書けば、本来「スクリプト」一行で長々書いていたものと同じ処理を実行できます(ここでは分かり易く日本文で指定)。それ以外にも色々メリットがあります。

【メリット1】eval()を使わない

eval()は「テキストをjavascriptとして評価する」という内容で、まあ要するに文字列をいったん解釈してウンタラカンタラする比較的重めな作業が発生するので、頻繁に呼び出す処理なら、あらかじめ式を作っていた方がよいのですね(使ってはいけないという話ではありませんが…)

【メリット2】書き方次第で色々ラクできる

取得した時点では単なる「テキスト(文字列)」なので、文字列を扱う「startsWith()」や「replace()」、あるいは正規表現を使う事で管理が楽になったりします。「スクリプトコマンド(上級のところにあるやつ)」を書くほどではない、でも気軽にゲーム変数に色々な値を代入したいという時に便利ですね。

【メリット3】使いまわしができる

もちろん本当にガッツリ使いまわす気ならプラグインコマンドでも作った方がよいですが、処理を直接記述しているわけではなく、あくまでキーワードを書いてそれに対応した処理を呼び出しているだけなので、気軽に使いまわせるのも利点です。


以上です。

このやり方は「条件分岐のスクリプト」「移動ルートの設定のスクリプト」「スクリプト(上級)」でも応用ができます。どれもテキストを取得し「eval()」で解釈して実行しているためです(コアスクリプトv1.7.0時点)。

僕ももっと勉強して、さらなる知識・技術向上と効率化を目指したいところですね!作品制作も引き続きこつこつ進めていければと思います!

タイトルとURLをコピーしました