OSDN Git Service

guard の書き方を統一した
[kcd/KCD.git] / KCD / FleetViewController.swift
index 2ce1967..36d8f08 100644 (file)
@@ -15,8 +15,8 @@ enum FleetViewType: Int {
     case miniVierticalType = 2
 }
 
-fileprivate var shipKeysContext: Int = 0
-fileprivate var shipsContext: Int = 0
+private var shipKeysContext: Int = 0
+private var shipsContext: Int = 0
 
 final class FleetViewController: NSViewController {
     
@@ -49,7 +49,7 @@ final class FleetViewController: NSViewController {
     
     private static let maxFleetNumber: Int = 4
     
-    fileprivate let details: [ShipDetailViewController]
+    private let details: [ShipDetailViewController]
     private let shipKeys = ["ship_0", "ship_1", "ship_2", "ship_3", "ship_4", "ship_5"]
     private let type: FleetViewType
     private let fleetController = NSObjectController()
@@ -69,19 +69,18 @@ final class FleetViewController: NSViewController {
         }()
         details = (1...6).map {
             
-            guard let res = ShipDetailViewController(type: shipiewType)
-                else { fatalError("Can not create ShipDetailViewController") }
+            guard let res = ShipDetailViewController(type: shipiewType) else { fatalError("Can not create ShipDetailViewController") }
             
             res.title = "\($0)"
             
             return res
         }
         
-        let nibName: String = {
+        let nibName: NSNib.Name = {
             switch viewType {
-            case .detailViewType: return "FleetViewController"
-            case .minimumViewType: return "FleetMinimumViewController"
-            case .miniVierticalType: return "VerticalFleetViewController"
+            case .detailViewType: return FleetViewController.nibName
+            case .minimumViewType: return NSNib.Name("FleetMinimumViewController")
+            case .miniVierticalType: return NSNib.Name("VerticalFleetViewController")
             }
         }()
         
@@ -105,7 +104,7 @@ final class FleetViewController: NSViewController {
     @IBOutlet weak var placeholder05: NSView!
     @IBOutlet weak var placeholder06: NSView!
     
-    dynamic var fleetNumber: Int = 1 {
+    @objc dynamic var fleetNumber: Int = 1 {
         
         didSet {
             ServerDataStore.default
@@ -114,7 +113,7 @@ final class FleetViewController: NSViewController {
         }
     }
     
-    dynamic var fleet: Deck? {
+    @objc dynamic var fleet: Deck? {
         
         get { return representedObject as? Deck }
         set {
@@ -174,14 +173,30 @@ final class FleetViewController: NSViewController {
         }
     }
     
-    var totalSakuteki: Double { return sakutekiCalculator.calculate(ships) }
-    var totalSeiku: Int { return ships.reduce(0) { $0 + $1.seiku } }
-    var totalCalclatedSeiku: Int { return ships.reduce(0) { $0 + $1.totalSeiku } }
-    var totalLevel: Int { return ships.reduce(0) { $0 + $1.lv } }
-    var totalDrums: Int { return ships.reduce(0) { $0 + $1.totalDrums } }
+    @objc var totalSakuteki: Double { return sakutekiCalculator.calculate(ships) }
+    @objc var totalSeiku: Int { return ships.reduce(0) { $0 + $1.seiku } }
+    @objc var totalCalclatedSeiku: Int { return ships.reduce(0) { $0 + totalSeiku(of: $1) } }
+    @objc var totalLevel: Int { return ships.reduce(0) { $0 + $1.lv } }
+    @objc var totalDrums: Int { return ships.reduce(0) { $0 + totalDrums(of: $1) } }
+    @objc var totalTPValue: Int {
+        
+        return ships
+            .map { ShipTPValueCalculator($0) }
+            .map { $0.value }
+            .reduce(0, +)
+        
+    }
     
+    func totalSeiku(of ship: Ship) -> Int {
+        
+        return SeikuCalclator(ship: ship).totalSeiku
+    }
+    func totalDrums(of ship: Ship) -> Int {
+        
+        return (0...4).flatMap(ship.slotItem).filter { $0.slotitem_id == 75 }.count
+    }
     
-    fileprivate var ships: [Ship] = [] {
+    private var ships: [Ship] = [] {
         
         willSet {
             ships.forEach { ship in
@@ -205,7 +220,7 @@ final class FleetViewController: NSViewController {
     
     private(set) var anchorageRepair = AnchorageRepairManager.default
     
-    dynamic fileprivate(set) var repairTime: NSNumber?
+    @objc dynamic private(set) var repairTime: NSNumber?
     
     override func viewDidLoad() {
         
@@ -220,7 +235,7 @@ final class FleetViewController: NSViewController {
             sakutekiCalculator = Formula33(Int(factor))
         }
         
-        fleetController.bind("content", to:self, withKeyPath:#keyPath(fleet), options:nil)
+        fleetController.bind(NSBindingName("content"), to:self, withKeyPath:#keyPath(fleet), options:nil)
         fleetController.addObserver(self, forKeyPath:"selection.name", context:nil)
         shipKeys.forEach {
             
@@ -251,12 +266,22 @@ final class FleetViewController: NSViewController {
                 
                 self.notifyChangeValue(forKey: #keyPath(fleetNumber))
         }
+        
+        NotificationCenter
+            .default
+            .addObserver(forName: .DidUpdateGuardEscape, object: nil, queue: nil) { [weak self] _ in
+                
+                guard let `self` = self else { return }
+                
+                self.notifyChangeValue(forKey: #keyPath(totalSeiku))
+                self.notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
+                self.notifyChangeValue(forKey: #keyPath(totalSakuteki))
+                self.notifyChangeValue(forKey: #keyPath(totalDrums))
+                self.notifyChangeValue(forKey: #keyPath(totalTPValue))
+        }
     }
     
-    override func observeValue(forKeyPath keyPath: String?,
-                               of object: Any?,
-                               change: [NSKeyValueChangeKey: Any]?,
-                               context: UnsafeMutableRawPointer?) {
+    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
         
         
         if keyPath == "selection.name" {
@@ -281,9 +306,12 @@ final class FleetViewController: NSViewController {
                 case "equippedItem":
                     notifyChangeValue(forKey: #keyPath(totalSakuteki))
                     notifyChangeValue(forKey: #keyPath(totalDrums))
+                    notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
+                    notifyChangeValue(forKey: #keyPath(totalTPValue))
                     
                 case "seiku":
                     notifyChangeValue(forKey: #keyPath(totalSeiku))
+                    notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
                     
                 case "lv":
                     notifyChangeValue(forKey: #keyPath(totalLevel))
@@ -312,8 +340,7 @@ final class FleetViewController: NSViewController {
     
     @IBAction func changeSakutekiCalculator(_ sender: Any?) {
         
-        guard let menuItem = sender as? NSMenuItem
-            else { return }
+        guard let menuItem = sender as? NSMenuItem else { return }
         
         switch menuItem.tag {
         case 0:
@@ -354,7 +381,8 @@ final class FleetViewController: NSViewController {
         ships = array.flatMap { $0 }
         
         [#keyPath(totalSakuteki), #keyPath(totalSeiku), #keyPath(totalCalclatedSeiku),
-         #keyPath(totalLevel), #keyPath(totalDrums), #keyPath(repairable)]
+         #keyPath(totalLevel), #keyPath(totalDrums), #keyPath(repairable),
+         #keyPath(totalTPValue)]
             .forEach { notifyChangeValue(forKey: $0) }
     }
 }
@@ -363,8 +391,7 @@ extension FleetViewController {
     
     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         
-        guard let action = menuItem.action
-            else { return false }
+        guard let action = menuItem.action else { return false }
         
         switch action {
             
@@ -372,7 +399,7 @@ extension FleetViewController {
             
             if let _ = sakutekiCalculator as? SimpleCalculator {
                 
-                menuItem.state = menuItem.tag == 0 ? NSOnState : NSOffState
+                menuItem.state = (menuItem.tag == 0 ? .on : .off)
                 
                 return true
                 
@@ -380,7 +407,7 @@ extension FleetViewController {
                 
                 let cond = 100 + sakuObj.condition
                 
-                menuItem.state = menuItem.tag == cond ? NSOnState : NSOffState
+                menuItem.state = (menuItem.tag == cond ? .on : .off)
                 
                 return true
             }
@@ -397,27 +424,28 @@ extension FleetViewController {
     private func reorder(order: [Int]) {
         
         guard order.count == 6 else {
+            
             print("FleetViewController: order count is not 6.")
             return
         }
         
-        let views: [NSView] = details.map { $0.view }
-        let options: [NSAutoresizingMaskOptions] = views.map { $0.autoresizingMask }
+        let views = details.map { $0.view }
+        let options = views.map { $0.autoresizingMask }
         let reorderedOptions = order.map { options[$0] }
         zip(views, reorderedOptions).forEach { $0.0.autoresizingMask = $0.1 }
         
-        let frames: [NSRect] = views.map { $0.frame }
+        let frames = views.map { $0.frame }
         let reorderedFrames = order.map { frames[$0] }
         zip(views, reorderedFrames)
             .forEach { $0.0.setFrame($0.1, animate: enableAnimation) }
     }
     
-    fileprivate func reorderShipToDoubleLine() {
+    private func reorderShipToDoubleLine() {
         
         reorder(order: [0, 3, 1, 4, 2, 5])
     }
     
-    fileprivate func reorderShipToLeftToRight() {
+    private func reorderShipToLeftToRight() {
         
         reorder(order: [0, 2, 4, 1, 3, 5])
     }
@@ -447,11 +475,12 @@ extension FleetViewController {
     
     private var repairShipIds: [Int] { return [19] }
     
-    dynamic var repairable: Bool {
+    @objc dynamic var repairable: Bool {
         
-        guard let flagShip = fleet?[0]
-            else { return false }
+        guard let flagShip = fleet?[0] else { return false }
         
         return repairShipIds.contains(flagShip.master_ship.stype.id)
     }
 }
+
+extension FleetViewController: NibLoadable {}