OSDN Git Service

swift4.0.2に対応
[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 final class DocksViewController: MainTabVIewItemViewController {
12     
13     deinit {
14         
15         [NSBindingName(#keyPath(deck2Time)), NSBindingName(#keyPath(mission2Name)),
16          NSBindingName(#keyPath(deck3Time)), NSBindingName(#keyPath(mission3Name)),
17          NSBindingName(#keyPath(deck4Time)), NSBindingName(#keyPath(mission4Name))]
18             .forEach(unbind)
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)
24         [NSBindingName(#keyPath(kDock1Time)), NSBindingName(#keyPath(kDock2Time)),
25          NSBindingName(#keyPath(kDock3Time)), NSBindingName(#keyPath(kDock4Time))]
26             .forEach(unbind)
27         
28         ["selection", "selection.no", "content.battleCell"]
29             .forEach { battleContoller.removeObserver(self, forKeyPath: $0) }
30     }
31     
32     @objc let managedObjectContext = ServerDataStore.default.context
33     @objc let battleManagedObjectController = TemporaryDataStore.default.context
34     let questListViewController = QuestListViewController()
35     
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) }
39     
40     @objc var nDock1Time: NSNumber?
41     @objc var nDock2Time: NSNumber?
42     @objc var nDock3Time: NSNumber?
43     @objc var nDock4Time: NSNumber?
44     
45     @objc var nDock1ShipName: String?
46     @objc var nDock2ShipName: String?
47     @objc var nDock3ShipName: String?
48     @objc var nDock4ShipName: String?
49     
50     @objc var kDock1Time: NSNumber?
51     @objc var kDock2Time: NSNumber?
52     @objc var kDock3Time: NSNumber?
53     @objc var kDock4Time: NSNumber?
54     
55     @objc var deck2Time: NSNumber?
56     @objc var deck3Time: NSNumber?
57     @objc var deck4Time: NSNumber?
58     
59     @objc var mission2Name: String?
60     @objc var mission3Name: String?
61     @objc var mission4Name: String?
62     
63     @IBOutlet var battleContoller: NSObjectController!
64     @IBOutlet weak var questListViewPlaceholder: NSView!
65     @IBOutlet weak var cellNumberField: NSTextField!
66     
67     override var nibName: NSNib.Name {
68         
69         return .nibName(instanceOf: self)
70     }
71     
72     var battle: Battle? {
73         
74         return TemporaryDataStore.default.battle()
75     }
76     
77     @objc var cellNumber: Int {
78         
79         return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
80     }
81     
82     var battleCellNumber: Int {
83         
84         return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
85     }
86     
87     var isBossCell: Bool {
88         
89         return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
90     }
91     
92     var fleetName: String? {
93         
94         guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
95         
96         return ServerDataStore.default.deck(by: deckId)?.name
97     }
98     
99     var areaNumber: String? {
100         
101         let mapArea: String = {
102             
103             guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
104             
105             if mapArea > 10 { return "E" }
106             
107             return "\(mapArea)"
108         }()
109         
110         guard mapArea != "" else { return nil }
111         
112         guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
113         
114         return "\(mapArea)-\(mapInfo)"
115     }
116     
117     var areaName: String? {
118         
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 }
121         
122         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
123     }
124     
125     @objc var sortieString: String? {
126         
127         guard let fleetName = self.fleetName,
128             let areaName = self.areaName,
129             let areaNumber = self.areaNumber else { return nil }
130         
131         if battleCellNumber == 0 {
132             
133             let format = LocalizedStrings.sortieInfomation.string
134             
135             return String(format: format, arguments: [fleetName, areaName, areaNumber])
136         }
137         if isBossCell {
138             
139             let format = LocalizedStrings.battleWithBOSS.string
140             
141             return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
142         }
143         
144         let format = LocalizedStrings.battleInformation.string
145         
146         return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
147     }
148     
149     override func viewDidLoad() {
150         
151         super.viewDidLoad()
152         
153         setupStatus()
154         
155         AppDelegate.shared.addCounterUpdate {
156             
157             self.missionStates.forEach { $0.update() }
158             self.kdockStatus.forEach { $0.update() }
159             self.ndockStatus.forEach { $0.update() }
160         }
161         
162         questListViewController.view.frame = questListViewPlaceholder.frame
163         questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
164         questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
165         
166         ["selection", "selection.no", "content.battleCell"]
167             .forEach { battleContoller.addObserver(self, forKeyPath: $0, context: nil) }
168         
169         #if DEBUG
170             cellNumberField.isHidden = false
171         #endif
172     }
173     
174     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
175         
176         if keyPath == "selection" || keyPath == "content.battleCell" {
177             
178             notifyChangeValue(forKey: #keyPath(sortieString))
179             
180             return
181         }
182         
183         if keyPath == "selection.no" {
184             
185             notifyChangeValue(forKey: #keyPath(cellNumber))
186             
187             return
188         }
189         
190         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
191     }
192     
193     private func setupStatus() {
194         
195         let missionKeys = [
196             (#keyPath(deck2Time), #keyPath(mission2Name)),
197             (#keyPath(deck3Time), #keyPath(mission3Name)),
198             (#keyPath(deck4Time), #keyPath(mission4Name))
199         ]
200         zip(missionStates, missionKeys).forEach {
201             
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)
204         }
205         
206         let ndockKeys = [
207             (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
208             (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
209             (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
210             (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
211         ]
212         zip(ndockStatus, ndockKeys).forEach {
213             
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)
216         }
217         
218         let kdockKeys = [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
219         zip(kdockStatus, kdockKeys).forEach {
220             
221             bind(NSBindingName(rawValue: $0.1), to: $0.0, withKeyPath: #keyPath(KenzoDockStatus.time), options: nil)
222         }
223     }
224     
225 }