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