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     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 damagedShipId(damagedPos: Int) -> Int? {
52         func fleetAndPos(_ pos: Int) -> ([Int]?, Int) {
53             switch pos {
54             case 1...6: return (fleetMembers(fleetId: 1), pos - 1)
55             case 7...12: return (fleetMembers(fleetId: 2), pos - 6 - 1)
56             default: return (nil, -1)
57             }
58         }
59         let (fleet, pos) = fleetAndPos(damagedPos)
60         return fleet?[pos]
61     }
62     private func registerReserve() {
63         let escape = data["api_escape"]
64         guard let guardianPos = escape["api_tow_idx"][0].int
65             else { return }
66         let fixedGuardianPos = guardianPos - 6 - 1
67         guard 0..<6 ~= fixedGuardianPos,
68             let guardianId = fleetMembers(fleetId: 2)?[fixedGuardianPos]
69             else { return print("guardianPos is wrong") }
70         
71         guard let escapeIdx = escape["api_escape_idx"][0].int,
72             let damagedId = damagedShipId(damagedPos: escapeIdx)
73             else { return print("damagedPos is wrong") }
74         
75         let store = TemporaryDataStore.oneTimeEditor()
76         guard let guardian = store.createGuardEscaped()
77             else { return print("Can not create GuardEscaped for guardinan") }
78         guardian.shipID = guardianId
79         guardian.ensured = false
80         
81         guard let damaged = store.createGuardEscaped()
82             else { return print("Can not create GuardEscaped for damaged") }
83         damaged.shipID = damagedId
84         damaged.ensured = false
85     }
86     private func removeInvalidEntry() {
87         let store = TemporaryDataStore.oneTimeEditor()
88         store.notEnsuredGuardEscaped().forEach { store.delete($0) }
89         store.save()
90         Thread.sleep(forTimeInterval: 0.1)
91         notify()
92     }
93     private func removeAllEntry() {
94         let store = TemporaryDataStore.oneTimeEditor()
95         store.guardEscaped().forEach { store.delete($0) }
96         store.save()
97         Thread.sleep(forTimeInterval: 0.1)
98         notify()
99     }
100     func ensureGuardShelter() {
101         let store = TemporaryDataStore.oneTimeEditor()
102         store.guardEscaped().forEach { $0.ensured = true }
103         store.save()
104         Thread.sleep(forTimeInterval: 0.1)
105         notify()
106     }
107     
108     private func notify() {
109         NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
110     }
111 }