OSDN Git Service

洋上補給の補強増設用のショートネームをつけた
[kcd/KCD.git] / KCD / Fleet.swift
1 //
2 //  Fleet.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class DeckObserver {
12     
13     private let deck: Deck
14     private let handler: (Deck) -> Void
15     
16     private var observation: [NSKeyValueObservation] = []
17     
18     init(deck: Deck, handler: @escaping (Deck) -> Void) {
19         
20         self.deck = deck
21         self.handler = handler
22         
23         observation += [deck.observe(\Deck.ship_0, changeHandler: observeHandler)]
24         observation += [deck.observe(\Deck.ship_1, changeHandler: observeHandler)]
25         observation += [deck.observe(\Deck.ship_2, changeHandler: observeHandler)]
26         observation += [deck.observe(\Deck.ship_3, changeHandler: observeHandler)]
27         observation += [deck.observe(\Deck.ship_4, changeHandler: observeHandler)]
28         observation += [deck.observe(\Deck.ship_5, changeHandler: observeHandler)]
29         observation += [deck.observe(\Deck.ship_6, changeHandler: observeHandler)]
30         
31         handler(deck)
32     }
33     
34     private func observeHandler(_: Deck, _:NSKeyValueObservedChange<Int>) {
35         
36         handler(deck)
37     }
38 }
39
40 final class Fleet: NSObject {
41     
42     let fleetNumber: Int
43     
44     private var observer: DeckObserver?
45     
46     @objc dynamic private(set) var ships: [Ship] = []
47     private var deck: Deck?
48     
49     init?(number: Int) {
50         
51         guard case 1...4 = number else {
52             
53             Logger.shared.log("Fleet number out of range")
54             return nil
55         }
56         
57         fleetNumber = number
58         
59         super.init()
60         
61         if let deck = ServerDataStore.default.deck(by: number) {
62             
63             self.setupDeck(deck: deck)
64             
65             return
66         }
67         
68         ServerDataStore.default
69             .future { _ -> Deck? in
70                 
71                 guard let deck = ServerDataStore.default.deck(by: number) else { return .none }
72                 
73                 return deck
74             }
75             .onSuccess { deck in
76                 
77                 self.setupDeck(deck: deck)
78             }
79             .onFailure { error in
80                 
81                 Logger.shared.log("\(error)")
82         }
83     }
84     
85     subscript(_ index: Int) -> Ship? { return deck?[index] }
86     
87     private func setupDeck(deck: Deck) {
88         
89         self.deck = deck
90         self.observer = DeckObserver(deck: deck) { [weak self] in
91             
92             self?.setupShips(deck: $0)
93         }
94     }
95     
96     private func setupShips(deck: Deck) {
97         
98         ships = deck[0...6]
99     }
100 }