OSDN Git Service

Squashed commit of the following: Swiftに変換した
[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         [("deck2Time", "mission2Name"),
14          ("deck3Time", "mission3Name"),
15          ("deck4Time", "mission4Name")]
16             .forEach {
17                 unbind($0.0)
18                 unbind($0.1)
19         }
20         [("nDock1Time", "nDock1ShipName"),
21          ("nDock2Time", "nDock2ShipName"),
22          ("nDock3Time", "nDock3ShipName"),
23          ("nDock4Time", "nDock4ShipName")]
24             .forEach {
25                 unbind($0.0)
26                 unbind($0.1)
27         }
28         ["kDock1Time", "kDock2Time", "kDock3Time", "kDock4Time",]
29             .forEach { unbind($0) }
30         
31         ["selection", "selection.no", "content.battleCell"]
32             .forEach {
33             battleContoller.removeObserver(self, forKeyPath: $0)
34         }
35     }
36     
37     let managedObjectContext = ServerDataStore.default.managedObjectContext
38     let battleManagedObjectController = TemporaryDataStore.default.managedObjectContext
39     let questListViewController = QuestListViewController()
40     
41     let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
42     let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
43     let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
44     
45     var nDock1Time: NSNumber? = nil
46     var nDock2Time: NSNumber? = nil
47     var nDock3Time: NSNumber? = nil
48     var nDock4Time: NSNumber? = nil
49     
50     var nDock1ShipName: String? = nil
51     var nDock2ShipName: String? = nil
52     var nDock3ShipName: String? = nil
53     var nDock4ShipName: String? = nil
54     
55     var kDock1Time: NSNumber? = nil
56     var kDock2Time: NSNumber? = nil
57     var kDock3Time: NSNumber? = nil
58     var kDock4Time: NSNumber? = nil
59     
60     var deck2Time: NSNumber? = nil
61     var deck3Time: NSNumber? = nil
62     var deck4Time: NSNumber? = nil
63     
64     var mission2Name: String? = nil
65     var mission3Name: String? = nil
66     var mission4Name: String? = nil
67     
68     @IBOutlet var battleContoller: NSObjectController!
69     @IBOutlet weak var questListViewPlaceholder: NSView!
70     @IBOutlet weak var cellNumberField: NSTextField!
71     
72     override var nibName: String! {
73         return "DocksViewController"
74     }
75     
76     var battle: KCBattle? {
77         return TemporaryDataStore.default.battle()
78     }
79     
80     var cellNumber: Int {
81         return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
82     }
83     var battleCellNumber: Int {
84         return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
85     }
86     var isBossCell: Bool {
87         return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
88     }
89     var fleetName: String? {
90         guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
91         return ServerDataStore.default.deck(byId: deckId)?.name
92     }
93     var areaNumber: String? {
94         let mapArea: String = {
95             guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
96             if mapArea > 10 { return "E" }
97             return "\(mapArea)"
98         }()
99         guard mapArea != "" else { return nil }
100         guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
101         return "\(mapArea)-\(mapInfo)"
102     }
103     var areaName: String? {
104         guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int,
105             let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int
106             else { return nil }
107         
108         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
109     }
110     var sortieString: String? {
111         guard let fleetName = self.fleetName,
112             let areaName = self.areaName,
113             let areaNumber = self.areaNumber
114             else { return nil }
115         if battleCellNumber == 0 {
116             let format = NSLocalizedString("%@ in sortie into %@ (%@)", comment: "Sortie")
117             return String(format: format, arguments: [fleetName, areaName, areaNumber])
118         }
119         if isBossCell {
120             let format = NSLocalizedString("%@ battle against the enemy main fleet at %@ war zone in %@ (%@) now", comment: "Sortie")
121             return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
122         }
123         let format = NSLocalizedString("%@ battle at %@ war zone in %@ (%@) now", comment: "Sortie")
124         return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
125     }
126     
127     override func viewDidLoad() {
128         super.viewDidLoad()
129         
130         setupStatus()
131         
132         let appDelegate = NSApplication.shared().delegate as! AppDelegate
133         appDelegate.addCounterUpdate {
134             self.missionStates.forEach { $0.update() }
135             self.kdockStatus.forEach { $0.update() }
136             self.ndockStatus.forEach { $0.update() }
137         }
138         
139         questListViewController.view.frame = questListViewPlaceholder.frame
140         questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
141         questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
142         
143         ["selection", "selection.no", "content.battleCell"]
144             .forEach {
145                 battleContoller.addObserver(self, forKeyPath: $0, context: nil)
146         }
147         
148         #if DEBUG
149             cellNumberField.isHidden = false
150         #endif
151     }
152     
153     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
154         if keyPath == "selection" || keyPath == "content.battleCell" {
155             willChangeValue(forKey: "sortieString")
156             didChangeValue(forKey: "sortieString")
157             return
158         }
159         if keyPath == "selection.no" {
160             willChangeValue(forKey: "cellNumber")
161             didChangeValue(forKey: "cellNumber")
162             return
163         }
164         
165         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
166     }
167     
168     private func setupStatus() {
169         let missionKeys = [
170             ("deck2Time", "mission2Name"),
171             ("deck3Time", "mission3Name"),
172             ("deck4Time", "mission4Name")
173         ]
174         zip(missionStates, missionKeys).forEach {
175             bind($0.1.0, to: $0.0, withKeyPath: "time", options: nil)
176             bind($0.1.1, to: $0.0, withKeyPath: "name", options: nil)
177         }
178         
179         let ndockKeys = [
180             ("nDock1Time", "nDock1ShipName"),
181             ("nDock2Time", "nDock2ShipName"),
182             ("nDock3Time", "nDock3ShipName"),
183             ("nDock4Time", "nDock4ShipName")
184         ]
185         zip(ndockStatus, ndockKeys).forEach {
186             bind($0.1.0, to: $0.0, withKeyPath: "time", options: nil)
187             bind($0.1.1, to: $0.0, withKeyPath: "name", options: nil)
188         }
189         
190         let kdockKeys = ["kDock1Time", "kDock2Time", "kDock3Time", "kDock4Time"]
191         zip(kdockStatus, kdockKeys).forEach {
192             bind($0.1, to: $0.0, withKeyPath: "time", options: nil)
193         }
194     }
195     
196 }