V10/games/trek/warp.c

Compare this file to the similar file:
Show the results in this format:

# 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();
		}
}