2 // HMAnchorageRepairManager.m
5 // Created by Hori,Masaki on 2015/07/19.
6 // Copyright (c) 2015年 Hori,Masaki. All rights reserved.
9 #import "HMAnchorageRepairManager.h"
11 #import "HMAppDelegate.h"
12 #import "HMUserDefaults.h"
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"
22 @interface HMAnchorageRepairManager ()
25 @property (strong) NSDate *repairTime;
27 @property (strong) HMKCDeck* fleet;
28 @property (strong) NSNumber *deckID;
29 @property (strong) NSArray *members;
31 @property (strong) NSObjectController *fleetController;
32 @property (strong) NSArrayController *memberController;
36 @implementation HMAnchorageRepairManager
38 static NSMutableArray *sRepairableDeckIDs;
42 static dispatch_once_t onceToken;
43 dispatch_once(&onceToken, ^{
44 sRepairableDeckIDs = [NSMutableArray new];
48 - (instancetype)initWithDeck:(HMKCDeck *)deck
55 _fleetController = [NSObjectController new];
56 _fleetController.managedObjectContext = deck.managedObjectContext;
57 _fleetController.entityName = @"Deck";
58 _fleetController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", deck.id];
60 [_fleetController fetchWithRequest:nil merge:NO error:&error];
65 [self.fleetController addObserver:self
66 forKeyPath:@"selection.ship_0"
67 options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
69 [self.fleetController addObserver:self
70 forKeyPath:@"selection.ship_1"
73 [self.fleetController addObserver:self
74 forKeyPath:@"selection.ship_2"
77 [self.fleetController addObserver:self
78 forKeyPath:@"selection.ship_3"
81 [self.fleetController addObserver:self
82 forKeyPath:@"selection.ship_4"
85 [self.fleetController addObserver:self
86 forKeyPath:@"selection.ship_5"
92 // [self resetRepairTime];
94 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
96 selector:@selector(didRecivePortAPINotification:)
97 name:HMPortAPIRecieveNotification
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]];
112 - (NSDate *)repairTime
114 if(!self.repairable) return nil;
116 return HMStandardDefaults.repairTime;;
118 - (void)setRepairTime:(NSDate *)repairTime
120 HMStandardDefaults.repairTime = repairTime;
124 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
126 id contextObject = (__bridge id)(context);
128 if([contextObject isEqual:@"members"]) {
129 [self willChangeValueForKey:@"repairableShipCount"];
130 [self didChangeValueForKey:@"repairableShipCount"];
133 if([contextObject isKindOfClass:[NSString class]]) {
134 [self resetRepairTime];
139 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
144 NSString *observeKeyPath = @"arrangedObjects.equippedItem";
146 [self.memberController removeObserver:self forKeyPath:observeKeyPath];
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"
156 predicateFormat:@"id = %ld", [shipID integerValue]];
158 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
160 if(ships.count != 0) {
161 [array addObject:ships[0]];
165 _memberController = [[NSArrayController alloc] initWithContent:array];
166 [self.memberController addObserver:self
167 forKeyPath:observeKeyPath
172 - (void)didRecivePortAPINotification:(NSNotification *)notification
174 NSDate *finishDate = [self.repairTime dateByAddingTimeInterval:20 * 60];
175 if([finishDate compare:[NSDate dateWithTimeIntervalSinceNow:0.0]] == NSOrderedAscending) {
176 [self resetRepairTime];
180 - (NSArray *)repairShipIds
184 - (NSArray *)repairSlotItemIds
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];
203 - (NSNumber *)repairableShipCount
205 if(![self repairable]) return @0;
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]) {
217 - (void)resetRepairTime
219 BOOL prevRepairable = [sRepairableDeckIDs containsObject:self.deckID];
220 if(!prevRepairable && !self.repairable) return;
222 if(self.repairable) {
223 self.repairTime = [NSDate dateWithTimeIntervalSinceNow:0.0];
225 self.repairTime = nil;