OSDN Git Service

api_at_eflag対応版に変更
authormasakih <masakih@users.sourceforge.jp>
Mon, 20 Nov 2017 14:41:18 +0000 (23:41 +0900)
committermasakih <masakih@users.sourceforge.jp>
Mon, 20 Nov 2017 14:41:18 +0000 (23:41 +0900)
KCD/Battle.swift
KCD/CalculateDamageCommand.swift
KCD/DamageCalculator.swift
KCD/MapStartCommand.swift
KCD/Temporary.xcdatamodeld/Temporary.xcdatamodel/contents

index 5444030..8903474 100644 (file)
@@ -16,5 +16,6 @@ class Battle: KCManagedObject {
     @NSManaged var mapArea: Int
     @NSManaged var mapInfo: Int
     @NSManaged var no: Int
+    @NSManaged var firstFleetShipsCount: Int
     @NSManaged var damages: NSOrderedSet
 }
index 7133507..968d4f4 100644 (file)
@@ -134,10 +134,7 @@ extension CalculateDamageCommand {
         
         let store = TemporaryDataStore.default
         
-        guard let battle = store.battle() else {
-            
-            return Logger.shared.log("Battle is invalid.")
-        }
+        guard let battle = store.battle() else { return Logger.shared.log("Battle is invalid.") }
         
         battle.battleCell = (battle.no == 0 ? nil : battle.no as NSNumber)
         
index b626d4d..9c4c299 100644 (file)
@@ -233,9 +233,7 @@ extension DamageCalculator {
             
             buildDamagedEntity()
             
-            let newDamages = store.sortedDamagesById()
-            
-            return newDamages
+            return store.sortedDamagesById()
         }
         
         return array
@@ -257,16 +255,14 @@ extension DamageCalculator {
         guard case 0...1 = fleet else { return Logger.shared.log("fleet must 0 or 1.") }
         guard let battle = store.battle() else { return Logger.shared.log("Battle is invalid.") }
         
-        (0..<6).forEach {
-            
-            guard case 0..<ships.count = $0 else { return }
+        zip(ships, (0...)).forEach { ship, index in
             
             guard let damage = store.createDamage() else { return Logger.shared.log("Can not create Damage") }
             
             damage.battle = battle
-            damage.id = $0 + fleet * 6
-            damage.hp = ships[$0].nowhp
-            damage.shipID = ships[$0].id
+            damage.hp = ship.nowhp
+            damage.shipID = ship.id
+            damage.id = index
         }
     }
     
@@ -279,8 +275,11 @@ extension DamageCalculator {
         buildDamagesOfFleet(fleet: 0, ships: firstFleetShips)
         
         // 第二艦隊
-        let secondFleetShips = ServerDataStore.default.ships(byDeckId: 2)
-        buildDamagesOfFleet(fleet: 1, ships: secondFleetShips)
+        if isCombinedBattle {
+            
+            let secondFleetShips = ServerDataStore.default.ships(byDeckId: 2)
+            buildDamagesOfFleet(fleet: 1, ships: secondFleetShips)
+        }
     }
 }
 
@@ -314,26 +313,19 @@ extension DamageCalculator {
         return list.array?.flatMap { $0.int }
     }
     
-    private func isTargetFriend(eFlags: [Int]?, index: Int) -> Bool {
-        
-        if let eFlags = eFlags, 0..<eFlags.count ~= index {
-            
-            return eFlags[index] == 1
-        }
+    private func validTargetPos(_ targetPos: Int, in battleFleet: BattleFleet) -> Bool {
         
-        return true
+        return 0..<damages.count ~= targetPos
     }
     
-    private func validTargetPos(_ targetPos: Int, in battleFleet: BattleFleet) -> Bool {
+    private func firstFleetShipsCount() -> Int {
         
-        let upper = (battleFleet == .each ? 12 : 6)
-        
-        return 0..<upper ~= targetPos
+        return store.battle()?.firstFleetShipsCount ?? 6
     }
     
     private func position(_ pos: Int, in fleet: BattleFleet) -> Int? {
         
-        let shipOffset = (fleet == .second) ? 6 : 0
+        let shipOffset = (fleet == .second) ? firstFleetShipsCount() : 0
         
         let damagePos = pos + shipOffset
         
@@ -351,10 +343,8 @@ extension DamageCalculator {
         guard let ship = ServerDataStore.default.ship(by: damage.shipID) else { return }
         
         damage.hp = damageControlIfPossible(ship: ship)
-        if damage.hp != 0 {
-            
-            damage.useDamageControl = true
-        }
+        damage.useDamageControl = (damage.hp != 0)
+        
     }
     
     private func calculateHogeki(baseKeyPath: String, _ bf: () -> BattleFleet) {
@@ -362,6 +352,13 @@ extension DamageCalculator {
         calculateHogeki(baseKeyPath: baseKeyPath, battleFleet: bf())
     }
     
+    private func omitEnemyDamage(targetPosLists: [[Int]], damageLists: [[Int]], eFlags: [Int]?) -> [([Int], [Int])] {
+        
+        guard let eFlags = eFlags else { return zip(targetPosLists, damageLists).map { $0 } }
+        
+        return zip(zip(targetPosLists, damageLists), eFlags).filter { $0.1 == 1 }.map { $0.0 }
+    }
+    
     private func calculateHogeki(baseKeyPath: String, battleFleet: BattleFleet = .first) {
         
         let baseValue = json[baseKeyPath.components(separatedBy: ".")]
@@ -375,23 +372,15 @@ extension DamageCalculator {
         
         guard targetPosLists.count == damageLists.count else { return Logger.shared.log("api_damage is wrong.") }
         
-        let eFlags = enemyFlags(baseValue["api_at_eflag"])
-        
         Debug.print("Start Hougeki \(baseKeyPath)", level: .debug)
         
-        zip(targetPosLists, damageLists).enumerated().forEach { (i, list) in
-            
-            if !isTargetFriend(eFlags: eFlags, index: i) {
-                
-                Debug.excute(level: .debug) {
-                    
-                    print("target is enemy")
-                }
-                
-                return
-            }
+        let enemyOmitedDamages = omitEnemyDamage(targetPosLists: targetPosLists,
+                                                 damageLists: damageLists,
+                                                 eFlags: enemyFlags(baseValue["api_at_eflag"]))
+        
+        enemyOmitedDamages.forEach { (targetPosList, damageList) in
             
-            zip(list.0, list.1).forEach { (targetPos, damage) in
+            zip(targetPosList, damageList).forEach { (targetPos, damage) in
                 
                 guard validTargetPos(targetPos, in: battleFleet) else { return Logger.shared.log("invalid position \(targetPos)") }
                 
@@ -404,7 +393,7 @@ extension DamageCalculator {
                 
                 Debug.excute(level: .debug) {
                     
-                    let shipOffset = (battleFleet == .second) ? 6 : 0
+                    let shipOffset = (battleFleet == .second) ? firstFleetShipsCount() : 0
                     print("Hougeki \(targetPos + shipOffset) -> \(damage)")
                 }
             }
@@ -440,15 +429,13 @@ extension DamageCalculator {
         
         frendDamages.enumerated().forEach { (idx, damage) in
             
-//            if idx == 0 { return }
-            
             guard let damagePos = position(idx, in: battleFleet) else { return }
             
             calcHP(damage: damages[damagePos], receive: damage)
             
             Debug.excute(level: .debug) {
                 
-                let shipOffset = (battleFleet == .second) ? 6 : 0
+                let shipOffset = (battleFleet == .second) ? firstFleetShipsCount() : 0
                 print("FDam \(idx + shipOffset) -> \(damage)")
             }
         }
index f53e570..dac7f03 100644 (file)
@@ -60,10 +60,13 @@ final class MapStartCommand: JSONCommand {
             return Logger.shared.log("Can not create Battle")
         }
         
+        let kcd = ServerDataStore.default
+        
         battle.deckId = deckId
         battle.mapArea = mapArea
         battle.mapInfo = mapInfo
         battle.no = no
+        battle.firstFleetShipsCount = kcd.ships(byDeckId: deckId).count
     }
     
     private func nextCell() {
index fff4f90..6765d54 100644 (file)
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="11759" systemVersion="16D32" minimumToolsVersion="Xcode 4.3" sourceLanguage="Objective-C" userDefinedModelVersionIdentifier="">
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="13533" systemVersion="17B48" minimumToolsVersion="Xcode 4.3" sourceLanguage="Objective-C" userDefinedModelVersionIdentifier="">
     <entity name="Battle" representedClassName="KCD.Battle" syncable="YES">
         <attribute name="battleCell" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/>
         <attribute name="deckId" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
+        <attribute name="firstFleetShipsCount" optional="YES" attributeType="Integer 64" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
         <attribute name="isBossCell" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/>
         <attribute name="mapArea" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
         <attribute name="mapInfo" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
@@ -21,7 +22,7 @@
         <attribute name="shipID" attributeType="Integer 64" defaultValueString="-1" usesScalarValueType="NO" syncable="YES"/>
     </entity>
     <elements>
-        <element name="Battle" positionX="-63" positionY="-18" width="128" height="150"/>
+        <element name="Battle" positionX="-63" positionY="-18" width="128" height="165"/>
         <element name="Damage" positionX="-54" positionY="18" width="128" height="120"/>
         <element name="GuardEscaped" positionX="-54" positionY="27" width="128" height="75"/>
     </elements>