2 // DocksViewController.swift
5 // Created by Hori,Masaki on 2016/12/25.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 final class DocksViewController: MainTabVIewItemViewController {
15 [NSBindingName(#keyPath(deck2Time)), NSBindingName(#keyPath(mission2Name)),
16 NSBindingName(#keyPath(deck3Time)), NSBindingName(#keyPath(mission3Name)),
17 NSBindingName(#keyPath(deck4Time)), NSBindingName(#keyPath(mission4Name))]
19 [NSBindingName(#keyPath(nDock1Time)), NSBindingName(#keyPath(nDock1ShipName)),
20 NSBindingName(#keyPath(nDock2Time)), NSBindingName(#keyPath(nDock2ShipName)),
21 NSBindingName(#keyPath(nDock3Time)), NSBindingName(#keyPath(nDock3ShipName)),
22 NSBindingName(#keyPath(nDock4Time)), NSBindingName(#keyPath(nDock4ShipName))]
24 [NSBindingName(#keyPath(kDock1Time)), NSBindingName(#keyPath(kDock2Time)),
25 NSBindingName(#keyPath(kDock3Time)), NSBindingName(#keyPath(kDock4Time))]
28 ["selection", "selection.no", "content.battleCell"]
29 .forEach { battleContoller.removeObserver(self, forKeyPath: $0) }
32 @objc let managedObjectContext = ServerDataStore.default.context
33 @objc let battleManagedObjectController = TemporaryDataStore.default.context
34 let questListViewController = QuestListViewController()
36 let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
37 let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
38 let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
40 @objc var nDock1Time: NSNumber?
41 @objc var nDock2Time: NSNumber?
42 @objc var nDock3Time: NSNumber?
43 @objc var nDock4Time: NSNumber?
45 @objc var nDock1ShipName: String?
46 @objc var nDock2ShipName: String?
47 @objc var nDock3ShipName: String?
48 @objc var nDock4ShipName: String?
50 @objc var kDock1Time: NSNumber?
51 @objc var kDock2Time: NSNumber?
52 @objc var kDock3Time: NSNumber?
53 @objc var kDock4Time: NSNumber?
55 @objc var deck2Time: NSNumber?
56 @objc var deck3Time: NSNumber?
57 @objc var deck4Time: NSNumber?
59 @objc var mission2Name: String?
60 @objc var mission3Name: String?
61 @objc var mission4Name: String?
63 @IBOutlet var battleContoller: NSObjectController!
64 @IBOutlet weak var questListViewPlaceholder: NSView!
65 @IBOutlet weak var cellNumberField: NSTextField!
67 override var nibName: NSNib.Name {
69 return .nibName(instanceOf: self)
74 return TemporaryDataStore.default.battle()
77 @objc var cellNumber: Int {
79 return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
82 var battleCellNumber: Int {
84 return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
87 var isBossCell: Bool {
89 return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
92 var fleetName: String? {
94 guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
96 return ServerDataStore.default.deck(by: deckId)?.name
99 var areaNumber: String? {
101 let mapArea: String = {
103 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
105 if mapArea > 10 { return "E" }
110 guard mapArea != "" else { return nil }
112 guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
114 return "\(mapArea)-\(mapInfo)"
117 var areaName: String? {
119 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return nil }
120 guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return nil }
122 return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
125 @objc var sortieString: String? {
127 guard let fleetName = self.fleetName,
128 let areaName = self.areaName,
129 let areaNumber = self.areaNumber else { return nil }
131 if battleCellNumber == 0 {
133 let format = LocalizedStrings.sortieInfomation.string
135 return String(format: format, arguments: [fleetName, areaName, areaNumber])
139 let format = LocalizedStrings.battleWithBOSS.string
141 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
144 let format = LocalizedStrings.battleInformation.string
146 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
149 override func viewDidLoad() {
155 AppDelegate.shared.addCounterUpdate {
157 self.missionStates.forEach { $0.update() }
158 self.kdockStatus.forEach { $0.update() }
159 self.ndockStatus.forEach { $0.update() }
162 questListViewController.view.frame = questListViewPlaceholder.frame
163 questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
164 questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
166 ["selection", "selection.no", "content.battleCell"]
167 .forEach { battleContoller.addObserver(self, forKeyPath: $0, context: nil) }
170 cellNumberField.isHidden = false
174 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
176 if keyPath == "selection" || keyPath == "content.battleCell" {
178 notifyChangeValue(forKey: #keyPath(sortieString))
183 if keyPath == "selection.no" {
185 notifyChangeValue(forKey: #keyPath(cellNumber))
190 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
193 private func setupStatus() {
196 (#keyPath(deck2Time), #keyPath(mission2Name)),
197 (#keyPath(deck3Time), #keyPath(mission3Name)),
198 (#keyPath(deck4Time), #keyPath(mission4Name))
200 zip(missionStates, missionKeys).forEach {
202 bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
203 bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
207 (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
208 (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
209 (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
210 (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
212 zip(ndockStatus, ndockKeys).forEach {
214 bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(NyukyoDockStatus.time), options: nil)
215 bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(NyukyoDockStatus.name), options: nil)
218 let kdockKeys = [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
219 zip(kdockStatus, kdockKeys).forEach {
221 bind(NSBindingName(rawValue: $0.1), to: $0.0, withKeyPath: #keyPath(KenzoDockStatus.time), options: nil)