More int-to-boolean cleanup. Make the FDISTR event work.
authorEric S. Raymond <esr@thyrsus.com>
Tue, 19 Sep 2006 06:27:07 +0000 (06:27 +0000)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 19 Sep 2006 06:27:07 +0000 (06:27 +0000)
src/ai.c
src/battle.c
src/events.c
src/moving.c
src/planets.c
src/reports.c
src/setup.c
src/sst.c
src/sst.h

index b753b86f3ad8569bc472ab4b7ac4c06949cdd62f..9e6c31095e737b16d4cc08744b0a63b177af5b6d 100644 (file)
--- a/src/ai.c
+++ b/src/ai.c
@@ -130,7 +130,7 @@ static void movebaddy(coord com, int loccom, int ienm)
  */
 
        forces = game.kpower[loccom]+100.0*game.nenhere+400*(nbaddys-1);
-       if (game.shldup==0) forces += 1000; /* Good for enemy if shield is down! */
+       if (!game.shldup) forces += 1000; /* Good for enemy if shield is down! */
        if (game.damage[DPHASER] == 0.0 || game.damage[DPHOTON] == 0.0) {
            if (game.damage[DPHASER] != 0) /* phasers damaged */
                forces += 300.0;
@@ -500,10 +500,10 @@ void scom(int *ipage)
            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==0) return;
+           if (!game.resting) return;
            prout(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""));
            if (ja()==0) return;
-           game.resting = 0;
+           game.resting = false;
            game.optime = 0.0; /* actually finished */
            return;
        }
index 343c05a3d1cfe3644712f8205c8923546c8de082..2977e6bbc7972e70315589f8c527cb8787b4b5a4 100644 (file)
@@ -59,7 +59,7 @@ void doshield(int i)
            prout(_("Shields already up."));
            return;
        }
-       game.shldup = 1;
+       game.shldup = true;
        game.shldchg = 1;
        if (game.condit != IHDOCKED) game.energy -= 50.0;
        prout(_("Shields raised."));
@@ -72,11 +72,11 @@ void doshield(int i)
        game.ididit=1;
        return;
     case SHDN:
-       if (game.shldup==0) {
+       if (!game.shldup) {
            prout(_("Shields already down."));
            return;
        }
-       game.shldup=0;
+       game.shldup=false;
        game.shldchg=1;
        prout(_("Shields lowered."));
        game.ididit=1;
@@ -166,7 +166,7 @@ void ram(int ibumpd, int ienm, coord w)
        extradm = (10.0*type*Rand()+1.0)*game.damfac;
        game.damage[l] += game.optime + extradm; /* Damage for at least time of travel! */
     }
-    game.shldup = 0;
+    game.shldup = false;
     if (KLINGREM) {
        pause_game(2);
        dreprt();
@@ -470,7 +470,7 @@ static void fry(double hit)
     prout(_(" damaged."));
     if (game.damage[DSHIELD] && game.shldup) {
        prout(_("***Shields knocked down."));
-       game.shldup=0;
+       game.shldup=false;
     }
 }
 
@@ -542,7 +542,7 @@ void attack(int torps_ok)
                return; /* Supernova or finished */
            if (hit == 0) continue;
        }
-       if (game.shldup != 0 || game.shldchg != 0 || game.condit==IHDOCKED) {
+       if (game.shldup || game.shldchg != 0 || game.condit==IHDOCKED) {
            /* shields will take hits */
            double absorb, hitsh, propor = pfac*game.shield*(game.condit==IHDOCKED ? 2.1 : 1.0);
            if(propor < 0.1) propor = 0.1;
@@ -1183,13 +1183,13 @@ void phasers(void)
                prout(_("Sulu-  \"Sir, the high-speed shield control has malfunctioned . . ."));
                prouts(_("         CLICK   CLICK   POP  . . ."));
                prout(_(" No response, sir!"));
-               game.shldup = 0;
+               game.shldup = false;
            }
            else
                prout(_("Shields raised."));
        }
        else
-           game.shldup = 0;
+           game.shldup = false;
     }
     overheat(rpow);
 }
index cc299cfc73ceceb142af6168f875c18c93d03bc0..7d4392109697e2fdcf6ab88b1b1ecf3be2d601ca 100644 (file)
@@ -39,7 +39,7 @@ static bool cancelrest(void)
        skip(1);
        proutn(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""));
        if (ja()) {
-           game.resting = 0;
+           game.resting = false;
            game.optime = 0.0;
            return true;
        }
@@ -57,7 +57,29 @@ void events(void)
     coord w, hold;
     event *ev;
 
-    if (idebug) prout("=== EVENTS");
+    if (idebug) {
+       prout("=== EVENTS from %.2f to %.2f:", game.state.date, fintim);
+       for (i = 1; i < NEVENTS; i++) {
+           switch (i) {
+           case FSNOVA:  proutn("=== Supernova       "); break;
+           case FTBEAM:  proutn("=== T Beam          "); break;
+           case FSNAP:   proutn("=== Snapshot        "); break;
+           case FBATTAK: proutn("=== Base Attack     "); break;
+           case FCDBAS:  proutn("=== Base Destroy    "); break;
+           case FSCMOVE: proutn("=== SC Move         "); break;
+           case FSCDBAS: proutn("=== SC Base Destroy "); break;
+           case FDSPROB: proutn("=== Probe Move      "); break;
+           case FDISTR:  proutn("=== Distress Call   "); break;
+           case FENSLV:  proutn("=== Enlavement      "); break;
+           case FREPRO:  proutn("=== Klingon Build   "); break;
+           }
+           if (is_scheduled(i))
+               prout("%.2f", scheduled(i));
+           else
+               prout("never");
+
+       }
+    }
 
     radio_was_broken = (game.damage[DRADIO] != 0.0);
 
@@ -69,6 +91,8 @@ void events(void)
        for (l = 1; l < NEVENTS; l++)
            if (game.future[l].date < datemin) {
                line = l;
+               if (idebug)
+                   prout("== Event %d fires", line);
                datemin = game.future[l].date;
            }
        xtime = datemin-game.state.date;
@@ -180,14 +204,10 @@ void events(void)
                    prout(_("Galileo, left on the planet surface, is well hidden."));
                }
            }
-           if (line==0) {
-               game.quadrant.x = game.state.kscmdr.x;
-               game.quadrant.y = game.state.kscmdr.y;
-           }
-           else {
-               game.quadrant.x = game.state.kcmdr[i].x;
-               game.quadrant.y = game.state.kcmdr[i].y;
-           }
+           if (line==0)
+               game.quadrant = game.state.kscmdr;
+           else
+               game.quadrant = game.state.kcmdr[i];
            iran(QUADSIZE, &game.sector.x, &game.sector.y);
            crmshp();
            proutn(_(" is pulled to "));
@@ -196,9 +216,9 @@ void events(void)
            prout(cramlc(sector, game.sector));
            if (game.resting) {
                prout(_("(Remainder of rest/repair period cancelled.)"));
-               game.resting = 0;
+               game.resting = false;
            }
-           if (game.shldup==0) {
+           if (!game.shldup) {
                if (game.damage[DSHIELD]==0 && game.shield > 0) {
                    doshield(2); /* Shldsup */
                    game.shldchg=0;
@@ -227,9 +247,9 @@ void events(void)
            i = 0;
            for_starbases(j) {
                for_commanders(k)
-                   if (game.state.baseq[j].x==game.state.kcmdr[k].x && game.state.baseq[j].y==game.state.kcmdr[k].y &&
-                       (game.state.baseq[j].x!=game.quadrant.x || game.state.baseq[j].y!=game.quadrant.y) &&
-                       (game.state.baseq[j].x!=game.state.kscmdr.x || game.state.baseq[j].y!=game.state.kscmdr.y)) {
+                   if (same(game.state.baseq[j], game.state.kcmdr[k]) &&
+                       !same(game.state.baseq[j], game.quadrant) &&
+                       !same(game.state.baseq[j], game.state.kscmdr)) {
                        i = 1;
                        break;
                    }
@@ -242,8 +262,7 @@ void events(void)
                break;
            }
            /* commander + starbase combination found -- launch attack */
-           game.battle.x = game.state.baseq[j].x;
-           game.battle.y = game.state.baseq[j].y;
+           game.battle = game.state.baseq[j];
            schedule(FCDBAS, 1.0+3.0*Rand());
            if (game.isatb) /* extra time if SC already attacking */
                postpone(FCDBAS, scheduled(FSCDBAS)-game.state.date);
@@ -271,14 +290,14 @@ void events(void)
                break; /* WAS RETURN! */
            ixhold = game.battle.x;
            iyhold = game.battle.y;
-           game.battle.x = game.state.kscmdr.x;
-           game.battle.y = game.state.kscmdr.y;
+           game.battle = game.state.kscmdr;
+           /* FALL THROUGH */
        case FCDBAS: /* Commander succeeds in destroying base */
            if (line==FCDBAS) {
                unschedule(FCDBAS);
                /* find the lucky pair */
                for_commanders(i)
-                   if (game.state.kcmdr[i].x==game.battle.x && game.state.kcmdr[i].y==game.battle.y
+                   if (same(game.state.kcmdr[i], game.battle)
                        break;
                if (i > game.state.remcom || game.state.rembase == 0 ||
                    !game.state.galaxy[game.battle.x][game.battle.y].starbase) {
@@ -290,7 +309,7 @@ void events(void)
            /* Code merges here for any commander destroying base */
            /* Not perfect, but will have to do */
            /* Handle case where base is in same quadrant as starship */
-           if (game.battle.x==game.quadrant.x && game.battle.y==game.quadrant.y) {
+           if (same(game.battle, game.quadrant)) {
                game.state.chart[game.battle.x][game.battle.y].starbase = false;
                game.quad[game.base.x][game.base.y] = IHDOT;
                game.base.x=game.base.y=0;
@@ -316,10 +335,8 @@ void events(void)
            /* Remove Starbase from galaxy */
            game.state.galaxy[game.battle.x][game.battle.y].starbase = false;
            for_starbases(i)
-               if (game.state.baseq[i].x==game.battle.x && game.state.baseq[i].y==game.battle.y) {
-                   game.state.baseq[i].x=game.state.baseq[game.state.rembase].x;
-                   game.state.baseq[i].y=game.state.baseq[game.state.rembase].y;
-               }
+               if (same(game.state.baseq[i], game.battle))
+                   game.state.baseq[i] = game.state.baseq[game.state.rembase];
            game.state.rembase--;
            if (game.isatb == 2) {
                /* reinstate a commander's base attack */
@@ -395,25 +412,30 @@ void events(void)
        case FDISTR: /* inhabited system issues distress call */
            schedule(FDISTR, expran(0.5*game.intime));
            /* try a whole bunch of times to find something suitable */
-           for (i = 0; i < 100; i++) {
-               iran(GALSIZE, &w.x, &w.y);
-               q = &game.state.galaxy[game.quadrant.x][game.quadrant.y];
+           i = 100;
+           do {
                /* need a quadrant which is not the current one,
                   which has some stars which are inhabited and
                   not already under attack, which is not
                   supernova'ed, and which has some Klingons in it */
-               if (!(same(game.quadrant, w) || q->stars<=0 ||
-                     q->supernova || q->status != secure || q->klingons <= 0))
-                   break;
-           }
-           if (i >= 100)
+               iran(GALSIZE, &w.x, &w.y);
+               q = &game.state.galaxy[w.x][w.y];
+           } while (--i &&
+                    (same(game.quadrant, w) || q->planet == NOPLANET ||
+                     q->supernova || q->status!=secure || q->klingons<=0));
+           if (i == 0) {
                /* can't seem to find one; ignore this call */
+               if (idebug)
+                   prout("=== Couldn't find location for distress event.");
                break;
+           }
 
            /* got one!!  Schedule its enslavement */
            ev = schedule(FENSLV, expran(game.intime));
            ev->quadrant = w;
            q->status = distressed;
+           if (idebug)
+               prout("=== Distress call set at %d, %d.", w.x, w.y);
 
            /* tell the captain about it if we can */
            if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED)
@@ -444,6 +466,7 @@ void events(void)
                      systemname(q->planet));
                prout("  in quadrant %d,%d.\n", ev->quadrant.x,ev->quadrant.y);
            }
+           break;
       case FREPRO:             /* Klingon reproduces */
            ev = schedule(FREPRO, expran(1.0 * game.intime));
            /* see if current distress call still active */
@@ -465,7 +488,7 @@ void events(void)
                        continue;
                    q = &game.state.galaxy[w.x][w.y];
                    /* check for this quad ok (not full & no snova) */
-                   if (q->klingons >= MAXKLQUAD || q->stars < 0)
+                   if (q->klingons >= MAXKLQUAD || !q->supernova)
                        continue;
                    goto foundit;
                }
@@ -477,6 +500,7 @@ void events(void)
 
            /* deliver the child */
            game.state.remkl++;
+           q->klingons++;
            if (same(game.quadrant, w))
                newkling(++game.klhere, &hold);
 
@@ -513,10 +537,10 @@ void wait(void)
 
     /* Alternate resting periods (events) with attacks */
 
-    game.resting = 1;
+    game.resting = true;
     do {
-       if (delay <= 0) game.resting = 0;
-       if (game.resting == 0) {
+       if (delay <= 0) game.resting = false;
+       if (!game.resting) {
            prout(_("%d stardates left."), (int)game.state.remtime);
            return;
        }
@@ -540,7 +564,7 @@ void wait(void)
        // leave if quadrant supernovas
        (!game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova);
 
-    game.resting = 0;
+    game.resting = false;
     game.optime = 0;
 }
 
@@ -640,7 +664,7 @@ void nova(int ix, int iy)
                                double diff = 2000.0 - game.shield;
                                game.energy -= diff;
                                game.shield = 0.0;
-                               game.shldup = 0;
+                               game.shldup = false;
                                prout(_("***Shields knocked out."));
                                game.damage[DSHIELD] += 0.005*game.damfac*Rand()*diff;
                            }
index 01958a144e6cfaaa982496cc9922fbc275312773..e966bed76a47899bb6633828656301df8f619ee3 100644 (file)
@@ -523,7 +523,7 @@ void warp(bool timewarp)
            game.ididit = 0;
            skip(1);
            prout("Engineering to bridge--");
-           if (game.shldup==0 || 0.5*power > game.energy) {
+           if (!game.shldup || 0.5*power > game.energy) {
                iwarp = pow((game.energy/(game.dist+0.05)), 0.333333333);
                if (iwarp <= 0) {
                    prout("We can't do it, Captain. We haven't the energy.");
index 47140ea9df814282fad4db38d9556055864b9f4b..0b554381e4395fa8761b524a47ba05f6532708cf 100644 (file)
@@ -127,7 +127,7 @@ void beam(void)
        prout(" not in standard orbit.");
        return;
     }
-    if (game.shldup!=0) {
+    if (game.shldup) {
        prout("Impossible to transport through shields.");
        return;
     }
@@ -312,7 +312,7 @@ void shuttle(void)
        prout("You will have to beam down to retrieve the shuttle craft.");
        return;
     }
-    if (game.shldup!=0 || game.condit == IHDOCKED) {
+    if (game.shldup || game.condit == IHDOCKED) {
        prout("Shuttle craft cannot pass through shields.");
        return;
     }
index bca27e40d50cf516410dae564c37c5ffb2387e9f..e1b6cc710cf2e69349d553358961e4e8bb1e9932 100644 (file)
@@ -488,7 +488,7 @@ void eta(void)
        tpower = game.dist*twarp*twarp*twarp*(game.shldup+1);
        if (tpower >= game.energy) {
            prout("Insufficient energy, sir.");
-           if (game.shldup==0 || tpower > game.energy*2.0) {
+           if (!game.shldup || tpower > game.energy*2.0) {
                if (!wfl) return;
                proutn("New warp factor to try? ");
                if (scan() == IHREAL) {
index 6aac3617973142ca588dfe47fccf32d9d4c29df3..77f58bd899cb4d6479d9de30a4b8769bad3809d2 100644 (file)
@@ -185,7 +185,7 @@ void abandn(void)
     game.shield = game.inshld = 1250.0;
     game.torps = game.intorps = 6;
     game.lsupres=game.inlsr=3.0;
-    game.shldup=0;
+    game.shldup=false;
     game.warpfac=5.0;
     game.wfacsq=25.0;
     return;
@@ -202,7 +202,8 @@ void setup(int needprompt)
     game.ship = IHE;
     game.energy = game.inenrg = 5000.0;
     game.shield = game.inshld = 2500.0;
-    game.shldchg = game.shldup = 0;
+    game.shldchg = 0;
+    game.shldup = false;
     game.inlsr = 4.0;
     game.lsupres = 4.0;
     iran(GALSIZE, &game.quadrant.x, &game.quadrant.y);
@@ -216,7 +217,8 @@ void setup(int needprompt)
     // Set up assorted game parameters
     game.battle.x = game.battle.y = 0;
     game.state.date = game.indate = 100.0*(int)(31.0*Rand()+20.0);
-    game.nkinks = game.nhelp = game.resting = game.casual = 0;
+    game.nkinks = game.nhelp = game.casual = 0;
+    game.resting = false;
     game.isatb = game.iscate = game.imine = game.icrystl = game.icraft = game.state.nplankl = 0;
     game.state.starkl = game.state.basekl = 0;
     game.iscraft = 1;
@@ -248,6 +250,8 @@ void setup(int needprompt)
     unschedule(FDSPROB);
     if ((game.options & OPTION_WORLDS) && game.skill >= SKILL_GOOD)
        schedule(FDISTR, expran(1.0 + game.intime));
+    else
+       unschedule(FDISTR);
     unschedule(FENSLV);
     unschedule(FREPRO);
     // Starchart is functional but we've never seen it
@@ -411,7 +415,7 @@ void setup(int needprompt)
     if (game.state.nscrem) prout("  YOU'LL NEED IT.");
     waitfor();
     newqad(0);
-    if (game.nenhere-iqhere-game.ithere) game.shldup=1.0;
+    if (game.nenhere-iqhere-game.ithere) game.shldup = true;
     if (game.neutz) attack(0); // bad luck to start in a Romulan Neutral Zone
 }
 
index 36f444959238493d6414a44f1ab3b6c9e13671b3..90b2b307a6ba536b964e2b89cf00621e93633248 100644 (file)
--- a/src/sst.c
+++ b/src/sst.c
@@ -871,7 +871,6 @@ void debugme(void)
        int i;
        for (i = 1; i < NEVENTS; i++) {
            int key;
-           if (!is_scheduled(i)) continue;
            switch (i) {
            case FSNOVA:  proutn("Supernova       "); break;
            case FTBEAM:  proutn("T Beam          "); break;
@@ -880,16 +879,22 @@ void debugme(void)
            case FCDBAS:  proutn("Base Destroy    "); break;
            case FSCMOVE: proutn("SC Move         "); break;
            case FSCDBAS: proutn("SC Base Destroy "); break;
-           //case FDSPROB:proutn("Probe Move      "); break;
+           case FDSPROB: proutn("Probe Move      "); break;
            case FDISTR:  proutn("Distress Call   "); break;
            case FENSLV:  proutn("Enlavement      "); break;
            case FREPRO:  proutn("Klingon Build   "); break;
            }
-           proutn("%.2f", scheduled(i)-game.state.date);
+           if (is_scheduled(i))
+               proutn("%.2f", scheduled(i)-game.state.date);
+           else
+               proutn("never");
            chew();
-           proutn("  ?");
+           proutn("");
            key = scan();
-           if (key == IHREAL) {
+           if (key == 'n') {
+               unschedule(i);
+               chew();
+           } else if (key == IHREAL) {
                ev = schedule(i, aaitem);
                if (i == FENSLV || i == FREPRO) {
                    chew();
@@ -915,7 +920,7 @@ void debugme(void)
        chew();
     }
     proutn("Induce supernova here? ");
-    if (ja() != 0) {
+    if (ja()) {
        game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova = true;
        atover(1);
     }
index 2b30d8b17164457d370ee5db6ee39c591a517b8b..6ecd3d3a12a1aaee4b1a948be88d44e206acbd5c 100644 (file)
--- a/src/sst.h
+++ b/src/sst.h
@@ -204,6 +204,8 @@ struct game {
        ididit,         // action taken -- allows enemy to attack
        alive,          // we are alive (not killed)
        justin,         // just entered quadrant
+       shldup,         // shields are up
+       resting,        // rest time
        alldone,        // game is now finished
        neutz,          // Romulan Neutral Zone
        isarmed,        // probe is armed
@@ -254,7 +256,6 @@ struct game {
        indate,         // initial date
        energy,         // energy level
        shield,         // shield level
-       shldup,         // shields are up
        warpfac,        // warp speed
        wfacsq,         // squared warp factor
        lsupres,        // life support reserves
@@ -262,7 +263,6 @@ struct game {
        direc,          // movement direction
        optime,         // time taken by current operation
        docfac,         // repair factor when docking (constant?)
-       resting,        // rest time
        damfac,         // damage factor
        lastchart,      // time star chart was last updated
        cryprob,        // probability that crystal will work