2 // GuardShelterCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 enum GuardEscapeAPI: String {
14 case goback = "/kcsapi/api_req_combined_battle/goback_port"
17 extension Notification.Name {
19 static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
22 final class GuardShelterCommand: JSONCommand {
24 override class func canExecuteAPI(_ api: String) -> Bool {
26 return GuardEscapeAPI(rawValue: api) != nil ? true : false
29 override func execute() {
31 if let b = BattleAPI(rawValue: api) {
34 case .battleResult, .combinedBattleResult:
41 if let m = MapAPI(rawValue: api), m == .next {
46 if let _ = GuardEscapeAPI(rawValue: api) {
51 if let _ = PortAPI(rawValue: api) {
58 private func fleetMembers(fleetId: Int) -> [Int]? {
60 guard let deck = ServerDataStore.default.deck(by: fleetId) else { return nil }
62 return [deck.ship_0, deck.ship_1, deck.ship_2,
63 deck.ship_3, deck.ship_4, deck.ship_5]
66 private func damagedShipId(damagedPos: Int) -> Int? {
68 func fleetAndPos(_ pos: Int) -> ([Int]?, Int) {
70 case 1...6: return (fleetMembers(fleetId: 1), pos - 1)
72 case 7...12: return (fleetMembers(fleetId: 2), pos - 6 - 1)
74 default: return (nil, -1)
78 let (fleet, pos) = fleetAndPos(damagedPos)
83 private func registerReserve() {
85 let escape = data["api_escape"]
87 guard let guardianPos = escape["api_tow_idx"][0].int else { return }
89 let fixedGuardianPos = guardianPos - 6 - 1
91 guard case 0..<6 = fixedGuardianPos,
92 let guardianId = fleetMembers(fleetId: 2)?[fixedGuardianPos] else {
94 print("guardianPos is wrong")
99 guard let escapeIdx = escape["api_escape_idx"][0].int,
100 let damagedId = damagedShipId(damagedPos: escapeIdx) else {
102 print("damagedPos is wrong")
106 let store = TemporaryDataStore.oneTimeEditor()
108 guard let guardian = store.createGuardEscaped() else {
110 print("Can not create GuardEscaped for guardinan")
114 guardian.shipID = guardianId
115 guardian.ensured = false
117 guard let damaged = store.createGuardEscaped() else {
119 print("Can not create GuardEscaped for damaged")
123 damaged.shipID = damagedId
124 damaged.ensured = false
127 private func removeInvalidEntry() {
129 let store = TemporaryDataStore.oneTimeEditor()
131 store.notEnsuredGuardEscaped().forEach { store.delete($0) }
133 Thread.sleep(forTimeInterval: 0.1)
137 private func removeAllEntry() {
139 let store = TemporaryDataStore.oneTimeEditor()
141 store.guardEscaped().forEach { store.delete($0) }
143 Thread.sleep(forTimeInterval: 0.1)
147 func ensureGuardShelter() {
149 let store = TemporaryDataStore.oneTimeEditor()
151 store.guardEscaped().forEach { $0.ensured = true }
153 Thread.sleep(forTimeInterval: 0.1)
157 private func notify() {
159 DispatchQueue.main.async {
161 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)