OSDN Git Service

Equatableを自動実装させるようにした
[kcd/KCD.git] / KCD / TPValueCalculator.swift
1 //
2 //  TPValueCalculator.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/09/08.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11
12 protocol TPValueCalculator {
13     
14     var value: Int { get }
15 }
16
17 final class ShipTPValueCalculator: TPValueCalculator {
18     
19     static let kinuKaiNi = 487
20     
21     let ship: Ship
22     
23     init(_ ship: Ship) {
24         
25         self.ship = ship
26     }
27     
28     var value: Int {
29         
30         if ship.status == 3 {
31             
32             return 0
33         }
34         
35         let shipTPValue = shipTypeValue(ShipType(rawValue: ship.master_ship.stype.id))
36         
37         let itemValue = ship.equippedItem.array
38             .compactMap { $0 as? SlotItem }
39             .map { EquipmentTPValueCalculator($0) }
40             .map { $0.value }
41             .reduce(0, +)
42         
43         let extraItemValue = ship.extraItem.flatMap { EquipmentTPValueCalculator($0) }.flatMap { $0.value } ?? 0
44         
45         return shipTPValue + itemValue + extraItemValue
46     }
47     
48     func shipTypeValue(_ shipType: ShipType?) -> Int {
49         
50         if ship.master_ship.id == ShipTPValueCalculator.kinuKaiNi {
51             
52             return 10
53         }
54         
55         guard let type = shipType else {
56             
57             return 0
58         }
59         
60         switch type {
61             
62         case .destroyer: return 5
63             
64         case .lightCruiser: return 2
65             
66         case .aviationCruiser: return 4
67             
68         case .aviationBattleship: return 7
69             
70         case .submarineAircraftCarrier: return 1
71             
72         case .seaplaneTender: return 9
73             
74         case .amphibiousAssaultShip: return 12
75             
76         case .submarineTender: return 7
77             
78         case .trainingCruiser: return 6
79             
80         case .supplyShip: return 15
81             
82         default: return 0
83             
84         }
85     }
86 }
87
88 final class EquipmentTPValueCalculator: TPValueCalculator {
89     
90     let slotItem: SlotItem
91     
92     init(_ item: SlotItem) {
93         
94         slotItem = item
95     }
96     
97     var value: Int {
98         
99         guard let type = EquipmentType(rawValue: slotItem.master_slotItem.type_2) else {
100             
101             return 0
102         }
103         
104         switch type {
105             
106         case .landingCraft: return 8
107             
108         case .carire: return 5
109             
110         case .tankShip: return 22
111             
112         case .onigiri: return 1
113             
114         default: return 0
115             
116         }
117     }
118 }