2 // GuardShelterCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 enum GuardEscapeAPI: String {
13 case goback = "/kcsapi/api_req_combined_battle/goback_port"
16 extension Notification.Name {
17 static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
20 class GuardShelterCommand: JSONCommand {
21 override class func canExecuteAPI(_ api: String) -> Bool {
22 return GuardEscapeAPI(rawValue: api) != nil ? true : false
25 override func execute() {
26 if let b = BattleAPI(rawValue: api) {
28 case .battleResult, .combinedBattleResult:
34 if let m = MapAPI(rawValue: api), m == .next {
37 if let _ = GuardEscapeAPI(rawValue: api) {
40 if let _ = PortAPI(rawValue: api) {
45 private func fleetMembers(fleetId: Int) -> [Int]? {
46 guard let deck = ServerDataStore.default.deck(byId: fleetId)
48 return [deck.ship_0, deck.ship_1, deck.ship_2,
49 deck.ship_3, deck.ship_4, deck.ship_5]
51 private func damagedMemberPosition(escapeIdx: Any) -> Int? {
53 case let i as Int: return i
54 case let a as [Int] where !a.isEmpty: return a[0]
58 private func damagedShipId(damagedPos: Int) -> Int? {
59 if damagedPos > 6, 0..<6 ~= damagedPos - 6 - 1 {
60 return fleetMembers(fleetId: 2)?[damagedPos - 6 - 1]
62 if 0..<6 ~= damagedPos - 1 {
63 return fleetMembers(fleetId: 1)?[damagedPos - 1]
67 private func registerReserve() {
68 let escape = data["api_escape"]
69 let guardians = escape["api_tow_idx"]
70 guard let guardianPos = guardians[0].int
72 let fixedGuardianPos = guardianPos - 6 - 1
73 guard 0..<6 ~= fixedGuardianPos,
74 let guardianId = fleetMembers(fleetId: 2)?[fixedGuardianPos]
75 else { return print("guardianPos is wrong") }
77 guard let escapeIdx = escape["api_escape_idx"].int,
78 let damagedPos = damagedMemberPosition(escapeIdx: escapeIdx),
79 let damagedId = damagedShipId(damagedPos: damagedPos)
80 else { return print("damagedPos is wrong") }
82 let store = TemporaryDataStore.oneTimeEditor()
83 guard let guardian = store.createGuardEscaped()
84 else { return print("Can not create GuardEscaped for guardinan") }
85 guardian.shipID = guardianId
86 guardian.ensured = false
88 guard let damaged = store.createGuardEscaped()
89 else { return print("Can not create GuardEscaped for damaged") }
90 damaged.shipID = damagedId
91 damaged.ensured = false
93 private func removeInvalidEntry() {
94 let store = TemporaryDataStore.oneTimeEditor()
95 store.notEnsuredGuardEscaped().forEach { store.delete($0) }
97 Thread.sleep(forTimeInterval: 0.1)
100 private func removeAllEntry() {
101 let store = TemporaryDataStore.oneTimeEditor()
102 store.guardEscaped().forEach { store.delete($0) }
104 Thread.sleep(forTimeInterval: 0.1)
107 func ensureGuardShelter() {
108 let store = TemporaryDataStore.oneTimeEditor()
109 store.guardEscaped().forEach { $0.ensured = true }
111 Thread.sleep(forTimeInterval: 0.1)
115 private func notify() {
116 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)