2 // GuardShelterCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 extension Notification.Name {
13 static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
16 final class GuardShelterCommand: JSONCommand {
18 override class func canExecuteAPI(_ api: API) -> Bool {
20 return api.type == .guardEscape
23 override func execute() {
41 Logger.shared.log("Missing API: \(apiResponse.api)")
48 private func damagedShipId(damagedPos: Int) -> Int? {
50 let tempStore = TemporaryDataStore.default
51 let firstDeckId = tempStore.sync { tempStore.battle()?.deckId ?? 1 }
53 let store = ServerDataStore.default
60 case 1...6: return store.sync { store.deck(by: 1)?.shipId(of: damagedPos - 1) }
62 case 7...12: return store.sync { store.deck(by: 2)?.shipId(of: damagedPos - 6 - 1) }
68 case 3: return store.sync { store.deck(by: 3)?.shipId(of: damagedPos - 1) }
75 private func reserveEscapeShips() {
77 let escape = data["api_escape"]
79 guard let escapeIdx = escape["api_escape_idx"][0].int else {
83 guard let damagedId = damagedShipId(damagedPos: escapeIdx) else {
85 Logger.shared.log("damagedPos is wrong")
90 let store = TemporaryDataStore.oneTimeEditor()
93 guard let damaged = store.createGuardEscaped() else {
95 Logger.shared.log("Can not create GuardEscaped for damaged")
100 damaged.shipID = damagedId
101 damaged.ensured = false
103 // store guardian if needs
104 guard let guardianPos = escape["api_tow_idx"][0].int else {
109 let fixedGuardianPos = guardianPos - 6 - 1
111 let sStore = ServerDataStore.default
112 guard let guardianId = sStore.sync(execute: { sStore.deck(by: 2)?.shipId(of: fixedGuardianPos) }) else {
114 Logger.shared.log("guardianPos is wrong")
119 guard let guardian = store.createGuardEscaped() else {
121 Logger.shared.log("Can not create GuardEscaped for guardinan")
126 guardian.shipID = guardianId
127 guardian.ensured = false
131 private func removeInvalidEntry() {
133 let store = TemporaryDataStore.oneTimeEditor()
136 store.notEnsuredGuardEscaped().forEach(store.delete)
139 Thread.sleep(forTimeInterval: 0.1)
143 private func removeAllEntry() {
145 let store = TemporaryDataStore.oneTimeEditor()
148 store.guardEscaped().forEach(store.delete)
151 Thread.sleep(forTimeInterval: 0.1)
155 private func ensureGuardShelter() {
157 let store = TemporaryDataStore.oneTimeEditor()
160 store.guardEscaped().forEach { $0.ensured = true }
163 Thread.sleep(forTimeInterval: 0.1)
167 private func notify() {
169 DispatchQueue.main.async {
171 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)