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 guard totalDamages.count == 12 else {
115 return Logger.shared.log("Damages count is invalid. count is \(totalDamages.count).")
118 let aStore = ServerDataStore.oneTimeEditor()
120 // 第二艦隊単独出撃で正しくデータが反映されるように逆順にして計算
121 totalDamages.reversed().forEach {
123 guard let ship = aStore.ship(by: $0.shipID) else { return }
125 if ship.nowhp != $0.hp {
127 Debug.print("\(ship.name)(\(ship.id)),HP \(ship.nowhp) -> \($0.hp)", level: .debug)
132 if $0.useDamageControl { removeFirstDamageControl(of: ship) }
135 Debug.print("------- End Battle", level: .debug)
138 func updateBattleCell() {
140 let store = TemporaryDataStore.default
142 guard let battle = store.battle() else {
144 return Logger.shared.log("Battle is invalid.")
147 battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber)
149 Debug.excute(level: .debug) {
151 print("Enter Cell ------- ")
153 if let seiku = json["api_data"]["api_kouku"]["api_stage1"]["api_disp_seiku"].int {
156 case 0: print("制空権 均衡")
157 case 1: print("制空権 確保")
158 case 2: print("制空権 優勢")
159 case 3: print("制空権 劣勢")
160 case 4: print("制空権 喪失")
165 if let intercept = json["api_data"]["api_formation"][2].int {
168 case 1: print("交戦形態 同航戦")
169 case 2: print("交戦形態 反航戦")
170 case 3: print("交戦形態 T字戦有利")
171 case 4: print("交戦形態 T字戦不利")
178 func removeFirstDamageControl(of ship: Ship) {
180 let store = ServerDataStore.default
182 let (item, damageControl) = ship
185 .flatMap { $0 as? SlotItem }
186 .map { ($0, store.masterSlotItemID(by: $0.id)) }
187 .map { ($0.0, DamageControlID(rawValue: $0.1)) }
188 .filter { $0.1 != nil }
191 if let validDamageControl = damageControl {
193 switch validDamageControl {
194 case .damageControl: break
197 ship.fuel = ship.maxFuel
198 ship.bull = ship.maxBull
201 guard let equiped = ship.equippedItem.array as? [SlotItem] else { return }
203 ship.equippedItem = NSOrderedSet(array: equiped.filter { $0 != item })
209 let exItemId = store.masterSlotItemID(by: ship.slot_ex)
211 guard let exType = DamageControlID(rawValue: exItemId) else { return }
214 case .damageControl: break
217 ship.fuel = ship.maxFuel
218 ship.bull = ship.maxBull