xref: /csrg-svn/games/trek/dock.c (revision 60857)
121275Sdist /*
2*60857Sbostic  * Copyright (c) 1980, 1993
3*60857Sbostic  *	The Regents of the University of California.  All rights reserved.
434205Sbostic  *
542605Sbostic  * %sccs.include.redist.c%
621275Sdist  */
721275Sdist 
811668Smckusick #ifndef lint
9*60857Sbostic static char sccsid[] = "@(#)dock.c	8.1 (Berkeley) 05/31/93";
1034205Sbostic #endif /* not lint */
1111668Smckusick 
1211668Smckusick # include	"trek.h"
1311668Smckusick 
1411668Smckusick /*
1511668Smckusick **  DOCK TO STARBASE
1611668Smckusick **
1711668Smckusick **	The starship is docked to a starbase.  For this to work you
1811668Smckusick **	must be adjacent to a starbase.
1911668Smckusick **
2011668Smckusick **	You get your supplies replenished and your captives are
2111668Smckusick **	disembarked.  Note that your score is updated now, not when
2211668Smckusick **	you actually take the captives.
2311668Smckusick **
2411668Smckusick **	Any repairs that need to be done are rescheduled to take
2511668Smckusick **	place sooner.  This provides for the faster repairs when you
2611668Smckusick **	are docked.
2711668Smckusick */
2811668Smckusick 
dock()2911668Smckusick dock()
3011668Smckusick {
3111668Smckusick 	register int		i, j;
3211668Smckusick 	int			ok;
3311668Smckusick 	register struct event	*e;
3411668Smckusick 
3511668Smckusick 	if (Ship.cond == DOCKED)
3611668Smckusick 		return (printf("Chekov: But captain, we are already docked\n"));
3711668Smckusick 	/* check for ok to dock, i.e., adjacent to a starbase */
3811668Smckusick 	ok = 0;
3911668Smckusick 	for (i = Ship.sectx - 1; i <= Ship.sectx + 1 && !ok; i++)
4011668Smckusick 	{
4111668Smckusick 		if (i < 0 || i >= NSECTS)
4211668Smckusick 			continue;
4311668Smckusick 		for (j = Ship.secty - 1; j <= Ship.secty + 1; j++)
4411668Smckusick 		{
4511668Smckusick 			if (j  < 0 || j >= NSECTS)
4611668Smckusick 				continue;
4711668Smckusick 			if (Sect[i][j] == BASE)
4811668Smckusick 			{
4911668Smckusick 				ok++;
5011668Smckusick 				break;
5111668Smckusick 			}
5211668Smckusick 		}
5311668Smckusick 	}
5411668Smckusick 	if (!ok)
5511668Smckusick 		return (printf("Chekov: But captain, we are not adjacent to a starbase.\n"));
5611668Smckusick 
5711668Smckusick 	/* restore resources */
5811668Smckusick 	Ship.energy = Param.energy;
5911668Smckusick 	Ship.torped = Param.torped;
6011668Smckusick 	Ship.shield = Param.shield;
6111668Smckusick 	Ship.crew = Param.crew;
6212344Slayer 	Game.captives += Param.brigfree - Ship.brigfree;
6311668Smckusick 	Ship.brigfree = Param.brigfree;
6411668Smckusick 
6511668Smckusick 	/* reset ship's defenses */
6611668Smckusick 	Ship.shldup = 0;
6711668Smckusick 	Ship.cloaked = 0;
6811668Smckusick 	Ship.cond = DOCKED;
6911668Smckusick 	Ship.reserves = Param.reserves;
7011668Smckusick 
7111668Smckusick 	/* recalibrate space inertial navigation system */
7211668Smckusick 	Ship.sinsbad = 0;
7311668Smckusick 
7411668Smckusick 	/* output any saved radio messages */
7511668Smckusick 	dumpssradio();
7611668Smckusick 
7711668Smckusick 	/* reschedule any device repairs */
7811668Smckusick 	for (i = 0; i < MAXEVENTS; i++)
7911668Smckusick 	{
8011668Smckusick 		e = &Event[i];
8111668Smckusick 		if (e->evcode != E_FIXDV)
8211668Smckusick 			continue;
8311668Smckusick 		reschedule(e, (e->date - Now.date) * Param.dockfac);
8411668Smckusick 	}
8511668Smckusick 	return;
8611668Smckusick }
8711668Smckusick 
8811668Smckusick 
8911668Smckusick /*
9011668Smckusick **  LEAVE A STARBASE
9111668Smckusick **
9211668Smckusick **	This is the inverse of dock().  The main function it performs
9311668Smckusick **	is to reschedule any damages so that they will take longer.
9411668Smckusick */
9511668Smckusick 
undock()9611668Smckusick undock()
9711668Smckusick {
9811668Smckusick 	register struct event	*e;
9911668Smckusick 	register int		i;
10011668Smckusick 
10111668Smckusick 	if (Ship.cond != DOCKED)
10211668Smckusick 	{
10311668Smckusick 		printf("Sulu: Pardon me captain, but we are not docked.\n");
10411668Smckusick 		return;
10511668Smckusick 	}
10611668Smckusick 	Ship.cond = GREEN;
10711668Smckusick 	Move.free = 0;
10811668Smckusick 
10911668Smckusick 	/* reschedule device repair times (again) */
11011668Smckusick 	for (i = 0; i < MAXEVENTS; i++)
11111668Smckusick 	{
11211668Smckusick 		e = &Event[i];
11311668Smckusick 		if (e->evcode != E_FIXDV)
11411668Smckusick 			continue;
11511668Smckusick 		reschedule(e, (e->date - Now.date) / Param.dockfac);
11611668Smckusick 	}
11711668Smckusick 	return;
11811668Smckusick }
119