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"
20 #import "HMKCMasterSType.h"
23 @interface HMAnchorageRepairManager ()
26 @property (strong) NSDate *repairTime;
28 @property (strong) HMKCDeck* fleet;
29 @property (strong) NSNumber *deckID;
30 @property (strong) NSArray<HMKCShipObject *> *members;
32 @property (strong) NSObjectController *fleetController;
33 @property (strong) NSArrayController *memberController;
37 @implementation HMAnchorageRepairManager
39 static NSMutableArray *sRepairableDeckIDs;
43 static dispatch_once_t onceToken;
44 dispatch_once(&onceToken, ^{
45 sRepairableDeckIDs = [NSMutableArray new];
49 - (instancetype)initWithDeck:(HMKCDeck *)deck
56 _fleetController = [NSObjectController new];
57 _fleetController.managedObjectContext = deck.managedObjectContext;
58 _fleetController.entityName = @"Deck";
59 _fleetController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", deck.id];
61 [_fleetController fetchWithRequest:nil merge:NO error:&error];
66 [self.fleetController addObserver:self
67 forKeyPath:@"selection.ship_0"
68 options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
70 [self.fleetController addObserver:self
71 forKeyPath:@"selection.ship_1"
74 [self.fleetController addObserver:self
75 forKeyPath:@"selection.ship_2"
78 [self.fleetController addObserver:self
79 forKeyPath:@"selection.ship_3"
82 [self.fleetController addObserver:self
83 forKeyPath:@"selection.ship_4"
86 [self.fleetController addObserver:self
87 forKeyPath:@"selection.ship_5"
93 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
95 selector:@selector(didRecivePortAPINotification:)
96 name:HMPortAPIRecieveNotification
100 _memberController = [[NSArrayController alloc] initWithContent:nil];
101 [_memberController bind:NSContentArrayBinding
103 withKeyPath:@"members"
105 [self.memberController addObserver:self
106 forKeyPath:@"arrangedObjects.equippedItem"
115 NSArray *shipKeys = @[@"ship_0", @"ship_1", @"ship_2", @"ship_3", @"ship_4", @"ship_5"];
116 for (NSString *key in shipKeys) {
117 [_fleetController removeObserver:self
118 forKeyPath:[NSString stringWithFormat:@"selection.%@", key]];
121 [_memberController removeObserver:self forKeyPath:@"arrangedObjects.equippedItem"];
122 [_memberController unbind:@"members"];
125 - (NSDate *)repairTime
127 if(!self.repairable) return nil;
129 return HMStandardDefaults.repairTime;;
131 - (void)setRepairTime:(NSDate *)repairTime
133 HMStandardDefaults.repairTime = repairTime;
137 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
139 id contextObject = (__bridge id)(context);
141 if([contextObject isEqual:@"members"]) {
142 [self willChangeValueForKey:@"repairableShipCount"];
143 [self didChangeValueForKey:@"repairableShipCount"];
146 if([contextObject isKindOfClass:[NSString class]]) {
147 [self resetRepairTime];
152 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
157 NSMutableArray<HMKCShipObject *> *array = [NSMutableArray array];
158 for(NSInteger i = 0; i < 6; i++) {
159 HMKCShipObject *ship = self.fleet[i];
160 if(ship) [array addObject:ship];
162 self.members = array;
165 - (void)didRecivePortAPINotification:(NSNotification *)notification
167 NSDate *finishDate = [self.repairTime dateByAddingTimeInterval:20 * 60];
168 if([finishDate compare:[NSDate dateWithTimeIntervalSinceNow:0.0]] == NSOrderedAscending) {
169 [self resetRepairTime];
173 - (HMKCShipObject *)flagShip
175 if(self.members.count == 0) return nil;
176 return self.members[0];
179 - (NSArray *)repairShipIds
183 - (NSArray *)repairSlotItemIds
189 HMKCShipObject *flagShip = self.flagShip;
190 HMKCMasterShipObject *flagShipMaster = flagShip.master_ship;
191 HMKCMasterSType *stype = flagShipMaster.stype;
192 NSNumber *stypeId = stype.id;
193 BOOL result = [self.repairShipIds containsObject:stypeId];
194 if(!result && [sRepairableDeckIDs containsObject:self.deckID]) {
195 [sRepairableDeckIDs removeObject:self.deckID];
196 } else if(result && ![sRepairableDeckIDs containsObject:self.deckID]) {
197 [sRepairableDeckIDs addObject:self.deckID];
202 - (NSNumber *)repairableShipCount
204 if(![self repairable]) return @0;
206 NSUInteger count = 2;
207 HMKCShipObject *flagShip = self.flagShip;
208 for(HMKCSlotItemObject *item in flagShip.equippedItem) {
209 if([self.repairSlotItemIds containsObject:item.master_slotItem.type_2]) {
216 - (void)resetRepairTime
218 BOOL prevRepairable = [sRepairableDeckIDs containsObject:self.deckID];
219 if(!prevRepairable && !self.repairable) return;
221 if(self.repairable) {
222 self.repairTime = [NSDate dateWithTimeIntervalSinceNow:0.0];
224 self.repairTime = nil;