OSDN Git Service

HMMasterMissionCommandクラスをSwiftで書き換え
[kcd/KCD.git] / KCD / HMChangeHenseiCommand.m
1 //
2 //  HMChangeHenseiCommand.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/06/15.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMChangeHenseiCommand.h"
10
11 #import "KCD-Swift.h"
12
13 @interface HMChangeHenseiCommand ()
14 @property (nonatomic, strong) HMServerDataStore *store;
15 @end
16
17 @implementation HMChangeHenseiCommand
18 + (void)load
19 {
20         static dispatch_once_t onceToken;
21         dispatch_once(&onceToken, ^{
22                 [HMJSONCommand registerClass:self];
23         });
24 }
25
26 + (BOOL)canExcuteAPI:(NSString *)api
27 {
28         return [api isEqualToString:@"/kcsapi/api_req_hensei/change"];
29 }
30
31 - (HMServerDataStore *)store
32 {
33         if(_store) return _store;
34         
35         _store = [HMServerDataStore oneTimeEditor];
36         return _store;
37 }
38
39 - (void)printFleet
40 {
41         NSError *error = nil;
42         NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
43         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
44                                                                            sortDescriptors:@[sortDescriptor]
45                                                                                          predicate:nil
46                                                                                                  error:&error];
47         // TODO: error handling
48         
49         NSMutableArray *ships = [NSMutableArray new];
50         for(id deck in decks) {
51                 for(NSUInteger i = 0; i < 6; i++) {
52                         [ships addObject:[deck valueForKey:[NSString stringWithFormat:@"ship_%ld", i]]];
53                 }
54         }
55         
56         for(int i = 0; i < 4; i++) {
57                 fprintf(stderr, "Fleet %d\n", i+1);
58                 for(int j = 0; j < 6; j++) {
59                         fprintf(stderr, "%d -> %ld\n", j+1, [ships[i*6+j] integerValue]);
60                 }
61         }
62         fprintf(stderr, "\n");
63 }
64
65 - (void)packFleet
66 {
67         NSError *error = nil;
68         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
69                                                                            sortDescriptors:nil
70                                                                                          predicate:nil
71                                                                                                  error:&error];
72         // TODO: error handling
73         
74         for(id deck in decks) {
75                 BOOL needsPack = NO;
76                 for(NSInteger i = 0; i < 6; i++) {
77                         NSInteger shipId = [[deck valueForKey:[NSString stringWithFormat:@"ship_%ld", i]] integerValue];
78                         if(!needsPack && shipId == -1) {
79                                 needsPack = YES;
80                                 continue;
81                         }
82                         if(needsPack) {
83                                 [deck setValue:@(shipId) forKey:[NSString stringWithFormat:@"ship_%ld", i - 1]];
84                                 
85                                 if(i == 5) {
86                                         [deck setValue:@(-1) forKey:@"ship_5"];
87                                 }
88                         }
89                 }
90         }
91 }
92
93 - (void)excludeShipsWithoutFlag
94 {
95         NSInteger deckNumber = [[self.arguments valueForKey:@"api_id"] integerValue];
96         
97         NSError *error = nil;
98         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
99                                                                            sortDescriptors:nil
100                                                                                          predicate:[NSPredicate predicateWithFormat:@"id = %ld", deckNumber]
101                                                                                                  error:&error];
102         // TODO: error handling
103         id deck = decks[0];
104         
105         for(NSInteger i = 1; i < 6; i++) {
106                 [deck setValue:@(-1) forKey:[NSString stringWithFormat:@"ship_%ld", i]];
107         }
108 }
109
110 - (void)execute
111 {
112         NSInteger deckNumber = [[self.arguments valueForKey:@"api_id"] integerValue];
113         NSInteger shipId = [[self.arguments valueForKey:@"api_ship_id"] integerValue];
114         NSInteger shipIndex = [[self.arguments valueForKey:@"api_ship_idx"] integerValue];
115         
116         if(shipId < -1) {
117                 [self excludeShipsWithoutFlag];
118                 return;
119         }
120         
121         NSError *error = nil;
122         NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
123         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
124                                                                            sortDescriptors:@[sortDescriptor]
125                                                                                          predicate:nil
126                                                                                                  error:&error];
127         // TODO: error handling
128         
129         NSMutableArray *ships = [NSMutableArray new];
130         for(id deck in decks) {
131                 for(NSUInteger i = 0; i < 6; i++) {
132                         [ships addObject:[deck valueForKey:[NSString stringWithFormat:@"ship_%ld", i]]];
133                 }
134         }
135                 
136         // すでに編成されているか? どこに?
137         BOOL alreadyInFleet = [ships containsObject:@(shipId)];
138         NSInteger shipDeckNumber = -1;
139         NSInteger shipDeckIndex = -1;
140         if(alreadyInFleet) {
141                 NSInteger index = [ships indexOfObject:@(shipId)];
142                 shipDeckNumber = index / 6;
143                 shipDeckIndex = index % 6;
144         }
145         
146         NSInteger replaceShipId = [ships[(deckNumber - 1) * 6 + shipIndex] integerValue];
147         
148         // 艦隊に配備
149         id deck = decks[deckNumber - 1];
150         [deck setValue:@(shipId) forKey:[NSString stringWithFormat:@"ship_%ld", shipIndex]];
151         
152         // 入れ替え
153         if(alreadyInFleet && shipId != -1) {
154                 id deck = decks[shipDeckNumber];
155                 [deck setValue:@(replaceShipId) forKey:[NSString stringWithFormat:@"ship_%ld", shipDeckIndex]];
156         }
157         
158         [self packFleet];
159 }
160 @end