OSDN Git Service

UIを調整
[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 "HMServerDataStore.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                                                                                          predicate:nil
70                                                                                                  error:&error];
71         // TODO: error handling
72         
73         for(id deck in decks) {
74                 BOOL needsPack = NO;
75                 for(NSInteger i = 0; i < 6; i++) {
76                         NSInteger shipId = [[deck valueForKey:[NSString stringWithFormat:@"ship_%ld", i]] integerValue];
77                         if(!needsPack && shipId == -1) {
78                                 needsPack = YES;
79                                 continue;
80                         }
81                         if(needsPack) {
82                                 [deck setValue:@(shipId) forKey:[NSString stringWithFormat:@"ship_%ld", i - 1]];
83                                 
84                                 if(i == 5) {
85                                         [deck setValue:@(-1) forKey:@"ship_5"];
86                                 }
87                         }
88                 }
89         }
90 }
91
92 - (void)excludeShipsWithoutFlag
93 {
94         NSInteger deckNumber = [[self.arguments valueForKey:@"api_id"] integerValue];
95         
96         NSError *error = nil;
97         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
98                                                                                                  error:&error
99                                                                            predicateFormat:@"id = %ld", deckNumber];
100         // TODO: error handling
101         id deck = decks[0];
102         
103         for(NSInteger i = 1; i < 6; i++) {
104                 [deck setValue:@(-1) forKey:[NSString stringWithFormat:@"ship_%ld", i]];
105         }
106 }
107
108 - (void)execute
109 {
110         NSInteger deckNumber = [[self.arguments valueForKey:@"api_id"] integerValue];
111         NSInteger shipId = [[self.arguments valueForKey:@"api_ship_id"] integerValue];
112         NSInteger shipIndex = [[self.arguments valueForKey:@"api_ship_idx"] integerValue];
113         
114         if(shipId < -1) {
115                 [self excludeShipsWithoutFlag];
116                 return;
117         }
118         
119         NSError *error = nil;
120         NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
121         NSArray *decks = [self.store objectsWithEntityName:@"Deck"
122                                                                            sortDescriptors:@[sortDescriptor]
123                                                                                          predicate:nil
124                                                                                                  error:&error];
125         // TODO: error handling
126         
127         NSMutableArray *ships = [NSMutableArray new];
128         for(id deck in decks) {
129                 for(NSUInteger i = 0; i < 6; i++) {
130                         [ships addObject:[deck valueForKey:[NSString stringWithFormat:@"ship_%ld", i]]];
131                 }
132         }
133                 
134         // すでに編成されているか? どこに?
135         BOOL alreadyInFleet = [ships containsObject:@(shipId)];
136         NSInteger shipDeckNumber = -1;
137         NSInteger shipDeckIndex = -1;
138         if(alreadyInFleet) {
139                 NSInteger index = [ships indexOfObject:@(shipId)];
140                 shipDeckNumber = index / 6;
141                 shipDeckIndex = index % 6;
142         }
143         
144         NSInteger replaceShipId = [ships[(deckNumber - 1) * 6 + shipIndex] integerValue];
145         
146         // 艦隊に配備
147         id deck = decks[deckNumber - 1];
148         [deck setValue:@(shipId) forKey:[NSString stringWithFormat:@"ship_%ld", shipIndex]];
149         
150         // 入れ替え
151         if(alreadyInFleet && shipId != -1) {
152                 id deck = decks[shipDeckNumber];
153                 [deck setValue:@(replaceShipId) forKey:[NSString stringWithFormat:@"ship_%ld", shipDeckIndex]];
154         }
155         
156         [self packFleet];
157 }
158 @end