どういうわけか?
こういうマシュマロ をいただきました。
単純な疑問ですみません。
ツクールで非同期対戦ゲームをご制作されているかと存じますが、どのように作られたのでしょうか?
はたまた、プラグインでそのようなものかあるのでしょうか?
僕の作った非同期対戦ゲームとしては、以下の2作品があります。
今回は質問されている『憎悪の獣の地下ドール』にフォーカスして、その仕組みを解説してみます。
前提
まずは『地下ドール』の概要です。わかっている人は飛ばそう!
『憎悪の獣の地下ドール』とは?
『憎悪の獣の地下ドール』は、2019年1月にゲームアツマールで公開したRPGツクール製ゲームです。公開当初はRPGツクールMVで制作し、2021年にMZに移行しました。 ※注:エンジン移行は地獄なのでおすすめしません。セーブデータの互換性も含めて大変です。
本作の特徴は以下の通りです。
- 50体以上のキャラクター(ドール)から2体を選びパーティを編成
- スキルや能力強化スロットを設定
- 他のプレイヤーが作成したパーティと非同期で対戦
戦闘は完全オートバトルで、プレイヤーは戦闘中に一切の操作をしません。非同期対戦とするためにも、リアルタイムな操作は不要なゲームシステムにしています。
チャンプ戦
本作の目玉機能は『チャンプ戦』です。
- 1人のプレイヤーが「チャンプ」としてサーバーに登録
- 他のプレイヤーは挑戦者としてチャンプに挑む
- チャンプに勝利すると新しいチャンプとなり、他プレイヤーの挑戦を受ける
この仕組みは、2000年頃のCGIゲーム『FF Adventure(Free Fight Adventure)』が元ネタになっています。
本題:チャンプ戦の仕組み
ゲームアツマールのAPI
今は亡きゲームアツマールでは、様々な機能が利用できるAPI機能が提供されていました。地下ドールのチャンプ戦で特に重要だったのが以下の2つです。
共有セーブ
共有セーブ機能は、他のプレイヤーが閲覧可能なデータを保存する仕組みです。
- 保存されるのは共有専用のデータで、通常のセーブデータとは別に保存
- 他プレイヤーはデータの「読み取り」のみ可能で、変更や更新は不可
シグナル
シグナル機能は、ユーザー間で小さなデータをやり取りする仕組みです。イメージとしては、以下のようなデータが保存されます。
2025/01/05 00:13 に Aさんが「●●」を送信 2025/01/04 22:47 に Bさんが「▲▲」を送信 2025/01/04 18:28 に Cさんが「★★」を送信 ...
シグナルには以下の2種類があります。
- グローバルシグナル:全プレイヤーが登録・閲覧可能(例:掲示板のような仕組み)
- ユーザーシグナル:登録は自由だが、閲覧は指定された相手のみ(例:メールのような仕組み)
チャンプ戦を共有セーブとシグナルで実現する
チャンプ戦の仕組みは、これらのAPIを組み合わせて実現しています。
共有セーブで編成データを管理
地下ドールでは各プレイヤーが、自分のパーティ編成を共有用セーブデータとして保存するようにしています。このデータを他プレイヤーが取得することで、その人のパーティ編成を再現することが可能になります。
他にも戦闘開始前のセリフやキャラクターの見た目(イメチェン機能のデータ)なども、共有セーブの中に保存されています。
グローバルシグナルでチャンプを管理
チャンプに勝利したプレイヤーが、勝利のタイミングで「私がチャンプです」というデータをグローバルシグナルに登録しています。これによって、他のプレイヤーは最新のシグナルを取得することで、現在のチャンプが誰なのかを判別できます。
つまり、以下のようになります。
- プレイヤーが共有セーブ機能でパーティ編成を保存
- グローバルシグナルを取得して、現在のチャンプを判定
- チャンプの共有セーブデータを取得して対戦
- 勝利したら、グローバルシグナルに自分がチャンプに勝利したことを登録
実際には勝利数カウントなどのためにもう少し操作をしていますが、大まかな流れはこのようになっています。
現在の地下ドール
上述の仕組みは、2023年6月までのゲームアツマール上で動作していました。しかし、アツマールが終了した現在では、同じAPIを利用することはできません。
これを何とかするため、僕はアツマールの共有セーブとシグナル機能を再現するサーバーを作りました。
- アカウント登録機能
- 共有セーブ
- シグナル(グローバルシグナル・ユーザーシグナル)
などの機能を用意しています。このシステムを僕が借りているサーバーで動かして、プレポタやPLiCy上から呼び出しています。
つまり?
- 地下ドールの非同期機能は、ゲームアツマールのAPI機能を利用していました
- アツマール亡き現在は、アツマールのAPI機能のうち必要な部分を再現したサーバーを自分で作って動かしています
というわけで、非同期対戦機能の実現は、かなりの力技でゴリ押しています……!
なのであまり他の方の役には立たないですね……(◞‸◟)
なお、編成まわりの仕組みなどは過去に以下の記事にまとめています。興味があればご確認ください。
おまけ:サーバーを作らない手段
サーバーを自作・運用するのはコストや管理面で大変です。代替案として、Googleスプレッドシート+GAS を活用する方法もありそうです。
上記プラグインでは、GoogleスプレッドシートとGASを組み合わせ、ランキング機能を実現しています。この方法を応用すれば、サーバーを自前で用意せずに機能を実装できるかもしれません。
まぁ、それがラクなのかどうかというと、別にラクではないと思いますが……><;