5 // Created by Killery on 2013/02/22.
6 // Copyright (c) 2013年 Killery. All rights reserved.
10 #import "FieldScene.h"
12 @implementation FieldView
17 - (id)initWithFrame:(NSRect)frame
19 self = [super initWithFrame:frame];
22 scheduledTimerWithTimeInterval:0.01
24 selector:@selector(EventLoopFV:)
28 chip = [[self LoadImage:@"マス.png"] retain];
29 chipSelect = [[self LoadImage:@"セレクター.png"] retain];
30 chipMove = [[self LoadImage:@"セレクター(移動).png"] retain];
31 chipAttack = [[self LoadImage:@"セレクター(攻撃).png"] retain];
32 chipTarget = [[self LoadImage:@"セレクター(選択).png"] retain];
33 chipSummon = [[self LoadImage:@"セレクター(攻撃).png"] retain];
34 chipTeam0 = [[self LoadImage:@"ハイライト(青).png"] retain];
35 chipTeam1 = [[self LoadImage:@"ハイライト(黄).png"] retain];
36 chipTeam2 = [[self LoadImage:@"ハイライト(赤).png"] retain];
37 chipUtarg = [[self LoadImage:@"ターゲット(目標).png"] retain];
39 n1 = [[self LoadImage:@"num1"] retain];
40 n2 = [[self LoadImage:@"num2"] retain];
41 n3 = [[self LoadImage:@"num3"] retain];
42 n4 = [[self LoadImage:@"num4"] retain];
43 n5 = [[self LoadImage:@"num5"] retain];
44 n6 = [[self LoadImage:@"num6"] retain];
45 n7 = [[self LoadImage:@"num7"] retain];
46 n8 = [[self LoadImage:@"num8"] retain];
47 n9 = [[self LoadImage:@"num9"] retain];
48 n10 = [[self LoadImage:@"num10"] retain];
49 n11 = [[self LoadImage:@"num11"] retain];
50 n12 = [[self LoadImage:@"num12"] retain];
51 n13 = [[self LoadImage:@"num13"] retain];
52 n14 = [[self LoadImage:@"num14"] retain];
53 n15 = [[self LoadImage:@"num15"] retain];
54 n16 = [[self LoadImage:@"num16"] retain];
55 n17 = [[self LoadImage:@"num17"] retain];
56 n18 = [[self LoadImage:@"num18"] retain];
57 n19 = [[self LoadImage:@"num19"] retain];
58 n20 = [[self LoadImage:@"num20"] retain];
60 g_shallowDepth = 1002;
68 -(void)EventLoopFV:(NSTimer*)timer{
70 //if(unitBreak) NSLog(@"unitBreakAtkrange %d", unitBreak->atkRange);
73 if(evInitMap) {evInitMap = false;
74 //[self loadMesh:SC[storyNumb].nameMAP index:scenarioNumb];
76 MapView *MV = [MapView alloc];
79 NSRect seRect = NSMakeRect(0, 0, chipWidth*32, chipHeight*32);
80 [self setFrame:seRect];
85 static int movePlus = 0;
89 static int chipTargetCnt = 0;
93 unitMoveBugFixFlag = false;
94 unitMoveEndFlag = false;
101 if(chipTargetCnt > 60){
103 if(!chipTargetFlag) chipTargetFlag = true;
104 else chipTargetFlag = false;
109 Uselected = unitBreak;
114 if(!submitFlag) movePlus += 4;
115 if( i0 < g_shallowDepth && movePlus >= 32 && !submitFlag)
117 cPosX = g_moveRoute[i0][1]*32;
118 cPosY = g_moveRoute[i0][0]*32;
123 unitMoveBugFixFlag = true;
126 unitNum[g_moveRoute[0][1]][g_moveRoute[0][0]] = -1;
127 unitTeam[g_moveRoute[0][1]][g_moveRoute[0][0]] = -1;
128 loadNum[g_moveRoute[0][1]][g_moveRoute[0][0]] = -1;
131 if(i0 >= g_shallowDepth) {i0--;
133 unitNum[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = Uselected->C.chipNumb;
134 loadNum[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = Uselected->CL.chipNumb;
135 unitTeam[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = Uselected->team;
138 unitMoveEndFlag = true;
139 unitMoveBugFixFlag = false;
140 pussyLoopFlag = false;
141 if(UA) cpuIsAttackingFlag = true;
146 if(g_moveRoute[0][1] == U->x && g_moveRoute[0][0] == U->y){
147 U->x = g_moveRoute[g_shallowDepth-1][1];
148 U->y = g_moveRoute[g_shallowDepth-1][0];
161 unitMoveBugFixFlag = false;
163 for(int j = 0;j < g_shallowDepth;j++){
164 g_moveRoute[j][0] = -1;
165 g_moveRoute[j][1] = -1;
173 if(U->dead || (U->chipNumber >= 0 && U->C.S_C.HP <= 0)){
175 unitNum[U->x][U->y] = -1;
176 unitTeam[U->x][U->y] = -1;
188 if(U->dead || (U->chipNumberL >= 0 && U->CL.S_C.HP <= 0)){
190 loadNum[U->x][U->y] = -1;
191 unitTeam[U->x][U->y] = -1;
199 ////////////バグフィクス///////////////////
200 if(UTop && initStatusFlag)
201 for (int i = 1;i <= chipWidth;i++) {
202 for (int k = 1;k <= chipHeight;k++) {
204 bool noFixFlag = false;
208 if((U->x == i && U->y == k)){
228 if(U->x == possionX && U->y == possionY){
234 if(!U) slctedUnitNum = -1;
241 for (int i = 0; i < slctedUnitNum; i++) {
244 if(U->chipNumberL < 0){
247 while(U && !(possionX == U->x && possionY == U->y)){
251 [self LookupAttackRange:possionY startY:possionX aPiece:&U->C turnSide:YES];
255 [self LookupAttackRange2:possionY startY:possionX aPiece:&LC[loadNum[possionX][possionY]] turnSide:YES];
263 while(U && AUN[1] > i){i++;
266 attackExceptNumber = U->number;
267 if(U->chipNumberL < 0){
269 [self LookupAttackRangeExtent:possionY startY:possionX aPiece:&U->C turnSide:YES];
273 [self LookupAttackRangeExtent2:possionY startY:possionX aPiece:&U->CL turnSide:YES];
285 while(U && AUN[1] > i){i++;
289 buildNum[possionX][possionY] = U->C.S->list[crBCL]-1;
303 [self LookupSummonRange:possionY startY:possionX aPiece:&UC[unitNum[possionX][possionY]] turnSide:YES];
307 if(buildCaptureFlag && unitMoveEndFlag){
311 if(B->x == Uselected->x && B->y == Uselected->y){
312 if(Uselected->team == 0) B->team = 0;
313 if(Uselected->team == 1) B->team = 1;
314 if(Uselected->team == 2) B->team = 2;
315 unitColorInitFlag = true;
320 buildCaptureFlag = false;
323 if(unitColorInitFlag){
328 U->img = [self SetImageColor:U->C.img color:0];
330 U->img = [self SetImageColor:U->C.img color:1];
332 U->img = [self SetImageColor:U->C.img color:2];
335 U->img = [self SetImageColor:U->CL.img color:0];
337 U->img = [self SetImageColor:U->CL.img color:1];
339 U->img = [self SetImageColor:U->CL.img color:2];
342 if(U->team == 2 && MF[MFselectedRow+1].MS.playerSet2 == 2){
344 cpuAImodeflag = true;
346 }else if(U->team == 0 && MF[MFselectedRow+1].MS.playerSet1 == 2){
348 cpuAImodeflag = true;
350 }else if(U->team == 1){
352 cpuAImodeflag = true;
357 cpuAImodeflag = false;
366 if(B->team < 0) B->img = B->C.img;
368 B->img = [self SetImageColor:B->C.img color:0];
370 B->img = [self SetImageColor:B->C.img color:1];
372 B->img = [self SetImageColor:B->C.img color:2];
376 unitColorInitFlag = false;
383 //if(unitBreak->CPU) cpuTurnEndFlag = false;
392 if(fieldViewBattleInitFlag){
401 if(wcnt >= waitinTime*100){
402 waitAllOverFlag = true;
408 [self setNeedsDisplay:YES];
417 unitNum[unitBreak->x][unitBreak->y] = -1;
418 unitBreak->C.S_C.WT = 999999;
428 -(NSImage*)SetImageColor:(NSImage*)image color:(int)c{
429 NSImage *maskBlue, *maskRed, *maskYellow;
431 maskBlue = [NSImage imageNamed:@"ハイライト(青)"];
432 maskRed = [NSImage imageNamed:@"ハイライト(赤)"];
433 maskYellow = [NSImage imageNamed:@"ハイライト(黄)"];
435 NSImage *img = [NSImage alloc];
440 //[image drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeClear fraction:1.0];
442 [maskBlue drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
444 [maskBlue drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
446 [img drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, image.size.width, image.size.height) operation:NSCompositeSourceOver fraction:0.6];
455 [maskYellow drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
457 [maskYellow drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
459 [img drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, image.size.width, image.size.height) operation:NSCompositeSourceOver fraction:0.6];
467 [maskRed drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
469 [maskRed drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, maskBlue.size.width, maskBlue.size.height) operation:NSCompositeXOR fraction:1.0];
471 [img drawInRect:NSMakeRect(0, 0, image.size.width, image.size.height) fromRect:NSMakeRect(0, 0, image.size.width, image.size.height) operation:NSCompositeSourceOver fraction:0.6];
479 -(NSImage*)LoadImage:(NSString*)name{
480 NSImage *image = [NSImage imageNamed:name];
481 if(image == nil) return nil;
482 //[image setFlipped:[self isFlipped]];
487 -(void)DrawImage:(NSImage*)image x:(float)x y:(float)y cx:(int)cx cy:(int)cy f:(float)frac{
489 frRect.size.height = image.size.height;
490 frRect.size.width = image.size.width;
498 drRect.size.height = 32;
499 drRect.size.width = 32;
501 [image drawInRect:drRect fromRect:frRect operation:NSCompositeSourceOver fraction:frac respectFlipped:YES hints:nil];
505 -(void)mouseDown:(NSEvent *)theEvent{
507 if(cpuAtkExtendFlag3 || cpuOMFGmoveATKfixFlag) return;
509 if(!battleBegin) return;
511 if(setBattleModeFlag) return;
513 if(endGameCondition) return;
515 if(waitSwtichFlag) return;
520 if(msgCnt >= msgMax){
523 messageEndFlag = true;
532 pussyLoopFlag = true;
544 if(unitBreak->team == 2){
553 drugPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
555 possionX = (int)drugPoint.x/32+1;
556 possionY = (int)drugPoint.y/32+1;
558 menuDisplayFlag = false;
562 if(attackExtentFlag2 && g_attackRangeExtent[possionX][possionY] > 0){
563 attackExtentFlag2 = false;
564 attackExtentFlag = false;
566 extentBattleFlag = true;
568 for (int i = 0;i < 255;i++) {
580 while(U->number != AUN[1]){
587 static bool okflag = true;
589 for (int i = 0;i < 1002;i++) {
590 for (int k = 0;k < 1002;k++) {
594 if(U->chipNumberL < 0){
595 [self checkAttackRangeExtent:possionY startY:possionX leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
597 [self checkAttackRangeExtent:possionY startY:possionX leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
602 for(int bx=1;bx<=chipWidth;bx++){
603 for(int by=1;by<=chipHeight;by++){
604 if(g_attackRangeExtent[bx][by] != 999 && g_attackRangeExtent[bx][by] > 0){
606 if(g_attackRangeExtent[U->x][U->y] > 0 && attackExceptNumber != U-> number){
608 if(Unum < Cnum) goto lolzOMFG;
622 if(UP->x == U->x && UP->y == U->y){
635 if(!UP) UP = calloc(1, sizeof(UNITPOINT));
637 while(UP->next) UP = UP->next;
643 UP->next = calloc(1, sizeof(UNITPOINT));
661 //NSLog(@"%d", DUN[0]);
663 }else if(attackExtentFlag2){
664 attackExtentFlag2 = false;
665 attackExtentFlag = false;
667 extentBattleFlag = false;
671 if(attackFlag && g_attackRange[possionX][possionY] <= 0){
673 attackExtentFlag2 = false;
674 attackExtentFlag = false;
678 if(attackFlag && g_attackRange[possionX][possionY] > 0){
682 attackExtentFlag2 = true;
683 attackExtentFlag = true;
685 }else if(unitNum[possionX][possionY] >= 0){
687 battleWindowFlag = true;
690 while (AUN[1] != U->number) {
693 ATTACK *aTop = U->C.A;
694 ATTACK *aTop2 = U->CL.A;
695 if(U->chipNumberL < 0){
696 for(int i = 0;i < crCAL;i++){
697 U->C.A = U->C.A->next;
700 for(int i = 0;i < crCAL;i++){
701 U->CL.A = U->CL.A->next;
705 if(U->chipNumberL < 0)
706 U->atkRange = U->C.A->rangeB - g_attackRange[possionX][possionY] + 1;
707 else U->atkRange = U->CL.A->rangeB - g_attackRange[possionX][possionY] + 1;
709 U->atkRange = U->atkRange;
714 while (!(U->x == possionX && U->y == possionY) && U) {
720 wtAttackedFlag = true;
725 if(summonFlag && g_summonRange[possionX][possionY] > 0 && unitNum[possionX][possionY] < 0){
727 summonRdyFlag = true;
734 if(unitNum[possionX][possionY] >= 0){
736 if(!attackFlag && !attackExtentFlag2) atkExtentFlag = false;
738 if(atkExtentFlag) return;
743 menuDisplayFlag = true;
744 unitMoveEndFlag = false;
745 g_cursol_x = 1+(int)drugPoint.y/32;
746 g_cursol_y = 1+(int)drugPoint.x/32;
747 currentPosX = g_cursol_y*32;
748 currentPosY = g_cursol_x*32;
750 UCselected = UC[unitNum[possionX][possionY]];
751 LCselected = LC[loadNum[possionX][possionY]];
755 if(U->x == possionX && U->y == possionY) break;
760 //NSLog(@"%@, %@", U->C.name, U->C.A->name);
765 ///////////////////////////バグフィクス//////////////////////////
767 unitNum[possionX][possionY] = -1;
768 loadNum[possionX][possionY] = -1;
773 if(U->chipNumber >= 0) [self LookupMovableRange:possionY startY:possionX aPiece:&UC[unitNum[possionX][possionY]] turnSide:YES];
774 if(U->chipNumberL >= 0) [self LookupMovableRange2:possionY startY:possionX aPiece:&LC[loadNum[possionX][possionY]] turnSide:YES];
781 if(buildNum[possionX][possionY] >= 0 && unitNum[possionX][possionY] < 0 && !moveFlag){
782 //NSLog(@"くりとりすとおちんちん");
785 if(B->x == possionX && B->y == possionY){
799 if (researchTeam < 0) {
803 buildSelectedFlag = true;
807 if(moveFlag && g_selectRange[possionX][possionY] > 0){
808 g_target_y = possionX;
809 g_target_x = possionY;
813 for(int i = 0;i<=chipWidth;i++){
814 for(int j = 0;j<=chipHeight;j++){
815 g_map[j][i] = chipNum[j][i];
816 g_selectRange[j][i] = 0;
826 if(B->x == possionX && B->y == possionY && B->C.capture){
827 buildCaptureFlag = true;
836 pushStanbyFlag = false;
842 //-----------------------------------------------------------LookupMovableRange
844 // 与えられた位置からの移動可能範囲をg_range配列内に収める
846 //-----------------------------------------------------------------------------
847 -(void)LookupMovableRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
849 if(!aPiece->nameID) return;
851 for(int i = 0;i<=chipWidth;i++){
852 for(int j = 0;j<=chipHeight;j++){
854 g_selectRange[j][i] = 999;
858 for(int i = 1;i<=chipWidth;i++){
859 for(int j = 1;j<=chipHeight;j++){
860 g_map[j][i] = chipNum[j][i];
861 g_selectRange[j][i] = 0;
873 for(int chipType = 0;chipType < 128;chipType++){
874 g_moveCost[MOVETYPE_RIKU][chipType] = MC[chipType].riku;
875 g_moveCost[MOVETYPE_CHU][chipType] = MC[chipType].chu;
876 g_moveCost[MOVETYPE_UMI][chipType] = MC[chipType].umi;
877 g_moveCost[MOVETYPE_SORA][chipType] = MC[chipType].sora;
880 g_selectRange[startY][startX] = aPiece->S_C.MOV+1;
881 //[self excludePiece:turnSide fillInt:99];
882 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
883 //[self excludePiece:turnSide fillInt:0];
884 [self checkRange:startX startY:startY leftPow:aPiece->S_C.MOV+1 pieceType:aPiece->S_C.typeMOVE aMap:g_selectRange];
885 // [self excludePiece:turnSide fillInt:0];
886 // 敵方のコマの位置を移動可能範囲から除外する
887 //[self excludePiece:turnSide fillInt:0];
892 -(void)LookupMovableRange2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
894 if(!aPiece->nameID) return;
896 for(int i = 0;i<=chipWidth;i++){
897 for(int j = 0;j<=chipHeight;j++){
899 g_selectRange[j][i] = 999;
903 for(int i = 1;i<=chipWidth;i++){
904 for(int j = 1;j<=chipHeight;j++){
905 g_map[j][i] = chipNum[j][i];
906 g_selectRange[j][i] = 0;
918 for(int chipType = 0;chipType < 128;chipType++){
919 g_moveCost[MOVETYPE_RIKU][chipType] = MC[chipType].riku;
920 g_moveCost[MOVETYPE_CHU][chipType] = MC[chipType].chu;
921 g_moveCost[MOVETYPE_UMI][chipType] = MC[chipType].umi;
922 g_moveCost[MOVETYPE_SORA][chipType] = MC[chipType].sora;
925 g_selectRange[startY][startX] = aPiece->S_C.MOV+1;
926 //[self excludePiece:turnSide fillInt:99];
927 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
928 [self checkRange2:startX startY:startY leftPow:aPiece->S_C.MOV+1 pieceType:aPiece->S_C.typeMOVE aMap:g_selectRange];
929 //[self excludePiece:turnSide fillInt:0];
930 // 敵方のコマの位置を移動可能範囲から除外する
934 //-----------------------------------------------------------------excludePiece
936 -(void)excludePiece:(BOOL)turnSide fillInt:(int)fillInt
944 for(int x = 1;x <= chipWidth;x++){
945 for(int y = 1;y <= chipHeight;y++){
946 if(g_selectRange[U->x][U->y] > 0 && U->x == y && U->y == x){
947 g_selectRange[U->x][U->y] = fillInt;
953 g_selectRange[Uselected->x][Uselected->y] = 999;
957 //-------------------------------------------------------------------checkRange
959 // 配列の添え字と関数の引数が逆になっていることに要注意
960 -(void)checkRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[1002][1002])aMap{
965 if(Uselected) chipTeam = Uselected->team;
967 if(startX < 0) startX = 0;
968 if(startY < 0) startY = 0;
970 aMap[startY][startX] = leftPow;// 残り移動力
973 i0 = leftPow - g_moveCost[pieceType][g_map[startY-1][startX]]; // 上
975 if(unitNum[startY-1][startX] > -1 && unitTeam[startY-1][startX] != chipTeam){
978 if( aMap[startY-1][startX] < i0 ){
979 [self checkRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap];
983 i0 = leftPow - g_moveCost[pieceType][g_map[startY+1][startX]]; // 下
984 if(unitNum[startY+1][startX] > -1 && unitTeam[startY+1][startX] != chipTeam){
987 if( aMap[startY+1][startX] < i0 ){
988 [self checkRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap];
992 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX-1]]; // 右
993 if(unitNum[startY][startX-1] > -1 && unitTeam[startY][startX-1] != chipTeam){
996 if( aMap[startY][startX-1] < i0 ){
997 [self checkRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1001 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX+1]]; // 左
1002 if(unitNum[startY][startX+1] > -1 && unitTeam[startY][startX+1] != chipTeam){
1005 if( aMap[startY][startX+1] < i0 ){
1006 [self checkRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1011 -(void)checkRange2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[1002][1002])aMap{
1016 if(Uselected) chipTeam = Uselected->team;
1018 if(startX < 0) startX = 0;
1019 if(startY < 0) startY = 0;
1021 aMap[startY][startX] = leftPow;// 残り移動力
1024 i0 = leftPow - g_moveCost[pieceType][g_map[startY-1][startX]]; // 上
1026 if(loadNum[startY-1][startX] > -1 && unitTeam[startY-1][startX] != chipTeam){
1029 if( aMap[startY-1][startX] < i0 ){
1030 [self checkRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap];
1034 i0 = leftPow - g_moveCost[pieceType][g_map[startY+1][startX]]; // 下
1035 if(loadNum[startY+1][startX] > -1 && unitTeam[startY+1][startX] != chipTeam){
1038 if( aMap[startY+1][startX] < i0 ){
1039 [self checkRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap];
1043 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX-1]]; // 右
1044 if(loadNum[startY][startX-1] > -1 && unitTeam[startY][startX-1] != chipTeam){
1047 if( aMap[startY][startX-1] < i0 ){
1048 [self checkRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1052 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX+1]]; // 左
1053 if(loadNum[startY][startX+1] > -1 && unitTeam[startY][startX+1] != chipTeam){
1056 if( aMap[startY][startX+1] < i0 ){
1057 [self checkRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1063 -(void)LookupSummonRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1066 for(int i = 0;i<=chipWidth;i++){
1067 for(int j = 0;j<=chipHeight;j++){
1068 g_summonRange[j][i] = 999;
1069 g_summonRangeDelta[j][i] = 999;
1073 for(int i = 1;i<=chipWidth;i++){
1074 for(int j = 1;j<=chipHeight;j++){
1075 g_summonRange[j][i] = 0;
1076 g_summonRangeDelta[j][i] = 0;
1080 for(int chipType = 0;chipType < 1024;chipType++){
1081 g_attackCost[0][chipType] = 1;
1087 ATTACK *aTop = aPiece->A;
1088 for(int i = 0;i < crCAL;i++){
1089 aPiece->A = aPiece->A->next;
1092 g_summonRange[startY][startX] = 1;
1093 g_summonRangeDelta[startY][startX] = 0;
1094 //attackMaxNum = aPiece->A->rangeB+1;
1096 //[self excludePiece:turnSide fillInt:99];
1097 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1098 [self checkSummonRange:startX startY:startY leftPow:2 pieceType:0 aMap:g_summonRange aPiece:aPiece];
1099 g_summonRange[startY][startX] = 0;
1100 g_summonRangeDelta[startY][startX] = 0;
1102 for(int i = 0;i<=chipWidth;i++){
1103 for(int j = 0;j<=chipHeight;j++){
1104 if(g_summonRangeDelta[i][j] > 0) g_summonRange[i][j] = 0;
1110 //[self excludePiece:turnSide fillInt:0];
1111 // 敵方のコマの位置を移動可能範囲から除外する
1115 -(void)checkSummonRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1118 if(startX < 0) startX = 0;
1119 if(startY < 0) startY = 0;
1121 aMap[startY][startX] = leftPow; // 残り射程の長さ
1123 i0 = leftPow - 1; // 上
1124 if( aMap[startY-1][startX] < i0 ){
1125 [self checkSummonRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1128 i0 = leftPow - 1; // 下
1129 if( aMap[startY+1][startX] < i0 ){
1130 [self checkSummonRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1133 i0 = leftPow - 1; // 右
1134 if( aMap[startY][startX-1] < i0 ){
1135 [self checkSummonRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1138 i0 = leftPow - 1; // 左
1139 if( aMap[startY][startX+1] < i0 ){
1140 [self checkSummonRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1146 -(void)LookupAttackRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1149 for(int i = 0;i<=chipWidth;i++){
1150 for(int j = 0;j<=chipHeight;j++){
1151 g_attackRange[j][i] = 999;
1152 g_attackRangeDelta[j][i] = 999;
1156 for(int i = 1;i<=chipWidth;i++){
1157 for(int j = 1;j<=chipHeight;j++){
1158 g_attackRange[j][i] = 0;
1159 g_attackRangeDelta[j][i] = 0;
1163 for(int chipType = 0;chipType < 1024;chipType++){
1164 g_attackCost[0][chipType] = 1;
1176 ATTACK *aTop = aPiece->A;
1177 for(int i = 0;i < crCAL;i++){
1178 aPiece->A = aPiece->A->next;
1181 g_attackRange[startY][startX] = aPiece->A->rangeB;
1182 g_attackRangeDelta[startY][startX] = aPiece->A->rangeA;
1183 attackMaxNum = aPiece->A->rangeB+1;
1185 //[self excludePiece:turnSide fillInt:99];
1186 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1187 if(aPiece->A->rangeB >= 1 && aPiece->A->rangeA >= 0){
1188 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeB+1 pieceType:0 aMap:g_attackRange aPiece:aPiece];
1189 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeA pieceType:1 aMap:g_attackRangeDelta aPiece:aPiece];
1190 g_attackRange[startY][startX] = 0;
1191 g_attackRangeDelta[startY][startX] = 0;
1193 for(int i = 0;i<=chipWidth;i++){
1194 for(int j = 0;j<=chipHeight;j++){
1195 if(g_attackRangeDelta[i][j] > 0) g_attackRange[i][j] = 0;
1199 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1202 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeA+1 pieceType:1 aMap:g_attackRange aPiece:aPiece];
1203 g_attackRange[startY][startX] = 0;
1204 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1209 //[self excludePiece:turnSide fillInt:0];
1210 // 敵方のコマの位置を移動可能範囲から除外する
1214 -(void)LookupAttackRange2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
1217 for(int i = 0;i<=chipWidth;i++){
1218 for(int j = 0;j<=chipHeight;j++){
1219 g_attackRange[j][i] = 999;
1220 g_attackRangeDelta[j][i] = 999;
1224 for(int i = 1;i<=chipWidth;i++){
1225 for(int j = 1;j<=chipHeight;j++){
1226 g_attackRange[j][i] = 0;
1227 g_attackRangeDelta[j][i] = 0;
1231 for(int chipType = 0;chipType < 1024;chipType++){
1232 g_attackCost[0][chipType] = 1;
1244 ATTACK *aTop = aPiece->A;
1245 for(int i = 0;i < crCAL;i++){
1246 aPiece->A = aPiece->A->next;
1249 g_attackRange[startY][startX] = aPiece->A->rangeB;
1250 g_attackRangeDelta[startY][startX] = aPiece->A->rangeA;
1251 attackMaxNum = aPiece->A->rangeB+1;
1253 //[self excludePiece:turnSide fillInt:99];
1254 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1255 if(aPiece->A->rangeB > 1 && aPiece->A->rangeA >= 0){
1256 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeB+1 pieceType:0 aMap:g_attackRange aPiece:aPiece];
1257 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeA pieceType:1 aMap:g_attackRangeDelta aPiece:aPiece];
1258 g_attackRange[startY][startX] = 0;
1259 g_attackRangeDelta[startY][startX] = 0;
1261 for(int i = 0;i<=chipWidth;i++){
1262 for(int j = 0;j<=chipHeight;j++){
1263 if(g_attackRangeDelta[i][j] > 0) g_attackRange[i][j] = 0;
1267 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1270 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeA+1 pieceType:1 aMap:g_attackRange aPiece:aPiece];
1271 g_attackRange[startY][startX] = 0;
1272 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1277 //[self excludePiece:turnSide fillInt:0];
1278 // 敵方のコマの位置を移動可能範囲から除外する
1282 -(void)checkAttackRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1286 if(Uselected) chipTeam = Uselected->team;
1288 if(startX < 0) startX = 0;
1289 if(startY < 0) startY = 0;
1291 aMap[startY][startX] = leftPow; // 残り射程の長さ
1292 i0 = leftPow - 1; // 上
1293 /*if(unitTeam[startY][startX] == chipTeam){
1294 aMap[startY][startX] = 0;
1297 if( aMap[startY-1][startX] < i0 ){
1298 [self checkAttackRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1301 i0 = leftPow - 1; // 下
1302 if( aMap[startY+1][startX] < i0 ){
1303 [self checkAttackRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1306 i0 = leftPow - 1; // 右
1307 if( aMap[startY][startX-1] < i0 ){
1308 [self checkAttackRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1311 i0 = leftPow - 1; // 左
1312 if( aMap[startY][startX+1] < i0 ){
1313 [self checkAttackRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1318 -(void)checkAttackRange2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(LOADCHIP*)aPiece{
1321 if(startX < 0) startX = 0;
1322 if(startY < 0) startY = 0;
1324 aMap[startY][startX] = leftPow; // 残り射程の長さ
1326 i0 = leftPow - 1; // 上
1327 if( aMap[startY-1][startX] < i0 ){
1328 [self checkAttackRange2:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1331 i0 = leftPow - 1; // 下
1332 if( aMap[startY+1][startX] < i0 ){
1333 [self checkAttackRange2:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1336 i0 = leftPow - 1; // 右
1337 if( aMap[startY][startX-1] < i0 ){
1338 [self checkAttackRange2:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1341 i0 = leftPow - 1; // 左
1342 if( aMap[startY][startX+1] < i0 ){
1343 [self checkAttackRange2:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1349 -(void)checkRangeAttack:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece i:(int)i{
1353 if(startX < 0) startX = 0;
1354 if(startY < 0) startY = 0;
1356 aMap[startY][startX] = leftPow; // 残り射程の長さ
1358 i0 = leftPow - 1; // 上
1359 if( aMap[startY-1][startX] < i0 ){
1360 [self checkRangeAttack:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1363 i0 = leftPow - 1; // 下
1364 if( aMap[startY+1][startX] < i0 ){
1365 [self checkRangeAttack:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1368 i0 = leftPow - 1; // 右
1369 if( aMap[startY][startX-1] < i0 ){
1370 [self checkRangeAttack:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1373 i0 = leftPow - 1; // 左
1374 if( aMap[startY][startX+1] < i0 ){
1375 [self checkRangeAttack:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1381 -(void)LookupAttackRangeExtent:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1384 for(int i = 0;i<=chipWidth;i++){
1385 for(int j = 0;j<=chipHeight;j++){
1386 g_attackRangeExtent[j][i] = 999;
1390 for(int i = 1;i<=chipWidth;i++){
1391 for(int j = 1;j<=chipHeight;j++){
1392 g_attackRangeExtent[j][i] = 0;
1396 for(int chipType = 0;chipType < 1024;chipType++){
1397 g_attackCost[0][chipType] = 1;
1409 ATTACK *aTop = aPiece->A;
1410 for(int i = 0;i < crCAL;i++){
1411 aPiece->A = aPiece->A->next;
1414 g_attackRangeExtent[startY][startX] = aPiece->A->extent;
1415 attackMaxNum = aPiece->A->extent;
1417 //[self excludePiece:turnSide fillInt:99];
1418 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1421 [self checkAttackRangeExtent:startX startY:startY leftPow:aPiece->A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:aPiece];
1425 //[self excludePiece:turnSide fillInt:0];
1426 // 敵方のコマの位置を移動可能範囲から除外する
1430 -(void)checkAttackRangeExtent:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1434 if(Uselected) chipTeam = Uselected->team;
1436 if(startX < 0) startX = 0;
1437 if(startY < 0) startY = 0;
1439 aMap[startY][startX] = leftPow; // 残り射程の長さ
1440 i0 = leftPow - 1; // 上
1441 /*if(unitTeam[startY][startX] == chipTeam){
1442 aMap[startY][startX] = 0;
1445 if( aMap[startY-1][startX] < i0 ){
1446 [self checkAttackRangeExtent:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1449 i0 = leftPow - 1; // 下
1450 if( aMap[startY+1][startX] < i0 ){
1451 [self checkAttackRangeExtent:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1454 i0 = leftPow - 1; // 右
1455 if( aMap[startY][startX-1] < i0 ){
1456 [self checkAttackRangeExtent:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1459 i0 = leftPow - 1; // 左
1460 if( aMap[startY][startX+1] < i0 ){
1461 [self checkAttackRangeExtent:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1466 -(void)LookupAttackRangeExtent2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
1469 for(int i = 0;i<=chipWidth;i++){
1470 for(int j = 0;j<=chipHeight;j++){
1471 g_attackRangeExtent[j][i] = 999;
1475 for(int i = 1;i<=chipWidth;i++){
1476 for(int j = 1;j<=chipHeight;j++){
1477 g_attackRangeExtent[j][i] = 0;
1481 for(int chipType = 0;chipType < 1024;chipType++){
1482 g_attackCost[0][chipType] = 1;
1494 ATTACK *aTop = aPiece->A;
1495 for(int i = 0;i < crCAL;i++){
1496 aPiece->A = aPiece->A->next;
1499 g_attackRangeExtent[startY][startX] = aPiece->A->extent;
1500 attackMaxNum = aPiece->A->extent;
1502 //[self excludePiece:turnSide fillInt:99];
1503 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1506 [self checkAttackRangeExtent2:startX startY:startY leftPow:aPiece->A->extent pieceType:1 aMap:g_attackRange aPiece:aPiece];
1507 g_attackRangeExtent[startY][startX] = 0;
1511 //[self excludePiece:turnSide fillInt:0];
1512 // 敵方のコマの位置を移動可能範囲から除外する
1516 -(void)checkAttackRangeExtent2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(LOADCHIP*)aPiece{
1520 if(Uselected) chipTeam = Uselected->team;
1522 if(startX < 0) startX = 0;
1523 if(startY < 0) startY = 0;
1525 aMap[startY][startX] = leftPow; // 残り射程の長さ
1526 i0 = leftPow - 1; // 上
1527 /*if(unitTeam[startY][startX] == chipTeam){
1528 aMap[startY][startX] = 0;
1531 if( aMap[startY-1][startX] < i0 ){
1532 [self checkAttackRangeExtent2:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1535 i0 = leftPow - 1; // 下
1536 if( aMap[startY+1][startX] < i0 ){
1537 [self checkAttackRangeExtent2:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1540 i0 = leftPow - 1; // 右
1541 if( aMap[startY][startX-1] < i0 ){
1542 [self checkAttackRangeExtent2:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1545 i0 = leftPow - 1; // 左
1546 if( aMap[startY][startX+1] < i0 ){
1547 [self checkAttackRangeExtent2:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1554 for(int g = 0;g <= chipWidth;g++){
1555 for(int h = 0; h <= chipHeight;h++){
1556 g_attackRangeBeta [h][g] = 0;
1559 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
1562 for (int x = 0; x <= chipWidth;x++) {
1563 for(int y = 0; y <= chipHeight;y++){
1565 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
1568 UA = unitBreak->C.A;
1569 UAT = unitBreak->C.A;
1575 while (unitBreak->C.A) {
1576 double mpcost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
1578 double vigcost = unitBreak->C.A->vigor;
1580 if(UA->rangeB <= unitBreak->C.A->rangeB && mpcost <= unitBreak->C.S_C.MP && vigcost <= unitBreak->C.S_C.vigor){
1582 UA = unitBreak->C.A;
1585 unitBreak->C.A = unitBreak->C.A->next;
1586 }unitBreak->C.A = UAT;
1591 if(UA->rangeB <= 0) {
1592 UA = unitBreak->C.A;
1598 cpuAtkExtendFlag = true;
1601 while (unitBreak->C.A && UA != unitBreak->C.A) {
1602 unitBreak->C.A = unitBreak->C.A->next;
1604 }unitBreak->C.A = UAT;
1606 unitBreak->atkRange = UA->rangeB;
1608 for(int g = 0;g <= chipWidth;g++){
1609 for(int h = 0; h <= chipHeight;h++){
1610 g_attackRangeAlpha [h][g] = 0;
1614 [self checkAttackRange:x startY:y leftPow:UA->rangeB+1 pieceType:unitBreak->C.S_C.typeMONS aMap:g_attackRangeAlpha aPiece:&unitBreak->C];
1616 for (int j = 0; j <= chipWidth;j++) {
1617 for(int k = 0;k <= chipHeight;k++){
1618 if(g_attackRangeBeta[k][j] < g_attackRangeAlpha[k][j]) g_attackRangeBeta[k][j] = g_attackRangeAlpha[k][j];
1628 //-------------------------------------------------------------------searchRute
1632 // ルートテンポラリとルートバッファの初期化
1633 for( i0 = 0; i0 < 2100; i0++ )
1634 { g_tmpRoute[i0][0] = 0; g_tmpRoute[i0][1] = 0; g_moveRoute[i0][0] = 0;
1635 g_moveRoute[i0][1] = 0; }
1637 for(int i = 0;i < 2100;i++){// テンポラリマップのゼロリセット
1638 for(int j = 0;j< 2100;j++){
1642 g_stackPointer = 0; // スタックポインタ初期化
1643 g_shallowDepth = 1002; //「最も浅いスタック」を持たせるために、// 最も深い値を与えておく
1645 [self checkRoute:g_cursol_x startY:g_cursol_y];
1650 while( i0 < g_shallowDepth)
1652 g_tmpMap[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = 1;
1658 //-------------------------------------------------------------------checkRout
1659 -(void)checkRoute:(int)startX startY:(int)startY{
1662 g_tmpMap[startY][startX]=1;
1663 g_tmpRoute[g_stackPointer][0] = startX;
1664 g_tmpRoute[g_stackPointer][1] = startY;
1667 // ターゲットに到達したとき、スタック深度が今までより浅かったらそれを保存する
1668 if((( g_target_x == startX )&&( g_target_y == startY )&&( g_stackPointer < g_shallowDepth )))
1670 g_shallowDepth = g_stackPointer; // 最浅スタック深度更新
1672 for( j0 = 0; j0 < g_shallowDepth; j0++ ) {
1673 g_moveRoute[j0][0] = g_tmpRoute[j0][0];
1674 g_moveRoute[j0][1] = g_tmpRoute[j0][1];
1679 // 配列の添え字と関数の引数が逆になっていることに要注意
1680 i0 = g_selectRange[startY][startX];
1681 if(g_selectRange[startY-1][startX] > 0)
1682 if(( g_selectRange[startY-1][startX] < i0 )&&(g_tmpMap[startY-1][startX] == 0 )
1684 [self checkRoute:startX startY:startY -1];
1686 if(g_selectRange[startY+1][startX] > 0)
1687 if(( g_selectRange[startY+1][startX] < i0 )&&(g_tmpMap[startY+1][startX] == 0 )
1689 [self checkRoute:startX startY:startY +1];
1691 if(g_selectRange[startY][startX-1] > 0)
1692 if(( g_selectRange[startY][startX-1] < i0 )&&(g_tmpMap[startY][startX-1] == 0 )
1694 [self checkRoute:startX-1 startY:startY];
1696 if(g_selectRange[startY][startX+1] > 0)
1697 if(( g_selectRange[startY][startX+1] < i0 )&&(g_tmpMap[startY][startX+1] == 0 )
1699 [self checkRoute:startX+1 startY:startY];
1702 g_stackPointer--; // スタックから捨てる
1703 //g_tmpMap[startY][startX] = 0; // 別経路探索のため
1708 //-------------------------------------------------------------------searchRute
1709 -(void)searchRoute2{
1712 // ルートテンポラリとルートバッファの初期化
1713 for( i0 = 0; i0 < 2100; i0++ )
1714 { g_tmpRoute2[i0][0] = 0; g_tmpRoute2[i0][1] = 0; g_moveRoute2[i0][0] = 0;
1715 g_moveRoute2[i0][1] = 0; }
1717 for(int i = 0;i < 2100;i++){// テンポラリマップのゼロリセット
1718 for(int j = 0;j< 2100;j++){
1719 g_tmpMap2[j][i] = 0;
1722 g_stackPointer = 0; // スタックポインタ初期化
1723 g_shallowDepth = 1002; //「最も浅いスタック」を持たせるために、// 最も深い値を与えておく
1725 [self checkRoute:g_cursol_x startY:g_cursol_y];
1730 while( i0 < g_shallowDepth)
1732 g_tmpMap2[g_moveRoute2[i0][1]][g_moveRoute2[i0][0]] = 1;
1738 //-------------------------------------------------------------------checkRout
1739 -(void)checkRoute2:(int)startX startY:(int)startY{
1742 g_tmpMap2[startY][startX]=1;
1743 g_tmpRoute2[g_stackPointer][0] = startX;
1744 g_tmpRoute2[g_stackPointer][1] = startY;
1747 // ターゲットに到達したとき、スタック深度が今までより浅かったらそれを保存する
1748 if((( g_target_x == startX )&&( g_target_y == startY )&&( g_stackPointer < g_shallowDepth ))|| ((cpuTargX == startX ) && (cpuTargY == startY)))
1750 g_shallowDepth = g_stackPointer; // 最浅スタック深度更新
1752 for( j0 = 0; j0 < g_shallowDepth; j0++ ) {
1753 g_moveRoute2[j0][0] = g_tmpRoute2[j0][0];
1754 g_moveRoute2[j0][1] = g_tmpRoute2[j0][1];
1759 // 配列の添え字と関数の引数が逆になっていることに要注意
1760 i0 = g_selectRange[startY][startX];
1761 if(g_selectRange[startY-1][startX] > 0)
1762 if(( g_selectRange[startY-1][startX] < i0 )&&(g_tmpMap2[startY-1][startX] == 0 )
1764 [self checkRoute:startX startY:startY -1];
1766 if(g_selectRange[startY+1][startX] > 0)
1767 if(( g_selectRange[startY+1][startX] < i0 )&&(g_tmpMap2[startY+1][startX] == 0 )
1769 [self checkRoute:startX startY:startY +1];
1771 if(g_selectRange[startY][startX-1] > 0)
1772 if(( g_selectRange[startY][startX-1] < i0 )&&(g_tmpMap2[startY][startX-1] == 0 )
1774 [self checkRoute:startX-1 startY:startY];
1776 if(g_selectRange[startY][startX+1] > 0)
1777 if(( g_selectRange[startY][startX+1] < i0 )&&(g_tmpMap2[startY][startX+1] == 0 )
1779 [self checkRoute:startX+1 startY:startY];
1782 g_stackPointer--; // スタックから捨てる
1783 //g_tmpMap[startY][startX] = 0; // 別経路探索のため
1803 static int cpuMODE = MODE_CPU_IDLE;
1813 if(unitMoveEndFlag){
1814 pushStanbyFlag = true;
1816 cpuIsAttackingFlag = false;
1819 if(setBattleModeFlag)
1824 if(endGameCondition)
1826 if(battleFlag || battleRdy || battleSetUp)
1829 unitMoveEndFlag = false;
1830 CPUAttackFlag = false;
1831 CPUAttackFlag2 = false;
1832 if(cpuAImodeflag && unitBreak->C.nameID)
1833 cpuMODE = MODE_CPU_SEARCH;
1834 possionX = unitBreak->x;
1835 possionY = unitBreak->y;
1836 currentPosX = possionX;
1837 currentPosY = possionY;
1838 Uselected = unitBreak;
1840 case MODE_CPU_SEARCH:
1841 pushStanbyFlag = false;
1843 [self cpuSearchEnemy];
1844 //if(Utarget) NSLog(@"Utarg %d", Utarget->number);
1845 cpuModeMOVEflag = true;
1846 if(unitNoMoveStanbyFlag){
1847 static int waitTimer = 50;
1848 cpuModeATTACKflag = true;
1849 if (waitTimer > 0) {
1854 unitNoMoveFlag = true;
1857 while (U->number != wtUnitNum) {
1861 if(!wtMovedFlag && !wtAttackedFlag && unitNoMoveFlag){
1862 U->C.S_C.WT = floor(U->C.S_M.WT/4 + 0.5);
1863 }else if(wtMovedFlag && wtAttackedFlag){
1864 U->C.S_C.WT = floor(U->C.S_M.WT + 0.5);
1865 }else if(wtMovedFlag){
1866 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
1867 }else if(wtAttackedFlag){
1868 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
1875 if(B->x == wtPx && B->y == wtPy && B->C.capture){
1876 buildCaptureFlag = true;
1877 unitMoveEndFlag = true;
1881 pushStanbyFlag = true;
1883 cpuModeMOVEflag = false;
1884 cpuModeATTACKflag = false;
1885 cpuAImodeflag = false;
1889 CPUAttackFlag = false;
1890 CPUAttackFlag2 = false;
1892 unitNoMoveStanbyFlag = false;
1894 cpuMODE = MODE_CPU_BUILD;
1901 cpuMODE = MODE_CPU_MOVE;
1903 wtMovedFlag = false;
1904 cpuModeATTACKflag = true;
1905 CPUAttackFlag = true;
1906 cpuMODE = MODE_CPU_ATTACK;
1911 cpuModeATTACKflag = true;
1912 if ([self cpuMoveFunc] && unitMoveEndFlag) {
1913 cpuMODE = MODE_CPU_ATTACK;
1915 // NSLog(@"test[%d,%d][%d,%d]", unitBreak->x, unitBreak->y, possionX, possionY);
1916 // NSLog(@"test[%d]", unitNoMoveFlag);
1917 possionX = g_target_y;
1918 possionY = g_target_x;
1921 cpuMODE = MODE_CPU_ATTACK;
1923 cpuMODE = MODE_CPU_BUILD;
1927 case MODE_CPU_ATTACK:
1929 cpuMODE = MODE_CPU_BUILD;
1933 //unitNoMoveFlag = false;
1934 unitCPUAttackFlag = true;
1935 cpuMODE = MODE_CPU_BATTLE;
1939 case MODE_CPU_BATTLE:
1941 if(cpuModeBATTLEendFlag){
1944 if(cpuModeBATTLEendFlag){
1946 static int waitTimer0 = 50;
1948 if (waitTimer0 > 0) {
1953 pushStanbyFlag = true;
1955 cpuModeMOVEflag = false;
1956 cpuModeATTACKflag = false;
1957 cpuAImodeflag = false;
1959 //stanbyFlag = true;
1961 CPUAttackFlag2 = false;
1962 battleWindowFlag = true;
1964 cpuModeBATTLEendFlag = false;
1965 cpuOMFGmoveATKfixFlag = false;
1966 cpuMODE = MODE_CPU_EMPLOY;
1972 else if((CPUAttackFlag && unitMoveEndFlag )|| CPUAttackFlag2){
1974 static int waitTimer = 50;
1976 if (waitTimer > 0) {
1981 if(!cpuAtkExtendFlag){
1982 CPUAttackSubmitFlag = true;
1983 battleWindowFlag = true;
1984 cpuModeBATTLEflag = true;
1986 CPUAttackFlag2 = false;
1988 CPUAttackSubmitFlag = true;
1989 battleWindowFlag = false;
1990 cpuModeBATTLEflag = true;
1992 CPUAttackFlag2 = false;
1993 cpuAtkExtendFlag = false;
1994 cpuAtkExtendFlag2 = true;
1995 cpuOMFGmoveATKfixFlag = true;
2003 cpuMODE = MODE_CPU_EMPLOY;
2006 case MODE_CPU_BUILD:
2010 if(B->x == possionX && B->y == possionY)
2015 SKILL *ST = unitBreak->C.S;
2019 if(unitBreak->team == 0){
2021 }else if(unitBreak->team == 2){
2023 }else if(unitBreak->team == 1){
2027 if(cpuBuildDoneFlag){
2030 while(unitBreak->C.S){
2031 if(unitBreak->C.S->type == 1){
2032 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2034 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2035 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2036 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2041 unitBreak->C.S = unitBreak->C.S->next;
2042 }unitBreak->C.S = ST;
2045 B->C.invisible = false;
2046 cpuBuildDoneFlag = false;
2047 cpuMODE = MODE_CPU_EMPLOY;
2048 }else if(wtMovedFlag){
2050 while(unitBreak->C.S){
2051 if(unitBreak->C.S->type == 1){
2052 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2054 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2055 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2056 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2061 unitBreak->C.S = unitBreak->C.S->next;
2062 }unitBreak->C.S = ST;
2063 NSLog(@"BTop %@", BTop->C.name);
2064 B->C.invisible = false;
2065 cpuBuildDoneFlag = false;
2066 cpuMODE = MODE_CPU_EMPLOY;
2067 }else if(unitMoveEndFlag){
2069 while(unitBreak->C.S){
2070 if(unitBreak->C.S->type == 1){
2071 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2073 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2074 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2075 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2080 unitBreak->C.S = unitBreak->C.S->next;
2081 }unitBreak->C.S = ST;
2083 B->C.invisible = false;
2084 cpuBuildDoneFlag = false;
2085 cpuMODE = MODE_CPU_EMPLOY;
2092 cpuMODE = MODE_CPU_EMPLOY;
2094 case MODE_CPU_EMPLOY:
2095 [self cpuEmployment];
2096 cpuMODE = MODE_CPU_STANBY;
2098 case MODE_CPU_STANBY:
2103 while (U->number != wtUnitNum) {
2107 if(!wtMovedFlag && !wtAttackedFlag && unitNoMoveFlag){
2108 U->C.S_C.WT = floor(U->C.S_M.WT/4 + 0.5);
2109 }else if(wtMovedFlag && wtAttackedFlag){
2110 U->C.S_C.WT = floor(U->C.S_M.WT + 0.5);
2111 }else if(wtMovedFlag){
2112 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
2113 }else if(wtAttackedFlag){
2114 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
2121 pushStanbyFlag = true;
2123 cpuModeMOVEflag = false;
2124 cpuModeATTACKflag = false;
2125 cpuAImodeflag = false;
2129 unitNoMoveFlag = false;
2130 CPUAttackFlag = false;
2131 CPUAttackFlag2 = false;
2133 cpuModeBATTLEendFlag = false;
2135 cpuMODE = MODE_CPU_IDLE;
2136 cpuIsAttackingFlag = false;
2144 while (U->number != wtUnitNum) {
2148 if(!wtMovedFlag && !wtAttackedFlag && unitNoMoveFlag){
2149 U->C.S_C.WT = floor(U->C.S_M.WT/4 + 0.5);
2150 }else if(wtMovedFlag && wtAttackedFlag){
2151 U->C.S_C.WT = floor(U->C.S_M.WT + 0.5);
2152 }else if(wtMovedFlag){
2153 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
2154 }else if(wtAttackedFlag){
2155 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
2163 pushStanbyFlag = true;
2165 cpuModeMOVEflag = false;
2166 cpuModeATTACKflag = false;
2167 cpuAImodeflag = false;
2171 CPUAttackFlag = false;
2172 CPUAttackFlag2 = false;
2173 unitNoMoveFlag = false;
2174 cpuModeBATTLEendFlag = false;
2175 cpuMODE = MODE_CPU_IDLE;
2176 //if(Utarget) NSLog(@"Utarg2 %d", Utarget->number);
2179 cpuMODE = MODE_CPU_IDLE;
2202 -(void)cpuEmployment{
2207 if(unitNum[B->x][B->y] < 0 && unitBreak->team == B->team){
2209 BUILDCHIP B0 = BC[buildNum[B->x][B->y]];
2210 RESEARCH *Rtop = B0.R;
2215 if(unitBreak->team == 0){
2217 }else if(unitBreak->team == 2){
2219 }else if(unitBreak->team == 1){
2226 if(B->makeLv >= B0.R->Lv && unitNum[B->x][B->y] < 0){
2228 int rdmCnt = rand()%100;
2230 if(BU && rdmCnt > 60){
2231 if(BU->S_M.cSupply <= P[UT].resource &&
2232 BU->S_M.cFood <= P[UT].food &&
2233 BU->S_M.cMoney <= P[UT].money){
2236 P[UT].resource -= BU->S_M.cSupply;
2237 P[UT].food -= BU->S_M.cFood;
2238 P[UT].money -= BU->S_M.cMoney;
2240 unitNum[B->x][B->y] = BU->chipNumb;
2241 unitTeam[B->x][B->y] = B->team;
2244 [self addUnitStatusFix];
2258 -(void)addUnitStatusFix{
2261 while (U->next) {omgCnt++;
2264 U->next = calloc(1, sizeof(UNIT));
2267 if(omgCnt == 0) UTop = U;
2268 U->number = registerNum;
2270 for(int i = 0;i < UCN;i++){
2271 if([U->C.nameID isEqualToString:UC[i].nameID])
2275 U->chipNumber = unitNum[possionX][possionY];
2276 U->chipNumberL = loadNum[possionX][possionY];
2277 U->C.chipNumb = unitNum[possionX][possionY];
2278 U->CL.chipNumb = loadNum[possionX][possionY];
2282 if(unitTeam[possionX][possionY] == 0 || unitTeam[possionX][possionY] == 1){
2284 if(unitTeam[possionX][possionY] == 1){
2285 U->joinArmyFromNext = true;
2286 U->persuasion = true;
2289 if(unitTeam[possionX][possionY] == 2 || unitTeam[possionX][possionY] == 3){
2291 if(unitTeam[possionX][possionY] == 3){
2292 U->joinArmyFromNext = true;
2293 U->persuasion = true;
2296 if(unitTeam[possionX][possionY] == 4 || unitTeam[possionX][possionY] == 5){
2298 if(unitTeam[possionX][possionY] == 5){
2299 U->joinArmyFromNext = true;
2300 U->persuasion = true;
2303 if(unitTeam[possionX][possionY] == -1){
2305 if(unitTeam[possionX][possionY] == 0){
2306 U->joinArmyFromNext = false;
2307 U->persuasion = true;
2310 [self SetUnitStatusFix:unitNum[possionX][possionY]];
2311 unitColorInitFlag = true;
2316 -(void)SetUnitStatusFix:(int)UN{
2319 U->C.S_C.vigor = 100;
2326 AtopE1 = UC[UN].eHandL.A;
2327 AtopE2 = UC[UN].eHandR.A;
2328 U->C.A = calloc(1, sizeof(ATTACK));
2334 while(UC[UN].eHandR.A != NULL){ow1 = true;
2335 *U->C.A = *UC[UN].eHandR.A;
2336 U->C.A->next = calloc(1, sizeof(ATTACK));
2337 U->C.A->next->next = NULL;
2338 if(UC[UN].eHandR.A->next != NULL) U->C.A = U->C.A->next;
2339 UC[UN].eHandR.A = UC[UN].eHandR.A->next;
2340 U->C.attackListNum++;
2342 UC[UN].eHandR.A = AtopE2;
2346 U->C.A = U->C.A->next;
2349 while(UC[UN].eHandL.A != NULL){ow2 = true;
2350 *U->C.A = *UC[UN].eHandL.A;
2351 U->C.A->next = calloc(1, sizeof(ATTACK));
2352 U->C.A->next->next = NULL;
2353 if(UC[UN].eHandL.A->next != NULL) U->C.A = U->C.A->next;
2354 UC[UN].eHandL.A = UC[UN].eHandL.A->next;
2355 U->C.attackListNum++;
2357 UC[UN].eHandL.A = AtopE1;
2360 U->C.A = U->C.A->next;
2363 while(UC[UN].A != NULL){
2364 *U->C.A = *UC[UN].A;
2365 U->C.A->next = calloc(1, sizeof(ATTACK));
2366 U->C.A->next->next = NULL;
2367 if(UC[UN].A->next != NULL) U->C.A = U->C.A->next;
2368 UC[UN].A = UC[UN].A->next;
2370 U->C.A->next = NULL;
2373 if(U->C.A) if(!U->C.A->name)
2378 -(void)cpuSearchEnemy{
2380 if(!unitBreak->C.nameID) return;
2385 unitMoveEndFlag = false;
2386 possionX = unitBreak->x;
2387 possionY = unitBreak->y;
2389 UCselected = UC[unitNum[unitBreak->x][unitBreak->y]];
2390 LCselected = LC[loadNum[unitBreak->x][unitBreak->y]];
2392 if(unitBreak->chipNumber >= 0) [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&UC[unitNum[unitBreak->x][unitBreak->y]] turnSide:YES];
2393 if(unitBreak->chipNumberL >= 0) [self LookupMovableRange2:unitBreak->y startY:unitBreak->x aPiece:&LC[loadNum[unitBreak->x][unitBreak->y]] turnSide:YES];
2395 for (int x = 0; x <= chipWidth; x++) {
2396 for (int y = 0; y <= chipHeight; y++) {
2397 g_targUnit[y][x] = 0;
2401 for (int x = 0; x <= chipWidth; x++) {
2402 for (int y = 0; y <= chipHeight; y++) {
2403 g_entireUnit[y][x] = 0;
2408 for (int x = 0; x <= chipWidth; x++) {
2409 for (int y = 0; y <= chipHeight; y++) {
2414 if(U->y == x && U->x == y){
2415 g_entireUnit[y][x] = 1;
2422 for (int x = 0; x <= chipWidth; x++) {
2423 for (int y = 0; y <= chipHeight; y++) {
2428 if(g_attackRangeBeta[y][x] > 0 && U->y == x && U->x == y){
2429 g_targUnit[y][x] = 1;
2440 CPUAttackFlag = false;
2441 CPUAttackFlag2 = false;
2450 for (int x = 0; x <= chipWidth; x++) {
2451 for (int y = 0; y <= chipHeight; y++) {
2452 g_attackRangeTheta[y][x] = 0;
2455 [self checkRangeAttack:U->y startY:U->x leftPow:unitBreak->atkRange+1 pieceType:U->C.S_C.typeMONS aMap:g_attackRangeTheta aPiece:&U->C i:unitBreak->atkRange+1 ];
2457 for (int i = 0;i < chipWidth;i++) {
2458 for(int k = 0;k < chipHeight;k++){
2459 if(g_attackRangeTheta[i][k] > 0)
2460 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2465 ATTACK *AT = unitBreak->C.A;
2466 for(int i = 0;i < crCAL1;i++){
2471 if(g_attackRangeTheta[unitBreak->x][unitBreak->y] > 0 && !U->dead && AT->D->sort == 1){
2473 if(unitBreak->team == 2){
2474 if(U->team == 2 && unitBreak->team == 2){
2482 if(unitBreak->team == 0 || unitBreak->team == 1){
2483 if(((U->team == 1 && unitBreak->team == 0) || (U->team == 0 && unitBreak->team == 1) ||
2484 (U->team == 0 && unitBreak->team == 0) || (U->team == 1 && unitBreak->team == 1))
2493 //NSLog(@"HP %g HPH %g", U->C.S_C.HP, U->C.S_M.HP*70/100);
2494 if(AT->D->sort == 1 && U->C.S_C.HP <= U->C.S_M.HP*70/100){
2500 AUN[1] = unitBreak->number;
2503 unitBreak->atkRange = g_attackRangeTheta[unitBreak->x][unitBreak->y];
2504 g_target_x = unitBreak->y;
2505 g_target_y = unitBreak->x;
2506 unitNoMoveFlag = true;
2507 CPUAttackFlag = true;
2508 CPUAttackFlag2 = true;
2509 cpuIsAttackingFlag = true;
2517 if(!U->dead && AT->D->sort == 1){
2519 if(unitBreak->team == 2){
2520 if(U->team == 2 && unitBreak->team == 2){
2529 if(unitBreak->team == 0 || unitBreak->team == 1){
2530 if(((U->team == 1 && unitBreak->team == 0) || (U->team == 0 && unitBreak->team == 1) ||
2531 (U->team == 0 && unitBreak->team == 0) || (U->team == 1 && unitBreak->team == 1))
2542 // NSLog(@"HP %g HPH %g", U->C.S_C.HP, U->C.S_M.HP*70/100);
2543 if(U->C.S_C.HP <= U->C.S_M.HP*70/100){
2549 for (int x = 1; x <= chipWidth; x++) {
2550 for (int y = 1; y <= chipHeight; y++) {
2551 if(g_attackRangeTheta[y][x] > 0 && g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0
2552 && g_attackRangeTheta[y][x] == unitBreak->atkRange){
2555 int point = (unitBreak->atkRange - g_attackRangeBeta[y][x])*20 + g_selectRange[y][x]*50;
2557 if(eval_point < point){
2560 unitBreak->atkRange = g_attackRangeTheta[y][x];
2563 CPUAttackFlag = true;
2564 AUN[1] = unitBreak->number;
2580 ATTACK *AT = unitBreak->C.A;
2581 for(int i = 0;i < crCAL1;i++){
2586 [self healBreak];//回復の対象がいない時、回復以外にする
2597 for (int x = 0; x <= chipWidth; x++) {
2598 for (int y = 0; y <= chipHeight; y++) {
2599 g_attackRangeTheta[y][x] = 0;
2602 [self checkRangeAttack:U->y startY:U->x leftPow:unitBreak->atkRange+1 pieceType:U->C.S_C.typeMONS aMap:g_attackRangeTheta aPiece:&U->C i:unitBreak->atkRange+1 ];
2604 for (int i = 0;i < chipWidth;i++) {
2605 for(int k = 0;k < chipHeight;k++){
2606 if(g_attackRangeTheta[i][k] > 0)
2607 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2611 ATTACK *AT = unitBreak->C.A;
2612 for(int i = 0;i < crCAL1;i++){
2617 if(g_attackRangeTheta[unitBreak->x][unitBreak->y] > 0 && !U->dead &&
2618 unitBreak->team != U->team && AT->D->sort != 1){
2620 if(unitBreak->team == 0)
2623 if(unitBreak->team == 1)
2628 AUN[1] = unitBreak->number;
2630 bool rangeChanged = false;
2631 if(unitBreak->atkRange != g_attackRangeTheta[unitBreak->x][unitBreak->y]){
2633 rangeChanged = true;
2637 unitBreak->atkRange = g_attackRangeTheta[unitBreak->x][unitBreak->y];
2639 g_target_x = unitBreak->y;
2640 g_target_y = unitBreak->x;
2641 unitNoMoveFlag = true;
2642 CPUAttackFlag = true;
2643 CPUAttackFlag2 = true;
2644 cpuIsAttackingFlag = true;
2647 [self atkSelectionFix];
2656 if(!U->dead && unitBreak->team != U->team && unitBreak->C.A->D->sort != 1){
2658 if(unitBreak->team == 0)
2661 if(unitBreak->team == 1)
2665 for (int x = 1; x <= chipWidth; x++) {
2666 for (int y = 1; y <= chipHeight; y++) {
2667 if(g_attackRangeTheta[y][x] > 0 && g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0
2668 && g_attackRangeTheta[y][x] == unitBreak->atkRange){
2671 int point = (unitBreak->atkRange - g_attackRangeBeta[y][x])*20 + g_selectRange[y][x]*50;
2673 if(eval_point < point){
2677 bool rangeChanged = false;
2678 if(unitBreak->atkRange != g_attackRangeTheta[y][x]){
2680 rangeChanged = true;
2683 unitBreak->atkRange = g_attackRangeTheta[y][x];
2686 [self atkSelectionFix];
2691 CPUAttackFlag = true;
2692 AUN[1] = unitBreak->number;
2711 for (int x = 0; x <= chipWidth; x++) {
2712 for (int y = 0; y <= chipHeight; y++) {
2713 g_attackRangeTheta[y][x] = 0;
2716 [self checkRangeAttack:Utarget->y startY:Utarget->x leftPow:unitBreak->atkRange+1 pieceType:U->C.S_C.typeMONS aMap:g_attackRangeTheta aPiece:&U->C i:unitBreak->atkRange+1 ];
2719 for (int i = 0;i < chipWidth;i++) {
2720 for(int k = 0;k < chipHeight;k++){
2721 if(g_attackRangeTheta[i][k] > 0)
2722 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2727 if(g_attackRangeTheta[g_target_y][g_target_x] != unitBreak->atkRange){
2733 for (int k = 0; k <= chipWidth; k++) {
2734 for (int g = 0; g <= chipHeight; g++) {
2735 g_enemyRange[g][k] = 0;
2739 //[self checkEnemyRange:unitBreak->atkRange+1 cntNum:0 tX:Utarget->x tY:Utarget->y aMap:g_enemyRange];
2741 //unitBreak->atkRange = unitBreak->atkRange+1 - g_enemyRange[g_target_x][g_target_y];
2750 while(U && AUN[1] > i){i++;
2754 attackExceptNumber = U->number;
2755 if(U->chipNumberL < 0){
2757 [self LookupAttackRangeExtent:Utarget->y startY:Utarget->x aPiece:&U->C turnSide:YES];
2761 [self LookupAttackRangeExtent2:Utarget->y startY:Utarget->x aPiece:&U->CL turnSide:YES];
2767 attackExtentFlag2 = true;
2768 [self cpuATKextentFunc];
2769 atkExtentFlag = true;
2770 cpuAtkExtendFlag = true;
2772 atkExtentFlag = false;
2778 //NSLog(@"UtargNUm %d", Utarget->number);
2808 if(!U->dead && U->team != unitBreak->team){
2809 if(unitBreak->team == 0)
2812 if(unitBreak->team == 1)
2816 for (int x = 1; x <= chipWidth; x++) {
2817 for (int y = 1; y <= chipHeight;y++) {
2818 if(g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0){
2819 int dist = abs(x - U->y) + abs(y - U->x);
2822 if(buildNum[y][x] >= 0){
2823 if((buildTeam[y][x] == 0 || buildTeam[y][x] == 1) && unitBreak->team == 0)
2825 if((buildTeam[y][x] == 2 || buildTeam[y][x] == 3) && unitBreak->team == 2)
2827 if((buildTeam[y][x] == 4 || buildTeam[y][x] == 5) && unitBreak->team == 1)
2835 possionX = g_target_y;
2836 possionY = g_target_x;
2838 if(unitBreak->team == 0){
2839 buildTeam[y][x] = 0;
2841 if(unitBreak->team == 1){
2842 buildTeam[y][x] = 4;
2844 if(unitBreak->team == 2){
2845 buildTeam[y][x] = 2;
2847 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2848 unitNoMoveStanbyFlag = true;
2855 rdmCnt = rand()%100;
2857 SKILL *ST = unitBreak->C.S;
2858 if(g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0)
2859 while(unitBreak->C.S){
2860 if(unitBreak->C.S->type == 1){
2862 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2863 if(BC[unitBreak->C.S->list[i]-1].type == BC_CHIKURIN){
2864 if(MC[chipNum[g_target_y][g_target_x]].type == MC_CHIKURIN && buildNum[g_target_y][g_target_x] < 0){
2869 rdmCnt2 = rand()%100;
2870 if(rdmCnt2 > 40) continue;
2874 if(unitBreak->team == 0){
2876 }else if(unitBreak->team == 2){
2878 }else if(unitBreak->team == 1){
2882 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
2883 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
2884 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
2887 if(unitBreak->team == 0){
2888 buildTeam[g_target_y][g_target_x] = 0;
2890 if(unitBreak->team == 1){
2891 buildTeam[g_target_y][g_target_x] = 4;
2893 if(unitBreak->team == 2){
2894 buildTeam[g_target_y][g_target_x] = 2;
2898 NSLog(@"[%d, %d]", g_target_x, g_target_y);
2903 possionX = g_target_y;
2904 possionY = g_target_x;
2906 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
2907 buildTeam[possionX][possionY] = unitBreak->team;
2909 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2910 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2911 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2914 //[FS addBuildStatus];
2915 cpuBuildDoneFlag = true;
2916 [self addBuildStatusfix];
2918 unitBreak->C.S = ST;
2919 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2920 unitNoMoveStanbyFlag = true;
2929 rdmCnt = rand()%100;
2932 unitBreak->C.S = unitBreak->C.S->next;
2934 unitBreak->C.S = ST;
2935 if(eval_point > dist){
2962 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2963 unitNoMoveStanbyFlag = true;
2966 if(g_target_x == 0 && g_target_y == 0){
2967 g_target_x = unitBreak->y;
2968 g_target_y = unitBreak->x;
2971 possionX = g_target_y;
2972 possionY = g_target_x;
2974 SKILL *S6T = unitBreak->C.S;
2976 while(unitBreak->C.S){
2977 if(unitBreak->C.S->type == 1){
2978 //FieldScene *FS = [[FieldScene alloc] init];//これが原因
2981 rdmCnt = rand()%100;
2984 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2985 if(BC[unitBreak->C.S->list[i]-1].type == BC_ANTEI){
2986 if(MC[chipNum[possionX][possionY]].type == MC_ANTEI && buildNum[possionX][possionY] < 0){
2989 rdmCnt2 = rand()%100;
2990 if(rdmCnt2 > 40) continue;
2995 if(unitBreak->team == 0){
2997 }else if(unitBreak->team == 2){
2999 }else if(unitBreak->team == 1){
3003 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3004 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3005 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3007 if(unitBreak->team == 0){
3008 buildTeam[possionX][possionY] = 0;
3010 if(unitBreak->team == 1){
3011 buildTeam[possionX][possionY] = 4;
3013 if(unitBreak->team == 2){
3014 buildTeam[possionX][possionY] = 2;
3016 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3018 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3019 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3020 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3022 //[FS addBuildStatus];
3023 cpuBuildDoneFlag = true;
3024 [self addBuildStatusfix];
3026 unitBreak->C.S = S6T;
3027 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3028 unitNoMoveStanbyFlag = true;
3036 rdmCnt = rand()%100;
3039 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
3040 if(BC[unitBreak->C.S->list[i]-1].type == BC_CHIKURIN){
3041 if(MC[chipNum[possionX][possionY]].type == MC_CHIKURIN && buildNum[possionX][possionY] < 0){
3046 rdmCnt2 = rand()%100;
3047 if(rdmCnt2 > 40) continue;
3052 if(unitBreak->team == 0){
3054 }else if(unitBreak->team == 2){
3056 }else if(unitBreak->team == 1){
3060 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3061 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3062 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3065 if(unitBreak->team == 0){
3066 buildTeam[possionX][possionY] = 0;
3068 if(unitBreak->team == 1){
3069 buildTeam[possionX][possionY] = 4;
3071 if(unitBreak->team == 2){
3072 buildTeam[possionX][possionY] = 2;
3075 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3076 buildTeam[possionX][possionY] = unitBreak->team;
3078 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3079 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3080 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3082 //[FS addBuildStatus];
3083 cpuBuildDoneFlag = true;
3084 [self addBuildStatusfix];
3086 unitBreak->C.S = S6T;
3087 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3088 unitNoMoveStanbyFlag = true;
3097 rdmCnt = rand()%100;
3100 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
3101 if(BC[unitBreak->C.S->list[i]-1].type == BC_ASASE){
3102 if(MC[chipNum[possionX][possionY]].type == MC_ASASE && buildNum[possionX][possionY] < 0){
3106 rdmCnt2 = rand()%100;
3107 if(rdmCnt2 > 40) continue;
3111 if(unitBreak->team == 0){
3113 }else if(unitBreak->team == 2){
3115 }else if(unitBreak->team == 1){
3119 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3120 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3121 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3124 if(unitBreak->team == 0){
3125 buildTeam[possionX][possionY] = 0;
3127 if(unitBreak->team == 1){
3128 buildTeam[possionX][possionY] = 4;
3130 if(unitBreak->team == 2){
3131 buildTeam[possionX][possionY] = 2;
3134 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3135 buildTeam[possionX][possionY] = unitBreak->team;
3137 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3138 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3139 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3141 //[FS addBuildStatus];
3142 cpuBuildDoneFlag = true;
3143 [self addBuildStatusfix];
3145 unitBreak->C.S = S6T;
3146 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3147 unitNoMoveStanbyFlag = true;
3155 unitBreak->C.S = unitBreak->C.S->next;
3157 unitBreak->C.S = S6T;
3159 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3160 unitNoMoveStanbyFlag = true;
3164 -(void)atkSelectionFix{
3166 for(int g = 0;g <= chipWidth;g++){
3167 for(int h = 0; h <= chipHeight;h++){
3168 g_attackRangeBeta [h][g] = 0;
3171 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
3174 for (int x = 0; x <= chipWidth;x++) {
3175 for(int y = 0; y <= chipHeight;y++){
3177 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
3180 UA = unitBreak->C.A;
3181 UAT = unitBreak->C.A;
3187 static double mostDmg = 0;
3188 static int mostDmgNum = 0;
3189 static int mostDmgCnt = 0;
3190 if(unitBreak->C.A) {
3192 while (unitBreak->C.A){
3195 double mpCost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
3197 double vigcost = unitBreak->C.A->vigor;
3199 double urSupposedToGet;
3201 if(unitBreak->C.A) urSupposedToGet = pow(8, log(3+unitBreak->C.A->totalD/16));
3205 if(Utarget) asItIs = 1/log(3+Utarget->C.S_C.DEF/64);
3208 double oopsIsRight = 0;
3211 if(unitBreak->C.A->melee){
3212 oopsIsRight = unitBreak->C.S_C.MEL;
3214 oopsIsRight = unitBreak->C.S_C.MIS;
3216 oopsIsRight = oopsIsRight/100;
3218 mpCost = unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5;
3220 if(!Utarget->C.aura && unitBreak->C.A->D){
3221 if(unitBreak->C.A->D->type == 0) theDmg = ((unitBreak->C.S_C.ATK*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3222 - Utarget->C.S_C.DEF*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3223 if(unitBreak->C.A->D->type == 1) theDmg = ((unitBreak->C.S_C.DEF*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3224 - Utarget->C.S_C.ATK*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3225 if(unitBreak->C.A->D->type == 2) theDmg = ((unitBreak->C.S_C.ACU*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3226 - Utarget->C.S_C.EVA*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3227 if(unitBreak->C.A->D->type == 3) theDmg = ((unitBreak->C.S_C.EVA*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3228 - Utarget->C.S_C.ACU*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3229 if(unitBreak->C.A->D->type == 4) theDmg = ((unitBreak->C.S_C.CAP*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3230 - Utarget->C.S_C.CAP*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3231 if(unitBreak->C.A->D->type == 5) theDmg = unitBreak->C.A->totalD;
3232 }else if(unitBreak->C.A->D){
3233 double val = val = 1/log(3+Utarget->C.S_C.MP/64);
3234 if(unitBreak->C.A->D->type == 0) theDmg = ((unitBreak->C.S_C.ATK*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3235 - Utarget->C.S_C.DEF*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3236 if(unitBreak->C.A->D->type == 1) theDmg = ((unitBreak->C.S_C.DEF*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3237 - Utarget->C.S_C.ATK*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3238 if(unitBreak->C.A->D->type == 2) theDmg = ((unitBreak->C.S_C.ACU*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3239 - Utarget->C.S_C.EVA*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3240 if(unitBreak->C.A->D->type == 3) theDmg = ((unitBreak->C.S_C.EVA*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3241 - Utarget->C.S_C.ACU*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3242 if(unitBreak->C.A->D->type == 4) theDmg = ((unitBreak->C.S_C.CAP*unitBreak->C.S_C.HP/unitBreak->C.S_M.HP+urSupposedToGet*unitBreak->C.S_C.vigor/100)*oopsIsRight
3243 - Utarget->C.S_C.CAP*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3244 if(unitBreak->C.A->D->type == 5) theDmg = unitBreak->C.A->totalD*val;
3246 double val2 = log(3+Utarget->C.S_C.MP/64);
3247 if(unitBreak->C.aura){
3248 theDmg = theDmg*val2;
3250 if(unitBreak->C.A->D){
3251 if(U->C.A->D->fix == 2){
3252 theDmg = theDmg/2 + unitBreak->C.S_C.HIT/2;
3254 }else if(U->C.A->D->fix == 1){
3255 theDmg = theDmg/2 + (unitBreak->C.S_C.ATK/2 + unitBreak->C.S_C.HIT)/2/2;
3257 }else if(unitBreak->C.A->D->fix == 0){
3258 theDmg = theDmg/2 + unitBreak->C.S_C.ATK/2;
3261 theDmg = [self dmgResistFix:theDmg];
3263 NSLog(@"%@:%g", unitBreak->C.A->name, theDmg);
3264 if(unitBreak->C.A->rangeB >= unitBreak->atkRange && unitBreak->C.A->rangeA <= unitBreak->atkRange && mpCost <= unitBreak->C.S_C.MP && vigcost <= unitBreak->C.S_C.vigor){
3266 if(mostDmg <= theDmg){
3268 mostDmgNum = mostDmgCnt;
3269 CPUmostDmgChoice = true;
3274 unitBreak->C.A = unitBreak->C.A->next;
3275 }unitBreak->C.A = UAT;
3277 }unitBreak->C.A = UAT;
3279 for(int i = 0;i < mostDmgNum;i++){
3280 unitBreak->C.A = unitBreak->C.A->next;
3282 UA = unitBreak->C.A;
3286 if(UA->rangeB <= 0) {
3287 UA = unitBreak->C.A;
3293 cpuAtkExtendFlag = true;
3300 unitBreak->C.A = UAT;
3302 while (unitBreak->C.A && UA != unitBreak->C.A) {
3303 unitBreak->C.A = unitBreak->C.A->next;
3306 unitBreak->C.A = UAT;
3310 unitBreak->atkRange = UA->rangeB;
3311 //NSLog(@"unitBreak->atkRange %d", unitBreak->atkRange);
3319 -(double)dmgResistFix:(double)DMG{
3321 if(Utarget->C.A->D){
3322 if(unitBreak->C.A->D->seed == 0) DMG = DMG * Utarget->C.R_C.blow/100;
3323 if(unitBreak->C.A->D->seed == 1) DMG = DMG * Utarget->C.R_C.slash/100;
3324 if(unitBreak->C.A->D->seed == 2) DMG = DMG * Utarget->C.R_C.stub/100;
3325 if(unitBreak->C.A->D->seed == 3) DMG = DMG * Utarget->C.R_C.arrow/100;
3326 if(unitBreak->C.A->D->seed == 4) DMG = DMG * Utarget->C.R_C.gun/100;
3327 if(unitBreak->C.A->D->seed == 5) DMG = DMG * Utarget->C.R_C.shell/100;
3329 if(unitBreak->C.A->D->seed == 6) DMG = DMG * Utarget->C.R_C.flame/100;
3330 if(unitBreak->C.A->D->seed == 7) DMG = DMG * Utarget->C.R_C.cold/100;
3331 if(unitBreak->C.A->D->seed == 8) DMG = DMG * Utarget->C.R_C.electoric/100;
3332 if(unitBreak->C.A->D->seed == 9) DMG = DMG * Utarget->C.R_C.air/100;
3333 if(unitBreak->C.A->D->seed == 10) DMG = DMG * Utarget->C.R_C.water/100;
3334 if(unitBreak->C.A->D->seed == 11) DMG = DMG * Utarget->C.R_C.gas/100;
3335 if(unitBreak->C.A->D->seed == 12) DMG = DMG * Utarget->C.R_C.holy/100;
3336 if(unitBreak->C.A->D->seed == 13) DMG = DMG * Utarget->C.R_C.dark/100;
3337 if(unitBreak->C.A->D->seed == 14) DMG = DMG * Utarget->C.R_C.explosion/100;
3338 if(unitBreak->C.A->D->seed == 15) DMG = DMG * Utarget->C.R_C.blood/100;
3340 if(unitBreak->C.A->D->seed == 16) DMG = DMG * Utarget->C.R_C.paralysis/100;
3341 if(unitBreak->C.A->D->seed == 17) DMG = DMG * Utarget->C.R_C.confusion/100;
3342 if(unitBreak->C.A->D->seed == 18) DMG = DMG * Utarget->C.R_C.poison/100;
3343 if(unitBreak->C.A->D->seed == 19) DMG = DMG * Utarget->C.R_C.sleep/100;
3344 if(unitBreak->C.A->D->seed == 20) DMG = DMG * Utarget->C.R_C.charm/100;
3345 if(unitBreak->C.A->D->seed == 21) DMG = DMG * Utarget->C.R_C.silent/100;
3352 for(int g = 0;g <= chipWidth;g++){
3353 for(int h = 0; h <= chipHeight;h++){
3354 g_attackRangeBeta [h][g] = 0;
3357 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
3360 for (int x = 0; x <= chipWidth;x++) {
3361 for(int y = 0; y <= chipHeight;y++){
3363 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
3366 UA = unitBreak->C.A;
3367 UAT = unitBreak->C.A;
3373 while (unitBreak->C.A) {
3374 double mpcost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
3376 double vigcost = unitBreak->C.A->vigor;
3378 if(UA->rangeB <= unitBreak->C.A->rangeB && mpcost <= unitBreak->C.S_C.MP && vigcost <= unitBreak->C.S_C.vigor){
3380 if(unitBreak->C.A->D->sort == 1){
3381 unitBreak->C.A = unitBreak->C.A->next;
3384 UA = unitBreak->C.A;
3387 unitBreak->C.A = unitBreak->C.A->next;
3388 }unitBreak->C.A = UAT;
3393 if(UA->rangeB <= 0) {
3394 UA = unitBreak->C.A;
3400 cpuAtkExtendFlag = true;
3403 while (unitBreak->C.A && UA != unitBreak->C.A) {
3404 unitBreak->C.A = unitBreak->C.A->next;
3406 }unitBreak->C.A = UAT;
3408 unitBreak->atkRange = UA->rangeB;
3409 //NSLog(@"unitBreak->atkRange %d", unitBreak->atkRange);
3410 for(int g = 0;g <= chipWidth;g++){
3411 for(int h = 0; h <= chipHeight;h++){
3412 g_attackRangeAlpha [h][g] = 0;
3416 [self checkAttackRange:x startY:y leftPow:UA->rangeB+1 pieceType:unitBreak->C.S_C.typeMONS aMap:g_attackRangeAlpha aPiece:&unitBreak->C];
3418 for (int j = 0; j <= chipWidth;j++) {
3419 for(int k = 0;k <= chipHeight;k++){
3420 if(g_attackRangeBeta[k][j] < g_attackRangeAlpha[k][j]) g_attackRangeBeta[k][j] = g_attackRangeAlpha[k][j];
3427 -(void)addBuildStatusfix{
3431 while (B->next) {omgCnt++;
3434 B->next = calloc(1, sizeof(BUILD));
3437 if(omgCnt == 0) BTop = B;
3438 B->number = registerNumB;
3441 B->chipNumber = BC[buildNum[possionX][possionY]].chipNumb;
3444 B->C = BC[buildNum[possionX][possionY]];
3445 B->img = [BC[buildNum[possionX][possionY]].img retain];
3446 unitColorInitFlag = true;
3448 if(cpuBuildDoneFlag){
3449 B->C.invisible = true;
3452 if(buildTeam[possionX][possionY] == 0 || buildTeam[possionX][possionY] == 1){
3454 if(unitTeam[possionX][possionY] == 0){
3455 U->joinArmyFromNext = true;
3456 U->persuasion = true;
3459 if(buildTeam[possionX][possionY] == 2 || buildTeam[possionX][possionY] == 3){
3462 if(buildTeam[possionX][possionY] == 4 || buildTeam[possionX][possionY] == 5){
3465 if(buildTeam[possionX][possionY] == -1){
3477 static int waitTimer = 50;
3479 if (waitTimer > 0) {
3486 g_cursol_x = unitBreak->y;
3487 g_cursol_y = unitBreak->x;
3489 if(moveFlag && g_selectRange[possionX][possionY] > 0){
3493 for(int i = 0;i<=chipWidth;i++){
3494 for(int j = 0;j<=chipHeight;j++){
3495 g_map[j][i] = chipNum[j][i];
3496 g_selectRange[j][i] = 0;
3506 if(B->x == wtPx && B->y == wtPy && B->C.capture){
3507 buildCaptureFlag = true;
3518 menuDisplayFlag = false;
3519 Uselected = unitBreak;
3523 -(void)cpuATKextentFunc{
3528 if(attackExtentFlag2 && g_attackRangeExtent[Utarget->x][Utarget->y] > 0){
3529 attackExtentFlag2 = false;
3530 attackExtentFlag = false;
3532 cpuAtkExtendFlag3 = true;
3533 for (int i = 0;i < 255;i++) {
3545 while(U->number != AUN[1]){
3552 static bool okflag = true;
3554 for (int i = 0;i < 1002;i++) {
3555 for (int k = 0;k < 1002;k++) {
3559 if(U->chipNumberL < 0){
3560 [self checkAttackRangeExtent:Utarget->y startY:Utarget->x leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
3562 [self checkAttackRangeExtent:Utarget->y startY:Utarget->x leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
3567 for(int bx=1;bx<=chipWidth;bx++){
3568 for(int by=1;by<=chipHeight;by++){
3569 if(g_attackRangeExtent[bx][by] != 999 && g_attackRangeExtent[bx][by] > 0){
3571 if(g_attackRangeExtent[U->x][U->y] > 0 && attackExceptNumber != U-> number){
3573 if(Unum < Cnum) goto lolzOMFG;
3587 if(UP->x == U->x && UP->y == U->y){
3600 if(!UP) UP = calloc(1, sizeof(UNITPOINT));
3602 while(UP->next) UP = UP->next;
3608 UP->next = calloc(1, sizeof(UNITPOINT));
3626 NSLog(@"%d", DUN[0]);
3628 }else if(attackExtentFlag2){
3629 attackExtentFlag2 = false;
3630 attackExtentFlag = false;
3632 cpuAtkExtendFlag3 = false;
3643 -(void)checkStep:(int)cnsPow tX:(int)startX tY:(int)startY type:(int)pieceType aMap:(int[][1002])aMap{
3647 aMap[startY][startX] = cnsPow;
3649 i0 = cnsPow + g_moveCost[pieceType][g_map[startY-1][startX]];
3650 if(aMap[startY-1][startX] > i0) [self checkStep:i0 tX:startX tY:startY-1 type:pieceType aMap:aMap];
3652 i0 = cnsPow + g_moveCost[pieceType][g_map[startY+1][startX]];
3653 if(aMap[startY+1][startX] > i0) [self checkStep:i0 tX:startX tY:startY+1 type:pieceType aMap:aMap];
3655 i0 = cnsPow + g_moveCost[pieceType][g_map[startY][startX-1]];
3656 if(aMap[startY][startX-1] > i0) [self checkStep:i0 tX:startX-1 tY:startY type:pieceType aMap:aMap];
3658 i0 = cnsPow + g_moveCost[pieceType][g_map[startY][startX+1]];
3659 if(aMap[startY][startX+1] > i0) [self checkStep:i0 tX:startX+1 tY:startY type:pieceType aMap:aMap];
3664 -(void)checkEnemyRange:(int)cnsPow cntNum:(int)cntNum tX:(int)startX tY:(int)startY aMap:(int[][1002])aMap{
3668 aMap[startY][startX] = cnsPow;
3669 //NSLog(@"[%d,%d]%d\n", startY, startX, cnsPow);
3671 if(aMap[startY-1][startX] < i0)
3672 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX tY:startY-1 aMap:aMap];
3675 if(aMap[startY+1][startX] < i0)
3676 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX tY:startY+1 aMap:aMap];
3679 if(aMap[startY][startX-1] < i0)
3680 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX-1 tY:startY aMap:aMap];
3683 if(aMap[startY][startX+1] < i0)
3684 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX+1 tY:startY aMap:aMap];
3690 -(void)mouseUp:(NSEvent *)theEvent{
3694 -(void)loadMesh:(NSMutableArray *)theMapString index:(int)index{
3700 - (void)drawRect:(NSRect)dirtyRect
3703 if(cpuModeMOVEflag && !unitMoveEndFlag && !cpuIsAttackingFlag)
3704 for (int x = 1; x <= chipWidth;x++) {
3705 for(int y = 1;y <= chipHeight;y++){
3707 if(g_selectRange[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3708 [self DrawImage:chipMove x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.8];
3718 for(bx=1;bx<=chipWidth;bx++){
3719 for(by=1;by<=chipHeight;by++){
3720 //[self DrawImage:chip x:(bx-1)*32-1 y:(by-1)*32 cx:bx cy:by f:1.0];
3721 [self DrawImage:MC[chipNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3722 if(buildNum[bx][by] >= 0) {
3725 //[self DrawImage:BC[buildNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3729 if(B->x == bx && B->y == by) break;
3732 if(B && !B->C.invisible) [self DrawImage:B->img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3737 if(g_selectRange[bx][by] > 0 && moveFlag){
3738 [self DrawImage:chipMove x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3739 switch (g_selectRange[bx][by]) {
3741 [self DrawImage:n1 x:bx*32 y:by*32 cx:bx cy:by f:1];
3744 [self DrawImage:n2 x:bx*32 y:by*32 cx:bx cy:by f:1];
3747 [self DrawImage:n3 x:bx*32 y:by*32 cx:bx cy:by f:1];
3750 [self DrawImage:n4 x:bx*32 y:by*32 cx:bx cy:by f:1];
3753 [self DrawImage:n5 x:bx*32 y:by*32 cx:bx cy:by f:1];
3756 [self DrawImage:n6 x:bx*32 y:by*32 cx:bx cy:by f:1];
3759 [self DrawImage:n7 x:bx*32 y:by*32 cx:bx cy:by f:1];
3762 [self DrawImage:n8 x:bx*32 y:by*32 cx:bx cy:by f:1];
3765 [self DrawImage:n9 x:bx*32 y:by*32 cx:bx cy:by f:1];
3768 [self DrawImage:n10 x:bx*32 y:by*32 cx:bx cy:by f:1];
3771 [self DrawImage:n11 x:bx*32 y:by*32 cx:bx cy:by f:1];
3774 [self DrawImage:n12 x:bx*32 y:by*32 cx:bx cy:by f:1];
3777 [self DrawImage:n13 x:bx*32 y:by*32 cx:bx cy:by f:1];
3780 [self DrawImage:n14 x:bx*32 y:by*32 cx:bx cy:by f:1];
3783 [self DrawImage:n15 x:bx*32 y:by*32 cx:bx cy:by f:1];
3786 [self DrawImage:n16 x:bx*32 y:by*32 cx:bx cy:by f:1];
3789 [self DrawImage:n17 x:bx*32 y:by*32 cx:bx cy:by f:1];
3792 [self DrawImage:n18 x:bx*32 y:by*32 cx:bx cy:by f:1];
3795 [self DrawImage:n19 x:bx*32 y:by*32 cx:bx cy:by f:1];
3798 [self DrawImage:n20 x:bx*32 y:by*32 cx:bx cy:by f:1];
3806 if(g_attackRange[bx][by] > 0 && attackFlag){
3807 [self DrawImage:chipAttack x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3811 if((g_attackRangeExtent[bx][by] > 0 && attackExtentFlag) ||
3812 (g_attackRangeExtent[bx][by] > 0 && cpuAtkExtendFlag3)){
3813 [self DrawImage:chipAttack x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3816 if(g_summonRange[bx][by] > 0 && summonFlag){
3817 [self DrawImage:chipSummon x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3820 if(unitNum[bx][by] >= 0 || loadNum[bx][by] >= 0) {
3821 //[self DrawImage:UC[unitNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3826 if(U->x == bx && U->y == by) break;
3830 [self DrawImage:U->img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3837 if((cpuModeATTACKflag && !unitMoveEndFlag && !cpuIsAttackingFlag))
3838 for (int x = 1; x <= chipWidth;x++) {
3839 for(int y = 1;y <= chipHeight;y++){
3841 if(g_attackRangeBeta[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3842 [self DrawImage:chipSelect x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3844 switch(g_attackRangeBeta[y][x]){
3846 [self DrawImage:n1 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3849 [self DrawImage:n2 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3852 [self DrawImage:n3 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3855 [self DrawImage:n4 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3858 [self DrawImage:n5 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3861 [self DrawImage:n6 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3864 [self DrawImage:n7 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3867 [self DrawImage:n8 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3870 [self DrawImage:n9 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3873 [self DrawImage:n10 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3885 if((cpuModeATTACKflag && !unitMoveEndFlag && !cpuIsAttackingFlag && Utarget))
3886 for (int x = 1; x <= chipWidth;x++) {
3887 for(int y = 1;y <= chipHeight;y++){
3890 for (int x = 0; x <= chipWidth; x++) {
3891 for (int y = 0; y <= chipHeight; y++) {
3892 g_attackRangeTheta[y][x] = 0;
3895 [self checkRangeAttack:Utarget->y startY:Utarget->x leftPow:unitBreak->atkRange+1 pieceType:U->C.S_C.typeMONS aMap:g_attackRangeTheta aPiece:&U->C i:unitBreak->atkRange+1 ];
3897 for (int i = 0;i < chipWidth;i++) {
3898 for(int k = 0;k < chipHeight;k++){
3899 if(g_attackRangeTheta[i][k] > 0)
3900 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
3904 if(g_attackRangeTheta[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3905 [self DrawImage:chipSelect x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3907 switch(g_attackRangeTheta[y][x]){
3909 [self DrawImage:n1 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3912 [self DrawImage:n2 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3915 [self DrawImage:n3 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3918 [self DrawImage:n4 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3921 [self DrawImage:n5 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3924 [self DrawImage:n6 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3927 [self DrawImage:n7 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3930 [self DrawImage:n8 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3933 [self DrawImage:n9 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3936 [self DrawImage:n10 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3949 if(cpuIsAttackingFlag || (UA && unitMoveEndFlag)){
3950 for (int x = 1; x <= chipWidth;x++) {
3951 for(int y = 1;y <= chipHeight;y++){
3952 if(g_attackRangeExtent[y][x] > 0)
3953 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3961 if(cpuModeATTACKflag)
3962 for (int x = 0; x <= chipWidth;x++) {
3963 for(int y = 0 ;y <= chipHeight;y++){
3964 if(g_targUnit[y][x] > 0)
3965 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
3970 if(cpuModeATTACKflag)
3971 for (int x = 0; x <= chipWidth;x++) {
3972 for(int y = 0 ;y <= chipHeight;y++){
3973 if(g_visibleRange[y][x] > 0)
3974 [self DrawImage:chipMove x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
3980 for (int x = 0; x <= chipWidth;x++) {
3981 for(int y = 0 ;y <= chipHeight;y++){
3982 if(g_attackRangeBeta[y][x] > 0)
3983 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
3987 //[self DrawImage:UCselected.img x:currentPosX-32 y:currentPosY-32 cx:0 cy:0 f:1.0];
3988 if(Uselected && unitMoveBugFixFlag)
3989 [self DrawImage:Uselected->img x:currentPosX-32 y:currentPosY-32 cx:0 cy:0 f:1.0];
3992 [self DrawImage:chipSelect x:(possionX-1)*32 y:(possionY-1)*32 cx:0 cy:0 f:1.0];
3995 //if(cpuCursolMode) [self DrawImage:chipSelect x:(g_target_y-1)*32 y:(g_target_x-1)*32 cx:0 cy:0 f:1.0];
3997 if(chipTargetFlag) [self DrawImage:chipTarget x:(wtPx-1)*32 y:(wtPy-1)*32 cx:0 cy:0 f:1.0];
3999 if(Utarget && (cpuIsAttackingFlag || (UA && unitMoveEndFlag)))
4000 [self DrawImage:chipUtarg x:(Utarget->x-1)*32 y:(Utarget->y-1)*32 cx:bx cy:by f:1.0];
4001 //[self DrawImage:chipSelect x:(2-1)*32 y:(1-1)*32 cx:0 cy:0 f:1.0];
4004 for(bx=1;bx<=chipWidth;bx++){
4005 for(by=1;by<=chipHeight;by++){
4007 if(waypR[bx][by] != 999 && waypR[bx][by] > 0){
4008 [self DrawImage:chip x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.7];
4017 if(FieldSceneInitFlag){
4019 FieldSceneInitFlag = false;