「えんこーどあんこーる」プレイ中にRPGツクールMVの問題に遭遇しそれを直した記録

概要

この記事は筆者が「えんこーどあんこーる」というゲームをプレイした際にRPGツクールMVのバグに遭遇および解消して通常通りプレイ可能な状態にした記録である。まず「えんこーどあんこーる」について軽く触れたのち、一つ目に遭遇した問題およびその解決策1について記述している。また対策はそれだけでは不十分(より正確には解決策1にて意図せぬバグが新たに入り込んだ)ため、その変更にて起こった問題2と問題1のみをピンポイントで解消する解決方法2について記述する。終盤では本記事をまとめ、最後に参考文献へのリンクを置くことで締めとしている。

「えんこーどあんこーる」とは

「えんこーどあんこーる」https://www.dlsite.com/maniax/work/=/product_id/RJ01032161.html 
(リンク先はR-18。NSFW)
 とは、しろすらいむ氏(https://twitter.com/whitesuraimu)によるRPGツクールMVと呼ばれる環境を用いて作成されたゲームである。詳しい説明は省くがここではRPGツクールMVを用いて作成されたという部分のみ覚えておいていただければと思う。

遭遇した問題1

 さて、ゲームをプレイ中にBGMは鳴っていてメニューを開く音なども聞こえるが画面が完全に停止してしまうという問題に遭遇した。本現象はゲームを再起動しても頻発し、筆者の環境では2,3分に1回という程度で起きていたためまともにプレイできる状態ではなくなっていた。そこで本現象を解消するための方法を調査した。

解決方法1

 検索エンジンにて問題について調べるとすぐに類似問題についての記事が見つかった。

 上記サイトにて解決方法も提案されており、筆者もそれに倣うこととした。具体的にはRPGアツマール版のコアスクリプトを「えんこーどあんこーる」のゲームに適用した。方法については上記サイトにて紹介されているのでここではその方法については説明を割愛する. 上記サイトにて「RPGアツマール版のコアスクリプト」という項目を各自参照いただきたい。

 さて、これにて無事画面停止することなくゲームを進行できるようになった。が、ゲーム終盤にて別の問題に遭遇することとなる。

遭遇した問題2

 無事ゲームを進行できるようになったが、ゲーム終盤にて特定のトロフィーが取得できないという状態に陥ってしまった。当該トロフィーはプレイヤーの体力が10000を超える必要があるのだがどうやっても9999から上がらなくなってしまった。本ゲームは周回要素があるため、それによって何らかの上限突破が行われるのかとおもい何周もプレイをしたのだが状況が改善しなかった。

解決方法2

 これは流石に何かおかしいと思い、種々原因を考えた。色々調べていった結果、しろすらいむ氏のCi-en記事(https://ci-en.dlsite.com/creator/14503/article/809119)にて気になる記述を発見した。

⇒もしかするとこれ『あんこーる!』の不具合ではなく『ツクールMV』側の数字(最大体力)をいじった影響かもしれませぬ…!

『えんこーどあんこーる!』更新情報・不具合報告・よくあるご質問など[3/8 5:20 更新]

 つまり「えんこーどあんこーる」ではRPGツクールMV側のシステム側に手を出していることになる。そこでふと、筆者はある可能性に気づいた。それは

「問題1を解決するために適用したコアスクリプトによって、本来しろすらいむ氏が変更していたシステム部分が上書きされてしまったのではないか?」

 ということである。この仮説が正しいとすると、元の画面停止が起きるバージョンでセーブデータを開けば元の処理が復元され、正しい値が出る可能性が高い。そこでコアスクリプトを上書きしたバージョンからセーブデータを持ち出し、画面停止問題を解決する前のゲームへと適用すると想定通りプレイヤーの体力が9999を突破した。
 以上のことより、コアスクリプトに変更が加えられていることは分かった。しかし今のままでは問題1の画面停止が起こるままである。ということで筆者のとった解決法は

「コアスクリプト内で画面停止が起こる部分だけをピンポイントで修正する」

 という至極当たり前の手法である。幸い、その手法はすぐに見つかった

 すごくざっくりまとめると、レンダリングを行うかどうかの判定式が間違っているため状況によっては画面が停止する。よって判定式の修正を要するということだ。
 修正するべきコアスクリプトはwww/js/rpg_core.jsの内部だ。もともとレンダリング部分は下記のようなスクリプトになっている

/**
 * Renders the stage to the game screen.
 *
 * @static
 * @method render
 * @param {Stage} stage The stage object to be rendered
 */
Graphics.render = function(stage) {
    if (this._skipCount === 0) {
        var startTime = Date.now();
        if (stage) {
            this._renderer.render(stage);
            if (this._renderer.gl && this._renderer.gl.flush) {
                this._renderer.gl.flush();
            }
        }
        var endTime = Date.now();
        var elapsed = endTime - startTime;
        this._skipCount = Math.min(Math.floor(elapsed / 15), this._maxSkip);
        this._rendered = true;
    } else {
        this._skipCount--;
        this._rendered = false;
    }
    this.frameCount++;
};

 この中の

if (this._skipCount === 0) {

 となっているのがまずい部分だ。これでは_skipCountが0未満の値になった際に完全にレンダリングが止まってしまう。ということでこの部分を以下のように書き換える

if (this._skipCount <= 0) {

 これでスクリプトをセーブし、再びゲームを実行することで問題1、2ともに無事解決することができた。

まとめ

 本記事では「えんこーどあんこーる」をプレイした際に起きた問題とその解決方法について備忘録的に述べた。最終的にはrpg_core.js内のレンダリング判定式を変更することで問題を解決した。当記事が同様または類似の問題で悩んでいる人に届けば僥倖である。

参考サイト


この記事が気に入ったらサポートをしてみませんか?