OSDN Git Service

2018冬イベントに対応した
[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             .flatMap { $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 { return 0 }
56         
57         switch type {
58             
59         case .destroyer: return 5
60             
61         case .lightCruiser: return 2
62             
63         case .aviationCruiser: return 4
64             
65         case .aviationBattleship: return 7
66             
67         case .submarineAircraftCarrier: return 1
68             
69         case .seaplaneTender: return 9
70             
71         case .amphibiousAssaultShip: return 12
72             
73         case .submarineTender: return 7
74             
75         case .trainingCruiser: return 6
76             
77         case .supplyShip: return 15
78             
79         default: return 0
80         }
81     }
82 }
83
84 final class EquipmentTPValueCalculator: TPValueCalculator {
85     
86     let slotItem: SlotItem
87     
88     init(_ item: SlotItem) {
89         
90         slotItem = item
91     }
92     
93     var value: Int {
94         
95         guard let type = EquipmentType(rawValue: slotItem.master_slotItem.type_2) else { return 0 }
96         
97         switch type {
98             
99         case .landingCraft: return 8
100             
101         case .carire: return 5
102             
103         case .tankShip: return 22
104             
105         case .onigiri: return 1
106             
107         default: return 0
108         }
109     }
110 }