OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / EnhancementListItem.swift
1 //
2 //  EnhancementListItem.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/25.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class EnhancementListItem: NSObject, NSCoding, NSCopying {
12     
13     let identifier: String
14     let weekday: Int
15     let equipmentType: EquipmentType
16     let targetEquipment: String
17     let remodelEquipment: String?
18     let requiredEquipments: RequiredEquipmentSet
19     let secondsShipNames: [String]
20     
21     init(identifier: String,
22          weekday: Int,
23          equipmentType: EquipmentType,
24          targetEquipment: String,
25          remodelEquipment: String?,
26          requiredEquipments: RequiredEquipmentSet,
27          secondsShipNames: [String]) {
28         
29         self.identifier = identifier
30         self.weekday = weekday
31         self.equipmentType = equipmentType
32         self.targetEquipment = targetEquipment
33         self.remodelEquipment = remodelEquipment
34         self.requiredEquipments = requiredEquipments
35         self.secondsShipNames = secondsShipNames
36         
37         super.init()
38     }
39     
40     func replace(identifier: String? = nil,
41                  weekday: Int? = nil,
42                  equipmentType: EquipmentType? = nil,
43                  targetEquipment: String? = nil,
44                  remodelEquipment: String? = nil,
45                  requiredEquipments: RequiredEquipmentSet? = nil,
46                  secondsShipNames: [String]? = nil) -> EnhancementListItem {
47         
48         return EnhancementListItem(identifier: identifier ?? self.identifier,
49                                      weekday: weekday ?? self.weekday,
50                                      equipmentType: equipmentType ?? self.equipmentType,
51                                      targetEquipment: targetEquipment ?? self.targetEquipment,
52                                      remodelEquipment: remodelEquipment ?? self.remodelEquipment,
53                                      requiredEquipments: requiredEquipments ?? self.requiredEquipments,
54                                      secondsShipNames: secondsShipNames ?? self.secondsShipNames)
55     }
56     
57     struct CodeKey {
58         
59         static let identifier = "EnhancementListItemIdentifier"
60         static let weekday = "weekday"
61         static let equipmentType = "equipmentType"
62         static let targetEquipment = "targetEquipment"
63         static let remodelEquipment = "remodelEquipment"
64         static let requiredEquipments = "requiredEquipments"
65         static let secondsShipNames = "secondsShipNames"
66     }
67     
68     required convenience init?(coder aDecoder: NSCoder) {
69         
70         guard let i = aDecoder.decodeObject(forKey: CodeKey.identifier) as? String,
71             let e = EquipmentType(rawValue: aDecoder.decodeInteger(forKey: CodeKey.equipmentType)),
72             let t = aDecoder.decodeObject(forKey: CodeKey.targetEquipment) as? String,
73             let req = aDecoder.decodeObject(forKey: CodeKey.requiredEquipments) as? RequiredEquipmentSet,
74             let s = aDecoder.decodeObject(forKey: CodeKey.secondsShipNames) as? [String] else {
75                 
76                 Logger.shared.log("Can not decode EnhancementListItem")
77                 return nil
78         }
79         
80         let w = aDecoder.decodeInteger(forKey: CodeKey.weekday)
81         let rem = aDecoder.decodeObject(forKey: CodeKey.remodelEquipment) as? String
82         
83         self.init(identifier: i,
84                   weekday: w,
85                   equipmentType: e,
86                   targetEquipment: t,
87                   remodelEquipment: rem,
88                   requiredEquipments: req,
89                   secondsShipNames: s)
90     }
91     
92     func encode(with aCoder: NSCoder) {
93         
94         aCoder.encode(identifier, forKey: CodeKey.identifier)
95         aCoder.encode(weekday, forKey: CodeKey.weekday)
96         aCoder.encode(equipmentType.rawValue, forKey: CodeKey.equipmentType)
97         aCoder.encode(targetEquipment, forKey: CodeKey.targetEquipment)
98         aCoder.encode(remodelEquipment, forKey: CodeKey.remodelEquipment)
99         aCoder.encode(requiredEquipments, forKey: CodeKey.requiredEquipments)
100         aCoder.encode(secondsShipNames, forKey: CodeKey.secondsShipNames)
101     }
102     
103     func copy(with zone: NSZone? = nil) -> Any {
104         
105         return EnhancementListItem(identifier: identifier,
106                                    weekday: weekday,
107                                    equipmentType: equipmentType,
108                                    targetEquipment: targetEquipment,
109                                    remodelEquipment: remodelEquipment,
110                                    requiredEquipments: requiredEquipments,
111                                    secondsShipNames: secondsShipNames)
112     }
113 }
114
115 final class RequiredEquipmentSet: NSObject, NSCoding, NSCopying {
116     
117     let identifier: String
118     let requiredEquipments: [RequiredEquipment]
119     
120     init(identifier: String, requiredEquipments: [RequiredEquipment]) {
121         
122         self.identifier = identifier
123         self.requiredEquipments = requiredEquipments
124         
125         super.init()
126     }
127     
128     struct CodeKey {
129         
130         static let identifier = "RequiredEquipmentSetIdentifier"
131         static let requiredEquipments = "requiredEquipments"
132     }
133     
134     required convenience init?(coder aDecoder: NSCoder) {
135         
136         guard let i = aDecoder.decodeObject(forKey: CodeKey.identifier) as? String,
137             let r = aDecoder.decodeObject(forKey: CodeKey.requiredEquipments) as? [RequiredEquipment] else {
138                 
139                 Logger.shared.log("Can not decode RequiredEquipmentSet")
140                 return nil
141         }
142         
143         self.init(identifier: i, requiredEquipments: r)
144     }
145     
146     func encode(with aCoder: NSCoder) {
147         
148         aCoder.encode(identifier, forKey: CodeKey.identifier)
149         aCoder.encode(requiredEquipments, forKey: CodeKey.requiredEquipments)
150     }
151     
152     func copy(with zone: NSZone? = nil) -> Any {
153         
154         return RequiredEquipmentSet(identifier: identifier,
155                                     requiredEquipments: requiredEquipments)
156     }
157 }
158
159 final class RequiredEquipment: NSObject, NSCoding, NSCopying {
160     
161     let identifier: String
162     let currentLevelString: String
163     @objc let name: String
164     let number: Int
165     let screw: Int
166     let ensureScrew: Int
167     
168     init(identifier: String, levelRange: String, name: String, number: Int, screw: Int, ensureScrew: Int) {
169         
170         self.identifier = identifier
171         self.currentLevelString = levelRange
172         self.name = name
173         self.number = number
174         self.screw = screw
175         self.ensureScrew = ensureScrew
176         
177         super.init()
178     }
179     
180     // MARK: - NSCoding, NSCopying
181     struct CodeKey {
182         
183         static let identifier = "RequiredEquipmentIdentifier"
184         static let currentLevelString = "currentLevelString"
185         static let name = "name"
186         static let number = "number"
187         static let screw = "screw"
188         static let ensureScrew = "ensureScrew"
189     }
190     
191     required convenience init?(coder aDecoder: NSCoder) {
192         
193         guard let i = aDecoder.decodeObject(forKey: CodeKey.identifier) as? String,
194             let c = aDecoder.decodeObject(forKey: CodeKey.currentLevelString) as? String,
195             let na = aDecoder.decodeObject(forKey: CodeKey.name) as? String else {
196                 
197                 Logger.shared.log("Can not decode RequiredEquipment")
198                 return nil
199         }
200         
201         let nu = aDecoder.decodeInteger(forKey: CodeKey.number)
202         let s = aDecoder.decodeInteger(forKey: CodeKey.screw)
203         let e = aDecoder.decodeInteger(forKey: CodeKey.ensureScrew)
204         
205         self.init(identifier: i, levelRange: c, name: na, number: nu, screw: s, ensureScrew: e)
206     }
207     
208     func encode(with aCoder: NSCoder) {
209         
210         aCoder.encode(identifier, forKey: CodeKey.identifier)
211         aCoder.encode(currentLevelString, forKey: CodeKey.currentLevelString)
212         aCoder.encode(name, forKey: CodeKey.name)
213         aCoder.encode(number, forKey: CodeKey.number)
214         aCoder.encode(screw, forKey: CodeKey.screw)
215         aCoder.encode(ensureScrew, forKey: CodeKey.ensureScrew)
216     }
217     
218     func copy(with zone: NSZone? = nil) -> Any {
219         
220         return RequiredEquipment(identifier: identifier,
221                                  levelRange: currentLevelString,
222                                  name: name,
223                                  number: number,
224                                  screw: screw,
225                                  ensureScrew: ensureScrew)
226     }
227 }
228
229 extension RequiredEquipment {
230     
231     @objc dynamic var numberString: String? {
232         
233         if number == 0 { return nil }
234         if number == -1 { return "-" }
235         
236         return "\(number)"
237     }
238 }