X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=ai.c;h=291c2f7bc99c6799b9ec3d8aa2fa55c7171161dd;hp=e766e9832d6dfaac210ff7b0fcd6acac7f93d8e3;hb=3ee4e7935ce2710f45d60df2eaf25bcc802c729b;hpb=8273c136f86228a8b0c6e66554ef96074a429c0a diff --git a/ai.c b/ai.c index e766e98..291c2f7 100644 --- a/ai.c +++ b/ai.c @@ -6,14 +6,15 @@ static int tryexit(int lookx, int looky, int ienm, int loccom, int irun) iqx = quadx+(lookx+(QUADSIZE-1))/QUADSIZE - 1; iqy = quady+(looky+(QUADSIZE-1))/QUADSIZE - 1; - if (iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE || - NOEXIT(game.state.galaxy[iqx][iqy])) + if (!VALID_QUADRANT(iqx,iqy) || + game.state.galaxy[iqx][iqy].supernova || + game.state.galaxy[iqx][iqy].klingons > 8) return 0; /* no can do -- neg energy, supernovae, or >8 Klingons */ if (ienm == IHR) return 0; /* Romulans cannot escape! */ if (irun == 0) { /* avoid intruding on another commander's territory */ if (ienm == IHC) { - for (l = 1; l <= game.state.remcom; l++) + for_commanders(l) if (game.state.cx[l]==iqx && game.state.cy[l]==iqy) return 0; /* refuse to leave if currently attacking starbase */ if (batx==quadx && baty==quady) return 0; @@ -40,20 +41,20 @@ static int tryexit(int lookx, int looky, int ienm, int loccom, int irun) nenhere--; if (condit != IHDOCKED) newcnd(); /* Handle global matters related to escape */ - game.state.galaxy[quadx][quady] -= KLINGON_PLACE; - game.state.galaxy[iqx][iqy] += KLINGON_PLACE; + game.state.galaxy[quadx][quady].klingons--; + game.state.galaxy[iqx][iqy].klingons++; if (ienm==IHS) { ishere=0; iscate=0; ientesc=0; isatb=0; game.future[FSCMOVE]=0.2777+game.state.date; - game.future[FSCDBAS]=1e30; + game.future[FSCDBAS]=FOREVER; game.state.isx=iqx; game.state.isy=iqy; } else { - for (l=1; l<=game.state.remcom; l++) { + for_commanders(l) { if (game.state.cx[l]==quadx && game.state.cy[l]==quady) { game.state.cx[l]=iqx; game.state.cy[l]=iqy; @@ -184,10 +185,10 @@ static void movebaddy(int comx, int comy, int loccom, int ienm) nextx = comx; nexty = comy; /* main move loop */ - for (ll = 1; ll <= nsteps; ll++) { + for (ll = 0; ll < nsteps; ll++) { #ifdef DEBUG if (idebug) { - prout("%d", ll); + prout("%d", ll+1); } #endif /* Check if preferred position available */ @@ -272,26 +273,28 @@ void movcom(void) /* Figure out which Klingon is the commander (or Supercommander) and do move */ - if (comhere) for (i = 1; i <= nenhere; i++) { - ix = game.kx[i]; - iy = game.ky[i]; - if (game.quad[ix][iy] == IHC) { - movebaddy(ix, iy, i, IHC); - break; + if (comhere) + for_local_enemies(i) { + ix = game.kx[i]; + iy = game.ky[i]; + if (game.quad[ix][iy] == IHC) { + movebaddy(ix, iy, i, IHC); + break; + } } - } - if (ishere) for (i = 1; i <= nenhere; i++) { - ix = game.kx[i]; - iy = game.ky[i]; - if (game.quad[ix][iy] == IHS) { - movebaddy(ix, iy, i, IHS); - break; + if (ishere) + for_local_enemies(i) { + ix = game.kx[i]; + iy = game.ky[i]; + if (game.quad[ix][iy] == IHS) { + movebaddy(ix, iy, i, IHS); + break; + } } - } /* if skill level is high, move other Klingons and Romulans too! Move these last so they can base their actions on what the commander(s) do. */ - if (skill >= SKILL_EXPERT) for (i = 1; i <= nenhere; i++) { + if (skill >= SKILL_EXPERT) for_local_enemies(i) { ix = game.kx[i]; iy = game.ky[i]; if (game.quad[ix][iy] == IHK || game.quad[ix][iy] == IHR) @@ -306,27 +309,29 @@ static int movescom(int iqx, int iqy, int flag, int *ipage) int i; if ((iqx==quadx && iqy==quady) || - iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE || - NOEXIT(game.state.galaxy[iqx][iqy])) return 1; + !VALID_QUADRANT(iqx, iqy) || + game.state.galaxy[iqx][iqy].supernova || + game.state.galaxy[iqx][iqy].klingons > 8) + return 1; if (flag) { /* Avoid quadrants with bases if we want to avoid Enterprise */ - for (i = 1; i <= game.state.rembase; i++) + for_starbases(i) if (game.state.baseqx[i]==iqx && game.state.baseqy[i]==iqy) return 1; } if (justin && !iscate) return 1; /* do the move */ - game.state.galaxy[game.state.isx][game.state.isy] -= KLINGON_PLACE; + game.state.galaxy[game.state.isx][game.state.isy].klingons--; game.state.isx = iqx; game.state.isy = iqy; - game.state.galaxy[game.state.isx][game.state.isy] += KLINGON_PLACE; + game.state.galaxy[game.state.isx][game.state.isy].klingons++; if (ishere) { /* SC has scooted, Remove him from current quadrant */ iscate=0; isatb=0; ishere=0; ientesc=0; - game.future[FSCDBAS]=1e30; - for (i = 1; i <= nenhere; i++) + game.future[FSCDBAS]=FOREVER; + for_local_enemies(i) if (game.quad[game.kx[i]][game.ky[i]] == IHS) break; game.quad[game.kx[i]][game.ky[i]] = IHDOT; game.kx[i] = game.kx[nenhere]; @@ -345,7 +350,7 @@ static int movescom(int iqx, int iqy, int flag, int *ipage) game.state.plnets[i].crystals == 1) { /* destroy the planet */ DESTROY(&game.state.plnets[i]); - game.state.newstuf[game.state.isx][game.state.isy] -= 1; + game.state.galaxy[game.state.isx][game.state.isy].planets -= 1; if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) { if (*ipage==0) pause_game(1); *ipage = 1; @@ -365,8 +370,8 @@ void scom(int *ipage) { int i, i2, j, ideltax, ideltay, ibqx, ibqy, sx, sy, ifindit, iwhichb; int iqx, iqy; - int basetbl[BASEMAX]; - double bdist[BASEMAX]; + int basetbl[BASEMAX+1]; + double bdist[BASEMAX+1]; int flag; #ifdef DEBUG if (idebug) prout("SCOM"); @@ -389,12 +394,12 @@ void scom(int *ipage) /* compute distances to starbases */ if (game.state.rembase <= 0) { /* nothing left to do */ - game.future[FSCMOVE] = 1e30; + game.future[FSCMOVE] = FOREVER; return; } sx = game.state.isx; sy = game.state.isy; - for (i = 1; i <= game.state.rembase; i++) { + for_starbases(i) { basetbl[i] = i; ibqx = game.state.baseqx[i]; ibqy = game.state.baseqy[i]; @@ -422,16 +427,18 @@ void scom(int *ipage) without too many Klingons, and not already under attack. */ ifindit = iwhichb = 0; - for (i2 = 1; i2 <= game.state.rembase; i2++) { + for_starbases(i2) { i = basetbl[i2]; /* bug in original had it not finding nearest*/ ibqx = game.state.baseqx[i]; ibqy = game.state.baseqy[i]; if ((ibqx == quadx && ibqy == quady) || (ibqx == batx && ibqy == baty) || - NOEXIT(game.state.galaxy[ibqx][ibqy])) continue; + game.state.galaxy[ibqx][ibqy].supernova || + game.state.galaxy[ibqx][ibqy].klingons > 8) + continue; /* if there is a commander, an no other base is appropriate, we will take the one with the commander */ - for (j = 1; j <= game.state.remcom; j++) { + for_commanders (j) { if (ibqx==game.state.cx[j] && ibqy==game.state.cy[j] && ifindit!= 2) { ifindit = 2; iwhichb = i; @@ -491,9 +498,9 @@ void scom(int *ipage) } /* check for a base */ if (game.state.rembase == 0) { - game.future[FSCMOVE] = 1e30; + game.future[FSCMOVE] = FOREVER; } - else for (i=1; i<=game.state.rembase; i++) { + else for_starbases(i) { ibqx = game.state.baseqx[i]; ibqy = game.state.baseqy[i]; if (ibqx==game.state.isx && ibqy == game.state.isy && game.state.isx != batx && game.state.isy != baty) { @@ -502,7 +509,7 @@ void scom(int *ipage) iseenit = 0; isatb=1; game.future[FSCDBAS] = game.state.date + 1.0 +2.0*Rand(); - if (game.future[FCDBAS] < 1e30) game.future[FSCDBAS] += + if (game.future[FCDBAS] < FOREVER) game.future[FSCDBAS] += game.future[FCDBAS]-game.state.date; if (game.damage[DRADIO] > 0 && condit != IHDOCKED) return; /* no warning */ @@ -530,7 +537,7 @@ void scom(int *ipage) #endif (Rand() > 0.2 || (game.damage[DRADIO] > 0.0 && condit != IHDOCKED) || - game.starch[game.state.isx][game.state.isy] > 0)) + !game.state.galaxy[game.state.isx][game.state.isy].charted)) return; if (*ipage==0) pause_game(1); *ipage = 1; @@ -590,7 +597,7 @@ void movetho(void) game.ky[nenhere]=ithy; /* check to see if all holes plugged */ - for (i = 1; i < QUADSIZE+1; i++) { + for_sectors(i) { if (game.quad[1][i]!=IHWEB && game.quad[1][i]!=IHT) return; if (game.quad[QUADSIZE][i]!=IHWEB && game.quad[QUADSIZE][i]!=IHT) return; if (game.quad[i][1]!=IHWEB && game.quad[i][1]!=IHT) return;