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() {
39 default: return Logger.shared.log("Missing API: \(apiResponse.api)")
43 private func damagedShipId(damagedPos: Int) -> Int? {
45 let firstDeckId = TemporaryDataStore.default.battle()?.deckId ?? 1
47 let store = ServerDataStore.default
52 case 1...6: return store.deck(by: 1)?.shipId(of: damagedPos - 1)
53 case 7...12: return store.deck(by: 2)?.shipId(of: damagedPos - 6 - 1)
57 return store.deck(by: 3)?.shipId(of: damagedPos - 1)
63 private func registerReserve() {
65 let escape = data["api_escape"]
67 guard let escapeIdx = escape["api_escape_idx"][0].int else { return }
68 guard let damagedId = damagedShipId(damagedPos: escapeIdx) else {
70 return Logger.shared.log("damagedPos is wrong")
73 let store = TemporaryDataStore.oneTimeEditor()
75 guard let damaged = store.createGuardEscaped() else {
77 return Logger.shared.log("Can not create GuardEscaped for damaged")
80 damaged.shipID = damagedId
81 damaged.ensured = false
83 // store guardian if needs
84 guard let guardianPos = escape["api_tow_idx"][0].int else { return }
86 let fixedGuardianPos = guardianPos - 6 - 1
88 guard let guardianId = ServerDataStore.default.deck(by: 2)?.shipId(of: fixedGuardianPos) else {
90 return Logger.shared.log("guardianPos is wrong")
93 guard let guardian = store.createGuardEscaped() else {
95 return Logger.shared.log("Can not create GuardEscaped for guardinan")
98 guardian.shipID = guardianId
99 guardian.ensured = false
102 private func removeInvalidEntry() {
104 let store = TemporaryDataStore.oneTimeEditor()
106 store.notEnsuredGuardEscaped().forEach(store.delete)
107 store.save(errorHandler: store.presentOnMainThread)
108 Thread.sleep(forTimeInterval: 0.1)
112 private func removeAllEntry() {
114 let store = TemporaryDataStore.oneTimeEditor()
116 store.guardEscaped().forEach(store.delete)
117 store.save(errorHandler: store.presentOnMainThread)
118 Thread.sleep(forTimeInterval: 0.1)
122 private func ensureGuardShelter() {
124 let store = TemporaryDataStore.oneTimeEditor()
126 store.guardEscaped().forEach { $0.ensured = true }
127 store.save(errorHandler: store.presentOnMainThread)
128 Thread.sleep(forTimeInterval: 0.1)
132 private func notify() {
134 DispatchQueue.main.async {
136 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)