2 // DocksViewController.swift
5 // Created by Hori,Masaki on 2016/12/25.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 class DocksViewController: MainTabVIewItemViewController {
13 [#keyPath(deck2Time), #keyPath(mission2Name),
14 #keyPath(deck3Time), #keyPath(mission3Name),
15 #keyPath(deck4Time), #keyPath(mission4Name)]
16 .forEach { unbind($0) }
17 [#keyPath(nDock1Time), #keyPath(nDock1ShipName),
18 #keyPath(nDock2Time), #keyPath(nDock2ShipName),
19 #keyPath(nDock3Time), #keyPath(nDock3ShipName),
20 #keyPath(nDock4Time), #keyPath(nDock4ShipName)]
21 .forEach { unbind($0) }
22 [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
23 .forEach { unbind($0) }
25 ["selection", "selection.no", "content.battleCell"]
27 battleContoller.removeObserver(self, forKeyPath: $0)
31 let managedObjectContext = ServerDataStore.default.context
32 let battleManagedObjectController = TemporaryDataStore.default.context
33 let questListViewController = QuestListViewController()
35 let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
36 let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
37 let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
39 var nDock1Time: NSNumber?
40 var nDock2Time: NSNumber?
41 var nDock3Time: NSNumber?
42 var nDock4Time: NSNumber?
44 var nDock1ShipName: String?
45 var nDock2ShipName: String?
46 var nDock3ShipName: String?
47 var nDock4ShipName: String?
49 var kDock1Time: NSNumber?
50 var kDock2Time: NSNumber?
51 var kDock3Time: NSNumber?
52 var kDock4Time: NSNumber?
54 var deck2Time: NSNumber?
55 var deck3Time: NSNumber?
56 var deck4Time: NSNumber?
58 var mission2Name: String?
59 var mission3Name: String?
60 var mission4Name: String?
62 @IBOutlet var battleContoller: NSObjectController!
63 @IBOutlet weak var questListViewPlaceholder: NSView!
64 @IBOutlet weak var cellNumberField: NSTextField!
66 override var nibName: String! {
67 return "DocksViewController"
71 return TemporaryDataStore.default.battle()
75 return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
77 var battleCellNumber: Int {
78 return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
80 var isBossCell: Bool {
81 return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
83 var fleetName: String? {
84 guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
85 return ServerDataStore.default.deck(by: deckId)?.name
87 var areaNumber: String? {
88 let mapArea: String = {
89 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
90 if mapArea > 10 { return "E" }
93 guard mapArea != "" else { return nil }
94 guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
95 return "\(mapArea)-\(mapInfo)"
97 var areaName: String? {
98 guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int,
99 let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int
102 return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
104 var sortieString: String? {
105 guard let fleetName = self.fleetName,
106 let areaName = self.areaName,
107 let areaNumber = self.areaNumber
109 if battleCellNumber == 0 {
110 let format = NSLocalizedString("%@ in sortie into %@ (%@)", comment: "Sortie")
111 return String(format: format, arguments: [fleetName, areaName, areaNumber])
114 let format = NSLocalizedString("%@ battle against the enemy main fleet at %@ war zone in %@ (%@) now",
116 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
118 let format = NSLocalizedString("%@ battle at %@ war zone in %@ (%@) now", comment: "Sortie")
119 return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
122 override func viewDidLoad() {
127 AppDelegate.shared.addCounterUpdate {
128 self.missionStates.forEach { $0.update() }
129 self.kdockStatus.forEach { $0.update() }
130 self.ndockStatus.forEach { $0.update() }
133 questListViewController.view.frame = questListViewPlaceholder.frame
134 questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
135 questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
137 ["selection", "selection.no", "content.battleCell"]
139 battleContoller.addObserver(self, forKeyPath: $0, context: nil)
143 cellNumberField.isHidden = false
147 override func observeValue(forKeyPath keyPath: String?,
149 change: [NSKeyValueChangeKey: Any]?,
150 context: UnsafeMutableRawPointer?) {
151 if keyPath == "selection" || keyPath == "content.battleCell" {
152 notifyChangeValue(forKey: #keyPath(sortieString))
155 if keyPath == "selection.no" {
156 notifyChangeValue(forKey: #keyPath(cellNumber))
160 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
163 private func setupStatus() {
165 (#keyPath(deck2Time), #keyPath(mission2Name)),
166 (#keyPath(deck3Time), #keyPath(mission3Name)),
167 (#keyPath(deck4Time), #keyPath(mission4Name))
169 zip(missionStates, missionKeys).forEach {
170 bind($0.1.0, to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
171 bind($0.1.1, to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
175 (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
176 (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
177 (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
178 (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
180 zip(ndockStatus, ndockKeys).forEach {
181 bind($0.1.0, to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
182 bind($0.1.1, to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
185 let kdockKeys = [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
186 zip(kdockStatus, kdockKeys).forEach {
187 bind($0.1, to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)