OSDN Git Service

艦隊の簡略表示がおかしい問題を修正
[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 .seaplaneTender: return 9
68             
69         case .amphibiousAssaultShip: return 12
70             
71         case .submarineTender: return 7
72             
73         case .trainingCruiser: return 6
74             
75         case .supplyShip: return 15
76             
77         default: return 0
78         }
79     }
80 }
81
82 final class EquipmentTPValueCalculator: TPValueCalculator {
83     
84     let slotItem: SlotItem
85     
86     init(_ item: SlotItem) {
87         
88         slotItem = item
89     }
90     
91     var value: Int {
92         
93         guard let type = EquipmentType(rawValue: slotItem.master_slotItem.type_2) else { return 0 }
94         
95         switch type {
96             
97         case .landingCraft: return 8
98             
99         case .carire: return 5
100             
101         case .tankShip: return 2
102             
103         case .onigiri: return 1
104             
105         default: return 0
106         }
107     }
108 }