OSDN Git Service

shared instanceを持つようにした
[kcd/KCD.git] / KCD / Ship.swift
index 5b5de6a..933dd25 100644 (file)
@@ -8,7 +8,7 @@
 
 import Cocoa
 
-// swiftlint:disable variable_name
+// swiftlint:disable identifier_name
 final class Ship: KCManagedObject {
     
     @NSManaged dynamic var bull: Int
@@ -51,6 +51,7 @@ final class Ship: KCManagedObject {
     @NSManaged dynamic var slot_3: Int
     @NSManaged dynamic var slot_4: Int
     @NSManaged dynamic var slot_ex: Int
+    @NSManaged dynamic var soku: Int
     @NSManaged dynamic var sortno: NSNumber?
     @NSManaged dynamic var soukou_0: Int
     @NSManaged dynamic var soukou_1: Int
@@ -63,14 +64,15 @@ final class Ship: KCManagedObject {
     @NSManaged dynamic var master_ship: MasterShip
     @NSManaged dynamic var extraItem: SlotItem?
 }
-// swiftlint:eable variable_name
+// swiftlint:eable identifier_name
 
 private let shortSTypeNames: [String] = {
     
     guard let url = Bundle.main.url(forResource: "STypeShortName", withExtension: "plist"),
         let array = NSArray(contentsOf: url) as? [String] else {
             
-            print("Can not load STypeShortName.plist.")
+            Logger.shared.log("Can not load STypeShortName.plist.")
+            
             return []
     }
     
@@ -82,7 +84,8 @@ private let levelUpExps: [Int] = {
     guard let url = Bundle.main.url(forResource: "LevelUpExp", withExtension: "plist"),
         let array = NSArray(contentsOf: url) as? [Int] else {
             
-            print("Can not load LevelUpExp.plist.")
+            Logger.shared.log("Can not load LevelUpExp.plist.")
+            
             return []
     }
     
@@ -91,75 +94,125 @@ private let levelUpExps: [Int] = {
 
 extension Ship {
     
-    @objc class func keyPathsForValuesAffectingName() -> Set<String> {
+    @objc override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
+        
+        switch key {
+            
+        case #keyPath(name): return [#keyPath(ship_id)]
+            
+        case #keyPath(shortTypeName): return [#keyPath(ship_id)]
+            
+        case #keyPath(next): return [#keyPath(exp)]
+            
+        case #keyPath(status): return [#keyPath(nowhp), #keyPath(maxhp)]
         
-        return ["ship_id"]
+        case #keyPath(planColor): return [#keyPath(sally_area)]
+            
+        case #keyPath(isMaxKaryoku): return [#keyPath(karyoku_1), #keyPath(kyouka_0)]
+            
+        case #keyPath(isMaxRaisou): return [#keyPath(raisou_1), #keyPath(kyouka_1)]
+            
+        case #keyPath(isMaxTaiku): return [#keyPath(taiku_1), #keyPath(kyouka_2)]
+            
+        case #keyPath(isMaxSoukou): return [#keyPath(soukou_1), #keyPath(kyouka_3)]
+            
+        case #keyPath(isMaxLucky): return [#keyPath(lucky_1), #keyPath(kyouka_4)]
+            
+        case #keyPath(upgradeLevel): return [#keyPath(ship_id)]
+            
+        case #keyPath(upgradeExp): return [#keyPath(exp)]
+            
+        case #keyPath(steelRequiredInRepair): return [#keyPath(nowhp)]
+            
+        case #keyPath(fuelRequiredInRepair): return [#keyPath(nowhp)]
+            
+        case #keyPath(seiku): return [#keyPath(slot_0), #keyPath(slot_1), #keyPath(slot_2), #keyPath(slot_3), #keyPath(slot_4),
+                                      #keyPath(onslot_0), #keyPath(onslot_1), #keyPath(onslot_2), #keyPath(onslot_3), #keyPath(onslot_4)]
+            
+        default: return []
+            
+        }
     }
+    
     @objc dynamic var name: String { return master_ship.name }
     
-    @objc class func keyPathsForValuesAffectingShortTypeName() -> Set<String> {
-        
-        return ["ship_id"]
-    }
     @objc dynamic var shortTypeName: String? {
         
         let index = master_ship.stype.id - 1
         
-        guard case 0..<shortSTypeNames.count = index else { return nil }
+        guard case 0..<shortSTypeNames.count = index else {
+            
+            return nil
+        }
         
         return shortSTypeNames[index]
     }
     
-    @objc class func keyPathsForValuesAffectingNext() -> Set<String> {
-        
-        return ["exp"]
-    }
     @objc dynamic var next: NSNumber? {
         
-        guard case 0..<levelUpExps.count = lv else { return nil }
+        guard case 0..<levelUpExps.count = lv else {
+            
+            return nil
+        }
         
-        if lv == 99 { return nil }
+        if lv == 99 {
+            
+            return nil
+        }
         
         let nextExp = levelUpExps[lv]
         
-        if lv < 99 { return (nextExp - exp) as NSNumber }
+        if lv < 99 {
+            
+            return (nextExp - exp) as NSNumber
+        }
         
         return (1_000_000 + nextExp - exp) as NSNumber
     }
     
-    @objc class func keyPathsForValuesAffectingStatus() -> Set<String> {
-        
-        return ["nowhp", "maxph"]
-    }
     @objc dynamic var status: Int {
         
-        let stat = Double(nowhp) / Double(maxhp)
-        
-        if stat <= 0.25 { return 3 }
-        if stat <= 0.5 { return 2 }
-        if stat <= 0.75 { return 1 }
-        
-        return 0
+        switch Double(nowhp) / Double(maxhp) {
+            
+        case (0...0.25): return 3
+            
+        case (0.25...0.50): return 2
+            
+        case (0.50...0.75): return 1
+            
+        default: return 0
+            
+        }
     }
     
-    @objc class func keyPathsForValuesAffectingPlanColor() -> Set<String> {
-        
-        return ["sally_area"]
-    }
     @objc dynamic var planColor: NSColor {
         
-        if !UserDefaults.standard[.showsPlanColor] { return NSColor.controlTextColor }
+        if !UserDefaults.standard[.showsPlanColor] {
+            
+            return .controlTextColor
+        }
         
-        guard let sally = sally_area else { return .controlTextColor }
+        guard let sally = sally_area else {
+            
+            return .controlTextColor
+        }
         
         switch sally {
+            
         case 1: return UserDefaults.standard[.plan01Color]
+            
         case 2: return UserDefaults.standard[.plan02Color]
+            
         case 3: return UserDefaults.standard[.plan03Color]
+            
         case 4: return UserDefaults.standard[.plan04Color]
+            
         case 5: return UserDefaults.standard[.plan05Color]
+            
         case 6: return UserDefaults.standard[.plan06Color]
-        default: return NSColor.controlTextColor
+            
+        default: return .controlTextColor
+            
         }
     }
 }
@@ -170,10 +223,6 @@ extension Ship {
     @objc dynamic var maxBull: Int { return master_ship.bull_max }
     @objc dynamic var maxFuel: Int { return master_ship.fuel_max }
     
-    @objc class func keyPathsForValuesAffectingIsMaxKaryoku() -> Set<String> {
-        
-        return ["karyoku_1", "kyouka_0"]
-    }
     @objc dynamic var isMaxKaryoku: Bool {
         
         let initial = master_ship.houg_0
@@ -183,10 +232,6 @@ extension Ship {
         return initial + growth >= max
     }
     
-    @objc class func keyPathsForValuesAffectingIsMaxRaisou() -> Set<String> {
-        
-        return ["raisou_1", "kyouka_1"]
-    }
     @objc dynamic var isMaxRaisou: Bool {
         
         let initial = master_ship.raig_0
@@ -196,10 +241,6 @@ extension Ship {
         return initial + growth >= max
     }
     
-    @objc class func keyPathsForValuesAffectingIsMaxTaiku() -> Set<String> {
-        
-        return ["taiku_1", "kyouka_2"]
-    }
     @objc dynamic var isMaxTaiku: Bool {
         
         let initial = master_ship.tyku_0
@@ -209,10 +250,6 @@ extension Ship {
         return initial + growth >= max
     }
     
-    @objc class func keyPathsForValuesAffectingIsMaxSoukou() -> Set<String> {
-        
-        return ["soukou_1", "kyouka_3"]
-    }
     @objc dynamic var isMaxSoukou: Bool {
         
         let initial = master_ship.souk_0
@@ -222,10 +259,6 @@ extension Ship {
         return initial + growth >= max
     }
     
-    @objc class func keyPathsForValuesAffectingIsMaxLucky() -> Set<String> {
-        
-        return ["lucky_1", "kyouka_4"]
-    }
     @objc dynamic var isMaxLucky: Bool {
         
         let initial = master_ship.luck_0
@@ -235,22 +268,20 @@ extension Ship {
         return initial + growth >= max
     }
     
-    @objc class func keyPathsForValuesAffectingUpgradeLevel() -> Set<String> {
-        
-        return ["ship_id"]
-    }
     @objc dynamic var upgradeLevel: Int { return master_ship.afterlv }
     
-    @objc class func keyPathsForValuesAffectingUpgradeExp() -> Set<String> {
-        
-        return ["exp"]
-    }
     @objc dynamic var upgradeExp: NSNumber? {
         
         let upgradeLv = upgradeLevel
         
-        if upgradeLv <= 0 { return nil }
-        if levelUpExps.count < upgradeLv { return nil }
+        if upgradeLv <= 0 {
+            
+            return nil
+        }
+        if levelUpExps.count < upgradeLv {
+            
+            return nil
+        }
         
         let upExp = levelUpExps[upgradeLv - 1] - exp
         
@@ -261,24 +292,19 @@ extension Ship {
         
         let store = TemporaryDataStore.default
         
-        guard let _ = store.ensuredGuardEscaped(byShipId: id) else { return false }
+        guard let _ = store.ensuredGuardEscaped(byShipId: id) else {
+            
+            return false
+        }
         
         return true
     }
     
-    @objc class func keyPathsForValuesAffectingSteelRequiredInRepair() -> Set<String> {
-        
-        return ["nowhp"]
-    }
     @objc dynamic var steelRequiredInRepair: Int {
         
         return Int(Double(maxFuel) * 0.06 * Double(maxhp - nowhp))
     }
     
-    @objc class func keyPathsForValuesAffectingFuelRequiredInRepair() -> Set<String> {
-        
-        return ["nowhp"]
-    }
     @objc dynamic var fuelRequiredInRepair: Int {
         
         return Int(Double(maxFuel) * 0.032 * Double(maxhp - nowhp))
@@ -290,48 +316,76 @@ extension Ship {
     func setItem(_ id: Int, to slot: Int) {
         
         switch slot {
+            
         case 0: slot_0 = id
+            
         case 1: slot_1 = id
+            
         case 2: slot_2 = id
+            
         case 3: slot_3 = id
+            
         case 4: slot_4 = id
+            
         default: fatalError("Ship: setItem out of bounds.")
+            
         }
     }
     
     func slotItemId(_ index: Int) -> Int {
         
         switch index {
+            
         case 0: return slot_0
+            
         case 1: return slot_1
+            
         case 2: return slot_2
+            
         case 3: return slot_3
+            
         case 4: return slot_4
+            
         default: return 0
+            
         }
     }
     
     func slotItemCount(_ index: Int) -> Int {
         
         switch index {
+            
         case 0: return onslot_0
+            
         case 1: return onslot_1
+            
         case 2: return onslot_2
+            
         case 3: return onslot_3
+            
         case 4: return onslot_4
+            
         default: return 0
+            
         }
     }
     
     func slotItemMax(_ index: Int) -> Int {
         
         switch index {
+            
         case 0: return master_ship.maxeq_0
+            
         case 1: return master_ship.maxeq_1
+            
         case 2: return master_ship.maxeq_2
+            
         case 3: return master_ship.maxeq_3
+            
         case 4: return master_ship.maxeq_4
+            
         default: return 0
+            
         }
     }
     
@@ -345,11 +399,6 @@ extension Ship {
         return (0...4).map(slotItemMax).reduce(0, +)
     }
     
-    @objc class func keyPathsForValuesAffectingSeiku() -> Set<String> {
-        
-        return ["slot_0", "slot_1", "slot_2", "slot_3", "slot_4",
-                   "onslot_0", "onslot_1", "onslot_2", "onslot_3", "onslot_4"]
-    }
     @objc dynamic var seiku: Int {
         
         return SeikuCalclator(ship: self).seiku