不思議のすごろくの戦闘同期方法でも考える

相変わらずパソコンが返ってこないので、不思議のすごろくの戦闘シーンでも考えよう。
不思議のすごろくは、一応ソーシャルゲームの要素を持ったゲームにしようと思ってる。
すごろくの構造なんかは全部サーバで生成するし、アイテム購入なんかもそう。
基本的に、クライアント側で処理が完結することは無い。


そこで問題になってくるのが、戦闘シーンだ。

戦闘シーンの問題

戦闘シーンについても、やはりサーバ側で計算して、クライアント側はその結果を再生するってのが主にはなるんだけど。


まだはっきり決めてないんだけど、確実にクライアント側で実行出来るコマンドとして「逃げる」ってのがあって、それ以外にも主にアイテムでいくつかの行動を作りたい。
例えば、「敵全体に500のダメージを与える」とか、「味方を復活させる」とか、そういうの。


こういうのはキャラごとに5フロアに付き一回だけ使える超必殺技みたいのがあって、その必殺技を任意のタイミングでプレーヤーが発動出来る、とかでもいい。


すると、サーバで計算しつつもクライアント側でもある程度コマンド選択が出来るわけで、毎回サーバからとってくると戦闘がひどくもっさりしかねない。
いくつか、アイデアはあるんだけど。

乱数値共有パターン

まず、サーバとクライアントはまったく同一の計算エンジンを持っていて、それぞれの同期のために乱数値を共有するってパターンを思いついた。
乱数生成器自体を両方に実装して、そのシード値を共有するってのでも可。


戦闘が完了するまでに、なんらかのコマンドがあったらクライアントはそのコマンドの結果を逐次クライアント側で処理し、サーバ側と結果の同期をとるために行ったコマンドと、確認用の最終結果をサーバに送って整合性をとるやり方。
これは、一番しっくりくる。


問題はそんなにないようで、乱数値をクライアント側で推測出来る以上、シミュレータみたいのを作られて1ターン1ターンステップ再生しながら、どうしても駄目なところでアイテムを使うとかのプレーは可能になる。
結局、ハックしたやつとハックしてないやつで差は出てしまう。

全部サーバで計算すればいいんだよパターン

毎回コマンド送って、その度にサーバから全戦闘結果をとってくるってのは、一応ありはあり。
とにかく遅さが際立ちそうだけど、コマンドを使った時にアニメーションを挟めば、アニメーション中に通信が終わってシームレスに見えるってこともそれなりにあるだろうと。

気にせずクライアントで戦闘結果計算しちゃえパターン

これはありえない。
本来負けてた戦いを、サーバへのリクエスト値を操作すればあっさり勝ちに出来るとか、ありえない。

気にしながらクライアントで戦闘結果計算しちゃえパターン

クライアントが計算した結果を全部サーバに送るパターン。
実際の計算はクライアントで行うんだけど、その計算が正しいかどうかをサーバはチェックすると。


例えばキャラAが敵Bを攻撃、5000のダメージを与えたってのを1:1:5000みたいなログで出す。
でも攻撃力が300のキャラが一撃で5000のダメージを出す事はありえないわけで、明らかに不正であるとサーバ側でチェックは可能。


これも乱数値共有と同じようにずるは出来る。
攻撃力300のキャラの最大ダメージが900だとして、この900ってのを延々出し続けるっていうのも可能なので、1:1:900をひたすら並べて最良の結果を常にとるとか。
最良の結果出しても負けるような相手には負けるけど、結局ずるしたやつが得するという嫌な結果は出てしまう。


計算結果手動で作るのは大変そうだけど、手動でやると大変なのであってツールを1本作れば余裕そう。

どれがいいかなぁというと

そりゃ、サーバで全部計算するのが一番いいに決まってる。
でもサーバで計算した結果のリプレーをクライアントに送信するって、データ量相当だよなぁと。


うまいことやれる方法があればいいけど、なければPHPJavaScriptで共有出来る乱数生成器を作って、シードを共有するってのでいいのかも。これなら戦闘開始時に一つの値をクライアントに送るだけですむしね。
そうすれば戦闘シーンを先にJavaScriptで組むとかも意味が出てくるし。


ただ、ずるが出来るゲームというか、ずるをしないと損をするゲームってのは嫌だなぁと思っていて、ずる防止策は考えないとな。
乱数生成器を定期的に作り替えるのは当然として、、うーんあとなんか決め手が欲しいなぁ。


ステップ再生でやるくらいしかずるの方法なさそうだし、ステップ再生した場合通常より遥かに時間がかかるはずだから、実行時間での不正チェックはそれなりに意味がありそうだけど。
それならコマンド入力中に戦闘シーンをとめずに、アクティブタイムバトルよろしくコマンド実行中に一切待たない戦闘にしないとね。


まあ、乱数生成器方面を有力案としつつ、却下したクライアントに任せる以外の他の二つの方法も考慮しながら進める感じっすかねぇ。