OSDN Git Service

HMKCGuardEscapedをSwiftに変換した
[kcd/KCD.git] / KCD / HMGuardShelterCommand.swift
1 //
2 //  HMGuardShelterCommand.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/15.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 extension Notification.Name {
12     static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
13 }
14
15 class HMGuardShelterCommand: HMJSONCommand {
16     override class func canExecuteAPI(_ api: String) -> Bool {
17         if api == "/kcsapi/api_req_combined_battle/goback_port" { return true }
18         return false
19     }
20     
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() }
26     }
27     
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
34             else {
35                 print("Can not get Deck")
36                 return []
37         }
38         return [deck.ship_0, deck.ship_1, deck.ship_2,
39                 deck.ship_3, deck.ship_4, deck.ship_5]
40     }
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]
51         
52         guard let excapeIdx = escape["api_escape_idx"]
53             else { return print("api_escape_idx is not found") }
54         let damagedPos: Int
55         switch excapeIdx {
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")
59         }
60         let damagedId: Int
61         if damagedPos > 6 {
62             damagedId = secondFleet[damagedPos - 6 - 1]
63         }
64         else{
65             damagedId = fleetMembers(fleetId: 1)[damagedPos - 1]
66         }
67         
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
73         
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
78     }
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]
84             else { return }
85         escapeds.forEach { store?.delete($0) }
86         store?.saveAction(nil)
87         Thread.sleep(forTimeInterval: 0.1)
88         notify()
89     }
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]
94             else { return }
95         escapeds.forEach { store?.delete($0) }
96         store?.saveAction(nil)
97         Thread.sleep(forTimeInterval: 0.1)
98         notify()
99     }
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]
104             else { return }
105         escapeds.forEach { $0.ensured = true }
106         store?.saveAction(nil)
107         Thread.sleep(forTimeInterval: 0.1)
108         notify()
109     }
110     
111     private func notify() {
112         NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
113     }
114 }