OSDN Git Service

e1414bb874090bad471af222aeb33e92838391c9
[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 RingTimer[] _ndocTimers = new RingTimer[DockCount];\r
27         private readonly RingTimer[] _kdocTimers = new RingTimer[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 RingTimer();\r
35             for (var i = 0; i < _kdocTimers.Length; i++)\r
36                 _kdocTimers[i] = new RingTimer(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 m = _shipInfo.GetStatus(id).NdockItem;\r
57             _materialInfo.SubMaterial(Material.Fuel, m[0]);\r
58             _materialInfo.SubMaterial(Material.Steal, m[1]);\r
59             if (int.Parse(values["api_highspeed"]) == 0)\r
60                 return;\r
61             _shipInfo.RepairShip(id);\r
62             _materialInfo.SubMaterial(Material.Bucket, 1);\r
63         }\r
64 \r
65         public void InspectSpeedChange(string request)\r
66         {\r
67             var values = HttpUtility.ParseQueryString(request);\r
68             var dock = int.Parse(values["api_ndock_id"]) - 1;\r
69             _shipInfo.RepairShip(_ndoc[dock]);\r
70             _ndoc[dock] = 0;\r
71             _ndocTimers[dock].SetEndTime(0);\r
72             _materialInfo.SubMaterial(Material.Bucket, 1);\r
73         }\r
74 \r
75         public NameAndTimer[] NDock\r
76             => _ndoc.Zip(_ndocTimers,\r
77                     (id, timer) => new NameAndTimer {Name = id == 0 ? "" : _shipInfo.GetStatus(id).Name, Timer = timer}).ToArray();\r
78 \r
79         public bool InNDock(int id) => _ndoc.Any(n => n == id); // 空のドックのidは0\r
80 \r
81         public void InspectKDock(dynamic json)\r
82         {\r
83             foreach (var entry in json)\r
84             {\r
85                 var timer = _kdocTimers[(int)entry.api_id - 1];\r
86                 var complete = (double)entry.api_complete_time;\r
87                 if ((int)complete == 0 && (int)entry.api_created_ship_id != 0)\r
88                     timer.SetEndTime(DateTime.Now.AddHours(-1)); // 過去の時刻を設定する\r
89                 else\r
90                     timer.SetEndTime(complete);\r
91             }\r
92         }\r
93 \r
94         public void InspectCreateShipSpeedChange(string request)\r
95         {\r
96             var values = HttpUtility.ParseQueryString(request);\r
97             var dock = int.Parse(values["api_kdock_id"]) - 1;\r
98             _kdocTimers[dock].SetEndTime(DateTime.Now.AddHours(-1));\r
99         }\r
100 \r
101         public RingTimer[] KDock => _kdocTimers;\r
102     }\r
103 }