xref: /csrg-svn/games/trek/damage.c (revision 60857)
121271Sdist /*
2*60857Sbostic  * Copyright (c) 1980, 1993
3*60857Sbostic  *	The Regents of the University of California.  All rights reserved.
434205Sbostic  *
542605Sbostic  * %sccs.include.redist.c%
621271Sdist  */
721271Sdist 
811664Smckusick #ifndef lint
9*60857Sbostic static char sccsid[] = "@(#)damage.c	8.1 (Berkeley) 05/31/93";
1034205Sbostic #endif /* not lint */
1111664Smckusick 
1211664Smckusick # include	"trek.h"
1311664Smckusick 
1411664Smckusick /*
1511664Smckusick **  Schedule Ship.damages to a Device
1611664Smckusick **
1711664Smckusick **	Device `dev1' is damaged in an amount `dam'.  Dam is measured
1811664Smckusick **	in stardates, and is an additional amount of damage.  It should
1911664Smckusick **	be the amount to occur in non-docked mode.  The adjustment
2011664Smckusick **	to docked mode occurs automatically if we are docked.
2111664Smckusick **
2211664Smckusick **	Note that the repair of the device occurs on a DATE, meaning
2311664Smckusick **	that the dock() and undock() have to reschedule the event.
2411664Smckusick */
2511664Smckusick 
damage(dev1,dam)2611664Smckusick damage(dev1, dam)
2711664Smckusick int	dev1;		/*  device index */
2812737Slayer double	dam;		/* time to repair */
2911664Smckusick {
3011664Smckusick 	register int		i;
3111664Smckusick 	register struct event	*e;
3211664Smckusick 	int			f;
3311664Smckusick 	register int		dev;
3411664Smckusick 
3511664Smckusick 	/* ignore zero damages */
3611664Smckusick 	if (dam <= 0.0)
3711664Smckusick 		return;
3811664Smckusick 	dev = dev1;
3911664Smckusick 
4011664Smckusick 	printf("\t%s damaged\n", Device[dev].name);
4111664Smckusick 
4211664Smckusick 	/* find actual length till it will be fixed */
4311664Smckusick 	if (Ship.cond == DOCKED)
4412344Slayer 		dam *= Param.dockfac;
4511664Smckusick 	/* set the damage flag */
4611664Smckusick 	f = damaged(dev);
4711664Smckusick 	if (!f)
4811664Smckusick 	{
4911664Smckusick 		/* new damages -- schedule a fix */
5011664Smckusick 		schedule(E_FIXDV, dam, 0, 0, dev);
5111664Smckusick 		return;
5211664Smckusick 	}
5311664Smckusick 	/* device already damaged -- add to existing damages */
5411664Smckusick 	/* scan for old damages */
5511664Smckusick 	for (i = 0; i < MAXEVENTS; i++)
5611664Smckusick 	{
5711664Smckusick 		e = &Event[i];
5811664Smckusick 		if (e->evcode != E_FIXDV || e->systemname != dev)
5911664Smckusick 			continue;
6011664Smckusick 		/* got the right one; add on the new damages */
6111664Smckusick 		reschedule(e, e->date - Now.date + dam);
6211664Smckusick 		return;
6311664Smckusick 	}
6411664Smckusick 	syserr("Cannot find old damages %d\n", dev);
6511664Smckusick }
66