OSDN Git Service

バージョンを1.9b30に更新
[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             return nil
90         }
91         
92         guard let i = equSets.index(where: { $0.identifier == line[0] }) else {
93             
94             print("Do not find \(line[0]) in EnhancementListItem.txt")
95             return nil
96         }
97         
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 }
101         
102         self.init(identifier: line[0],
103                   weekday: w,
104                   equipmentType: type,
105                   targetEquipment: line[3],
106                   remodelEquipment: line[4],
107                   requiredEquipments: equSets[i],
108                   secondsShipNames: line[5].components(separatedBy: ","))
109         
110         print("Add item \(line[3]) for weekday \(w)")
111     }
112 }
113
114 func generate(threeLines: ThreeItemsQueue<TabSeparatedLine>) -> [RequiredEquipment] {
115     
116     return threeLines.items.flatMap { RequiredEquipment(lines: $0) }
117 }
118
119 //
120 func loadFile(path: String) -> String? {
121     
122     do {
123         
124         return try String(contentsOfFile: path)
125         
126     } catch {
127         
128         print("Can not create String from \(path)")
129         return nil
130     }
131 }
132
133 // MARK: ここから
134 let arguments = CommandLine.arguments
135 guard arguments.count > 1 else {
136     
137         print("argument too few")
138         fatalError()
139 }
140
141 let targetDirectory = arguments[1] as NSString
142 let requiredEquipmentSetPath = targetDirectory.appendingPathComponent("RequiredEquipmentSet.txt")
143 guard let requiredEquipmentSetText = loadFile(path: requiredEquipmentSetPath) else { fatalError() }
144
145 //
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)
152         return threeLines
153     }
154     .map { generate(threeLines: $0) }
155     .flatMap { RequiredEquipmentSet(items: $0) }
156
157 //
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) }
164
165 //
166 NSKeyedArchiver.setClassName("KCD.EnhancementListItem", for: EnhancementListItem.self)
167 NSKeyedArchiver.setClassName("KCD.RequiredEquipmentSet", for: RequiredEquipmentSet.self)
168 NSKeyedArchiver.setClassName("KCD.RequiredEquipment", for: RequiredEquipment.self)
169
170 print("Register \(listItems.count) items.")
171
172 let outfile = targetDirectory.appendingPathComponent("EnhancementListItem2.plist")
173 NSKeyedArchiver.archiveRootObject(listItems, toFile: outfile)