OSDN Git Service

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