Forward-porting to Python 2.6 exposed a bug.
[super-star-trek.git] / src / ai.c
index 2849b61c9a7853edeedcf270b8a5cb75f20dd1b9..91e3ec9f91c8cce5616e97715fd95a3199d88217 100644 (file)
--- a/src/ai.c
+++ b/src/ai.c
@@ -17,7 +17,7 @@ static bool tryexit(coord look, int ienm, int loccom, bool irun)
     if (!irun) {
        /* avoid intruding on another commander's territory */
        if (ienm == IHC) {
-           for_commanders(n)
+           for (n = 1; n <= game.state.remcom; n++)
                if (same(game.state.kcmdr[n],iq))
                    return false;
            /* refuse to leave if currently attacking starbase */
@@ -59,7 +59,7 @@ static bool tryexit(coord look, int ienm, int loccom, bool irun)
        game.state.kscmdr=iq;
     }
     else {
-       for_commanders(n) {
+       for (n = 1; n <= game.state.remcom; n++) {
            if (same(game.state.kcmdr[n], game.quadrant)) {
                game.state.kcmdr[n]=iq;
                break;
@@ -82,7 +82,7 @@ force is -1000. Having shields down subtracts an additional 1000.
 346*K + 400*R + 500*(C+S) - 400 for expert and emeritus.
 
 Attacker Initial energy levels (nominal):
-Klingon   Romulan   Commander   Super-Commander
+        Klingon    Romulan    Commander   Super-Commander
 Novice    400        700        1200        
 Fair      425        750        1250
 Good      450        800        1300        1750
@@ -263,7 +263,7 @@ static void movebaddy(coord com, int loccom, feature ienm)
        if (!damaged(DSRSENS) || game.condition == docked) {
            proutn("***");
            cramen(ienm);
-           proutn(_(" from %s"), cramlc(2, com));
+           proutn(_(" from %s"), cramlc(sector, com));
            if (game.kdist[loccom] < dist1)
                proutn(_(" advances to "));
            else
@@ -285,7 +285,7 @@ void moveklings(void)
     // Figure out which Klingon is the commander (or Supercommander)
     //   and do move
     if (game.comhere) 
-       for_local_enemies(i) {
+       for (i = 1; i <= game.nenhere; i++) {
            w = game.ks[i];
            if (game.quad[w.x][w.y] == IHC) {
                movebaddy(w, i, IHC);
@@ -293,7 +293,7 @@ void moveklings(void)
            }
        }
     if (game.ishere) 
-       for_local_enemies(i) {
+       for (i = 1; i <= game.nenhere; i++) {
            w = game.ks[i];
            if (game.quad[w.x][w.y] == IHS) {
                movebaddy(w, i, IHS);
@@ -304,7 +304,7 @@ void moveklings(void)
     // Move these last so they can base their actions on what the
     // commander(s) do.
     if (game.skill >= SKILL_EXPERT && (game.options & OPTION_MVBADDY)) 
-       for_local_enemies(i) {
+       for (i = 1; i <= game.nenhere; i++) {
            w = game.ks[i];
            if (game.quad[w.x][w.y] == IHK || game.quad[w.x][w.y] == IHR)
                movebaddy(w, i, game.quad[w.x][w.y]);
@@ -324,7 +324,7 @@ static bool movescom(coord iq, bool avoid)
        return 1;
     if (avoid) {
        /* Avoid quadrants with bases if we want to avoid Enterprise */
-       for_starbases(i)
+       for (i = 1; i <= game.state.rembase; i++)
            if (same(game.state.baseq[i], iq)) 
                return true;
     }
@@ -341,7 +341,7 @@ static bool movescom(coord iq, bool avoid)
        game.ishere = false;
        game.ientesc = false;
        unschedule(FSCDBAS);
-       for_local_enemies(i
+       for (i = 1; i <= game.nenhere; i++
            if (game.quad[game.ks[i].x][game.ks[i].y] == IHS)
                break;
        game.quad[game.ks[i].x][game.ks[i].y] = IHDOT;
@@ -360,10 +360,10 @@ static bool movescom(coord iq, bool avoid)
        if (same(game.state.planets[i].w, game.state.kscmdr) &&
            game.state.planets[i].crystals == present) {
            /* destroy the planet */
-           DESTROY(&game.state.planets[i]);
+           game.state.planets[i].pclass = destroyed;
            game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = NOPLANET;
            if (!damaged(DRADIO) || game.condition == docked) {
-               pause_game(true);
+               announce();
                prout(_("Lt. Uhura-  \"Captain, Starfleet Intelligence reports"));
                proutn(_("   a planet in "));
                proutn(cramlc(quadrant, game.state.kscmdr));
@@ -389,7 +389,7 @@ void supercommander(void)
        prout("== SUPERCOMMANDER");
 
     /* Decide on being active or passive */
-    avoid = ((NKILLC+NKILLK)/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) ||
+    avoid = ((game.incom - game.state.remcom + game.inkling - game.state.remkl)/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) ||
            (game.state.date-game.indate) < 3.0);
     if (!game.iscate && avoid) {
        /* compute move away from Enterprise */
@@ -409,7 +409,7 @@ void supercommander(void)
            return;
        }
        sc = game.state.kscmdr;
-       for_starbases(i) {
+       for (i = 1; i <= game.state.rembase; i++) {
            basetbl[i] = i;
            bdist[i] = distance(game.state.baseq[i], sc);
        }
@@ -435,16 +435,16 @@ void supercommander(void)
           without too many Klingons, and not already under attack. */
        ifindit = iwhichb = 0;
 
-       for_starbases(i2) {
+       for (i2 = 1; i2 <= game.state.rembase; i2++) {
            i = basetbl[i2];    /* bug in original had it not finding nearest*/
            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 > MAXKLQUAD-1) 
                continue;
-           /* if there is a commander, and no other base is appropriate,
-              we will take the one with the commander */
-           for_commanders (j) {
+           // if there is a commander, and no other base is appropriate,
+           //   we will take the one with the commander
+           for (j = 1; j <= game.state.remcom; j++) {
                if (same(ibq, game.state.kcmdr[j]) && ifindit!= 2) {
                    ifindit = 2;
                    iwhichb = i;
@@ -510,35 +510,37 @@ void supercommander(void)
     if (game.state.rembase == 0) {
        unschedule(FSCMOVE);
     }
-    else for_starbases(i) {
-       ibq = game.state.baseq[i];
-       if (same(ibq, game.state.kscmdr) && same(game.state.kscmdr, game.battle)) {
-           /* attack the base */
-           if (avoid)
-               return; /* no, don't attack base! */
-           game.iseenit = false;
-           game.isatb = 1;
-           schedule(FSCDBAS, 1.0 +2.0*Rand());
-           if (is_scheduled(FCDBAS)) 
-               postpone(FSCDBAS, scheduled(FCDBAS)-game.state.date);
-           if (damaged(DRADIO) && game.condition != docked)
-               return; /* no warning */
-           game.iseenit = 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;
-           prout(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""));
-           if (ja() == false)
+    else {
+       for (i = 1; i <= game.state.rembase; i++) {
+           ibq = game.state.baseq[i];
+           if (same(ibq, game.state.kscmdr) && same(game.state.kscmdr, game.battle)) {
+               /* attack the base */
+               if (avoid)
+                   return; /* no, don't attack base! */
+               game.iseenit = false;
+               game.isatb = 1;
+               schedule(FSCDBAS, 1.0 +2.0*Rand());
+               if (is_scheduled(FCDBAS)) 
+                   postpone(FSCDBAS, scheduled(FCDBAS)-game.state.date);
+               if (damaged(DRADIO) && game.condition != docked)
+                   return; /* no warning */
+               game.iseenit = true;
+               announce();
+               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;
+               prout(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""));
+               if (ja() == false)
+                   return;
+               game.resting = false;
+               game.optime = 0.0; /* actually finished */
                return;
-           game.resting = false;
-           game.optime = 0.0; /* actually finished */
-           return;
+           }
        }
     }
     /* Check for intelligence report */
@@ -548,7 +550,7 @@ void supercommander(void)
         (damaged(DRADIO) && game.condition != docked) ||
         !game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].charted))
        return;
-    pause_game(true);
+    announce();
     prout(_("Lt. Uhura-  \"Captain, Starfleet Intelligence reports"));
     proutn(_("   the Super-commander is in "));
     proutn(cramlc(quadrant, game.state.kscmdr));
@@ -608,7 +610,7 @@ void movetholian(void)
     game.ks[game.nenhere] = game.tholian;
 
     /* check to see if all holes plugged */
-    for_sectors(i) {
+    for (i = 1; i <= QUADSIZE; i++) {
        if (game.quad[1][i]!=IHWEB && game.quad[1][i]!=IHT)
            return;
        if (game.quad[QUADSIZE][i]!=IHWEB && game.quad[QUADSIZE][i]!=IHT)