OSDN Git Service

艦隊に編成中の艦娘を解体すると落ちる可能性がある問題を修正
[kcd/KCD.git] / KCD / HMFleet.m
1 //
2 //  HMFleet.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/02/11.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMFleet.h"
10
11 #import "HMServerDataStore.h"
12
13 #import "HMKCDeck+Extension.h"
14 #import "HMKCShipObject+Extensions.h"
15
16 @interface HMFleet ()
17 @property (strong) NSNumber *fleetNumber;
18 @property (strong) NSObjectController *deckController;
19 @property (weak) HMKCDeck *deck;
20
21 @property (readonly) NSArray<NSString *> *deckObserveKeys;
22
23 @property (strong) NSArray<HMKCShipObject *> *ships;
24 @property (readonly) NSArray<NSString *> *shipObserveKeys;
25
26 @end
27 @implementation HMFleet
28
29 + (instancetype)fleetWithNumber:(NSNumber *)fleetNumber
30 {
31         return [[self alloc] initWithNumber:fleetNumber];
32 }
33 - (instancetype)initWithNumber:(NSNumber *)fleetNumber
34 {
35         self = [super init];
36         if(self) {
37                 if(fleetNumber.integerValue < 1 || fleetNumber.integerValue > 4) {
38                         return nil;
39                 }
40                 _fleetNumber = fleetNumber;
41                 
42                 _deckController = [[NSObjectController alloc] initWithContent:nil];
43                 _deckController.entityName = @"Deck";
44                 _deckController.managedObjectContext = [[HMServerDataStore defaultManager] managedObjectContext];
45                 _deckController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", fleetNumber];
46                 NSFetchRequest *request = [NSFetchRequest new];
47                 request.entity = [NSEntityDescription entityForName:@"Deck"
48                                                                          inManagedObjectContext:[HMServerDataStore defaultManager].managedObjectContext];
49                 request.predicate = _deckController.fetchPredicate;
50                 [_deckController fetchWithRequest:request
51                                                                         merge:NO
52                                                                         error:NULL];
53                 
54                 self.deck = _deckController.content;
55                 for(NSString *key in self.deckObserveKeys) {
56                         [_deckController addObserver:self
57                                                           forKeyPath:key
58                                                                  options:0
59                                                                  context:(__bridge void * _Nullable)(_deck)];
60                 }
61         }
62         
63         return self;
64 }
65 - (void)dealloc
66 {
67         for(NSString *key in self.deckObserveKeys) {
68                 [_deckController removeObserver:self forKeyPath:key];
69         }
70         for(HMKCShipObject *ship in _ships) {
71                 for(NSString *key in self.shipObserveKeys) {
72                         [ship removeObserver:self forKeyPath:key];
73                 }
74         }
75 }
76
77 - (instancetype)self
78 {
79         return self;
80 }
81
82 - (NSArray<NSString *> *)deckObserveKeys
83 {
84         return  [NSArray arrayWithObjects:
85                          @"selection.ship_0",
86                          @"selection.ship_1",
87                          @"selection.ship_2",
88                          @"selection.ship_3",
89                          @"selection.ship_4",
90                          @"selection.ship_5",
91                          nil];
92 }
93 -(NSArray<NSString *> *)shipObserveKeys
94 {
95         return  [NSArray arrayWithObjects:
96                          @"sakuteki_0",
97                          @"seiku",
98                          @"lv",
99                          @"totalDrums",
100                          nil];
101 }
102
103 - (HMKCShipObject *)objectAtIndexedSubscript:(NSUInteger)idx
104 {
105         return self.deck[idx];
106 }
107
108 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
109 {
110         id obj = (__bridge id)(context);
111         if(obj == _deck) {
112                 
113                 for(HMKCShipObject *ship in _ships) {
114                         for(NSString *key in self.shipObserveKeys) {
115                                 [ship removeObserver:self forKeyPath:key];
116                         }
117                 }
118                 
119                 NSMutableArray<HMKCShipObject *> *result = [NSMutableArray array];
120                 
121                 for(NSUInteger i = 0; i < 6; i++) {
122                         HMKCShipObject *ship = self[i];
123                         if(ship) {
124                                 [result addObject:ship];
125                         }
126                 }
127                 self.ships = result;
128                 
129                 
130                 for(HMKCShipObject *ship in _ships) {
131                         for(NSString *key in self.shipObserveKeys) {
132                                 [ship addObserver:self
133                                            forKeyPath:key
134                                                   options:0
135                                                   context:(__bridge void * _Nullable)(_ships)];
136                         }
137                 }
138                 
139                 return;
140         }
141         
142         if(obj == _ships) {
143                 if([keyPath isEqualToString:@"sakuteki_0"]) {
144                         [self willChangeValueForKey:@"totalSakuteki"];
145                         [self didChangeValueForKey:@"totalSakuteki"];
146                 }
147                 if([keyPath isEqualToString:@"seiku"]) {
148                         [self willChangeValueForKey:@"totalSeiku"];
149                         [self didChangeValueForKey:@"totalSeiku"];
150                         
151                         [self willChangeValueForKey:@"totalCalclatedSeiku"];
152                         [self didChangeValueForKey:@"totalCalclatedSeiku"];
153                 }
154                 if([keyPath isEqualToString:@"lv"]) {
155                         [self willChangeValueForKey:@"totalLevel"];
156                         [self didChangeValueForKey:@"totalLevel"];
157                 }
158                 if([keyPath isEqualToString:@"totalDrums"]) {
159                         [self willChangeValueForKey:@"totalDrums"];
160                         [self didChangeValueForKey:@"totalDrums"];
161                 }
162                 
163                 return;
164         }
165         
166         [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
167 }
168
169 + (NSSet *)keyPathsForValuesAffectingFlagShip
170 {
171         return [NSSet setWithObject:@"deck.ship_0"];
172 }
173 - (HMKCShipObject *)flagShip
174 {
175         return self[0];
176 }
177 + (NSSet *)keyPathsForValuesAffectingSecondShip
178 {
179         return [NSSet setWithObject:@"deck.ship_1"];
180 }
181 - (HMKCShipObject *)secondShip
182 {
183         return self[1];
184 }
185 + (NSSet *)keyPathsForValuesAffectingThirdShip
186 {
187         return [NSSet setWithObject:@"deck.ship_2"];
188 }
189 - (HMKCShipObject *)thirdShip
190 {
191         return self[2];
192 }
193 + (NSSet *)keyPathsForValuesAffectingFourthShip
194 {
195         return [NSSet setWithObject:@"deck.ship_3"];
196 }
197 - (HMKCShipObject *)fourthShip
198 {
199         return self[3];
200 }
201 + (NSSet *)keyPathsForValuesAffectingFifthShip
202 {
203         return [NSSet setWithObject:@"deck.ship_4"];
204 }
205 - (HMKCShipObject *)fifthShip
206 {
207         return self[4];
208 }
209 + (NSSet *)keyPathsForValuesAffectingSixthShip
210 {
211         return [NSSet setWithObject:@"deck.ship_5"];
212 }
213 - (HMKCShipObject *)sixthShip
214 {
215         return self[5];
216 }
217
218 + (NSSet *)keyPathsForValuesAffectingName
219 {
220         return [NSSet setWithObject:@"deck.name"];
221 }
222 - (NSString *)name
223 {
224         NSString *name = self.deck.name;
225         
226         return name;
227 }
228
229 + (NSSet *)keyPathsForValuesAffectingId
230 {
231         return [NSSet setWithObject:@"deck.id"];
232 }
233 - (NSNumber *)id
234 {
235         return self.deck.id;
236 }
237
238 - (NSNumber *)totalSakuteki
239 {
240         NSInteger total = 0;
241         for(NSInteger i = 0; i < 6; i++) {
242                 HMKCShipObject *ship = self[i];
243                 total += ship.sakuteki_0.integerValue;
244         }
245         return @(total);
246 }
247
248 - (NSNumber *)totalSeiku
249 {
250         NSInteger total = 0;
251         for(NSInteger i = 0; i < 6; i++) {
252                 HMKCShipObject *ship = self[i];
253                 total += ship.seiku.integerValue;
254         }
255         return @(total);
256 }
257
258 - (NSNumber *)totalCalclatedSeiku
259 {
260         NSInteger total = 0;
261         for(NSInteger i = 0; i < 6; i++) {
262                 HMKCShipObject *ship = self[i];
263                 total += ship.seiku.integerValue;
264                 total += ship.extraSeiku.integerValue;
265         }
266         return @(total);
267 }
268
269 - (NSNumber *)totalLevel
270 {
271         NSInteger total = 0;
272         for(NSInteger i = 0; i < 6; i++) {
273                 HMKCShipObject *ship = self[i];
274                 total += ship.lv.integerValue;
275         }
276         return @(total);
277 }
278
279 - (NSNumber *)totalDrums
280 {
281         NSInteger total = 0;
282         for(NSInteger i = 0; i < 6; i++) {
283                 HMKCShipObject *ship = self[i];
284                 total += ship.totalDrums.integerValue;
285         }
286         return @(total);
287 }
288 @end