OSDN Git Service

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