OSDN Git Service

処理を簡素化
[kcd/KCD.git] / KCD / GuardShelterCommand.swift
1 //
2 //  GuardShelterCommand.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
12 enum GuardEscapeAPI: String {
13     
14     case goback = "/kcsapi/api_req_combined_battle/goback_port"
15 }
16
17 extension Notification.Name {
18     
19     static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
20 }
21
22 final class GuardShelterCommand: JSONCommand {
23     
24     override class func canExecuteAPI(_ api: String) -> Bool {
25         
26         return GuardEscapeAPI(rawValue: api) != nil ? true : false
27     }
28     
29     override func execute() {
30         
31         if let b = BattleAPI(rawValue: api) {
32             
33             switch b {
34             case .battleResult, .combinedBattleResult:
35                 registerReserve()
36                 
37             default:
38                 break
39             }
40         }
41         if let m = MapAPI(rawValue: api), m == .next {
42             
43             removeInvalidEntry()
44         }
45         if let _ = GuardEscapeAPI(rawValue: api) {
46             
47             ensureGuardShelter()
48         }
49         if let _ = PortAPI(rawValue: api) {
50             
51             removeAllEntry()
52         }
53     }
54     
55     private func damagedShipId(damagedPos: Int) -> Int? {
56         
57         let store = ServerDataStore.default
58         
59         switch damagedPos {
60         case 1...6: return store.deck(by: 1)?.shipId(of:damagedPos - 1)
61         case 7...12: return store.deck(by: 2)?.shipId(of: damagedPos - 6 - 1)
62         default: return nil
63         }
64     }
65     
66     private func registerReserve() {
67         
68         let escape = data["api_escape"]
69         
70         guard let guardianPos = escape["api_tow_idx"][0].int else { return }
71         
72         let fixedGuardianPos = guardianPos - 6 - 1
73                 
74         guard let guardianId = ServerDataStore.default.deck(by: 2)?.shipId(of: fixedGuardianPos) else {
75                 
76                 print("guardianPos is wrong")
77                 return
78         }
79         
80         guard let escapeIdx = escape["api_escape_idx"][0].int,
81             let damagedId = damagedShipId(damagedPos: escapeIdx) else {
82                 
83                 print("damagedPos is wrong")
84                 return
85         }
86         
87         let store = TemporaryDataStore.oneTimeEditor()
88         
89         guard let guardian = store.createGuardEscaped() else {
90             
91             print("Can not create GuardEscaped for guardinan")
92             return
93         }
94         
95         guardian.shipID = guardianId
96         guardian.ensured = false
97         
98         guard let damaged = store.createGuardEscaped() else {
99             
100             print("Can not create GuardEscaped for damaged")
101             return
102         }
103         
104         damaged.shipID = damagedId
105         damaged.ensured = false
106     }
107     
108     private func removeInvalidEntry() {
109         
110         let store = TemporaryDataStore.oneTimeEditor()
111         
112         store.notEnsuredGuardEscaped().forEach(store.delete)
113         store.save()
114         Thread.sleep(forTimeInterval: 0.1)
115         notify()
116     }
117     
118     private func removeAllEntry() {
119         
120         let store = TemporaryDataStore.oneTimeEditor()
121         
122         store.guardEscaped().forEach(store.delete)
123         store.save()
124         Thread.sleep(forTimeInterval: 0.1)
125         notify()
126     }
127     
128     func ensureGuardShelter() {
129         
130         let store = TemporaryDataStore.oneTimeEditor()
131         
132         store.guardEscaped().forEach { $0.ensured = true }
133         store.save()
134         Thread.sleep(forTimeInterval: 0.1)
135         notify()
136     }
137     
138     private func notify() {
139         
140         DispatchQueue.main.async {
141             
142             NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
143         }
144     }
145 }