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