OSDN Git Service

特別戦果の合計を表示する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 7 Jun 2015 12:58:37 +0000 (21:58 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 14 Jun 2015 07:38:01 +0000 (16:38 +0900)
KancolleSniffer.Test/SnifferTest.cs
KancolleSniffer/Achievement.cs
KancolleSniffer/ConditionTimer.cs
KancolleSniffer/ExMapInfo.cs [new file with mode: 0644]
KancolleSniffer/ItemInfo.cs
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.cs
KancolleSniffer/Sniffer.cs
KancolleSniffer/Status.cs

index 5666621..e3d21eb 100644 (file)
@@ -288,6 +288,38 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 2-5をクリアしたときの特別戦果を反映する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void ExMapBattleResult()\r
+        {\r
+            var sniffer0 = new Sniffer();\r
+            sniffer0.ExMap.ClearClearStatus();\r
+            SniffLogFile(sniffer0, "eo_001");\r
+            PAssert.That(() => sniffer0.ExMap.Achievement == 100, "ほかのマップの情報なし");\r
+            var sniffer1 = new Sniffer();\r
+            SniffLogFile(sniffer1, "eo_001");\r
+            // すでに3-5をクリアしているので合計で250\r
+            PAssert.That(() => sniffer1.ExMap.Achievement == 250, "ほかのマップの情報あり");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 1-6をクリアしたときの特別戦果を反映する\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void ExMapMapNext()\r
+        {\r
+            var sniffer0 = new Sniffer();\r
+            sniffer0.ExMap.ClearClearStatus();\r
+            SniffLogFile(sniffer0, "eo_002");\r
+            PAssert.That(() => sniffer0.ExMap.Achievement == 75, "ほかのマップの情報なし");\r
+            var sniffer1 = new Sniffer();\r
+            SniffLogFile(sniffer1, "eo_002");\r
+            // 5-5以外クリアしているので合計で400\r
+            PAssert.That(()=> sniffer1.ExMap.Achievement == 400, "ほかのマップの情報あり");\r
+        }\r
+\r
+        /// <summary>\r
         /// 編成で空き番号を使ったローテートを正しく反映する\r
         /// </summary>\r
         [TestMethod]\r
index ef78da9..f3ee13a 100644 (file)
@@ -20,7 +20,7 @@ using System.Collections.Generic;
 \r
 namespace KancolleSniffer\r
 {\r
-    public class Achievement\r
+    public class Achievement : IHaveState\r
     {\r
         private int _current;\r
 \r
index 8e3adb1..821581d 100644 (file)
@@ -20,7 +20,7 @@ using System.Linq;
 \r
 namespace KancolleSniffer\r
 {\r
-    public class ConditionTimer\r
+    public class ConditionTimer : IHaveState\r
     {\r
         private readonly ShipInfo _shipInfo;\r
         private const int Interval = 180;\r
diff --git a/KancolleSniffer/ExMapInfo.cs b/KancolleSniffer/ExMapInfo.cs
new file mode 100644 (file)
index 0000000..9048ea8
--- /dev/null
@@ -0,0 +1,148 @@
+// Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// This program is part of KancolleSniffer.\r
+//\r
+// KancolleSniffer is free software: you can redistribute it and/or modify\r
+// it under the terms of the GNU General Public License as published by\r
+// the Free Software Foundation, either version 3 of the License, or\r
+// (at your option) any later version.\r
+//\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+\r
+namespace KancolleSniffer\r
+{\r
+    public class ExMapInfo : IHaveState\r
+    {\r
+        public class ClearStatus\r
+        {\r
+            public int Map { get; set; }\r
+            public bool Cleared { get; set; }\r
+            public int Rate { get; set; }\r
+        }\r
+\r
+        private readonly Dictionary<int, ClearStatus> _clearStatus =\r
+            new Dictionary<int, ClearStatus>\r
+            {\r
+                {15, new ClearStatus {Map = 15, Cleared = false, Rate = 75}},\r
+                {16, new ClearStatus {Map = 16, Cleared = false, Rate = 75}},\r
+                {25, new ClearStatus {Map = 25, Cleared = false, Rate = 100}},\r
+                {35, new ClearStatus {Map = 35, Cleared = false, Rate = 150}},\r
+                {45, new ClearStatus {Map = 45, Cleared = false, Rate = 180}},\r
+                {55, new ClearStatus {Map = 55, Cleared = false, Rate = 200}}\r
+            };\r
+\r
+        private DateTime _lastReset;\r
+\r
+        private int _currentMap;\r
+\r
+        public bool NeedSave { get; private set; }\r
+\r
+        public void InspectMapInfo(dynamic json)\r
+        {\r
+            foreach (var entry in json)\r
+            {\r
+                var map = (int)entry.api_id;\r
+                if (map % 10 <= 4)\r
+                    continue;\r
+                ClearStatus stat;\r
+                if (!_clearStatus.TryGetValue(map, out stat))\r
+                    _clearStatus.Add(map, stat = new ClearStatus { Map = map});\r
+                var prev = stat.Cleared;\r
+                stat.Cleared = (int)entry.api_cleared == 1;\r
+                if (prev != stat.Cleared)\r
+                    NeedSave = true;\r
+            }\r
+        }\r
+\r
+        public void InspectMapStart(dynamic json)\r
+        {\r
+            InspectMapNext(json);\r
+        }\r
+\r
+        public void InspectMapNext(dynamic json)\r
+        {\r
+            _currentMap = (int)json.api_maparea_id * 10 + (int)json.api_mapinfo_no;\r
+            if (!json.api_get_eo_rate() || json.api_get_eo_rate == 0)\r
+                return;\r
+            ClearStatus stat;\r
+            if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
+                _clearStatus.Add(_currentMap, stat = new ClearStatus{Map = _currentMap});\r
+            stat.Cleared = true;\r
+            stat.Rate = (int)json.api_get_eo_rate;\r
+            NeedSave = true;\r
+        }\r
+\r
+        public void InspectBattleResult(dynamic json)\r
+        {\r
+            if (!json.api_get_exmap_rate())\r
+                return;\r
+            var rate = json.api_get_exmap_rate is string\r
+                ? int.Parse(json.api_get_exmap_rate)\r
+                : (int)json.api_get_exmap_rate;\r
+            if (rate == 0)\r
+                return;\r
+            ClearStatus stat;\r
+            if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
+                _clearStatus.Add(_currentMap, stat = new ClearStatus{Map = _currentMap});\r
+            stat.Cleared = true;\r
+            stat.Rate = rate;\r
+            NeedSave = true;\r
+        }\r
+\r
+        public int Achievement\r
+        {\r
+            get { return _clearStatus.Values.Where(s => s.Cleared).Sum(s => s.Rate); }\r
+        }\r
+\r
+        public void ResetIfNeeded()\r
+        {\r
+            var now = DateTime.Now;\r
+            if (_lastReset.Month == now.Month)\r
+                return;\r
+            _lastReset = now;\r
+            foreach (var e in _clearStatus.Values)\r
+                e.Cleared = false;\r
+        }\r
+\r
+        // テスト用\r
+        public void ClearClearStatus()\r
+        {\r
+            _clearStatus.Clear();\r
+        }\r
+\r
+        public void SaveState(Status status)\r
+        {\r
+            NeedSave = false;\r
+            status.ExMapState = new ExMapState\r
+            {\r
+                ClearStatusList = _clearStatus.Values.ToArray(),\r
+                LastReset = _lastReset\r
+            };\r
+        }\r
+\r
+        public void LoadState(Status status)\r
+        {\r
+            if (status.ExMapState == null)\r
+                return;\r
+            _lastReset = status.ExMapState.LastReset;\r
+            foreach (var s in status.ExMapState.ClearStatusList)\r
+                _clearStatus[s.Map] = s;\r
+        }\r
+\r
+        public class ExMapState\r
+        {\r
+            public ClearStatus[] ClearStatusList { get; set; }\r
+            public DateTime LastReset { get; set; }\r
+        }\r
+    }\r
+}
\ No newline at end of file
index b1aa537..2932935 100644 (file)
@@ -206,7 +206,7 @@ namespace KancolleSniffer
         }\r
     }\r
 \r
-    public class ItemInfo\r
+    public class ItemInfo : IHaveState\r
     {\r
         private int _nowShips, _nowEquips;\r
         private readonly Dictionary<int, ItemSpec> _itemSpecs = new Dictionary<int, ItemSpec>();\r
@@ -433,7 +433,7 @@ namespace KancolleSniffer
             status.MatreialHistory = MaterialHistory;\r
         }\r
 \r
-        public void LoadSate(Status status)\r
+        public void LoadState(Status status)\r
         {\r
             if (status.MatreialHistory != null)\r
                 status.MatreialHistory.CopyTo(MaterialHistory, 0);\r
index b9ed8d7..36c5916 100644 (file)
@@ -78,6 +78,7 @@
     <Compile Include="EquipPanel.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
+    <Compile Include="ExMapInfo.cs" />\r
     <Compile Include="ItemTreeView.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
index 89ea809..e44ab42 100644 (file)
@@ -55,7 +55,8 @@ namespace KancolleSniffer
 \r
             // この時点でAutoScaleDimensions == CurrentAutoScaleDimensionsなので、\r
             // MainForm.Designer.csのAutoScaleDimensionsの6f,12fを使う。\r
-            ShipLabel.ScaleFactor = new SizeF(CurrentAutoScaleDimensions.Width / 6f, CurrentAutoScaleDimensions.Height / 12f);\r
+            ShipLabel.ScaleFactor = new SizeF(CurrentAutoScaleDimensions.Width / 6f,\r
+                CurrentAutoScaleDimensions.Height / 12f);\r
 \r
             SetupFleetClick();\r
             _shipLabels = new ShipLabels();\r
@@ -305,7 +306,9 @@ namespace KancolleSniffer
             if (ac >= 10000)\r
                 ac = 9999;\r
             labelAchievement.Text = ac >= 1000 ? ((int)ac).ToString("D") : ac.ToString("F1");\r
-            toolTipAchievement.SetToolTip(labelAchievement, "今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1"));\r
+            toolTipAchievement.SetToolTip(labelAchievement,\r
+                "今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1") + "\n" +\r
+                "EO " + _sniffer.ExMap.Achievement);\r
             UpdateMaterialHistry();\r
             if (_shipListForm.Visible)\r
                 _shipListForm.UpdateList();\r
@@ -428,7 +431,7 @@ namespace KancolleSniffer
                 return;\r
             panelBattleInfo.BringToFront();\r
             var battle = _sniffer.Battle;\r
-            var color = new[] { DefaultForeColor, DefaultForeColor, Color.Blue, Color.Green, Color.Orange, Color.Red };\r
+            var color = new[] {DefaultForeColor, DefaultForeColor, Color.Blue, Color.Green, Color.Orange, Color.Red};\r
             labelFormation.Text = battle.Formation;\r
             labelEnemyFighterPower.Text = battle.EnemyFighterPower.ToString("D");\r
             labelFighterPower.ForeColor = color[battle.AirControlLevel + 1];\r
@@ -438,7 +441,7 @@ namespace KancolleSniffer
 \r
         private void ShowResultRank()\r
         {\r
-            var result = new[] { "完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E" };\r
+            var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
             labelResultRank.Text = result[(int)_sniffer.Battle.ResultRank];\r
         }\r
 \r
@@ -568,10 +571,12 @@ namespace KancolleSniffer
         {\r
             var category = new[]\r
             {\r
-                labelQuestColor1, labelQuestColor2, labelQuestColor3, labelQuestColor4, labelQuestColor5, labelQuestColor6\r
+                labelQuestColor1, labelQuestColor2, labelQuestColor3, labelQuestColor4, labelQuestColor5,\r
+                labelQuestColor6\r
             };\r
             var name = new[] {labelQuest1, labelQuest2, labelQuest3, labelQuest4, labelQuest5, labelQuest6};\r
-            var progress = new[] {labelProgress1, labelProgress2, labelProgress3, labelProgress4, labelProgress5, labelProgress6};\r
+            var progress = new[]\r
+            {labelProgress1, labelProgress2, labelProgress3, labelProgress4, labelProgress5, labelProgress6};\r
             var color = new[]\r
             {\r
                 Color.FromArgb(60, 141, 76), Color.FromArgb(232, 57, 41), Color.FromArgb(136, 204, 120),\r
index b2f0bb1..e67ab83 100644 (file)
@@ -16,6 +16,7 @@
 // along with this program; if not, see <http://www.gnu.org/licenses/>.\r
 \r
 using System;\r
+using System.Collections.Generic;\r
 using System.Linq;\r
 \r
 namespace KancolleSniffer\r
@@ -34,8 +35,10 @@ namespace KancolleSniffer
         private readonly Achievement _achievement = new Achievement();\r
         private readonly BattleInfo _battleInfo;\r
         private readonly Logger _logger;\r
+        private readonly ExMapInfo _exMapInfo = new ExMapInfo();\r
         private readonly Status _status = new Status();\r
         private bool _saveState;\r
+        private readonly List<IHaveState> _haveState;\r
 \r
         [Flags]\r
         public enum Update\r
@@ -60,26 +63,25 @@ namespace KancolleSniffer
             _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo);\r
             _battleInfo = new BattleInfo(_shipMaster, _shipInfo, _itemInfo);\r
             _logger = new Logger(_shipMaster, _shipInfo, _itemInfo);\r
+            _haveState = new List<IHaveState> {_achievement, _itemInfo, _conditionTimer, _exMapInfo};\r
         }\r
 \r
         private void SaveState()\r
         {\r
             if (!_saveState)\r
                 return;\r
-            if (!_achievement.NeedSave && !_itemInfo.NeedSave && !_conditionTimer.NeedSave)\r
+            if (!_haveState.Any(x=>x.NeedSave))\r
                 return;\r
-            _achievement.SaveState(_status);\r
-            _itemInfo.SaveState(_status);\r
-            _conditionTimer.SaveState(_status);\r
+            foreach (var x in _haveState)\r
+                x.SaveState(_status);\r
             _status.Save();\r
         }\r
 \r
         public void LoadState()\r
         {\r
             _status.Load();\r
-            _achievement.LoadState(_status);\r
-            _itemInfo.LoadSate(_status);\r
-            _conditionTimer.LoadState(_status);\r
+            foreach (var x in _haveState)\r
+                x.LoadState(_status);\r
             _saveState = true;\r
         }\r
 \r
@@ -93,6 +95,7 @@ namespace KancolleSniffer
                 _shipMaster.Inspect(data);\r
                 _missionInfo.InspectMaster(data.api_mst_mission);\r
                 _itemInfo.InspectMaster(data);\r
+                _exMapInfo.ResetIfNeeded();\r
                 return Update.Start;\r
             }\r
             if (!_start)\r
@@ -267,6 +270,7 @@ namespace KancolleSniffer
             if (url.EndsWith("api_req_sortie/battleresult"))\r
             {\r
                 _battleInfo.InspectBattleResult(json);\r
+                _exMapInfo.InspectBattleResult(data);\r
                 _logger.InspectBattleResult(data);\r
                 return Update.Ship;\r
             }\r
@@ -296,11 +300,13 @@ namespace KancolleSniffer
             {\r
                 _shipInfo.StartSortie(request);\r
                 _conditionTimer.InvalidateCond();\r
+                _exMapInfo.InspectMapStart(data);\r
                 _logger.InspectMapStart(data);\r
                 return Update.Timer;\r
             }\r
             if (url.EndsWith("api_req_map/next"))\r
             {\r
+                _exMapInfo.InspectMapNext(data);\r
                 _logger.InspectMapNext(data);\r
                 return Update.None;\r
             }\r
@@ -310,6 +316,11 @@ namespace KancolleSniffer
                 _logger.InspectMissionResult(data);\r
                 return Update.Item;\r
             }\r
+            if (url.EndsWith("api_get_member/mapinfo"))\r
+            {\r
+                _exMapInfo.InspectMapInfo(data);\r
+                return Update.None;\r
+            }\r
             return Update.None;\r
         }\r
 \r
@@ -429,6 +440,11 @@ namespace KancolleSniffer
             get { return _battleInfo; }\r
         }\r
 \r
+        public ExMapInfo ExMap\r
+        {\r
+            get { return _exMapInfo; }\r
+        }\r
+\r
         public void SetLogWriter(Action<string, string, string> writer, Func<DateTime> nowFunc)\r
         {\r
             _logger.SetWriter(writer, nowFunc);\r
index 7604113..ff4797a 100644 (file)
@@ -22,6 +22,13 @@ using Codeplex.Data;
 \r
 namespace KancolleSniffer\r
 {\r
+    public interface IHaveState\r
+    {\r
+        bool NeedSave { get; }\r
+        void SaveState(Status status);\r
+        void LoadState(Status status);\r
+    }\r
+\r
     public class Status\r
     {\r
         // ReSharper disable once AssignNullToNotNullAttribute\r
@@ -34,6 +41,7 @@ namespace KancolleSniffer
         public Achievement Achievement { get; set; }\r
         public MaterialCount[] MatreialHistory { get; set; }\r
         public double CondRegenTime { get; set; }\r
+        public ExMapInfo.ExMapState ExMapState { get; set; }\r
 \r
         public Status()\r
         {\r