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];
349 if(B->team < 0) B->img = B->C.img;
351 B->img = [self SetImageColor:B->C.img color:0];
353 B->img = [self SetImageColor:B->C.img color:1];
355 B->img = [self SetImageColor:B->C.img color:2];
359 unitColorInitFlag = false;
366 //if(unitBreak->CPU) cpuTurnEndFlag = false;
375 if(fieldViewBattleInitFlag){
384 if(wcnt >= waitinTime*100){
385 waitAllOverFlag = true;
391 [self setNeedsDisplay:YES];
400 unitNum[unitBreak->x][unitBreak->y] = -1;
401 unitBreak->C.S_C.WT = 999999;
411 -(NSImage*)SetImageColor:(NSImage*)image color:(int)c{
412 NSImage *maskBlue, *maskRed, *maskYellow;
414 maskBlue = [NSImage imageNamed:@"ハイライト(青)"];
415 maskRed = [NSImage imageNamed:@"ハイライト(赤)"];
416 maskYellow = [NSImage imageNamed:@"ハイライト(黄)"];
418 NSImage *img = [NSImage alloc];
423 //[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];
425 [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];
427 [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];
429 [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];
438 [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];
440 [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];
442 [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];
450 [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];
452 [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];
454 [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];
462 -(NSImage*)LoadImage:(NSString*)name{
463 NSImage *image = [NSImage imageNamed:name];
464 if(image == nil) return nil;
465 //[image setFlipped:[self isFlipped]];
470 -(void)DrawImage:(NSImage*)image x:(float)x y:(float)y cx:(int)cx cy:(int)cy f:(float)frac{
472 frRect.size.height = image.size.height;
473 frRect.size.width = image.size.width;
481 drRect.size.height = 32;
482 drRect.size.width = 32;
484 [image drawInRect:drRect fromRect:frRect operation:NSCompositeSourceOver fraction:frac respectFlipped:YES hints:nil];
488 -(void)mouseDown:(NSEvent *)theEvent{
490 if(cpuAtkExtendFlag3 || cpuOMFGmoveATKfixFlag) return;
492 if(!battleBegin) return;
494 if(setBattleModeFlag) return;
496 if(endGameCondition) return;
498 if(waitSwtichFlag) return;
503 if(msgCnt >= msgMax){
506 messageEndFlag = true;
515 pussyLoopFlag = true;
527 if(unitBreak->team == 2){
536 drugPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
538 possionX = (int)drugPoint.x/32+1;
539 possionY = (int)drugPoint.y/32+1;
541 menuDisplayFlag = false;
545 if(attackExtentFlag2 && g_attackRangeExtent[possionX][possionY] > 0){
546 attackExtentFlag2 = false;
547 attackExtentFlag = false;
549 extentBattleFlag = true;
551 for (int i = 0;i < 255;i++) {
563 while(U->number != AUN[1]){
570 static bool okflag = true;
572 for (int i = 0;i < 1002;i++) {
573 for (int k = 0;k < 1002;k++) {
577 if(U->chipNumberL < 0){
578 [self checkAttackRangeExtent:possionY startY:possionX leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
580 [self checkAttackRangeExtent:possionY startY:possionX leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
585 for(int bx=1;bx<=chipWidth;bx++){
586 for(int by=1;by<=chipHeight;by++){
587 if(g_attackRangeExtent[bx][by] != 999 && g_attackRangeExtent[bx][by] > 0){
589 if(g_attackRangeExtent[U->x][U->y] > 0 && attackExceptNumber != U-> number){
591 if(Unum < Cnum) goto lolzOMFG;
605 if(UP->x == U->x && UP->y == U->y){
618 if(!UP) UP = calloc(1, sizeof(UNITPOINT));
620 while(UP->next) UP = UP->next;
626 UP->next = calloc(1, sizeof(UNITPOINT));
644 //NSLog(@"%d", DUN[0]);
646 }else if(attackExtentFlag2){
647 attackExtentFlag2 = false;
648 attackExtentFlag = false;
650 extentBattleFlag = false;
654 if(attackFlag && g_attackRange[possionX][possionY] <= 0){
656 attackExtentFlag2 = false;
657 attackExtentFlag = false;
661 if(attackFlag && g_attackRange[possionX][possionY] > 0){
665 attackExtentFlag2 = true;
666 attackExtentFlag = true;
668 }else if(unitNum[possionX][possionY] >= 0){
670 battleWindowFlag = true;
673 while (AUN[1] != U->number) {
676 ATTACK *aTop = U->C.A;
677 ATTACK *aTop2 = U->CL.A;
678 if(U->chipNumberL < 0){
679 for(int i = 0;i < crCAL;i++){
680 U->C.A = U->C.A->next;
683 for(int i = 0;i < crCAL;i++){
684 U->CL.A = U->CL.A->next;
688 if(U->chipNumberL < 0)
689 U->atkRange = U->C.A->rangeB - g_attackRange[possionX][possionY] + 1;
690 else U->atkRange = U->CL.A->rangeB - g_attackRange[possionX][possionY] + 1;
692 U->atkRange = U->atkRange;
697 while (!(U->x == possionX && U->y == possionY) && U) {
703 wtAttackedFlag = true;
708 if(summonFlag && g_summonRange[possionX][possionY] > 0 && unitNum[possionX][possionY] < 0){
710 summonRdyFlag = true;
717 if(unitNum[possionX][possionY] >= 0){
719 if(!attackFlag && !attackExtentFlag2) atkExtentFlag = false;
721 if(atkExtentFlag) return;
726 menuDisplayFlag = true;
727 unitMoveEndFlag = false;
728 g_cursol_x = 1+(int)drugPoint.y/32;
729 g_cursol_y = 1+(int)drugPoint.x/32;
730 currentPosX = g_cursol_y*32;
731 currentPosY = g_cursol_x*32;
733 UCselected = UC[unitNum[possionX][possionY]];
734 LCselected = LC[loadNum[possionX][possionY]];
738 if(U->x == possionX && U->y == possionY) break;
743 //NSLog(@"%@, %@", U->C.name, U->C.A->name);
748 ///////////////////////////バグフィクス//////////////////////////
750 unitNum[possionX][possionY] = -1;
751 loadNum[possionX][possionY] = -1;
756 if(U->chipNumber >= 0) [self LookupMovableRange:possionY startY:possionX aPiece:&UC[unitNum[possionX][possionY]] turnSide:YES];
757 if(U->chipNumberL >= 0) [self LookupMovableRange2:possionY startY:possionX aPiece:&LC[loadNum[possionX][possionY]] turnSide:YES];
764 if(buildNum[possionX][possionY] >= 0 && unitNum[possionX][possionY] < 0 && !moveFlag){
765 //NSLog(@"くりとりすとおちんちん");
768 if(B->x == possionX && B->y == possionY){
782 if (researchTeam < 0) {
786 buildSelectedFlag = true;
790 if(moveFlag && g_selectRange[possionX][possionY] > 0){
791 g_target_y = possionX;
792 g_target_x = possionY;
796 for(int i = 0;i<=chipWidth;i++){
797 for(int j = 0;j<=chipHeight;j++){
798 g_map[j][i] = chipNum[j][i];
799 g_selectRange[j][i] = 0;
809 if(B->x == possionX && B->y == possionY && B->C.capture){
810 buildCaptureFlag = true;
819 pushStanbyFlag = false;
825 //-----------------------------------------------------------LookupMovableRange
827 // 与えられた位置からの移動可能範囲をg_range配列内に収める
829 //-----------------------------------------------------------------------------
830 -(void)LookupMovableRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
832 if(!aPiece->nameID) return;
834 for(int i = 0;i<=chipWidth;i++){
835 for(int j = 0;j<=chipHeight;j++){
837 g_selectRange[j][i] = 999;
841 for(int i = 1;i<=chipWidth;i++){
842 for(int j = 1;j<=chipHeight;j++){
843 g_map[j][i] = chipNum[j][i];
844 g_selectRange[j][i] = 0;
856 for(int chipType = 0;chipType < 128;chipType++){
857 g_moveCost[MOVETYPE_RIKU][chipType] = MC[chipType].riku;
858 g_moveCost[MOVETYPE_CHU][chipType] = MC[chipType].chu;
859 g_moveCost[MOVETYPE_UMI][chipType] = MC[chipType].umi;
860 g_moveCost[MOVETYPE_SORA][chipType] = MC[chipType].sora;
863 g_selectRange[startY][startX] = aPiece->S_C.MOV+1;
864 //[self excludePiece:turnSide fillInt:99];
865 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
866 //[self excludePiece:turnSide fillInt:0];
867 [self checkRange:startX startY:startY leftPow:aPiece->S_C.MOV+1 pieceType:aPiece->S_C.typeMOVE aMap:g_selectRange];
868 // [self excludePiece:turnSide fillInt:0];
869 // 敵方のコマの位置を移動可能範囲から除外する
870 //[self excludePiece:turnSide fillInt:0];
875 -(void)LookupMovableRange2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
877 if(!aPiece->nameID) return;
879 for(int i = 0;i<=chipWidth;i++){
880 for(int j = 0;j<=chipHeight;j++){
882 g_selectRange[j][i] = 999;
886 for(int i = 1;i<=chipWidth;i++){
887 for(int j = 1;j<=chipHeight;j++){
888 g_map[j][i] = chipNum[j][i];
889 g_selectRange[j][i] = 0;
901 for(int chipType = 0;chipType < 128;chipType++){
902 g_moveCost[MOVETYPE_RIKU][chipType] = MC[chipType].riku;
903 g_moveCost[MOVETYPE_CHU][chipType] = MC[chipType].chu;
904 g_moveCost[MOVETYPE_UMI][chipType] = MC[chipType].umi;
905 g_moveCost[MOVETYPE_SORA][chipType] = MC[chipType].sora;
908 g_selectRange[startY][startX] = aPiece->S_C.MOV+1;
909 //[self excludePiece:turnSide fillInt:99];
910 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
911 [self checkRange2:startX startY:startY leftPow:aPiece->S_C.MOV+1 pieceType:aPiece->S_C.typeMOVE aMap:g_selectRange];
912 //[self excludePiece:turnSide fillInt:0];
913 // 敵方のコマの位置を移動可能範囲から除外する
917 //-----------------------------------------------------------------excludePiece
919 -(void)excludePiece:(BOOL)turnSide fillInt:(int)fillInt
927 for(int x = 1;x <= chipWidth;x++){
928 for(int y = 1;y <= chipHeight;y++){
929 if(g_selectRange[U->x][U->y] > 0 && U->x == y && U->y == x){
930 g_selectRange[U->x][U->y] = fillInt;
936 g_selectRange[Uselected->x][Uselected->y] = 999;
940 //-------------------------------------------------------------------checkRange
942 // 配列の添え字と関数の引数が逆になっていることに要注意
943 -(void)checkRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[1002][1002])aMap{
948 if(Uselected) chipTeam = Uselected->team;
950 if(startX < 0) startX = 0;
951 if(startY < 0) startY = 0;
953 aMap[startY][startX] = leftPow;// 残り移動力
956 i0 = leftPow - g_moveCost[pieceType][g_map[startY-1][startX]]; // 上
958 if(unitNum[startY-1][startX] > -1 && unitTeam[startY-1][startX] != chipTeam){
961 if( aMap[startY-1][startX] < i0 ){
962 [self checkRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap];
966 i0 = leftPow - g_moveCost[pieceType][g_map[startY+1][startX]]; // 下
967 if(unitNum[startY+1][startX] > -1 && unitTeam[startY+1][startX] != chipTeam){
970 if( aMap[startY+1][startX] < i0 ){
971 [self checkRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap];
975 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX-1]]; // 右
976 if(unitNum[startY][startX-1] > -1 && unitTeam[startY][startX-1] != chipTeam){
979 if( aMap[startY][startX-1] < i0 ){
980 [self checkRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
984 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX+1]]; // 左
985 if(unitNum[startY][startX+1] > -1 && unitTeam[startY][startX+1] != chipTeam){
988 if( aMap[startY][startX+1] < i0 ){
989 [self checkRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
994 -(void)checkRange2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[1002][1002])aMap{
999 if(Uselected) chipTeam = Uselected->team;
1001 if(startX < 0) startX = 0;
1002 if(startY < 0) startY = 0;
1004 aMap[startY][startX] = leftPow;// 残り移動力
1007 i0 = leftPow - g_moveCost[pieceType][g_map[startY-1][startX]]; // 上
1009 if(loadNum[startY-1][startX] > -1 && unitTeam[startY-1][startX] != chipTeam){
1012 if( aMap[startY-1][startX] < i0 ){
1013 [self checkRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap];
1017 i0 = leftPow - g_moveCost[pieceType][g_map[startY+1][startX]]; // 下
1018 if(loadNum[startY+1][startX] > -1 && unitTeam[startY+1][startX] != chipTeam){
1021 if( aMap[startY+1][startX] < i0 ){
1022 [self checkRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap];
1026 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX-1]]; // 右
1027 if(loadNum[startY][startX-1] > -1 && unitTeam[startY][startX-1] != chipTeam){
1030 if( aMap[startY][startX-1] < i0 ){
1031 [self checkRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1035 i0 = leftPow - g_moveCost[pieceType][g_map[startY][startX+1]]; // 左
1036 if(loadNum[startY][startX+1] > -1 && unitTeam[startY][startX+1] != chipTeam){
1039 if( aMap[startY][startX+1] < i0 ){
1040 [self checkRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap];
1046 -(void)LookupSummonRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1049 for(int i = 0;i<=chipWidth;i++){
1050 for(int j = 0;j<=chipHeight;j++){
1051 g_summonRange[j][i] = 999;
1052 g_summonRangeDelta[j][i] = 999;
1056 for(int i = 1;i<=chipWidth;i++){
1057 for(int j = 1;j<=chipHeight;j++){
1058 g_summonRange[j][i] = 0;
1059 g_summonRangeDelta[j][i] = 0;
1063 for(int chipType = 0;chipType < 1024;chipType++){
1064 g_attackCost[0][chipType] = 1;
1070 ATTACK *aTop = aPiece->A;
1071 for(int i = 0;i < crCAL;i++){
1072 aPiece->A = aPiece->A->next;
1075 g_summonRange[startY][startX] = 1;
1076 g_summonRangeDelta[startY][startX] = 0;
1077 //attackMaxNum = aPiece->A->rangeB+1;
1079 //[self excludePiece:turnSide fillInt:99];
1080 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1081 [self checkSummonRange:startX startY:startY leftPow:2 pieceType:0 aMap:g_summonRange aPiece:aPiece];
1082 g_summonRange[startY][startX] = 0;
1083 g_summonRangeDelta[startY][startX] = 0;
1085 for(int i = 0;i<=chipWidth;i++){
1086 for(int j = 0;j<=chipHeight;j++){
1087 if(g_summonRangeDelta[i][j] > 0) g_summonRange[i][j] = 0;
1093 //[self excludePiece:turnSide fillInt:0];
1094 // 敵方のコマの位置を移動可能範囲から除外する
1098 -(void)checkSummonRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1101 if(startX < 0) startX = 0;
1102 if(startY < 0) startY = 0;
1104 aMap[startY][startX] = leftPow; // 残り射程の長さ
1106 i0 = leftPow - 1; // 上
1107 if( aMap[startY-1][startX] < i0 ){
1108 [self checkSummonRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1111 i0 = leftPow - 1; // 下
1112 if( aMap[startY+1][startX] < i0 ){
1113 [self checkSummonRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1116 i0 = leftPow - 1; // 右
1117 if( aMap[startY][startX-1] < i0 ){
1118 [self checkSummonRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1121 i0 = leftPow - 1; // 左
1122 if( aMap[startY][startX+1] < i0 ){
1123 [self checkSummonRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1129 -(void)LookupAttackRange:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1132 for(int i = 0;i<=chipWidth;i++){
1133 for(int j = 0;j<=chipHeight;j++){
1134 g_attackRange[j][i] = 999;
1135 g_attackRangeDelta[j][i] = 999;
1139 for(int i = 1;i<=chipWidth;i++){
1140 for(int j = 1;j<=chipHeight;j++){
1141 g_attackRange[j][i] = 0;
1142 g_attackRangeDelta[j][i] = 0;
1146 for(int chipType = 0;chipType < 1024;chipType++){
1147 g_attackCost[0][chipType] = 1;
1159 ATTACK *aTop = aPiece->A;
1160 for(int i = 0;i < crCAL;i++){
1161 aPiece->A = aPiece->A->next;
1164 g_attackRange[startY][startX] = aPiece->A->rangeB;
1165 g_attackRangeDelta[startY][startX] = aPiece->A->rangeA;
1166 attackMaxNum = aPiece->A->rangeB+1;
1168 //[self excludePiece:turnSide fillInt:99];
1169 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1170 if(aPiece->A->rangeB >= 1 && aPiece->A->rangeA >= 0){
1171 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeB+1 pieceType:0 aMap:g_attackRange aPiece:aPiece];
1172 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeA pieceType:1 aMap:g_attackRangeDelta aPiece:aPiece];
1173 g_attackRange[startY][startX] = 0;
1174 g_attackRangeDelta[startY][startX] = 0;
1176 for(int i = 0;i<=chipWidth;i++){
1177 for(int j = 0;j<=chipHeight;j++){
1178 if(g_attackRangeDelta[i][j] > 0) g_attackRange[i][j] = 0;
1182 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1185 [self checkAttackRange:startX startY:startY leftPow:aPiece->A->rangeA+1 pieceType:1 aMap:g_attackRange aPiece:aPiece];
1186 g_attackRange[startY][startX] = 0;
1187 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1192 //[self excludePiece:turnSide fillInt:0];
1193 // 敵方のコマの位置を移動可能範囲から除外する
1197 -(void)LookupAttackRange2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
1200 for(int i = 0;i<=chipWidth;i++){
1201 for(int j = 0;j<=chipHeight;j++){
1202 g_attackRange[j][i] = 999;
1203 g_attackRangeDelta[j][i] = 999;
1207 for(int i = 1;i<=chipWidth;i++){
1208 for(int j = 1;j<=chipHeight;j++){
1209 g_attackRange[j][i] = 0;
1210 g_attackRangeDelta[j][i] = 0;
1214 for(int chipType = 0;chipType < 1024;chipType++){
1215 g_attackCost[0][chipType] = 1;
1227 ATTACK *aTop = aPiece->A;
1228 for(int i = 0;i < crCAL;i++){
1229 aPiece->A = aPiece->A->next;
1232 g_attackRange[startY][startX] = aPiece->A->rangeB;
1233 g_attackRangeDelta[startY][startX] = aPiece->A->rangeA;
1234 attackMaxNum = aPiece->A->rangeB+1;
1236 //[self excludePiece:turnSide fillInt:99];
1237 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1238 if(aPiece->A->rangeB > 1 && aPiece->A->rangeA >= 0){
1239 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeB+1 pieceType:0 aMap:g_attackRange aPiece:aPiece];
1240 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeA pieceType:1 aMap:g_attackRangeDelta aPiece:aPiece];
1241 g_attackRange[startY][startX] = 0;
1242 g_attackRangeDelta[startY][startX] = 0;
1244 for(int i = 0;i<=chipWidth;i++){
1245 for(int j = 0;j<=chipHeight;j++){
1246 if(g_attackRangeDelta[i][j] > 0) g_attackRange[i][j] = 0;
1250 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1253 [self checkAttackRange2:startX startY:startY leftPow:aPiece->A->rangeA+1 pieceType:1 aMap:g_attackRange aPiece:aPiece];
1254 g_attackRange[startY][startX] = 0;
1255 if(aPiece->A->rangeA == 0) g_attackRange[startY][startX] = 10;
1260 //[self excludePiece:turnSide fillInt:0];
1261 // 敵方のコマの位置を移動可能範囲から除外する
1265 -(void)checkAttackRange:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1269 if(Uselected) chipTeam = Uselected->team;
1271 if(startX < 0) startX = 0;
1272 if(startY < 0) startY = 0;
1274 aMap[startY][startX] = leftPow; // 残り射程の長さ
1275 i0 = leftPow - 1; // 上
1276 /*if(unitTeam[startY][startX] == chipTeam){
1277 aMap[startY][startX] = 0;
1280 if( aMap[startY-1][startX] < i0 ){
1281 [self checkAttackRange:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1284 i0 = leftPow - 1; // 下
1285 if( aMap[startY+1][startX] < i0 ){
1286 [self checkAttackRange:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1289 i0 = leftPow - 1; // 右
1290 if( aMap[startY][startX-1] < i0 ){
1291 [self checkAttackRange:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1294 i0 = leftPow - 1; // 左
1295 if( aMap[startY][startX+1] < i0 ){
1296 [self checkAttackRange:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1301 -(void)checkAttackRange2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(LOADCHIP*)aPiece{
1304 if(startX < 0) startX = 0;
1305 if(startY < 0) startY = 0;
1307 aMap[startY][startX] = leftPow; // 残り射程の長さ
1309 i0 = leftPow - 1; // 上
1310 if( aMap[startY-1][startX] < i0 ){
1311 [self checkAttackRange2:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1314 i0 = leftPow - 1; // 下
1315 if( aMap[startY+1][startX] < i0 ){
1316 [self checkAttackRange2:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1319 i0 = leftPow - 1; // 右
1320 if( aMap[startY][startX-1] < i0 ){
1321 [self checkAttackRange2:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1324 i0 = leftPow - 1; // 左
1325 if( aMap[startY][startX+1] < i0 ){
1326 [self checkAttackRange2:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1332 -(void)checkRangeAttack:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece i:(int)i{
1336 if(startX < 0) startX = 0;
1337 if(startY < 0) startY = 0;
1339 aMap[startY][startX] = leftPow; // 残り射程の長さ
1341 i0 = leftPow - 1; // 上
1342 if( aMap[startY-1][startX] < i0 ){
1343 [self checkRangeAttack:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1346 i0 = leftPow - 1; // 下
1347 if( aMap[startY+1][startX] < i0 ){
1348 [self checkRangeAttack:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1351 i0 = leftPow - 1; // 右
1352 if( aMap[startY][startX-1] < i0 ){
1353 [self checkRangeAttack:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1356 i0 = leftPow - 1; // 左
1357 if( aMap[startY][startX+1] < i0 ){
1358 [self checkRangeAttack:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece i:i];
1364 -(void)LookupAttackRangeExtent:(int)startX startY:(int)startY aPiece:(UNITCHIP*)aPiece turnSide:(BOOL)turnSide
1367 for(int i = 0;i<=chipWidth;i++){
1368 for(int j = 0;j<=chipHeight;j++){
1369 g_attackRangeExtent[j][i] = 999;
1373 for(int i = 1;i<=chipWidth;i++){
1374 for(int j = 1;j<=chipHeight;j++){
1375 g_attackRangeExtent[j][i] = 0;
1379 for(int chipType = 0;chipType < 1024;chipType++){
1380 g_attackCost[0][chipType] = 1;
1392 ATTACK *aTop = aPiece->A;
1393 for(int i = 0;i < crCAL;i++){
1394 aPiece->A = aPiece->A->next;
1397 g_attackRangeExtent[startY][startX] = aPiece->A->extent;
1398 attackMaxNum = aPiece->A->extent;
1400 //[self excludePiece:turnSide fillInt:99];
1401 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1404 [self checkAttackRangeExtent:startX startY:startY leftPow:aPiece->A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:aPiece];
1408 //[self excludePiece:turnSide fillInt:0];
1409 // 敵方のコマの位置を移動可能範囲から除外する
1413 -(void)checkAttackRangeExtent:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(UNITCHIP*)aPiece{
1417 if(Uselected) chipTeam = Uselected->team;
1419 if(startX < 0) startX = 0;
1420 if(startY < 0) startY = 0;
1422 aMap[startY][startX] = leftPow; // 残り射程の長さ
1423 i0 = leftPow - 1; // 上
1424 /*if(unitTeam[startY][startX] == chipTeam){
1425 aMap[startY][startX] = 0;
1428 if( aMap[startY-1][startX] < i0 ){
1429 [self checkAttackRangeExtent:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1432 i0 = leftPow - 1; // 下
1433 if( aMap[startY+1][startX] < i0 ){
1434 [self checkAttackRangeExtent:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1437 i0 = leftPow - 1; // 右
1438 if( aMap[startY][startX-1] < i0 ){
1439 [self checkAttackRangeExtent:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1442 i0 = leftPow - 1; // 左
1443 if( aMap[startY][startX+1] < i0 ){
1444 [self checkAttackRangeExtent:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1449 -(void)LookupAttackRangeExtent2:(int)startX startY:(int)startY aPiece:(LOADCHIP*)aPiece turnSide:(BOOL)turnSide
1452 for(int i = 0;i<=chipWidth;i++){
1453 for(int j = 0;j<=chipHeight;j++){
1454 g_attackRangeExtent[j][i] = 999;
1458 for(int i = 1;i<=chipWidth;i++){
1459 for(int j = 1;j<=chipHeight;j++){
1460 g_attackRangeExtent[j][i] = 0;
1464 for(int chipType = 0;chipType < 1024;chipType++){
1465 g_attackCost[0][chipType] = 1;
1477 ATTACK *aTop = aPiece->A;
1478 for(int i = 0;i < crCAL;i++){
1479 aPiece->A = aPiece->A->next;
1482 g_attackRangeExtent[startY][startX] = aPiece->A->extent;
1483 attackMaxNum = aPiece->A->extent;
1485 //[self excludePiece:turnSide fillInt:99];
1486 // 敵方のコマを迂回させるため、マップ移動最大値を詰め込む
1489 [self checkAttackRangeExtent2:startX startY:startY leftPow:aPiece->A->extent pieceType:1 aMap:g_attackRange aPiece:aPiece];
1490 g_attackRangeExtent[startY][startX] = 0;
1494 //[self excludePiece:turnSide fillInt:0];
1495 // 敵方のコマの位置を移動可能範囲から除外する
1499 -(void)checkAttackRangeExtent2:(int)startX startY:(int)startY leftPow:(int)leftPow pieceType:(int)pieceType aMap:(int[][1002])aMap aPiece:(LOADCHIP*)aPiece{
1503 if(Uselected) chipTeam = Uselected->team;
1505 if(startX < 0) startX = 0;
1506 if(startY < 0) startY = 0;
1508 aMap[startY][startX] = leftPow; // 残り射程の長さ
1509 i0 = leftPow - 1; // 上
1510 /*if(unitTeam[startY][startX] == chipTeam){
1511 aMap[startY][startX] = 0;
1514 if( aMap[startY-1][startX] < i0 ){
1515 [self checkAttackRangeExtent2:startX startY:startY - 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1518 i0 = leftPow - 1; // 下
1519 if( aMap[startY+1][startX] < i0 ){
1520 [self checkAttackRangeExtent2:startX startY:startY + 1 leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1523 i0 = leftPow - 1; // 右
1524 if( aMap[startY][startX-1] < i0 ){
1525 [self checkAttackRangeExtent2:startX - 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1528 i0 = leftPow - 1; // 左
1529 if( aMap[startY][startX+1] < i0 ){
1530 [self checkAttackRangeExtent2:startX + 1 startY:startY leftPow:i0 pieceType:pieceType aMap:aMap aPiece:aPiece];
1537 for(int g = 0;g <= chipWidth;g++){
1538 for(int h = 0; h <= chipHeight;h++){
1539 g_attackRangeBeta [h][g] = 0;
1542 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
1545 for (int x = 0; x <= chipWidth;x++) {
1546 for(int y = 0; y <= chipHeight;y++){
1548 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
1551 UA = unitBreak->C.A;
1552 UAT = unitBreak->C.A;
1558 while (unitBreak->C.A) {
1559 double mpcost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
1561 double vigcost = unitBreak->C.A->vigor;
1563 if(UA->rangeB <= unitBreak->C.A->rangeB && mpcost <= unitBreak->C.S_C.MP && vigcost <= unitBreak->C.S_C.vigor){
1565 UA = unitBreak->C.A;
1568 unitBreak->C.A = unitBreak->C.A->next;
1569 }unitBreak->C.A = UAT;
1574 if(UA->rangeB <= 0) {
1575 UA = unitBreak->C.A;
1581 cpuAtkExtendFlag = true;
1584 while (unitBreak->C.A && UA != unitBreak->C.A) {
1585 unitBreak->C.A = unitBreak->C.A->next;
1587 }unitBreak->C.A = UAT;
1589 unitBreak->atkRange = UA->rangeB;
1591 for(int g = 0;g <= chipWidth;g++){
1592 for(int h = 0; h <= chipHeight;h++){
1593 g_attackRangeAlpha [h][g] = 0;
1597 [self checkAttackRange:x startY:y leftPow:UA->rangeB+1 pieceType:unitBreak->C.S_C.typeMONS aMap:g_attackRangeAlpha aPiece:&unitBreak->C];
1599 for (int j = 0; j <= chipWidth;j++) {
1600 for(int k = 0;k <= chipHeight;k++){
1601 if(g_attackRangeBeta[k][j] < g_attackRangeAlpha[k][j]) g_attackRangeBeta[k][j] = g_attackRangeAlpha[k][j];
1611 //-------------------------------------------------------------------searchRute
1615 // ルートテンポラリとルートバッファの初期化
1616 for( i0 = 0; i0 < 2100; i0++ )
1617 { g_tmpRoute[i0][0] = 0; g_tmpRoute[i0][1] = 0; g_moveRoute[i0][0] = 0;
1618 g_moveRoute[i0][1] = 0; }
1620 for(int i = 0;i < 2100;i++){// テンポラリマップのゼロリセット
1621 for(int j = 0;j< 2100;j++){
1625 g_stackPointer = 0; // スタックポインタ初期化
1626 g_shallowDepth = 1002; //「最も浅いスタック」を持たせるために、// 最も深い値を与えておく
1628 [self checkRoute:g_cursol_x startY:g_cursol_y];
1633 while( i0 < g_shallowDepth)
1635 g_tmpMap[g_moveRoute[i0][1]][g_moveRoute[i0][0]] = 1;
1641 //-------------------------------------------------------------------checkRout
1642 -(void)checkRoute:(int)startX startY:(int)startY{
1645 g_tmpMap[startY][startX]=1;
1646 g_tmpRoute[g_stackPointer][0] = startX;
1647 g_tmpRoute[g_stackPointer][1] = startY;
1650 // ターゲットに到達したとき、スタック深度が今までより浅かったらそれを保存する
1651 if((( g_target_x == startX )&&( g_target_y == startY )&&( g_stackPointer < g_shallowDepth )))
1653 g_shallowDepth = g_stackPointer; // 最浅スタック深度更新
1655 for( j0 = 0; j0 < g_shallowDepth; j0++ ) {
1656 g_moveRoute[j0][0] = g_tmpRoute[j0][0];
1657 g_moveRoute[j0][1] = g_tmpRoute[j0][1];
1662 // 配列の添え字と関数の引数が逆になっていることに要注意
1663 i0 = g_selectRange[startY][startX];
1664 if(g_selectRange[startY-1][startX] > 0)
1665 if(( g_selectRange[startY-1][startX] < i0 )&&(g_tmpMap[startY-1][startX] == 0 )
1667 [self checkRoute:startX startY:startY -1];
1669 if(g_selectRange[startY+1][startX] > 0)
1670 if(( g_selectRange[startY+1][startX] < i0 )&&(g_tmpMap[startY+1][startX] == 0 )
1672 [self checkRoute:startX startY:startY +1];
1674 if(g_selectRange[startY][startX-1] > 0)
1675 if(( g_selectRange[startY][startX-1] < i0 )&&(g_tmpMap[startY][startX-1] == 0 )
1677 [self checkRoute:startX-1 startY:startY];
1679 if(g_selectRange[startY][startX+1] > 0)
1680 if(( g_selectRange[startY][startX+1] < i0 )&&(g_tmpMap[startY][startX+1] == 0 )
1682 [self checkRoute:startX+1 startY:startY];
1685 g_stackPointer--; // スタックから捨てる
1686 //g_tmpMap[startY][startX] = 0; // 別経路探索のため
1691 //-------------------------------------------------------------------searchRute
1692 -(void)searchRoute2{
1695 // ルートテンポラリとルートバッファの初期化
1696 for( i0 = 0; i0 < 2100; i0++ )
1697 { g_tmpRoute2[i0][0] = 0; g_tmpRoute2[i0][1] = 0; g_moveRoute2[i0][0] = 0;
1698 g_moveRoute2[i0][1] = 0; }
1700 for(int i = 0;i < 2100;i++){// テンポラリマップのゼロリセット
1701 for(int j = 0;j< 2100;j++){
1702 g_tmpMap2[j][i] = 0;
1705 g_stackPointer = 0; // スタックポインタ初期化
1706 g_shallowDepth = 1002; //「最も浅いスタック」を持たせるために、// 最も深い値を与えておく
1708 [self checkRoute:g_cursol_x startY:g_cursol_y];
1713 while( i0 < g_shallowDepth)
1715 g_tmpMap2[g_moveRoute2[i0][1]][g_moveRoute2[i0][0]] = 1;
1721 //-------------------------------------------------------------------checkRout
1722 -(void)checkRoute2:(int)startX startY:(int)startY{
1725 g_tmpMap2[startY][startX]=1;
1726 g_tmpRoute2[g_stackPointer][0] = startX;
1727 g_tmpRoute2[g_stackPointer][1] = startY;
1730 // ターゲットに到達したとき、スタック深度が今までより浅かったらそれを保存する
1731 if((( g_target_x == startX )&&( g_target_y == startY )&&( g_stackPointer < g_shallowDepth ))|| ((cpuTargX == startX ) && (cpuTargY == startY)))
1733 g_shallowDepth = g_stackPointer; // 最浅スタック深度更新
1735 for( j0 = 0; j0 < g_shallowDepth; j0++ ) {
1736 g_moveRoute2[j0][0] = g_tmpRoute2[j0][0];
1737 g_moveRoute2[j0][1] = g_tmpRoute2[j0][1];
1742 // 配列の添え字と関数の引数が逆になっていることに要注意
1743 i0 = g_selectRange[startY][startX];
1744 if(g_selectRange[startY-1][startX] > 0)
1745 if(( g_selectRange[startY-1][startX] < i0 )&&(g_tmpMap2[startY-1][startX] == 0 )
1747 [self checkRoute:startX startY:startY -1];
1749 if(g_selectRange[startY+1][startX] > 0)
1750 if(( g_selectRange[startY+1][startX] < i0 )&&(g_tmpMap2[startY+1][startX] == 0 )
1752 [self checkRoute:startX startY:startY +1];
1754 if(g_selectRange[startY][startX-1] > 0)
1755 if(( g_selectRange[startY][startX-1] < i0 )&&(g_tmpMap2[startY][startX-1] == 0 )
1757 [self checkRoute:startX-1 startY:startY];
1759 if(g_selectRange[startY][startX+1] > 0)
1760 if(( g_selectRange[startY][startX+1] < i0 )&&(g_tmpMap2[startY][startX+1] == 0 )
1762 [self checkRoute:startX+1 startY:startY];
1765 g_stackPointer--; // スタックから捨てる
1766 //g_tmpMap[startY][startX] = 0; // 別経路探索のため
1786 static int cpuMODE = MODE_CPU_IDLE;
1796 if(unitMoveEndFlag){
1797 pushStanbyFlag = true;
1799 cpuIsAttackingFlag = false;
1802 if(setBattleModeFlag)
1807 if(endGameCondition)
1809 if(battleFlag || battleRdy || battleSetUp)
1813 unitMoveEndFlag = false;
1814 CPUAttackFlag = false;
1815 CPUAttackFlag2 = false;
1816 if(cpuAImodeflag && unitBreak->C.nameID)
1817 cpuMODE = MODE_CPU_SEARCH;
1818 possionX = unitBreak->x;
1819 possionY = unitBreak->y;
1820 currentPosX = possionX;
1821 currentPosY = possionY;
1822 Uselected = unitBreak;
1824 case MODE_CPU_SEARCH:
1825 pushStanbyFlag = false;
1827 [self cpuSearchEnemy];
1828 if(Utarget) NSLog(@"Utarg %d", Utarget->number);
1829 else NSLog(@"Utarg NULL");
1830 cpuModeMOVEflag = true;
1831 if(unitNoMoveStanbyFlag){
1832 static int waitTimer = 50;
1833 cpuModeATTACKflag = true;
1834 if (waitTimer > 0) {
1839 unitNoMoveFlag = true;
1842 while (U->number != wtUnitNum) {
1846 if(!wtMovedFlag && !wtAttackedFlag && unitNoMoveFlag){
1847 U->C.S_C.WT = floor(U->C.S_M.WT/4 + 0.5);
1848 }else if(wtMovedFlag && wtAttackedFlag){
1849 U->C.S_C.WT = floor(U->C.S_M.WT + 0.5);
1850 }else if(wtMovedFlag){
1851 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
1852 }else if(wtAttackedFlag){
1853 U->C.S_C.WT = floor(U->C.S_M.WT/2 + 0.5);
1860 if(B->x == wtPx && B->y == wtPy && B->C.capture){
1861 buildCaptureFlag = true;
1862 unitMoveEndFlag = true;
1866 pushStanbyFlag = true;
1868 cpuModeMOVEflag = false;
1869 cpuModeATTACKflag = false;
1870 cpuAImodeflag = false;
1874 CPUAttackFlag = false;
1875 CPUAttackFlag2 = false;
1877 unitNoMoveStanbyFlag = false;
1879 cpuMODE = MODE_CPU_BUILD;
1886 cpuMODE = MODE_CPU_MOVE;
1888 wtMovedFlag = false;
1889 cpuModeATTACKflag = true;
1890 CPUAttackFlag = true;
1891 cpuMODE = MODE_CPU_ATTACK;
1896 cpuModeATTACKflag = true;
1899 if ([self cpuMoveFunc] && unitMoveEndFlag) {
1900 cpuMODE = MODE_CPU_ATTACK;
1902 // NSLog(@"test[%d,%d][%d,%d]", unitBreak->x, unitBreak->y, possionX, possionY);
1903 // NSLog(@"test[%d]", unitNoMoveFlag);
1904 possionX = g_target_y;
1905 possionY = g_target_x;
1907 if(CPUAttackFlag && Utarget){
1908 cpuMODE = MODE_CPU_ATTACK;
1910 cpuMODE = MODE_CPU_BUILD;
1915 case MODE_CPU_ATTACK:
1918 cpuMODE = MODE_CPU_BUILD;
1919 CPUAttackFlag = false;
1924 cpuMODE = MODE_CPU_BUILD;
1928 //unitNoMoveFlag = false;
1929 CPUAttackFlag = true;
1930 unitCPUAttackFlag = true;
1931 cpuMODE = MODE_CPU_BATTLE;
1935 case MODE_CPU_BATTLE:
1937 if(cpuModeBATTLEendFlag){
1940 if(cpuModeBATTLEendFlag){
1942 static int waitTimer0 = 50;
1944 if (waitTimer0 > 0) {
1949 pushStanbyFlag = true;
1951 cpuModeMOVEflag = false;
1952 cpuModeATTACKflag = false;
1953 cpuAImodeflag = false;
1955 //stanbyFlag = true;
1957 CPUAttackFlag2 = false;
1958 battleWindowFlag = true;
1960 cpuModeBATTLEendFlag = false;
1961 cpuOMFGmoveATKfixFlag = false;
1962 cpuMODE = MODE_CPU_EMPLOY;
1968 else if((CPUAttackFlag && unitMoveEndFlag )|| CPUAttackFlag2){
1970 static int waitTimer = 50;
1972 if (waitTimer > 0) {
1977 if(!cpuAtkExtendFlag){
1978 CPUAttackSubmitFlag = true;
1979 battleWindowFlag = true;
1980 cpuModeBATTLEflag = true;
1982 CPUAttackFlag2 = false;
1984 CPUAttackSubmitFlag = true;
1985 battleWindowFlag = false;
1986 cpuModeBATTLEflag = true;
1988 CPUAttackFlag2 = false;
1989 cpuAtkExtendFlag = false;
1990 cpuAtkExtendFlag2 = true;
1991 cpuOMFGmoveATKfixFlag = true;
1999 cpuMODE = MODE_CPU_EMPLOY;
2002 case MODE_CPU_BUILD:
2006 if(B->x == possionX && B->y == possionY)
2011 SKILL *ST = unitBreak->C.S;
2015 if(unitBreak->team == 0){
2017 }else if(unitBreak->team == 2){
2019 }else if(unitBreak->team == 1){
2023 if(cpuBuildDoneFlag){
2026 while(unitBreak->C.S){
2027 if(unitBreak->C.S->type == 1){
2028 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2030 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2031 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2032 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2037 unitBreak->C.S = unitBreak->C.S->next;
2038 }unitBreak->C.S = ST;
2041 B->C.invisible = false;
2042 cpuBuildDoneFlag = false;
2043 cpuMODE = MODE_CPU_EMPLOY;
2044 }else if(wtMovedFlag){
2046 while(unitBreak->C.S){
2047 if(unitBreak->C.S->type == 1){
2048 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2050 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2051 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2052 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2057 unitBreak->C.S = unitBreak->C.S->next;
2058 }unitBreak->C.S = ST;
2059 NSLog(@"BTop %@", BTop->C.name);
2060 B->C.invisible = false;
2061 cpuBuildDoneFlag = false;
2062 cpuMODE = MODE_CPU_EMPLOY;
2063 }else if(unitMoveEndFlag){
2065 while(unitBreak->C.S){
2066 if(unitBreak->C.S->type == 1){
2067 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2069 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2070 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2071 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2076 unitBreak->C.S = unitBreak->C.S->next;
2077 }unitBreak->C.S = ST;
2079 B->C.invisible = false;
2080 cpuBuildDoneFlag = false;
2081 cpuMODE = MODE_CPU_EMPLOY;
2088 cpuMODE = MODE_CPU_EMPLOY;
2090 case MODE_CPU_EMPLOY:
2091 [self cpuEmployment];
2092 cpuMODE = MODE_CPU_STANBY;
2094 case MODE_CPU_STANBY:
2097 CPUAttackFlag = false;
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{
2262 while (U->next) {omgCnt++;
2265 U->next = calloc(1, sizeof(UNIT));
2268 if(omgCnt == 0) UTop = U;
2269 U->number = registerNum;
2271 for(int i = 0;i < UCN;i++){
2272 if([U->C.nameID isEqualToString:UC[i].nameID])
2276 U->chipNumber = unitNum[possionX][possionY];
2277 U->chipNumberL = loadNum[possionX][possionY];
2278 U->C.chipNumb = unitNum[possionX][possionY];
2279 U->CL.chipNumb = loadNum[possionX][possionY];
2283 if(unitTeam[possionX][possionY] == 0 || unitTeam[possionX][possionY] == 1){
2285 if(unitTeam[possionX][possionY] == 1){
2286 U->joinArmyFromNext = true;
2287 U->persuasion = true;
2289 if(MF[MFselectedRow+1].MS.playerSet1 == 2){
2293 if(unitTeam[possionX][possionY] == 2 || unitTeam[possionX][possionY] == 3){
2295 if(unitTeam[possionX][possionY] == 3){
2296 U->joinArmyFromNext = true;
2297 U->persuasion = true;
2299 if(MF[MFselectedRow+1].MS.playerSet2 == 2){
2303 if(unitTeam[possionX][possionY] == 4 || unitTeam[possionX][possionY] == 5){
2305 if(unitTeam[possionX][possionY] == 5){
2306 U->joinArmyFromNext = true;
2307 U->persuasion = true;
2311 if(unitTeam[possionX][possionY] == -1){
2313 if(unitTeam[possionX][possionY] == 0){
2314 U->joinArmyFromNext = false;
2315 U->persuasion = true;
2319 [self SetUnitStatusFix:unitNum[possionX][possionY]];
2320 unitColorInitFlag = true;
2325 -(void)SetUnitStatusFix:(int)UN{
2328 U->C.S_C.vigor = 100;
2335 AtopE1 = UC[UN].eHandL.A;
2336 AtopE2 = UC[UN].eHandR.A;
2337 U->C.A = calloc(1, sizeof(ATTACK));
2343 while(UC[UN].eHandR.A != NULL){ow1 = true;
2344 *U->C.A = *UC[UN].eHandR.A;
2345 U->C.A->next = calloc(1, sizeof(ATTACK));
2346 U->C.A->next->next = NULL;
2347 if(UC[UN].eHandR.A->next != NULL) U->C.A = U->C.A->next;
2348 UC[UN].eHandR.A = UC[UN].eHandR.A->next;
2349 U->C.attackListNum++;
2351 UC[UN].eHandR.A = AtopE2;
2355 U->C.A = U->C.A->next;
2358 while(UC[UN].eHandL.A != NULL){ow2 = true;
2359 *U->C.A = *UC[UN].eHandL.A;
2360 U->C.A->next = calloc(1, sizeof(ATTACK));
2361 U->C.A->next->next = NULL;
2362 if(UC[UN].eHandL.A->next != NULL) U->C.A = U->C.A->next;
2363 UC[UN].eHandL.A = UC[UN].eHandL.A->next;
2364 U->C.attackListNum++;
2366 UC[UN].eHandL.A = AtopE1;
2369 U->C.A = U->C.A->next;
2372 while(UC[UN].A != NULL){
2373 *U->C.A = *UC[UN].A;
2374 U->C.A->next = calloc(1, sizeof(ATTACK));
2375 U->C.A->next->next = NULL;
2376 if(UC[UN].A->next != NULL) U->C.A = U->C.A->next;
2377 UC[UN].A = UC[UN].A->next;
2379 U->C.A->next = NULL;
2382 if(U->C.A) if(!U->C.A->name)
2387 -(void)cpuSearchEnemy{
2389 if(!unitBreak->C.nameID) return;
2394 unitMoveEndFlag = false;
2395 possionX = unitBreak->x;
2396 possionY = unitBreak->y;
2398 UCselected = UC[unitNum[unitBreak->x][unitBreak->y]];
2399 LCselected = LC[loadNum[unitBreak->x][unitBreak->y]];
2401 if(unitBreak->chipNumber >= 0) [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&UC[unitNum[unitBreak->x][unitBreak->y]] turnSide:YES];
2402 if(unitBreak->chipNumberL >= 0) [self LookupMovableRange2:unitBreak->y startY:unitBreak->x aPiece:&LC[loadNum[unitBreak->x][unitBreak->y]] turnSide:YES];
2404 for (int x = 0; x <= chipWidth; x++) {
2405 for (int y = 0; y <= chipHeight; y++) {
2406 g_targUnit[y][x] = 0;
2410 for (int x = 0; x <= chipWidth; x++) {
2411 for (int y = 0; y <= chipHeight; y++) {
2412 g_entireUnit[y][x] = 0;
2417 for (int x = 0; x <= chipWidth; x++) {
2418 for (int y = 0; y <= chipHeight; y++) {
2423 if(U->y == x && U->x == y){
2424 g_entireUnit[y][x] = 1;
2431 for (int x = 0; x <= chipWidth; x++) {
2432 for (int y = 0; y <= chipHeight; y++) {
2437 if(g_attackRangeBeta[y][x] > 0 && U->y == x && U->x == y){
2438 g_targUnit[y][x] = 1;
2449 CPUAttackFlag = false;
2450 CPUAttackFlag2 = false;
2459 for (int x = 0; x <= chipWidth; x++) {
2460 for (int y = 0; y <= chipHeight; y++) {
2461 g_attackRangeTheta[y][x] = 0;
2464 [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 ];
2466 for (int i = 1;i <= chipWidth;i++) {
2467 for(int k = 1;k <= chipHeight;k++){
2468 if(g_attackRangeTheta[i][k] > 0)
2469 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2474 ATTACK *AT = unitBreak->C.A;
2475 for(int i = 0;i < crCAL1;i++){
2480 if(g_attackRangeTheta[unitBreak->x][unitBreak->y] > 0 && !U->dead && AT->D->sort == 1){
2482 if(unitBreak->team == 2){
2483 if(U->team == 2 && unitBreak->team == 2){
2491 if(unitBreak->team == 0 || unitBreak->team == 1){
2492 if(((U->team == 1 && unitBreak->team == 0) || (U->team == 0 && unitBreak->team == 1) ||
2493 (U->team == 0 && unitBreak->team == 0) || (U->team == 1 && unitBreak->team == 1))
2502 //NSLog(@"HP %g HPH %g", U->C.S_C.HP, U->C.S_M.HP*70/100);
2503 if(AT->D->sort == 1 && U->C.S_C.HP <= U->C.S_M.HP*70/100){
2509 AUN[1] = unitBreak->number;
2512 unitBreak->atkRange = g_attackRangeTheta[unitBreak->x][unitBreak->y];
2513 g_target_x = unitBreak->y;
2514 g_target_y = unitBreak->x;
2515 unitNoMoveFlag = true;
2516 CPUAttackFlag = true;
2517 CPUAttackFlag2 = true;
2518 cpuIsAttackingFlag = true;
2526 if(!U->dead && AT->D->sort == 1){
2528 if(unitBreak->team == 2){
2529 if(U->team == 2 && unitBreak->team == 2){
2538 if(unitBreak->team == 0 || unitBreak->team == 1){
2539 if(((U->team == 1 && unitBreak->team == 0) || (U->team == 0 && unitBreak->team == 1) ||
2540 (U->team == 0 && unitBreak->team == 0) || (U->team == 1 && unitBreak->team == 1))
2551 // NSLog(@"HP %g HPH %g", U->C.S_C.HP, U->C.S_M.HP*70/100);
2552 if(U->C.S_C.HP <= U->C.S_M.HP*70/100){
2558 for (int x = 1; x <= chipWidth; x++) {
2559 for (int y = 1; y <= chipHeight; y++) {
2560 if(g_attackRangeTheta[y][x] > 0 && g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0
2561 && g_attackRangeTheta[y][x] == unitBreak->atkRange){
2564 int point = (unitBreak->atkRange - g_attackRangeBeta[y][x])*20 + g_selectRange[y][x]*50;
2566 if(eval_point < point){
2569 unitBreak->atkRange = g_attackRangeTheta[y][x];
2572 CPUAttackFlag = true;
2573 AUN[1] = unitBreak->number;
2589 ATTACK *AT = unitBreak->C.A;
2590 for(int i = 0;i < crCAL1;i++){
2595 [self healBreak];//回復の対象がいない時、回復以外にする
2606 for (int x = 0; x <= chipWidth; x++) {
2607 for (int y = 0; y <= chipHeight; y++) {
2608 g_attackRangeTheta[y][x] = 0;
2611 [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 ];
2613 for (int i = 1;i <= chipWidth;i++) {
2614 for(int k = 1;k <= chipHeight;k++){
2615 if(g_attackRangeTheta[i][k] > 0)
2616 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2620 ATTACK *AT = unitBreak->C.A;
2621 for(int i = 0;i < crCAL1;i++){
2626 if(g_attackRangeTheta[unitBreak->x][unitBreak->y] > 0 && !U->dead &&
2627 unitBreak->team != U->team && AT->D->sort != 1){
2629 if(unitBreak->team == 0)
2632 if(unitBreak->team == 1)
2637 AUN[1] = unitBreak->number;
2639 bool rangeChanged = false;
2640 if(unitBreak->atkRange != g_attackRangeTheta[unitBreak->x][unitBreak->y]){
2642 rangeChanged = true;
2646 unitBreak->atkRange = g_attackRangeTheta[unitBreak->x][unitBreak->y];
2648 g_target_x = unitBreak->y;
2649 g_target_y = unitBreak->x;
2650 unitNoMoveFlag = true;
2651 CPUAttackFlag = true;
2652 CPUAttackFlag2 = true;
2653 cpuIsAttackingFlag = true;
2656 [self atkSelectionFix];
2665 if(!U->dead && unitBreak->team != U->team && unitBreak->C.A->D->sort != 1){
2667 if(unitBreak->team == 0)
2670 if(unitBreak->team == 1)
2674 for (int x = 1; x <= chipWidth; x++) {
2675 for (int y = 1; y <= chipHeight; y++) {
2676 if(g_attackRangeTheta[y][x] > 0 && g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0
2677 && g_attackRangeTheta[y][x] == unitBreak->atkRange){
2680 int point = (unitBreak->atkRange - g_attackRangeBeta[y][x])*20 + g_selectRange[y][x]*50;
2682 if(eval_point < point){
2686 bool rangeChanged = false;
2687 if(unitBreak->atkRange != g_attackRangeTheta[y][x]){
2689 rangeChanged = true;
2692 unitBreak->atkRange = g_attackRangeTheta[y][x];
2695 [self atkSelectionFix];
2700 CPUAttackFlag = true;
2701 AUN[1] = unitBreak->number;
2721 for (int x = 0; x <= chipWidth; x++) {
2722 for (int y = 0; y <= chipHeight; y++) {
2723 g_attackRangeTheta[y][x] = 0;
2726 [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 ];
2729 for (int i = 1;i <= chipWidth;i++) {
2730 for(int k = 1;k <= chipHeight;k++){
2731 if(g_attackRangeTheta[i][k] > 0)
2732 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
2737 if(g_attackRangeTheta[g_target_y][g_target_x] != unitBreak->atkRange){
2743 for (int k = 0; k <= chipWidth; k++) {
2744 for (int g = 0; g <= chipHeight; g++) {
2745 g_enemyRange[g][k] = 0;
2749 //[self checkEnemyRange:unitBreak->atkRange+1 cntNum:0 tX:Utarget->x tY:Utarget->y aMap:g_enemyRange];
2751 //unitBreak->atkRange = unitBreak->atkRange+1 - g_enemyRange[g_target_x][g_target_y];
2760 while(U && AUN[1] > i){i++;
2764 attackExceptNumber = U->number;
2765 if(U->chipNumberL < 0){
2767 [self LookupAttackRangeExtent:Utarget->y startY:Utarget->x aPiece:&U->C turnSide:YES];
2771 [self LookupAttackRangeExtent2:Utarget->y startY:Utarget->x aPiece:&U->CL turnSide:YES];
2777 attackExtentFlag2 = true;
2778 [self cpuATKextentFunc];
2779 atkExtentFlag = true;
2780 cpuAtkExtendFlag = true;
2782 atkExtentFlag = false;
2788 //NSLog(@"UtargNUm %d", Utarget->number);
2819 if(!U->dead && U->team != unitBreak->team){
2820 if(unitBreak->team == 0)
2823 if(unitBreak->team == 1)
2827 for (int x = 1; x <= chipWidth; x++) {
2828 for (int y = 1; y <= chipHeight;y++) {
2829 if(g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0){
2830 int dist = abs(x - U->y) + abs(y - U->x);
2833 if(buildNum[y][x] >= 0){
2834 if((buildTeam[y][x] == 0 || buildTeam[y][x] == 1) && unitBreak->team == 0)
2836 if((buildTeam[y][x] == 2 || buildTeam[y][x] == 3) && unitBreak->team == 2)
2838 if((buildTeam[y][x] == 4 || buildTeam[y][x] == 5) && unitBreak->team == 1)
2846 possionX = g_target_y;
2847 possionY = g_target_x;
2849 if(unitBreak->team == 0){
2850 buildTeam[y][x] = 0;
2852 if(unitBreak->team == 1){
2853 buildTeam[y][x] = 4;
2855 if(unitBreak->team == 2){
2856 buildTeam[y][x] = 2;
2858 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2859 unitNoMoveStanbyFlag = true;
2866 rdmCnt = rand()%100;
2868 SKILL *ST = unitBreak->C.S;
2869 if(g_selectRange[y][x] > 0 && g_entireUnit[y][x] == 0)
2870 while(unitBreak->C.S){
2871 if(unitBreak->C.S->type == 1){
2873 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2874 if(BC[unitBreak->C.S->list[i]-1].type == BC_CHIKURIN){
2875 if(MC[chipNum[g_target_y][g_target_x]].type == MC_CHIKURIN && buildNum[g_target_y][g_target_x] < 0){
2880 rdmCnt2 = rand()%100;
2881 if(rdmCnt2 > 40) continue;
2885 if(unitBreak->team == 0){
2887 }else if(unitBreak->team == 2){
2889 }else if(unitBreak->team == 1){
2893 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
2894 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
2895 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
2898 if(unitBreak->team == 0){
2899 buildTeam[g_target_y][g_target_x] = 0;
2901 if(unitBreak->team == 1){
2902 buildTeam[g_target_y][g_target_x] = 4;
2904 if(unitBreak->team == 2){
2905 buildTeam[g_target_y][g_target_x] = 2;
2909 NSLog(@"[%d, %d]", g_target_x, g_target_y);
2914 possionX = g_target_y;
2915 possionY = g_target_x;
2917 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
2918 buildTeam[possionX][possionY] = unitBreak->team;
2920 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
2921 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
2922 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
2925 //[FS addBuildStatus];
2926 cpuBuildDoneFlag = true;
2927 [self addBuildStatusfix];
2929 unitBreak->C.S = ST;
2930 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2931 unitNoMoveStanbyFlag = true;
2940 rdmCnt = rand()%100;
2943 unitBreak->C.S = unitBreak->C.S->next;
2945 unitBreak->C.S = ST;
2946 if(eval_point > dist){
2973 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
2974 unitNoMoveStanbyFlag = true;
2977 if(g_target_x == 0 && g_target_y == 0){
2978 g_target_x = unitBreak->y;
2979 g_target_y = unitBreak->x;
2982 possionX = g_target_y;
2983 possionY = g_target_x;
2985 SKILL *S6T = unitBreak->C.S;
2987 while(unitBreak->C.S){
2988 if(unitBreak->C.S->type == 1){
2989 //FieldScene *FS = [[FieldScene alloc] init];//これが原因
2992 rdmCnt = rand()%100;
2995 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
2996 if(BC[unitBreak->C.S->list[i]-1].type == BC_ANTEI){
2997 if(MC[chipNum[possionX][possionY]].type == MC_ANTEI && buildNum[possionX][possionY] < 0){
3000 rdmCnt2 = rand()%100;
3001 if(rdmCnt2 > 40) continue;
3006 if(unitBreak->team == 0){
3008 }else if(unitBreak->team == 2){
3010 }else if(unitBreak->team == 1){
3014 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3015 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3016 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3018 if(unitBreak->team == 0){
3019 buildTeam[possionX][possionY] = 0;
3021 if(unitBreak->team == 1){
3022 buildTeam[possionX][possionY] = 4;
3024 if(unitBreak->team == 2){
3025 buildTeam[possionX][possionY] = 2;
3027 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3029 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3030 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3031 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3033 //[FS addBuildStatus];
3034 cpuBuildDoneFlag = true;
3035 [self addBuildStatusfix];
3037 unitBreak->C.S = S6T;
3038 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3039 unitNoMoveStanbyFlag = true;
3047 rdmCnt = rand()%100;
3050 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
3051 if(BC[unitBreak->C.S->list[i]-1].type == BC_CHIKURIN){
3052 if(MC[chipNum[possionX][possionY]].type == MC_CHIKURIN && buildNum[possionX][possionY] < 0){
3057 rdmCnt2 = rand()%100;
3058 if(rdmCnt2 > 40) continue;
3063 if(unitBreak->team == 0){
3065 }else if(unitBreak->team == 2){
3067 }else if(unitBreak->team == 1){
3071 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3072 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3073 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3076 if(unitBreak->team == 0){
3077 buildTeam[possionX][possionY] = 0;
3079 if(unitBreak->team == 1){
3080 buildTeam[possionX][possionY] = 4;
3082 if(unitBreak->team == 2){
3083 buildTeam[possionX][possionY] = 2;
3086 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3087 buildTeam[possionX][possionY] = unitBreak->team;
3089 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3090 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3091 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3093 //[FS addBuildStatus];
3094 cpuBuildDoneFlag = true;
3095 [self addBuildStatusfix];
3097 unitBreak->C.S = S6T;
3098 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3099 unitNoMoveStanbyFlag = true;
3108 rdmCnt = rand()%100;
3111 for(int i = 0;unitBreak->C.S->list[i] > 0;i++){
3112 if(BC[unitBreak->C.S->list[i]-1].type == BC_ASASE){
3113 if(MC[chipNum[possionX][possionY]].type == MC_ASASE && buildNum[possionX][possionY] < 0){
3117 rdmCnt2 = rand()%100;
3118 if(rdmCnt2 > 40) continue;
3122 if(unitBreak->team == 0){
3124 }else if(unitBreak->team == 2){
3126 }else if(unitBreak->team == 1){
3130 if(BC[unitBreak->C.S->list[i]-1].Csupply <= P[UT].resource &&
3131 BC[unitBreak->C.S->list[i]-1].Cfood <= P[UT].food &&
3132 BC[unitBreak->C.S->list[i]-1].Cmoney <= P[UT].money
3135 if(unitBreak->team == 0){
3136 buildTeam[possionX][possionY] = 0;
3138 if(unitBreak->team == 1){
3139 buildTeam[possionX][possionY] = 4;
3141 if(unitBreak->team == 2){
3142 buildTeam[possionX][possionY] = 2;
3145 buildNum[possionX][possionY] = BC[unitBreak->C.S->list[i]-1].chipNumb;
3146 buildTeam[possionX][possionY] = unitBreak->team;
3148 P[UT].resource -= BC[unitBreak->C.S->list[i]-1].Csupply;
3149 P[UT].food -= BC[unitBreak->C.S->list[i]-1].Cfood;
3150 P[UT].money -= BC[unitBreak->C.S->list[i]-1].Cmoney;
3152 //[FS addBuildStatus];
3153 cpuBuildDoneFlag = true;
3154 [self addBuildStatusfix];
3156 unitBreak->C.S = S6T;
3157 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3158 unitNoMoveStanbyFlag = true;
3166 unitBreak->C.S = unitBreak->C.S->next;
3168 unitBreak->C.S = S6T;
3170 if(g_target_x == unitBreak->y && g_target_y == unitBreak->x){
3171 unitNoMoveStanbyFlag = true;
3175 -(void)atkSelectionFix{
3178 if(!Utarget) return;
3180 for(int g = 0;g <= chipWidth;g++){
3181 for(int h = 0; h <= chipHeight;h++){
3182 g_attackRangeBeta [h][g] = 0;
3185 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
3188 for (int x = 0; x <= chipWidth;x++) {
3189 for(int y = 0; y <= chipHeight;y++){
3191 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
3194 UA = unitBreak->C.A;
3195 UAT = unitBreak->C.A;
3201 static double mostDmg = 0;
3202 static int mostDmgNum = 0;
3203 static int mostDmgCnt = 0;
3204 if(unitBreak->C.A) {
3206 while (unitBreak->C.A){
3209 double mpCost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
3211 double vigcost = unitBreak->C.A->vigor;
3213 double urSupposedToGet;
3215 if(unitBreak->C.A) urSupposedToGet = pow(8, log(3+unitBreak->C.A->totalD/16));
3219 if(Utarget) asItIs = 1/log(3+Utarget->C.S_C.DEF/64);
3222 double oopsIsRight = 0;
3225 if(unitBreak->C.A->melee){
3226 oopsIsRight = unitBreak->C.S_C.MEL;
3228 oopsIsRight = unitBreak->C.S_C.MIS;
3230 oopsIsRight = oopsIsRight/100;
3232 mpCost = unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5;
3234 if(!Utarget->C.aura && unitBreak->C.A->D){
3235 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
3236 - Utarget->C.S_C.DEF*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3237 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
3238 - Utarget->C.S_C.ATK*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3239 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
3240 - Utarget->C.S_C.EVA*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3241 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
3242 - Utarget->C.S_C.ACU*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3243 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
3244 - Utarget->C.S_C.CAP*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs;
3245 if(unitBreak->C.A->D->type == 5) theDmg = unitBreak->C.A->totalD;
3246 }else if(unitBreak->C.A->D){
3247 double val = val = 1/log(3+Utarget->C.S_C.MP/64);
3248 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
3249 - Utarget->C.S_C.DEF*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3250 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
3251 - Utarget->C.S_C.ATK*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3252 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
3253 - Utarget->C.S_C.EVA*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3254 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
3255 - Utarget->C.S_C.ACU*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3256 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
3257 - Utarget->C.S_C.CAP*Utarget->C.S_C.HP/Utarget->C.S_M.HP/2*Utarget->C.S_C.vigor/100)*asItIs*val;
3258 if(unitBreak->C.A->D->type == 5) theDmg = unitBreak->C.A->totalD*val;
3260 double val2 = log(3+Utarget->C.S_C.MP/64);
3261 if(unitBreak->C.aura){
3262 theDmg = theDmg*val2;
3264 if(unitBreak->C.A->D){
3265 if(U->C.A->D->fix == 2){
3266 theDmg = theDmg/2 + unitBreak->C.S_C.HIT/2;
3268 }else if(U->C.A->D->fix == 1){
3269 theDmg = theDmg/2 + (unitBreak->C.S_C.ATK/2 + unitBreak->C.S_C.HIT)/2/2;
3271 }else if(unitBreak->C.A->D->fix == 0){
3272 theDmg = theDmg/2 + unitBreak->C.S_C.ATK/2;
3275 theDmg = [self dmgResistFix:theDmg];
3277 NSLog(@"%@:%g", unitBreak->C.A->name, theDmg);
3278 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){
3280 if(mostDmg <= theDmg){
3282 mostDmgNum = mostDmgCnt;
3283 CPUmostDmgChoice = true;
3288 unitBreak->C.A = unitBreak->C.A->next;
3289 }unitBreak->C.A = UAT;
3291 }unitBreak->C.A = UAT;
3293 for(int i = 0;i < mostDmgNum;i++){
3294 unitBreak->C.A = unitBreak->C.A->next;
3296 UA = unitBreak->C.A;
3300 if(UA->rangeB <= 0) {
3301 UA = unitBreak->C.A;
3307 cpuAtkExtendFlag = true;
3314 unitBreak->C.A = UAT;
3316 while (unitBreak->C.A && UA != unitBreak->C.A) {
3317 unitBreak->C.A = unitBreak->C.A->next;
3320 unitBreak->C.A = UAT;
3324 //unitBreak->atkRange = UA->rangeB;
3325 //NSLog(@"unitBreak->atkRange %d", unitBreak->atkRange);
3333 -(double)dmgResistFix:(double)DMG{
3335 if(Utarget->C.A->D){
3336 if(unitBreak->C.A->D->seed == 0) DMG = DMG * Utarget->C.R_C.blow/100;
3337 if(unitBreak->C.A->D->seed == 1) DMG = DMG * Utarget->C.R_C.slash/100;
3338 if(unitBreak->C.A->D->seed == 2) DMG = DMG * Utarget->C.R_C.stub/100;
3339 if(unitBreak->C.A->D->seed == 3) DMG = DMG * Utarget->C.R_C.arrow/100;
3340 if(unitBreak->C.A->D->seed == 4) DMG = DMG * Utarget->C.R_C.gun/100;
3341 if(unitBreak->C.A->D->seed == 5) DMG = DMG * Utarget->C.R_C.shell/100;
3343 if(unitBreak->C.A->D->seed == 6) DMG = DMG * Utarget->C.R_C.flame/100;
3344 if(unitBreak->C.A->D->seed == 7) DMG = DMG * Utarget->C.R_C.cold/100;
3345 if(unitBreak->C.A->D->seed == 8) DMG = DMG * Utarget->C.R_C.electoric/100;
3346 if(unitBreak->C.A->D->seed == 9) DMG = DMG * Utarget->C.R_C.air/100;
3347 if(unitBreak->C.A->D->seed == 10) DMG = DMG * Utarget->C.R_C.water/100;
3348 if(unitBreak->C.A->D->seed == 11) DMG = DMG * Utarget->C.R_C.gas/100;
3349 if(unitBreak->C.A->D->seed == 12) DMG = DMG * Utarget->C.R_C.holy/100;
3350 if(unitBreak->C.A->D->seed == 13) DMG = DMG * Utarget->C.R_C.dark/100;
3351 if(unitBreak->C.A->D->seed == 14) DMG = DMG * Utarget->C.R_C.explosion/100;
3352 if(unitBreak->C.A->D->seed == 15) DMG = DMG * Utarget->C.R_C.blood/100;
3354 if(unitBreak->C.A->D->seed == 16) DMG = DMG * Utarget->C.R_C.paralysis/100;
3355 if(unitBreak->C.A->D->seed == 17) DMG = DMG * Utarget->C.R_C.confusion/100;
3356 if(unitBreak->C.A->D->seed == 18) DMG = DMG * Utarget->C.R_C.poison/100;
3357 if(unitBreak->C.A->D->seed == 19) DMG = DMG * Utarget->C.R_C.sleep/100;
3358 if(unitBreak->C.A->D->seed == 20) DMG = DMG * Utarget->C.R_C.charm/100;
3359 if(unitBreak->C.A->D->seed == 21) DMG = DMG * Utarget->C.R_C.silent/100;
3366 for(int g = 0;g <= chipWidth;g++){
3367 for(int h = 0; h <= chipHeight;h++){
3368 g_attackRangeBeta [h][g] = 0;
3371 [self LookupMovableRange:unitBreak->y startY:unitBreak->x aPiece:&unitBreak->C turnSide:YES];
3374 for (int x = 0; x <= chipWidth;x++) {
3375 for(int y = 0; y <= chipHeight;y++){
3377 if(g_selectRange[y][x] > 0 && g_selectRange[y][x] != 999 ){
3380 UA = unitBreak->C.A;
3381 UAT = unitBreak->C.A;
3387 while (unitBreak->C.A) {
3388 double mpcost = floor(unitBreak->C.A->MP + unitBreak->C.A->pMP*unitBreak->C.S_M.MP/100 + 0.5);
3390 double vigcost = unitBreak->C.A->vigor;
3392 if(UA->rangeB <= unitBreak->C.A->rangeB && mpcost <= unitBreak->C.S_C.MP && vigcost <= unitBreak->C.S_C.vigor){
3394 if(unitBreak->C.A->D){
3396 if(unitBreak->C.A->D->sort == 1){
3397 unitBreak->C.A = unitBreak->C.A->next;
3402 unitBreak->C.A = unitBreak->C.A->next;
3405 UA = unitBreak->C.A;
3408 unitBreak->C.A = unitBreak->C.A->next;
3409 }unitBreak->C.A = UAT;
3414 if(UA->rangeB <= 0) {
3415 UA = unitBreak->C.A;
3421 cpuAtkExtendFlag = true;
3424 while (unitBreak->C.A && UA != unitBreak->C.A) {
3425 unitBreak->C.A = unitBreak->C.A->next;
3427 }unitBreak->C.A = UAT;
3429 unitBreak->atkRange = UA->rangeB;
3430 //NSLog(@"unitBreak->atkRange %d", unitBreak->atkRange);
3431 for(int g = 0;g <= chipWidth;g++){
3432 for(int h = 0; h <= chipHeight;h++){
3433 g_attackRangeAlpha [h][g] = 0;
3437 [self checkAttackRange:x startY:y leftPow:UA->rangeB+1 pieceType:unitBreak->C.S_C.typeMONS aMap:g_attackRangeAlpha aPiece:&unitBreak->C];
3439 for (int j = 0; j <= chipWidth;j++) {
3440 for(int k = 0;k <= chipHeight;k++){
3441 if(g_attackRangeBeta[k][j] < g_attackRangeAlpha[k][j]) g_attackRangeBeta[k][j] = g_attackRangeAlpha[k][j];
3448 -(void)addBuildStatusfix{
3452 while (B->next) {omgCnt++;
3455 B->next = calloc(1, sizeof(BUILD));
3458 if(omgCnt == 0) BTop = B;
3459 B->number = registerNumB;
3462 B->chipNumber = BC[buildNum[possionX][possionY]].chipNumb;
3465 B->C = BC[buildNum[possionX][possionY]];
3466 B->img = [BC[buildNum[possionX][possionY]].img retain];
3467 unitColorInitFlag = true;
3469 if(cpuBuildDoneFlag){
3470 B->C.invisible = true;
3473 if(buildTeam[possionX][possionY] == 0 || buildTeam[possionX][possionY] == 1){
3475 if(unitTeam[possionX][possionY] == 0){
3476 U->joinArmyFromNext = true;
3477 U->persuasion = true;
3480 if(buildTeam[possionX][possionY] == 2 || buildTeam[possionX][possionY] == 3){
3483 if(buildTeam[possionX][possionY] == 4 || buildTeam[possionX][possionY] == 5){
3486 if(buildTeam[possionX][possionY] == -1){
3498 static int waitTimer = 50;
3500 if (waitTimer > 0) {
3507 g_cursol_x = unitBreak->y;
3508 g_cursol_y = unitBreak->x;
3510 if(moveFlag && g_selectRange[possionX][possionY] > 0){
3514 for(int i = 0;i<=chipWidth;i++){
3515 for(int j = 0;j<=chipHeight;j++){
3516 g_map[j][i] = chipNum[j][i];
3517 g_selectRange[j][i] = 0;
3527 if(B->x == wtPx && B->y == wtPy && B->C.capture){
3528 buildCaptureFlag = true;
3539 menuDisplayFlag = false;
3540 Uselected = unitBreak;
3544 -(void)cpuATKextentFunc{
3549 if(attackExtentFlag2 && g_attackRangeExtent[Utarget->x][Utarget->y] > 0){
3550 attackExtentFlag2 = false;
3551 attackExtentFlag = false;
3553 cpuAtkExtendFlag3 = true;
3554 for (int i = 0;i < 255;i++) {
3566 while(U->number != AUN[1]){
3573 static bool okflag = true;
3575 for (int i = 0;i < 1002;i++) {
3576 for (int k = 0;k < 1002;k++) {
3580 if(U->chipNumberL < 0){
3581 [self checkAttackRangeExtent:Utarget->y startY:Utarget->x leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
3583 [self checkAttackRangeExtent:Utarget->y startY:Utarget->x leftPow:AUNU->C.A->extent+1 pieceType:1 aMap:g_attackRangeExtent aPiece:&AUNU->C];
3588 for(int bx=1;bx<=chipWidth;bx++){
3589 for(int by=1;by<=chipHeight;by++){
3590 if(g_attackRangeExtent[bx][by] != 999 && g_attackRangeExtent[bx][by] > 0){
3592 if(g_attackRangeExtent[U->x][U->y] > 0 && attackExceptNumber != U-> number){
3594 if(Unum < Cnum) goto lolzOMFG;
3608 if(UP->x == U->x && UP->y == U->y){
3621 if(!UP) UP = calloc(1, sizeof(UNITPOINT));
3623 while(UP->next) UP = UP->next;
3629 UP->next = calloc(1, sizeof(UNITPOINT));
3647 NSLog(@"%d", DUN[0]);
3649 }else if(attackExtentFlag2){
3650 attackExtentFlag2 = false;
3651 attackExtentFlag = false;
3653 cpuAtkExtendFlag3 = false;
3664 -(void)checkStep:(int)cnsPow tX:(int)startX tY:(int)startY type:(int)pieceType aMap:(int[][1002])aMap{
3668 aMap[startY][startX] = cnsPow;
3670 i0 = cnsPow + g_moveCost[pieceType][g_map[startY-1][startX]];
3671 if(aMap[startY-1][startX] > i0) [self checkStep:i0 tX:startX tY:startY-1 type:pieceType aMap:aMap];
3673 i0 = cnsPow + g_moveCost[pieceType][g_map[startY+1][startX]];
3674 if(aMap[startY+1][startX] > i0) [self checkStep:i0 tX:startX tY:startY+1 type:pieceType aMap:aMap];
3676 i0 = cnsPow + g_moveCost[pieceType][g_map[startY][startX-1]];
3677 if(aMap[startY][startX-1] > i0) [self checkStep:i0 tX:startX-1 tY:startY type:pieceType aMap:aMap];
3679 i0 = cnsPow + g_moveCost[pieceType][g_map[startY][startX+1]];
3680 if(aMap[startY][startX+1] > i0) [self checkStep:i0 tX:startX+1 tY:startY type:pieceType aMap:aMap];
3685 -(void)checkEnemyRange:(int)cnsPow cntNum:(int)cntNum tX:(int)startX tY:(int)startY aMap:(int[][1002])aMap{
3689 aMap[startY][startX] = cnsPow;
3690 //NSLog(@"[%d,%d]%d\n", startY, startX, cnsPow);
3692 if(aMap[startY-1][startX] < i0)
3693 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX tY:startY-1 aMap:aMap];
3696 if(aMap[startY+1][startX] < i0)
3697 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX tY:startY+1 aMap:aMap];
3700 if(aMap[startY][startX-1] < i0)
3701 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX-1 tY:startY aMap:aMap];
3704 if(aMap[startY][startX+1] < i0)
3705 [self checkEnemyRange:i0 cntNum:cnsPow tX:startX+1 tY:startY aMap:aMap];
3711 -(void)mouseUp:(NSEvent *)theEvent{
3715 -(void)loadMesh:(NSMutableArray *)theMapString index:(int)index{
3721 - (void)drawRect:(NSRect)dirtyRect
3724 if(cpuModeMOVEflag && !unitMoveEndFlag && !cpuIsAttackingFlag)
3725 for (int x = 1; x <= chipWidth;x++) {
3726 for(int y = 1;y <= chipHeight;y++){
3728 if(g_selectRange[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3729 [self DrawImage:chipMove x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.8];
3739 for(bx=1;bx<=chipWidth;bx++){
3740 for(by=1;by<=chipHeight;by++){
3741 //[self DrawImage:chip x:(bx-1)*32-1 y:(by-1)*32 cx:bx cy:by f:1.0];
3742 [self DrawImage:MC[chipNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3743 if(buildNum[bx][by] >= 0) {
3746 //[self DrawImage:BC[buildNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3750 if(B->x == bx && B->y == by) break;
3753 if(B && !B->C.invisible) [self DrawImage:B->img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3758 if(g_selectRange[bx][by] > 0 && moveFlag){
3759 [self DrawImage:chipMove x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3760 switch (g_selectRange[bx][by]) {
3762 [self DrawImage:n1 x:bx*32 y:by*32 cx:bx cy:by f:1];
3765 [self DrawImage:n2 x:bx*32 y:by*32 cx:bx cy:by f:1];
3768 [self DrawImage:n3 x:bx*32 y:by*32 cx:bx cy:by f:1];
3771 [self DrawImage:n4 x:bx*32 y:by*32 cx:bx cy:by f:1];
3774 [self DrawImage:n5 x:bx*32 y:by*32 cx:bx cy:by f:1];
3777 [self DrawImage:n6 x:bx*32 y:by*32 cx:bx cy:by f:1];
3780 [self DrawImage:n7 x:bx*32 y:by*32 cx:bx cy:by f:1];
3783 [self DrawImage:n8 x:bx*32 y:by*32 cx:bx cy:by f:1];
3786 [self DrawImage:n9 x:bx*32 y:by*32 cx:bx cy:by f:1];
3789 [self DrawImage:n10 x:bx*32 y:by*32 cx:bx cy:by f:1];
3792 [self DrawImage:n11 x:bx*32 y:by*32 cx:bx cy:by f:1];
3795 [self DrawImage:n12 x:bx*32 y:by*32 cx:bx cy:by f:1];
3798 [self DrawImage:n13 x:bx*32 y:by*32 cx:bx cy:by f:1];
3801 [self DrawImage:n14 x:bx*32 y:by*32 cx:bx cy:by f:1];
3804 [self DrawImage:n15 x:bx*32 y:by*32 cx:bx cy:by f:1];
3807 [self DrawImage:n16 x:bx*32 y:by*32 cx:bx cy:by f:1];
3810 [self DrawImage:n17 x:bx*32 y:by*32 cx:bx cy:by f:1];
3813 [self DrawImage:n18 x:bx*32 y:by*32 cx:bx cy:by f:1];
3816 [self DrawImage:n19 x:bx*32 y:by*32 cx:bx cy:by f:1];
3819 [self DrawImage:n20 x:bx*32 y:by*32 cx:bx cy:by f:1];
3827 if(g_attackRange[bx][by] > 0 && attackFlag){
3828 [self DrawImage:chipAttack x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3832 if((g_attackRangeExtent[bx][by] > 0 && attackExtentFlag) ||
3833 (g_attackRangeExtent[bx][by] > 0 && cpuAtkExtendFlag3)){
3834 [self DrawImage:chipAttack x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3837 if(g_summonRange[bx][by] > 0 && summonFlag){
3838 [self DrawImage:chipSummon x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.8];
3841 if(unitNum[bx][by] >= 0 || loadNum[bx][by] >= 0) {
3842 //[self DrawImage:UC[unitNum[bx][by]].img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3847 if(U->x == bx && U->y == by) break;
3851 [self DrawImage:U->img x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:1.0];
3858 if((cpuModeATTACKflag && !unitMoveEndFlag && !cpuIsAttackingFlag))
3859 for (int x = 1; x <= chipWidth;x++) {
3860 for(int y = 1;y <= chipHeight;y++){
3862 if(g_attackRangeBeta[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3863 [self DrawImage:chipSelect x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3865 switch(g_attackRangeBeta[y][x]){
3867 [self DrawImage:n1 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3870 [self DrawImage:n2 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3873 [self DrawImage:n3 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3876 [self DrawImage:n4 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3879 [self DrawImage:n5 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3882 [self DrawImage:n6 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3885 [self DrawImage:n7 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3888 [self DrawImage:n8 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3891 [self DrawImage:n9 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3894 [self DrawImage:n10 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3906 if((cpuModeATTACKflag && !unitMoveEndFlag && !cpuIsAttackingFlag && Utarget))
3907 for (int x = 1; x <= chipWidth;x++) {
3908 for(int y = 1;y <= chipHeight;y++){
3911 for (int x = 0; x <= chipWidth; x++) {
3912 for (int y = 0; y <= chipHeight; y++) {
3913 g_attackRangeTheta[y][x] = 0;
3916 [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 ];
3918 for (int i = 0;i < chipWidth;i++) {
3919 for(int k = 0;k < chipHeight;k++){
3920 if(g_attackRangeTheta[i][k] > 0)
3921 g_attackRangeTheta[i][k] = unitBreak->atkRange+1 - g_attackRangeTheta[i][k];
3925 if(g_attackRangeTheta[y][x] > 0 && !cpuOMFGmoveATKfixFlag){
3926 [self DrawImage:chipSelect x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3928 switch(g_attackRangeTheta[y][x]){
3930 [self DrawImage:n1 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3933 [self DrawImage:n2 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3936 [self DrawImage:n3 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3939 [self DrawImage:n4 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3942 [self DrawImage:n5 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3945 [self DrawImage:n6 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3948 [self DrawImage:n7 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3951 [self DrawImage:n8 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3954 [self DrawImage:n9 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3957 [self DrawImage:n10 x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3970 if(cpuIsAttackingFlag || (UA && unitMoveEndFlag)){
3971 for (int x = 1; x <= chipWidth;x++) {
3972 for(int y = 1;y <= chipHeight;y++){
3973 if(g_attackRangeExtent[y][x] > 0)
3974 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:0 cy:0 f:0.6];
3982 if(cpuModeATTACKflag)
3983 for (int x = 0; x <= chipWidth;x++) {
3984 for(int y = 0 ;y <= chipHeight;y++){
3985 if(g_targUnit[y][x] > 0)
3986 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
3991 if(cpuModeATTACKflag)
3992 for (int x = 0; x <= chipWidth;x++) {
3993 for(int y = 0 ;y <= chipHeight;y++){
3994 if(g_visibleRange[y][x] > 0)
3995 [self DrawImage:chipMove x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
4001 for (int x = 0; x <= chipWidth;x++) {
4002 for(int y = 0 ;y <= chipHeight;y++){
4003 if(g_attackRangeBeta[y][x] > 0)
4004 [self DrawImage:chipAttack x:(y-1)*32 y:(x-1)*32 cx:bx cy:by f:1.0];
4008 //[self DrawImage:UCselected.img x:currentPosX-32 y:currentPosY-32 cx:0 cy:0 f:1.0];
4009 if(Uselected && unitMoveBugFixFlag)
4010 [self DrawImage:Uselected->img x:currentPosX-32 y:currentPosY-32 cx:0 cy:0 f:1.0];
4013 [self DrawImage:chipSelect x:(possionX-1)*32 y:(possionY-1)*32 cx:0 cy:0 f:1.0];
4016 //if(cpuCursolMode) [self DrawImage:chipSelect x:(g_target_y-1)*32 y:(g_target_x-1)*32 cx:0 cy:0 f:1.0];
4018 if(chipTargetFlag) [self DrawImage:chipTarget x:(wtPx-1)*32 y:(wtPy-1)*32 cx:0 cy:0 f:1.0];
4020 if(Utarget && (cpuIsAttackingFlag || (UA && unitMoveEndFlag)))
4021 [self DrawImage:chipUtarg x:(Utarget->x-1)*32 y:(Utarget->y-1)*32 cx:bx cy:by f:1.0];
4022 //[self DrawImage:chipSelect x:(2-1)*32 y:(1-1)*32 cx:0 cy:0 f:1.0];
4025 for(bx=1;bx<=chipWidth;bx++){
4026 for(by=1;by<=chipHeight;by++){
4028 if(waypR[bx][by] != 999 && waypR[bx][by] > 0){
4029 [self DrawImage:chip x:(bx-1)*32 y:(by-1)*32 cx:bx cy:by f:0.7];
4038 if(FieldSceneInitFlag){
4040 FieldSceneInitFlag = false;