OSDN Git Service

UAをVersion/10.0.3 Safari/602.4.8に変更
[kcd/KCD.git] / KCD / AnchorageRepairManager.swift
1 //
2 //  AnchorageRepairManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11
12 class AnchorageRepairManager: NSObject {
13     static let `default`: AnchorageRepairManager = AnchorageRepairManager()
14     
15     private let fleetManager: FleetManager
16     private let repairShipTypeIds: [Int] = [19]
17     
18     override init() {
19         fleetManager = AppDelegate.shared.fleetManager
20         super.init()
21         let nc = NotificationCenter.default
22         nc.addObserver(forName: .HenseiDidChange, object: nil, queue: nil) { notification in
23             guard let userInfo = notification.userInfo,
24                 let info = userInfo[ChangeHenseiCommand.userInfoKey] as? HenseiDidChangeUserInfo
25                 else { return }
26             self.resetIfNeeds(info: info)
27         }
28         nc.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) { _ in
29             if Date().timeIntervalSince(self.repairTime) < 20 * 60 { return }
30             self.reset()
31         }
32     }
33     deinit {
34         NotificationCenter.default.removeObserver(self)
35     }
36     
37     private(set) var repairTime: Date {
38         get { return UserDefaults.standard.repairTime }
39         set { UserDefaults.standard.repairTime = newValue }
40     }
41     
42     private func reset() {
43         repairTime = Date()
44     }
45     private func shipTypeId(fleetNumber: Int, position: Int) -> Int? {
46         guard 1...4 ~= fleetNumber,
47              0...5 ~= position
48             else { return nil }
49         let ship = fleetManager.fleets[fleetNumber - 1][position]
50         return ship?.master_ship.stype.id
51     }
52     private func shipTypeId(shipId: Int) -> Int? {
53         return ServerDataStore.default
54             .ship(byId: shipId)?.master_ship.stype.id
55     }
56     private func needsReset(info: HenseiDidChangeUserInfo) -> Bool {
57         // 変更のあった艦隊の旗艦は工作艦か?
58         if let flagShipType = shipTypeId(fleetNumber: info.fleetNumber, position: 0),
59             repairShipTypeIds.contains(flagShipType) {
60             return true
61         }
62         if info.type == .replace,
63             let replaceFleet = info.replaceFleetNumber,
64             let flagShipType = shipTypeId(fleetNumber: replaceFleet, position: 0),
65             repairShipTypeIds.contains(flagShipType) {
66             return true
67         }
68         
69         // 変更のあった艦娘は工作艦か?
70         //     旗艦から外れたか?
71         // 入れ替えた結果、工作艦が旗艦になったか?
72         if info.type == .remove || info.type == .append || info.type == .replace,
73             info.position == 0,
74             let shipType = shipTypeId(shipId: info.shipID),
75             repairShipTypeIds.contains(shipType) {
76             return true
77         }
78         if info.type == .replace,
79             let replacePos = info.replacePosition,
80             replacePos == 0,
81             let shipId = info.replaceShipID,
82             let shipType = shipTypeId(shipId: shipId),
83             repairShipTypeIds.contains(shipType) {
84             return true
85         }
86         
87         // 旗艦が外された結果、工作艦が旗艦になったか?
88         if info.type == .remove,
89             info.position == 0,
90             let shipType = shipTypeId(fleetNumber: info.fleetNumber, position: 1),
91             repairShipTypeIds.contains(shipType) {
92             return true
93         }
94         
95         return false
96     }
97     private func resetIfNeeds(info: HenseiDidChangeUserInfo) {
98         if needsReset(info: info) { reset() }
99     }
100 }