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