OSDN Git Service

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