X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fmoving.c;h=b273c60051e0ad32c38e6afe7715a18e99fbfd53;hp=632b335d6470e149ceb23bbd56a377bc4e79c194;hb=2cae1cd3feb922843b40af851f43f9e08bb18f0d;hpb=188965b8e49bc7a0233258627917239b57429e77 diff --git a/src/moving.c b/src/moving.c index 632b335..b273c60 100644 --- a/src/moving.c +++ b/src/moving.c @@ -2,17 +2,19 @@ #include "sstlinux.h" #include "sst.h" -static void getcd(int, int); +static void getcd(bool, int); void imove(void) { double angle, deltax, deltay, bigger, x, y, finald, finalx, finaly, stopegy, probf; - int trbeam = 0, n, l, ix=0, iy=0, kink, kinks, iquad; + int trbeam = 0, n, l, kink, kinks, iquad; + coord w; + w.x = w.y = 0; if (game.inorbit) { prout("Helmsman Sulu- \"Leaving standard orbit.\""); - game.inorbit = FALSE; + game.inorbit = false; } angle = ((15.0 - game.direc) * 0.5235988); @@ -34,23 +36,23 @@ void imove(void) game.optime = scheduled(FTBEAM) - game.state.date + 1e-5; } /* Move within the quadrant */ - game.quad[game.sectx][game.secty] = IHDOT; - x = game.sectx; - y = game.secty; + game.quad[game.sector.x][game.sector.y] = IHDOT; + x = game.sector.x; + y = game.sector.y; n = 10.0*game.dist*bigger+0.5; if (n > 0) { for (l = 1; l <= n; l++) { - ix = (x += deltax) + 0.5; - iy = (y += deltay) + 0.5; - if (!VALID_SECTOR(ix, iy)) { + w.x = (x += deltax) + 0.5; + w.y = (y += deltay) + 0.5; + if (!VALID_SECTOR(w.x, w.y)) { /* Leaving quadrant -- allow final enemy attack */ /* Don't do it if being pushed by Nova */ if (game.nenhere != 0 && game.iattak != 2) { newcnd(); for_local_enemies(l) { - finald = sqrt((ix-game.kx[l])*(double)(ix-game.kx[l]) + - (iy-game.ky[l])*(double)(iy-game.ky[l])); + finald = sqrt((w.x-game.ks[l].x)*(double)(w.x-game.ks[l].x) + + (w.y-game.ks[l].y)*(double)(w.y-game.ks[l].y)); game.kavgd[l] = 0.5 * (finald+game.kdist[l]); } /* @@ -58,33 +60,33 @@ void imove(void) * that attacks only happen if Klingons * are present and your skill is good. */ - if (game.skill > SKILL_GOOD && game.klhere > 0 && !game.state.galaxy[game.quadx][game.quady].supernova) + if (game.skill > SKILL_GOOD && game.klhere > 0 && !game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) attack(0); if (game.alldone) return; } /* compute final position -- new quadrant and sector */ - x = QUADSIZE*(game.quadx-1)+game.sectx; - y = QUADSIZE*(game.quady-1)+game.secty; - ix = x+10.0*game.dist*bigger*deltax+0.5; - iy = y+10.0*game.dist*bigger*deltay+0.5; + x = QUADSIZE*(game.quadrant.x-1)+game.sector.x; + y = QUADSIZE*(game.quadrant.y-1)+game.sector.y; + w.x = x+10.0*game.dist*bigger*deltax+0.5; + w.y = y+10.0*game.dist*bigger*deltay+0.5; /* check for edge of galaxy */ kinks = 0; do { kink = 0; - if (ix <= 0) { - ix = -ix + 1; + if (w.x <= 0) { + w.x = -w.x + 1; kink = 1; } - if (iy <= 0) { - iy = -iy + 1; + if (w.y <= 0) { + w.y = -w.y + 1; kink = 1; } - if (ix > GALSIZE*QUADSIZE) { - ix = (GALSIZE*QUADSIZE*2)+1 - ix; + if (w.x > GALSIZE*QUADSIZE) { + w.x = (GALSIZE*QUADSIZE*2)+1 - w.x; kink = 1; } - if (iy > GALSIZE*QUADSIZE) { - iy = (GALSIZE*QUADSIZE*2)+1 - iy; + if (w.y > GALSIZE*QUADSIZE) { + w.y = (GALSIZE*QUADSIZE*2)+1 - w.y; kink = 1; } if (kink) kinks = 1; @@ -104,24 +106,23 @@ void imove(void) } /* Compute final position in new quadrant */ if (trbeam) return; /* Don't bother if we are to be beamed */ - game.quadx = (ix+(QUADSIZE-1))/QUADSIZE; - game.quady = (iy+(QUADSIZE-1))/QUADSIZE; - game.sectx = ix - QUADSIZE*(game.quadx-1); - game.secty = iy - QUADSIZE*(game.quady-1); + game.quadrant.x = (w.x+(QUADSIZE-1))/QUADSIZE; + game.quadrant.y = (w.y+(QUADSIZE-1))/QUADSIZE; + game.sector.x = w.x - QUADSIZE*(game.quadrant.x-1); + game.sector.y = w.y - QUADSIZE*(game.quadrant.y-1); skip(1); - prout("Entering %s.", - cramlc(quadrant, game.quadx, game.quady)); - game.quad[game.sectx][game.secty] = game.ship; + prout("Entering %s.", cramlc(quadrant, game.quadrant)); + game.quad[game.sector.x][game.sector.y] = game.ship; newqad(0); if (game.skill>SKILL_NOVICE) attack(0); return; } - iquad = game.quad[ix][iy]; + iquad = game.quad[w.x][w.y]; if (iquad != IHDOT) { /* object encountered in flight path */ stopegy = 50.0*game.dist/game.optime; - game.dist=0.1*sqrt((game.sectx-ix)*(double)(game.sectx-ix) + - (game.secty-iy)*(double)(game.secty-iy)); + game.dist=0.1*sqrt((game.sector.x-w.x)*(double)(game.sector.x-w.x) + + (game.sector.y-w.y)*(double)(game.sector.y-w.y)); switch (iquad) { case IHT: /* Ram a Tholian */ case IHK: /* Ram enemy ship */ @@ -129,11 +130,11 @@ void imove(void) case IHS: case IHR: case IHQUEST: - game.sectx = ix; - game.secty = iy; - ram(0, iquad, game.sectx, game.secty); - finalx = game.sectx; - finaly = game.secty; + game.sector.x = w.x; + game.sector.y = w.y; + ram(0, iquad, game.sector); + finalx = game.sector.x; + finaly = game.sector.y; break; case IHBLANK: skip(1); @@ -142,7 +143,7 @@ void imove(void) proutn("***"); crmshp(); proutn(" pulled into black hole at "); - prout(cramlc(sector, ix, iy)); + prout(cramlc(sector, w)); /* * Getting pulled into a black hole was certain * death in Almy's original. Stas Sergeev added a @@ -166,15 +167,15 @@ void imove(void) proutn(" encounters Tholian web at "); else proutn(" blocked by object at "); - proutn(cramlc(sector, ix,iy)); + proutn(cramlc(sector, w)); prout(";"); proutn("Emergency stop required "); prout("%2d units of energy.", (int)stopegy); game.energy -= stopegy; finalx = x-deltax+0.5; - game.sectx = finalx; + game.sector.x = finalx; finaly = y-deltay+0.5; - game.secty = finaly; + game.sector.y = finaly; if (game.energy <= 0) { finish(FNRG); return; @@ -184,25 +185,25 @@ void imove(void) goto no_quad_change; /* sorry! */ } } - game.dist = 0.1*sqrt((game.sectx-ix)*(double)(game.sectx-ix) + - (game.secty-iy)*(double)(game.secty-iy)); - game.sectx = ix; - game.secty = iy; + game.dist = 0.1*sqrt((game.sector.x-w.x)*(double)(game.sector.x-w.x) + + (game.sector.y-w.y)*(double)(game.sector.y-w.y)); + game.sector.x = w.x; + game.sector.y = w.y; } - finalx = game.sectx; - finaly = game.secty; + finalx = game.sector.x; + finaly = game.sector.y; no_quad_change: /* No quadrant change -- compute new avg enemy distances */ - game.quad[game.sectx][game.secty] = game.ship; + game.quad[game.sector.x][game.sector.y] = game.ship; if (game.nenhere) { for_local_enemies(l) { - finald = sqrt((ix-game.kx[l])*(double)(ix-game.kx[l]) + - (iy-game.ky[l])*(double)(iy-game.ky[l])); + finald = sqrt((w.x-game.ks[l].x)*(double)(w.x-game.ks[l].x) + + (w.y-game.ks[l].y)*(double)(w.y-game.ks[l].y)); game.kavgd[l] = 0.5 * (finald+game.kdist[l]); game.kdist[l] = finald; } sortkl(); - if (!game.state.galaxy[game.quadx][game.quady].supernova && game.iattak == 0) + if (!game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova && game.iattak == 0) attack(0); for_local_enemies(l) game.kavgd[l] = game.kdist[l]; } @@ -224,7 +225,7 @@ void dock(int l) prout("You must first leave standard orbit."); return; } - if (game.basex==0 || abs(game.sectx-game.basex) > 1 || abs(game.secty-game.basey) > 1) { + if (game.base.x==0 || abs(game.sector.x-game.base.x) > 1 || abs(game.sector.y-game.base.y) > 1) { crmshp(); prout(" not adjacent to base."); return; @@ -236,7 +237,7 @@ void dock(int l) game.shield = game.inshld; game.torps = game.intorps; game.lsupres = game.inlsr; - if (game.damage[DRADIO] == 0.0 && + if (!damaged(DRADIO) && (is_scheduled(FCDBAS) || game.isatb == 1) && game.iseenit == 0) { /* get attack report from base */ prout("Lt. Uhura- \"Captain, an important message from the starbase:\""); @@ -245,7 +246,7 @@ void dock(int l) } } -static void getcd(int isprobe, int akey) { +static void getcd(bool isprobe, int akey) { /* This program originally required input in terms of a (clock) direction and distance. Somewhere in history, it was changed to cartesian coordinates. So we need to convert. I think @@ -255,10 +256,11 @@ static void getcd(int isprobe, int akey) { are always displayed y - x, where +y is downward! */ - int irowq=game.quadx, icolq=game.quady, irows, icols, itemp=0, iprompt=0, key=0; + int irowq=game.quadrant.x, icolq=game.quadrant.y, itemp=0, iprompt=0, key=0; double xi, xj, xk, xl; double deltax, deltay; int automatic = -1; + coord incr; /* Get course direction and distance. If user types bad values, return with DIREC = -1.0. */ @@ -274,7 +276,7 @@ static void getcd(int isprobe, int akey) { return; } while (automatic == -1) { - if (game.damage[DCOMPTR]) { + if (damaged(DCOMPTR)) { if (isprobe) prout("Computer damaged; manual navigation only"); else @@ -359,23 +361,23 @@ static void getcd(int isprobe, int akey) { irowq = xi + 0.5; icolq = xj + 0.5; - irows = xk + 0.5; - icols = xl + 0.5; + incr.y = xk + 0.5; + incr.x = xl + 0.5; } else { if (isprobe) { /* only quadrant specified -- go to center of dest quad */ irowq = xi + 0.5; icolq = xj + 0.5; - irows = icols = 5; + incr.y = incr.x = 5; } else { - irows = xi + 0.5; - icols = xj + 0.5; + incr.y = xi + 0.5; + incr.x = xj + 0.5; } itemp = 1; } - if (!VALID_QUADRANT(icolq,irowq)||!VALID_SECTOR(icols,irows)) { + if (!VALID_QUADRANT(icolq,irowq)||!VALID_SECTOR(incr.x,incr.y)) { huh(); return; } @@ -384,13 +386,13 @@ static void getcd(int isprobe, int akey) { if (itemp) { if (iprompt) { prout("Helmsman Sulu- \"Course locked in for %s.\"", - cramlc(sector, irows, icols)); + cramlc(sector, incr)); } } else prout("Ensign Chekov- \"Course laid in, Captain.\""); } - deltax = icolq - game.quady + 0.1*(icols-game.secty); - deltay = game.quadx - irowq + 0.1*(game.sectx-irows); + deltax = icolq - game.quadrant.y + 0.1*(incr.x-game.sector.y); + deltay = game.quadrant.x - irowq + 0.1*(game.sector.x-incr.y); } else { /* manual */ while (key == IHEOL) { @@ -436,7 +438,7 @@ void impuls(void) double power; game.ididit = 0; - if (game.damage[DIMPULS]) { + if (damaged(DIMPULS)) { chew(); skip(1); prout("Engineer Scott- \"The impulse engines are damaged, Sir.\""); @@ -444,7 +446,7 @@ void impuls(void) } if (game.energy > 30.0) { - getcd(FALSE, 0); + getcd(false, 0); if (game.direc == -1.0) return; power = 20.0 + 100.0*game.dist; } @@ -487,12 +489,12 @@ void impuls(void) } -void warp(int i) +void warp(bool timewarp) { int blooey=0, twarp=0, iwarp; double power; - if (i!=2) { /* Not WARPX entry */ + if (!timewarp) { /* Not WARPX entry */ game.ididit = 0; if (game.damage[DWARPEN] > 10.0) { chew(); @@ -500,7 +502,7 @@ void warp(int i) prout("Engineer Scott- \"The impulse engines are damaged, Sir.\""); return; } - if (game.damage[DWARPEN] > 0.0 && game.warpfac > 4.0) { + if (damaged(DWARPEN) && game.warpfac > 4.0) { chew(); skip(1); prout("Engineer Scott- \"Sorry, Captain. Until this damage"); @@ -509,7 +511,7 @@ void warp(int i) } /* Read in course and distance */ - getcd(FALSE, 0); + getcd(false, 0); if (game.direc == -1.0) return; /* Make sure starship has enough energy for the trip */ @@ -521,7 +523,7 @@ void warp(int i) 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."); @@ -563,13 +565,11 @@ void warp(int i) } /* Decide if time warp will occur */ if (0.5*game.dist*pow(7.0,game.warpfac-10.0) > Rand()) twarp=1; -#ifdef DEBUG - if (game.idebug &&game.warpfac==10 && twarp==0) { + if (idebug && game.warpfac==10 && twarp==0) { blooey=0; - proutn("Force time warp? "); + proutn("=== Force time warp? "); if (ja()==1) twarp=1; } -#endif if (blooey || twarp) { /* If time warp or engine damage, check path */ /* If it is obstructed, don't do warp or damage */ @@ -586,8 +586,8 @@ void warp(int i) deltax /= bigger; deltay /= bigger; n = 10.0 * game.dist * bigger +0.5; - x = game.sectx; - y = game.secty; + x = game.sector.x; + y = game.sector.y; for (l = 1; l <= n; l++) { x += deltax; ix = x + 0.5; @@ -641,7 +641,7 @@ void setwrp(void) prout("Warp engines inoperative."); return; } - if (game.damage[DWARPEN] > 0.0 && aaitem > 4.0) { + if (damaged(DWARPEN) && aaitem > 4.0) { prout("Engineer Scott- \"I'm doing my best, Captain,"); prout(" but right now we can only go warp 4.\""); return; @@ -681,7 +681,7 @@ void atover(int igrab) chew(); /* is captain on planet? */ if (game.landed==1) { - if (game.damage[DTRANSP]) { + if (damaged(DTRANSP)) { finish(FPNOVA); return; } @@ -731,10 +731,10 @@ void atover(int igrab) crmshp(); skip(1); prout("safely out of quadrant."); - if (game.damage[DRADIO] == 0.0) - game.state.galaxy[game.quadx][game.quady].charted = TRUE; + if (!damaged(DRADIO)) + game.state.galaxy[game.quadrant.x][game.quadrant.y].charted = true; /* Try to use warp engines */ - if (game.damage[DWARPEN]) { + if (damaged(DWARPEN)) { skip(1); prout("Warp engines damaged."); finish(FSNOVAED); @@ -749,10 +749,10 @@ void atover(int igrab) if (distreq < game.dist) game.dist = distreq; game.optime = 10.0*game.dist/game.wfacsq; game.direc = 12.0*Rand(); /* How dumb! */ - game.justin = 0; - game.inorbit = 0; - warp(2); - if (game.justin == 0) { + game.justin = false; + game.inorbit = false; + warp(true); + if (!game.justin) { /* This is bad news, we didn't leave quadrant. */ if (game.alldone) return; skip(1); @@ -762,7 +762,7 @@ void atover(int igrab) } } while /* Repeat if another snova */ - (game.state.galaxy[game.quadx][game.quady].supernova); + (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova); if (KLINGREM==0) finish(FWON); /* Snova killed remaining enemy. */ } @@ -789,7 +789,7 @@ void timwrp() game.isatb = 0; unschedule(FCDBAS); unschedule(FSCDBAS); - game.batx = game.baty = 0; + game.battle.x = game.battle.y = 0; /* Make sure Galileo is consistant -- Snapshot may have been taken when on planet, which would give us two Galileos! */ @@ -841,7 +841,7 @@ void probe(void) prout("Ye Faerie Queene has no deep space probes."); return; } - if (game.damage[DDSP] != 0.0) { + if (damaged(DDSP)) { chew(); skip(1); prout("Engineer Scott- \"The probe launcher is damaged, Sir.\""); @@ -850,7 +850,7 @@ void probe(void) if (is_scheduled(FDSPROB)) { chew(); skip(1); - if (game.damage[DRADIO] != 0 && game.condit != IHDOCKED) { + if (damaged(DRADIO) && game.condit != IHDOCKED) { prout("Spock- \"Records show the previous probe has not yet"); prout(" reached its destination.\""); } @@ -867,16 +867,16 @@ void probe(void) if (ja()==0) return; } - game.isarmed = FALSE; + game.isarmed = false; if (key == IHALPHA && strcmp(citem,"armed") == 0) { - game.isarmed = TRUE; + game.isarmed = true; key = scan(); } else if (key == IHEOL) { proutn("Arm NOVAMAX warhead? "); game.isarmed = ja(); } - getcd(TRUE, key); + getcd(true, key); if (game.direc == -1.0) return; game.nprobes--; angle = ((15.0 - game.direc) * 0.5235988); @@ -890,10 +890,9 @@ void probe(void) game.probeiny /= bigger; game.probeinx /= bigger; game.proben = 10.0*game.dist*bigger +0.5; - game.probex = game.quadx*QUADSIZE + game.sectx - 1; // We will use better packing than original - game.probey = game.quady*QUADSIZE + game.secty - 1; - game.probecx = game.quadx; - game.probecy = game.quady; + game.probex = game.quadrant.x*QUADSIZE + game.sector.x - 1; // We will use better packing than original + game.probey = game.quadrant.y*QUADSIZE + game.sector.y - 1; + game.probec = game.quadrant; schedule(FDSPROB, 0.01); // Time to move one sector prout("Ensign Chekov- \"The deep space probe is launched, Captain.\""); game.ididit = 1; @@ -912,7 +911,7 @@ void mayday(void) prout("Lt. Uhura- \"But Captain, we're already docked.\""); return; } - if (game.damage[DRADIO] != 0) { + if (damaged(DRADIO)) { prout("Subspace radio damaged."); return; } @@ -928,42 +927,41 @@ void mayday(void) } /* OK -- call for help from nearest starbase */ game.nhelp++; - if (game.basex!=0) { + if (game.base.x!=0) { /* There's one in this quadrant */ - ddist = sqrt(square(game.basex-game.sectx)+square(game.basey-game.secty)); + ddist = sqrt(square(game.base.x-game.sector.x)+square(game.base.y-game.sector.y)); } else { ddist = FOREVER; for_starbases(l) { - xdist=10.0*sqrt(square(game.state.baseqx[l]-game.quadx)+square(game.state.baseqy[l]-game.quady)); + xdist=10.0*sqrt(square(game.state.baseq[l].x-game.quadrant.x)+square(game.state.baseq[l].y-game.quadrant.y)); if (xdist < ddist) { ddist = xdist; line = l; } } /* Since starbase not in quadrant, set up new quadrant */ - game.quadx = game.state.baseqx[line]; - game.quady = game.state.baseqy[line]; + game.quadrant = game.state.baseq[line]; newqad(1); } /* dematerialize starship */ - game.quad[game.sectx][game.secty]=IHDOT; - proutn("Starbase in %s responds--", cramlc(quadrant, game.quadx, game.quady)); + game.quad[game.sector.x][game.sector.y]=IHDOT; + proutn("Starbase in %s responds--", cramlc(quadrant, game.quadrant)); proutn(""); crmshp(); prout(" dematerializes."); - game.sectx=0; + game.sector.x=0; for (l = 1; l <= 5; l++) { - ix = game.basex+3.0*Rand()-1; - iy = game.basey+3.0*Rand()-1; + ix = game.base.x+3.0*Rand()-1; + iy = game.base.y+3.0*Rand()-1; if (VALID_SECTOR(ix,iy) && game.quad[ix][iy]==IHDOT) { /* found one -- finish up */ - game.sectx=ix; - game.secty=iy; + game.sector.x=ix; + game.sector.y=iy; break; } } - if (game.sectx==0){ + if (game.sector.x==0){ prout("You have been lost in space..."); finish(FMATERIALIZE); return;