2 // ChangeHenseiCommand.swift
5 // Created by Hori,Masaki on 2017/01/09.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 enum ChangeHenseiType: Int {
15 case removeAllWithoutFlagship
18 extension Notification.Name {
19 static let HenseiDidChange = Notification.Name("com.masakih.KCD.Notification.HenseiDidChange")
22 class HenseiDidChangeUserInfo: NSObject {
23 let type: ChangeHenseiType
29 let replaceFleetNumber: Int?
30 let replacePosition: Int?
31 let replaceShipID: Int?
33 var objcType: Int { return type.rawValue }
34 var objcReplaceFleetNumbner: NSNumber? { return replaceFleetNumber as NSNumber?? ?? nil }
35 var objcReplacePosition: NSNumber? { return replacePosition as NSNumber?? ?? nil }
36 var objcReplaceShipID: NSNumber? { return replaceShipID as NSNumber?? ?? nil }
38 required init(type: ChangeHenseiType,
42 replaceFleetNumber: Int? = nil,
43 replacePosition: Int? = nil,
44 replaceShipID: Int? = nil) {
46 self.fleetNumber = fleetNumber
47 self.position = position
49 self.replaceFleetNumber = replaceFleetNumber
50 self.replacePosition = replacePosition
51 self.replaceShipID = replaceShipID
56 class ChangeHenseiCommand: JSONCommand {
57 static let userInfoKey = "HenseiDidChangeUserInfoKey"
59 override class func canExecuteAPI(_ api: String) -> Bool {
60 if api == "/kcsapi/api_req_hensei/change" { return true }
65 // ship_id > 0 : 艦娘のID append or replace
66 // ship_id == -1 : remove.
67 // ship_id == -2 : remove all without flag ship.
68 override func execute() {
69 guard let deckNumber = arguments["api_id"].flatMap({ Int($0) }),
70 let shipId = arguments["api_ship_id"].flatMap({ Int($0) }),
71 let shipIndex = arguments["api_ship_idx"].flatMap({ Int($0) })
72 else { return print("parameter is wrong") }
74 excludeShipsWithoutFlagShip(deckNumber: deckNumber)
75 notify(type: .removeAllWithoutFlagship)
78 let store = ServerDataStore.oneTimeEditor()
79 let decks = store.decksSortedById()
80 let shipIds = decks.flatMap { deck in (0..<6).map { deck.shipId(of: $0) ?? -1 } }
83 let currentIndex = shipIds.index(of: shipId)
84 let shipDeckNumber = currentIndex.map { $0 / 6 } ?? -1
85 let shipDeckIndex = currentIndex.map { $0 % 6 } ?? -1
87 // 配置しようとする位置に今配置されている艦娘
88 let replaceIndex = (deckNumber - 1) * 6 + shipIndex
89 guard 0..<shipIds.count ~= replaceIndex else { return }
90 let replaceShipId = shipIds[replaceIndex]
93 guard 0..<decks.count ~= (deckNumber - 1) else { return }
94 decks[deckNumber - 1].setShip(id: shipId, for: shipIndex)
97 if currentIndex != nil, shipId != -1, 0..<decks.count ~= shipDeckNumber {
98 decks[shipDeckNumber].setShip(id: replaceShipId, for: shipDeckIndex)
101 packFleet(store: store)
104 if currentIndex != nil, shipId == -1 {
105 notify(type: .remove,
106 fleetNumber: deckNumber,
108 shipID: replaceShipId)
109 } else if currentIndex != nil {
110 notify(type: .replace,
111 fleetNumber: deckNumber,
114 replaceFleetNumber: shipDeckNumber + 1,
115 replacePosition: shipDeckIndex,
116 replaceShipID: replaceShipId)
118 notify(type: .append,
119 fleetNumber: deckNumber,
125 private func excludeShipsWithoutFlagShip(deckNumber: Int) {
126 let store = ServerDataStore.oneTimeEditor()
127 guard let deck = store.deck(byId: deckNumber)
128 else { return print("Deck not found") }
129 (1..<6).forEach { deck.setShip(id: -1, for: $0) }
132 private func packFleet(store: ServerDataStore) {
133 store.decksSortedById()
135 var needsPack = false
137 let shipId = deck.shipId(of: $0)
138 if (shipId == nil || shipId! == -1) && !needsPack {
143 deck.setShip(id: shipId!, for: $0 - 1)
144 if $0 == 5 { deck.setShip(id: -1, for: 5) }
150 private func notify(type: ChangeHenseiType,
151 fleetNumber: Int = 0,
154 replaceFleetNumber: Int? = nil,
155 replacePosition: Int? = nil,
156 replaceShipID: Int? = nil) {
157 let userInfo = HenseiDidChangeUserInfo(type: type,
158 fleetNumber: fleetNumber,
161 replaceFleetNumber: replaceFleetNumber,
162 replacePosition: replacePosition,
163 replaceShipID: replaceShipID)
164 NotificationCenter.default
165 .post(name: .HenseiDidChange,
167 userInfo: [ChangeHenseiCommand.userInfoKey: userInfo])