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"
15 case gobakAlone = "/kcsapi/api_req_sortie/goback_port"
18 extension Notification.Name {
20 static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
23 final class GuardShelterCommand: JSONCommand {
25 // static let infoName = InformationName<[Int]>(name: "Ensured")
27 override class func canExecuteAPI(_ api: String) -> Bool {
29 return GuardEscapeAPI(rawValue: api) != nil
32 override func execute() {
34 if let b = BattleAPI(rawValue: api) {
37 case .battleResult, .combinedBattleResult:
44 if let m = MapAPI(rawValue: api), m == .next {
48 if let _ = GuardEscapeAPI(rawValue: api) {
52 if let _ = PortAPI(rawValue: api) {
58 private func damagedShipId(damagedPos: Int) -> Int? {
60 let firstDeckId = TemporaryDataStore.default.battle()?.deckId ?? 1
62 let store = ServerDataStore.default
67 case 1...6: return store.deck(by: 1)?.shipId(of: damagedPos - 1)
68 case 7...12: return store.deck(by: 2)?.shipId(of: damagedPos - 6 - 1)
72 return store.deck(by: 3)?.shipId(of: damagedPos - 1)
78 private func registerReserve() {
80 let escape = data["api_escape"]
82 guard let escapeIdx = escape["api_escape_idx"][0].int else { return }
83 guard let damagedId = damagedShipId(damagedPos: escapeIdx) else {
85 return Logger.shared.log("damagedPos is wrong")
88 let store = TemporaryDataStore.oneTimeEditor()
90 guard let damaged = store.createGuardEscaped() else {
92 return Logger.shared.log("Can not create GuardEscaped for damaged")
95 damaged.shipID = damagedId
96 damaged.ensured = false
98 // store guardian if needs
99 guard let guardianPos = escape["api_tow_idx"][0].int else { return }
101 let fixedGuardianPos = guardianPos - 6 - 1
103 guard let guardianId = ServerDataStore.default.deck(by: 2)?.shipId(of: fixedGuardianPos) else {
105 return Logger.shared.log("guardianPos is wrong")
108 guard let guardian = store.createGuardEscaped() else {
110 return Logger.shared.log("Can not create GuardEscaped for guardinan")
113 guardian.shipID = guardianId
114 guardian.ensured = false
117 private func removeInvalidEntry() {
119 let store = TemporaryDataStore.oneTimeEditor()
121 store.notEnsuredGuardEscaped().forEach(store.delete)
122 store.save(errorHandler: store.presentOnMainThread)
123 Thread.sleep(forTimeInterval: 0.1)
127 private func removeAllEntry() {
129 let store = TemporaryDataStore.oneTimeEditor()
131 store.guardEscaped().forEach(store.delete)
132 store.save(errorHandler: store.presentOnMainThread)
133 Thread.sleep(forTimeInterval: 0.1)
137 private func ensureGuardShelter() {
139 let store = TemporaryDataStore.oneTimeEditor()
141 store.guardEscaped().forEach { $0.ensured = true }
142 store.save(errorHandler: store.presentOnMainThread)
143 Thread.sleep(forTimeInterval: 0.1)
147 private func notify() {
149 DispatchQueue.main.async {
151 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)