2 // HMSlotResetCommand.m
5 // Created by Hori,Masaki on 2015/10/30.
6 // Copyright (c) 2015年 Hori,Masaki. All rights reserved.
9 #import "HMSlotResetCommand.h"
11 #import "HMServerDataStore.h"
14 @interface HMSlotResetCommand ()
15 @property (nonatomic, strong) NSArray *slotItems;
19 @implementation HMSlotResetCommand
22 static dispatch_once_t onceToken;
23 dispatch_once(&onceToken, ^{
24 [HMJSONCommand registerClass:self];
27 + (BOOL)canExcuteAPI:(NSString *)api
29 if([api isEqualToString:@"/kcsapi/api_req_kaisou/slot_exchange_index"]) return YES;
35 HMServerDataStore *store = [HMServerDataStore oneTimeEditor];
37 NSString *destroyedShipId = [self.arguments objectForKey:@"api_id"];
40 NSArray *ships = [store objectsWithEntityName:@"Ship"
42 predicateFormat:@"id = %@", @([destroyedShipId integerValue])];
43 if(ships.count == 0) {
49 NSArray *slotItems = [self.json valueForKeyPath:@"api_data.api_slot"];
50 for(NSUInteger i = 0; i < slotItems.count; i++) {
51 NSNumber *slotID = slotItems[i];
52 if([slotID integerValue] == -1) continue;
53 [ship setValue:slotID forKey:[NSString stringWithFormat:@"slot_%ld", i]];
56 [self addSlotItem:slotItems toObject:ship];
60 - (void)addSlotItem:(id)slotItems toObject:(NSManagedObject *)object
64 NSManagedObjectContext *managedObjectContext = [object managedObjectContext];
65 NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"SlotItem"];
66 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
67 [req setSortDescriptors:@[sortDescriptor]];
68 self.slotItems = [managedObjectContext executeFetchRequest:req
71 [self log:@"Fetch error: %@", error];
74 if([self.slotItems count] == 0) {
79 NSMutableArray *newItems = [NSMutableArray new];
80 NSRange range = NSMakeRange(0, self.slotItems.count);
81 for(id value in slotItems) {
82 if([value integerValue] == -1) continue;
83 NSUInteger index = [self.slotItems indexOfObject:value
85 options:NSBinarySearchingFirstEqual
86 usingComparator:^(id obj1, id obj2) {
88 if([obj1 isKindOfClass:[NSNumber class]]) {
91 value1 = [obj1 valueForKey:@"id"];
93 if([obj2 isKindOfClass:[NSNumber class]]) {
96 value2 = [obj2 valueForKey:@"id"];
98 return [value1 compare:value2];
100 if(index == NSNotFound) {
101 id lastItem = [self.slotItems lastObject];
102 NSInteger lastItemId = [[lastItem valueForKey:@"id"] integerValue];
103 if(lastItemId < [value integerValue]) {
105 [self log:@"item is maybe unregistered, so it is new ship's equipment."];
108 [self log:@"Item %@ is not found.", value];
112 id item = [self.slotItems objectAtIndex:index];
114 [newItems addObject:item];
117 NSMutableOrderedSet *orderedSet = [object mutableOrderedSetValueForKey:@"equippedItem"];
118 [orderedSet removeAllObjects];
119 [orderedSet addObjectsFromArray:newItems];