開発環境 Microsoft Visual Studio Express 2013 for Windows Desktop
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 Visual C#/コンソール アプリケーション
プロジェクト名 FiddlerMH2

Program.cs
/*
 * プロジェクト/参照
 * ・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;
            }
        }
    }
}
 
最終更新:2015年05月07日 16:10