X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fmoving.c;h=cb6e197b51e5c5625693382f65f9fd830767e42f;hp=99c18916da63bfaea1a42a31084b3d08ea53e4b0;hb=8f5eef7a4dcbfd3fa8ee33e1f50ae4b0c53efc9c;hpb=093f7d420e9cf92fbaf751f57a199c56562ae4b5 diff --git a/src/moving.c b/src/moving.c index 99c1891..cb6e197 100644 --- a/src/moving.c +++ b/src/moving.c @@ -8,10 +8,11 @@ void imove(void) /* movement execution for warp, impule, supernova, and tractor-beam events */ { double angle, deltax, deltay, bigger, x, y, - finald, finalx, finaly, stopegy, probf; - int n, m, kink, kinks, iquad; - coord w; - bool trbeam = 0; + finald, stopegy, probf; + int n, m, kink, kinks; + feature iquad; + coord w, final; + bool trbeam = false; w.x = w.y = 0; if (game.inorbit) { @@ -33,7 +34,7 @@ void imove(void) /* If tractor beam is to occur, don't move full distance */ if (game.state.date+game.optime >= scheduled(FTBEAM)) { trbeam = true; - game.condit = IHRED; + game.condition = red; game.dist = game.dist*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1; game.optime = scheduled(FTBEAM) - game.state.date + 1e-5; } @@ -53,12 +54,11 @@ void imove(void) if (game.nenhere != 0 && game.iattak != 2) { newcnd(); for_local_enemies(m) { - finald = sqrt((w.x-game.ks[m].x)*(double)(w.x-game.ks[m].x) + - (w.y-game.ks[m].y)*(double)(w.y-game.ks[m].y)); - game.kavgd[m] = 0.5 * (finald+game.kdist[m]); + finald = distance(w, game.ks[m]); + game.kavgd[m] = 0.5 * (finald + game.kdist[m]); } /* - * Stas Sergeev added the game.condition + * Stas Sergeev added the condition * that attacks only happen if Klingons * are present and your skill is good. */ @@ -123,8 +123,7 @@ void imove(void) if (iquad != IHDOT) { /* object encountered in flight path */ stopegy = 50.0*game.dist/game.optime; - 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.dist = distance(game.sector, w) / (QUADSIZE * 1.0); switch (iquad) { case IHT: /* Ram a Tholian */ case IHK: /* Ram enemy ship */ @@ -132,11 +131,9 @@ void imove(void) case IHS: case IHR: case IHQUEST: - game.sector.x = w.x; - game.sector.y = w.y; - ram(0, iquad, game.sector); - finalx = game.sector.x; - finaly = game.sector.y; + game.sector = w; + ram(false, iquad, game.sector); + final = game.sector; break; case IHBLANK: skip(1); @@ -174,10 +171,9 @@ void imove(void) proutn(_("Emergency stop required ")); prout(_("%2d units of energy."), (int)stopegy); game.energy -= stopegy; - finalx = x-deltax+0.5; - game.sector.x = finalx; - finaly = y-deltay+0.5; - game.sector.y = finaly; + final.x = x-deltax+0.5; + final.y = y-deltay+0.5; + game.sector = final; if (game.energy <= 0) { finish(FNRG); return; @@ -187,20 +183,16 @@ void imove(void) goto no_quad_change; /* sorry! */ } } - 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; + game.dist = distance(game.sector, w) / (QUADSIZE * 1.0); + game.sector = w; } - finalx = game.sector.x; - finaly = game.sector.y; + final = game.sector; no_quad_change: /* No quadrant change -- compute new avg enemy distances */ game.quad[game.sector.x][game.sector.y] = game.ship; if (game.nenhere) { for_local_enemies(m) { - finald = sqrt((w.x-game.ks[m].x)*(double)(w.x-game.ks[m].x) + - (w.y-game.ks[m].y)*(double)(w.y-game.ks[m].y)); + finald = distance(w, game.ks[m]); game.kavgd[m] = 0.5 * (finald+game.kdist[m]); game.kdist[m] = finald; } @@ -220,7 +212,7 @@ void dock(bool verbose) /* dock our ship at a starbase */ { chew(); - if (game.condit == IHDOCKED && verbose) { + if (game.condition == docked && verbose) { prout(_("Already docked.")); return; } @@ -233,7 +225,7 @@ void dock(bool verbose) prout(_(" not adjacent to base.")); return; } - game.condit = IHDOCKED; + game.condition = docked; if (verbose) prout(_("Docked.")); game.ididit = true; if (game.energy < game.inenrg) game.energy = game.inenrg; @@ -242,11 +234,11 @@ void dock(bool verbose) game.lsupres = game.inlsr; game.state.crew = FULLCREW; if (!damaged(DRADIO) && - (is_scheduled(FCDBAS) || game.isatb == 1) && game.iseenit == 0) { + (is_scheduled(FCDBAS) || game.isatb == 1) && !game.iseenit) { /* get attack report from base */ prout(_("Lt. Uhura- \"Captain, an important message from the starbase:\"")); attakreport(false); - game.iseenit = 1; + game.iseenit = true; } } @@ -285,7 +277,7 @@ static void getcd(bool isprobe, int akey) return; } while (navmode == unspecified) { - if (damaged(DCOMPTR)) { + if (damaged(DNAVSYS)) { if (isprobe) prout(_("Computer damaged; manual navigation only")); else @@ -718,7 +710,7 @@ void atover(bool igrab) } else { prout(_("saved.")); - game.icrystl = 1; + game.icrystl = true; } } } @@ -783,7 +775,8 @@ void atover(bool igrab) void timwrp() /* let's do the time warp again */ { - int l, gotit; + int l; + bool gotit; prout(_("***TIME WARP ENTERED.")); if (game.state.snap && Rand() < 0.5) { /* Go back in time */ @@ -807,10 +800,10 @@ void timwrp() /* Make sure Galileo is consistant -- Snapshot may have been taken when on planet, which would give us two Galileos! */ - gotit = 0; + gotit = false; for (l = 0; l < game.inplan; l++) { if (game.state.plnets[l].known == shuttle_down) { - gotit = 1; + gotit = true; if (game.iscraft==1 && game.ship==IHE) { prout(_("Checkov- \"Security reports the Galileo has disappeared, Sir!")); game.iscraft = 0; @@ -819,7 +812,7 @@ void timwrp() } /* Likewise, if in the original time the Galileo was abandoned, but was on ship earlier, it would have vanished -- lets restore it */ - if (game.iscraft==0 && gotit==0 && game.damage[DSHUTTL] >= 0.0) { + if (game.iscraft==0 && !gotit && game.damage[DSHUTTL] >= 0.0) { prout(_("Checkov- \"Security reports the Galileo has reappeared in the dock!\"")); game.iscraft = 1; } @@ -865,7 +858,7 @@ void probe(void) if (is_scheduled(FDSPROB)) { chew(); skip(1); - if (damaged(DRADIO) && game.condit != IHDOCKED) { + if (damaged(DRADIO) && game.condition != docked) { prout(_("Spock- \"Records show the previous probe has not yet")); prout(_(" reached its destination.\"")); } @@ -914,6 +907,26 @@ void probe(void) return; } +/* + * Here's how the mayday code works: + * + * First, the closest starbase is selected. If there is a + * a starbase in your own quadrant, you are in good shape. + * This distance takes quadrant distances into account only. + * + * A magic number is computed based on the distance which acts + * as the probability that you will be rematerialized. You + * get three tries. + * + * When it is determined that you should be able to be remater- + * ialized (i.e., when the probability thing mentioned above + * comes up positive), you are put into that quadrant (anywhere). + * Then, we try to see if there is a spot adjacent to the star- + * base. If not, you can't be rematerialized!!! Otherwise, + * it drops you there. It only tries five times to find a spot + * to drop you. After that, it's your problem. + */ + void mayday(void) /* yell for help from nearest starbase */ { @@ -922,8 +935,8 @@ void mayday(void) int line = 0, m, ix, iy; chew(); - /* Test for game.conditions which prevent calling for help */ - if (game.condit == IHDOCKED) { + /* Test for conditions which prevent calling for help */ + if (game.condition == docked) { prout(_("Lt. Uhura- \"But Captain, we're already docked.\"")); return; }