2 // HMGuardShelterCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 extension Notification.Name {
12 static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
15 class HMGuardShelterCommand: HMJSONCommand {
16 override class func canExecuteAPI(_ api: String) -> Bool {
17 if api == "/kcsapi/api_req_combined_battle/goback_port" { return true }
21 override func execute() {
22 if api == "/kcsapi/api_req_combined_battle/battleresult" { registerReserve() }
23 if api == "/kcsapi/api_port/port" { removeAllEntry() }
24 if api == "/kcsapi/api_req_combined_battle/goback_port" { ensureGuardShelter() }
25 if api == "/kcsapi/api_req_map/next" { removeInvalidEntry() }
28 private func fleetMembers(fleetId: Int) -> [Int] {
29 let store = HMServerDataStore.default()
30 let p = NSPredicate(format: "id = %ld", fleetId)
31 guard let d = try? store?.objects(withEntityName: "Deck", predicate: p),
32 let decks = d as? [HMKCDeck],
33 let deck = decks.first
35 print("Can not get Deck")
38 return [deck.ship_0, deck.ship_1, deck.ship_2,
39 deck.ship_3, deck.ship_4, deck.ship_5]
41 private func registerReserve() {
42 guard let data = json[dataKey] as? [String:Any],
43 let escape = data["api_escape"] as? [String:Any],
44 let guardians = escape["api_tow_idx"] as? [Int],
45 let guardianPos = guardians.first
46 else { return print("Can not get guardinanPos") }
47 let secondFleet = fleetMembers(fleetId: 2)
48 guard secondFleet.count < guardianPos - 6
49 else { return print("guardianPos is wrong") }
50 let guardianId = secondFleet[guardianPos - 6 - 1]
52 guard let excapeIdx = escape["api_escape_idx"]
53 else { return print("api_escape_idx is not found") }
56 case let i as Int: damagedPos = i
57 case let a as [Int] where a.count != 0: damagedPos = a[0]
58 default: return print("api_escape_idx is wrong")
62 damagedId = secondFleet[damagedPos - 6 - 1]
65 damagedId = fleetMembers(fleetId: 1)[damagedPos - 1]
68 let store = HMTemporaryDataStore.oneTimeEditor()
69 guard let guardian = store?.insertNewObjectForEntity(forName: "GuardEscaped") as? HMKCGuardEscaped
70 else { return print("Can not create GuardEscaped for guardinan") }
71 guardian.shipID = guardianId
72 guardian.ensured = false
74 guard let damaged = store?.insertNewObjectForEntity(forName: "GuardEscaped") as? HMKCGuardEscaped
75 else { return print("Can not create GuardEscaped for damaged") }
76 damaged.shipID = damagedId
77 damaged.ensured = false
79 private func removeInvalidEntry() {
80 let store = HMTemporaryDataStore.oneTimeEditor()
81 let p = NSPredicate(format: "ensured = FALSE")
82 guard let e = try? store?.objects(withEntityName: "GuardEscaped", predicate: p),
83 let escapeds = e as? [HMKCGuardEscaped]
85 escapeds.forEach { store?.delete($0) }
86 store?.saveAction(nil)
87 Thread.sleep(forTimeInterval: 0.1)
90 private func removeAllEntry() {
91 let store = HMTemporaryDataStore.oneTimeEditor()
92 guard let e = try? store?.objects(withEntityName: "GuardEscaped", predicate: nil),
93 let escapeds = e as? [HMKCGuardEscaped]
95 escapeds.forEach { store?.delete($0) }
96 store?.saveAction(nil)
97 Thread.sleep(forTimeInterval: 0.1)
100 func ensureGuardShelter() {
101 let store = HMTemporaryDataStore.oneTimeEditor()
102 guard let e = try? store?.objects(withEntityName: "GuardEscaped", predicate: nil),
103 let escapeds = e as? [HMKCGuardEscaped]
105 escapeds.forEach { $0.ensured = true }
106 store?.saveAction(nil)
107 Thread.sleep(forTimeInterval: 0.1)
111 private func notify() {
112 NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)