OSDN Git Service

Squashed commit of the following: Swiftに変換した
[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         let appDelegate = NSApplication.shared().delegate as! AppDelegate
20         fleetManager = appDelegate.fleetManager
21         super.init()
22         let nc = NotificationCenter.default
23         nc.addObserver(forName: .HenseiDidChange, object: nil, queue: nil) { notification in
24             guard let userInfo = notification.userInfo,
25                 let info = userInfo[ChangeHenseiCommand.userInfoKey] as? HenseiDidChangeUserInfo
26                 else { return }
27             self.resetIfNeeds(info: info)
28         }
29         nc.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) { (Notification) in
30             if Date().timeIntervalSince(self.repairTime) < 20 * 60 { return }
31             self.reset()
32         }
33     }
34     deinit {
35         NotificationCenter.default.removeObserver(self)
36     }
37     
38     private(set) var repairTime: Date {
39         get { return UserDefaults.standard.repairTime }
40         set { UserDefaults.standard.repairTime = newValue }
41     }
42     
43     private func reset() {
44         repairTime = Date()
45     }
46     private func shipTypeId(fleetNumber: Int , position: Int) -> Int? {
47         guard 1...4 ~= fleetNumber,
48             1...6 ~= position
49             else { return nil }
50         let ship = fleetManager.fleets[fleetNumber - 1][position]
51         return ship?.master_ship.stype.id
52     }
53     private func shipTypeId(shipId: Int) -> Int? {
54         return ServerDataStore.default
55             .ship(byId: shipId)?.master_ship.stype.id
56     }
57     private func needsReset(info: HenseiDidChangeUserInfo) -> Bool {
58         // 変更のあった艦隊の旗艦は工作艦か?
59         if let flagShipType = shipTypeId(fleetNumber: info.fleetNumber, position: 0),
60             repairShipTypeIds.contains(flagShipType)
61         { return true }
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         if info.type == .remove || info.type == .append,
71             let shipType = shipTypeId(shipId: info.shipID),
72             repairShipTypeIds.contains(shipType)
73         { return info.position == 0 }
74         if info.type == .replace,
75             let shipId = info.replaceShipID,
76             let shipType = shipTypeId(shipId: shipId),
77             repairShipTypeIds.contains(shipType),
78             let replacePos = info.replacePosition
79         { return replacePos == 0 }
80         
81         return false
82     }
83     private func resetIfNeeds(info: HenseiDidChangeUserInfo) {
84         if needsReset(info: info) { reset() }
85     }
86 }