OSDN Git Service

分岐係数込みの判定式(33)の値が誤っていたので修正
[kcd/KCD.git] / KCD / ShipMasterDetailWindowController.swift
1 //
2 //  ShipMasterDetailWindowController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/05.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class ShipMasterDetailWindowController: NSWindowController {
12     
13     @objc let managedObjectContext = ServerDataStore.default.context
14     @objc let fleetManager: FleetManager = {
15         
16         return AppDelegate.shared.fleetManager ?? FleetManager()
17     }()
18     let specNames = [
19         "id", "name", "shortTypeName",
20         "slot_0", "slot_1", "slot_2", "slot_3", "slot_4",
21         "onslot_0", "onslot_1", "onslot_2", "onslot_3", "onslot_4",
22         "leng", "slot_ex", "sakuteki_0", "sakuteki_1"
23     ]
24     
25     @IBOutlet private var shipController: NSArrayController!
26     @IBOutlet private var fleetMemberController: NSArrayController!
27     @IBOutlet private var deckController: NSArrayController!
28     @IBOutlet private weak var decksView: NSTableView!
29     @IBOutlet private weak var shipsView: NSTableView!
30     @IBOutlet private weak var fleetMemberView: NSTableView!
31     @IBOutlet private weak var sally: NSTextField!
32     
33     override var windowNibName: NSNib.Name {
34         
35         return .nibName(instanceOf: self)
36     }
37     
38     @objc dynamic var selectedDeck: Deck? {
39         
40         didSet {
41             
42             fleetShips = selectedDeck?[0...6] ?? []
43         }
44     }
45     
46     @objc dynamic var fleetShips: [Ship] = []
47     
48     @objc dynamic var selectedShip: Ship? {
49         
50         didSet { buildSpec() }
51     }
52     @objc dynamic var spec: [[String: Any]] = []
53     
54     @objc dynamic var equipments: NSArray?
55     
56     private func buildSpec() {
57         
58         guard let selectedShip = selectedShip else {
59             
60             return
61         }
62         
63         spec = specNames.compactMap { key -> [String: Any]? in
64             
65             guard let v = selectedShip.value(forKeyPath: key) else {
66                 
67                 return nil
68             }
69             
70             return ["name": key, "value": v]
71         }
72         equipments = selectedShip.equippedItem.array as NSArray?
73     }
74     
75     @IBAction func applySally(_ sender: AnyObject?) {
76         
77         let store = ServerDataStore.oneTimeEditor()
78         store.sync {
79             
80             guard let selectedShip = self.selectedShip else {
81                 
82                 return
83             }
84             guard let ship = store.exchange(selectedShip) else {
85                 
86                 return
87             }
88             //
89             //        ship.sally_area = sally.integerValue as NSNumber
90             
91             let eq = ship.equippedItem.array
92             let slotId = self.sally.integerValue
93             
94             let pos = min(4, eq.count)
95             
96             if eq.count > 4 {
97                 
98                 ship.equippedItem = NSOrderedSet(array: Array(eq.dropLast()))
99             }
100             
101             if let slotItem = store.slotItem(by: slotId) {
102                 
103                 ship.setItem(slotId, to: pos)
104                 
105                 ship.equippedItem = NSOrderedSet(array: ship.equippedItem.array + [slotItem])
106             }
107             
108             store.save(errorHandler: {_ in})
109         }
110     }
111 }
112
113 extension ShipMasterDetailWindowController: NSTableViewDelegate {
114     
115     func tableViewSelectionDidChange(_ notification: Notification) {
116         
117         guard let tableView = notification.object as? NSTableView else {
118             
119             return
120         }
121         
122         let controller = [
123             (shipsView, shipController),
124             (fleetMemberView, fleetMemberController),
125             (decksView, deckController)
126             ]
127             .lazy
128             .filter { $0.0 == tableView }
129             .flatMap { $0.1 }
130             .first
131         
132         if let selectedObjects = controller?.selectedObjects as? [Ship] {
133             
134             selectedShip = selectedObjects.first
135             
136         } else if let selectedObjects = controller?.selectedObjects as? [Deck] {
137         
138             selectedDeck = selectedObjects.first
139         }
140     }
141 }