OSDN Git Service

装備の改修効果が索敵値に正しく反映されていないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / DockInfo.cs
1 // Copyright (C) 2014, 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.Linq;\r
17 \r
18 namespace KancolleSniffer\r
19 {\r
20     public class DockInfo\r
21     {\r
22         public const int DockCount = 4;\r
23         private readonly ShipInfo _shipInfo;\r
24         private readonly MaterialInfo _materialInfo;\r
25         private readonly int[] _ndoc = new int[DockCount];\r
26         private readonly AlarmTimer[] _ndocTimers = new AlarmTimer[DockCount];\r
27         private readonly AlarmTimer[] _kdocTimers = new AlarmTimer[DockCount];\r
28 \r
29         public DockInfo(ShipInfo ship, MaterialInfo material)\r
30         {\r
31             _shipInfo = ship;\r
32             _materialInfo = material;\r
33             for (var i = 0; i < _ndocTimers.Length; i++)\r
34                 _ndocTimers[i] = new AlarmTimer();\r
35             for (var i = 0; i < _kdocTimers.Length; i++)\r
36                 _kdocTimers[i] = new AlarmTimer(0);\r
37         }\r
38 \r
39         public void InspectNDock(dynamic json)\r
40         {\r
41             foreach (var entry in json)\r
42             {\r
43                 var id = (int)entry.api_id - 1;\r
44                 _ndocTimers[id].SetEndTime(entry.api_complete_time);\r
45                 var prev = _ndoc[id];\r
46                 _ndoc[id] = (int)entry.api_ship_id;\r
47                 if (prev != 0 && _ndoc[id] == 0) // 修復完了\r
48                     _shipInfo.RepairShip(prev);\r
49             }\r
50         }\r
51 \r
52         public void InspectNyukyo(string request)\r
53         {\r
54             var values = HttpUtility.ParseQueryString(request);\r
55             var id = int.Parse(values["api_ship_id"]);\r
56             var ship = _shipInfo.GetStatus(id);\r
57             var m = ship.NdockItem;\r
58             _materialInfo.SubMaterial(Material.Fuel, m[0]);\r
59             _materialInfo.SubMaterial(Material.Steal, m[1]);\r
60             if (int.Parse(values["api_highspeed"]) == 1)\r
61             {\r
62                 _shipInfo.RepairShip(id);\r
63                 _materialInfo.SubMaterial(Material.Bucket, 1);\r
64                 return;\r
65             }\r
66             if (ship.RepairTime.CompareTo(TimeSpan.FromMinutes(1)) <= 0)\r
67                 _shipInfo.RepairShip(id);\r
68         }\r
69 \r
70         public void InspectSpeedChange(string request)\r
71         {\r
72             var values = HttpUtility.ParseQueryString(request);\r
73             var dock = int.Parse(values["api_ndock_id"]) - 1;\r
74             _shipInfo.RepairShip(_ndoc[dock]);\r
75             _ndoc[dock] = 0;\r
76             _ndocTimers[dock].SetEndTime(0);\r
77             _materialInfo.SubMaterial(Material.Bucket, 1);\r
78         }\r
79 \r
80         public NameAndTimer[] NDock\r
81             => _ndoc.Zip(_ndocTimers,\r
82                     (id, timer) => new NameAndTimer {Name = id == 0 ? "" : _shipInfo.GetStatus(id).Name, Timer = timer}).ToArray();\r
83 \r
84         public bool InNDock(int id) => _ndoc.Any(n => n == id); // 空のドックのidは0\r
85 \r
86         public void InspectKDock(dynamic json)\r
87         {\r
88             foreach (var entry in json)\r
89             {\r
90                 var timer = _kdocTimers[(int)entry.api_id - 1];\r
91                 var complete = (double)entry.api_complete_time;\r
92                 if ((int)complete == 0 && (int)entry.api_created_ship_id != 0)\r
93                 {\r
94                     timer.Finish();\r
95                 }\r
96                 else\r
97                 {\r
98                     timer.SetEndTime(complete);\r
99                 }\r
100             }\r
101         }\r
102 \r
103         public void InspectCreateShipSpeedChange(string request)\r
104         {\r
105             var values = HttpUtility.ParseQueryString(request);\r
106             var dock = int.Parse(values["api_kdock_id"]) - 1;\r
107             _kdocTimers[dock].Finish();\r
108         }\r
109 \r
110         public AlarmTimer[] KDock => _kdocTimers;\r
111     }\r
112 }