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