OSDN Git Service

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