OSDN Git Service

9633c5796b8d790ad18c13c1882d9af3eb69c18f
[kcd/KCD.git] / KCD / HMAnchorageRepairManager.m
1 //
2 //  HMAnchorageRepairManager.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/07/19.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMAnchorageRepairManager.h"
10
11 #import "HMAppDelegate.h"
12 #import "HMUserDefaults.h"
13
14 #import "HMServerDataStore.h"
15 #import "HMKCDeck+Extension.h"
16 #import "HMKCShipObject+Extensions.h"
17 #import "HMKCMasterShipObject.h"
18 #import "HMKCSlotItemObject+Extensions.h"
19 #import "HMKCMasterSlotItemObject.h"
20
21
22 @interface HMAnchorageRepairManager ()
23
24
25 @property (strong) NSDate *repairTime;
26
27 @property (strong) HMKCDeck* fleet;
28 @property (strong) NSNumber *deckID;
29 @property (strong) NSArray *members;
30
31 @property (strong) NSObjectController *fleetController;
32 @property (strong) NSArrayController *memberController;
33
34 @end
35
36 @implementation HMAnchorageRepairManager
37
38 static NSMutableArray *sRepairableDeckIDs;
39
40 + (void)initialize
41 {
42         static dispatch_once_t onceToken;
43         dispatch_once(&onceToken, ^{
44                 sRepairableDeckIDs = [NSMutableArray new];
45         });
46 }
47
48 - (instancetype)initWithDeck:(HMKCDeck *)deck
49 {
50         self = [super init];
51         if(self) {
52                 _fleet = deck;
53                 _deckID = _fleet.id;
54                 
55                 _fleetController = [NSObjectController new];
56                 _fleetController.managedObjectContext = deck.managedObjectContext;
57                 _fleetController.entityName = @"Deck";
58                 _fleetController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", deck.id];
59                 NSError *error = nil;
60                 [_fleetController fetchWithRequest:nil merge:NO error:&error];
61                 if(error) {
62                         NSLog(@"%@", error);
63                 }
64                 
65                 [self.fleetController addObserver:self
66                                                           forKeyPath:@"selection.ship_0"
67                                                                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
68                                                                  context:@"0"];
69                 [self.fleetController addObserver:self
70                                                            forKeyPath:@"selection.ship_1"
71                                                                   options:0
72                                                                   context:@"1"];
73                 [self.fleetController addObserver:self
74                                                            forKeyPath:@"selection.ship_2"
75                                                                   options:0
76                                                                   context:@"2"];
77                 [self.fleetController addObserver:self
78                                                            forKeyPath:@"selection.ship_3"
79                                                                   options:0
80                                                                   context:@"3"];
81                 [self.fleetController addObserver:self
82                                                            forKeyPath:@"selection.ship_4"
83                                                                   options:0
84                                                                   context:@"4"];
85                 [self.fleetController addObserver:self
86                                                            forKeyPath:@"selection.ship_5"
87                                                                   options:0
88                                                                   context:@"5"];
89                 
90                 [self buildMembers];
91                 
92 //              [self resetRepairTime];
93                 
94                 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
95                 [nc addObserver:self
96                            selector:@selector(didRecivePortAPINotification:)
97                                    name:HMPortAPIRecieveNotification
98                                  object:nil];
99         }
100         return self;
101 }
102
103 - (void)dealloc
104 {
105         NSArray *shipKeys = @[@"ship_0", @"ship_1", @"ship_2", @"ship_3", @"ship_4", @"ship_5"];
106         for (NSString *key in shipKeys) {
107                 [_fleetController removeObserver:self
108                                                           forKeyPath:[NSString stringWithFormat:@"selection.%@", key]];
109         }
110 }
111
112 - (NSDate *)repairTime
113 {
114         if(!self.repairable) return nil;
115         
116         return HMStandardDefaults.repairTime;;
117 }
118 - (void)setRepairTime:(NSDate *)repairTime
119 {
120         HMStandardDefaults.repairTime = repairTime;
121 }
122
123
124 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
125 {
126         id contextObject = (__bridge id)(context);
127         
128         if([contextObject isEqual:@"members"]) {
129                 [self willChangeValueForKey:@"repairableShipCount"];
130                 [self didChangeValueForKey:@"repairableShipCount"];
131                 return;
132         }
133         if([contextObject isKindOfClass:[NSString class]]) {
134                 [self resetRepairTime];
135                 [self buildMembers];
136                 return;
137         }
138         
139         [super observeValueForKeyPath:keyPath ofObject:object change:change     context:context];
140 }
141
142 - (void)buildMembers
143 {
144         NSString *observeKeyPath = @"arrangedObjects.equippedItem";
145         
146         [self.memberController removeObserver:self forKeyPath:observeKeyPath];
147         
148         NSArray *shipKeys = @[@"ship_0", @"ship_1", @"ship_2", @"ship_3", @"ship_4", @"ship_5"];
149         HMServerDataStore *store = [HMServerDataStore defaultManager];
150         NSMutableArray *array = [NSMutableArray new];
151         [shipKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) {
152                 id shipID = [_fleet valueForKey:key];
153                 NSError *error = nil;
154                 NSArray *ships = [store objectsWithEntityName:@"Ship"
155                                                                                                 error:&error
156                                                                           predicateFormat:@"id = %ld", [shipID integerValue]];
157                 if(error) {
158                         NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
159                 }
160                 if(ships.count != 0) {
161                         [array addObject:ships[0]];
162                 }
163         }];
164         _members = array;
165         _memberController = [[NSArrayController alloc] initWithContent:array];
166         [self.memberController addObserver:self
167                                                         forKeyPath:observeKeyPath
168                                                            options:0
169                                                            context:@"members"];
170 }
171
172 - (void)didRecivePortAPINotification:(NSNotification *)notification
173 {
174         NSDate *finishDate = [self.repairTime dateByAddingTimeInterval:20 * 60];
175         if([finishDate compare:[NSDate dateWithTimeIntervalSinceNow:0.0]] == NSOrderedAscending) {
176                 [self resetRepairTime];
177         }
178 }
179
180 - (NSArray *)repairShipIds
181 {
182         return @[@(19)];
183 }
184 - (NSArray *)repairSlotItemIds
185 {
186         return @[@(31)];
187 }
188 - (BOOL)repairable
189 {
190         HMKCShipObject *flagShip = self.fleet[0];
191         HMKCMasterShipObject *flagShipMaster = flagShip.master_ship;
192         id stype = flagShipMaster.stype;
193         id stypeId = [stype valueForKey:@"id"];
194         BOOL result = [self.repairShipIds containsObject:stypeId];
195         if(!result && [sRepairableDeckIDs containsObject:self.deckID]) {
196                 [sRepairableDeckIDs removeObject:self.deckID];
197         } else if(result && ![sRepairableDeckIDs containsObject:self.deckID]) {
198                 [sRepairableDeckIDs addObject:self.deckID];
199         }
200         return result;
201 }
202
203 - (NSNumber *)repairableShipCount
204 {
205         if(![self repairable]) return @0;
206         
207         NSUInteger count = 2;
208         HMKCShipObject *flagShip = self.fleet[0];
209         for(HMKCSlotItemObject *item in flagShip.equippedItem) {
210                 if([self.repairSlotItemIds containsObject:item.master_slotItem.type_2]) {
211                         count++;
212                 }
213         }
214         return @(count);
215 }
216
217 - (void)resetRepairTime
218 {
219         BOOL prevRepairable = [sRepairableDeckIDs containsObject:self.deckID];
220         if(!prevRepairable && !self.repairable) return;
221         
222         if(self.repairable) {
223                 self.repairTime = [NSDate dateWithTimeIntervalSinceNow:0.0];
224         } else {
225                 self.repairTime = nil;
226         }
227 }
228
229
230 @end