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))]
18 .forEach { unbind($0) }
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))]
23 .forEach { unbind($0) }
24 [NSBindingName(#keyPath(kDock1Time)), NSBindingName(#keyPath(kDock2Time)),
25 NSBindingName(#keyPath(kDock3Time)), NSBindingName(#keyPath(kDock4Time))]
26 .forEach { unbind($0) }
28 ["selection", "selection.no", "content.battleCell"]
30 battleContoller.removeObserver(self, forKeyPath: $0)
34 @objc let managedObjectContext = ServerDataStore.default.context
35 @objc let battleManagedObjectController = TemporaryDataStore.default.context
36 let questListViewController = QuestListViewController()
38 let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
39 let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
40 let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
42 @objc var nDock1Time: NSNumber?
43 @objc var nDock2Time: NSNumber?
44 @objc var nDock3Time: NSNumber?
45 @objc var nDock4Time: NSNumber?
47 @objc var nDock1ShipName: String?
48 @objc var nDock2ShipName: String?
49 @objc var nDock3ShipName: String?
50 @objc var nDock4ShipName: String?
52 @objc var kDock1Time: NSNumber?
53 @objc var kDock2Time: NSNumber?
54 @objc var kDock3Time: NSNumber?
55 @objc var kDock4Time: NSNumber?
57 @objc var deck2Time: NSNumber?
58 @objc var deck3Time: NSNumber?
59 @objc var deck4Time: NSNumber?
61 @objc var mission2Name: String?
62 @objc var mission3Name: String?
63 @objc var mission4Name: String?
65 @IBOutlet var battleContoller: NSObjectController!
66 @IBOutlet weak var questListViewPlaceholder: NSView!
67 @IBOutlet weak var cellNumberField: NSTextField!
69 override var nibName: NSNib.Name {
71 return .nibName(instanceOf: self)
76 return TemporaryDataStore.default.battle()
79 @objc var cellNumber: Int {
81 return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
84 var battleCellNumber: Int {
86 return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
89 var isBossCell: Bool {
91 return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
94 var fleetName: String? {
96 guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
98 return ServerDataStore.default.deck(by: deckId)?.name
101 var areaNumber: String? {
103 let mapArea: String = {
105 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
107 if mapArea > 10 { return "E" }
112 guard mapArea != "" else { return nil }
114 guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
116 return "\(mapArea)-\(mapInfo)"
119 var areaName: String? {
121 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return nil }
122 guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return nil }
124 return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
127 @objc var sortieString: String? {
129 guard let fleetName = self.fleetName,
130 let areaName = self.areaName,
131 let areaNumber = self.areaNumber else { return nil }
133 if battleCellNumber == 0 {
135 let format = LocalizedStrings.sortieInfomation.string
137 return String(format: format, arguments: [fleetName, areaName, areaNumber])
141 let format = LocalizedStrings.battleWithBOSS.string
143 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
146 let format = LocalizedStrings.battleInformation.string
148 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
151 override func viewDidLoad() {
157 AppDelegate.shared.addCounterUpdate {
159 self.missionStates.forEach { $0.update() }
160 self.kdockStatus.forEach { $0.update() }
161 self.ndockStatus.forEach { $0.update() }
164 questListViewController.view.frame = questListViewPlaceholder.frame
165 questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
166 questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
168 ["selection", "selection.no", "content.battleCell"]
170 battleContoller.addObserver(self, forKeyPath: $0, context: nil)
174 cellNumberField.isHidden = false
178 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
180 if keyPath == "selection" || keyPath == "content.battleCell" {
182 notifyChangeValue(forKey: #keyPath(sortieString))
187 if keyPath == "selection.no" {
189 notifyChangeValue(forKey: #keyPath(cellNumber))
194 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
197 private func setupStatus() {
200 (#keyPath(deck2Time), #keyPath(mission2Name)),
201 (#keyPath(deck3Time), #keyPath(mission3Name)),
202 (#keyPath(deck4Time), #keyPath(mission4Name))
204 zip(missionStates, missionKeys).forEach {
206 bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
207 bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
211 (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
212 (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
213 (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
214 (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
216 zip(ndockStatus, ndockKeys).forEach {
218 bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
219 bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
222 let kdockKeys = [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
223 zip(kdockStatus, kdockKeys).forEach {
225 bind(NSBindingName(rawValue: $0.1), to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)