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 .midnightBattle, .midnightSpMidnight:
54 midnightBattle(battleType: .normal)
56 case .combinedMidnightBattle, .combinedSpMidnight:
57 midnightBattle(battleType: .combinedAir)
59 case .combinedEcMidnightBattle:
60 midnightBattle(battleType: .eachCombinedAir)
62 case .battleResult, .combinedBattleResult:
68 func normalBattle(battleType: BattleType) {
71 DamageCalculator(json, battleType).calculateBattle()
74 func combinedAirBattle(battleType: BattleType) {
77 DamageCalculator(json, battleType).calcCombinedBattleAir()
80 func eachAirBattle(battleType: BattleType) {
83 DamageCalculator(json, battleType).calcEachBattleAir()
86 func enemyCombinedBattle(battleType: BattleType) {
89 DamageCalculator(json, battleType).calcEnemyCombinedBattle()
92 func midnightBattle(battleType: BattleType) {
94 DamageCalculator(json, battleType).calcMidnight()
98 extension CalculateDamageCommand {
102 let store = TemporaryDataStore.oneTimeEditor()
104 store.damages().forEach(store.delete)
109 let store = TemporaryDataStore.oneTimeEditor()
111 let totalDamages = store.sortedDamagesById()
113 let aStore = ServerDataStore.oneTimeEditor()
115 Debug.excute(level: .debug) {
119 totalDamages.forEach {
121 guard let ship = aStore.ship(by: $0.shipID) else { return }
123 if ship.nowhp != $0.hp {
125 print("\(ship.name)(\(ship.id)),HP \(ship.nowhp) -> \($0.hp)")
130 print("------- End Battle")
133 // 第二艦隊単独出撃で正しくデータが反映されるように逆順にして計算
134 totalDamages.reversed().forEach {
136 guard let ship = aStore.ship(by: $0.shipID) else { return }
140 if $0.useDamageControl { removeFirstDamageControl(of: ship) }
145 func updateBattleCell() {
147 let store = TemporaryDataStore.default
149 guard let battle = store.battle() else { return Logger.shared.log("Battle is invalid.") }
151 battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber)
153 Debug.excute(level: .debug) {
155 print("Enter Cell ------- ")
157 if let seiku = json["api_data"]["api_kouku"]["api_stage1"]["api_disp_seiku"].int {
160 case 0: print("制空権 均衡")
161 case 1: print("制空権 確保")
162 case 2: print("制空権 優勢")
163 case 3: print("制空権 劣勢")
164 case 4: print("制空権 喪失")
169 if let intercept = json["api_data"]["api_formation"][2].int {
172 case 1: print("交戦形態 同航戦")
173 case 2: print("交戦形態 反航戦")
174 case 3: print("交戦形態 T字戦有利")
175 case 4: print("交戦形態 T字戦不利")
182 func removeFirstDamageControl(of ship: Ship) {
184 let store = ServerDataStore.default
186 let (item, damageControl) = ship
189 .flatMap { $0 as? SlotItem }
190 .map { ($0, store.masterSlotItemID(by: $0.id)) }
191 .map { ($0.0, DamageControlID(rawValue: $0.1)) }
192 .filter { $0.1 != nil }
195 if let validDamageControl = damageControl {
197 switch validDamageControl {
198 case .damageControl: break
201 ship.fuel = ship.maxFuel
202 ship.bull = ship.maxBull
205 guard let equiped = ship.equippedItem.array as? [SlotItem] else { return }
207 ship.equippedItem = NSOrderedSet(array: equiped.filter { $0 != item })
213 let exItemId = store.masterSlotItemID(by: ship.slot_ex)
215 guard let exType = DamageControlID(rawValue: exItemId) else { return }
218 case .damageControl: break
221 ship.fuel = ship.maxFuel
222 ship.bull = ship.maxBull