OSDN Git Service

UIを調整
[kcd/KCD.git] / KCD / HMFleetInformation.m
1 //
2 //  HMFleetInformation.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/09/28.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMFleetInformation.h"
10
11 #import "HMServerDataStore.h"
12 #import "HMKCShipObject+Extensions.h"
13 #import "HMKCSlotItemObject+Extensions.h"
14 #import "HMKCMasterSlotItemObject.h"
15 #import "HMKCDeck+Extension.h"
16
17
18 #ifdef DEBUG
19
20
21 @interface HMFleetInformation ()
22 @property (strong) NSArray *shipNameKeys;
23
24 @property (strong) NSArrayController *deckController;
25
26 @property (strong) id selectedFleet;
27
28 // overwrite
29 @property (nonatomic, strong) NSString *name;
30
31 @property (readwrite, strong) HMKCShipObject *flagShip;
32 @property (readwrite, strong) HMKCShipObject *secondShip;
33 @property (readwrite, strong) HMKCShipObject *thirdShip;
34 @property (readwrite, strong) HMKCShipObject *fourthShip;
35 @property (readwrite, strong) HMKCShipObject *fifthShip;
36 @property (readwrite, strong) HMKCShipObject *sixthShip;
37 @end
38
39 @implementation HMFleetInformation
40 @synthesize selectedFleetNumber = _selectedFleetNumber;
41
42 - (id)init
43 {
44         self = [super init];
45         if(self) {
46                 _shipNameKeys = @[@"flagShip", @"secondShip", @"thirdShip",
47                                                   @"fourthShip", @"fifthShip", @"sixthShip"];
48                 
49                 _deckController = [NSArrayController new];
50                 [_deckController setEntityName:@"Deck"];
51                 [_deckController setManagedObjectContext:[[HMServerDataStore defaultManager] managedObjectContext]];
52                 [_deckController setAvoidsEmptySelection:YES];
53                 [_deckController setPreservesSelection:YES];
54                 [_deckController setAutomaticallyPreparesContent:YES];
55                 [_deckController setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES]]];
56                 NSError *error = nil;
57                 [_deckController fetchWithRequest:nil merge:NO error:&error];
58                 if(error) {
59                         NSLog(@"%@", error);
60                 }
61                 
62                 [self.deckController addObserver:self
63                                                           forKeyPath:@"selection.ship_0"
64                                                                  options:0
65                                                                  context:@"0"];
66                 [self.deckController addObserver:self
67                                                           forKeyPath:@"selection.ship_1"
68                                                                  options:0
69                                                                  context:@"1"];
70                 [self.deckController addObserver:self
71                                                           forKeyPath:@"selection.ship_2"
72                                                                  options:0
73                                                                  context:@"2"];
74                 [self.deckController addObserver:self
75                                                           forKeyPath:@"selection.ship_3"
76                                                                  options:0
77                                                                  context:@"3"];
78                 [self.deckController addObserver:self
79                                                           forKeyPath:@"selection.ship_4"
80                                                                  options:0
81                                                                  context:@"4"];
82                 [self.deckController addObserver:self
83                                                           forKeyPath:@"selection.ship_5"
84                                                                  options:0
85                                                                  context:@"5"];
86                 
87                 self.selectedFleetNumber = @1;
88         }
89         return self;
90 }
91
92 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
93 {
94         id contextObject = (__bridge id)context;
95         
96         if([contextObject isKindOfClass:[NSString class]]) {
97 //              [self buildFleet];
98                 [self changeShipWithNumber:[contextObject integerValue]];
99                 
100                 return;
101         }
102         
103         [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
104 }
105
106 - (HMKCShipObject *)shipForID:(NSInteger)shipId inStore:(HMCoreDataManager *)store
107 {
108         HMKCShipObject *ship = nil;
109         NSError *error = nil;
110         NSArray *array = nil;
111         if(shipId != -1) {
112                 array = [store objectsWithEntityName:@"Ship"
113                                                                            error:&error
114                                                          predicateFormat:@"id = %ld", shipId];
115                 if(array.count == 0) {
116                         NSLog(@"Could not found ship of id %ld", shipId);
117                 } else {
118                         ship = array[0];
119                 }
120         }
121         
122         return ship;
123 }
124
125 - (void)changeShipWithNumber:(NSInteger)shipNumber
126 {
127         id ship = nil;
128         HMServerDataStore *store = [HMServerDataStore defaultManager];
129         NSString *key = [NSString stringWithFormat:@"ship_%ld", shipNumber];
130         NSNumber *shipIdNumber = [self.selectedFleet valueForKey:key];
131         NSInteger shipId = [shipIdNumber integerValue];
132         ship = [self shipForID:shipId inStore:store];
133         
134         [self setValue:ship forKey:self.shipNameKeys[shipNumber]];
135 }
136 - (void)buildFleet
137 {
138         for(id key in self.shipNameKeys) {
139                 [self setValue:nil forKey:key];
140         }
141         self.name = nil;
142         
143         NSInteger fleetId = [self.selectedFleetNumber integerValue];
144         if(fleetId > 6 || fleetId < 0) {
145                 return;
146         }
147         
148         NSArray *decks = [self.deckController arrangedObjects];
149         if(decks.count == 0) return;
150         self.selectedFleet = [decks objectAtIndex:fleetId-1];
151         self.name = [self.selectedFleet valueForKey:@"name"];
152         
153         for(NSInteger i = 0; i < 6; i++) {
154                 [self changeShipWithNumber:i];
155         }
156 }
157
158 + (NSSet *)keyPathsForValuesAffectingTotalSakuteki
159 {
160         return [NSSet setWithObjects:
161                         @"flagShip", @"secondShip", @"thirdShip",
162                         @"fourthShip", @"fifthShip", @"sixthShip",
163                         @"flagShip.sakuteki_0",
164                         @"secondShip.sakuteki_0",
165                         @"thirdShip.sakuteki_0",
166                         @"fourthShip.sakuteki_0",
167                         @"fifthShip.sakuteki_0",
168                         @"sixthShip.sakuteki_0",
169                         nil];
170 }
171 + (NSSet *)keyPathsForValuesAffectingTotalSeiku
172 {
173         return [NSSet setWithObjects:
174                         @"flagShip", @"secondShip", @"thirdShip",
175                         @"fourthShip", @"fifthShip", @"sixthShip",
176                         @"flagShip.onslot_0",
177                         @"flagShip.onslot_1",
178                         @"flagShip.onslot_2",
179                         @"flagShip.onslot_3",
180                         @"flagShip.onslot_4",
181                         
182                         @"secondShip.onslot_0",
183                         @"secondShip.onslot_1",
184                         @"secondShip.onslot_2",
185                         @"secondShip.onslot_3",
186                         @"secondShip.onslot_4",
187                         
188                         @"thirdShip.onslot_0",
189                         @"thirdShip.onslot_1",
190                         @"thirdShip.onslot_2",
191                         @"thirdShip.onslot_3",
192                         @"thirdShip.onslot_4",
193                         
194                         @"fourthShip.onslot_0",
195                         @"fourthShip.onslot_1",
196                         @"fourthShip.onslot_2",
197                         @"fourthShip.onslot_3",
198                         @"fourthShip.onslot_4",
199                         
200                         @"fifthShip.onslot_0",
201                         @"fifthShip.onslot_1",
202                         @"fifthShip.onslot_2",
203                         @"fifthShip.onslot_3",
204                         @"fifthShip.onslot_4",
205                         
206                         @"sixthShip.onslot_0",
207                         @"sixthShip.onslot_1",
208                         @"sixthShip.onslot_2",
209                         @"sixthShip.onslot_3",
210                         @"sixthShip.onslot_4",
211                         
212                         @"flagShip.equippedItem",
213                         @"secondShip.equippedItem",
214                         @"thirdShip.equippedItem",
215                         @"fourthShip.equippedItem",
216                         @"fifthShip.equippedItem",
217                         @"sixthShip.equippedItem",
218                         
219                         nil];
220 }
221
222 - (void)setSelectedFleetNumber:(NSNumber *)fleetNumber
223 {
224         _selectedFleetNumber = fleetNumber;
225         self.deckController.selectionIndex = [fleetNumber integerValue] - 1;
226         [self buildFleet];
227 }
228
229 - (NSNumber *)totalSakuteki
230 {
231         NSInteger total = 0;
232         total += [self.flagShip.sakuteki_0 integerValue];
233         total += [self.secondShip.sakuteki_0 integerValue];
234         total += [self.thirdShip.sakuteki_0 integerValue];
235         total += [self.fourthShip.sakuteki_0 integerValue];
236         total += [self.fifthShip.sakuteki_0 integerValue];
237         total += [self.sixthShip.sakuteki_0 integerValue];
238         
239         return @(total);
240 }
241
242 - (NSUInteger)seikuAtIndex:(NSUInteger)index
243 {
244         if(index > 5) {
245                 return 0;
246         }
247         
248         HMKCShipObject *ship = nil;
249         HMServerDataStore *store = [HMServerDataStore defaultManager];
250         NSString *key = [NSString stringWithFormat:@"ship_%ld", index];
251         NSNumber *shipIdNumber = [self.selectedFleet valueForKey:key];
252         if(!shipIdNumber) return 0;
253         NSInteger shipId = [shipIdNumber integerValue];
254         ship = [self shipForID:shipId inStore:store];
255         if(!ship) return 0;
256         
257         return ship.seiku.integerValue;
258 }
259
260 - (NSNumber *)totalSeiku
261 {
262         NSUInteger totalSeiku = 0;
263         for(NSUInteger i = 0; i < 6; i++) {
264                 totalSeiku += [self seikuAtIndex:i];
265         }
266         
267         return @(totalSeiku);
268 }
269
270 - (HMKCDeck *)fleetAtIndex:(NSInteger)fleetNumner
271 {
272         NSArray *decks = [self.deckController arrangedObjects];
273         if(fleetNumner == 0 || decks.count < fleetNumner) return nil;
274         return decks[fleetNumner - 1];
275 }
276 - (NSArray *)fleetMemberAtIndex:(NSInteger)fleetNumber
277 {
278         HMKCDeck *deck = [self fleetAtIndex:fleetNumber];
279         NSMutableArray *result = [NSMutableArray arrayWithCapacity:6];
280         
281         HMServerDataStore *store = [HMServerDataStore defaultManager];
282         for(NSInteger i = 0; i < 6; i++) {
283                 NSString *key = [NSString stringWithFormat:@"ship_%ld", i];
284                 NSNumber *shipIdNumber = [deck valueForKey:key];
285                 NSInteger shipId = [shipIdNumber integerValue];
286                 if(shipId == -1) continue;
287                 HMKCShipObject *ship = [self shipForID:shipId inStore:store];
288                 if(!ship) continue;
289                 [result addObject:ship];
290         }
291         return result;
292 }
293 @end
294
295 #endif