3 // EquipmentEnhancementListBuilder
5 // Created by Hori,Masaki on 2017/01/24.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 struct TabSeparatedLine {
15 var count: Int { return columns.count }
16 var columns: [String] { return value.components(separatedBy: "\t") }
18 subscript(_ index: Int) -> String {
24 struct ThreeItemsQueue<T> {
27 var count: Int { return items.count }
29 mutating func push(item: T) {
38 items = items[1...2] + [item]
41 subscript(_ index: Int) -> T {
47 private extension RequiredEquipment {
49 convenience init?(lines: TabSeparatedLine) {
51 guard lines.count == 6 else { return nil }
53 guard let nu = Int(lines[3]) else { return nil }
54 guard let s = Int(lines[4]) else { return nil }
55 guard let e = Int(lines[5]) else { return nil }
57 self.init(identifier: lines[0],
66 private extension RequiredEquipmentSet {
68 convenience init?(items: [RequiredEquipment]) {
70 guard items.count == 3 else { return nil }
72 guard items[0].identifier == items[1].identifier else { return nil }
73 guard items[1].identifier == items[2].identifier else { return nil }
75 self.init(identifier: items[0].identifier,
76 requiredEquipments: items)
78 print("Create item of \(items[0].identifier)")
82 private extension EnhancementListItem {
84 convenience init?(line: TabSeparatedLine, equSets: [RequiredEquipmentSet]) {
86 guard line.count == 6 else {
92 guard let i = equSets.index(where: { $0.identifier == line[0] }) else {
94 print("Do not find \(line[0]) in EnhancementListItem.txt")
98 guard let w = Int(line[1]) else { return nil }
99 guard let raw = Int(line[2]) else { return nil }
100 guard let type = EquipmentType(rawValue: raw) else { return nil }
102 self.init(identifier: line[0],
105 targetEquipment: line[3],
106 remodelEquipment: line[4],
107 requiredEquipments: equSets[i],
108 secondsShipNames: line[5].components(separatedBy: ","))
110 print("Add item \(line[3]) for weekday \(w)")
114 func generate(threeLines: ThreeItemsQueue<TabSeparatedLine>) -> [RequiredEquipment] {
116 return threeLines.items.flatMap { RequiredEquipment(lines: $0) }
120 func loadFile(path: String) -> String? {
124 return try String(contentsOfFile: path)
128 print("Can not create String from \(path)")
134 let arguments = CommandLine.arguments
135 guard arguments.count > 1 else {
137 print("argument too few")
141 let targetDirectory = arguments[1] as NSString
142 let requiredEquipmentSetPath = targetDirectory.appendingPathComponent("RequiredEquipmentSet.txt")
143 guard let requiredEquipmentSetText = loadFile(path: requiredEquipmentSetPath) else { fatalError() }
146 var threeLines = ThreeItemsQueue<TabSeparatedLine>()
147 let requiredEquipmentSet = requiredEquipmentSetText
148 .components(separatedBy: "\n")
149 .map { TabSeparatedLine(value: $0) }
150 .flatMap { (line: TabSeparatedLine) -> ThreeItemsQueue<TabSeparatedLine> in
151 threeLines.push(item: line)
154 .map { generate(threeLines: $0) }
155 .flatMap { RequiredEquipmentSet(items: $0) }
158 let enhancementListItemPath = targetDirectory.appendingPathComponent("EnhancementListItem.txt")
159 guard let enhancementListText = loadFile(path: enhancementListItemPath) else { fatalError() }
160 let listItems = enhancementListText
161 .components(separatedBy: "\n")
162 .map { TabSeparatedLine(value: $0) }
163 .flatMap { EnhancementListItem(line: $0, equSets: requiredEquipmentSet) }
166 NSKeyedArchiver.setClassName("KCD.EnhancementListItem", for: EnhancementListItem.self)
167 NSKeyedArchiver.setClassName("KCD.RequiredEquipmentSet", for: RequiredEquipmentSet.self)
168 NSKeyedArchiver.setClassName("KCD.RequiredEquipment", for: RequiredEquipment.self)
170 print("Register \(listItems.count) items.")
172 let outfile = targetDirectory.appendingPathComponent("EnhancementListItem2.plist")
173 NSKeyedArchiver.archiveRootObject(listItems, toFile: outfile)