OSDN Git Service

f0b7175a537742c4941429bb5745ecf5056bdade
[kcd/KCD.git] / KCD / BattleInformationViewController.swift
1 //
2 //  BattleInformationViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/11/30.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 class BattleInformationViewController: NSViewController {
12     
13     private let notificationObserver = NotificationObserver()
14     
15     @objc private let battleManagedObjectContext = TemporaryDataStore.default.context
16     
17     @IBOutlet private var battleContoller: NSObjectController!
18     @IBOutlet private weak var cellNumberField: NSTextField!
19     
20     override var nibName: NSNib.Name {
21         
22         return .nibName(instanceOf: self)
23     }
24     
25     private var battle: Battle? {
26         
27         didSet { updateProperties() }
28     }
29     @objc dynamic private var cellNumber: Int = 0
30     private var battleCellNumber: Int = 0
31     private var isBossCell: Bool = false
32     private var deckId: Int = 0 {
33         
34         didSet {
35             
36             fleetName = ServerDataStore.default.deck(by: deckId)?.name
37         }
38     }
39     private var fleetName: String?
40     private var mapArea: Int?
41     private var mapInfo: Int?
42     private var areaNumber: String? {
43         
44         guard let mapInfo = self.mapInfo else {
45             
46             return nil
47         }
48         
49         let mapArea: String
50         switch self.mapArea {
51             
52         case let area? where area > 10: mapArea = "E"
53             
54         case let area?: mapArea = "\(area)"
55             
56         case .none: return nil
57             
58         }
59         
60         return "\(mapArea)-\(mapInfo)"
61     }
62     private var areaName: String? {
63         
64         guard let mapArea = self.mapArea else {
65             
66             return nil
67         }
68         guard let mapInfo = self.mapInfo else {
69             
70             return nil
71         }
72         
73         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
74     }
75     
76     @objc private var sortieString: String? {
77         
78         guard let fleetName = self.fleetName else {
79             
80             return nil
81         }
82         guard let areaName = self.areaName else {
83             
84             return nil
85         }
86         guard let areaNumber = self.areaNumber else {
87             
88             return nil
89         }
90         
91         if battleCellNumber == 0 {
92             
93             return String(format: LocalizedStrings.sortieInfomation.string,
94                           arguments: [fleetName, areaName, areaNumber])
95         }
96         if isBossCell {
97             
98             return String(format: LocalizedStrings.battleWithBOSS.string,
99                           arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
100         }
101         
102         return String(format: LocalizedStrings.battleInformation.string,
103                       arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
104     }
105     
106     override func viewDidLoad() {
107         
108         super.viewDidLoad()
109         
110         notificationObserver
111             .addObserver(forName: .NSManagedObjectContextObjectsDidChange,
112                          object: TemporaryDataStore.default.context,
113                          queue: .main) { notification in
114                             
115                             if let battle: Battle = notification.insertedManagedObjects().first {
116                                 
117                                 self.battle = battle
118                             }
119                             
120                             if let _: Battle = notification.updatedManagedObjects().first {
121                                 
122                                 self.updateProperties()
123                             }
124                             
125                             if let _: Battle = notification.deletedManagedObjects().first {
126                                 
127                                 self.battle = nil
128                             }
129         }
130         
131         #if DEBUG
132             cellNumberField.isHidden = false
133         #endif
134     }
135     
136     private func updateProperties() {
137         
138         cellNumber = battle?.no ?? 0
139         battleCellNumber = battle?.battleCell as? Int ?? 0
140         isBossCell = battle?.isBossCell ?? false
141         deckId = battle?.deckId ?? 0
142         mapArea = battle?.mapArea
143         mapInfo = battle?.mapInfo
144         
145         notifyChangeValue(forKey: #keyPath(sortieString))
146     }
147 }