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() {
32 guard let battleApi = BattleAPI(rawValue: api) else { return }
35 case .battle, .airBattle, .ldAirBattle:
36 normalBattle(battleType: .normal)
38 case .combinedEcBattle:
39 enemyCombinedBattle(battleType: .enemyCombined)
41 case .combinedBattle, .combinedAirBattle:
42 combinedAirBattle(battleType: .combinedAir)
44 case .combinedBattleWater, .combinedLdAirBattle:
45 normalBattle(battleType: .combinedWater)
47 case .combinedEachBattle:
48 eachAirBattle(battleType: .eachCombinedAir)
50 case .combinedEachBattleWater:
51 normalBattle(battleType: .eachCombinedWater)
53 case .combinedEachNightToDay:
54 eachNightToDayBattle(battleType: .normal)
56 case .midnightBattle, .midnightSpMidnight:
57 midnightBattle(battleType: .normal)
59 case .combinedMidnightBattle, .combinedSpMidnight:
60 midnightBattle(battleType: .combinedAir)
62 case .combinedEcMidnightBattle:
63 midnightBattle(battleType: .eachCombinedAir)
65 case .battleResult, .combinedBattleResult:
71 func normalBattle(battleType: BattleType) {
74 DamageCalculator(json, battleType).calculateBattle()
77 func combinedAirBattle(battleType: BattleType) {
80 DamageCalculator(json, battleType).calcCombinedBattleAir()
83 func eachAirBattle(battleType: BattleType) {
86 DamageCalculator(json, battleType).calcEachBattleAir()
89 func eachNightToDayBattle(battleType: BattleType) {
92 DamageCalculator(json, battleType).calcEachNightToDay()
95 func enemyCombinedBattle(battleType: BattleType) {
98 DamageCalculator(json, battleType).calcEnemyCombinedBattle()
101 func midnightBattle(battleType: BattleType) {
103 DamageCalculator(json, battleType).calcMidnight()
107 extension CalculateDamageCommand {
111 let store = TemporaryDataStore.oneTimeEditor()
113 store.damages().forEach(store.delete)
118 let store = TemporaryDataStore.oneTimeEditor()
120 let totalDamages = store.sortedDamagesById()
122 let aStore = ServerDataStore.oneTimeEditor()
124 Debug.excute(level: .debug) {
128 totalDamages.forEach {
130 guard let ship = aStore.ship(by: $0.shipID) else { return }
132 if ship.nowhp != $0.hp {
134 print("\(ship.name)(\(ship.id)),HP \(ship.nowhp) -> \($0.hp)")
139 print("------- End Battle")
142 // 第二艦隊単独出撃で正しくデータが反映されるように逆順にして計算
143 totalDamages.reversed().forEach {
145 guard let ship = aStore.ship(by: $0.shipID) else { return }
149 if $0.useDamageControl { removeFirstDamageControl(of: ship) }
154 func updateBattleCell() {
156 let store = TemporaryDataStore.default
158 guard let battle = store.battle() else { return Logger.shared.log("Battle is invalid.") }
160 battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber)
162 Debug.excute(level: .debug) {
164 print("Enter Cell ------- ")
166 if let seiku = json["api_data"]["api_kouku"]["api_stage1"]["api_disp_seiku"].int {
169 case 0: print("制空権 均衡")
170 case 1: print("制空権 確保")
171 case 2: print("制空権 優勢")
172 case 3: print("制空権 劣勢")
173 case 4: print("制空権 喪失")
178 if let intercept = json["api_data"]["api_formation"][2].int {
181 case 1: print("交戦形態 同航戦")
182 case 2: print("交戦形態 反航戦")
183 case 3: print("交戦形態 T字戦有利")
184 case 4: print("交戦形態 T字戦不利")
191 func removeFirstDamageControl(of ship: Ship) {
193 let store = ServerDataStore.default
195 let (item, damageControl) = ship
198 .flatMap { $0 as? SlotItem }
199 .map { ($0, store.masterSlotItemID(by: $0.id)) }
200 .map { ($0.0, DamageControlID(rawValue: $0.1)) }
201 .filter { $0.1 != nil }
204 if let validDamageControl = damageControl {
206 switch validDamageControl {
207 case .damageControl: break
210 ship.fuel = ship.maxFuel
211 ship.bull = ship.maxBull
214 guard let equiped = ship.equippedItem.array as? [SlotItem] else { return }
216 ship.equippedItem = NSOrderedSet(array: equiped.filter { $0 != item })
222 let exItemId = store.masterSlotItemID(by: ship.slot_ex)
224 guard let exType = DamageControlID(rawValue: exItemId) else { return }
227 case .damageControl: break
230 ship.fuel = ship.maxFuel
231 ship.bull = ship.maxBull