X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fai.c;h=66b50d7165ded56ef8d606e8f368760c8f96b21b;hp=b4b35b9ed93f8be79999b3d72b0d786d7232972b;hb=9aef5f5aae5fde0ed2b462945750c7aee59b3c1e;hpb=0f68a074434296ae409accdc39ba0142600ea255 diff --git a/src/ai.c b/src/ai.c index b4b35b9..66b50d7 100644 --- a/src/ai.c +++ b/src/ai.c @@ -10,19 +10,22 @@ static bool tryexit(coord look, int ienm, int loccom, bool irun) iq.y = game.quadrant.y+(look.y+(QUADSIZE-1))/QUADSIZE - 1; if (!VALID_QUADRANT(iq.x,iq.y) || game.state.galaxy[iq.x][iq.y].supernova || - game.state.galaxy[iq.x][iq.y].klingons > 8) - return false; /* no can do -- neg energy, supernovae, or >8 Klingons */ + game.state.galaxy[iq.x][iq.y].klingons > MAXKLQUAD-1) + return false; /* no can do -- neg energy, supernovae, or >MAXKLQUAD-1 Klingons */ if (ienm == IHR) return false; /* Romulans cannot escape! */ if (!irun) { /* avoid intruding on another commander's territory */ if (ienm == IHC) { for_commanders(n) - if (same(game.state.kcmdr[n],iq)) return false; + if (same(game.state.kcmdr[n],iq)) + return false; /* refuse to leave if currently attacking starbase */ - if (same(game.battle, game.quadrant)) return false; + if (same(game.battle, game.quadrant)) + return false; } /* don't leave if over 1000 units of energy */ - if (game.kpower[loccom] > 1000.) return false; + if (game.kpower[loccom] > 1000.0) + return false; } /* print escape message and move out of quadrant. We know this if either short or long range sensors are working */ @@ -40,7 +43,8 @@ static bool tryexit(coord look, int ienm, int loccom, bool irun) game.kdist[loccom] = game.kdist[game.nenhere]; game.klhere--; game.nenhere--; - if (game.condition != docked) newcnd(); + if (game.condition != docked) + newcnd(); /* Handle global matters related to escape */ game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons--; game.state.galaxy[iq.x][iq.y].klingons++; @@ -155,11 +159,13 @@ static void movebaddy(coord com, int loccom, feature ienm) motion -= game.skill*(2.0-square(Rand())); } if (idebug) - proutn("=== MOTION = %1.2f, FORCES = %1.2f, ", motion, forces); + proutn("=== MOTION = %d, FORCES = %1.2f, ", motion, forces); /* don't move if no motion */ - if (motion==0) return; + if (motion==0) + return; /* Limit motion according to skill */ - if (abs(motion) > game.skill) motion = (motion < 0) ? -game.skill : game.skill; + if (abs(motion) > game.skill) + motion = (motion < 0) ? -game.skill : game.skill; } /* calculate preferred number of steps */ nsteps = motion < 0 ? -motion : motion; @@ -172,10 +178,14 @@ static void movebaddy(coord com, int loccom, feature ienm) /* Compute preferred values of delta X and Y */ mx = game.sector.x - com.x; my = game.sector.y - com.y; - if (2.0 * abs(mx) < abs(my)) mx = 0; - if (2.0 * abs(my) < abs(game.sector.x-com.x)) my = 0; - if (mx != 0) mx = mx*motion < 0 ? -1 : 1; - if (my != 0) my = my*motion < 0 ? -1 : 1; + if (2.0 * abs(mx) < abs(my)) + mx = 0; + if (2.0 * abs(my) < abs(game.sector.x-com.x)) + my = 0; + if (mx != 0) + mx = mx*motion < 0 ? -1 : 1; + if (my != 0) + my = my*motion < 0 ? -1 : 1; next = com; /* main move loop */ for (ll = 0; ll < nsteps; ll++) { @@ -192,14 +202,16 @@ static void movebaddy(coord com, int loccom, feature ienm) if (look.x < 1 || look.x > QUADSIZE) { if (motion < 0 && tryexit(look, ienm, loccom, irun)) return; - if (krawlx == mx || my == 0) break; + if (krawlx == mx || my == 0) + break; look.x = next.x + krawlx; krawlx = -krawlx; } else if (look.y < 1 || look.y > QUADSIZE) { if (motion < 0 && tryexit(look, ienm, loccom, irun)) return; - if (krawly == my || mx == 0) break; + if (krawly == my || mx == 0) + break; look.y = next.y + krawly; krawly = -krawly; } @@ -218,20 +230,23 @@ static void movebaddy(coord com, int loccom, feature ienm) look.y = next.y + krawly; krawly = -krawly; } - else break; /* we have failed */ + else + break; /* we have failed */ } - else success = true; + else + success = true; } if (success) { next = look; if (idebug) proutn(cramlc(neither, next)); } - else break; /* done early */ + else + break; /* done early */ } if (idebug) - prout(""); + skip(1); /* Put commander in place within same quadrant */ game.quad[com.x][com.y] = IHDOT; game.quad[next.x][next.y] = ienm; @@ -243,20 +258,23 @@ static void movebaddy(coord com, int loccom, feature ienm) proutn("***"); cramen(ienm); proutn(_(" from %s"), cramlc(2, com)); - if (game.kdist[loccom] < dist1) proutn(_(" advances to ")); - else proutn(_(" retreats to ")); + if (game.kdist[loccom] < dist1) + proutn(_(" advances to ")); + else + proutn(_(" retreats to ")); prout(cramlc(sector, next)); } } } -void movcom(void) +void moveklings(void) /* move a commander */ { coord w; int i; - if (idebug) prout("== MOVCOM"); + if (idebug) + prout("== MOVCOM"); /* Figure out which Klingon is the commander (or Supercommander) and do move */ @@ -289,21 +307,23 @@ void movcom(void) sortkl(); } -static bool movescom(coord iq, bool flag, bool *ipage) +static bool movescom(coord iq, bool flag) /* commander movement helper */ { int i; if (same(iq, game.quadrant) || !VALID_QUADRANT(iq.x, iq.y) || game.state.galaxy[iq.x][iq.y].supernova || - game.state.galaxy[iq.x][iq.y].klingons > 8) + game.state.galaxy[iq.x][iq.y].klingons > MAXKLQUAD-1) return 1; if (flag) { /* Avoid quadrants with bases if we want to avoid Enterprise */ for_starbases(i) - if (game.state.baseq[i].x==iq.x && game.state.baseq[i].y==iq.y) return 1; + if (same(game.state.baseq[i], iq)) + return true; } - if (game.justin && !game.iscate) return true; + if (game.justin && !game.iscate) + return true; /* do the move */ game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].klingons--; game.state.kscmdr = iq; @@ -316,7 +336,8 @@ static bool movescom(coord iq, bool flag, bool *ipage) game.ientesc = false; unschedule(FSCDBAS); for_local_enemies(i) - if (game.quad[game.ks[i].x][game.ks[i].y] == IHS) break; + if (game.quad[game.ks[i].x][game.ks[i].y] == IHS) + break; game.quad[game.ks[i].x][game.ks[i].y] = IHDOT; game.ks[i] = game.ks[game.nenhere]; game.kdist[i] = game.kdist[game.nenhere]; @@ -324,19 +345,19 @@ static bool movescom(coord iq, bool flag, bool *ipage) game.kpower[i] = game.kpower[game.nenhere]; game.klhere--; game.nenhere--; - if (game.condition!=docked) newcnd(); + if (game.condition!=docked) + newcnd(); sortkl(); } /* check for a helpful planet */ for (i = 0; i < game.inplan; i++) { - if (game.state.plnets[i].w.x==game.state.kscmdr.x && game.state.plnets[i].w.y==game.state.kscmdr.y && - game.state.plnets[i].crystals == 1) { + if (same(game.state.planets[i].w, game.state.kscmdr) && + game.state.planets[i].crystals == present) { /* destroy the planet */ - DESTROY(&game.state.plnets[i]); + DESTROY(&game.state.planets[i]); game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = NOPLANET; if (!damaged(DRADIO) || game.condition == docked) { - if (!*ipage) pause_game(true); - *ipage = true; + pause_game(true); prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")); proutn(_(" a planet in ")); proutn(cramlc(quadrant, game.state.kscmdr)); @@ -349,7 +370,7 @@ static bool movescom(coord iq, bool flag, bool *ipage) return false; /* looks good! */ } -void scom(bool *ipage) +void scom(void) /* move the Super Commander */ { int i, i2, j, ideltax, ideltay, ifindit, iwhichb; @@ -358,7 +379,8 @@ void scom(bool *ipage) double bdist[BASEMAX+1]; bool flag; - if (idebug) prout("== SCOM"); + if (idebug) + prout("== SCOM"); /* Decide on being active or passive */ flag = ((NKILLC+NKILLK)/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) || @@ -412,7 +434,7 @@ void scom(bool *ipage) ibq = game.state.baseq[i]; if (same(ibq, game.quadrant) || same(ibq, game.battle) || game.state.galaxy[ibq.x][ibq.y].supernova || - game.state.galaxy[ibq.x][ibq.y].klingons > 8) + game.state.galaxy[ibq.x][ibq.y].klingons > MAXKLQUAD-1) continue; /* if there is a commander, an no other base is appropriate, we will take the one with the commander */ @@ -436,40 +458,44 @@ void scom(bool *ipage) ideltay = ibq.y - game.state.kscmdr.y; } /* Maximum movement is 1 quadrant in either or both axis */ - if (ideltax > 1) ideltax = 1; - if (ideltax < -1) ideltax = -1; - if (ideltay > 1) ideltay = 1; - if (ideltay < -1) ideltay = -1; + if (ideltax > 1) + ideltax = 1; + if (ideltax < -1) + ideltax = -1; + if (ideltay > 1) + ideltay = 1; + if (ideltay < -1) + ideltay = -1; /* try moving in both x and y directions */ iq.x = game.state.kscmdr.x + ideltax; iq.y = game.state.kscmdr.y + ideltax; - if (movescom(iq, flag, ipage)) { + if (movescom(iq, flag)) { /* failed -- try some other maneuvers */ if (ideltax==0 || ideltay==0) { /* attempt angle move */ if (ideltax != 0) { iq.y = game.state.kscmdr.y + 1; - if (movescom(iq, flag, ipage)) { + if (movescom(iq, flag)) { iq.y = game.state.kscmdr.y - 1; - movescom(iq, flag, ipage); + movescom(iq, flag); } } else { iq.x = game.state.kscmdr.x + 1; - if (movescom(iq, flag, ipage)) { + if (movescom(iq, flag)) { iq.x = game.state.kscmdr.x - 1; - movescom(iq, flag, ipage); + movescom(iq, flag); } } } else { /* try moving just in x or y */ iq.y = game.state.kscmdr.y; - if (movescom(iq, flag, ipage)) { + if (movescom(iq, flag)) { iq.y = game.state.kscmdr.y + ideltay; iq.x = game.state.kscmdr.x; - movescom(iq, flag, ipage); + movescom(iq, flag); } } } @@ -490,17 +516,18 @@ void scom(bool *ipage) if (damaged(DRADIO) && game.condition != docked) return; /* no warning */ game.iseenit = true; - if (!*ipage) pause_game(true); - *ipage = true; + pause_game(true); proutn(_("Lt. Uhura- \"Captain, the starbase in ")); proutn(cramlc(quadrant, game.state.kscmdr)); skip(1); prout(_(" reports that it is under attack from the Klingon Super-commander.")); proutn(_(" It can survive until stardate %d.\""), (int)scheduled(FSCDBAS)); - if (!game.resting) return; + if (!game.resting) + return; prout(_("Mr. Spock- \"Captain, shall we cancel the rest period?\"")); - if (ja() == false) return; + if (ja() == false) + return; game.resting = false; game.optime = 0.0; /* actually finished */ return; @@ -513,8 +540,7 @@ void scom(bool *ipage) (damaged(DRADIO) && game.condition != docked) || !game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].charted)) return; - if (!*ipage) pause_game(true); - *ipage = true; + pause_game(true); prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")); proutn(_(" the Super-commander is in ")); proutn(cramlc(quadrant, game.state.kscmdr)); @@ -527,7 +553,8 @@ void movetho(void) { int idx, idy, im, i; /* Move the Tholian */ - if (!game.ithere || game.justin) return; + if (!game.ithere || game.justin) + return; if (game.tholian.x == 1 && game.tholian.y == 1) { idx = 1; idy = QUADSIZE; @@ -548,7 +575,8 @@ void movetho(void) } /* Do nothing if we are blocked */ - if (game.quad[idx][idy]!= IHDOT && game.quad[idx][idy]!= IHWEB) return; + if (game.quad[idx][idy]!= IHDOT && game.quad[idx][idy]!= IHWEB) + return; game.quad[game.tholian.x][game.tholian.y] = IHWEB; if (game.tholian.x != idx) { @@ -556,7 +584,8 @@ void movetho(void) im = fabs((double)idx - game.tholian.x)/((double)idx - game.tholian.x); while (game.tholian.x != idx) { game.tholian.x += im; - if (game.quad[game.tholian.x][game.tholian.y]==IHDOT) game.quad[game.tholian.x][game.tholian.y] = IHWEB; + if (game.quad[game.tholian.x][game.tholian.y]==IHDOT) + game.quad[game.tholian.x][game.tholian.y] = IHWEB; } } else if (game.tholian.y != idy) { @@ -564,7 +593,8 @@ void movetho(void) im = fabs((double)idy - game.tholian.y)/((double)idy - game.tholian.y); while (game.tholian.y != idy) { game.tholian.y += im; - if (game.quad[game.tholian.x][game.tholian.y]==IHDOT) game.quad[game.tholian.x][game.tholian.y] = IHWEB; + if (game.quad[game.tholian.x][game.tholian.y]==IHDOT) + game.quad[game.tholian.x][game.tholian.y] = IHWEB; } } game.quad[game.tholian.x][game.tholian.y] = IHT; @@ -572,10 +602,14 @@ void movetho(void) /* check to see if all holes plugged */ 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; - if (game.quad[i][QUADSIZE]!=IHWEB && game.quad[i][QUADSIZE]!=IHT) return; + 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; + if (game.quad[i][QUADSIZE]!=IHWEB && game.quad[i][QUADSIZE]!=IHT) + return; } /* All plugged up -- Tholian splits */ game.quad[game.tholian.x][game.tholian.y]=IHWEB;