OSDN Git Service

guard の書き方を統一した
[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 final class AnchorageRepairManager: NSObject {
13     
14     static let `default`: AnchorageRepairManager = AnchorageRepairManager()
15     
16     private let fleetManager: FleetManager
17     private let repairShipTypeIds: [Int] = [19]
18     
19     override init() {
20         
21         fleetManager = AppDelegate.shared.fleetManager
22         
23         super.init()
24         
25         let nc = NotificationCenter.default
26         nc.addObserver(forName: .HenseiDidChange, object: nil, queue: nil) { notification in
27             
28             guard let userInfo = notification.userInfo else { return }
29             guard let info = userInfo[ChangeHenseiCommand.userInfoKey] as? HenseiDidChangeUserInfo else { return }
30             
31             self.resetIfNeeds(info: info)
32         }
33         
34         nc.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) { _ in
35             
36             if Date().timeIntervalSince(self.repairTime) < 20 * 60 { return }
37             
38             self.reset()
39         }
40     }
41     
42     deinit {
43         
44         NotificationCenter.default.removeObserver(self)
45     }
46     
47     private(set) var repairTime: Date {
48         
49         get { return UserDefaults.standard[.repairTime] }
50         set { UserDefaults.standard[.repairTime] = newValue }
51     }
52     
53     private func reset() {
54         
55         repairTime = Date()
56     }
57     
58     private func shipTypeId(fleetNumber: Int, position: Int) -> Int? {
59         
60         guard case 1...4 = fleetNumber else { return nil }
61         guard case 0...5 = position else { return nil }
62         
63         let ship = fleetManager.fleets[fleetNumber - 1][position]
64         
65         return ship?.master_ship.stype.id
66     }
67     
68     private func shipTypeId(shipId: Int) -> Int? {
69         
70         return ServerDataStore.default
71             .ship(by: shipId)?.master_ship.stype.id
72     }
73     
74     private func needsReset(info: HenseiDidChangeUserInfo) -> Bool {
75         
76         // 変更のあった艦隊の旗艦は工作艦か?
77         if let flagShipType = shipTypeId(fleetNumber: info.fleetNumber, position: 0),
78             repairShipTypeIds.contains(flagShipType) {
79             
80             return true
81         }
82         if info.type == .replace,
83             let replaceFleet = info.replaceFleetNumber,
84             let flagShipType = shipTypeId(fleetNumber: replaceFleet, position: 0),
85             repairShipTypeIds.contains(flagShipType) {
86             
87             return true
88         }
89         
90         // 変更のあった艦娘は工作艦か?
91         //     旗艦から外れたか?
92         // 入れ替えた結果、工作艦が旗艦になったか?
93         if info.type == .remove || info.type == .append || info.type == .replace,
94             info.position == 0,
95             let shipType = shipTypeId(shipId: info.shipID),
96             repairShipTypeIds.contains(shipType) {
97             
98             return true
99         }
100         if info.type == .replace,
101             let replacePos = info.replacePosition,
102             replacePos == 0,
103             let shipId = info.replaceShipID,
104             let shipType = shipTypeId(shipId: shipId),
105             repairShipTypeIds.contains(shipType) {
106             
107             return true
108         }
109         
110         // 旗艦が外された結果、工作艦が旗艦になったか?
111         if info.type == .remove,
112             info.position == 0,
113             let shipType = shipTypeId(fleetNumber: info.fleetNumber, position: 1),
114             repairShipTypeIds.contains(shipType) {
115             
116             return true
117         }
118         
119         return false
120     }
121     private func resetIfNeeds(info: HenseiDidChangeUserInfo) {
122         
123         if needsReset(info: info) { reset() }
124     }
125 }