// // ChangeHenseiCommand.swift // KCD // // Created by Hori,Masaki on 2017/01/09. // Copyright © 2017年 Hori,Masaki. All rights reserved. // import Cocoa enum ChangeHenseiType: Int { case append case replace case remove case removeAllWithoutFlagship } extension Notification.Name { static let HenseiDidChange = Notification.Name("com.masakih.KCD.Notification.HenseiDidChange") } final class HenseiDidChangeUserInfo: NSObject { let type: ChangeHenseiType let fleetNumber: Int let position: Int let shipID: Int let replaceFleetNumber: Int? let replacePosition: Int? let replaceShipID: Int? required init(type: ChangeHenseiType, fleetNumber: Int, position: Int, shipID: Int, replaceFleetNumber: Int? = nil, replacePosition: Int? = nil, replaceShipID: Int? = nil) { self.type = type self.fleetNumber = fleetNumber self.position = position self.shipID = shipID self.replaceFleetNumber = replaceFleetNumber self.replacePosition = replacePosition self.replaceShipID = replaceShipID super.init() } } final class ChangeHenseiCommand: JSONCommand { static let userInfoKey = "HenseiDidChangeUserInfoKey" override class func canExecuteAPI(_ api: API) -> Bool { return api.endpoint == .change } // api_ship_id の値 // ship_id > 0 : 艦娘のID append or replace // ship_id == -1 : remove. // ship_id == -2 : remove all without flag ship. override func execute() { guard let deckNumber = parameter["api_id"].int, let shipId = parameter["api_ship_id"].int, let shipIndex = parameter["api_ship_idx"].int else { return Logger.shared.log("parameter is wrong") } if shipId == -1 { guard let shipId = removeShip(deckNumber: deckNumber, index: shipIndex) else { return } notify(type: .remove, fleetNumber: deckNumber, position: shipIndex, shipID: shipId) return } if shipId == -2 { excludeShipsWithoutFlagShip(deckNumber: deckNumber) notify(type: .removeAllWithoutFlagship) return } guard case 0.. (deckNumber: Int?, shipId: Int) { let store = ServerDataStore.default return store.sync { store .decksSortedById() .lazy .enumerated() .map { (idx, deck) -> (Int, [Ship]) in (idx + 1, deck[0.. Int? { let store = ServerDataStore.oneTimeEditor() guard let deck = store.sync(execute: { store.deck(by: deckNumber) }) else { return Logger.shared.log("Deck not found", value: nil) } let shipId = store.sync { deck[index]?.id ?? -1 } store.sync { deck.setShip(id: -1, for: index) } packFleet(store: store, deck: deck) return shipId } private func excludeShipsWithoutFlagShip(deckNumber: Int) { let store = ServerDataStore.oneTimeEditor() store.sync { guard let deck = store.deck(by: deckNumber) else { return Logger.shared.log("Deck not found") } (1..