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 {
93 guard let i = equSets.index(where: { $0.identifier == line[0] }) else {
95 print("Do not find \(line[0]) in EnhancementListItem.txt")
100 guard let w = Int(line[1]) else { return nil }
101 guard let raw = Int(line[2]) else { return nil }
102 guard let type = EquipmentType(rawValue: raw) else { return nil }
104 self.init(identifier: line[0],
107 targetEquipment: line[3],
108 remodelEquipment: line[4],
109 requiredEquipments: equSets[i],
110 secondsShipNames: line[5].components(separatedBy: ","))
112 print("Add item \(line[3]) for weekday \(w)")
116 func generate(threeLines: ThreeItemsQueue<TabSeparatedLine>) -> [RequiredEquipment] {
118 return threeLines.items.compactMap { RequiredEquipment(lines: $0) }
122 func loadFile(path: String) -> String? {
126 return try String(contentsOfFile: path)
130 print("Can not create String from \(path)")
137 let arguments = CommandLine.arguments
138 guard arguments.count > 1 else {
140 print("argument too few")
144 let targetDirectory = arguments[1] as NSString
145 let requiredEquipmentSetPath = targetDirectory.appendingPathComponent("RequiredEquipmentSet.txt")
146 guard let requiredEquipmentSetText = loadFile(path: requiredEquipmentSetPath) else { fatalError() }
149 var threeLines = ThreeItemsQueue<TabSeparatedLine>()
150 let requiredEquipmentSet = requiredEquipmentSetText
151 .components(separatedBy: "\n")
152 .map { TabSeparatedLine(value: $0) }
153 .compactMap { (line: TabSeparatedLine) -> ThreeItemsQueue<TabSeparatedLine> in
155 threeLines.push(item: line)
159 .map { generate(threeLines: $0) }
160 .compactMap { RequiredEquipmentSet(items: $0) }
163 let enhancementListItemPath = targetDirectory.appendingPathComponent("EnhancementListItem.txt")
164 guard let enhancementListText = loadFile(path: enhancementListItemPath) else { fatalError() }
165 let listItems = enhancementListText
166 .components(separatedBy: "\n")
167 .map { TabSeparatedLine(value: $0) }
168 .compactMap { EnhancementListItem(line: $0, equSets: requiredEquipmentSet) }
171 NSKeyedArchiver.setClassName("KCD.EnhancementListItem", for: EnhancementListItem.self)
172 NSKeyedArchiver.setClassName("KCD.RequiredEquipmentSet", for: RequiredEquipmentSet.self)
173 NSKeyedArchiver.setClassName("KCD.RequiredEquipment", for: RequiredEquipment.self)
175 print("Register \(listItems.count) items.")
177 let outfile = targetDirectory.appendingPathComponent("EnhancementListItem2.plist")
178 NSKeyedArchiver.archiveRootObject(listItems, toFile: outfile)