OSDN Git Service

AppDelegateからウインドウに関する部分を分離した
[kcd/KCD.git] / KCD / DocksViewController.swift
1 //
2 //  DocksViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/25.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 class DocksViewController: MainTabVIewItemViewController {
12     deinit {
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) }
24         
25         ["selection", "selection.no", "content.battleCell"]
26             .forEach {
27             battleContoller.removeObserver(self, forKeyPath: $0)
28         }
29     }
30     
31     let managedObjectContext = ServerDataStore.default.context
32     let battleManagedObjectController = TemporaryDataStore.default.context
33     let questListViewController = QuestListViewController()
34     
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) }
38     
39     var nDock1Time: NSNumber?
40     var nDock2Time: NSNumber?
41     var nDock3Time: NSNumber?
42     var nDock4Time: NSNumber?
43     
44     var nDock1ShipName: String?
45     var nDock2ShipName: String?
46     var nDock3ShipName: String?
47     var nDock4ShipName: String?
48     
49     var kDock1Time: NSNumber?
50     var kDock2Time: NSNumber?
51     var kDock3Time: NSNumber?
52     var kDock4Time: NSNumber?
53     
54     var deck2Time: NSNumber?
55     var deck3Time: NSNumber?
56     var deck4Time: NSNumber?
57     
58     var mission2Name: String?
59     var mission3Name: String?
60     var mission4Name: String?
61     
62     @IBOutlet var battleContoller: NSObjectController!
63     @IBOutlet weak var questListViewPlaceholder: NSView!
64     @IBOutlet weak var cellNumberField: NSTextField!
65     
66     override var nibName: String! {
67         return "DocksViewController"
68     }
69     
70     var battle: Battle? {
71         return TemporaryDataStore.default.battle()
72     }
73     
74     var cellNumber: Int {
75         return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
76     }
77     var battleCellNumber: Int {
78         return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
79     }
80     var isBossCell: Bool {
81         return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
82     }
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
86     }
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" }
91             return "\(mapArea)"
92         }()
93         guard mapArea != "" else { return nil }
94         guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
95         return "\(mapArea)-\(mapInfo)"
96     }
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
100             else { return nil }
101         
102         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
103     }
104     var sortieString: String? {
105         guard let fleetName = self.fleetName,
106             let areaName = self.areaName,
107             let areaNumber = self.areaNumber
108             else { return nil }
109         if battleCellNumber == 0 {
110             let format = NSLocalizedString("%@ in sortie into %@ (%@)", comment: "Sortie")
111             return String(format: format, arguments: [fleetName, areaName, areaNumber])
112         }
113         if isBossCell {
114             let format = NSLocalizedString("%@ battle against the enemy main fleet at %@ war zone in %@ (%@) now",
115                                            comment: "Sortie")
116             return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
117         }
118         let format = NSLocalizedString("%@ battle at %@ war zone in %@ (%@) now", comment: "Sortie")
119         return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
120     }
121     
122     override func viewDidLoad() {
123         super.viewDidLoad()
124         
125         setupStatus()
126         
127         AppDelegate.shared.addCounterUpdate {
128             self.missionStates.forEach { $0.update() }
129             self.kdockStatus.forEach { $0.update() }
130             self.ndockStatus.forEach { $0.update() }
131         }
132         
133         questListViewController.view.frame = questListViewPlaceholder.frame
134         questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
135         questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
136         
137         ["selection", "selection.no", "content.battleCell"]
138             .forEach {
139                 battleContoller.addObserver(self, forKeyPath: $0, context: nil)
140         }
141         
142         #if DEBUG
143             cellNumberField.isHidden = false
144         #endif
145     }
146     
147     override func observeValue(forKeyPath keyPath: String?,
148                                of object: Any?,
149                                change: [NSKeyValueChangeKey: Any]?,
150                                context: UnsafeMutableRawPointer?) {
151         if keyPath == "selection" || keyPath == "content.battleCell" {
152             notifyChangeValue(forKey: #keyPath(sortieString))
153             return
154         }
155         if keyPath == "selection.no" {
156             notifyChangeValue(forKey: #keyPath(cellNumber))
157             return
158         }
159         
160         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
161     }
162     
163     private func setupStatus() {
164         let missionKeys = [
165             (#keyPath(deck2Time), #keyPath(mission2Name)),
166             (#keyPath(deck3Time), #keyPath(mission3Name)),
167             (#keyPath(deck4Time), #keyPath(mission4Name))
168         ]
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)
172         }
173         
174         let ndockKeys = [
175             (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
176             (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
177             (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
178             (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
179         ]
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)
183         }
184         
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)
188         }
189     }
190     
191 }