OSDN Git Service

連合艦隊表示ビューを追加
[kcd/KCD.git] / KCD / HMVerticalFleetViewController.m
1 //
2 //  HMVerticalFleetViewController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/11/22.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMVerticalFleetViewController.h"
10 #import "HMShipDetailViewController.h"
11 #import "HMMinimumShipViewController.h"
12
13 #import "HMAppDelegate.h"
14
15 #import "HMKCShipObject+Extensions.h"
16 #import "HMKCDeck+Extension.h"
17
18 #import "HMServerDataStore.h"
19
20 #import "HMAnchorageRepairManager.h"
21
22
23 static const NSInteger maxFleetNumber = 4;
24
25 @interface HMVerticalFleetViewController ()
26
27 @property (weak) Class shipViewClass;
28
29 @property (readwrite) HMFleetViewType type;
30
31 @property (nonatomic, weak) IBOutlet NSView *placeholder01;
32 @property (nonatomic, weak) IBOutlet NSView *placeholder02;
33 @property (nonatomic, weak) IBOutlet NSView *placeholder03;
34 @property (nonatomic, weak) IBOutlet NSView *placeholder04;
35 @property (nonatomic, weak) IBOutlet NSView *placeholder05;
36 @property (nonatomic, weak) IBOutlet NSView *placeholder06;
37
38 @property (strong) HMShipDetailViewController *detail01;
39 @property (strong) HMShipDetailViewController *detail02;
40 @property (strong) HMShipDetailViewController *detail03;
41 @property (strong) HMShipDetailViewController *detail04;
42 @property (strong) HMShipDetailViewController *detail05;
43 @property (strong) HMShipDetailViewController *detail06;
44 @property (strong) NSArray *details;
45
46 @property (readonly) NSArray *shipKeys;
47
48
49 @property (strong) NSArray *anchorageRepairHolder;
50 @property (strong) HMAnchorageRepairManager *anchorageRepair;
51 @property (readonly) NSNumber *repairTime;
52 @property (readonly) NSNumber *repairableShipCount;
53
54 @end
55
56 @implementation HMVerticalFleetViewController
57 @synthesize fleetNumber = _fleetNumber;
58 @synthesize shipOrder = _shipOrder;
59
60 + (instancetype)new
61 {
62         return [[[self class] alloc] initWithViewType:miniVierticalType];
63 }
64
65 - (instancetype)initWithViewType:(HMFleetViewType)type
66 {
67         Class shipViewClass = Nil;
68         NSString *nibName = nil;
69         switch (type) {
70                 case detailViewType:
71                         nibName = NSStringFromClass([self class]);
72                         shipViewClass = [HMShipDetailViewController class];
73                         break;
74                 case minimumViewType:
75                         nibName = @"HMFleetMinimumViewController";
76                         shipViewClass = [HMMinimumShipViewController class];
77                         break;
78                 case miniVierticalType:
79                         nibName = @"HMVerticalFleetViewController";
80                         shipViewClass = [HMMinimumShipViewController class];
81                         break;
82         }
83         
84         if(!nibName) {
85                 self = [super initWithNibName:@"" bundle:nil];
86                 NSLog(@"UnknownType");
87                 return nil;
88         }
89         
90         self = [super initWithNibName:nibName bundle:nil];
91         if(self) {
92                 _type = type;
93                 _shipViewClass = shipViewClass;
94                 
95                 [self buildAnchorageRepairHolder];
96         }
97         return self;
98 }
99
100 - (void)dealloc
101 {
102         for(NSString *key in self.shipKeys) {
103                 [self.representedObject removeObserver:self
104                                                                         forKeyPath:key];
105         }
106 }
107
108 - (void)awakeFromNib
109 {
110         NSMutableArray *details = [NSMutableArray new];
111         NSArray *detailKeys = @[@"detail01", @"detail02", @"detail03", @"detail04", @"detail05", @"detail06"];
112         [detailKeys enumerateObjectsUsingBlock:^(id detailKey, NSUInteger idx, BOOL *stop) {
113                 HMShipDetailViewController *detail = [self.shipViewClass new];
114                 detail.title = [NSString stringWithFormat:@"%ld", idx + 1];
115                 [self setValue:detail forKey:detailKey];
116                 
117                 [details addObject:detail];
118         }];
119         self.details = details;
120         
121         NSArray *placeholderKeys = @[@"placeholder01", @"placeholder02", @"placeholder03", @"placeholder04", @"placeholder05", @"placeholder06"];
122         [placeholderKeys enumerateObjectsUsingBlock:^(id placeholderKey, NSUInteger idx, BOOL *stop) {
123                 NSView *view = [self valueForKey:placeholderKey];
124                 HMShipDetailViewController *detail = self.details[idx];
125                 [detail.view setFrame:[view frame]];
126                 [detail.view setAutoresizingMask:[view autoresizingMask]];
127                 [[view superview] replaceSubview:view with:detail.view];
128         }];
129         
130         self.fleetNumber = 1;
131 }
132
133 - (NSArray *)shipKeys
134 {
135         static NSArray *shipKeys = nil;
136         if(shipKeys) return shipKeys;
137         
138         shipKeys = @[@"ship_0", @"ship_1", @"ship_2", @"ship_3", @"ship_4", @"ship_5"];
139         return shipKeys;
140 }
141
142 - (void)setShipOfViewForKey:(NSString *)key
143 {
144         NSUInteger index = [self.shipKeys indexOfObject:key];
145         if(index != NSNotFound) {
146                 NSUInteger shipID = [[self.fleet valueForKey:key] integerValue];
147                 [self setShipID:shipID
148                            toDetail:self.details[index]];
149         }
150 }
151
152 - (void)setShipID:(NSInteger)shipId toDetail:(HMShipDetailViewController *)detail
153 {
154         HMServerDataStore *store = [HMServerDataStore defaultManager];
155         NSError *error = nil;
156         HMKCShipObject *ship = nil;
157         NSArray *array = [store objectsWithEntityName:@"Ship"
158                                                                                         error:&error
159                                                                   predicateFormat:@"id = %ld", shipId];
160         if(error) {
161                 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
162         }
163         if(array.count != 0) {
164                 ship = array[0];
165         }
166         detail.ship = ship;
167         
168         [self willChangeValueForKey:@"repairableShipCount"];
169         [self didChangeValueForKey:@"repairableShipCount"];
170 }
171 - (void)setFleet:(HMKCDeck *)fleet
172 {
173         for(NSString *key in self.shipKeys) {
174                 [self.representedObject removeObserver:self
175                                                                         forKeyPath:key];
176                 
177                 [fleet addObserver:self
178                                 forKeyPath:key
179                                    options:0
180                                    context:NULL];
181         }
182         
183         self.representedObject = fleet;
184         self.title = fleet.name;
185         
186         for(NSString *key in self.shipKeys) {
187                 [self setShipOfViewForKey:key];
188         }
189 }
190 - (HMKCDeck *)fleet
191 {
192         return self.representedObject;
193 }
194
195 - (void)setFleetNumber:(NSInteger)fleetNumber
196 {
197         HMServerDataStore *store = [HMServerDataStore defaultManager];
198         NSError *error = nil;
199         NSArray *array = [store objectsWithEntityName:@"Deck"
200                                                                                         error:NULL
201                                                                   predicateFormat:@"id = %ld", fleetNumber];
202         if(error) {
203                 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
204                 return;
205         }
206         if(array.count == 0) {
207                 return;
208         }
209         
210         self.fleet = array[0];
211         _fleetNumber = fleetNumber;
212         
213         self.anchorageRepair = self.anchorageRepairHolder[fleetNumber - 1];
214 }
215 - (NSInteger)fleetNumber
216 {
217         return _fleetNumber;
218 }
219
220 - (void)setShipOrder:(HMFleetViewShipOrder)shipOrder
221 {
222         if(_shipOrder == shipOrder) return;
223         _shipOrder = shipOrder;
224         
225         switch(shipOrder) {
226                 case doubleLine:
227                         [self reorderShipToDoubleLine];
228                         break;
229                 case leftToRight:
230                         [self reorderShipToLeftToRight];
231                         break;
232         }
233 }
234 - (HMFleetViewShipOrder)shipOrder
235 {
236         return _shipOrder;
237 }
238
239 - (BOOL)canDivide
240 {
241         return self.type == detailViewType;
242 }
243 - (CGFloat)normalHeight
244 {
245 //      switch(self.type) {
246 //              case detailViewType:
247 //                      return HMFleetViewController.detailViewHeight;
248 //              case minimumViewType:
249 //                      return HMFleetViewController.oldStyleFleetViewHeight;
250 //      }
251         return 0;
252 }
253 - (CGFloat)upsideHeight
254 {
255 //      switch(self.type) {
256 //              case detailViewType:
257 //                      return 159;
258 //              case minimumViewType:
259 //                      return HMFleetViewController.oldStyleFleetViewHeight;
260 //      }
261         return 0;
262 }
263
264 + (CGFloat)oldStyleFleetViewHeight
265 {
266         return 128;
267 }
268 + (CGFloat)detailViewHeight
269 {
270         return 288;
271 }
272 + (CGFloat)heightDifference
273 {
274         return self.detailViewHeight - self.oldStyleFleetViewHeight;
275 }
276
277
278 + (NSSet *)keyPathsForValuesAffectingTotalSakuteki
279 {
280         return [NSSet setWithObjects:
281                         @"detail01.ship.sakuteki_0",
282                         @"detail02.ship.sakuteki_0",
283                         @"detail03.ship.sakuteki_0",
284                         @"detail04.ship.sakuteki_0",
285                         @"detail05.ship.sakuteki_0",
286                         @"detail06.ship.sakuteki_0",
287                         nil];
288 }
289 - (NSNumber *)totalSakuteki
290 {
291         NSInteger total = 0;
292         for(HMShipDetailViewController *detail in self.details) {
293                 HMKCShipObject *ship = detail.ship;
294                 total += ship.sakuteki_0.integerValue;
295         }
296         return @(total);
297 }
298
299 + (NSSet *)keyPathsForValuesAffectingTotalSeiku
300 {
301         return [NSSet setWithObjects:
302                         @"detail01.ship.seiku",
303                         @"detail02.ship.seiku",
304                         @"detail03.ship.seiku",
305                         @"detail04.ship.seiku",
306                         @"detail05.ship.seiku",
307                         @"detail06.ship.seiku",
308                         nil];
309 }
310 - (NSNumber *)totalSeiku
311 {
312         NSInteger total = 0;
313         for(HMShipDetailViewController *detail in self.details) {
314                 HMKCShipObject *ship = detail.ship;
315                 total += ship.seiku.integerValue;
316         }
317         return @(total);
318 }
319 + (NSSet *)keyPathsForValuesAffectingTotalCalclatedSeiku
320 {
321         return [NSSet setWithObjects:
322                         @"detail01.ship.seiku",
323                         @"detail02.ship.seiku",
324                         @"detail03.ship.seiku",
325                         @"detail04.ship.seiku",
326                         @"detail05.ship.seiku",
327                         @"detail06.ship.seiku",
328                         nil];
329 }
330 - (NSNumber *)totalCalclatedSeiku
331 {
332         NSInteger total = 0;
333         for(HMShipDetailViewController *detail in self.details) {
334                 HMKCShipObject *ship = detail.ship;
335                 total += ship.seiku.integerValue;
336                 total += ship.extraSeiku.integerValue;
337         }
338         return @(total);
339 }
340 + (NSSet *)keyPathsForValuesAffectingTotalLevel
341 {
342         return [NSSet setWithObjects:
343                         @"detail01.ship.lv",
344                         @"detail02.ship.lv",
345                         @"detail03.ship.lv",
346                         @"detail04.ship.lv",
347                         @"detail05.ship.lv",
348                         @"detail06.ship.lv",
349                         nil];
350 }
351 - (NSNumber *)totalLevel
352 {
353         NSInteger total = 0;
354         for(HMShipDetailViewController *detail in self.details) {
355                 HMKCShipObject *ship = detail.ship;
356                 total += ship.lv.integerValue;
357         }
358         return @(total);
359 }
360 + (NSSet *)keyPathsForValuesAffectingTotalDrums
361 {
362         return [NSSet setWithObjects:
363                         @"detail01.ship.totalDrums",
364                         @"detail02.ship.totalDrums",
365                         @"detail03.ship.totalDrums",
366                         @"detail04.ship.totalDrums",
367                         @"detail05.ship.totalDrums",
368                         @"detail06.ship.totalDrums",
369                         nil];
370 }
371 - (NSNumber *)totalDrums
372 {
373         NSInteger total = 0;
374         for(HMShipDetailViewController *detail in self.details) {
375                 HMKCShipObject *ship = detail.ship;
376                 total += ship.totalDrums.integerValue;
377         }
378         return @(total);
379 }
380
381 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
382 {
383         if([self.shipKeys containsObject:keyPath]) {
384                 [self setShipOfViewForKey:keyPath];
385                 return;
386         }
387         
388         return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
389 }
390
391 - (IBAction)selectNextFleet:(id)sender
392 {
393         NSInteger next = self.fleetNumber + 1;
394         self.fleetNumber = next <= maxFleetNumber ? next : 1;
395 }
396 - (IBAction)selectPreviousFleet:(id)sender
397 {
398         NSInteger prev = self.fleetNumber - 1;
399         self.fleetNumber = prev > 0 ? prev : 4;
400 }
401
402
403 - (void)reorderShipToDoubleLine
404 {
405         NSView *view02 = self.detail02.view;
406         NSView *view03 = self.detail03.view;
407         NSView *view04 = self.detail04.view;
408         NSView *view05 = self.detail05.view;
409         
410         NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
411         NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
412         NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
413         NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
414         
415         view02.autoresizingMask = options04;
416         view03.autoresizingMask = options02;
417         view04.autoresizingMask = options05;
418         view05.autoresizingMask = options03;
419         
420         NSRect frame02 = view02.frame;
421         NSRect frame03 = view03.frame;
422         NSRect frame04 = view04.frame;
423         NSRect frame05 = view05.frame;
424         
425         if(self.enableAnimation) {
426                 view02.animator.frame = frame04;
427                 view03.animator.frame = frame02;
428                 view04.animator.frame = frame05;
429                 view05.animator.frame = frame03;
430         } else {
431                 view02.frame = frame04;
432                 view03.frame = frame02;
433                 view04.frame = frame05;
434                 view05.frame = frame03;
435         }
436 }
437 - (void)reorderShipToLeftToRight
438 {
439         NSView *view02 = self.detail02.view;
440         NSView *view03 = self.detail03.view;
441         NSView *view04 = self.detail04.view;
442         NSView *view05 = self.detail05.view;
443         
444         NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
445         NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
446         NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
447         NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
448         
449         view02.autoresizingMask = options03;
450         view03.autoresizingMask = options05;
451         view04.autoresizingMask = options02;
452         view05.autoresizingMask = options04;
453         
454         NSRect frame02 = view02.frame;
455         NSRect frame03 = view03.frame;
456         NSRect frame04 = view04.frame;
457         NSRect frame05 = view05.frame;
458         
459         if(self.enableAnimation) {
460                 view02.animator.frame = frame03;
461                 view03.animator.frame = frame05;
462                 view04.animator.frame = frame02;
463                 view05.animator.frame = frame04;
464         } else {
465                 view02.frame = frame03;
466                 view03.frame = frame05;
467                 view04.frame = frame02;
468                 view05.frame = frame04;
469         }
470 }
471
472
473 - (void)buildAnchorageRepairHolder
474 {
475         HMServerDataStore *store = [HMServerDataStore defaultManager];
476         NSError *error = nil;
477         NSArray *array = [store objectsWithEntityName:@"Deck"
478                                                                   sortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES]]
479                                                                                 predicate:nil
480                                                                                         error:&error];
481         if(error) {
482                 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
483                 return;
484         }
485         if(array.count == 0) {
486                 return;
487         }
488         if(array.count < 4) {
489                 NSBeep();
490                 NSLog(@"hogehoge");
491                 return;
492         }
493         NSMutableArray *anchorageRepairs = [NSMutableArray new];
494         for(HMKCDeck *deck in array) {
495                 id anchorageRepair = [[HMAnchorageRepairManager alloc] initWithDeck:deck];
496                 [anchorageRepairs addObject:anchorageRepair];
497         }
498         self.anchorageRepairHolder = anchorageRepairs;
499         
500         HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
501         [appDelegate addCounterUpdateBlock:^{
502                 [self willChangeValueForKey:@"repairTime"];
503                 [self didChangeValueForKey:@"repairTime"];
504         }];
505 }
506 + (NSSet *)keyPathsForValuesAffectingRepairTime
507 {
508         return [NSSet setWithObjects:@"anchorageRepair.repairTime", @"anchorageRepair", nil];
509 }
510 - (NSNumber *)repairTime
511 {
512         NSDate *compTimeValue = self.anchorageRepair.repairTime;
513         if(!compTimeValue) return nil;
514         
515         NSTimeInterval compTime = [compTimeValue timeIntervalSince1970];
516         NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
517         NSTimeInterval diff = compTime - [now timeIntervalSince1970];
518         return @(diff + 20 * 60);
519 }
520 + (NSSet *)keyPathsForValuesAffectingRepairableShipCount
521 {
522         return [NSSet setWithObjects:
523                         @"anchorageRepair.repairableShipCount", @"anchorageRepair",
524                         
525                         
526                         nil];
527 }
528 - (NSNumber *)repairableShipCount
529 {
530         return self.anchorageRepair.repairableShipCount;
531 }
532
533 @end