OSDN Git Service

終了時に直近の提督経験値を記録する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ExMapInfo.cs
1 // Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Collections.Generic;\r
17 using System.Linq;\r
18 \r
19 namespace KancolleSniffer\r
20 {\r
21     public class ExMapInfo : IHaveState\r
22     {\r
23         public class ClearStatus\r
24         {\r
25             public int Map { get; set; }\r
26             public bool Cleared { get; set; }\r
27             public int Rate { get; set; }\r
28         }\r
29 \r
30         private readonly Dictionary<int, ClearStatus> _clearStatus =\r
31             new Dictionary<int, ClearStatus>\r
32             {\r
33                 {15, new ClearStatus {Map = 15, Cleared = false, Rate = 75}},\r
34                 {16, new ClearStatus {Map = 16, Cleared = false, Rate = 75}},\r
35                 {25, new ClearStatus {Map = 25, Cleared = false, Rate = 100}},\r
36                 {35, new ClearStatus {Map = 35, Cleared = false, Rate = 150}},\r
37                 {45, new ClearStatus {Map = 45, Cleared = false, Rate = 180}},\r
38                 {55, new ClearStatus {Map = 55, Cleared = false, Rate = 200}},\r
39                 {65, new ClearStatus {Map = 65, Cleared = false, Rate = 250}}\r
40             };\r
41 \r
42         private DateTime _lastReset;\r
43 \r
44         private int _currentMap;\r
45 \r
46         public bool NeedSave { get; private set; }\r
47 \r
48         public void InspectMapInfo(dynamic json)\r
49         {\r
50             foreach (var entry in json.api_map_info() ? json.api_map_info : json)\r
51             {\r
52                 var map = (int)entry.api_id;\r
53                 if (map % 10 <= 4)\r
54                     continue;\r
55                 ClearStatus stat;\r
56                 if (!_clearStatus.TryGetValue(map, out stat))\r
57                     continue;\r
58                 var prev = stat.Cleared;\r
59                 stat.Cleared = (int)entry.api_cleared == 1;\r
60                 if (prev != stat.Cleared)\r
61                     NeedSave = true;\r
62             }\r
63         }\r
64 \r
65         public void InspectMapStart(dynamic json)\r
66         {\r
67             InspectMapNext(json);\r
68         }\r
69 \r
70         public void InspectMapNext(dynamic json)\r
71         {\r
72             _currentMap = (int)json.api_maparea_id * 10 + (int)json.api_mapinfo_no;\r
73             if (!json.api_get_eo_rate() || json.api_get_eo_rate == 0)\r
74                 return;\r
75             ClearStatus stat;\r
76             if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
77                 _clearStatus.Add(_currentMap, stat = new ClearStatus {Map = _currentMap});\r
78             stat.Cleared = true;\r
79             stat.Rate = (int)json.api_get_eo_rate;\r
80             NeedSave = true;\r
81         }\r
82 \r
83         public void InspectBattleResult(dynamic json)\r
84         {\r
85             if (!json.api_get_exmap_rate())\r
86                 return;\r
87             var rate = json.api_get_exmap_rate is string\r
88                 ? int.Parse(json.api_get_exmap_rate)\r
89                 : (int)json.api_get_exmap_rate;\r
90             if (rate == 0)\r
91                 return;\r
92             ClearStatus stat;\r
93             if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
94                 _clearStatus.Add(_currentMap, stat = new ClearStatus {Map = _currentMap});\r
95             stat.Cleared = true;\r
96             stat.Rate = rate;\r
97             NeedSave = true;\r
98         }\r
99 \r
100         public int Achievement => _clearStatus.Values.Where(s => s.Cleared).Sum(s => s.Rate);\r
101 \r
102         public void ResetIfNeeded()\r
103         {\r
104             var now = DateTime.Now;\r
105             if (_lastReset.Month == now.Month)\r
106                 return;\r
107             _lastReset = now;\r
108             foreach (var e in _clearStatus.Values)\r
109                 e.Cleared = false;\r
110         }\r
111 \r
112         // テスト用\r
113         public void ClearClearStatus()\r
114         {\r
115             _clearStatus.Clear();\r
116         }\r
117 \r
118         public void SaveState(Status status)\r
119         {\r
120             NeedSave = false;\r
121             status.ExMapState = new ExMapState\r
122             {\r
123                 ClearStatusList = _clearStatus.Values.ToList(),\r
124                 LastReset = _lastReset\r
125             };\r
126         }\r
127 \r
128         public void LoadState(Status status)\r
129         {\r
130             if (status.ExMapState == null)\r
131                 return;\r
132             _lastReset = status.ExMapState.LastReset;\r
133             foreach (var s in status.ExMapState.ClearStatusList)\r
134             {\r
135                 if (s.Map == 65)\r
136                     s.Rate = 250;\r
137                 _clearStatus[s.Map] = s;\r
138             }\r
139         }\r
140 \r
141         public class ExMapState\r
142         {\r
143             public List<ClearStatus> ClearStatusList { get; set; }\r
144             public DateTime LastReset { get; set; }\r
145         }\r
146     }\r
147 }