Yet another rollup patch.
[super-star-trek.git] / src / battle.c
index dc3cede30542008697aaefaf8272072d781200d3..ffcf55d796e325b1010ed71f979374587a987375 100644 (file)
@@ -276,7 +276,8 @@ void torpedo(double course, double r, coord in, double *hit, int i, int n)
        if (iquad==IHDOT) continue;
        /* hit something */
        setwnd(message_window);
-       skip(1);        /* start new line after text track */
+       if (damaged(DSRSENS) && !game.condition==docked)
+           skip(1);    /* start new line after text track */
        switch(iquad) {
        case IHE: /* Hit our ship */
        case IHF:
@@ -387,7 +388,7 @@ void torpedo(double course, double r, coord in, double *hit, int i, int n)
            q->planet = NOPLANET;
            DESTROY(&game.state.plnets[game.iplnet]);
            game.iplnet = 0;
-           game.plnet.x = game.plnet.y = 0;
+           invalidate(game.plnet);
            game.quad[w.x][w.y] = IHDOT;
            if (game.landed) {
                /* captain perishes on planet */
@@ -401,7 +402,7 @@ void torpedo(double course, double r, coord in, double *hit, int i, int n)
            q->planet = NOPLANET;
            DESTROY(&game.state.plnets[game.iplnet]);
            game.iplnet = 0;
-           game.plnet.x = game.plnet.y = 0;
+           invalidate(game.plnet);
            game.quad[w.x][w.y] = IHDOT;
            if (game.landed) {
                /* captain perishes on planet */
@@ -539,29 +540,49 @@ void attack(bool torps_ok)
 {
     /* torps_ok == false forces use of phasers in an attack */
     int percent, loop, iquad;
-    bool itflag, atackd = false, attempt = false, ihurt = false;
+    bool usephasers, atackd = false, attempt = false, ihurt = false;
     double hit, pfac, dustfac, hitmax=0.0, hittot=0.0, chgfac=1.0, r;
     coord jay;
     enum loctype where = neither;
 
-    if (game.alldone) return;
-    if (idebug) prout("=== ATTACK!");
+    /* game could be over at this point, check */
+    if (game.alldone) 
+       return;
 
-    if (game.ithere) movetho();
+    if (idebug) 
+       prout("=== ATTACK!");
 
+    /* Tholian gewts to move before attacking */
+    if (game.ithere) 
+       movetho();
+
+    /* if you have just entered the RNZ, you'll get a warning */
     if (game.neutz) { /* The one chance not to be attacked */
        game.neutz = false;
        return;
     }
-    if ((((game.comhere || game.ishere) && !game.justin) || game.skill == SKILL_EMERITUS) && torps_ok) movcom();
-    if (game.nenhere==0 || (game.nenhere==1 && iqhere && !iqengry)) return;
+
+    /* commanders get a chance to tac-move towards you */
+    if ((((game.comhere || game.ishere) && !game.justin) || game.skill == SKILL_EMERITUS) && torps_ok) 
+       movcom();
+
+    /* if no enemies remain after movement, we're done */
+    if (game.nenhere==0 || (game.nenhere==1 && iqhere && !iqengry)) 
+       return;
+
+    /* set up partial hits if attack happens during shield status change */
     pfac = 1.0/game.inshld;
     if (game.shldchg) chgfac = 0.25+0.5*Rand();
+
     skip(1);
-    if (game.skill <= SKILL_FAIR) where = sector;
+
+    /* message verbosity control */
+    if (game.skill <= SKILL_FAIR) 
+       where = sector;
+
     for_local_enemies(loop) {
        if (game.kpower[loop] < 0) continue;    /* too weak to attack */
-       /* compute hit strength and diminsh shield power */
+       /* compute hit strength and diminish shield power */
        r = Rand();
        /* Increase chance of photon torpedos if docked or enemy energy low */
        if (game.condition == docked) r *= 0.25;
@@ -569,20 +590,21 @@ void attack(bool torps_ok)
        jay = game.ks[loop];
        iquad = game.quad[jay.x][jay.y];
        if (iquad==IHT || (iquad==IHQUEST && !iqengry)) continue;
-       itflag = (iquad == IHK && r > 0.0005) || !torps_ok ||
+       /* different enemies have different probabilities of throwing a torp */
+       usephasers = !torps_ok || \
+           (iquad == IHK && r > 0.0005) || 
            (iquad==IHC && r > 0.015) ||
            (iquad==IHR && r > 0.3) ||
            (iquad==IHS && r > 0.07) ||
            (iquad==IHQUEST && r > 0.05);
-       if (itflag) {
-           /* Enemy uses phasers */
+       if (usephasers) {           /* Enemy uses phasers */
            if (game.condition == docked) continue; /* Don't waste the effort! */
            attempt = true; /* Attempt to attack */
            dustfac = 0.8+0.05*Rand();
            hit = game.kpower[loop]*pow(dustfac,game.kavgd[loop]);
            game.kpower[loop] *= 0.75;
        }
-       else { /* Enemy used photon torpedo */
+       else { /* Enemy uses photon torpedo */
            double course = 1.90985*atan2((double)game.sector.y-jay.y, (double)jay.x-game.sector.x);
            hit = 0;
            proutn(_("***TORPEDO INCOMING"));
@@ -601,30 +623,31 @@ void attack(bool torps_ok)
                return; /* Supernova or finished */
            if (hit == 0) continue;
        }
+       /* incoming phaser or torpedo, shields may dissipate it */
        if (game.shldup || game.shldchg || game.condition==docked) {
            /* shields will take hits */
            double absorb, hitsh, propor = pfac*game.shield*(game.condition==docked ? 2.1 : 1.0);
-           if(propor < 0.1) propor = 0.1;
+           if (propor < 0.1) propor = 0.1;
            hitsh = propor*chgfac*hit+1.0;
-           atackd = true;
            absorb = 0.8*hitsh;
            if (absorb > game.shield) absorb = game.shield;
            game.shield -= absorb;
            hit -= hitsh;
-           if (game.condition==docked) dock(false);
-           if (propor > 0.1 && hit < 0.005*game.energy) continue;
+           /* taking a hit blasts us out of a starbase dock */
+           if (game.condition == docked)
+               dock(false);
+           /* but the shields may take care of it */
+           if (propor > 0.1 && hit < 0.005*game.energy) 
+               continue;
        }
-       /* It's a hit -- print out hit size */
-       atackd = true; /* We weren't going to check casualties, etc. if
-                      shields were down for some strange reason. This
-                      doesn't make any sense, so I've fixed it */
+       /* hit from this opponent got through shields, so take damage */
        ihurt = true;
        proutn(_("%d unit hit"), (int)hit);
-       if ((damaged(DSRSENS) && itflag) || game.skill<=SKILL_FAIR) {
+       if ((damaged(DSRSENS) && usephasers) || game.skill<=SKILL_FAIR) {
            proutn(_(" on the "));
            crmshp();
        }
-       if (!damaged(DSRSENS) && itflag) {
+       if (!damaged(DSRSENS) && usephasers) {
            proutn(_(" from "));
            crmena(false, iquad, where, jay);
        }
@@ -634,8 +657,6 @@ void attack(bool torps_ok)
        hittot += hit;
        fry(hit);
        game.energy -= hit;
-       if (game.condition==docked) 
-           dock(false);
     }
     if (game.energy <= 0) {
        /* Returning home upon your shield, not with it... */
@@ -683,9 +704,8 @@ void deadkl(coord w, feature type, coord mv)
     /* Added mv to allow enemy to "move" before dying */
     int i,j;
 
-    skip(1);
     crmena(true, type, sector, mv);
-    /* Decide what kind of enemy it is and update approriately */
+    /* Decide what kind of enemy it is and update appropriately */
     if (type == IHR) {
        /* chalk up a Romulan */
        game.state.galaxy[game.quadrant.x][game.quadrant.y].romulans--;
@@ -699,7 +719,7 @@ void deadkl(coord w, feature type, coord mv)
     else if (type == IHQUEST) {
        /* Killed a Thingy */
        iqhere = iqengry = false;
-       thing.x =thing.y = 0;
+       invalidate(thing);
     }
     else {
        /* Some type of a Klingon */
@@ -709,7 +729,8 @@ void deadkl(coord w, feature type, coord mv)
        case IHC:
            game.comhere = false;
            for_commanders (i)
-               if (game.state.kcmdr[i].x==game.quadrant.x && game.state.kcmdr[i].y==game.quadrant.y) break;
+               if (same(game.state.kcmdr[i], game.quadrant)) 
+                   break;
            game.state.kcmdr[i] = game.state.kcmdr[game.state.remcom];
            game.state.kcmdr[game.state.remcom].x = 0;
            game.state.kcmdr[game.state.remcom].y = 0;
@@ -743,7 +764,7 @@ void deadkl(coord w, feature type, coord mv)
     game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom);
 
     /* Remove enemy ship from arrays describing local conditions */
-    if (is_scheduled(FCDBAS) && game.battle.x==game.quadrant.x && game.battle.y==game.quadrant.y && type==IHC)
+    if (is_scheduled(FCDBAS) && same(game.battle, game.quadrant) && type==IHC)
        unschedule(FCDBAS);
     for_local_enemies(i)
        if (same(game.ks[i], w)) break;
@@ -791,7 +812,6 @@ void photon(void)
     double targ[4][3], course[4];
     double r, dummy;
     int key, n, i;
-    bool osuabor;
 
     game.ididit = false;
 
@@ -884,8 +904,7 @@ void photon(void)
     }
     game.ididit = true;
     /* Loop for moving <n> torpedoes */
-    osuabor = false;
-    for (i = 1; i <= n && !osuabor; i++) {
+    for (i = 1; i <= n; i++) {
        if (game.condition != docked) game.torps--;
        r = (Rand()+Rand())*0.5 -0.5;
        if (fabs(r) >= 0.47) {
@@ -898,12 +917,11 @@ void photon(void)
            skip(1);
            if (i < n)
                prout(_("  Remainder of burst aborted."));
-           osuabor = true;
            if (Rand() <= 0.2) {
                prout(_("***Photon tubes damaged by misfire."));
                game.damage[DPHOTON] = game.damfac*(1.0+2.0*Rand());
-               break;
            }
+           break;
        }
        if (game.shldup || game.condition == docked) 
            r *= 1.0 + 0.0001*game.shield;
@@ -1077,7 +1095,7 @@ void phasers(void)
        }
        if (key != IHREAL && game.nenhere != 0) {
            prout(_("Phasers locked on target. Energy available: %.2f"),
-                 ifast?game.energy-200.0:game.energy,1,2);
+                 ifast?game.energy-200.0:game.energy);
        }
        irec=0;
        do {
@@ -1148,7 +1166,7 @@ void phasers(void)
        chew();
        key = IHEOL;
        if (damaged(DCOMPTR))
-           prout(_("Battle computer damaged, manual file only."));
+           prout(_("Battle computer damaged, manual fire only."));
        else {
            skip(1);
            prouts(_("---WORKING---"));
@@ -1305,7 +1323,7 @@ void hittem(double *hits)
        else /* decide whether or not to emasculate klingon */
            if (kpow > 0 && Rand() >= 0.9 &&
                kpow <= ((0.4 + 0.4*Rand())*kpini)) {
-               prout(_("***Mr. Spock-  \"Captain, the vessel at "),
+               prout(_("***Mr. Spock-  \"Captain, the vessel at %s"),
                      cramlc(sector, w));
                prout(_("   has just lost its firepower.\""));
                game.kpower[kk] = -kpow;