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) -> [Int] in
82 if let res = deck.value(forKey: "ship_\($0)") as? Int {
90 let alreadyInFleet = shipIds.contains(shipId)
91 let index = alreadyInFleet ? shipIds.index(of: shipId) : nil
92 let shipDeckNumber = index.map { $0 / 6 } ?? -1
93 let shipDeckIndex = index.map { $0 % 6 } ?? -1
95 // 配置しようとする位置に今配置されている艦娘
96 let currentIndex = (deckNumber - 1) * 6 + shipIndex
97 guard 0..<shipIds.count ~= currentIndex
99 let replaceShipId = shipIds[currentIndex]
102 guard 0..<decks.count ~= (deckNumber - 1)
104 let deck = decks[deckNumber - 1]
105 deck.setValue(shipId as NSNumber, forKey: "ship_\(shipIndex)")
110 0..<decks.count ~= shipDeckNumber
112 let aDeck = decks[shipDeckNumber]
113 aDeck.setValue(replaceShipId, forKey: "ship_\(shipDeckIndex)")
116 packFleet(store: store)
119 if alreadyInFleet && shipId == -1 {
120 notify(type: .remove,
121 fleetNumber: deckNumber,
123 shipID: replaceShipId)
125 else if alreadyInFleet {
126 notify(type: .replace,
127 fleetNumber: deckNumber,
130 replaceFleetNumber: shipDeckNumber + 1,
131 replacePosition: shipDeckIndex,
132 replaceShipID: replaceShipId)
135 notify(type: .append,
136 fleetNumber: deckNumber,
142 private func excludeShipsWithoutFlagShip(deckNumber: Int) {
143 let store = ServerDataStore.oneTimeEditor()
144 guard let deck = store.deck(byId: deckNumber)
145 else { return print("Deck not found") }
147 deck.setValue(-1 as NSNumber, forKey: "ship_\($0)")
151 private func packFleet(store: ServerDataStore) {
152 store.decksSortedById()
154 var needsPack = false
156 let shipId = deck.value(forKey: "ship_\($0)") as? Int
157 if (shipId == nil || shipId! == -1) && !needsPack {
162 deck.setValue(shipId! as NSNumber, forKey: "ship_\($0 - 1)")
164 deck.setValue(-1 as NSNumber, forKey: "ship_5")
171 private func notify(type: ChangeHenseiType,
172 fleetNumber: Int = 0,
175 replaceFleetNumber: Int? = nil,
176 replacePosition: Int? = nil,
177 replaceShipID: Int? = nil) {
178 let userInfo = HenseiDidChangeUserInfo(type: type,
179 fleetNumber: fleetNumber,
182 replaceFleetNumber: replaceFleetNumber,
183 replacePosition: replacePosition,
184 replaceShipID: replaceShipID)
185 NotificationCenter.default
186 .post(name: .HenseiDidChange,
188 userInfo: [ChangeHenseiCommand.userInfoKey: userInfo])