2 // CalculateDamageCommand.swift
5 // Created by Hori,Masaki on 2017/01/15.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
18 case eachCombinedWater
22 enum DamageControlID: Int {
24 case damageControl = 42
28 final class CalculateDamageCommand: JSONCommand {
30 override func execute() {
34 case .battle, .airBattle, .ldAirBattle:
35 normalBattle(battleType: .normal)
37 case .combinedEcBattle:
38 enemyCombinedBattle(battleType: .enemyCombined)
40 case .combinedBattle, .combinedAirBattle:
41 combinedAirBattle(battleType: .combinedAir)
43 case .combinedBattleWater, .combinedLdAirBattle:
44 normalBattle(battleType: .combinedWater)
46 case .combinedEachBattle:
47 eachAirBattle(battleType: .eachCombinedAir)
49 case .combinedEachBattleWater:
50 normalBattle(battleType: .eachCombinedWater)
52 case .combinedEachNightToDay:
53 eachNightToDayBattle(battleType: .normal)
55 case .midnightBattle, .midnightSpMidnight:
56 midnightBattle(battleType: .normal)
58 case .combinedMidnightBattle, .combinedSpMidnight:
59 midnightBattle(battleType: .combinedAir)
61 case .combinedEcMidnightBattle:
62 midnightBattle(battleType: .eachCombinedAir)
64 case .battleResult, .combinedBattleResult:
68 default: return Logger.shared.log("Missing API: \(apiResponse.api)")
72 func normalBattle(battleType: BattleType) {
75 DamageCalculator(json, battleType).calculateBattle()
78 func combinedAirBattle(battleType: BattleType) {
81 DamageCalculator(json, battleType).calcCombinedBattleAir()
84 func eachAirBattle(battleType: BattleType) {
87 DamageCalculator(json, battleType).calcEachBattleAir()
90 func eachNightToDayBattle(battleType: BattleType) {
93 DamageCalculator(json, battleType).calcEachNightToDay()
96 func enemyCombinedBattle(battleType: BattleType) {
99 DamageCalculator(json, battleType).calcEnemyCombinedBattle()
102 func midnightBattle(battleType: BattleType) {
104 DamageCalculator(json, battleType).calcMidnight()
108 extension CalculateDamageCommand {
112 let store = TemporaryDataStore.oneTimeEditor()
114 store.damages().forEach(store.delete)
119 let store = TemporaryDataStore.oneTimeEditor()
121 let totalDamages = store.sortedDamagesById()
123 let aStore = ServerDataStore.oneTimeEditor()
125 Debug.excute(level: .debug) {
129 totalDamages.forEach {
131 guard let ship = aStore.ship(by: $0.shipID) else { return }
133 if ship.nowhp != $0.hp {
135 print("\(ship.name)(\(ship.id)),HP \(ship.nowhp) -> \($0.hp)")
140 print("------- End Battle")
143 // 第二艦隊単独出撃で正しくデータが反映されるように逆順にして計算
144 totalDamages.reversed().forEach {
146 guard let ship = aStore.ship(by: $0.shipID) else { return }
150 if $0.useDamageControl { removeFirstDamageControl(of: ship) }
155 func updateBattleCell() {
157 let store = TemporaryDataStore.default
159 guard let battle = store.battle() else { return Logger.shared.log("Battle is invalid.") }
161 battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber)
163 Debug.excute(level: .debug) {
165 print("Enter Cell ------- ")
167 if let seiku = json["api_data"]["api_kouku"]["api_stage1"]["api_disp_seiku"].int {
170 case 0: print("制空権 均衡")
171 case 1: print("制空権 確保")
172 case 2: print("制空権 優勢")
173 case 3: print("制空権 劣勢")
174 case 4: print("制空権 喪失")
179 if let intercept = json["api_data"]["api_formation"][2].int {
182 case 1: print("交戦形態 同航戦")
183 case 2: print("交戦形態 反航戦")
184 case 3: print("交戦形態 T字戦有利")
185 case 4: print("交戦形態 T字戦不利")
192 func removeFirstDamageControl(of ship: Ship) {
194 let store = ServerDataStore.default
196 let (item, damageControl) = ship
199 .flatMap { $0 as? SlotItem }
200 .map { ($0, store.masterSlotItemID(by: $0.id)) }
201 .map { ($0.0, DamageControlID(rawValue: $0.1)) }
202 .filter { $0.1 != nil }
205 if let validDamageControl = damageControl {
207 switch validDamageControl {
208 case .damageControl: break
211 ship.fuel = ship.maxFuel
212 ship.bull = ship.maxBull
215 guard let equiped = ship.equippedItem.array as? [SlotItem] else { return }
217 ship.equippedItem = NSOrderedSet(array: equiped.filter { $0 != item })
223 let exItemId = store.masterSlotItemID(by: ship.slot_ex)
225 guard let exType = DamageControlID(rawValue: exItemId) else { return }
228 case .damageControl: break
231 ship.fuel = ship.maxFuel
232 ship.bull = ship.maxBull