ツクールMVで戦闘システムを拡張してみた話

はいどーもバトルマシーンツミオと申します。
本日はツクールMVで戦闘システムを拡張もとい独自戦闘システムを組み込んでみた話をしてみようと思います。

独自戦闘システムってなに

「独自戦闘システム」と言うと何やら大層ですが、要はデフォルトの戦闘の改造です。
ローグライクプラグインで組み込んだ、マップ上での戦いも独自戦闘と言えば独自戦闘なのですが、今回は「バトルシーン」での戦闘を作ってみたわけです。
要件としては以下のものを考えていました。

・バトルシーンを拡張する
・ツクールのデータベースの機能をなるべく使えるようにする
・他にも元の機能をなるべく活かす
・なるべく戦闘シーン全体をいじれるやつにする
・見た目にはこだわらない

で、これを満たすもので、僕が作れそうかな~と思ったのが「コマンドバトルシステム」でした。

コマンドバトルシステムってなに

僕が想像していたのは、スパロボリンクバトラーから「距離」の概念を除けた+複数のキャラクターが同時に戦う感じのシステムです。
ただしコマンドは順番に実行されるわけではなく、ユーザー(プラグイン利用者であってゲームのプレイヤーのことではない)が実行の順番の計算式をある程度決められたらなーとは漠然と思っていました。
これはある程度成功しまして、デフォルトでは「バトラーの速度/実行するコマンドの順番」となっています。
つまり、複数回行動できるバトラーでも、後ろの方のコマンドについては速度の能力が高くないと連続では動けない感じです(デフォルトの戦闘だと、連続行動するアクターは自分のターンが来たら連続で何回でも動きます)。
まあよくありそうなやつです。

作ろうとしたきっかけ

なんでコマンドバトルシステムを作ろうとしたかと言うと、実は僕はバトルシーンの真面目な改造ってやったことがなかったんですよね。
せいぜいWindowをちょっと追加するだとか、リザルト結果をどうこうするだとか、その程度のものだったんですね。
あまりツクールの戦闘に興味がなかったのも相まって、今まで戦闘周りは放置していたのですが、ご依頼で「こんな戦闘システムは作れないか」というものが何件かありました。
そのたびに「僕では厳しいかもしれない」とお断りしていたので、こりゃもう一回勉強するしかないなということで、今回作成に踏み切ったわけなんですね。
この際、完全に独自のもの(データベースの機能をちょこっと利用するくらい)では戦闘シーンの勉強にならないため、なるべくコアスクリプトを理解しながら進めていけるような形のものを検討し、「コマンドバトルシステム」になったわけです。

ツクールのデータベースの機能を利用する

ツクールで戦闘システムを構築するなら、ツクールのデータベースシステムを利用しない手はありません。
ステートやら武器やらエネミーやらアクターやら基本的なものが揃っているので、基本はこれを利用した方がユーザーに優しいですよね(またユーザーも使うのに慣れているはず)。
というわけで、データベースを利用するのは初めから決めていました。

他にも元の機能をなるべく活かす

「デフォルトと全く違う戦闘を作りたいんだ」ということなら、データベース周り以外は完全に利用しないという手も考えられると思うのですが、そもそも僕はツクールに限らず、RPGの戦闘システムを構築した経験がありませんでした。
なので、今回は勉強の意味も兼ねて、ツクールのデフォルトの戦闘システムを掘り下げて行こうと決めました。
ですがツクールの戦闘って結構複雑なんですよね(戦闘システムが本質的に複雑なのかもしれませんが)。
戦闘に関係するクラスは、ざっと思いついただけでも、以下のようなものがあります。

・BattleManager
・Scene_Battle
・Game_Action
・Game_Battler(Game_Actor、Game_Enemy)
・Sprite_Battler
・Game_Party
・Game_Troop

これらが絡み合うわけですから、そりゃ理解にも時間がかかるわけですね。
今回はこれらの処理を丁寧に追っていったので、コードを書く時間よりも読む時間の方が圧倒的に長かったです(実は今まで「書く時間より読む時間のほうが長い」という感覚がいまいちわからなかったのですが、今回の作成ではっきりと理解できましたw)。
具体的には読む時間8、書く時間2くらいでしょうか。

見た目にはこだわらない

「せっかく独自戦闘を組み込むなら、見た目にこだわらなきゃ」と思うかもしれませんが、僕の目的は「イケてる戦闘画面」を作ることではなく「戦闘処理の流れを把握する」ことでした。
見た目にこだわって、そこに時間を使うのはもったいないと思ったため、今回は見た目は全くこだわっていません。
まあもし次に何か作ることがあれば、見た目にも多少はこだわりたいところですが……。

結局どうなったか

一週間ほど取り組んだ結果、戦闘シーンについての理解は以前より格段に上がったかなと思います。
ただ作成していたとき、例えば「行動回数追加」という機能の存在を知らなかったため、numActions()という存在に気がつくのが遅れ、独自に「行動回数を追加する機能」を作ろうとしてしまいました。
これは完全に今まで真面目に戦闘機能を利用していなかったせですねw
ですが今回いろいろとコードを見て回ったおかげで、ツクールMVの戦闘システムにどんなものがあるのか理解できてきたので、次からはこういった重複は省けるかなーと思います。
また当然ですが戦闘処理の流れ自体も多少はわかってきたので(例えば今まではターゲット決定の流れがいまいち理解できていなかった)、次からは少しはコードが書くのが早くなるかなーと期待しています。

成果物

作ったプラグインはGitHubでひっそりと公開しています。
ただ「作ろうとしたきっかけ」でも書いたように、勉強の側面が強いプラグインとなっているので、実際に運用する場合はどうかなーと思っています(コード自体も書いたり消したり実験したりしまくったのでかなり汚いです)。
あといろんな戦闘プラグインと競合する予感もプンプンしますw
まあ最初はこんなもんですよね……。

苦労した点・こだわった点

全部苦労したと言えば苦労したのですが、特に苦労したのは自動戦闘周りでした。
これのせいでだいぶん時間を取られましたね……。
あとステート周りも複雑で、結構調べるのに骨が折れました。

こだわったのは、「高コストスキルの実装」です。
要は「2コマンド以上分のコマンドを必要とするスキル」です。
これは「ためる」というスキルを実装させることで対応させました。
「ためる」必要があるスキルを使用するとき、必要な回数ためていない場合は自動で「ためる」スキルが使用されます。

もし改修するなら

もし改修するとしたら、以下のような点でしょうか。

・敵ごとに「敵の行動を表示できるようにするかどうか」を設定可能にする
・ステートがはがれるタイミングを他にも加える
・バトラーのコマンド表示をもっとオシャレにする
・バトラーの初期保持コストをメモ欄ではなく、セーブデータとして保持して、変動できるようにする(あるいはレベルで成長する)

実装するかどうかと言うと……ウーン、かなり微妙ですが。

終わりに

今回のプラグイン作成はなかなかいい勉強になったかなーと思っています。
これからも継続的に新しいことに挑戦していきたいですね。
今ちょっと興味があるのがC++です。
ちゅーかサンプルコードがC++で書かれていることが多いので、やっぱり勉強しときたいなあ、という感じです。

ほなそんな感じでまた。
お仕事も募集中です。

フォローする