2 // CalculateDamageCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
22 case eachCombinedWater
27 enum DamageControlID: Int {
29 case damageControl = 42
34 final class CalculateDamageCommand: JSONCommand {
36 override func execute() {
40 case .battle, .airBattle, .ldAirBattle:
41 normalBattle(battleType: .normal)
43 case .combinedEcBattle:
44 enemyCombinedBattle(battleType: .enemyCombined)
46 case .combinedBattle, .combinedAirBattle:
47 combinedAirBattle(battleType: .combinedAir)
49 case .combinedBattleWater, .combinedLdAirBattle:
50 normalBattle(battleType: .combinedWater)
52 case .combinedEachBattle:
53 eachAirBattle(battleType: .eachCombinedAir)
55 case .combinedEachBattleWater:
56 normalBattle(battleType: .eachCombinedWater)
58 case .combinedEachNightToDay:
59 eachNightToDayBattle(battleType: .normal)
61 case .midnightBattle, .midnightSpMidnight:
62 midnightBattle(battleType: .normal)
64 case .combinedMidnightBattle, .combinedSpMidnight:
65 midnightBattle(battleType: .combinedAir)
67 case .combinedEcMidnightBattle:
68 midnightBattle(battleType: .eachCombinedAir)
70 case .battleResult, .combinedBattleResult:
76 Logger.shared.log("Missing API: \(apiResponse.api)")
82 func normalBattle(battleType: BattleType) {
85 DamageCalculator(json, battleType).calculateBattle()
88 func combinedAirBattle(battleType: BattleType) {
91 DamageCalculator(json, battleType).calcCombinedBattleAir()
94 func eachAirBattle(battleType: BattleType) {
97 DamageCalculator(json, battleType).calcEachBattleAir()
100 func eachNightToDayBattle(battleType: BattleType) {
103 DamageCalculator(json, battleType).calcEachNightToDay()
106 func enemyCombinedBattle(battleType: BattleType) {
109 DamageCalculator(json, battleType).calcEnemyCombinedBattle()
112 func midnightBattle(battleType: BattleType) {
114 DamageCalculator(json, battleType).calcMidnight()
118 extension CalculateDamageCommand {
122 let store = TemporaryDataStore.oneTimeEditor()
124 store.sync { store.damages().forEach(store.delete) }
129 let store = TemporaryDataStore.oneTimeEditor()
131 let totalDamages = store.sync { store.sortedDamagesById() }
133 let aStore = ServerDataStore.default
135 Debug.excute(level: .debug) {
141 totalDamages.forEach { damage in
143 let shipId = damage.shipID
144 guard let ship = aStore.sync(execute: { aStore.ship(by: shipId) }) else {
149 let damagedHp = damage.hp
152 if ship.nowhp != damagedHp {
154 print("\(ship.name)(\(ship.id)),HP \(ship.nowhp) -> \(damagedHp)")
160 print("------- End Battle")
163 // 第二艦隊単独出撃で正しくデータが反映されるように逆順にして計算
166 totalDamages.reversed().forEach { damage in
168 let shipId = damage.shipID
169 guard let ship = aStore.sync(execute: { aStore.ship(by: shipId) }) else {
174 let damagedHp = damage.hp
175 aStore.sync { ship.nowhp = damagedHp }
177 if damage.useDamageControl {
179 self.removeFirstDamageControl(of: shipId)
185 func updateBattleCell() {
187 let store = TemporaryDataStore.default
189 guard let battle = store.sync(execute: { store.battle() }) else {
191 Logger.shared.log("Battle is invalid.")
196 store.sync { battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber) }
198 Debug.excute(level: .debug) {
200 print("Enter Cell ------- ")
202 if let seiku = json["api_data"]["api_kouku"]["api_stage1"]["api_disp_seiku"].int {
206 case 0: print("制空権 均衡")
208 case 1: print("制空権 確保")
210 case 2: print("制空権 優勢")
212 case 3: print("制空権 劣勢")
214 case 4: print("制空権 喪失")
221 if let intercept = json["api_data"]["api_formation"][2].int {
225 case 1: print("交戦形態 同航戦")
227 case 2: print("交戦形態 反航戦")
229 case 3: print("交戦形態 T字戦有利")
231 case 4: print("交戦形態 T字戦不利")
240 func removeFirstDamageControl(of shipId: Int) {
242 let store = ServerDataStore.oneTimeEditor()
245 guard let ship = store.ship(by: shipId) else {
250 let (item, damageControl) = ship
253 .compactMap { $0 as? SlotItem }
254 .map { ($0, store.masterSlotItemID(by: $0.id)) }
255 .map { ($0.0, DamageControlID(rawValue: $0.1)) }
256 .filter { $0.1 != nil }
259 if let validDamageControl = damageControl {
261 switch validDamageControl {
263 case .damageControl: break
266 ship.fuel = ship.maxFuel
267 ship.bull = ship.maxBull
271 guard let equiped = ship.equippedItem.array as? [SlotItem] else {
276 ship.equippedItem = NSOrderedSet(array: equiped.filter { $0 != item })
282 let exItemId = store.sync { store.masterSlotItemID(by: ship.slot_ex) }
284 guard let exType = DamageControlID(rawValue: exItemId) else {
291 case .damageControl: break
294 ship.fuel = ship.maxFuel
295 ship.bull = ship.maxBull