Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!watmath!clyde!cbatt!ucbvax!okamoto
From: okamoto@ucbvax.UUCP
Newsgroups: net.sources.games
Subject: Trek73 (Part 1 of 6)
Message-ID: <16574@ucbvax.BERKELEY.EDU>
Date: Wed, 10-Dec-86 12:10:11 EST
Article-I.D.: ucbvax.16574
Posted: Wed Dec 10 12:10:11 1986
Date-Received: Sun, 14-Dec-86 03:25:27 EST
Organization: University of California at Berkeley
Lines: 1979

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	Makefile
#	defines.h
#	externs.h
#	options.h
#	structs.h
#	cmds1.c
#	cmds2.c
# This archive created: Wed Dec 10 09:01:05 1986
# By:	Jeff Okamoto ()
export PATH; PATH=/bin:$PATH
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
#
# Makefile for TREK73
#

#
# Select which operating system you are using.
# Acceptable flags are BSD and SYSV.
#
OS =	BSD

#
# Select whether you wish to use symbolic debugger or not.
# NOTE: UNIX System V Release 2.0 cannot do profiling on programs
# compiled with -g.  Also, sdb will not be very useful if the
# symbols are stripped from the load module. (See STRIP)
#SDB =	-g
SDB =

#
# Select whether code optimization is to be done.
OPT =	-O
#OPT =

#
# Select whether profiling is to be done.
# NOTE: In System V Relase 2.0, this is incompatible with
# both SDB and STRIP.
# PROF =	-p
PROF =

#
# Select whether or not the load module is to be stripped.
# This is incompatible with both SDB and PROF.
# Note: In BSD Unix, this option should always be blank
# STRIP =	-s
STRIP =

#
# Select whether or not tracing mode is to be turned on.
# This is useful when testing new strategies.
TRACE =	-DTRACE


DEFINES = -D${OS}
CFLAGS = ${DEFINES} ${SDB} ${OPT} ${PROF} ${STRIP}

T73OBJECTS = cmds1.o cmds2.o cmds3.o cmds4.o damage.o dist.o endgame.o\
	enemycom.o firing.o globals.o init.o main.o misc.o mission.o\
	moveships.o parseopts.o save.o ships.o special.o strat1.o\
	subs.o vers.o

T73CFILES = cmds1.c cmds2.c cmds3.c cmds4.c damage.c dist.c endgame.c\
	enemycom.c firing.c globals.c init.c main.c misc.c mission.c\
	moveships.c parseopts.c save.c ships.c special.c strat1.c\
	subs.c vers.c

BPVOBJECTS = bpv.o ships.o

BPVFILES = bpv.c ships.c

DYOOBJECTS = shipyard.o

DYOFILES = shipyard.c

HEADS= structs.h defines.h externs.h

RDIST = ${T73CFILES} ${BPVFILES} ${DYOFILES} ${HEADS}

LIBS= -lm

FLUFF = parsit.o make.out errs core lint.errs a.out tags\
	shar.1 shar.2 shar.3 shar.4

BINS = trek73 bpv shipyard


all:	trek73 bpv shipyard

trek73:	${T73OBJECTS} parsit.o
	cc ${CFLAGS} ${T73OBJECTS} parsit.o ${LIBS}
	install a.out trek73

bpv:	${BPVOBJECTS}
	cc ${CFLAGS} ${BPVOBJECTS}
	install a.out bpv

shipyard:	${DYOOBJECTS}
	cc ${CFLAGS} ${DYOOBJECTS} -lm
	install a.out shipyard

${T73OBJECTS}: ${HEADS}

${BPVOBJECTS}: ${HEADS}

${DYOOBJECTS}: ${HEADS}

parsit.o: parsit.c
	cc -O -c parsit.c

tags: ${T73CFILES}
	ctags ${T73CFILES} ${HEADS}

count:
	wc ${T73CFILES} ${HEADS}

lint:
	lint -abchx ${DEFINES} ${T73CFILES} > lint.errs

clean:
	rm -f ${BINS} ${T73OBJECTS} ${DYOOBJECTS} ${BPVOBJECTS} ${FLUFF}

shar: shar.1 shar.2 shar.3 shar.4

shar.1: Makefile defines.h externs.h options.h structs.h cmds1.c cmds2.c
	shar Makefile defines.h externs.h options.h structs.h cmds1.c cmds2.c >$@

shar.2: cmds3.c cmds4.c damage.c dist.c endgame.c enemycom.c
	shar cmds3.c cmds4.c damage.c dist.c endgame.c enemycom.c >$@

shar.3: firing.c globals.c init.c main.c misc.c mission.c bpv.c shipyard.c
	shar firing.c globals.c init.c main.c misc.c mission.c bpv.c shipyard.c >$@

shar.4: moveships.c parseopts.c parsit.c save.c ships.c special.c strat1.c subs.c vers.c 
	shar moveships.c parseopts.c parsit.c save.c ships.c special.c strat1.c subs.c vers.c >$@ 
SHAR_EOF
chmod +x 'Makefile'
fi # end of overwriting check
if test -f 'defines.h'
then
	echo shar: will not over-write existing file "'defines.h'"
else
cat << \SHAR_EOF > 'defines.h'
/*
 * TREK73: defines.h
 *
 * Defines for TREK73
 *
 */

/* Globals externals */
extern char *strcpy(), *gets();
extern char *Gets();
extern float rectify(), bearing();


#ifdef BSD
extern long random();
#endif
#ifdef SYSV
#define random()	((long)(rand()))
#define srandom(seed)	(srand((unsigned)(seed)))
#endif

#define is_dead(sp, sys)	((sp)->status[sys] == 100)
#define randm(x)		((int)random() % (x) + 1)
#define syswork(sp, sys)	(randm(100) > (sp)->status[sys])
#define toradians(x)		((double)(x)*.0174533)
#define todegrees(x)		((double)(x)*57.2958)

#define betw(i, j, k)	(((j) < (i)) && ((i) < (k)))
#define min(x, y)	((x) < (y) ? (x) : (y))
#define max(x, y)	((x) > (y) ? (x) : (y))

#define cansee(x)	((x)->cloaking != C_ON)
#define cantsee(x)	((x)->cloaking == C_ON)

#define plural(n)	(((n) > 1) ? "s" : "")

#ifndef NULL
#define NULL	0
#endif

/*
 * for the item linked list
 */
#define I_UNDEFINED	0
#define I_SHIP		1
#define I_TORPEDO	2
#define I_PROBE		3
#define I_ENG		4

/*
 * for the ship status word
 */
#define S_COMP		0
#define S_SENSOR	1
#define S_PROBE		2
#define S_WARP		3
#define S_ENG		4
#define S_DEAD		5
#define S_SURRENDER	6
/* The following define must also be in structs.h */
#define S_NUMSYSTEMS	4	/* Number of systems with damage descriptions */
#define MAXSYSTEMS	7

/*
 * for the status message turn off array (shutup[])
 */
#define DISENGAGE	1			/* Autopilot disengaging */
#define SHIELDSF	2			/* Shields fluctuating */
#define PHASERS		3		/* Phasers disengaging */
#define TUBES		(PHASERS + MAXPHASERS)	/* Tubes disengaging */
#define SURRENDER	(TUBES + MAXTUBES)	/* Flag for enemy surrender */
#define SURRENDERP	20			/* Flag for our surrender */
#define PLAYDEAD	21			/* Flag for playing dead */
#define CORBOMITE	22			/* Flag for corbomite bluff */
#define BURNOUT		23			/* Flag for warp burnout */
#define HIGHSHUTUP	(BURNOUT + 10)		/* Burnout + 10 */

/*
 * Multiplier for shield 1
 */
#define SHIELD1		1.5

/*
 * Defines for the play status word
 */
#define NORMAL		000
#define F_SURRENDER	001
#define E_SURRENDER	002

/*
 * Phaser statuses
 */
#define P_NORMAL	000
#define P_DAMAGED	001
#define P_FIRING	002

/*
 * Tube statuses
 */
#define T_NORMAL	000
#define T_DAMAGED	001
#define T_FIRING	002

/*
 * Probe launcher status
 */
#define PR_NORMAL	000
#define PR_LAUNCHING	001
#define PR_DETONATE	002
#define PR_LOCK		004

/*
 * Cloaking device status / capability
 */
#define C_NONE		000
#define C_OFF		001
#define C_ON		002
#define CLOAK_DELAY	2	/*
				 * Number of turns after cloak is
				 * dropped before it can be reactivated
				 */

/*
 * For the damage routine
 */
#define D_PHASER	0
#define D_ANTIMATTER	1

/*
 * Some necessary constants
 */
#define HIT_PER_POD	5
#define PROX_PER_POD	50

/*
 * A handy little routine
 */
#define MKNODE(cast, star, number) (cast star)malloc(sizeof(cast) * number)

/*
 * Definitions for the bad guys
 */
#define MAXESHIPS	9
#define MAXFEDS		9
#define MAXECAPS	8
#define MAXFOERACES	9

/*
 * For the different ship classes
 */
#define MAXSHIPCLASS	4
#define MAXPHASERS	11
#define MAXTUBES	11

/*
 * Turn costs (either takes a turn or is a free command)
 */
#define TURN	1
#define	FREE	0

/*
 * Type of torpedo object (can be probe, torpedo, or engineering)
 */
#define TP_TORPEDO	0
#define	TP_PROBE	1
#define	TP_ENGINEERING	2

/*
 * Defines for the end of game calls to warn and final
 */
#define FIN_F_LOSE	0
#define FIN_E_LOSE	1
#define FIN_TACTICAL	2
#define FIN_F_SURRENDER	3
#define FIN_E_SURRENDER	4
#define FIN_COMPLETE	5
#define QUIT		6

/*
 * Number of items we allow in space.
 */
#define HIGHSLOT	300

/*
 * Trace flags
 */
#define TR_OFF		0
#define TR_ON		1

/*
 * Some hard constants
 */
#define MIN_PHASER_SPREAD	10
#define MAX_PHASER_SPREAD	45
#define MAX_PHASER_RANGE	1000
#define MAX_PHASER_CHARGE	10.
#define MIN_PHASER_DRAIN	-MAX_PHASER_CHARGE
#define MAX_PHASER_DRAIN	MAX_PHASER_CHARGE
#define MAX_TUBE_CHARGE		10
#define MAX_TUBE_PROX		500	/* 50 times the number of pods */
#define MAX_TUBE_SPEED		12
#define MAX_TUBE_TIME		10.
#define MAX_PROBE_DELAY		15
#define MIN_PROBE_CHARGE	10
#define MIN_PROBE_PROX		50
#define MIN_SENSOR_RANGE	100
#define MAX_SENSOR_RANGE	50000

#define INIT_P_SPREAD		MIN_PHASER_SPREAD
#define INIT_P_LOAD		MAX_PHASER_CHARGE
#define INIT_P_DRAIN		MAX_PHASER_DRAIN
#define INIT_P_PERCENT		100
#define INIT_T_LOAD		0
#define INIT_T_PROX		200
#define INIT_T_TIME		MAX_TUBE_TIME
#define INIT_T_SPEED		MAX_TUBE_SPEED
SHAR_EOF
chmod +x 'defines.h'
fi # end of overwriting check
if test -f 'externs.h'
then
	echo shar: will not over-write existing file "'externs.h'"
else
cat << \SHAR_EOF > 'externs.h'
/*
 * TREK73: externs.h
 *
 * External declarations for TREK73
 *
 */

/* UNIX include files needed for most (if not all) of the C files */
#include 
#ifdef SYSV
#include 
#endif SYSV
#ifdef BSD
#include 
#endif BSD
#include 

/* UNIX extern declarations of functions used which do not
   return int plus any extern variable declarations    */
extern char	*getenv(), *malloc();
extern long	time();
extern unsigned	sleep(), alarm();
extern void	exit(), free(), perror();
#ifdef SYSV
extern void	srand();
#endif SYSV
extern char	*optarg;

/*
 * Now continue with declarations specific to TREK73
 */

#include "structs.h"

extern char	*Gets(), *vowelstr();
extern char	*sysname[S_NUMSYSTEMS];
extern char	*statmsg[S_NUMSYSTEMS + 1];
extern char	*feds[];
extern char	*options;

extern float	init_p_turn[MAXPHASERS][MAXPHASERS];
extern float	init_t_turn[MAXTUBES][MAXTUBES];
extern float	segment, timeperturn;
extern float	rectify(), bearing();

extern char	home[256];
extern char	savefile[256];
extern char	captain[30];
extern char	class[3];
extern char	com[30];
extern char	com_delay[6];
extern char	empire[30];
extern char	engineer[30];
extern char	foeclass[3];
extern char	foename[30];
extern char	foerace[30];
extern char	foestype[30];
extern char	helmsman[30];
extern char	nav[30];
extern char	racename[20];
extern char	savefile[256];
extern char	science[30];
extern char	sex[20];
extern char	shipname[30];
extern char	shutup[HIGHSHUTUP];
extern char	slots[HIGHSLOT];
extern char	title[9];

extern int	cmdarraysize;
extern int	corbomite;
extern int	defenseless;
extern int	enemynum;
extern int	global;
extern int	high_command;
extern int	reengaged;
extern int	restart;
extern int	shipnum;
extern int	silly;
extern int	surrender;
extern int	surrenderp;
extern int	teletype;
extern int	terse;
extern int	time_delay;
extern int	trace;
extern char	can_cloak;
extern double	o_bpv;
extern double	e_bpv;

extern struct ship_stat	us;
extern struct ship_stat	them;

extern int 	(*strategies[])();
extern int	rangefind();

extern struct cmd		*scancmd(), cmds[];
extern struct race_info		aliens[MAXFOERACES];
extern struct damage		p_damage, a_damage;
extern struct list		*newitem(), head, *tail;
extern struct ship		*shiplist[10], *ship_name();
extern struct ship_stat		stats[];
SHAR_EOF
chmod +x 'externs.h'
fi # end of overwriting check
if test -f 'options.h'
then
	echo shar: will not over-write existing file "'options.h'"
else
cat << \SHAR_EOF > 'options.h'
/*
 * TREK73: options.h
 *
 * Parse_opts defines
 *
 */

#define	BOOLEAN	0
#define STRING 1
SHAR_EOF
chmod +x 'options.h'
fi # end of overwriting check
if test -f 'structs.h'
then
	echo shar: will not over-write existing file "'structs.h'"
else
cat << \SHAR_EOF > 'structs.h'
/*
 * TREK73: structs.h
 *
 * Struct Defs for TREK73
 *
 */

#include "defines.h"

struct phaser {
	struct ship *target;	/* who we're aimed at */
	float bearing;		/* direction aimed (if no target) */
	int drain;		/* Drain from engines (to if negative) */
	short load;		/* energy in phasers */
	char status;		/* Damaged, etc. */
} ;

struct tube {
	struct ship *target;	/* who we're aimed at */
	float bearing;		/* direction aimed (if no target) */
	int load;		/* energy in tubes */
	char status;		/* Damaged, etc */
} ;

struct shield {
	float eff;		/* efficiency from 0-1 */
	float drain;		/* Actual drain from engines */
	float attemp_drain;	/* Attempted drain from engines */
} ;

#define MAXWEAPONS 11
#define SHIELDS 4

struct ship {
	char name[30];		/* name of ship */
	char class[3];		/* Type of ship */
	int x, y;		/* location */
	float warp;		/* warp speed */
	float newwarp;		/* for speed changes */
	float course;		/* 0-360 */
	float newcourse;	/* for course changes */
	struct ship *target;	/* who we're pursuing */
	float relbear;		/* Relative bearing to keep */
	struct phaser phasers[MAXWEAPONS];	/* phaser banks */
	int p_spread;		/* phaser spread */
	int p_percent;		/* phaser firing percentage */
	int p_blind_left;	/* phaser blind area, left side angle */
	int p_blind_right;	/* phaser blind area, right side angle */
	struct tube tubes[MAXWEAPONS];		/* torpedo tubes */
	int t_prox;		/* proximity delay */
	int t_delay;		/* time delay to detonation */
	int t_lspeed;		/* launch speed */
	int t_blind_left;	/* tube blind area, left side angle */
	int t_blind_right;	/* tube blind area, right side angle */
	struct shield shields[SHIELDS]; /* shields */
	int probe_status;	/* Probe launcher status */
	float eff;		/* efficiency */
	float regen;		/* regeneration (energy per turn) */
	float energy;		/* amount of effective energy */
	float pods;		/* max energy level */
	int complement;		/* crew left alive */
	int status[MAXSYSTEMS];	/* Holds damage percentage of these systems */
	float delay;		/* how long 'till we blow up? */
	int id;			/* Unique identifier */
	int num_phasers;	/* Number of phasers */
	int num_tubes;		/* Number of tubes */
	float orig_max;		/* Maximum original warp */
	float max_speed;	/* Maximum warp */
	float deg_turn;		/* Degrees per warp turn */
	float ph_damage;	/* Damage divisor from phasers */
	float tu_damage;	/* Damage divisor from tubes */
	int cloaking;		/* Cloaking device status */
	int cloak_energy;	/* Energy needed to run cloak per segment */
	int cloak_delay;	/* Time until a cloak may be restarted */
	int (*strategy)();	/* Which strategy to use */
	struct pos {	/* Last known position (before a cloak) */
		int x,y;	/* Coordinates */
		float warp;	/* Warp speed */
		int range;	/* Distance to ship */
		float bearing;	/* Bearing */
		float course;	/* Course */
	} position ;
	int p_firing_delay;	/* Delay in segments for firing phasers */
	int t_firing_delay;	/* Delay in segments for firing torpedoes */
} ;

/*
 * note that probes act like torpedos
 * but have targets; torps only have
 * courses
 */
struct torpedo {
	struct ship *from;	/* pointer to ship they're from */
	int x, y;		/* coords of object */
	float course;		/* where it's going */
	float speed;		/* how fast we're moving */
	float newspeed;		/* what our target speed is */
	struct ship *target;	/* who we're aimed at */
	int fuel;		/* how many antimatter pods it has */
	float timedelay;	/* seconds until detonation */
	int prox;		/* proximity fuse */
	int id;			/* Unique identifier */
	int type;		/* torpedo, probe, or engineering */
} ;

/*
 * the list of what's in space -- depending on the type, we use
 * differing parts of the union (data) structure.  it's a linked
 * list of all the stuff in space.
 */
struct list {
	int type;
	struct list *back, *fwd;
	union {
		struct torpedo *tp;
		struct ship *sp;
	} data;
} ;

struct cmd {
	int (*routine)();
	char *word1;
	char *word2;
	int turns;
} ;

/*
 * for the phaser and anti-matter damage lists
 */

struct dam {
	int roll;
	char *mesg;
};

struct damage {
	float eff;
	float fuel;
	float regen;
	float crew;
	float weapon;
	struct dam stats[S_NUMSYSTEMS];
};

struct score {
	int score;
	int ships;
	char captain[30];
	char username[10];
}; 

struct rates {
	char *rate;
	int points;
};

struct ship_stat {
	char abbr[4];		/* Abbreviation */
	int class_num;		/* Index into array */
	int num_phaser;		/* Number of phasers */
	int num_torp;		/* Number of tubes */
	int o_warpmax;		/* Own max speed */
	int e_warpmax;		/* Enemy max speed */
	float o_eff;		/* Own efficiency */
	float e_eff;		/* Enemy efficiency */
	float regen;		/* Regeneration */
	float energy;		/* Starting fuel */
	float pods;		/* Max pods */
	int o_crew;		/* Own crew */
	int e_crew;		/* Enemy crew */
	float ph_shield;	/* Divisor for phaser damage */
	float tp_shield;	/* Divisor for torp damage */
	int turn_rate;		/* Degrees per warp-second */
	int cloaking_energy;	/* Energy to run cloaking device */
	int t_blind_left;	/* Start of tube blind area left */
	int t_blind_right;	/* Start of tube blind area right */
	int p_blind_left;	/* Start of phaser blind area left */
	int p_blind_right;	/* Start of phaser blind area right */
	/* Must change to absolute time */
	int p_firing_delay;	/* Delay in segments for firing phasers */
	int t_firing_delay;	/* Delay in segments for firing torpedoes */
};

struct race_info {
	char race_name[30];	/* Name of the race */
	char empire_name[30];	/* What they call themselves */
	int id;			/* Identifier number */
	int surrender;		/* Chance they will accept a surrender */
	int surrenderp;		/* Chance they will surrender to you */
	int corbomite;		/* Chance they fall for a corbomite bluff */
	int defenseless;	/* Chance they fall for a defenseless ruse */
	int attitude;		/* Attitude factor for strategies */
	char *ship_names[MAXESHIPS];	/* Ship names */
	char *ship_types[MAXSHIPCLASS];	/* Ship types */
	char *captains[MAXECAPS];	/* Some exemplary captains */
	/*
	 * For the strategic game that is to come.  -Deep Thought
	 */
	int relation;		/* Diplomatic relation with other races */
};

struct planet {
	char name[30];		/* Planetary name */
	int id;			/* Unique identifier number */
	int x;			/* Location in the X plane */
	int y;			/* Location in the Y plane */
	int radius;		/* Planetary radius */
	int mass;		/* Planetary mass */
	int race;		/* Owner's race */
	/*
	 * planetary weaponry goes here
	 */
};
SHAR_EOF
chmod +x 'structs.h'
fi # end of overwriting check
if test -f 'cmds1.c'
then
	echo shar: will not over-write existing file "'cmds1.c'"
else
cat << \SHAR_EOF > 'cmds1.c'
/*
 * TREK73: cmds1.c
 *
 * User Commands
 *
 * fire_phasers, fire_tubes, lock_phasers, lock_tubes,
 * turn_phasers, turn_tubes, load_tubes, launch_probe,
 * probe_control
 *
 */

#include "externs.h"

fire_phasers(sp) 
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	char	c;
	int	typed[MAXPHASERS];
	register int i;
	register int k;

	for (i=0; inum_phasers);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL) {
		printf("%s:  Belay that order!\n", captain);
		return 0;
	}
	printf("   spread [10-45] ");
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL) {
		printf("%s:  Belay that order!\n", captain);
		return 0;
	}
	i = atoi(buf2);
	if (i < 10 || i > 45)
		return 0;
	sp->p_spread = i;
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_phasers - 1)
				continue;
			typed[k]++;
			if (sp->phasers[k].status & (P_DAMAGED | P_FIRING))
				continue;
			sp->phasers[k].status |= P_FIRING;
		}
	else
		for (i=0; inum_phasers; i++) {
			typed[i]++;
			if (sp->phasers[i].status & (P_DAMAGED | P_FIRING))
				continue;
			sp->phasers[i].status |= P_FIRING;
		}
	check_p_damage(typed, sp, "fire");	/* Type out if damaged */
	check_p_turn(typed, sp, 1);
	return 1;
}


fire_tubes(sp)
struct ship *sp;
{
	char	buf1[20];
	char	c;
	int	typed[MAXTUBES];
	register int i;
	register int j;
	register int k;

	for (i=0; inum_tubes);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL) {
		printf("%s:  Belay that order!\n", captain);
		return 0;
	}
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_tubes - 1)
				continue;
			typed[k]++;
			if (sp->tubes[k].status & (T_DAMAGED | T_FIRING))
				continue;
			sp->tubes[k].status |= T_FIRING;
		}
	else
		for (i=0; inum_tubes; i++) {
			typed[i]++;
			if (sp->tubes[i].status & (T_DAMAGED | T_FIRING))
				continue;
			sp->tubes[i].status |= T_FIRING;
		}
	check_t_damage(typed, sp, "fire");	/* Type if damaged */
	check_t_turn(typed, sp, 1);
	j = 0;
	for (i=0; i < sp->num_tubes; i++) {
		if ((typed[i] == 0) || (!(sp->tubes[i].status & T_FIRING)))
			continue;
		if (sp->tubes[i].load == 0) {
			if (!j)
				printf("Computer: Tube(s) %d", i + 1);
			else
				printf(", %d", i + 1);
			j++;
		}
	}
	if (j > 1)
		puts(" are not loaded.");
	else if (j == 1)
		puts(" is not loaded.");
	return 0;
}


lock_phasers(sp)
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	int	typed[MAXPHASERS];
	char	c;
	struct	ship *ep;
	register int i;
	register int k;

	for (i=0; inum_phasers);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	printf("   onto [whom] ");
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL)
		return 0;
	ep = ship_name(buf2);
	if (ep == NULL)
		return 0;
	if (cantsee(ep)) {
		printf("%s:  %s, unable to lock phasers onto %s.\n",
		    nav, title, ep->name);
		return 0;
	}
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_phasers - 1)
				continue;
			typed[k]++;
			if (sp->phasers[k].status & P_DAMAGED)
				continue;
			sp->phasers[k].target = ep;
		}
	else
		for (i=0; inum_phasers; i++) {
			typed[i]++;
			if (sp->phasers[i].status & P_DAMAGED)
				continue;
			sp->phasers[i].target = ep;
		}
	check_p_damage(typed, sp, "lock");
	check_p_turn(typed, sp, 0);
	return 1;
}


lock_tubes(sp)
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	int	typed[MAXTUBES];
	char	c;
	struct	ship *ep;
	register int i;
	register int k;

	for (i=0; inum_tubes; i++)
		typed[i] = 0;
	if (is_dead(sp, S_COMP)) {
		printf("%s:  Impossible %s, our computer is dead.\n", science, title);
		return 0;
	}
	if (!syswork(sp, S_COMP)) {
		printf("%s:  Our computer is temporarily buggy", science);
		return 0;
	}
	printf("   lock tubes [1-%d] ", sp->num_tubes);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	printf("   onto whom ");
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL)
		return 0;
	ep = ship_name(buf2);
	if (ep == NULL)
		return 0;
	if (cantsee(ep)) {
		printf ("%s:  %s, unable to lock tubes onto %s.",
		    nav, title, ep->name);
		return 0;
	}
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_tubes - 1)
				continue;
			typed[k]++;
			if (sp->tubes[k].status & T_DAMAGED)
				continue;
			sp->tubes[k].target = ep;
		}
	else
		for (i=0; inum_tubes; i++) {
			typed[i]++;
			if (sp->tubes[i].status & T_DAMAGED)
				continue;
			sp->tubes[i].target = ep;
		}
	check_t_damage(typed, sp, "lock");
	check_t_turn(typed, sp, 0);
	return 1;
}


turn_phasers(sp)
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	char	c;
	int	typed[MAXPHASERS];
	register int i;
	register float j;
	register int k;

	for (i=0; inum_phasers);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	printf("   to [0-360] ");
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL)
		return 0;
	j = atof(buf2);
	if (j < 0.0 || j > 360.0)
		return 0;
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_phasers - 1)
				continue;
			typed[k]++;
			if (sp->phasers[k].status & P_DAMAGED)
				continue;
			sp->phasers[k].target = NULL;
			sp->phasers[k].bearing = j;
		}
	else
		for (i=0; inum_phasers; i++) {
			typed[i]++;
			if (sp->phasers[i].status & P_DAMAGED)
				continue;
			sp->phasers[i].target = NULL;
			sp->phasers[i].bearing = j;
		}
	check_p_damage(typed, sp, "turn");
	check_p_turn(typed, sp, 0);
	return 1;
}


turn_tubes(sp)
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	char	c;
	int	typed[MAXTUBES];
	register int i;
	register float j;
	register int k;

	for (i=0; inum_tubes);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	printf("   to [0-360] ");
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL)
		return 0;
	j = atof(buf2);
	if (j < 0.0 || j > 360.0)
		return 0;
	if (strcmp(buf1, "all") && strcmp(buf1, "ALL"))
		for (i=0; c = buf1[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_tubes - 1)
				continue;
			typed[k]++;
			if (sp->tubes[k].status & T_DAMAGED)
				continue;
			sp->tubes[k].target = NULL;
			sp->tubes[k].bearing = j;
		}
	else
		for (i=0; inum_tubes; i++) {
			typed[i]++;
			if (sp->tubes[i].status & T_DAMAGED)
				continue;
			sp->tubes[i].target = NULL;
			sp->tubes[i].bearing = j;
		}
	check_t_damage(typed, sp, "turn");
	check_t_turn(typed, sp, 0);
	return 1;
}


load_tubes(sp)
struct ship *sp;
{
	char	buf1[20];
	char	buf2[20];
	char	c;
	int	load;
	struct	tube *tp;
	int	typed[MAXTUBES];
	register int i;
	register float j;
	register int k;

	for (i=0; inum_tubes);
	(void) Gets(buf2, sizeof(buf2));
	if (buf2[0] == NULL)
		return 0;
	if (strcmp(buf2, "all") && strcmp(buf2, "ALL"))
		for (i=0; c = buf2[i]; i++) {
			k = c - '1';
			if (k < 0 || k > sp->num_tubes - 1)
				continue;
			typed[k]++;
		}
	else
		for (i=0; inum_tubes; i++)
			typed[i]++;
	for (i = 0; i < sp->num_tubes; i++) {
		tp = &sp->tubes[i];
		if (!typed[i] || tp->status & T_DAMAGED)
			continue;
		if (load) {
			j = min(sp->energy, MAX_TUBE_CHARGE - tp->load);
			if (j <= 0)
				continue;
			sp->energy -= j;
			sp->pods -= j;
			tp->load += j;
		} else {
			j = tp->load;
			if (j <= 0)
				continue;
			sp->energy += j;
			sp->pods += j;
			tp->load = 0;
		}
	}
	printf("%s: Tubes now ", engineer);
	for (i=0; inum_tubes; i++) {
		if (sp->tubes[i].status & T_DAMAGED)
			printf(" -- ");
		else
			printf(" %-2d ", sp->tubes[i].load);
	}
	printf(" energy at %d/%d\n", (int)sp->energy, (int)sp->pods);
	return 1;
}


launch_probe(sp)
struct ship *sp;
{
	char	buf1[20];
	int	pods, delay, prox;
	float	course;
	struct	ship *target;
	struct	list *lp;
	struct	torpedo *pp;

	pods = delay = prox = 0;
	course = 0.0;
	target = NULL;
	if (is_dead(sp, S_PROBE)) {
		printf("%s:  Probe launcher destroyed!\n", engineer);
		return 0;
	}
	if (!syswork(sp, S_PROBE)) {
		printf("%s:  Probe launcher temporarily disabled, %s\n",
		    engineer, title);
		return 0;
	}
	if (sp->energy < MIN_PROBE_CHARGE) {
		printf("%s: We've not enough power, Captain.\n", engineer);
		return 0;
	}
	printf("%s: %d pods available.\n", engineer, (int)sp->energy);
	printf("%s: Number to launch [%d+] is ", captain, MIN_PROBE_CHARGE);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		goto bad_param;
	pods = atoi(buf1);
	if (pods < MIN_PROBE_CHARGE || pods > sp->energy)
		goto bad_param;
	printf("   set time delay to [0-%d] ", MAX_PROBE_DELAY);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		goto bad_param;
	delay = atoi(buf1);
	if (delay < 0 || delay > MAX_PROBE_DELAY)
		goto bad_param;
	printf("   set proximity delay to [%d+] ", MIN_PROBE_PROX);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		goto bad_param;
	prox = atoi(buf1);
	if (prox < MIN_PROBE_PROX)
		goto bad_param;
	printf("   launch towards [whom, if anyone] ");
	Gets(buf1, sizeof(buf1));
	if (*buf1) {
		target = ship_name(buf1);
		if (target == NULL)
			goto bad_param;
		if (cantsee(target) || !syswork(sp, S_SENSOR)) {
			printf("%s:  %s, unable to lock probe onto the %s.\n",
			    helmsman, title, target->name);
			return 0;
		}
	} else {
		printf("   course [0-360] ");
		if (gets(buf1) == NULL)
			goto bad_param;
		course = atof(buf1);
		if (course < 0.0 || course > 360.0)
			goto bad_param;
		target = NULL;
	}
	/*
	 * add a new item to the list of items in space
	 */
	lp = newitem(I_PROBE);
	lp->data.tp = MKNODE(struct torpedo, *, 1);
	pp = lp->data.tp;
	if (pp == (struct torpedo *)NULL) {
		fprintf(stderr, "launch_probe: malloc failed\n");
		exit(2);
	}
	pp->from = sp;
	pp->fuel = pods;
	pp->timedelay = delay;
	pp->speed = sp->warp;
	pp->newspeed = 3.0;
	pp->prox = prox;
	pp->target = target;
	pp->course = course;
	pp->x = sp->x;
	pp->y = sp->y;
	pp->id = new_slot();
	pp->type = TP_PROBE;
	/*
	 * subtract the pods used
	 */
	sp->pods -= pods;
	sp->energy -= pods;
	sp->probe_status = PR_LAUNCHING;
	printf("%s: Probe %d away\n",engineer, pp->id);
	return 1;
bad_param:
	printf("%s: Bad parameters, %s.\n", science, title);
	return 0;
}


probe_control(sp)
struct ship *sp;
{
	register struct list *lp;
	register int i;
	register float j;
	register struct torpedo *pp;
	struct	torpedo *probes[20];
	int	probenum;
	struct	ship *ep;
	int	pnum;
	float	bear;
	int	range;
	char	buf1[20];
	char	*bp;

	pnum = 0;
	for (lp = &head; lp != tail; lp = lp->fwd) {
		if (lp->type != I_PROBE)
			continue;
		pp = lp->data.tp;
		if (pp->from != sp)
			continue;
		if (!pnum)
			printf("\nprobe bearng range course time  prox units target\n");
		if (pnum >= sizeof probes / sizeof probes[0]) {
			printf("\n%s:  There are other probes out but\n",
			    nav);
			puts("   these are all we can control at one time.");
		}
		probes[pnum] = pp;
		pnum++;
		range = rangefind(sp->x, pp->x, sp->y, pp->y);
		bear = bearing(sp->x, pp->x, sp->y, pp->y);
		if (pp->target == NULL)
			bp = "NONE";
		else
			bp = pp->target->name;
		printf(" %2d    %4.1f %5d  %4.0f  %4.1f %5d  %3d  %s\n",
			pp->id, bear, range, pp->course, pp->timedelay,
			pp->prox, pp->fuel, bp);
	}
	if (!pnum) {
		printf("%s: What probes?\n", nav);
		return 0;
	}
	printf("%s:  Detonate all probes?\n", nav);
	printf("%s:  [yes or no] ", captain);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] != NULL && (*buf1 == 'Y' || *buf1 == 'y')) {
		printf("%s:  Aye, %s\n", nav, title);
		for (i=0; itimedelay = 0.0;
		sp->probe_status = PR_DETONATE;
		return 1;
	}
	printf("   control probe [#] ");
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	probenum = atoi(buf1);
	for (i=0; iid == probenum)
			break;
	if (i == pnum)
		return 0;
	probenum = i;
	printf("%s:  Detonate it?\n", nav);
	printf("%s:  [yes or no] ", captain);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] != NULL && (*buf1 == 'y' || *buf1 == 'Y')) {
		probes[probenum]->timedelay = 0.;
		sp->probe_status = PR_DETONATE;
		return 1;
	}
	printf("   lock it onto [whom, if anyone] ");
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] != NULL) {
		ep = ship_name(buf1);
		if (ep != NULL) {
			sp->probe_status = PR_LOCK;
			if (cansee(ep) && syswork(sp, S_SENSOR)) {
				probes[probenum]->target = ep;
				printf("%s: locking.\n", nav);
				return 1;
			} else {
				printf("%s:  %s, unable to lock probe on the %s.\n",
				    helmsman, title, ep->name);
				return 0;
			}
		}
	}
	printf("   set it to course [0-360] ");
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	sp->probe_status = PR_LOCK;
	j = atof(buf1);
	if (j < 0.0 || j > 360.0)
		return 0;
	probes[probenum]->course = j;
	probes[probenum]->target = NULL;
	printf("%s: setting in new course.\n", nav);
	return 1;
}
SHAR_EOF
chmod +x 'cmds1.c'
fi # end of overwriting check
if test -f 'cmds2.c'
then
	echo shar: will not over-write existing file "'cmds2.c'"
else
cat << \SHAR_EOF > 'cmds2.c'
/*
 * TREK73: cmds2.c
 *
 * User Commands
 *
 * pos_report, pos_display, pursue, elude, helm, self_scan, scan
 *
 * (print_damages)
 *
 */

#include "externs.h"
#include 

pos_report(sp)
struct ship *sp;
{
	struct	ship *sp1;
	struct	torpedo *tp;
	struct	list *lp;
	int	x, y;
	int	range;
	float	bear;
	float	speed;
	float	course;
	float	relbear;
	float	revrelbear;
	int	maxlen = 0;
	int	incltorp = 0;
	char	whitespace[5], who[80];
#ifdef SHOWTORP
	char	buf[20];
#endif

#ifdef SHOWTORP
	printf("%s:  Include torpedoes?\n", science);
	printf("%s:  [yes or no] ", captain);
	if (Gets(buf, sizeof buf) != NULL && (buf[0] == 'y' || buf[0] == 'Y'))
		incltorp = 1;
#endif
	/*
	 * Go through the list of objects and find out the longest
	 * name of any of them.  This is to insure that no matter
	 * what the names of the ship, the position report will
	 * come out formatted.
	 */
	for (lp = &head; lp != tail; lp = lp->fwd)
		switch(lp->type) {
		case I_SHIP:
			sp1 = lp->data.sp;
			maxlen = max(maxlen, strlen(sp1->name));
			break;
#ifdef SHOWTORP
		case I_TORPEDO:
			if (!incltorp)
				break;
			tp = lp->data.tp;
			maxlen = max(maxlen, strlen(tp->from->name) + 8);
			break;
#endif
		case I_PROBE:
			tp = lp->data.tp;
			maxlen = max(maxlen, strlen(tp->from->name) + 9);
			break;
		case I_ENG:
			tp = lp->data.tp;
			maxlen = max(maxlen, strlen(tp->from->name) + 12);
			break;
		}
	maxlen += 2;			/* For "cloaked" column */
	/*
	 * Construct a string %ns where n is the length of the
	 * longest name.
	 */
	(void) sprintf(whitespace, "%%%ds", maxlen);
	/*
	 * And print out the position report
	 */
	printf(whitespace, " ");
	puts("                     abs           rel   rev rel");
	printf(whitespace, " ");
	puts(" class warp course bearing range bearing bearing");
	for (lp = &head; lp != tail; lp = lp->fwd) {
		if (lp->type == 0)
			continue;
		sp1 = NULL;
		tp = NULL;
		if (lp->type == I_SHIP) {
			sp1 = lp->data.sp;
			if (is_dead(sp1, S_DEAD))
				continue;
			if (cansee(sp1)) {
				x = sp1->x;
				y = sp1->y;
				speed = sp1->warp;
				course = sp1->course;
				/* Reset what we know about his position */
				sp1->position.x = sp1->x;
				sp1->position.y = sp1->y;
				sp1->position.warp = sp1->warp;
				sp1->position.course = sp1->course;
				sp1->position.bearing = bearing(sp->x,
				    sp1->x, sp->y, sp1->y);
				sp1->position.range = rangefind(sp->x,
				    sp1->x, sp->y, sp1->y);
				(void) sprintf(who, "%.*s  ",
				    sizeof who - 3, sp1->name);
			} else {
				x = sp1->position.x;
				y = sp1->position.y;
				speed = sp1->position.warp;
				course = sp1->position.course;
				(void) sprintf(who, "%.*s *",
				    sizeof who - 3, sp1->name);
			}
		} else {
			tp = lp->data.tp;
			if (lp->type == I_TORPEDO && !incltorp)
				continue;
			x = tp->x;
			y = tp->y;
			speed = tp->speed;
			course = tp->course;
			switch(lp->type) {
#ifdef SHOWTORP
				case I_TORPEDO:
					(void) sprintf(who,"%.*s torp %d  ",
					    sizeof who - 11, tp->from->name,
					    tp->id);
					break;
#endif
				case I_PROBE:
					(void) sprintf(who, "%.*s probe %d  ",
					    sizeof who - 12, tp->from->name,
					    tp->id);
					break;
				case I_ENG:
					(void) sprintf(who,"%.*s engineering  ",
					    sizeof who - 15, tp->from->name);
					break;
				default:
					(void) sprintf(who, "lp->type = %d  ",
					    lp->type);
					break;
			}
		}
		printf(whitespace, who);
		if (sp1)
			printf("%5s", sp1->class);
		else
			printf("     ");
		printf("%6.1f   %3.0f   ", speed, course);
		if (sp1 == sp) {
			if (sp->target != NULL)
				printf("helm locked on %s", sp->target->name);
			putchar('\n');
		} else {
			bear = bearing(sp->x, x, sp->y, y);
			range = rangefind(sp->x, x, sp->y, y);
			relbear = rectify(round(bear - sp->course));
			revrelbear = rectify(round(bear + 180.0 - course));
			printf(" %3.0f   %5d   %3.0f     %3.0f\n",
			    bear, range, relbear, revrelbear);
		}
	}
	return 0;
}


pos_display(sp)
struct ship *sp;
{
	register int i;
	register int j;
	int	range;
	char	buf1[20];
	int	x, y;
	float	xf, yf;
	int	h, v;
	int 	hpitch = 10;
	int	vpitch = 6;
	char	map[13][23];	/* [2*MAXvpitch + 1][2*MAXhpitch + 1] */
	struct	list *lp;
	struct	ship *sp1;
	struct	torpedo *tp;
	char	c;

	if (is_dead(sp, S_SENSOR)) {
		printf("%s: Sensors are damaged.\n", science);
		return 0;
	}
	if (!syswork(sp, S_SENSOR)) {
		printf("%s: Sensors are temporarily inoperative.\n",
		    science);
		return 0;
	}
	printf("   display to [%d-%d] ", MIN_SENSOR_RANGE, MAX_SENSOR_RANGE);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	range = atoi(buf1);
	if (range < MIN_SENSOR_RANGE || range > MAX_SENSOR_RANGE)
		return 0;
	/*
	 * Compensation for aspect ratio of the output device
	 */
	x = range/hpitch;
	y = range/vpitch;
	for (i=0; i<=2*vpitch; i++) {
		if (i == 0 || i == 2*vpitch)
			for(j=0; j<=2*hpitch; j++)
				map[i][j] = '-';
		else
			for(j=0; j<=2*hpitch; j++)
				map[i][j] = ' ';
	}
	map[vpitch][hpitch] = '+';
	for (lp = &head; lp != tail; lp = lp->fwd) {
		if (lp->data.sp == sp)
			continue;
		if (lp->type == I_SHIP) {
			sp1 = lp->data.sp;
			if (cansee(sp1)) {
				/* Update the position */
				sp1->position.x = sp1->x;
				sp1->position.y = sp1->y;
				sp1->position.warp = sp1->warp;
				sp1->position.course = sp1->course;
				sp1->position.bearing = bearing(sp->x, x, sp->y, y);
				sp1->position.range = rangefind(sp->x, x, sp->y, y);
				xf = sp1->x - sp->x;
				yf = sp1->y - sp->y;
			} else {
				xf = sp1->position.x - sp->x;
				yf = sp1->position.y - sp->y;
			}
		} else {
			tp = lp->data.tp;
			xf = tp->x - sp->x;
			yf = tp->y - sp->y;
		}
		v = yf/y + vpitch + 0.5;
		h = xf/x + hpitch + 0.5;
		if (v < 0 || v > 2*vpitch)
			continue;
		if (h < 0 || h > 2*hpitch)
			continue;
		switch (lp->type) {
			case I_SHIP:
				c = lp->data.sp->name[0];
				if (cantsee(lp->data.sp))
					c = tolower(c);
				break;
			case I_TORPEDO:
				c = ':';
				break;
			case I_ENG:
				c = '#';
				break;
			case I_PROBE:
				c = '*';
				break;
			default:
				c = '?';
				break;
		}
		map[2*vpitch - v][h] = c;
	}
	for (i=0; i<=2*vpitch; i++) {
		for (j=0; j<=2*hpitch; j++)
			if (map[i][j] != ' ')
				break;
		if (j <= 2*hpitch)
			printf("%.*s", 2*hpitch + 1, map[i]);
		putchar('\n');
	}
	return 0;
}


pursue(sp)
struct ship *sp;
{
	register float i;
	char	buf1[20];
	struct	ship *ep;
	float	warp;
	
	if (is_dead(sp, S_COMP)) {
		printf("%s: Impossible, %s, our computer is dead\n",science ,title);
		return 0;
	}
	if (!syswork(sp, S_COMP)) {
		printf("%s: Main computer down, %s.  Rebooting.\n",
		    science, title);
		return 0;
	}
	printf("   Mr. %s, pursue [who] ", nav);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	ep = ship_name(buf1);
	if (ep == NULL)
		return 0;
	if (cantsee(ep)) {
		printf("%s:  %s, unable to acquire helm lock.\n", nav, title);
		return 0;
	}
	printf("   Mr. %s, warp factor [-%.2f to %.2f] ", helmsman, 
	    sp->max_speed, sp->max_speed);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	warp = atof(buf1);
	if (fabs(warp) > 1.0 && is_dead(sp, S_WARP)) {
		printf("%s: Warp drive is dead, Captain.\n", science);
		warp = (warp < 0.0) ? -1.0 : 1.0;
	}
	if (fabs(warp) > sp->max_speed) {
		printf("%s: %s, the engines canna go that fast!\n",engineer, title);
		warp = (warp < 0.0) ? -sp->max_speed : sp->max_speed;
	}
	sp->newwarp = warp;
	sp->target = ep;
	sp->relbear = 0.0;
	i = bearing(sp->x, ep->x, sp->y, ep->y);
	printf("%s: Aye, %s, coming to course %3.0f.\n", nav, title, i);
	sp->newcourse = i;
	return 1;
}


elude(sp)
struct ship *sp;
{
	register float i;
	char	buf1[20];
	struct	ship *ep;
	float	warp;

	if (is_dead(sp, S_COMP)) {
		printf("%s: Impossible, %s, our computer is dead\n",
		    science, title);
		return 0;
	}
	if (!syswork(sp, S_COMP)) {
		printf("%s: Main computer down, %s.  Rebooting.\n",
		    science, title);
		return 0;
	}
	printf("   Mr. %s, elude [who] ", nav);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	ep = ship_name(buf1);
	if (ep == NULL)
		return 0;
	if (cantsee(ep)) {
		printf("%s:  %s, unable to acquire helm lock.\n",
		    nav, title);
		return 0;
	}
		
	printf("   Mr. %s, warp factor [-%.2f to %.2f] ", helmsman, 
	    sp->max_speed, sp->max_speed);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	warp = (float) atof(buf1);
	if (fabs(warp) > 1.0 && is_dead(sp, S_WARP)) {
		printf("%s: Warp drive is dead, Captain.\n", science);
		warp = (warp < 0.0) ? -1.0 : 1.0;
	}
	if (fabs(warp) > sp->max_speed) {
		printf("%s: %s, the engines canna go that fast!\n",engineer, title);
		warp = (warp < 0.0) ? -sp->max_speed : sp->max_speed;
	}
	sp->newwarp = warp;
	sp->target = ep;
	sp->relbear = 180.0;
	i = bearing(sp->x, ep->x, sp->y, ep->y);
	i = rectify(i + 180.0);
	printf("%s: Aye, %s, coming to course %3.0f.\n", nav, title, i);
	sp->newcourse = i;
	return 1;
}

helm(sp)
struct ship *sp;
{
	char	buf1[20];
	register float course;
	float	warp;

	printf("   Mr. %s, come to course [0-359] ", nav);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	course = atof(buf1);
	if (course < 0.0 || course >= 360.0)
		return 0;
	printf("   Mr. %s, warp factor [-%.2f to %.2f] ", helmsman, 
	    sp->max_speed, sp->max_speed);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	warp = (float) atof(buf1);
	if (fabs(warp) > 1.0 && is_dead(sp, S_WARP)) {
		printf("%s: Warp drive is dead, Captain.\n", science);
		warp = (warp < 0.0) ? -1.0 : 1.0;
	}
	if (fabs(warp) > sp->max_speed) {
		printf("%s: %s, the engines canna go that fast!\n",engineer, title);
		warp = (warp < 0.0) ? -sp->max_speed : sp->max_speed;
	}
	sp->newwarp = warp;
	sp->newcourse = course;
	sp->target = NULL;
	sp->relbear = 0.0;
	printf("%s: Aye, %s.\n", nav, title);
	printf("%s: Aye, %s.\n", helmsman, title);
	return 1;
}

self_scan(sp)
struct ship *sp;
{
	(void) print_damage(sp);
	return 1;
}

scan(sp)
struct ship *sp;
{
	struct	ship *ep = NULL;
	struct	torpedo *tp = NULL;
	struct	list *lp;
	int	item = I_UNDEFINED;
	int	probe_num;
	char	buf1[20];

	printf("   %s, scan [who] ", science);
	(void) Gets(buf1, sizeof(buf1));
	if (buf1[0] == NULL)
		return 0;
	if (buf1[0] == '#') {
		strcpy(buf1,buf1+1);
		if (strlen(buf1) == 0) {
			printf("%s: %s, scan whose engineering?\n", science, title);
			return 0;
		}
		ep = ship_name(buf1);
		if (ep == NULL) {
			printf("%s: %s, no such ship as the %s.\n", science, title, buf1);
			return 0;
		}
		for (lp = &head; lp != NULL; lp = lp->fwd) {
			if (lp == tail)
				break;
			if (lp->type == I_UNDEFINED)
				continue;
			if (lp->type == I_ENG && lp->data.tp->from == ep) {
				tp = lp->data.tp;
				break;
			}
		}
		if (tp == NULL) {
			printf("%s:  %s, the %s has not jettisoned it's engineering.\n",
			    science, title, ep->name);
			return 0;
		}
		item = I_ENG;
	} else if ((probe_num = atoi(buf1)) > 0) {
		for (lp = &head; lp != NULL; lp = lp->fwd) {
			if (lp == tail)
				break;
			if (lp->type != I_PROBE)
				continue;
			if (lp->data.tp->id == probe_num) {
				tp = lp->data.tp;
				break;
			}
		}
		if (tp == NULL) {
			printf("%s: %s, there is no probe %d", science, title, probe_num);
			return 0;
		}
		item = I_PROBE;
	} else {
		ep = ship_name(buf1);
		if (ep == NULL) {
			printf("%s: %s, no such ship as the %s.\n", science, title, buf1);
			return 0;
		}
		item = I_SHIP;
		if (cantsee(ep)) {
			printf("%s:  %s, I am unable to scan the %s.\n",
			    science, title, ep->name);
			return 0;
		}
	}
	if ((sp != ep) && (is_dead(sp, S_SENSOR))) {
		printf ("%s: The sensors are damaged, Captain.\n",
		    science);
		return 0;
	}
	if ((sp != ep) && (!syswork(sp, S_SENSOR))) {
		printf("%s: %s, sensors are temporarily out.\n",
		    science, title);
		return 0;
	}
	if ((sp == ep) && (item == I_SHIP)) {
		printf ("%s: Captain, don't you mean 'Damage Report'?\n", science);
		return 0;
	}
	if (item == I_SHIP)
		(void) print_damage(ep);
	else
		(void) scan_torpedo(tp);
	return 1;
}

print_damage(ep)
struct ship *ep;
{	
	register int i;
	register int j;
	register float k;

	printf("\n\nDamages to the %s\n", ep->name);
	for (i=0; istatus[i] && i < S_NUMSYSTEMS)
			printf("%s damaged %d%%\n", sysname[i], ep->status[i]);
	}
	printf("Survivors: %d\n", ep->complement);
	printf("Helm lock: ");
	if (ep->target == NULL)
		printf("none.\n");
	else
		printf("%s\n",ep->target);
	printf("\nPhasers Control");
	for (i=0; inum_phasers; i++) {
		if (ep->phasers[i].status & P_DAMAGED)
			printf("\tdamaged");
		else if (ep->phasers[i].target == NULL)
			printf("\tmanual");
		else
			printf("\t%.7s", ep->phasers[i].target->name);
	}
	printf("\n\t turned");
	for (i=0; inum_phasers; i++)
		if (ep->phasers[i].status & P_DAMAGED)
			printf("\t");
		else if (ep->phasers[i].target == NULL)
			printf("\t%.0f", ep->phasers[i].bearing);
		else
			printf("\tLOCKED");
	printf("\n\t  level");
	for (i=0; inum_phasers; i++)
		if (ep->phasers[i].status & P_DAMAGED)
			printf("\t");
		else
			printf("\t%-2d", ep->phasers[i].load);
	printf("\n");
	printf("\nTubes\tcontrol");
	for (i=0; inum_tubes; i++) {
		if (ep->tubes[i].status & T_DAMAGED)
			printf("\tdamaged");
		else if (ep->tubes[i].target == NULL)
			printf("\tmanual");
		else
			printf("\t%.7s", ep->tubes[i].target->name);
	}
	printf("\n\t turned");
	for (i=0; inum_tubes; i++)
		if (ep->tubes[i].status & T_DAMAGED)
			printf("\t");
		else if (ep->tubes[i].target == NULL)
			printf("\t%.0f", ep->tubes[i].bearing);
		else
			printf("\tLOCKED");
	printf("\n\t  level");
	for (i=0; inum_tubes; i++)
		if (ep->tubes[i].status & T_DAMAGED)
			printf("\t");
		else
			printf("\t%-2d", ep->tubes[i].load);
	printf("\n");
	printf("\nShields\t levels");
	for (i=0; ishields[i].eff * ep->shields[i].drain;
		printf("\t%-2d", j);
	}
	printf("\n\t drains");
	for (i=0; ishields[i].attemp_drain;
		printf("\t%-4.2f", k);
	}
	printf("\n\nEfficiency: %4.1f\tFuel remaining: %d\n",
		ep->eff, (int)ep->energy);
	printf("Regeneration: %4.1f\tFuel capacity: %d\n",
		ep->regen, (int)ep->pods);
	return 1;
}

scan_torpedo(pp)
struct torpedo *pp;
{
	char kind[20];
	char tgt[20];

	printf("\nobject id time  prox units target\n");
	if (pp->type == TP_PROBE)
		strcpy(kind, "probe");
	else
		strcpy(kind, "engng");
	if (pp->target == NULL)
		strcpy(tgt, "NONE");
	else
		strcpy(tgt, pp->target->name);
	printf("%-7s%2d  %2.1f %4d   %3d   %s\n",
		kind, pp->id, pp->timedelay, pp->prox, pp->fuel, tgt);
	return 1;
}
SHAR_EOF
chmod +x 'cmds2.c'
fi # end of overwriting check
#	End of shell archive
exit 0