OSDN Git Service

AppDelegateからウインドウに関する部分を分離した
[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     case goback = "/kcsapi/api_req_combined_battle/goback_port"
14 }
15
16 extension Notification.Name {
17     static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
18 }
19
20 class GuardShelterCommand: JSONCommand {
21     override class func canExecuteAPI(_ api: String) -> Bool {
22         return GuardEscapeAPI(rawValue: api) != nil ? true : false
23     }
24     
25     override func execute() {
26         if let b = BattleAPI(rawValue: api) {
27             switch b {
28             case .battleResult, .combinedBattleResult:
29                 registerReserve()
30             default:
31                 break
32             }
33         }
34         if let m = MapAPI(rawValue: api), m == .next {
35             removeInvalidEntry()
36         }
37         if let _ = GuardEscapeAPI(rawValue: api) {
38             ensureGuardShelter()
39         }
40         if let _ = PortAPI(rawValue: api) {
41             removeAllEntry()
42         }
43     }
44     
45     private func fleetMembers(fleetId: Int) -> [Int]? {
46         guard let deck = ServerDataStore.default.deck(by: fleetId)
47             else { return nil }
48         return [deck.ship_0, deck.ship_1, deck.ship_2,
49                 deck.ship_3, deck.ship_4, deck.ship_5]
50     }
51     private func damagedMemberPosition(escapeIdx: Any) -> Int? {
52         switch escapeIdx {
53         case let i as Int: return i
54         case let a as [Int] where !a.isEmpty: return a[0]
55         default: return nil
56         }
57     }
58     private func damagedShipId(damagedPos: Int) -> Int? {
59         if damagedPos > 6, 0..<6 ~= damagedPos - 6 - 1 {
60             return fleetMembers(fleetId: 2)?[damagedPos - 6 - 1]
61         }
62         if 0..<6 ~= damagedPos - 1 {
63             return fleetMembers(fleetId: 1)?[damagedPos - 1]
64         }
65         return nil
66     }
67     private func registerReserve() {
68         let escape = data["api_escape"]
69         guard let guardianPos = escape["api_tow_idx"][0].int
70             else { return }
71         let fixedGuardianPos = guardianPos - 6 - 1
72         guard 0..<6 ~= fixedGuardianPos,
73             let guardianId = fleetMembers(fleetId: 2)?[fixedGuardianPos]
74             else { return print("guardianPos is wrong") }
75         
76         guard let escapeIdx = escape["api_escape_idx"].int,
77             let damagedPos = damagedMemberPosition(escapeIdx: escapeIdx),
78             let damagedId = damagedShipId(damagedPos: damagedPos)
79             else { return print("damagedPos is wrong") }
80         
81         let store = TemporaryDataStore.oneTimeEditor()
82         guard let guardian = store.createGuardEscaped()
83             else { return print("Can not create GuardEscaped for guardinan") }
84         guardian.shipID = guardianId
85         guardian.ensured = false
86         
87         guard let damaged = store.createGuardEscaped()
88             else { return print("Can not create GuardEscaped for damaged") }
89         damaged.shipID = damagedId
90         damaged.ensured = false
91     }
92     private func removeInvalidEntry() {
93         let store = TemporaryDataStore.oneTimeEditor()
94         store.notEnsuredGuardEscaped().forEach { store.delete($0) }
95         store.save()
96         Thread.sleep(forTimeInterval: 0.1)
97         notify()
98     }
99     private func removeAllEntry() {
100         let store = TemporaryDataStore.oneTimeEditor()
101         store.guardEscaped().forEach { store.delete($0) }
102         store.save()
103         Thread.sleep(forTimeInterval: 0.1)
104         notify()
105     }
106     func ensureGuardShelter() {
107         let store = TemporaryDataStore.oneTimeEditor()
108         store.guardEscaped().forEach { $0.ensured = true }
109         store.save()
110         Thread.sleep(forTimeInterval: 0.1)
111         notify()
112     }
113     
114     private func notify() {
115         NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
116     }
117 }