OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / SakutekiCalculator.swift
index 07a67f0..74b2a07 100644 (file)
@@ -13,11 +13,22 @@ protocol SakutekiCalculator {
     func calculate(_ ships: [Ship]) -> Double
 }
 
+extension SakutekiCalculator {
+    
+    fileprivate func alivedShips(ships: [Ship]) -> [Ship] {
+        
+        return ships.filter {
+            TemporaryDataStore.default.ensuredGuardEscaped(byShipId: $0.id) == nil
+        }
+    }
+}
+
 final class SimpleCalculator: SakutekiCalculator {
     
+    
     func calculate(_ ships: [Ship]) -> Double {
         
-        return Double(ships.reduce(0) { $0 + $1.sakuteki_0 })
+        return Double(alivedShips(ships: ships).reduce(0) { $0 + $1.sakuteki_0 })
     }
 }
 
@@ -36,7 +47,7 @@ final class Formula33: SakutekiCalculator {
         let itemNames = ship
             .equippedItem
             .array
-            .flatMap { $0 as? SlotItem }
+            .compactMap { $0 as? SlotItem }
             .reduce("") {
                 
                 let saku = $1.master_slotItem.saku ?? 0
@@ -57,7 +68,7 @@ final class Formula33: SakutekiCalculator {
             ships.forEach(printShipData)
         }
         
-        let aliveShips = ships.filter(alive)
+        let aliveShips = alivedShips(ships: ships)
         
         // 艦娘の索敵による索敵値
         let saku1 = aliveShips
@@ -74,28 +85,18 @@ final class Formula33: SakutekiCalculator {
         let saku3 = shireiSakuteki()
         
         // 艦隊の艦娘数による影響
-        let saku4 = 2 * (6 - ships.count)
+        let saku4 = 2 * (6 - aliveShips.count)
         
         return saku1 + saku2 - saku3 + Double(saku4)
     }
     
-    private func alive(_ ship: Ship) -> Bool {
-        
-        if let _ = TemporaryDataStore.default.ensuredGuardEscaped(byShipId: ship.id) {
-            
-            return false
-        }
-        
-        return true
-    }
-    
     private func normalSakuteki(_ ship: Ship) -> Double {
         
         let eqSakuteki = ship
             .equippedItem
             .array
-            .flatMap { $0 as? SlotItem }
-            .flatMap { $0.master_slotItem.saku as? Double }
+            .compactMap { $0 as? SlotItem }
+            .compactMap { $0.master_slotItem.saku as? Double }
             .reduce(0, +)
         
         return Double(ship.sakuteki_0) - eqSakuteki
@@ -106,7 +107,7 @@ final class Formula33: SakutekiCalculator {
         let saku = ship
             .equippedItem
             .array
-            .flatMap { $0 as? SlotItem }
+            .compactMap { $0 as? SlotItem }
             .map(equipSakuteki)
             .reduce(0, +)
         
@@ -117,11 +118,7 @@ final class Formula33: SakutekiCalculator {
         
         guard let saku = item.master_slotItem.saku as? Double else { return 0 }
         
-        let lvBounus = levelBounus(item)
-        
-        let ratio = typeRatio(item)
-        
-        return Double(condition) * ratio * (saku + lvBounus)
+        return Double(condition) * typeRatio(item) * (saku + levelBounus(item))
     }
     
     private func typeRatio(_ item: SlotItem) -> Double {
@@ -154,11 +151,7 @@ final class Formula33: SakutekiCalculator {
     
     private func levelBounus(_ item: SlotItem) -> Double {
         
-        let level = item.level
-        
-        let ratio = levelRatio(item)
-        
-        return ratio * sqrt(Double(level))
+        return levelRatio(item) * sqrt(Double(item.level))
     }
     
     private func levelRatio(_ item: SlotItem) -> Double {