OSDN Git Service

無駄を排除し効率化した
[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 #import "HMKCMasterSType.h"
21
22
23 @interface HMAnchorageRepairManager ()
24
25
26 @property (strong) NSDate *repairTime;
27
28 @property (strong) HMKCDeck* fleet;
29 @property (strong) NSNumber *deckID;
30 @property (strong) NSArray<HMKCShipObject *> *members;
31
32 @property (strong) NSObjectController *fleetController;
33 @property (strong) NSArrayController *memberController;
34
35 @end
36
37 @implementation HMAnchorageRepairManager
38
39 static NSMutableArray *sRepairableDeckIDs;
40
41 + (void)initialize
42 {
43         static dispatch_once_t onceToken;
44         dispatch_once(&onceToken, ^{
45                 sRepairableDeckIDs = [NSMutableArray new];
46         });
47 }
48
49 - (instancetype)initWithDeck:(HMKCDeck *)deck
50 {
51         self = [super init];
52         if(self) {
53                 _fleet = deck;
54                 _deckID = _fleet.id;
55                 
56                 _fleetController = [NSObjectController new];
57                 _fleetController.managedObjectContext = deck.managedObjectContext;
58                 _fleetController.entityName = @"Deck";
59                 _fleetController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", deck.id];
60                 NSError *error = nil;
61                 [_fleetController fetchWithRequest:nil merge:NO error:&error];
62                 if(error) {
63                         NSLog(@"%@", error);
64                 }
65                 
66                 [self.fleetController addObserver:self
67                                                           forKeyPath:@"selection.ship_0"
68                                                                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
69                                                                  context:@"0"];
70                 [self.fleetController addObserver:self
71                                                            forKeyPath:@"selection.ship_1"
72                                                                   options:0
73                                                                   context:@"1"];
74                 [self.fleetController addObserver:self
75                                                            forKeyPath:@"selection.ship_2"
76                                                                   options:0
77                                                                   context:@"2"];
78                 [self.fleetController addObserver:self
79                                                            forKeyPath:@"selection.ship_3"
80                                                                   options:0
81                                                                   context:@"3"];
82                 [self.fleetController addObserver:self
83                                                            forKeyPath:@"selection.ship_4"
84                                                                   options:0
85                                                                   context:@"4"];
86                 [self.fleetController addObserver:self
87                                                            forKeyPath:@"selection.ship_5"
88                                                                   options:0
89                                                                   context:@"5"];
90                 
91                 [self buildMembers];
92                 
93                 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
94                 [nc addObserver:self
95                            selector:@selector(didRecivePortAPINotification:)
96                                    name:HMPortAPIRecieveNotification
97                                  object:nil];
98                 
99                 
100                 _memberController = [[NSArrayController alloc] initWithContent:nil];
101                 [_memberController bind:NSContentArrayBinding
102                                            toObject:self
103                                         withKeyPath:@"members"
104                                                 options:nil];
105                 [self.memberController addObserver:self
106                                                                 forKeyPath:@"arrangedObjects.equippedItem"
107                                                                    options:0
108                                                                    context:@"members"];
109         }
110         return self;
111 }
112
113 - (void)dealloc
114 {
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]];
119         }
120         
121         [_memberController removeObserver:self forKeyPath:@"arrangedObjects.equippedItem"];
122         [_memberController unbind:@"members"];
123 }
124
125 - (NSDate *)repairTime
126 {
127         if(!self.repairable) return nil;
128         
129         return HMStandardDefaults.repairTime;;
130 }
131 - (void)setRepairTime:(NSDate *)repairTime
132 {
133         HMStandardDefaults.repairTime = repairTime;
134 }
135
136
137 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
138 {
139         id contextObject = (__bridge id)(context);
140         
141         if([contextObject isEqual:@"members"]) {
142                 [self willChangeValueForKey:@"repairableShipCount"];
143                 [self didChangeValueForKey:@"repairableShipCount"];
144                 return;
145         }
146         if([contextObject isKindOfClass:[NSString class]]) {
147                 [self resetRepairTime];
148                 [self buildMembers];
149                 return;
150         }
151         
152         [super observeValueForKeyPath:keyPath ofObject:object change:change     context:context];
153 }
154
155 - (void)buildMembers
156 {
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];
161         }
162         self.members = array;
163 }
164
165 - (void)didRecivePortAPINotification:(NSNotification *)notification
166 {
167         NSDate *finishDate = [self.repairTime dateByAddingTimeInterval:20 * 60];
168         if([finishDate compare:[NSDate dateWithTimeIntervalSinceNow:0.0]] == NSOrderedAscending) {
169                 [self resetRepairTime];
170         }
171 }
172
173 - (HMKCShipObject *)flagShip
174 {
175         if(self.members.count == 0) return nil;
176         return self.members[0];
177 }
178
179 - (NSArray *)repairShipIds
180 {
181         return @[@(19)];
182 }
183 - (NSArray *)repairSlotItemIds
184 {
185         return @[@(31)];
186 }
187 - (BOOL)repairable
188 {
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];
198         }
199         return result;
200 }
201
202 - (NSNumber *)repairableShipCount
203 {
204         if(![self repairable]) return @0;
205         
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]) {
210                         count++;
211                 }
212         }
213         return @(count);
214 }
215
216 - (void)resetRepairTime
217 {
218         BOOL prevRepairable = [sRepairableDeckIDs containsObject:self.deckID];
219         if(!prevRepairable && !self.repairable) return;
220         
221         if(self.repairable) {
222                 self.repairTime = [NSDate dateWithTimeIntervalSinceNow:0.0];
223         } else {
224                 self.repairTime = nil;
225         }
226 }
227
228
229 @end