2009年5月13日

Mafia Wars: 解析 (全体、戦闘)

右側のタグ一覧で、仕事よりゲームが上(14vs15)に来てしまいましたが、またもや Mafia Wars ネタです。
といっても、今回はいつもの攻略とはちょっと違う視点から見てみます。

ご存知の通り、Mafia Wars はオンラインで他のユーザと仲間になったり戦ったりできます。ということはネットワーク通信して情報をやりとりしているので、それを解析することで何らかの戦略の足しにしようと思います。

解析に使う環境は、以前の RSS リーダの解析記事と同じです。ちなみに、今回解析したのは v1.0 です。

まず、通信の全体像ですが、以下に分けて説明します。
  • 起動時
  • 戦闘時
  • 仲間追加時
まず起動時ですが、6 回のデータがやりとりされます。その内容は
  • サーバ確認
  • チェック
  • ファイトリスト
  • ニュース
  • 仲間リスト
  • チェック
になります。

最初のサーバ確認は普通の GET リクエストで行われるので、普通のブラウザでもできます。
http://mafia.iphone.zynga.com/net/ping.php にアクセスすると OK と表示されると思いますが、これと同じことが行われます。(別に user-agent とかはチェックしてないようです)

ここから後は POST コマンドで実行されるので、ブラウザでは確認できません。
また、データの改竄防止用にチェックサムが付加されているので、そのアルゴリズムを解析しない限り通信をハックしての改造は難しいと思います。あしからず。

次と、最後の「チェック」は同じ内容で、gid, ipid, zid というものを送っています。
gid は恐らく mafia のグループの ID と思われます。
ipid は touch のIDそのまま( iTunes でシリアル番号だかをクリックした時に表示される 32 文字のID)。
zid は Mafia Wars での ID と思われるものです。
これを送るとサーバから以下のものが返ってきます。

{
"status":200,
"message":"OK",
"data":{
"last_purchase_level":"0",
"activity_post_freq":5,
"refresh_freq":5,
"server":{
"time":1242039257},
"versions":{
"user":1,
"jobs":5,
"items":2,
"favors":4,
"properties":4,
"fight_results":3},
"aaron_factor":1,
"setters":{
"favor_points":"120"}}}

見やすいようにインデントをつけて改行してますが、実際には1行で送られてきます。
恐らく time の値がかけ離れていると、時刻が変更されていると判断して、パラメータの回復を止める動き(オフライン時と一緒)をしてるんだと思います。
versions には、各メニューのバージョンが渡ってきているようです。例えば先日 JOB が増えましたが、これはこの項目の jobs を見て、touch 側のが古かったらサーバに取りに行って更新する、という動きをするんだと思います。
面白いのは、aaron_factor とか favor_points とかですね。何に使っているのか分かりませんが、aaron は公式フォーラムにも出てくる、作者の一人と思われる名前なので、何か秘密の機能があるのかもしれません。 favor_points は熱中度みたいな感じでしょうか? どれくらい頻繁にやってるか、とかを見ているようです。ちなみに max=120 のようです。(つまり、やりすぎ? > 俺)

この後は、ファイトリスト、ニュース、仲間リスト、を取得していますが、今回はパトロン探しにも有効な仲間リストに焦点を絞って後ほど説明します。

起動時に取得する情報は以上です。
次に戦闘時の情報ですが、実は戦闘時は通信が行われません。つまり、起動時に取得したファイトリストや仲間リストを元に全ての戦闘が行われる。ということになります。
そして、仲間追加時の通信ですが、これはいたって簡単で、入力した player id をサーバに送り、その結果が返ってくるだけです。


さて、起動時に交わされる情報の仲間リストについて解析しましょう。

仲間リストは 200 人分の my mafia の情報がリストになって(データとしては1行で)送られてきます。
一人一人について以下のパラメータが入っています。
character_id
zphone_user_id
name
cash
level
experience
energy
energy_max
stamina
stamina_max
health_max
group_size
attack
defense
favor_points
character_type
created_at
updated_at
health
fights_won
fights_lost
favor_increment
upgrade_points
upgrade_increment
group_adjust
attack_strength
defense_strength
item
200人分を受信すると書きましたが、含まれている項目の量で3種類に分けられます。
  • 項目がほとんどないメンバー
  • item がないメンバー
  • 全部あるメンバー
項目がほとんどないメンバーは、私が闇雲に登録したメンバーっぽいです。これらのメンバーは名前くらいしか項目がない状態で、my mafia のリストにも現れません。(ですので、私の my mafia のリストは 100 人ちょいです^^;)
item には、所有している武器や物件が全て記載されています。
で、200人のリストの前半の方のメンバーには item が記載されているんですが、途中からは記載されなくなっています。
この差は my mafia のリストでも分かります。よくある fight points の attack, defense ともに 0 のメンバー(このブログでパトロンと呼んでいる人)ですが、この人たちは item パラメータが送られてきていません。
つまり、このパラメータではパトロンかどうかは判断できない、ということになります。^^;

ここから分かることは、よく戦闘時の判断で、仲間の人数以上に武器を持っていても意味がない。とよく言われますが、どうも仲間の人数(group_size)は考慮してないっぽいです。
というのは、上述の通り、戦闘時に通信は行われないので、全てはこの仲間リストの情報だけで決まることになります。で、仲間リストに仲間の人数は含まれていますが、どの武器をいくつ持っているかの情報(item)が全てのメンバーに含まれているわけではないので、考慮しようがないということになります。

v1.1 から fight points が、仲間の人数で算出されるように変更になったことから考えても、恐らく仲間の人数は考慮されてないと断言しても良さそうですね。

それから気になるパラメータとしては、attack_strength, defense_strength です。これらが、あの HIDDEN と表示される secret skills になります。つまり、パケットをキャプチャすれば HIDDEN じゃなくなるってわけです。
実際の戦闘は、fight points (パラメータでは attack, defense)と、これらの attack_strength, defense_strength で判定していると思われます。
(2009/5/26 訂正)
上記の記載で、fight points と secret skills を逆に書いてしまっています。
secret skills が、自分でポイントを割り振っている attack, defense で、fight points が、レベルや所有武器等から計算され、実際の戦闘時の評価に使用される値で attack_strength, defense_strength です。

ちなみに、私のパトロンは、

"level":320,
"attack":1,
"defense":1,
"attack_strength":900,
"defense_strength":900,

となっていました。

以上、だらだらと書いてしまいましたが、とりあえず現状で分かったところをお伝えしました。
また何か分かったら書きたいと思います。

1 件のコメント:

  1. こんな解析方法があるのですね。
    ご苦労様です。
    アイテムでの数値アップは
    武器防具を人数分(700over)揃えようとしたら
    途中からFIGHT POINTSがあがらなくなりました。(V1.1)
    もしかしたらFIGHT結果に表示される構成員の人数
    が501人までなのでそこでリミッターがかかってる
    かもしれません。
    フィーバーをある程度こなし収入が安定するように
    なったらSECRET SKILLSにポイントを振った方が
    FIGHTでも勝てるようになり楽しめそうですね。

    返信削除