V10/games/trek/warp.c
# include "trek.h"
/**
** move under warp power
**/
float newpos();
ram()
{
register int course;
int ix, iy;
float dist;
if(getsect(&ix, &iy)==0)
return;
course=dokalc(Quadx,Quady,ix,iy,&dist);
warp(1,course,dist);
}
move()
{
int course;
float dist;
if(Status.cond==DOCKED) {
printf("%s is docked.\n", Status.shipname);
return;
}
if(getcodi(&course, &dist)==0)
return;
warp(0, course, dist);
}
warp(ramflg, c, d)
int ramflg;
int c;
double d;
{
int course;
char evc;
float power;
float dist;
float time;
float speed;
double frac;
register int percent;
register int i;
extern char Snapshot[];
if (Damage[WARP])
{
printf("Warp drive is disabled\n");
return;
}
course = c;
dist = d;
time = Param.warptime * dist / Status.warp2;
power = (dist + 0.05) * Status.warp3;
power =+ Status.cloaked * Param.cloakenergy * time;
percent = 100 * power / Status.energy + 0.5;
percent =* (Status.shldup+1);
if (percent >= 85)
{
printf("Scotty: That would consume %d%% of our remaining energy.\n",
percent);
if (!getynpar("Are you sure that is wise"))
return;
}
percent = 100 * time / Status.time + 0.5;
if (percent >= 85)
{
printf("Spock: That would take %d%% of our remaining time.\n",
percent);
if (!getynpar("Are you sure that is wise"))
return;
}
if (ranf(200) < 25 * (Status.warp - 6.0))
{
frac = franf();
dist =* frac;
time =* frac;
damage(WARP, (frac + 1.0) * Status.warp * (franf() + 0.25) * 0.20);
printf("Damage occurred to warp engines\n");
}
speed = Status.warp2 / Param.warptime;
Move.delta = newpos(ramflg, course, time, speed);
dist = Move.delta * speed;
Status.energy =- dist * Status.warp3 * (Status.shldup + 1);
if (Status.warp <= 9.0)
return;
printf("___ Speed exceeding warp nine ___\n");
sleep(2);
printf("Ship's safety systems malfunction\n");
sleep(2);
printf("Crew experiencing extreme sensory distortion\n");
sleep(4);
if (ranf(100) >= 50 * dist)
{
printf("Equilibrium restored -- all systems normal\n");
return;
}
percent = ranf(100);
if (percent < 90)
{
/* time warp */
if (percent < 35 || !Game.snap)
{
time = (Status.warp - 8.0) * dist * (franf() + 1.0);
Status.date =+ time;
printf("Positive time portal entered -- it is now Stardate %.2f\n",
Status.date);
for (i = 0; i < MAXEVENTS; i++)
if ((evc = Event[i].evcode) == E_FIXDV || evc == E_LRTB)
reschedule(&Event[i], time);
} else {
time = Status.date;
bmove(i=Snapshot, &Status.bases, 2);
bmove(i =+ 2, &Status.date, 12);
bmove(i =+ 12, &Quad, sizeof Quad);
bmove(i =+ sizeof Quad, &Event, sizeof Event);
bmove(i =+ sizeof Event, &Base, sizeof Base);
bmove(i =+ sizeof Base, &Etc, sizeof Etc);
printf("Negative time portal entered -- it is now Stardate %.2f\n",
Status.date);
for (i = 0; i < MAXEVENTS; i++)
if (Event[i].evcode == E_FIXDV)
reschedule(&Event[i], Status.date - time);
}
} else if (percent < 95)
lose(L_TOOFAST);
else {
printf("Equilibrium restored -- extreme damage occured to ship systems\n");
for (i = 0; i < NDEV; i++)
damage(i, (franf() + 1.0) * (Status.warp - 6) * Param.damfac[i] * 0.20);
Status.shldup = 0;
dcrept();
}
}