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)
124 } else if alreadyInFleet {
125 notify(type: .replace,
126 fleetNumber: deckNumber,
129 replaceFleetNumber: shipDeckNumber + 1,
130 replacePosition: shipDeckIndex,
131 replaceShipID: replaceShipId)
133 notify(type: .append,
134 fleetNumber: deckNumber,
140 private func excludeShipsWithoutFlagShip(deckNumber: Int) {
141 let store = ServerDataStore.oneTimeEditor()
142 guard let deck = store.deck(byId: deckNumber)
143 else { return print("Deck not found") }
145 deck.setValue(-1 as NSNumber, forKey: "ship_\($0)")
149 private func packFleet(store: ServerDataStore) {
150 store.decksSortedById()
152 var needsPack = false
154 let shipId = deck.value(forKey: "ship_\($0)") as? Int
155 if (shipId == nil || shipId! == -1) && !needsPack {
160 deck.setValue(shipId! as NSNumber, forKey: "ship_\($0 - 1)")
162 deck.setValue(-1 as NSNumber, forKey: "ship_5")
169 private func notify(type: ChangeHenseiType,
170 fleetNumber: Int = 0,
173 replaceFleetNumber: Int? = nil,
174 replacePosition: Int? = nil,
175 replaceShipID: Int? = nil) {
176 let userInfo = HenseiDidChangeUserInfo(type: type,
177 fleetNumber: fleetNumber,
180 replaceFleetNumber: replaceFleetNumber,
181 replacePosition: replacePosition,
182 replaceShipID: replaceShipID)
183 NotificationCenter.default
184 .post(name: .HenseiDidChange,
186 userInfo: [ChangeHenseiCommand.userInfoKey: userInfo])