OSDN Git Service

関数名を変更
[kcd/KCD.git] / KCD / DeckBuilderStructure.swift
1 //
2 //  DeckBuilderStructure.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/07/14.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 protocol DeckBuilderDescriptable {
12     
13     var deckDescription: String { get }
14 }
15
16 struct DeckBuilderStructure {
17     
18     let version: Int = 4
19     let hqLv: Int?
20     let fleets: [DBFleet]
21 }
22
23 struct DBFleet {
24     
25     let ships: [DBShip]
26 }
27
28 struct DBShip {
29     
30     let id: Int
31     let lv: Int
32     let luck: Int
33     let items: [DBItem]
34     let exItem: DBItem?
35 }
36
37 struct DBItem {
38     
39     let id: Int
40     let lv: Int?
41     let aLv: Int?
42 }
43
44 extension DeckBuilderStructure: DeckBuilderDescriptable {
45     
46     var deckDescription: String {
47         
48         let verStr = "\"version\":\(version)"
49         let fleetStr = zip(1...4, fleets)
50             .map { "\"f\($0.0)\":{\($0.1.deckDescription)}" }
51             .joined(separator: ",")
52         let hqLvStr = hqLv.map { "\"hqlv\":\($0)" }
53         
54         let join = [verStr, fleetStr, hqLvStr]
55             .flatMap { $0 }
56             .joined(separator: ",")
57         
58         return "{\(join)}"
59     }
60 }
61
62 extension DBFleet: DeckBuilderDescriptable {
63     
64     var deckDescription: String {
65         
66         return zip(1...6, ships)
67             .map { "\"s\($0.0)\":{\($0.1.deckDescription)}" }
68             .joined(separator: ",")
69     }
70 }
71
72 extension DBShip: DeckBuilderDescriptable {
73     
74     var deckDescription: String {
75         
76         return "\"id\":\"\(id)\",\"lv\":\(lv),\"luck\":\(luck),\"items\":{\(fullItemDesc)}"
77     }
78     
79     private var fullItemDesc: String {
80         
81         switch (items, exDesc) {
82         case let (items, ex?) where items.isEmpty: return ex
83         case let (_, ex?): return "\(itemsDesc),\(ex)"
84         default: return itemsDesc
85         }
86     }
87     
88     private var itemsDesc: String {
89         
90         return zip(1...4, items)
91             .map { "\"i\($0.0)\":{\($0.1.deckDescription)}" }
92             .joined(separator: ",")
93     }
94     
95     private var exDesc: String? {
96         
97         return exItem.map { "\"ix\":{\($0.deckDescription)}" }
98     }
99 }
100
101 extension DBItem: DeckBuilderDescriptable {
102     
103     var deckDescription: String {
104         
105         switch (lv, aLv) {
106         case let (lv?, aLv?): return "\"id\":\(id),\"rf\":\(lv),\"mas\":\(aLv)"
107         case let (lv?, _): return "\"id\":\(id),\"rf\":\(lv)"
108         case let (_, aLv?): return "\"id\":\(id),\"mas\":\(aLv)"
109         default: return "\"id\":\(id)"
110         }
111     }
112 }