OSDN Git Service

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