From f5a89916bc70a66b6fa6a3abc4c36023503cd380 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 21 Sep 2006 18:16:38 +0000 Subject: [PATCH] Make the "crystals' member into an enumeration. Also, add explanatory comments to the attack code. Remove some redundant logic to push you out of dock on an attack. --- src/ai.c | 2 +- src/battle.c | 75 ++++++++++++++++++++++++++++++++------------------- src/planets.c | 14 +++++----- src/setup.c | 4 +-- src/sst.h | 3 +-- 5 files changed, 59 insertions(+), 39 deletions(-) diff --git a/src/ai.c b/src/ai.c index 733c62f..97d0b41 100644 --- a/src/ai.c +++ b/src/ai.c @@ -331,7 +331,7 @@ static bool movescom(coord iq, bool flag, bool *ipage) /* check for a helpful planet */ for (i = 0; i < game.inplan; i++) { if (same(game.state.plnets[i].w, game.state.kscmdr) && - game.state.plnets[i].crystals == 1) { + game.state.plnets[i].crystals == present) { /* destroy the planet */ DESTROY(&game.state.plnets[i]); game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = NOPLANET; diff --git a/src/battle.c b/src/battle.c index dc3cede..9fc6082 100644 --- a/src/battle.c +++ b/src/battle.c @@ -539,29 +539,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 (idebug) + prout("=== ATTACK!"); - if (game.ithere) movetho(); + /* 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 +589,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 +622,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 +656,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... */ @@ -685,7 +705,7 @@ void deadkl(coord w, feature type, coord mv) 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--; @@ -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; diff --git a/src/planets.c b/src/planets.c index f024ba9..a34b1f6 100644 --- a/src/planets.c +++ b/src/planets.c @@ -23,7 +23,7 @@ void preport(void) skip(1); for (i = 0; i < game.inplan; i++) { if ((game.state.plnets[i].known != unknown - && game.state.plnets[i].crystals != 0) + && game.state.plnets[i].crystals != absent) || (idebug && game.state.plnets[i].w.x !=0) ) { iknow = true; @@ -33,7 +33,7 @@ void preport(void) proutn(_(" class ")); proutn(classes[game.state.plnets[i].pclass]); proutn(" "); - if (game.state.plnets[i].crystals <= 0) proutn(_("no ")); + if (game.state.plnets[i].crystals != present) proutn(_("no ")); prout(_("dilithium crystals present.")); if (game.state.plnets[i].known==shuttle_down) prout(_(" Shuttle Craft Galileo on surface.")); @@ -93,7 +93,7 @@ void sensor(void) if (game.state.plnets[game.iplnet].known==shuttle_down) prout(_(" Sensors show Galileo still on surface.")); proutn(_(" Readings indicate")); - if (game.state.plnets[game.iplnet].crystals == 0) proutn(_(" no")); + if (game.state.plnets[game.iplnet].crystals != present) proutn(_(" no")); prout(_(" dilithium crystals present.\"")); if (game.state.plnets[game.iplnet].known == unknown) game.state.plnets[game.iplnet].known = known; } @@ -147,7 +147,7 @@ void beam(void) } else { /* Going to planet */ - if (game.state.plnets[game.iplnet].crystals==0) { + if (game.state.plnets[game.iplnet].crystals==absent) { prout(_("Spock- \"Captain, I fail to see the logic in")); prout(_(" exploring a planet with no dilithium crystals.")); proutn(_(" Are you sure this is wise?\" ")); @@ -197,11 +197,11 @@ void mine(void) prout(_("Mining party not on planet.")); return; } - if (game.state.plnets[game.iplnet].crystals == MINED) { + if (game.state.plnets[game.iplnet].crystals == mined) { prout(_("This planet has already been strip-mined for dilithium.")); return; } - else if (game.state.plnets[game.iplnet].crystals == 0) { + else if (game.state.plnets[game.iplnet].crystals == absent) { prout(_("No dilithium crystals on this planet.")); return; } @@ -219,7 +219,7 @@ void mine(void) game.optime = (0.1+0.2*Rand())*game.state.plnets[game.iplnet].pclass; if (consumeTime()) return; prout(_("Mining operation complete.")); - game.state.plnets[game.iplnet].crystals = MINED; + game.state.plnets[game.iplnet].crystals = mined; game.imine = game.ididit = true; } diff --git a/src/setup.c b/src/setup.c index 7e1b652..741f35f 100644 --- a/src/setup.c +++ b/src/setup.c @@ -337,12 +337,12 @@ void setup(bool needprompt) game.state.plnets[i].w = w; if (i < NINHAB) { game.state.plnets[i].pclass = M; // All inhabited planets are class M - game.state.plnets[i].crystals = 0; + game.state.plnets[i].crystals = absent; game.state.plnets[i].known = known; game.state.plnets[i].inhabited = i; } else { game.state.plnets[i].pclass = Rand()*3.0; // Planet class M N or O - game.state.plnets[i].crystals = 1.5*Rand(); // 1 in 3 chance of crystals + game.state.plnets[i].crystals = Rand()*1.5; // 1 in 3 chance of crystals game.state.plnets[i].known = unknown; game.state.plnets[i].inhabited = UNINHABITED; } diff --git a/src/sst.h b/src/sst.h index f96ea03..a397ed2 100644 --- a/src/sst.h +++ b/src/sst.h @@ -51,8 +51,7 @@ typedef struct { enum {M=0, N=1, O=2} pclass; int inhabited; /* if NZ, an index into a name array */ #define UNINHABITED -1 - int crystals; /* has crystals */ -#define MINED -1 /* used to have crystals, but they were mined out */ + enum {mined=-1, present=0, absent=1} crystals; /* has crystals */ enum {unknown, known, shuttle_down} known; } planet; -- 2.31.1