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         }
46         if let _ = GuardEscapeAPI(rawValue: api) {
47             
48             ensureGuardShelter()
49             
50         }
51         if let _ = PortAPI(rawValue: api) {
52             
53             removeAllEntry()
54             
55         }
56     }
57     
58     private func fleetMembers(fleetId: Int) -> [Int]? {
59         
60         guard let deck = ServerDataStore.default.deck(by: fleetId)
61             else { return nil }
62         
63         return [deck.ship_0, deck.ship_1, deck.ship_2,
64                 deck.ship_3, deck.ship_4, deck.ship_5]
65     }
66     
67     private func damagedShipId(damagedPos: Int) -> Int? {
68         
69         func fleetAndPos(_ pos: Int) -> ([Int]?, Int) {
70             switch pos {
71             case 1...6: return (fleetMembers(fleetId: 1), pos - 1)
72                 
73             case 7...12: return (fleetMembers(fleetId: 2), pos - 6 - 1)
74                 
75             default: return (nil, -1)
76             }
77         }
78         
79         let (fleet, pos) = fleetAndPos(damagedPos)
80         
81         return fleet?[pos]
82     }
83     
84     private func registerReserve() {
85         
86         let escape = data["api_escape"]
87         
88         guard let guardianPos = escape["api_tow_idx"][0].int
89             else { return }
90         
91         let fixedGuardianPos = guardianPos - 6 - 1
92         
93         guard case 0..<6 = fixedGuardianPos,
94             let guardianId = fleetMembers(fleetId: 2)?[fixedGuardianPos]
95             else { return print("guardianPos is wrong") }
96         
97         guard let escapeIdx = escape["api_escape_idx"][0].int,
98             let damagedId = damagedShipId(damagedPos: escapeIdx)
99             else { return print("damagedPos is wrong") }
100         
101         let store = TemporaryDataStore.oneTimeEditor()
102         
103         guard let guardian = store.createGuardEscaped()
104             else { return print("Can not create GuardEscaped for guardinan") }
105         
106         guardian.shipID = guardianId
107         guardian.ensured = false
108         
109         guard let damaged = store.createGuardEscaped()
110             else { return print("Can not create GuardEscaped for damaged") }
111         
112         damaged.shipID = damagedId
113         damaged.ensured = false
114     }
115     
116     private func removeInvalidEntry() {
117         
118         let store = TemporaryDataStore.oneTimeEditor()
119         
120         store.notEnsuredGuardEscaped().forEach { store.delete($0) }
121         store.save()
122         Thread.sleep(forTimeInterval: 0.1)
123         notify()
124     }
125     
126     private func removeAllEntry() {
127         
128         let store = TemporaryDataStore.oneTimeEditor()
129         
130         store.guardEscaped().forEach { store.delete($0) }
131         store.save()
132         Thread.sleep(forTimeInterval: 0.1)
133         notify()
134     }
135     
136     func ensureGuardShelter() {
137         
138         let store = TemporaryDataStore.oneTimeEditor()
139         
140         store.guardEscaped().forEach { $0.ensured = true }
141         store.save()
142         Thread.sleep(forTimeInterval: 0.1)
143         notify()
144     }
145     
146     private func notify() {
147         
148         NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
149     }
150 }