import Cocoa
-// swiftlint:disable variable_name
+// swiftlint:disable identifier_name
final class Ship: KCManagedObject {
@NSManaged dynamic var bull: Int
@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
@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 []
}
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 []
}
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
+
}
}
}
@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
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
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
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
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
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
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))
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
+
}
}
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