見出し画像

ノロワレハウス私家版DQ2β版完成

大前提として、本記事で以下に書いた内容はあくまで趣味の範囲にとどまるものであることを明言しておきます。原作があって、そのアレンジを楽しんだ記録であって、それ以外のナニモノでもありません。もちろん本件について権利なんか主張しませんしできるものでもありません。

昨年末にα版ができまして。

なぜそんなものつくったのかはα版のときの記事を一読いただくとして、その後すっかりいち趣味としてハマってしまいました。α版完成時点でコードの質があまり良くないなと感じていて(詳細後述)、それが気になって正月からそこをゴリゴリ直してるうちに冬休みも明けてしまい、そのままコードの質を上げる作業を続けていました。とりあえず動いてエンディングまでたどり着けると思ってたんですが、今回の作業の間にそうでもないかもしれないバグが見つかったりもしました。そうして今夜、α版完成から1か月弱を経てβと呼べそうなところまでもってこれました。進行不能になるバグはもうない(気がする)し、一部マップで動作が重くなっていた問題も解消したし、全体的にアプリとしての質が上がったような気がします。

画像2

いまは仕事でコード書いたり書かせたりしてますけど、もともとこういうことが楽しくてコードを書き始めたんだよなぁというもうまさに初期衝動というか原初の喜びというか、そういうのに震えてます。世の中にはいろんなプログラマー/コーダーがいますけど、わたしはこうして書いたものがすぐ動いて確認できるやつがいいみたいです。

あ、一応。
公開の予定はないのでなかみが気になる方は個別にわたしに言ってください。

画像1

あぁ、ここから先は完全にわたしの感想だけなので、この先を読むのはDQ2が大好きでかつコーディングも好きな人だけにした方がいいと思います。

原作との違い

今回わざわざ趣味とはいえ不朽の名作を手元でわざわざ作り直して再現するなんて酔狂なことをやったわけですが、やっぱり自分でやるなら自分がまず快適なつくりにしたいしということで、原作(FC/SFCその他)と違うところのうち主なものを(頼まれもしないのに)挙げてみます。

・どうぐはひとりあたり最大12種類x9個まで持てる。
(そのかわりリメイクにあった預かり所は作らなかった)
(α版ではこの仕様はまだなかった)

・戦闘中のメッセージスピードが選択不可、そして速い
(さくさく戦闘したかったので)

・攻撃呪文は敵味方どちらが使っても同じダメージ
(手加減なし、ただし装備品でダメージ軽減は可能)

・マップの画像や戦闘中の視覚効果はツクールVXのものをそのまま使用

・5つの紋章はフラグではなく道具として持つ

・リメイクと比べてもサマルトリアの装備できるものが多い

・てっかめんを追加

・「はかぶさ」不可
(リメイクではもうできなくなってたっけ)

どの変更もまぁ、「再現とはいってもある程度快適にプレイしたい」「とはいえ全くスリルがないのもヤ」というバランスをわたしなりにとろうとした結果です。

VXの本来仕様からの追加・変更

VX自体が、SFCからPS初期くらいの規模でそれくらいの時代(90年代前半)のいわゆる「J-RPG」をつくらせたい感じだなぁと思っていて、それくらいの時代のDQ/FFの両方の要素が入っておりかつどちらかというとDQ寄りというつくりになっているなと思ってます。それを、DQ2のSFCリメイクくらいの感じをターゲットにしていろいろ改造していくという作業でした。以下、特に大きな変更をしたものについて。

・どうぐは個人別で所持

VXはもともとFF式の全員でどうぐを共有するスタイルです。α版ではそれでそのままいったんですが、β版ではそこをそれぞれ個別に持つように改造しました。この改造がいちばん大きかったです。少し後のverのMVでこれをやろうとしていた人の痕跡を見つけてはいたんですがどうなったんでしょうね。

結局わたしは自分でつくっちゃったんですが、これ、ゲーム中様々な状況で発生するどうぐの増減にもすべて矛盾なく対応し切るのが存外大変でした(イベントでもらう、店で買う、装備の着脱etc)。それこそVX側のイベントで「アイテムの増減」なんてやると先頭キャラにしか行かないのでいっぱいになってたら増えた分は無かったことになります。VX本来はどうぐ保持数の上限がそもそもないっぽいし、もともと組み込まれているイベントコマンドでもそのへんがまったくケアされてなくて、VXにもともとあったアイテム関連のイベントコマンドがほぼ全部使えなくなったので、そこは全部自分で書いたスクリプトを static で呼んでいます。どうぐを持っているかどうかの判定も、もともとのイベントの所持判定だと先頭のアクターの分しか判定対象にならないので、所持判定専用のスクリプトを自作して static で呼んで条件分岐する必要がありました。イベントページを足すのでは対応できない場面が多かったです。それに加えてメニュー画面内では「つかう/わたす/すてる」も実装しました。

・ルーラ/キメラのつばさ

α版の記事でも書きましたが、固定始点から固定終点の移動はふつうにイベントコマンド「場所移動」を使うだけですが、始点が「スキルや道具を使った場所」でかつ「いままでに一度でも行ったことがある場所の中から任意で選べる」っていうことで、始点も終点も固定ではないのはVXにはないのでつくりました。ルーラなのかキメラのつばさなのかで後処理(MPを減らすのかどうぐを減らすのか、どうぐを減らすなら誰から減らすのか)をケアしないといけないし、ルーラ対象の街や城に行ったことがあるかのスイッチ管理、それぞれの着地場所の座標、船の有無、船があるなら船の移動先の座標、船の上でルーラしたときの挙動等々、これも実際にやってみると考慮すべき点は多かったです。

・落下/ダメージ床

これはVXのイベントコマンドに少し書き足したらできるやん……とわたしも最初思ったんですよ。でも結論から言うとダメです。特定の座標で発生する落とし穴はそれでもいいんですけど、たとえば塔の外壁から飛び降りる場合、落下が発生する外壁の座標全部にイベントを置く必要があります。さらに同じ座標にどちらの方向から歩いてきたかによって処理が変わります。これを全部やるとどうなるかというと、そのマップがめちゃめちゃ重くなります。ダッシュすると動きがガクガクになってとてもじゃないけどプレイできない状態になります。それこそ 10 fps 以下とか。さらに、場合によっては原因不明で動作しないイベントなんかも出てきてこれはダメだということで、そういうのは全部スクリプトから発生するようにしました。マップごとに落下イベントが発生する座標と移動した向きを保持しておいて(β版からはDataフォルダの下にcsvファイルで持ってます)、落下発生条件が満たされた瞬間マップ側においといた自動実行イベントが動く仕掛けにしています。ちなみにダメージ床もほぼ同じ発想でスクリプトで実装できるので、イベントコマンド使わない軽量化を図れます。

その他上記ほどではないけどそこそこ手をかけて実装したDQ2っぽい機能の数々は以下のとおり。

・戦闘中どうぐとしてつかっても効果がある装備品
・バステ、デバフ、即死のヒット率を属性相性で変動させる
・メタル系には呪文を一切通らなくする
・パルプンテ
・ザオリク
・なかまよび
・乗り物に乗っていても(船)エンカ発生
・のろいの装備の挙動(戦闘中確率スタン・自力解除不可)
・教会(ステートによってできることが変わる「ショップ」)

・ボス戦でのダメージエフェクトの変更
・トヘロス/せいすい
・ろうやのカギはメニューでは見えないけど買える
・ハーゴンの幻の中のパーティーや持ち物の変化は全部リセット
・いのりのゆびわ
・ふくびき
・会話メッセージで1文字ごとに音が出る
・エンディングのスタッフロール

あとまだ何かあったかな。あったような気もします。
上記全部今回自分で書きましたが、一部は似たようなものをすでに書いてる方もおられたようです。説明読んだ感じわたしがやりたいこととは違うっぽかったりして利用はしませんでしたが。エンディングのスタッフロールは逆にスクリプト一切使わずに実装できてしまったのでそれはそれでまたおもしろかったですね。

あぁそれと。α版のときに書きそびれちゃってたんですが、戦闘背景の変更は CACAO SOFT さんが公開されていたRGSS2向けのスクリプトを(少し改変して)利用させていただきました。この中に入ってた仕組みは一部ダメージ床のコーディングにも再利用できたし非常に有用で助かりました。これは自力ではなかなかできそうに無かったし(特に Game_Interpreter を使うところ)、この場を借りて御礼申し上げます。よいものを残しておいていただいて助かりました。

リファクタリング

この際だからしておきたいリファクタリングの話。もちろん私がα版で書いたコードもあまりよくなかったのでそれはそれで直したんですが、RGSS2としてもともとVXに組み込まれていたコード、これも実はあんまり褒められた出来ではないなと思っていて。クラスの設計やメソッドの置き場所は流石にちゃんと考えられてはいるんですが、すごくよくないなと思って今回リファクタリングで徹底的に直したのが「マジックナンバー」です。特に顕著なのが戦闘中のwait処理で、これ全部マジックナンバーで書いちゃってるんですよね。これで何か困るかというと、たとえばアニメーション表示の後の待ち時間を変えたいとか、このメッセージの表示後の待ち時間を変えたいとかなったときに探すのも直すのも大変なんです。なので今回は自分の修正範囲で登場したマジックナンバーは全部定数に書き換えて別ファイルにまとめ直しました。これならどこに書いてあるか瞬時にわかるし修正も簡単です。その他、「精神関係度が1以上なら魔法とみなす」みたいなのもハードコーディングされちゃってたので、スキル種別の判別メソッドとして外に切り出したりしています。そうしておけば、たとえば精神関係度の値によってスキルの種別を変えたいとか、精神関係度が高いほど何か別のものの影響を受けやすいみたいな状況が発生しても対応しやすくなる……はず。

同様に、内部の処理中でスイッチや変数を操作する場合もスイッチや変数の番号を直接指定するのは全廃して全部定数にしています。そうしておけば、何を操作してるのかコードからひとめでわかる……はず。

ただそれでも今回ちょっと心残りなのは、機能ごとにファイルを分けられなかったことですね。これだと機能ごとにスクリプト素材として配布するのは難しいです。まぁVXだしもういまはあんまり需要もないでしょうけど。

戦闘関連やどうぐ関連は特にそうでしたが、複数の機能がどうしても同じクラスの同じメソッドに用がある状態が多発してしまったので、そこを無理やり分けて実行される順番を保証するとかやり始めると収拾がつかないなと思ってやめました。

今後どうしようか(あるの?)

まず、α版の記事でも触れてますが、後日談を勝手に付け加えてみたいというのがひとつあります。せっかくここまで作り込んだからもう少し活かしたいなぁと。貧乏性だし。あとは同じシステムでほかのDQの再現とかする? するかなぁ。まぁいつしたくなってもできる素地は今回でできました。オリジナル作品はちょっとなぁ。おはなし考えるのがヘタだし自分ではあまりやらないかなとは思いますけど。

とにかくまぁ、気晴らしとしても趣味としてもすごく楽しい時間になってよかったです。気が向いたらまた何か作るでしょう。

とりあえずいまは1か月まるまる離れてしまっていた No Man's Sky に戻ろうかな……。

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