OSDN Git Service

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