OSDN Git Service

Fleetクラスで艦隊編成を行いShipStatusのリストを構築する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Logger.cs
index 9ac3fdf..341b8a0 100644 (file)
 \r
 using System;\r
 using System.Collections.Generic;\r
+using System.Globalization;\r
 using System.IO;\r
 using System.Linq;\r
 using System.Text;\r
+using KancolleSniffer.Model;\r
+using KancolleSniffer.Util;\r
 \r
 namespace KancolleSniffer\r
 {\r
@@ -58,12 +61,17 @@ namespace KancolleSniffer
 \r
         public int MaterialLogInterval\r
         {\r
-            set { _materialLogInterval = value; }\r
+            set => _materialLogInterval = value;\r
         }\r
 \r
         public string OutputDir\r
         {\r
-            set { _writer = new LogWriter(value).Write; }\r
+            set => _writer = new LogWriter(value).Write;\r
+        }\r
+\r
+        public static string FormatDateTime(DateTime date)\r
+        {\r
+            return date.ToString(DateTimeFormat, CultureInfo.InvariantCulture);\r
         }\r
 \r
         public Logger(ShipInfo ship, ItemInfo item, BattleInfo battle)\r
@@ -115,7 +123,7 @@ namespace KancolleSniffer
             if ((_logType & LogType.Mission) != 0)\r
             {\r
                 _writer("遠征報告書",\r
-                    string.Join(",", _nowFunc().ToString(DateTimeFormat),\r
+                    string.Join(",", FormatDateTime(_nowFunc()),\r
                         rstr, json.api_quest_name, string.Join(",", material)),\r
                     "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材");\r
             }\r
@@ -135,12 +143,29 @@ namespace KancolleSniffer
             if ((_logType & LogType.Achivement) != 0 && json.api_get_eo_rate() && (int)json.api_get_eo_rate != 0)\r
             {\r
                 _writer("戦果",\r
-                    _nowFunc().ToString(DateTimeFormat) + "," + _lastExp + "," + (int)json.api_get_eo_rate,\r
+                    FormatDateTime(_nowFunc()) + "," + _lastExp + "," + (int)json.api_get_eo_rate,\r
                     "日付,経験値,EO");\r
             }\r
             _map = json;\r
         }\r
 \r
+        public void InspectClearItemGet(dynamic json)\r
+        {\r
+            if ((_logType & LogType.Achivement) == 0)\r
+                return;\r
+            if (!json.api_bounus())\r
+                return;\r
+            foreach (var entry in json.api_bounus)\r
+            {\r
+                if (entry.api_type != 18)\r
+                    continue;\r
+                _writer("戦果",\r
+                    FormatDateTime(_nowFunc()) + "," + _lastExp + "," + (int)entry.api_count,\r
+                    "日付,経験値,EO");\r
+                break;\r
+            }\r
+        }\r
+\r
         public void InspectBattle(dynamic json)\r
         {\r
             if (_battle != null) // 通常の夜戦は無視する\r
@@ -157,7 +182,7 @@ namespace KancolleSniffer
                     : (int)result.api_get_exmap_rate;\r
                 if (rate != 0)\r
                 {\r
-                    _writer("戦果", _nowFunc().ToString(DateTimeFormat) + "," + _lastExp + "," + rate,\r
+                    _writer("戦果", FormatDateTime(_nowFunc()) + "," + _lastExp + "," + rate,\r
                         "日付,経験値,EO");\r
                 }\r
             }\r
@@ -191,26 +216,26 @@ namespace KancolleSniffer
                 else\r
                     dropName += "+" + itemName;\r
             }\r
-            var fp = _shipInfo.GetFighterPower(BattleInfo.DeckId(_battle));\r
+            var fp = _shipInfo.Fleets[BattleInfo.DeckId(_battle)].FighterPower;\r
             var fpower = fp[0] == fp[1] ? fp[0].ToString() : fp[0] + "~" + fp[1];\r
-            _writer("海戦・ドロップ報告書", string.Join(",", _nowFunc().ToString(DateTimeFormat),\r
-                result.api_quest_name,\r
-                cell, boss,\r
-                result.api_win_rank,\r
-                BattleFormationName((int)_battle.api_formation[2]),\r
-                FormationName(_battle.api_formation[0]),\r
-                FormationName(_battle.api_formation[1]),\r
-                result.api_enemy_info.api_deck_name,\r
-                dropType, dropName,\r
-                string.Join(",", fships),\r
-                string.Join(",", eships),\r
-                fpower, _battleInfo.EnemyFighterPower.AirCombat + _battleInfo.EnemyFighterPower.UnknownMark,\r
-                AirControlLevelName(_battle)),\r
+            _writer("海戦・ドロップ報告書", string.Join(",", FormatDateTime(_nowFunc()),\r
+                    result.api_quest_name,\r
+                    cell, boss,\r
+                    result.api_win_rank,\r
+                    BattleFormationName((int)_battle.api_formation[2]),\r
+                    FormationName(_battle.api_formation[0]),\r
+                    FormationName(_battle.api_formation[1]),\r
+                    result.api_enemy_info.api_deck_name,\r
+                    dropType, dropName,\r
+                    string.Join(",", fships),\r
+                    string.Join(",", eships),\r
+                    fpower, _battleInfo.EnemyFighterPower.AirCombat + _battleInfo.EnemyFighterPower.UnknownMark,\r
+                    AirControlLevelName(_battle)),\r
                 "日付,海域,マス,ボス,ランク,艦隊行動,味方陣形,敵陣形,敵艦隊,ドロップ艦種,ドロップ艦娘," +\r
                 "味方艦1,味方艦1HP,味方艦2,味方艦2HP,味方艦3,味方艦3HP,味方艦4,味方艦4HP,味方艦5,味方艦5HP,味方艦6,味方艦6HP," +\r
                 "敵艦1,敵艦1HP,敵艦2,敵艦2HP,敵艦3,敵艦3HP,敵艦4,敵艦4HP,敵艦5,敵艦5HP,敵艦6,敵艦6HP," +\r
                 "味方制空値,敵制空値,制空状態"\r
-                );\r
+            );\r
             _map = _battle = null;\r
             _start = false;\r
         }\r
@@ -218,67 +243,84 @@ namespace KancolleSniffer
         private IEnumerable<string> GenerateFirendShipList()\r
         {\r
             int deckId = BattleInfo.DeckId(_battle);\r
-            if (_battle.api_nowhps_combined() && (int)_battle.api_nowhps_combined[1] != -1)\r
+            if (_battle.api_f_nowhps_combined())\r
             {\r
-                var main = _shipInfo.GetDeck(0);\r
-                var guard = _shipInfo.GetDeck(1);\r
-                return main.Zip(guard, (m, g) =>\r
+                var mainShips = _shipInfo.Fleets[0].Ships;\r
+                var guardShips = _shipInfo.Fleets[1].Ships;\r
+                return mainShips.Zip(guardShips, (main, guard) =>\r
                 {\r
-                    if (m == -1 && g == -1)\r
+                    if (main.Empty && guard.Empty)\r
                         return ",";\r
                     var name = "";\r
                     var hp = "";\r
-                    if (m != -1)\r
+                    if (!main.Empty)\r
                     {\r
-                        var sm = _shipInfo.GetStatus(m);\r
-                        name = $"{sm.Name}(Lv{sm.Level})";\r
-                        hp = $"{sm.NowHp}/{sm.MaxHp}";\r
+                        name = $"{main.Name}(Lv{main.Level})";\r
+                        hp = $"{main.NowHp}/{main.MaxHp}";\r
                     }\r
                     name += "・";\r
                     hp += "・";\r
-                    if (g != -1)\r
+                    if (!guard.Empty)\r
                     {\r
-                        var sg = _shipInfo.GetStatus(g);\r
-                        name += $"{sg.Name}(Lv{sg.Level})";\r
-                        hp += $"{sg.NowHp}/{sg.MaxHp}";\r
+                        name += $"{guard.Name}(Lv{guard.Level})";\r
+                        hp += $"{guard.NowHp}/{guard.MaxHp}";\r
                     }\r
                     return name + "," + hp;\r
                 }).ToList();\r
             }\r
-            var deck = _shipInfo.GetDeck(deckId);\r
-            return deck.Select(id =>\r
+            var ships = _shipInfo.Fleets[deckId].Ships;\r
+            if (ships.Count > 6)\r
             {\r
-                if (id == -1)\r
+                var result = new List<string>();\r
+                for (var i = 0; i < 12 - ships.Count; i++)\r
+                {\r
+                    var ship = ships[i];\r
+                    result.Add($"{ship.Name}(Lv{ship.Level}),{ship.NowHp}/{ship.MaxHp}");\r
+                }\r
+                for (var i = 0; i < ships.Count - 6; i++)\r
+                {\r
+                    var s1 = ships[12 - ships.Count + i];\r
+                    var s2 = ships[6 + i];\r
+                    result.Add(\r
+                        $"{s1.Name}(Lv{s1.Level})・{s2.Name}(Lv{s2.Level})," +\r
+                        $"{s1.NowHp}/{s1.MaxHp}・{s2.NowHp}/{s2.MaxHp}");\r
+                }\r
+                return result;\r
+            }\r
+            return ships.Select(ship =>\r
+            {\r
+                if (ship.Empty)\r
                     return ",";\r
-                var s = _shipInfo.GetStatus(id);\r
-                return $"{s.Name}(Lv{s.Level}),{s.NowHp}/{s.MaxHp}";\r
+                return $"{ship.Name}(Lv{ship.Level}),{ship.NowHp}/{ship.MaxHp}";\r
             }).ToList();\r
         }\r
 \r
         private IEnumerable<string> GenerateEnemyShipList()\r
         {\r
-            var result = _battleInfo.EnemyResultStatus;\r
-            if (result.Length <= 6)\r
-                return result.Select(s => s.Id == -1 ? "," : $"{s.Name},{s.NowHp}/{s.MaxHp}").ToList();\r
-            var main = result.Take(6);\r
-            var guard = result.Skip(6);\r
-            return main.Zip(guard, (m, g) =>\r
+            var result = _battleInfo.Result.Enemy.Main.Concat(Enumerable.Repeat(new ShipStatus(), 6)).Take(6);\r
+            if (_battleInfo.Result.Enemy.Guard.Length == 0)\r
+            {\r
+                return result.Select(s => s.Empty ? "," : $"{s.Name},{s.NowHp}/{s.MaxHp}").ToList();\r
+            }\r
+            var mainShips = result;\r
+            var guardShips = _battleInfo.Result.Enemy.Guard.Concat(Enumerable.Repeat(new ShipStatus(), 6)).Take(6);\r
+            return mainShips.Zip(guardShips, (main, guard) =>\r
             {\r
-                if (m.Id == -1 && g.Id == -1)\r
+                if (main.Empty && guard.Empty)\r
                     return ",";\r
                 var name = "";\r
                 var hp = "";\r
-                if (m.Id != -1)\r
+                if (!main.Empty)\r
                 {\r
-                    name = $"{m.Name}";\r
-                    hp = $"{m.NowHp}/{m.MaxHp}";\r
+                    name = $"{main.Name}";\r
+                    hp = $"{main.NowHp}/{main.MaxHp}";\r
                 }\r
                 name += "・";\r
                 hp += "・";\r
-                if (g.Id != -1)\r
+                if (!guard.Empty)\r
                 {\r
-                    name += $"{g.Name}";\r
-                    hp += $"{g.NowHp}/{g.MaxHp}";\r
+                    name += $"{guard.Name}";\r
+                    hp += $"{guard.NowHp}/{guard.MaxHp}";\r
                 }\r
                 return name + "," + hp;\r
             }).ToList();\r
@@ -300,6 +342,8 @@ namespace KancolleSniffer
                     return "梯形陣";\r
                 case 5:\r
                     return "単横陣";\r
+                case 6:\r
+                    return "警戒陣";\r
                 case 11:\r
                     return "第一警戒航行序列";\r
                 case 12:\r
@@ -370,12 +414,13 @@ namespace KancolleSniffer
             {\r
                 if (_lastDate != DateTime.MinValue)\r
                 {\r
-                    _writer("戦果", _lastDate.ToString(DateTimeFormat) + "," + _lastExp + ",0", "日付,経験値,EO");\r
+                    _writer("戦果", FormatDateTime(_lastDate) + "," + _lastExp + ",0", "日付,経験値,EO");\r
                 }\r
-                _writer("戦果", now.ToString(DateTimeFormat) + "," + exp + ",0", "日付,経験値,EO");\r
+                _writer("戦果", FormatDateTime(now) + "," + exp + ",0", "日付,経験値,EO");\r
                 if (isNewMonth)\r
                 {\r
-                    _endOfMonth = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month), 22, 0, 0);\r
+                    _endOfMonth = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month),\r
+                        22, 0, 0);\r
                     if (_endOfMonth.CompareTo(now) <= 0)\r
                     {\r
                         var days = _endOfMonth.Month == 12\r
@@ -384,8 +429,8 @@ namespace KancolleSniffer
                         _endOfMonth = _endOfMonth.AddDays(days);\r
                     }\r
                 }\r
-                _nextDate = new DateTime(now.Year, now.Month, now.Day, 5, 0, 0);\r
-                if (now.Hour >= 5)\r
+                _nextDate = new DateTime(now.Year, now.Month, now.Day, 2, 0, 0);\r
+                if (now.Hour >= 2)\r
                     _nextDate = _nextDate.AddDays(1);\r
                 if (_nextDate.Day == 1)\r
                     _nextDate = _nextDate.AddDays(1);\r
@@ -400,7 +445,7 @@ namespace KancolleSniffer
                 return;\r
             if (_lastDate != DateTime.MinValue)\r
             {\r
-                _writer("戦果", _lastDate.ToString(DateTimeFormat) + "," + _lastExp + ",0", "日付,経験値,EO");\r
+                _writer("戦果", FormatDateTime(_lastDate) + "," + _lastExp + ",0", "日付,経験値,EO");\r
             }\r
         }\r
 \r
@@ -418,7 +463,7 @@ namespace KancolleSniffer
                 type = spec.TypeName;\r
             }\r
             _writer("開発報告書",\r
-                _nowFunc().ToString(DateTimeFormat) + "," +\r
+                FormatDateTime(_nowFunc()) + "," +\r
                 string.Join(",", name, type,\r
                     values["api_item1"], values["api_item2"], values["api_item3"], values["api_item4"],\r
                     Secretary(), _basic.api_level),\r
@@ -440,7 +485,7 @@ namespace KancolleSniffer
             var ship = _shipInfo.GetSpec((int)kdock.api_created_ship_id);\r
             var avail = ((dynamic[])json).Count(e => (int)e.api_state == 0);\r
             _writer("建造報告書",\r
-                _nowFunc().ToString(DateTimeFormat) + "," +\r
+                FormatDateTime(_nowFunc()) + "," +\r
                 string.Join(",", material.First() >= 1500 ? "大型艦建造" : "通常艦建造",\r
                     ship.Name, ship.ShipTypeName, string.Join(",", material), avail, Secretary(), _basic.api_level),\r
                 "日付,種類,名前,艦種,燃料,弾薬,鋼材,ボーキ,開発資材,空きドック,秘書艦,司令部Lv");\r
@@ -449,7 +494,7 @@ namespace KancolleSniffer
 \r
         private string Secretary()\r
         {\r
-            var ship = _shipInfo.GetShipStatuses(0)[0];\r
+            var ship = _shipInfo.Fleets[0].Ships[0];\r
             return ship.Name + "(" + ship.Level + ")";\r
         }\r
 \r
@@ -469,7 +514,7 @@ namespace KancolleSniffer
         {\r
             _prevTime = now;\r
             _writer("資材ログ",\r
-                now.ToString(DateTimeFormat) + "," +\r
+                FormatDateTime(now) + "," +\r
                 string.Join(",", _currentMaterial),\r
                 "日付,燃料,弾薬,鋼材,ボーキ,高速建造材,高速修復材,開発資材,改修資材");\r
         }\r
@@ -504,11 +549,11 @@ namespace KancolleSniffer
                 diff[i] = _currentMaterial[i] - after[i];\r
             var ship1 = Secretary();\r
             var ship2 = "";\r
-            var ships = _shipInfo.GetShipStatuses(0);\r
-            if (ships.Length >= 2)\r
+            var ships = _shipInfo.Fleets[0].Ships;\r
+            if (!ships[1].Empty)\r
                 ship2 = ships[1].Name + "(" + ships[1].Level + ")";\r
             _writer("改修報告書",\r
-                now.ToString(DateTimeFormat) + "," +\r
+                FormatDateTime(now) + "," +\r
                 string.Join(",", name, level, success, certain, useName, useNum,\r
                     diff[(int)Material.Fuel], diff[(int)Material.Bullet], diff[(int)Material.Steal],\r
                     diff[(int)Material.Bouxite],\r