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