OSDN Git Service

2494dd2796f06a9b9665de8a6844e5c5be94f5fe
[kcd/KCD.git] / KCD / HMSlotResetCommand.m
1 //
2 //  HMSlotResetCommand.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/10/30.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMSlotResetCommand.h"
10
11 #import "HMServerDataStore.h"
12
13
14 @interface HMSlotResetCommand ()
15 @property (nonatomic, strong) NSArray *slotItems;
16
17 @end
18
19 @implementation HMSlotResetCommand
20 + (void)load
21 {
22         static dispatch_once_t onceToken;
23         dispatch_once(&onceToken, ^{
24                 [HMJSONCommand registerClass:self];
25         });
26 }
27 + (BOOL)canExcuteAPI:(NSString *)api
28 {
29         if([api isEqualToString:@"/kcsapi/api_req_kaisou/slot_exchange_index"]) return YES;
30         return NO;
31 }
32
33 - (void)execute
34 {
35         HMServerDataStore *store = [HMServerDataStore oneTimeEditor];
36         
37         NSString *destroyedShipId = [self.arguments objectForKey:@"api_id"];
38         
39         NSError *error = nil;
40         NSArray *ships = [store objectsWithEntityName:@"Ship"
41                                                                                         error:&error
42                                                                   predicateFormat:@"id = %@", @([destroyedShipId integerValue])];
43         if(ships.count == 0) {
44                 return;
45         }
46         
47         id ship = ships[0];
48         
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]];
54         }
55         
56         [self addSlotItem:slotItems toObject:ship];
57         
58 }
59
60 - (void)addSlotItem:(id)slotItems toObject:(NSManagedObject *)object
61 {
62         if(!self.slotItems) {
63                 NSError *error = nil;
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
69                                                                                                                          error:&error];
70                 if(error) {
71                         [self log:@"Fetch error: %@", error];
72                         return;
73                 }
74                 if([self.slotItems count] == 0) {
75                         return;
76                 }
77         }
78         
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
84                                                                                    inSortedRange:range
85                                                                                                  options:NSBinarySearchingFirstEqual
86                                                                                  usingComparator:^(id obj1, id obj2) {
87                                                                                          id value1, value2;
88                                                                                          if([obj1 isKindOfClass:[NSNumber class]]) {
89                                                                                                  value1 = obj1;
90                                                                                          } else {
91                                                                                                  value1 = [obj1 valueForKey:@"id"];
92                                                                                          }
93                                                                                          if([obj2 isKindOfClass:[NSNumber class]]) {
94                                                                                                  value2 = obj2;
95                                                                                          } else {
96                                                                                                  value2 = [obj2 valueForKey:@"id"];
97                                                                                          }
98                                                                                          return [value1 compare:value2];
99                                                                                  }];
100                 if(index == NSNotFound) {
101                         id lastItem = [self.slotItems lastObject];
102                         NSInteger lastItemId = [[lastItem valueForKey:@"id"] integerValue];
103                         if(lastItemId < [value integerValue]) {
104 #if DEBUG
105                                 [self log:@"item is maybe unregistered, so it is new ship's equipment."];
106 #endif
107                         } else {
108                                 [self log:@"Item %@ is not found.", value];
109                         }
110                         continue;
111                 }
112                 id item = [self.slotItems objectAtIndex:index];
113                 
114                 [newItems addObject:item];
115         }
116         
117         NSMutableOrderedSet *orderedSet = [object mutableOrderedSetValueForKey:@"equippedItem"];
118         [orderedSet removeAllObjects];
119         [orderedSet addObjectsFromArray:newItems];
120 }
121 @end