X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=battle.c;h=bd8070ad082d2239cabe4065e204d6597dc02a7d;hp=f539c3fd375eee8ed583aa4b0395a7ee2f8b5d93;hb=f1af4f83e663d93c704ce0ada75ea4aa9ae3c65b;hpb=8b0a1880ee115e281afe83e1cd0c90e3306dfed8 diff --git a/battle.c b/battle.c index f539c3f..bd8070a 100644 --- a/battle.c +++ b/battle.c @@ -159,9 +159,11 @@ void ram(int ibumpd, int ienm, int ix, int iy) icas = 10.0+20.0*Rand(); prout("***Sickbay reports %d casualties", icas); casual += icas; - for (l=1; l <= NDEVICES; l++) { - if (l == DDRAY) continue; // Don't damage deathray - if (game.damage[l] < 0) continue; + for (l=0; l < NDEVICES; l++) { + if (l == DDRAY) + continue; // Don't damage deathray + if (game.damage[l] < 0) + continue; extradm = (10.0*type*Rand()+1.0)*damfac; game.damage[l] += Time + extradm; /* Damage for at least time of travel! */ } @@ -174,7 +176,7 @@ void ram(int ibumpd, int ienm, int ix, int iy) return; } -void torpedo(double course, double r, int inx, int iny, double *hit, int wait, int i, int n) +void torpedo(double course, double r, int inx, int iny, double *hit, int i, int n) { int l, iquad=0, ix=0, iy=0, jx=0, jy=0, shoved=0, ll; @@ -196,13 +198,11 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i for (l=1; l <= 15; l++) { x += deltax; ix = x + 0.5; - if (ix < 1 || ix > QUADSIZE) break; y += deltay; iy = y + 0.5; - if (iy < 1 || iy > QUADSIZE) break; + if (!VALID_SECTOR(ix, iy)) break; iquad=game.quad[ix][iy]; - tracktorpedo(x, y, ix, iy, wait, l, i, n, iquad); - wait = 1; + tracktorpedo(ix, iy, l, i, n, iquad); if (iquad==IHDOT) continue; /* hit something */ setwnd(message_window); @@ -228,7 +228,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i yy = cos(ang)/temp; jx=ix+xx+0.5; jy=iy+yy+0.5; - if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) return; + if (!VALID_SECTOR(jx, jy)) return; if (game.quad[jx][jy]==IHBLANK) { finish(FHOLE); return; @@ -254,7 +254,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i case IHR: /* Hit a regular enemy */ case IHK: /* find the enemy */ - for (ll=1; ll <= nenhere; ll++) + for_local_enemies(ll) if (ix==game.kx[ll] && iy==game.ky[ll]) break; kp = fabs(game.kpower[ll]); h1 = 700.0 + 100.0*Rand() - @@ -276,7 +276,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i yy = cos(ang)/temp; jx=ix+xx+0.5; jy=iy+yy+0.5; - if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) { + if (!VALID_SECTOR(jx, jy)) { prout(" damaged but not destroyed."); return; } @@ -298,8 +298,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i case IHB: /* Hit a base */ skip(1); prout("***STARBASE DESTROYED.."); - if (game.starch[quadx][quady] < 0) game.starch[quadx][quady] = 0; - for (ll=1; ll<=game.state.rembase; ll++) { + for_starbases(ll) { if (game.state.baseqx[ll]==quadx && game.state.baseqy[ll]==quady) { game.state.baseqx[ll]=game.state.baseqx[game.state.rembase]; game.state.baseqy[ll]=game.state.baseqy[game.state.rembase]; @@ -309,7 +308,8 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i game.quad[ix][iy]=IHDOT; game.state.rembase--; basex=basey=0; - game.state.galaxy[quadx][quady] -= BASE_PLACE; + game.state.galaxy[quadx][quady].starbase--; + game.state.chart[quadx][quady].starbase--; game.state.basekl++; newcnd(); return; @@ -317,7 +317,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i crmena(1, iquad, 2, ix, iy); prout(" destroyed."); game.state.nplankl++; - game.state.newstuf[quadx][quady] -= 1; + game.state.galaxy[quadx][quady].planets--; DESTROY(&game.state.plnets[iplnet]); iplnet = 0; plnetx = plnety = 0; @@ -336,7 +336,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i prout(" unaffected by photon blast."); return; case IHQUEST: /* Hit a thingy */ - if (Rand()>0.7) { // Used to be certain death + if (!(game.options & OPTION_THINGY) || Rand()>0.7) { skip(1); prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!"); skip(1); @@ -349,7 +349,8 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i } else { /* * Stas Sergeev added the possibility that - * you can shove the Thingy. + * you can shove the Thingy abd piss it off. + * It then becomes an enemy and may fire at you. */ iqengry=1; shoved=1; @@ -408,7 +409,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i game.quad[jx][jy]=iquad; game.quad[ix][iy]=IHDOT; prout(" displaced by blast to %s ", cramlc(sector, jx, jy)); - for (ll=1; ll<=nenhere; ll++) + for_local_enemies(ll) game.kdist[ll] = game.kavgd[ll] = sqrt(square(sectx-game.kx[ll])+square(secty-game.ky[ll])); sortkl(); return; @@ -421,7 +422,7 @@ void torpedo(double course, double r, int inx, int iny, double *hit, int wait, i static void fry(double hit) { double ncrit, extradm; - int ktr=1, l, ll, j, cdam[NDEVICES+1]; + int ktr=1, l, ll, j, cdam[NDEVICES]; /* a critical hit occured */ if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return; @@ -429,16 +430,16 @@ static void fry(double hit) ncrit = 1.0 + hit/(500.0+100.0*Rand()); proutn("***CRITICAL HIT--"); /* Select devices and cause damage */ - for (l = 1; l <= ncrit && l <= NDEVICES; l++) { + for (l = 0; l < ncrit && 0 < NDEVICES; l++) { do { - j = NDEVICES*Rand()+1.0; + j = NDEVICES*Rand(); /* Cheat to prevent shuttle damage unless on ship */ - } while (game.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) || - j == DDRAY); + } while + (game.damage[j]<0.0 || (j==DSHUTTL && iscraft!=1) || j==DDRAY); cdam[l] = j; extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand())); game.damage[j] += extradm; - if (l > 1) { + if (l > 0) { for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ; if (ll<=l) continue; ktr += 1; @@ -480,7 +481,7 @@ void attack(int torps_ok) if (shldchg == 1) chgfac = 0.25+0.5*Rand(); skip(1); if (skill <= SKILL_FAIR) i = 2; - for (l=1; l <= nenhere; l++) { + for_local_enemies(l) { if (game.kpower[l] < 0) continue; /* too weak to attack */ /* compute hit strength and diminsh shield power */ r = Rand(); @@ -516,10 +517,11 @@ void attack(int torps_ok) prout(" "); r = (Rand()+Rand())*0.5 -0.5; r += 0.002*game.kpower[l]*r; - torpedo(course, r, jx, jy, &hit, 0, 1, 1); - if (game.state.remkl==0) finish(FWON); /* Klingons did themselves in! */ - if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE || - alldone) return; /* Supernova or finished */ + torpedo(course, r, jx, jy, &hit, 1, 1); + if (game.state.remkl==0) + finish(FWON); /* Klingons did themselves in! */ + if (game.state.galaxy[quadx][quady].supernova || alldone) + return; /* Supernova or finished */ if (hit == 0) continue; } if (shldup != 0 || shldchg != 0 || condit==IHDOCKED) { @@ -592,7 +594,7 @@ void attack(int torps_ok) } } /* After attack, reset average distance to enemies */ - for (l = 1; l <= nenhere; l++) + for_local_enemies(l) game.kavgd[l] = game.kdist[l]; sortkl(); return; @@ -609,7 +611,7 @@ void deadkl(int ix, int iy, int type, int ixx, int iyy) /* Decide what kind of enemy it is and update approriately */ if (type == IHR) { /* chalk up a Romulan */ - game.state.newstuf[quadx][quady] -= ROMULAN_PLACE; + game.state.galaxy[quadx][quady].romulans--; irhere--; game.state.nromkl++; game.state.nromrem--; @@ -624,20 +626,20 @@ void deadkl(int ix, int iy, int type, int ixx, int iyy) } else { /* Some type of a Klingon */ - game.state.galaxy[quadx][quady] -= KLINGON_PLACE; + game.state.galaxy[quadx][quady].klingons--; klhere--; game.state.remkl--; switch (type) { case IHC: comhere = 0; - for (i=1; i<=game.state.remcom; i++) + for_commanders (i) if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break; game.state.cx[i] = game.state.cx[game.state.remcom]; game.state.cy[i] = game.state.cy[game.state.remcom]; game.state.cx[game.state.remcom] = 0; game.state.cy[game.state.remcom] = 0; game.state.remcom--; - game.future[FTBEAM] = 1e30; + game.future[FTBEAM] = FOREVER; if (game.state.remcom != 0) game.future[FTBEAM] = game.state.date + expran(1.0*incom/game.state.remcom); game.state.killc++; @@ -648,7 +650,7 @@ void deadkl(int ix, int iy, int type, int ixx, int iyy) case IHS: game.state.nscrem = ishere = game.state.isx = game.state.isy = isatb = iscate = 0; game.state.nsckill = 1; - game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30; + game.future[FSCMOVE] = game.future[FSCDBAS] = FOREVER; break; } } @@ -661,9 +663,9 @@ void deadkl(int ix, int iy, int type, int ixx, int iyy) game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom); /* Remove enemy ship from arrays describing local conditions */ - if (game.future[FCDBAS] < 1e30 && batx==quadx && baty==quady && type==IHC) - game.future[FCDBAS] = 1e30; - for (i=1; i<=nenhere; i++) + if (game.future[FCDBAS] < FOREVER && batx==quadx && baty==quady && type==IHC) + game.future[FCDBAS] = FOREVER; + for_local_enemies(i) if (game.kx[i]==ix && game.ky[i]==iy) break; nenhere--; if (i <= nenhere) { @@ -686,7 +688,7 @@ static int targetcheck(double x, double y, double *course) { double deltx, delty; /* Return TRUE if target is invalid */ - if (x < 1.0 || x > QUADSIZE || y < 1.0 || y > QUADSIZE) { + if (!VALID_SECTOR(x, y)) { huh(); return 1; } @@ -824,8 +826,8 @@ void photon(void) } if (shldup || condit == IHDOCKED) r *= 1.0 + 0.0001*shield; - torpedo(course[i], r, sectx, secty, &dummy, 0, i, n); - if (alldone||game.state.galaxy[quadx][quady]==SUPERNOVA_PLACE) + torpedo(course[i], r, sectx, secty, &dummy, i, n); + if (alldone || game.state.galaxy[quadx][quady].supernova) return; } if (game.state.remkl==0) finish(FWON); @@ -994,7 +996,7 @@ void phasers(void) irec=0; do { chew(); - if (!kz) for (i = 1; i <= nenhere; i++) + if (!kz) for_local_enemies(i) irec+=fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]))* (1.01+0.05*Rand()) + 1.0; kz=1; @@ -1029,7 +1031,7 @@ void phasers(void) if (nenhere) { extra = 0.0; powrem = rpow; - for (i = 1; i <= nenhere; i++) { + for_local_enemies(i) { hits[i] = 0.0; if (powrem <= 0) continue; hits[i] = fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]));