DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T f

⟦3a7d93c0a⟧ TextFile

    Length: 5713 (0x1651)
    Types: TextFile
    Names: »firing.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Trek73/src/firing.c« 

TextFile

#ident "@(#) TREK73 $Header: firing.c,v 1.1 87/10/09 11:06:25 okamoto Exp $"
/*
 * $Source: /ccc/okamoto/src/trek/src/RCS/firing.c,v $
 *
 * $Header: firing.c,v 1.1 87/10/09 11:06:25 okamoto Exp $
 *
 * $Log:	firing.c,v $
 * Revision 1.1  87/10/09  11:06:25  11:06:25  okamoto (Jeff Okamoto)
 * Initial revision
 * 
 */
/*
 * TREK73: firing.c
 *
 * Take care of firing phasers and torpedos for both enemy
 * and fed ships.
 *
 * phaser_firing, torpedo_firing, ship_detonate, torp_detonate
 *
 */

#include "externs.h"


phaser_firing(sp)
struct ship *sp;
{
	register int i;
	register float j;
	int	hit;
	struct	ship *ep;
	struct	torpedo *tp;
	int	s;
	int	x, y;
	struct	ship *target;
	struct	list *lp;
	float	bear;
	struct 	ship *fed;


	fed = shiplist[0];
	for (i=0; i<sp->num_phasers; i++) {
		if (sp->phasers[i].status & P_FIRING)
			break;
	}
	if (i == sp->num_phasers)
		return 0;
	sp->phasers[i].status &= ~P_FIRING;
	target = sp->phasers[i].target;
	/*
	 * Put in j the relative bearing of the phasers relative to the ship
	 * Put in bear the absolute direction the phasers are pointing
	 */
	bear = sp->phasers[i].bearing + sp->course;
	j = rectify(sp->phasers[i].bearing);
	if (betw(j, sp->p_blind_left, sp->p_blind_right)
	    && !is_dead(sp, S_ENG))
		return 0;
	if (target != NULL && is_dead(target, S_DEAD)) {
		if ((sp = fed) && (!shutup[PHASERS+i])
		    && !(is_dead(sp, S_DEAD))) {
			printf("%s phaser %d unlocking\n",
			    sp->name, i+1);
			shutup[PHASERS+i]++;
		}
		sp->phasers[i].target = NULL;
		return 0;
	}
	if (cantsee(sp))
		(void) e_cloak_off(sp, fed);
	printf(" <%s frng phasers>\n", sp->name);
	for (lp = &head; lp != tail; lp = lp->fwd) {
		if (lp->type == 0)
			continue;
		ep = NULL;
		tp = NULL;
		if (lp->type == I_SHIP) {
			ep = lp->data.sp;
			if (ep == sp)
				continue;
			x = ep->x;
			y = ep->y;
		} else {
			tp = lp->data.tp;
			x = tp->x;
			y = tp->y;
		}
		hit = phaser_hit(sp, x, y, &sp->phasers[i], bear);
		if (hit <= 0)
			continue;
		if (tp) {
			if (tp->timedelay > segment) {
				switch (lp->type) {
				case I_TORPEDO:
					printf("hit on torpedo %d\n",
						tp->id);
					break;
				case I_ENG:
					printf("hit on %s's engineering\n",
						tp->from->name);
					break;
				case I_PROBE:
					printf("hit on probe %d\n", 
						tp->id);
					break;
				default:
					fprintf(stderr, "hit on lp->type\n",
						lp->type);
					break;
				}
				tp->timedelay = 0.;
			}
			tp->fuel -= hit/2;
			if (tp->fuel < 0)
				tp->fuel = 0;
			continue;
		}
		/*
		 * Determine which shield was hit
		 */
		j = rectify(bearing(x, sp->x, y, sp->y) - ep->course);
		if (j > 315.0 || j < 45.0)
			s = 1;
		else if (j < 135.0)
			s = 2;
		else if (j < 225.0)
			s = 3;
		else
			s = 4;
		(void) damage(hit, ep, s, &p_damage, D_PHASER);
	}
	/*
	 * Reduce the load by the firing percentage
	 */
	sp->phasers[i].load *= 1.0 - (float) sp->p_percent / 100;
	return 0;
}

torpedo_firing(sp)
struct ship *sp;
{
	register int i;
	register float j;
	register int th;
	struct	torpedo *tp;
	struct	ship *target;
	struct	list *lp;
	float	bear;
	struct	ship *fed;

	fed = shiplist[0];
	for (i=0; i<sp->num_tubes; i++) {
		if (sp->tubes[i].status & T_FIRING)
			break;
	}
	if (i == sp->num_tubes)
		return 0;
	sp->tubes[i].status &= ~T_FIRING;
	th = sp->tubes[i].load;
	if (th == 0)
		return 0;
	target = sp->tubes[i].target;
	/*
	 * Put in j the relative bearing of the tubes to the ship
	 * Put in bear the absolute direction the tubes are pointing
	 */
	bear = sp->tubes[i].bearing + sp->course;
	j = rectify(sp->tubes[i].bearing);
	if (betw(j, sp->t_blind_left, sp->t_blind_right) && !is_dead(sp, S_ENG))
		return 0;
	if (target != NULL && (is_dead(target, S_DEAD))) {
		if ((sp == fed) && !shutup[TUBES+i] && !is_dead(sp, S_DEAD)) {
			printf("   tube %d disengaging\n", i+1);
			shutup[TUBES+i]++;
		}
		sp->tubes[i].target = NULL;
		return 0;
	}
	sp->tubes[i].load = 0;
	lp = newitem(I_TORPEDO);
	lp->type = I_TORPEDO;
	lp->data.tp = MKNODE(struct torpedo, *, 1);
	if (lp->data.tp == (struct torpedo *)NULL) {
		fprintf(stderr, "torpedo_firing: malloc failed\n");
		exit(2);
	}
	tp = lp->data.tp;
	tp->from = sp;
	tp->x = sp->x;
	tp->y = sp->y;
	tp->target = NULL;
	tp->course = rectify(bear);
	tp->fuel = th;
	tp->speed = sp->t_lspeed + sp->warp;
	tp->newspeed = tp->speed;
	tp->timedelay = (float)sp->t_delay;
	tp->prox = sp->t_prox;
	tp->id = new_slot();
	tp->type = TP_TORPEDO;
	if (teletype)
		printf("\007");
	if (cantsee(sp))
		(void) e_cloak_off(sp, fed);
	printf(" <<%s frng torpedo %d>>", sp->name, tp->id);
	if (teletype)
		printf("\007");
	printf("\n");
	return 1;
}

int
ship_detonate(sp, lp)
struct ship *sp;
struct list *lp;
{
	register int fuel;
	register int i;

	fuel = 0;
	printf("++%s++ destruct.\n", sp->name);
	for (i=0; i<sp->num_phasers; i++)
		if (!(sp->phasers[i].status & P_DAMAGED))
			fuel += min(sp->phasers[i].load, MAX_PHASER_CHARGE);
	for (i=0; i<sp->num_tubes; i++)
		if (!(sp->tubes[i].status & T_DAMAGED))
			fuel += min(sp->tubes[i].load, MAX_TUBE_CHARGE);
	fuel += sp->pods;
	antimatter_hit((char *) sp, sp->x, sp->y, fuel);
	lp->type = 0;
	for (i=0; i< S_NUMSYSTEMS; i++)
		sp->status[i] = 100;	/* He's dead, Jim */
	sp->cloaking = C_NONE;
	sp->complement = -1;
}


int
torp_detonate(tp, lp)
struct torpedo *tp;
struct list *lp;
{

	switch (lp->type) {
		case I_TORPEDO:
			printf(":: torp %d ::\n", tp->id);
			break;
		case I_PROBE:
			printf("** probe %d **\n", tp->id);
			break;
		case I_ENG:
			printf("## %s engineering ##\n", tp->from->name);
			break;
		default:
			fprintf(stderr, "torp_detonate lp->type %d\n",lp->type);
			break;
	}
	antimatter_hit((char *) tp, tp->x, tp->y, tp->fuel);
	return_slot(tp->id);
	delitem(lp);
}