Fiddlerを使って艦これのバトルJSONを解析(敷波復活編) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5071
結局のところ Feddler 使った諜報ブラウザを作って再び解析。やっぱり夜戦の前とか続行の前とかに「うっかり続行してしまって撃沈」してしまうのもアレなので。いやいや、ゲームとしてはありなんですけどね。
- /kcsapi/api_req_sortie/battle
- /kcsapi/api_req_sortie/battleresult
- /kcsapi/api_get_member/deck
- /kcsapi/api_get_member/ship2
- /kcsapi/api_get_member/ship3
の順番で流れてくるので順番に調べます。以下、メモ的に。
戦闘を開始すると battle が降ってくるので、
“api_dock_id”:1,
“api_ship_ke”:[-1,510,510,510,505,502,502],
“api_ship_lv”:[-1,1,1,1,1,1,1],
“api_nowhps”:[-1,70,77,45,55,29,74,65,65,65,33,22,22],
“api_maxhps”:[-1,75,77,45,55,32,74,65,65,65,33,22,22],
で敵戦艦の種類とHPを取得。バトル自体の順番は、
“api_hougeki1”:{
“api_at_list”:[-1,2,1,12,6,7,4,5,3],
“api_at_type”:[-1,0,0,0,0,0,0,0,0],
“api_df_list”:[-1,[10],[9],[6],[12],[3],[8],[7],[7]],
“api_si_list”:[-1,7,8,502,7,-1,6,3,-1],
“api_cl_list”:[-1,[2],[1],[0],[1],[1],[1],[2],[1]],
“api_damage”:[-1,[129],[102],[0],[73],[12],[33.1],[28],[65]]
},
“api_hougeki2”:{
“api_at_list”:[-1,1],
“api_at_type”:[-1,0],
“api_df_list”:[-1,[8]],
“api_si_list”:[-1,8],
“api_cl_list”:[-1,[1]],
“api_damage”:[-1,[98]]
},
“api_hougeki3”:null,
“api_raigeki”:null
}
なところで、hougekiX を順番に調べればOK。たぶん、api_at_list のところが味方&敵の攻撃&防御の順番と思う。このあたりはあとで動画キャプチャを利用して突合せ。
戦闘が終わると battleresult が降ってくるので、これで結果をチェック。艦娘の経験値などは
“api_win_rank”:”S”,
“api_get_exp”:60,
“api_mvp”:1,
“api_member_lv”:54,
“api_member_exp”:146241,
“api_get_base_exp”:120,
“api_get_ship_exp”:[-1,432,144,144,144,144,144],
“api_get_exp_lvup”:[[390850,397000],[53943,56100],[41250,43500],[36353,37800],[44292,46500],[5851,6600]],
で取得。
“api_lost_flag”:[-1,0,0,0,0,0,0],
のところは、味方かロスト…だと思う。敵の撃沈がここではわからない?ので、先の api_damage あたりでチェック?
ここで、祥鳳改が「小破」になっているので、
続き deck で艦隊に属している艦娘を調べて、
{
“api_member_id”:41898,
“api_id”:1,
“api_name”:”u524du885bu8266u968a”,
“api_name_id”:”110117909,
“api_mission”:[0,0,0,0],
“api_flagship”:”0″,
“api_ship”:[83,252,278,81,288,675]
},
ここの api_ship は「保持してい艦娘」。保持している祥鳳改は「278」なので、ship2 か ship3 で艦娘IDに直すと、「282」が「祥鳳改」とわかる。
{
“api_id”:278,
“api_sortno”:382,
“api_ship_id”:282,
“api_lv”:29,
“api_exp”:[41394,2106,27],
“api_nowhp”:33,
“api_maxhp”:45,
“api_leng”:1,
“api_slot”:[699,700,475,218,-1],
“api_onslot”:[18,12,12,6,0],
“api_kyouka”:[11,0,6,6,0],
“api_backs”:4,
“api_fuel”:40,
“api_bull”:40,
“api_slotnum”:4,
“api_ndock_time”:4260000,
“api_ndock_item”:[15,28],
“api_srate”:1,
“api_cond”:49,
“api_karyoku”:[11,29],
“api_raisou”:[0,0],
“api_taiku”:[30,39],
“api_soukou”:[31,59],
“api_kaihi”:[37,59],
“api_taisen”:[9,0],
“api_sakuteki”:[47,79],
“api_lucky”:[12,59],
“api_locked”:1
},
小破などは、
“api_nowhp”:33,
“api_maxhp”:45,
を見るのだと思う。ここは後で。ちなみに、弾丸と燃料が
“api_fuel”:40,
“api_bull”:40,
入渠がこれ。
“api_ndock_time”:4260000,
“api_ndock_item”:[15,28],
なので、進撃の選択の場合は ship2 が降ってくるので、これから hp を見ればいいんだけど、夜戦の場合は違うようで、battle の後に「夜戦」の選択になるので、battle の api_damage を見て艦娘の hp を減らさないといけない。
多分、艦娘と敵艦の hp と
“api_ship_ke”:[-1,510,510,510,505,502,502],
“api_ship_lv”:[-1,1,1,1,1,1,1],
“api_nowhps”:[-1,70,77,45,55,29,74,65,65,65,33,22,22],
“api_maxhps”:[-1,75,77,45,55,32,74,65,65,65,33,22,22],
バトルの対応(1から12番まで)があるので、これで hp を引けばいい。
“api_hougeki1”:{
“api_at_list”:[-1,2,1,12,6,7,4,5,3],
“api_at_type”:[-1,0,0,0,0,0,0,0,0],
“api_df_list”:[-1,[10],[9],[6],[12],[3],[8],[7],[7]],
“api_si_list”:[-1,7,8,502,7,-1,6,3,-1],
“api_cl_list”:[-1,[2],[1],[0],[1],[1],[1],[2],[1]],
“api_damage”:[-1,[129],[102],[0],[73],[12],[33.1],[28],[65]]
},
演習の場合もいっしょ。小破、大破などは、maxhp が分かっているので hp と比較して割合だと思う。艦娘の名前は先に現れる ship2 などであらかじめチェックしておけばOK。
Fiddler文字化けしてしまうのですけど対策ってありますかね?
たぶん、Fiddler.Session#GetResponseBodyAsString で文字列をとってきたときに文字コードがあっていないだけなので、#responseBodyBytes でとってきて、自前でバイナリ配列から適当な文字コードに変換すればよいんじゃないでしょうか?
バイト型配列のデータを文字コードを指定して文字列に変換: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/string/getencoding.html
あたりとか。