開発環境 | Microsoft Visual Studio Express 2013 for Windows Desktop |
実行環境 | Microsoft Windows 8.1 (64bit) |
プロジェクトの種類 | Visual C#/コンソール アプリケーション |
プロジェクト名 | FiddlerMH2 |
/*
* プロジェクト/参照
* ・DynamicJson.dll
*/
using Codeplex.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FiddlerMH2
{
class Program
{
static Dictionary<string, string> unit_mst = new Dictionary<string, string>();
static Dictionary<string, string> equip_mst = new Dictionary<string, string>();
static string map_id;
static int search = 0;
static int research = 0;
static void Main(string[] args)
{
LoadMst(unit_mst, "unit.txt", 2);
LoadMst(equip_mst, "equip.txt", 1);
string logdir = @"20150429_140802";
string[] files = Directory.GetFiles(logdir, "*.log");
foreach (string file in files)
{
Disp(file);
using (StreamReader sr = new StreamReader(file))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] cols = line.Split('\t');
// Response
string res = cols[3];
string jsonstr = res.Substring(res.IndexOf('{'));
dynamic json = DynamicJson.Parse(jsonstr);
foreach (KeyValuePair<string, dynamic> item in json)
{
Parse(item.Value, int.Parse(cols[0]));
}
}
}
}
}
private static void Disp(string format, params object[] arg)
{
DispColor(ConsoleColor.Gray, format, arg);
}
private static void DispColor(ConsoleColor color, string format, params object[] arg)
{
Console.ForegroundColor = color;
Console.WriteLine(format, arg);
Console.ResetColor();
}
private static void LoadMst(Dictionary<string, string> mst, string path, int index)
{
using (StreamReader sr = new StreamReader(path, Encoding.Default))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] cols = line.Split('\t');
mst[cols[0]] = cols[index];
}
}
}
private static string GetUnitName(string unit_no)
{
return unit_mst.ContainsKey(unit_no) ? unit_mst[unit_no] : unit_no;
}
private static string GetEquipName(string equip_no)
{
return equip_mst.ContainsKey(equip_no) ? equip_mst[equip_no] : equip_no;
}
private static void Parse(dynamic value, int sid)
{
string bodystr = value.body;
int rc = (int)value.rc;
dynamic body = DynamicJson.Parse(bodystr);
if (body.IsDefined("command") == false)
{
return;
}
string cmd = body.command;
string[][] data;
{
string[] rec = body.data.Split('\n');
data = new string[rec.Length][];
for (int i = 0; i < rec.Length; i++)
{
data[i] = rec[i].Split(',');
}
}
DispColor(ConsoleColor.DarkGreen, "{0} {1}", sid, cmd);
switch (cmd)
{
case "base_data_load":
{
int r = 0;
int num;
string[] rec;
var unit_list = new Dictionary<long, string[]>();
//
r += 1;
num = int.Parse(data[r++][0]);
for (int i = 0; i < num; i++)
{
rec = data[r++];
long id = long.Parse(rec[0]);
Disp("{0}) id:0x{1:x} no:{2} 経験値:{3} Lv:{4} 士気:{5}",
i + 1, id, GetUnitName(rec[3]), rec[5], rec[6], rec[7]);
Disp("体力:{0}/{1} 燃料:{2}/{3} 弾薬:{4}/{5}",
rec[9], rec[10], rec[11], rec[12], rec[13], rec[14]);
unit_list[id] = rec;
}
//
r += 2;
//
r += 1;
num = int.Parse(data[r++][0]);
for (int i = 0; i < num; i++)
{
r++;
}
//
r += 4;
//
r += 1;
num = int.Parse(data[r++][0]);
r += num;
//
r += 6;
int deck_num = int.Parse(data[r][0]);
{
int unit_num = int.Parse(data[r][1]);
Disp("第{0}部隊:{1}人", 1, unit_num);
for (int i = 0; i < unit_num; i++)
{
long id = long.Parse(data[r][2 + i]);
string[] unit = unit_list[id];
Disp("{0}) id:0x{1:x} no:{2} 士気:{3}",
i + 1, id, GetUnitName(unit[3]), unit[7]);
}
r++;
}
for (int t = 1; t < deck_num; t++)
{
int unit_num = int.Parse(data[r][0]);
Disp("第{0}部隊:{1}人", t + 1, unit_num);
for (int i = 0; i < unit_num; i++)
{
long id = long.Parse(data[r][1 + i]);
string[] unit = unit_list[id];
Disp("{0}) id:0x{1:x} no:{2} 士気:{3}",
i + 1, id, GetUnitName(unit[3]), unit[7]);
}
r++;
}
}
break;
case "do_battle":
{
int pos = 0;
int num;
//
num = int.Parse(data[1][pos++]);
Disp("射撃回数:{0}", num);
for (int i = 0; i < num; i++)
{
Disp("{0}) {1}", i + 1, string.Join(",", data[1], pos, 11));
pos += 11;
}
// ドロップ
string drop_id = data[1][pos + 6];
Disp("{0} {1} {2} 3:0x{3:x} 4:{4} {5}",
data[1][pos + 0], data[1][pos + 1], data[1][pos + 2],
int.Parse(data[1][pos + 3]), data[1][pos + 4], data[1][pos + 5]);
Disp("no:{0} 体力:{1} 燃料:{2} 弾薬:{3}",
GetUnitName(drop_id), data[1][pos + 13], data[1][pos + 15], data[1][pos + 17]);
pos += 30;
//
num = int.Parse(data[1][pos++]);
pos += num;
pos += 6;
//
num = int.Parse(data[1][pos++]);
for (int i = 0; i < num; i++)
{
long id = long.Parse(data[1][pos]);
Disp("{0}) id:0x{1:x} no:{2} 経験値:{3} Lv:{4} 士気:{5}",
i + 1, id, GetUnitName(data[1][pos + 2]),
data[1][pos + 4], data[1][pos + 5], data[1][pos + 6]);
Disp("体力:{0}/{1} 燃料:{2}/{3} 弾薬:{4}/{5}",
data[1][pos + 8], data[1][pos + 9],
data[1][pos + 10], data[1][pos + 11],
data[1][pos + 12], data[1][pos + 13]);
pos += 26;
int n2 = int.Parse(data[1][pos++]);
for (int j = 0; j < n2; j++)
{
Disp("装備{0}:{1}", j + 1, GetEquipName(data[1][pos++]));
}
pos += 6;
}
//
pos += 101;
//
num = int.Parse(data[1][pos++]);
for (int i = 0; i < num; i++)
{
Disp("{0}) {1}", i + 1, data[1][pos++]);
}
//
num = int.Parse(data[1][pos++]);
if (num != 0)
{
num = int.Parse(data[1][pos++]);
for (int i = 0; i < num; i++)
{
Disp("経験値{0}:+{1}", i + 1, data[1][pos++]);
}
using (StreamWriter sw = new StreamWriter("drop.log", true)) // append
{
string[] fld = new string[3];
fld[0] = DateTime.Now.ToString("yyyyMMdd_HHmmss");
fld[1] = map_id;
fld[2] = drop_id;
sw.WriteLine(string.Join(",", fld));
}
}
}
break;
case "do_unit_supply":
{
}
break;
case "equipment_sortie_cost":
{
}
break;
case "fasten_equipment":
{
}
break;
case "get_battle_unit":
{
int pos = 0;
int num;
pos++;
num = int.Parse(data[pos++][0]);
for (int i = 0; i < num; i++)
{
pos++;
}
pos += 2;
pos++;
map_id = data[pos][0];
Disp("map:{0} exp:{1} name:{2}", map_id, data[pos][2], data[pos][4]);
pos++;
pos += 3;
num = int.Parse(data[pos++][0]);
for (int i = 0; i < num; i++)
{
string[] rec = data[pos++];
long id = long.Parse(rec[0]);
Disp("{0}) id:0x{1:x} no:{2} 経験値:{3} Lv:{4} 士気:{5}",
i + 1, id, GetUnitName(rec[2]), rec[4], rec[5], rec[6]);
Disp("体力:{0}/{1} 燃料:{2}/{3} 弾薬:{4}/{5}",
rec[8], rec[9], rec[10], rec[11], rec[12], rec[13]);
}
}
break;
case "get_map":
{
}
break;
case "get_research_table":
{
int a = research / 5;
int b = research % 5;
using (StreamWriter sw = new StreamWriter("research.csv", true))
{
int r = 1;
int num = int.Parse(data[r++][0]);
for (int i = 0; i < num; i++)
{
string equip_no = data[r][0];
string odds = data[r][1];
Disp("{0}) [{1}] [{2}] {3}", i + 1, equip_no, GetEquipName(equip_no), odds);
sw.WriteLine("{0},{1},{2},{3}", a, b, equip_no, odds);
r++;
}
}
research++;
}
break;
case "get_search_table":
{
int a = search / 4;
int b = search % 4;
using (StreamWriter sw = new StreamWriter("search.csv", true))
{
int r = 1;
int num = int.Parse(data[r++][0]);
for (int i = 0; i < num; i++)
{
string equip_no = data[r][0];
string odds = data[r][1];
Disp("{0}) [{1}] [{2}] {3}", i + 1, equip_no, GetEquipName(equip_no), odds);
sw.WriteLine("{0},{1},{2},{3}", a, b, equip_no, odds);
r++;
}
}
search++;
}
break;
case "get_stage_list":
{
Disp("stage:{0}", data[1][0]);
}
break;
case "get_user_item_list":
{
int num = int.Parse(data[1][0]);
for (int i = 0; i < num; i++)
{
int item_id = int.Parse(data[1][1 + i * 2]);
//Disp("{0:x}:{1}", item_id, tbl[1][2 + i * 2]);
}
}
break;
case "load_unit":
{
}
break;
case "user_load":
{
Disp("燃料:{0} 弾薬:{1} 食料:{2} 資金:{3}",
data[1][0], data[1][1], data[1][2], data[1][3]);
Disp("経験値:{0} 最大:{1}人 最大:{2}個",
data[1][7], data[1][15], data[1][16]);
Disp("勝利S:{0} 勝利A:{1} 勝利B:{2} 敗北C:{3}",
data[1][18], data[1][19], data[1][20], data[1][21]);
}
break;
}
}
}
}