がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

ブラックジャックを設計してみる:必要性の説明

通信データを暗号化するとか色々ありますが、設計の基本は「状態の遷移方向だけ通信したほうが楽だよ」ってのが根っこにありまして…ってお話。
MMOでの「移動」を例にとってみます。マップは適当に、縦横400とかってしておきます。
現在地点が200,200。勝手にPS2とかをイメージするのはFFXIを未だにやってるからw*1


とりあえず「1秒ごと」に、サーバに通信を入れると仮定します。
一番先に考えつくのは「クライアント(PS2)で現在位置を把握していて、1秒ごとにサーバにpushする通信を流す」方法。
例えば(200,200)->(200,210)->(200,220)->(200,230)、てな感じ。多分これは「垂直に、南に移動している」と予想されますね。
これだと、通信データをちょいと書き換えると容易に「(200,200)->(200,210)->(200,300)->(200,400)」とか出来ます。
勿論サーバ側で「逐一チェック」してもいいんだけど、ちょいとコストが高い。


じゃぁどうするかっていうと「相対情報の通信」。
やっぱり「1秒ごとにサーバにpush」しますが、この場合は(0,+10)->(0,+10)->(0,+10)ってな通信を発生させます。
これだと、サーバ側で「極端な値ははじく」とかで割合とガードがききます。ただまぁ厳密には「極端ではない、ありえる値」の書き換えだと、若干防御に不安がなくもない。


で、そうすると確実なのは「状態遷移の方向」の通信。
やっぱり「1秒ごとにサーバにpush」しますが、この場合は(180)->(180)->(180)ってな通信を発生させます。180は「コンパスで出てくる360°式の角度」です別に他の数値指針でもOK。
こうすると「移動距離はサーバ側がわかっているはず」なので。このデータをクラックして介入しても「おこのみではない方向に動く」程度なので、あんまり悪さが出来ません。


クライアント側、や、その延長線であるCookieにデータがあると「プログラムが作りやすい」とか色々あるんですが。
データはサーバ側に置いておいて、通信では「変化の方向性」だけを通信したほうが、クラックはされにくいし防御はしやすいわけなんですね。


この辺を軽く念頭に置きつつ、「可能な限りPHP側で情報を持つ」プログラムのざっくりした設計を考えてみたいと思います。

*1:…しばらくインしてないんだけどねぇ。再開したいなぁ………