OSDN Git Service

ColorSetを変更
[kcd/KCD.git] / EquipmentEnhancementListBuilder / main.swift
1 //
2 //  main.swift
3 //  EquipmentEnhancementListBuilder
4 //
5 //  Created by Hori,Masaki on 2017/01/24.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 struct TabSeparatedLine {
12     
13     let value: String
14     
15     var count: Int { return columns.count }
16     var columns: [String] { return value.components(separatedBy: "\t") }
17     
18     subscript(_ index: Int) -> String {
19         
20         return columns[index]
21     }
22 }
23
24 struct ThreeItemsQueue<T> {
25     
26     var items: [T] = []
27     var count: Int { return items.count }
28     
29     mutating func push(item: T) {
30         
31         if count < 3 {
32             
33             items += [item]
34             
35             return
36         }
37         
38         items = items[1...2] + [item]
39     }
40     
41     subscript(_ index: Int) -> T {
42         
43         return items[index]
44     }
45 }
46
47 private extension RequiredEquipment {
48     
49     convenience init?(lines: TabSeparatedLine) {
50         
51         guard lines.count == 6 else { return nil }
52         
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 }
56         
57         self.init(identifier: lines[0],
58                   levelRange: lines[1],
59                   name: lines[2],
60                   number: nu,
61                   screw: s,
62                   ensureScrew: e)
63     }
64 }
65
66 private extension RequiredEquipmentSet {
67     
68     convenience init?(items: [RequiredEquipment]) {
69         
70         guard items.count == 3 else { return nil }
71         
72         guard items[0].identifier == items[1].identifier else { return nil }
73         guard items[1].identifier == items[2].identifier else { return nil }
74         
75         self.init(identifier: items[0].identifier,
76                   requiredEquipments: items)
77         
78         print("Create item of \(items[0].identifier)")
79     }
80 }
81
82 private extension EnhancementListItem {
83     
84     convenience init?(line: TabSeparatedLine, equSets: [RequiredEquipmentSet]) {
85         
86         guard line.count == 6 else {
87             
88             print("count not 6")
89             
90             return nil
91         }
92         
93         guard let i = equSets.index(where: { $0.identifier == line[0] }) else {
94             
95             print("Do not find \(line[0]) in EnhancementListItem.txt")
96             
97             return nil
98         }
99         
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 }
103         
104         self.init(identifier: line[0],
105                   weekday: w,
106                   equipmentType: type,
107                   targetEquipment: line[3],
108                   remodelEquipment: line[4],
109                   requiredEquipments: equSets[i],
110                   secondsShipNames: line[5].components(separatedBy: ","))
111         
112         print("Add item \(line[3]) for weekday \(w)")
113     }
114 }
115
116 func generate(threeLines: ThreeItemsQueue<TabSeparatedLine>) -> [RequiredEquipment] {
117     
118     return threeLines.items.compactMap { RequiredEquipment(lines: $0) }
119 }
120
121 //
122 func loadFile(path: String) -> String? {
123     
124     do {
125         
126         return try String(contentsOfFile: path)
127         
128     } catch {
129         
130         print("Can not create String from \(path)")
131         
132         return nil
133     }
134 }
135
136 // MARK: ここから
137 let arguments = CommandLine.arguments
138 guard arguments.count > 1 else {
139     
140         print("argument too few")
141         fatalError()
142 }
143
144 let targetDirectory = arguments[1] as NSString
145 let requiredEquipmentSetPath = targetDirectory.appendingPathComponent("RequiredEquipmentSet.txt")
146 guard let requiredEquipmentSetText = loadFile(path: requiredEquipmentSetPath) else { fatalError() }
147
148 //
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
154         
155         threeLines.push(item: line)
156         
157         return threeLines
158     }
159     .map { generate(threeLines: $0) }
160     .compactMap { RequiredEquipmentSet(items: $0) }
161
162 //
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) }
169
170 //
171 NSKeyedArchiver.setClassName("KCD.EnhancementListItem", for: EnhancementListItem.self)
172 NSKeyedArchiver.setClassName("KCD.RequiredEquipmentSet", for: RequiredEquipmentSet.self)
173 NSKeyedArchiver.setClassName("KCD.RequiredEquipment", for: RequiredEquipment.self)
174
175 print("Register \(listItems.count) items.")
176
177 let outfile = targetDirectory.appendingPathComponent("EnhancementListItem2.plist")
178 NSKeyedArchiver.archiveRootObject(listItems, toFile: outfile)