xref: /original-bsd/games/trek/damage.c (revision 7385a648)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)damage.c	5.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 # include	"trek.h"
23 
24 /*
25 **  Schedule Ship.damages to a Device
26 **
27 **	Device `dev1' is damaged in an amount `dam'.  Dam is measured
28 **	in stardates, and is an additional amount of damage.  It should
29 **	be the amount to occur in non-docked mode.  The adjustment
30 **	to docked mode occurs automatically if we are docked.
31 **
32 **	Note that the repair of the device occurs on a DATE, meaning
33 **	that the dock() and undock() have to reschedule the event.
34 */
35 
36 damage(dev1, dam)
37 int	dev1;		/*  device index */
38 double	dam;		/* time to repair */
39 {
40 	register int		i;
41 	register struct event	*e;
42 	int			f;
43 	register int		dev;
44 
45 	/* ignore zero damages */
46 	if (dam <= 0.0)
47 		return;
48 	dev = dev1;
49 
50 	printf("\t%s damaged\n", Device[dev].name);
51 
52 	/* find actual length till it will be fixed */
53 	if (Ship.cond == DOCKED)
54 		dam *= Param.dockfac;
55 	/* set the damage flag */
56 	f = damaged(dev);
57 	if (!f)
58 	{
59 		/* new damages -- schedule a fix */
60 		schedule(E_FIXDV, dam, 0, 0, dev);
61 		return;
62 	}
63 	/* device already damaged -- add to existing damages */
64 	/* scan for old damages */
65 	for (i = 0; i < MAXEVENTS; i++)
66 	{
67 		e = &Event[i];
68 		if (e->evcode != E_FIXDV || e->systemname != dev)
69 			continue;
70 		/* got the right one; add on the new damages */
71 		reschedule(e, e->date - Now.date + dam);
72 		return;
73 	}
74 	syserr("Cannot find old damages %d\n", dev);
75 }
76