Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site ucbvax.ARPA
Path: utzoo!watmath!clyde!burl!ulysses!ucbvax!okamoto
From: okamoto@ucbvax.ARPA (Doctor Who)
Newsgroups: net.sources.games
Subject: Trek73 (part 4 of 4)
Message-ID: <10402@ucbvax.ARPA>
Date: Mon, 16-Sep-85 11:16:05 EDT
Article-I.D.: ucbvax.10402
Posted: Mon Sep 16 11:16:05 1985
Date-Received: Wed, 18-Sep-85 02:59:03 EDT
Organization: University of California at Berkeley
Lines: 1954
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# main.c
# misc.c
# mission.c
# moveships.c
# options.h
# parseopts.c
# parsit.c
# strat1.c
# structs.h
# This archive created: Mon Sep 9 12:07:23 1985
echo shar: extracting main.c '(7038 characters)'
sed 's/^XX//' << \SHAR_EOF > main.c
XX/*
XX * TREK73: main.c
XX *
XX * Originally written (in HP-2000 BASIC) by
XX * William K. Char, Perry Lee, and Dan Gee
XX *
XX * Rewritten in C by
XX * Dave Pare (sdcsvax!sdamos!mr-frog)
XX * and
XX * Christopher Williams (ucbvax!ucbmerlin!williams)
XX *
XX * Corrected, Completed, and Enhanced by
XX * Jeff Okamoto (ucbvax!okamoto)
XX * Peter Yee (ucbvax!yee)
XX * Matt Dillon (ucbvax!dillon)
XX * Dave Sharnoff (ucbvax!ucbcory!muir)
XX * and
XX * Joel Duisman (ucbvax!duisman)
XX *
XX * Main Loop
XX *
XX * main, alarmtrap
XX *
XX */
XX
XX#include "defines.h"
XX#include "structs.h"
XX#include
XX#include
XX#include
XX#include
XX
XXint timeout;
XXjmp_buf jumpbuf;
XXextern char shutup[];
XX
XX
XXmain()
XX{
XX extern char **environ;
XX extern struct list *newitem();
XX extern char captain[];
XX extern char title[];
XX extern char foename[];
XX extern char *foeraces[];
XX extern char *foecaps[];
XX extern char *foeshiptype[];
XX extern char foerace[];
XX extern char foestype[];
XX extern int terse;
XX extern int silly;
XX extern char *feds[];
XX extern char *baddies[MAXFOERACES][MAXBADS];
XX extern struct cmd cmds[];
XX extern struct ship *shiplist[];
XX extern int shipnum;
XX extern char shipname[];
XX extern char slots[];
XX struct cmd *scancmd();
XX int alarmtrap();
XX register int i;
XX register int j;
XX register struct ship *sp;
XX register struct list *lp;
XX char buf1[30];
XX struct cmd *cp;
XX int range;
XX float bearing;
XX int loop;
XX int len;
XX int enemynum;
XX extern char slots[];
XX char *tmp;
XX int swap1;
XX int swap2;
XX int offset;
XX extern int (*strategies[])();
XX extern char *options;
XX extern char *getenv();
XX extern char sex[];
XX extern char shipbuf[];
XX extern char science[];
XX extern char engineer[];
XX extern char com[];
XX extern char nav[];
XX extern char helmsman[];
XX extern char racename[];
XX extern int init_p_turn[];
XX extern int init_t_turn[];
XX extern char *foeempire[];
XX extern char empire[];
XX
XX signal(SIGALRM, alarmtrap);
XX signal(SIGINT, SIG_IGN);
XX srandom(time(0));
XX options = getenv("TREK73OPTS");
XX if (options != NULL) {
XX parse_opts(options);
XX }
XX if (strlen(science) == 0)
XX strcpy(science, "Spock");
XX if (strlen(engineer) == 0)
XX strcpy(engineer, "Scott");
XX if (strlen(com) == 0)
XX strcpy(com, "Uhura");
XX if (strlen(nav) == 0)
XX strcpy(nav, "Chekov");
XX if (strlen(helmsman) == 0)
XX strcpy(helmsman, "Sulu");
XX if (strlen(captain) == 0) {
XX printf("\n\nCaptain: my last name is ");
XX if (gets(buf1) == NULL || *buf1 == NULL)
XX exit(1);
XX strcpy (captain, buf1);
XX }
XX if (*captain == '*') {
XX terse = 1;
XX len = strlen(captain) + 1;
XX for (loop = 1; loop < len; loop++)
XX captain[loop-1] = captain[loop];
XX }
XX if (strlen(sex) != 0)
XX strcpy(buf1,sex);
XX else {
XX printf("%s: My sex is: ",captain);
XX if (gets(buf1) == NULL || *buf1 == NULL)
XX exit(1);
XX }
XX if ((*buf1 <= 'z') && (*buf1 >= 'a'))
XX *buf1 = *buf1 - 'a' + 'A';
XX switch(*buf1) {
XX case 'M':
XX strcpy(title, "Sir");
XX break;
XX case 'F':
XX strcpy(title, "Ma'am");
XX break;
XX default :
XX switch (random() % 6) {
XX case 0:
XX strcpy(title, "Fag");
XX break;
XX case 1:
XX strcpy(title, "Fairy");
XX break;
XX case 2:
XX strcpy(title, "Fruit");
XX break;
XX case 3:
XX strcpy(title, "Weirdo");
XX break;
XX case 4:
XX strcpy(title, "Gumby");
XX break;
XX case 5:
XX strcpy(title, "Freak");
XX break;
XX }
XX }
XX if (strlen(shipbuf) != 0) {
XX strcpy(buf1,shipbuf);
XX } else {
XX getships:
XX printf(" I'm expecting [1-9] enemy vessels ");
XX if (gets(buf1) == NULL || *buf1 == NULL)
XX exit(1);
XX }
XX i = atoi(buf1);
XX if (i < 1 || i > 9) {
XX printf("%s: %s, Starfleet Command reports that it can only\n", com, title);
XX printf(" be from 1 to 9. Try again.\n");
XX printf("%s: Correct, Lieutenant -- just testing your attention..\n", captain);
XX goto getships;
XX }
XX shipnum = i;
XX for (loop = 0; loop < shipnum; loop++);
XX slots[loop] = 'X';
XX if (strlen(racename) == 0) {
XX if (silly == 0)
XX offset = 1;
XX else
XX offset = 0;
XX enemynum = randm(MAXFOERACES - offset) - 1;
XX } else {
XX for (loop=0; loopdata.sp = MKNODE(struct ship, *, 1);
XX sp = shiplist[i] = lp->data.sp;
XX if (i)
XX strcpy(sp->name, baddies[enemynum][i-1]);
XX sp->warp = sp->newwarp = 1.0;
XX sp->course = sp->newcourse = randm(360);
XX sp->eff = .75;
XX sp->regen = 10.0;
XX sp->energy = 150;
XX sp->pods = 200;
XX sp->id = i;
XX for (j=0; j<4; j++) {
XX sp->phasers[j].target = NULL;
XX sp->phasers[j].bearing = init_p_turn[j];
XX sp->phasers[j].load = 10;
XX sp->phasers[j].drain = 10;
XX sp->phasers[j].status = P_NORMAL;
XX }
XX for (j=0; j<4; j++) {
XX sp->shields[j].eff = 1.0;
XX sp->shields[j].drain = 0.0;
XX sp->shields[j].attemp_drain = 1.0;
XX }
XX sp->p_spread = 10;
XX for (j=0; j<6; j++) {
XX sp->tubes[j].target = NULL;
XX sp->tubes[j].bearing = init_t_turn[j];
XX sp->tubes[j].load = 0;
XX sp->tubes[j].status = T_NORMAL;
XX }
XX sp->t_lspeed = 12;
XX sp->t_prox = 200;
XX sp->t_delay = 10;
XX sp->p_percent = 100;
XX sp->status = S_NORMAL; /* all is well */
XX sp->target = NULL;
XX sp->eluding = 0;
XX sp->delay = 10000;
XX range = 4100 + randm(300) - i * 200;
XX bearing = toradians(randm(360));
XX sp->x = range * cos(bearing);
XX sp->y = range * sin(bearing);
XX sp->crew = 350;
XX sp->strategy = strategies[0];
XX }
XX /*
XX * federation exceptions
XX */
XX sp = shiplist[0];
XX sp->course = sp->newcourse = 0;
XX sp->eff = 1.0;
XX sp->x = sp->y = 0;
XX sp->crew = 450;
XX if (strlen(shipname) == 0) {
XX i = randm(MAXFEDS) - 1;
XX strcpy(sp->name, feds[i]);
XX } else {
XX strcpy(sp->name, shipname);
XX }
XX for(loop=shipnum+1; loop<300; loop++)
XX slots[loop] = ' ';
XX mission();
XX warning();
XX setjmp(jumpbuf);
XX timeout = 0;
XX signal(SIGALRM, alarmtrap);
XX alarm(0);
XX for (;;) {
XX sp = shiplist[0];
XX if (!(sp->status & S_DEAD)) {
XX alarm(20);
XX for (loop = 0; loop < HIGHSHUTUP; loop++)
XX shutup[loop] = 0;
XX printf("\n%s: Code [1-30] ", captain);
XX if (gets(buf1) != NULL) {
XX cp = scancmd(buf1);
XX if (cp != NULL) {
XX (*cp->routine)(sp);
XX if (!cp->turns)
XX continue;
XX } else
XX printf("\n%s: What??\n", science);
XX }
XX }
XX alarm(0);
XX alarmtrap(0);
XX }
XX}
XX
XXalarmtrap(sig)
XXint sig;
XX{
XX extern int timeout;
XX extern jmp_buf jumpbuf;
XX
XX if (sig) {
XX printf("\n** TIME **\n");
XX stdin->_cnt = 0;
XX }
XX if (!(shiplist[0]->status & S_DEAD))
XX printf("\n");
XX shiplist[1]->strategy();
XX move_ships();
XX if (sig) {
XX timeout = 1;
XX longjmp(jumpbuf, 1);
XX }
XX}
SHAR_EOF
if test 7038 -ne "`wc -c main.c`"
then
echo shar: error transmitting main.c '(should have been 7038 characters)'
fi
echo shar: extracting misc.c '(5106 characters)'
sed 's/^XX//' << \SHAR_EOF > misc.c
XX/*
XX * TREK73: misc.c
XX *
XX * Miscellaneous Routines
XX *
XX * help, scancmd, new_slot, return_slot, betw, vowelstr, plural,
XX * check_p_damage, check_t_damage, check_p_turn, check_t_turn
XX *
XX */
XX
XX#include "defines.h"
XX#include "structs.h"
XX#include
XX
XXint help(dummy)
XXstruct ship *dummy;
XX{
XX extern struct cmd cmds[];
XX struct cmd *cp;
XX int column = 0;
XX
XX printf("\nTrek84 Commands: \n");
XX printf("Code Command\n\n");
XX for (cp = &cmds[0]; cp->routine != NULL; cp++) {
XX printf("%3s: ", cp->word1);
XX if (cp->turns == 0)
XX printf (" *");
XX else
XX printf (" ");
XX printf(" %-31s", cp->word2);
XX if (column++ & 1)
XX puts("");
XX }
XX printf("\n\n\n * does not use a turn\n");
XX dummy = dummy; /* LINT */
XX}
XX
XXstruct cmd *scancmd(buf)
XXchar *buf;
XX{
XX extern struct cmd cmds[];
XX struct cmd *cp;
XX extern char **argp;
XX int argnum;
XX int first;
XX
XX argnum = parsit(buf, &argp);
XX first = strlen(argp[0]);
XX if (argnum && first) {
XX for (cp = &cmds[0]; cp->routine != NULL; cp++) {
XX if (strncmp(argp[0], cp->word1, first) == 0)
XX return (cp);
XX }
XX }
XX return (NULL);
XX}
XX
XX/*
XX * This routine handles getting unique identifier numbers for
XX * all objects.
XX */
XXnew_slot()
XX{
XX extern char slots[];
XX extern int shipnum;
XX /*
XX * This is to make it appear that in a 2-ship duel, for
XX * instance, the first object to appear will be numbered
XX * as 3.
XX */
XX int i = shipnum + 2;
XX
XX while (slots[i] == 'X')
XX i++;
XX slots[i] = 'X';
XX return i;
XX}
XX
XX/*
XX * This routine handles returning identifiers
XX */
XXreturn_slot(i)
XXint i;
XX{
XX extern char slots[];
XX
XX if (slots[i] != 'X')
XX printf("FATAL ERROR - Slot already empty!");
XX slots[i] = ' ';
XX}
XX
XXbetw(i, j, k)
XXint i, j, k;
XX{
XX if ((i > j) && (i < k))
XX return(1);
XX else
XX return(0);
XX}
XX
XXchar *vowelstr(str)
XXchar *str;
XX{
XX switch(*str) {
XX case 'a': case 'A':
XX case 'e': case 'E':
XX case 'i': case 'I':
XX case 'o': case 'O':
XX case 'u': case 'U':
XX return "n";
XX default:
XX return "";
XX }
XX}
XX
XXchar *plural(i)
XXint i;
XX{
XX if (i != 1)
XX return("s");
XX else
XX return("");
XX}
XX
XX/*
XX * This routine takes an array generated from commands 1, 3, and 5
XX * to print out a list of those phasers damaged and unable to
XX * either fire, lock, or turn.
XX */
XXcheck_p_damage(array, sp, string)
XXint array[];
XXstruct ship *sp;
XXchar *string;
XX{
XX int i, j = 0;
XX
XX for (i=0; i<4; i++) {
XX if ((array[i] != 0) && (sp->phasers[i].status & P_DAMAGED)) {
XX if (!j)
XX printf("Computer: Phaser(s) %d", i+1);
XX else
XX printf(", %d", i+1);
XX j++;
XX }
XX }
XX if (j)
XX printf(" damaged and unable to %s.\n", string);
XX}
XX
XX/*
XX * This routine takes an array generated from commands 2, 4, and 6
XX * to print out a list of those tubes damaged and unable to either
XX * fire, lock, or turn.
XX */
XXcheck_t_damage(array, sp, string)
XXint array[];
XXstruct ship *sp;
XXchar *string;
XX{
XX int i, j = 0;
XX
XX for (i=0; i<6; i++) {
XX if ((array[i] != 0) && (sp->tubes[i].status & P_DAMAGED)) {
XX if (!j)
XX printf("Computer: Tube(s) %d", i+1);
XX else
XX printf(", %d", i+1);
XX j++;
XX }
XX }
XX if (j)
XX printf(" damaged and unable to %s.\n", string);
XX}
XX
XX/*
XX * This routine checks to see if a phaser is pointing into our
XX * blind side
XX */
XXcheck_p_turn(array, sp, flag)
XXint array[];
XXstruct ship *sp;
XXint flag; /* If 1, came from fire_phasers */
XX{
XX register int i;
XX register int j = 0;
XX register int k;
XX register int bear;
XX struct ship *target;
XX
XX for (i=0; i<4; i++) {
XX if (array[i] == 0)
XX continue;
XX if ((flag) && (!(sp->phasers[i].status & P_FIRING)))
XX continue;
XX target = sp->phasers[i].target;
XX /*
XX * This hack is here since when the phaser is locked,
XX * the bearing points at the target, whereas when
XX * not locked, the bearing is relative to the ship.
XX */
XX if (target == NULL) {
XX bear = sp->phasers[i].bearing + sp->course;
XX k = sp->phasers[i].bearing;
XX } else {
XX bear = bearing(sp->x, target->x, sp->y, target->y);
XX k = bear - sp->course;
XX }
XX k = rectify(k);
XX if ((k > 125) && (k < 235) && (!(sp->status & S_ENG))) {
XX if (!j)
XX printf("Computer: Phaser(s) %d", i + 1);
XX else
XX printf(", %d", i + 1);
XX j++;
XX }
XX }
XX if (j)
XX printf(" are pointing into our blind side.\n");
XX}
XX
XX/*
XX * This routine checks to see if a tube is turned into
XX * our blind side.
XX */
XXcheck_t_turn(array, sp, flag)
XXint array[];
XXstruct ship *sp;
XXint flag; /* If 1, came from fire_tubes */
XX{
XX register int i;
XX register int j = 0;
XX register int k;
XX register int bear;
XX struct ship *target;
XX
XX for (i=0; i<6; i++) {
XX if (array[i] == 0)
XX continue;
XX if (flag && (!(sp->tubes[i].status & T_FIRING)))
XX continue;
XX target = sp->tubes[i].target;
XX /*
XX * This hack is here since when the tube is locked,
XX * the bearing points at the target, whereas when
XX * not locked, the bearing is relative to the ship.
XX */
XX if (target == NULL) {
XX bear = sp->tubes[i].bearing + sp->course;
XX k = sp->tubes[i].bearing;
XX } else {
XX bear = bearing(sp->x, target->x, sp->y, target->y);
XX k = bear - sp->course;
XX }
XX k = rectify(k);
XX if ((k > 135) && (k < 225) && (!(sp->status & S_ENG))) {
XX if (!j)
XX printf("Computer: Tubes(s) %d", i + 1);
XX else
XX printf(", %d", i + 1);
XX j++;
XX }
XX }
XX if (j)
XX printf(" are pointing into our blind side.\n");
XX}
SHAR_EOF
if test 5106 -ne "`wc -c misc.c`"
then
echo shar: error transmitting misc.c '(should have been 5106 characters)'
fi
echo shar: extracting mission.c '(4017 characters)'
sed 's/^XX//' << \SHAR_EOF > mission.c
XX/*
XX * TREK73: mission.c
XX *
XX * Mission Assignment
XX *
XX */
XX
XX#include "structs.h"
XX#include "defines.h"
XX
XXextern int terse;
XXextern char title[];
XXextern char foerace[];
XXextern char foename[];
XXextern char foestype[];
XXextern char captain[];
XXextern char science[];
XXextern char com[];
XXextern char helmsman[];
XXextern struct ship *shiplist[];
XXextern int shipnum;
XX
XXmission()
XX{
XX int onef;
XX extern char *plural(), *vowelstr();
XX
XX if (terse)
XX return;
XX onef = (shipnum == 1);
XX printf("\n\n\nSpace, the final frontier.\n");
XX printf("These are the voyages of the starship %s.\n", shiplist[0]->name);
XX printf("Its five year mission: to explore strange new worlds,\n");
XX printf("to seek our new life and new civilizations,\n");
XX printf("to boldly go where no man has gone before!\n");
XX printf("\n");
XX printf(" S T A R T R E K\n");
XX printf("\n");
XX missionlog();
XX printf("%s: %s, I'm picking up %d vessel%s on interception\n", helmsman, title, shipnum, plural(shipnum));
XX printf(" course with the %s.\n", shiplist[0]->name);
XX printf("%s: Sensors identify %s as ", science, onef ? "it" : "them");
XX if (onef)
XX printf("a%s ", vowelstr(foerace));
XX printf("%s %s%s,\n", foerace, foestype, plural);
XX printf(" probably under the command of Captain %s.\n", foename);
XX printf("%s: Sound general quarters, Lieutenant!\n", captain);
XX printf("%s: Aye, %s!\n", com, title);
XX}
XX
XXwarning()
XX{
XX register int i;
XX
XX printf("Computer: The %ss are attacking the %s with the ", foerace, shiplist[0]->name);
XX if (shipnum == 1) {
XX printf("%s", shiplist[1]->name);
XX } else {
XX for (i = 1; i <= shipnum; i++) {
XX if (i == shipnum)
XX printf("and the ");
XX printf("%s", shiplist[i]->name);
XX if (i == shipnum)
XX break;
XX printf(", ");
XX /*
XX if ((shipnum == 2 && i == 1) || i == 2 || i == 7)
XX */
XX if (i == 1 || i == 7)
XX printf("\n ");
XX }
XX }
XX printf(".\n");
XX}
XX
XXmissionlog()
XX{
XX static char *missiontab[] = {
XX " We are acting in response to a Priority 1 distress call from",
XX "space station K7.",
XX " We are orbiting Gamma 2 to make a routine check of automatic",
XX "communications and astrogation stations.",
XX " We are on course for Epsilon Canares 3 to treat Commissioner",
XX "Headford for Sukaro's disease.",
XX " We have been assigned to transport ambassadors to a diplomatic",
XX "conference on the planet code named Babel.",
XX " Our mission is to investigate a find of tritanium on Beta 7.",
XX 0,
XX " We are orbiting Rigel 4 for therapeutic shore leave.",
XX 0,
XX " We are orbiting Sigma Iota 2 to study the effects of",
XX "contamination upon a devoloping culture.",
XX " We have altered course for a resue mission on the Gamma 7A",
XX "system.",
XX " We are presently on course for Altair 6 to attend inauguration",
XX "cermonies on the planet.",
XX " We are on a cartographic mission to Polex 9.",
XX 0,
XX " We are headed for Malurian in response to a distress call",
XX "from that system.",
XX " We are to negotiate a treaty to mine dilithium crystals from",
XX "the Halkans.",
XX " We are to investigate strange sensor readings reported by a",
XX "scoutship investigating Gamma Triangula 6.",
XX " We are headed for planets L370 and L374 to investigate the",
XX "disappearance of the starship Constellation in that vincinity.",
XX " We are ordered, with a skeleton crew, to proceed to Space",
XX "Station K2 to test Dr. Richard Daystrom's computer M5.",
XX " We have encountered debris from the SS Beagle and are",
XX "proceeding to investigate.",
XX " We are on course for Ekos to locate John Gill.",
XX 0,
XX " We are to divert an asteroid from destroying an inhabited",
XX "planet.",
XX " We are responding to a distresss call form the scientific",
XX "expedition on Triacus.",
XX " We have been assigned to transport the Medusan Ambassador to",
XX "to his home planet."
XX };
XX int t1, t2;
XX
XX t2 = randm(100) - 1;
XX t1 = randm(100) - 1;
XX printf("%s: Captain's log, stardate %d.%d.\n", captain, t1, t2);
XX t1 = (randm(20) - 1) * 2;
XX printf("%s\n", missiontab[t1]);
XX t1++;
XX if (!missiontab[t1])
XX return;
XX printf(" %s\n", missiontab[t1]);
XX}
SHAR_EOF
if test 4017 -ne "`wc -c mission.c`"
then
echo shar: error transmitting mission.c '(should have been 4017 characters)'
fi
echo shar: extracting moveships.c '(7887 characters)'
sed 's/^XX//' << \SHAR_EOF > moveships.c
XX/*
XX * TREK73: moveships.c
XX *
XX * Actual command execution
XX *
XX * move_ships
XX *
XX */
XX
XX#include "defines.h"
XX#include "structs.h"
XX
XXextern int defenseless;
XXextern int corbomite;
XXextern int surrender;
XXextern int surrenderp;
XXextern char shutup[];
XXextern int global;
XXextern int reengaged;
XX
XX
XXmove_ships() {
XX extern double sin();
XX extern double cos();
XX extern double sqrt();
XX extern float fabs();
XX extern struct list head;
XX extern struct list *tail;
XX extern int shipnum;
XX extern struct ship *shiplist[];
XX register int i;
XX register int j;
XX register int k;
XX register struct list *lp;
XX register struct ship *sp;
XX struct torpedo *tp;
XX struct ship *fed;
XX struct list *lp1;
XX struct ship *sp1;
XX int iterations;
XX float tmpf;
XX int course, newcourse, energy;
XX float warp, newwarp;
XX int x, y;
XX struct ship *target;
XX int kills, others, fedstatus;
XX struct ship *ep;
XX double d0;
XX extern float segment;
XX extern float timeperturn;
XX float Mpersegment;
XX
XX /*
XX * The value 100 is the number of Megameters per second
XX * per warp-factor
XX */
XX Mpersegment = segment * 100.0;
XX iterations = timeperturn/segment;
XX for (i=0; i<=shipnum; i++)
XX distribute(shiplist[i]);
XX fed = shiplist[0];
XX for (i=0; ifwd) {
XX if (lp == tail)
XX break;
XX if (lp->type == 0)
XX continue;
XX sp = NULL;
XX tp = NULL;
XX if (lp->type == I_SHIP)
XX sp = lp->data.sp;
XX else
XX tp = lp->data.tp;
XX if (sp && sp->status & S_DEAD)
XX continue;
XX if (sp) {
XX phaser_firing(sp);
XX torpedo_firing(sp);
XX }
XX /*
XX * time fuses
XX */
XX if (tp) {
XX tp->timedelay--;
XX if (tp->timedelay <= 0) {
XX torp_detonate(tp, lp);
XX continue;
XX }
XX } else {
XX sp->delay--;
XX if (sp->delay <= 0) {
XX ship_detonate(sp, lp);
XX continue;
XX }
XX }
XX /*
XX * proximity fuse
XX */
XX if (tp && tp->prox != 0) {
XX for (lp1 = &head; lp1 != tail; lp1 = lp1->fwd) {
XX if (lp1->type != I_SHIP)
XX continue;
XX sp1 = lp1->data.sp;
XX if (sp1 == tp->from)
XX continue;
XX j=rangefind(tp->x,sp1->x,tp->y,sp1->y);
XX if (j > tp->prox)
XX continue;
XX torp_detonate(tp, lp);
XX tp = 0;
XX break;
XX }
XX if (!tp)
XX continue;
XX }
XX /*
XX * movement simulation
XX */
XX if (sp && sp->status & S_DEAD)
XX continue;
XX if (sp) {
XX x = sp->x;
XX y = sp->y;
XX warp = sp->warp;
XX newwarp = sp->newwarp;
XX course = sp->course;
XX newcourse = sp->newcourse;
XX target = sp->target;
XX energy = sp->energy;
XX /*
XX * fuel consumption
XX */
XX if (fabs((double) warp) >= 1)
XX j = (int) (warp * sp->eff * segment);
XX else
XX j = 0;
XX if (j < 0)
XX j *= -1;
XX if (j > energy) {
XX if (!shutup[BURNOUT + sp->id] && !(sp->status & S_WARP)) {
XX printf("%s's warp drive burning out.\n",
XX sp->name);
XX shutup[BURNOUT + sp->id]++;
XX }
XX newwarp = warp < 0 ? -.99 : .99;
XX energy = 0;
XX } else
XX energy -= j;
XX } else {
XX x = tp->x;
XX y = tp->y;
XX warp = tp->speed;
XX newwarp = tp->newspeed;
XX course = tp->course;
XX newcourse = course;
XX target = tp->target;
XX }
XX /*
XX * destroyed warp drive
XX */
XX if (sp && (sp->status & S_WARP))
XX if (fabs((double)warp) > 1.0)
XX newwarp = warp < 0.0 ? -.99 : .99;
XX /*
XX * automatic pilot
XX */
XX if (target != NULL) {
XX if (sp && (target->status & S_DEAD)) {
XX if ((sp == fed) && (!shutup[DISENGAGE]) && !(sp->status & S_DEAD))
XX printf("%s's autopilot disengaging.\n",
XX sp->name);
XX newcourse = course;
XX shutup[DISENGAGE]++;
XX target = NULL;
XX sp->eluding = 0;
XX } else {
XX j = bearing(x, target->x, y, target->y);
XX if (sp && sp->eluding)
XX j = rectify(j + 180);
XX newcourse = (float) j;
XX /*if ((sp) && (sp != fed)) {
XX sp->newwarp = 1.0;
XX newwarp = 1.0;
XX }*/
XX if (tp)
XX course = newcourse;
XX }
XX }
XX /*
XX * turn rate
XX */
XX if (course != newcourse) {
XX j = rectify(newcourse - course);
XX if (j > 180)
XX j -= 360;
XX /*
XX * maximum degrees turned in one turn
XX */
XX k = (int) ((12.0 - warp) * 4.0 * segment);
XX if (sp->status & S_WARP)
XX k /= 2;
XX k = (int) course + (j < 0 ? -1 : 1) *
XX min(abs(j), k);
XX course = (float) rectify(k);
XX }
XX /*
XX * acceleration
XX */
XX tmpf = newwarp - warp;
XX if (tmpf < 0.0)
XX d0 = (double) (tmpf * -1.0);
XX else
XX d0 = (double) tmpf;
XX if (tmpf != 0.0)
XX warp += (tmpf < 0 ? -1 : 1) * sqrt(d0)
XX * segment;
XX d0 = (double) toradians(course);
XX x += (int) (warp * cos(d0) * Mpersegment);
XX y += (int) (warp * sin(d0) * Mpersegment);
XX if ((warp > -0.1) && (warp < 0.1)){
XX warp = 0.0;
XX }
XX /*
XX * reset all the vars
XX */
XX if (sp) {
XX sp->x = x;
XX sp->y = y;
XX sp->warp = warp;
XX sp->newwarp = newwarp;
XX sp->course = course % 360;
XX sp->newcourse = newcourse % 360;
XX sp->energy = energy;
XX sp->target = target;
XX } else {
XX tp->x = x;
XX tp->y = y;
XX tp->speed = warp;
XX tp->course = course % 360;
XX tp->target = target;
XX }
XX }
XX }
XX for (i=0; i <= shipnum; i++) { /* Check targets */
XX sp = shiplist[i];
XX if (sp->status & S_DEAD)
XX continue;
XX for (j=0; j<4; j++) {
XX target = sp->phasers[j].target;
XX if (target && (target->status & S_DEAD)) {
XX if ((sp == fed) && (!shutup[PHASERS+j])&& !(sp->status & S_DEAD))
XX printf(" phaser %d disengaging\n",j+1);
XX sp->phasers[j].target = NULL;
XX shutup[PHASERS+j]++;
XX }
XX }
XX for (j=0; j<6; j++) {
XX target = sp->tubes[j].target;
XX if (target && (target->status & S_DEAD)) {
XX if ((sp == fed) && (!shutup[TUBES+j]) && !(sp->status & S_DEAD))
XX printf(" tube %d disengaging\n", j+1);
XX sp->tubes[j].target = NULL;
XX shutup[TUBES+j]++;
XX }
XX }
XX }
XX /*
XX * self-destruct warning
XX */
XX if ((fed->delay < 1000) && (fed->delay > 8)) {
XX printf("Computer: %d seconds to self destruct.\n",fed->delay/9);
XX }
XX /*
XX * Ruses, bluffs, surrenders
XX */
XX if (defenseless)
XX defenseless++;
XX if (corbomite)
XX corbomite++;
XX if (surrender)
XX surrender++;
XX if (surrenderp)
XX surrenderp++;
XX /*
XX * Federation dispostion
XX */
XX sp = fed;
XX kills = others = fedstatus = 0;
XX if ((sp->crew <= 0) || (sp->status & S_DEAD)) {
XX fedstatus = 1;
XX sp->status |= S_DEAD;
XX } else
XX for (j=0; j<1; j++) {
XX for (i=0; i<4; i++)
XX if (~sp->phasers[i].status | ~P_DAMAGED)
XX break;
XX if (i != 4)
XX continue;
XX for (i=0; i<6; i++)
XX if (~sp->tubes[i].status | ~T_DAMAGED)
XX break;
XX if (i != 6)
XX continue;
XX fedstatus = 1;
XX }
XX /*
XX * enemy disposition
XX */
XX for (k=1; k <= shipnum; k++) {
XX ep = shiplist[k];
XX if (ep->status & S_DEAD) {
XX kills++;
XX continue;
XX }
XX if (ep->crew <= 0) {
XX ep->status |= S_DEAD;
XX kills++;
XX continue;
XX }
XX if (fedstatus)
XX continue;
XX j = rangefind(sp->x, ep->x, sp->y, ep->y);
XX if ((j>3500 && (ep->status & S_WARP)) ||
XX (j>4500 && ep->delay<100)) {
XX others++;
XX continue;
XX }
XX /* Check if we are within range to turn off the flag */
XX if ((j <= 3500) && (reengaged))
XX reengaged = 0;
XX if (ep->energy > 10)
XX continue;
XX for (i=0; i<4; i++)
XX if (~ep->phasers[i].status | ~P_DAMAGED)
XX break;
XX if (i != 4)
XX continue;
XX for (i=0; i<6; i++)
XX if (~ep->tubes[i].status | ~T_DAMAGED)
XX break;
XX if (i != 6)
XX continue;
XX kills++;
XX }
XX if (fedstatus == 0 && (global & E_SURRENDER)) {
XX if (leftovers())
XX warn(4);
XX else {
XX final(4);
XX }
XX }
XX if ((fed->status & S_SURRENDER) && (kills + others < shipnum)) {
XX if (leftovers())
XX warn(3);
XX else {
XX final(3);
XX }
XX }
XX if (fedstatus == 0 && kills+others < shipnum)
XX return 0;
XX if (fedstatus == 1 && kills+others < shipnum) {
XX if (leftovers())
XX warn(0);
XX else
XX final(0);
XX }
XX if (fedstatus == 0 && kills == shipnum) {
XX if (leftovers())
XX warn(1);
XX else
XX final(1);
XX }
XX if (fedstatus == 0 && kills+others == shipnum) {
XX if (leftovers())
XX warn(2);
XX else
XX final(2);
XX }
XX if (fedstatus == 1 && kills == shipnum) {
XX final(5);
XX }
XX return 0;
XX}
SHAR_EOF
if test 7887 -ne "`wc -c moveships.c`"
then
echo shar: error transmitting moveships.c '(should have been 7887 characters)'
fi
echo shar: extracting options.h '(92 characters)'
sed 's/^XX//' << \SHAR_EOF > options.h
XX/*
XX * TREK73: options.h
XX *
XX * Parse_opts defines
XX *
XX */
XX
XX#define BOOLEAN 0
XX#define STRING 1
SHAR_EOF
if test 92 -ne "`wc -c options.h`"
then
echo shar: error transmitting options.h '(should have been 92 characters)'
fi
echo shar: extracting parseopts.c '(3053 characters)'
sed 's/^XX//' << \SHAR_EOF > parseopts.c
XX/*
XX * TREK73: parse_opt.c
XX *
XX * Parse the environment variable TREK73OPTS
XX *
XX * parse_opts
XX */
XX
XX#include
XX#include "structs.h"
XX#include "options.h"
XX
XX#define EQSTR(a, b, c) (strncmp(a, b, c) == 0)
XX
XX#define NUM_OPTS (sizeof optlist / sizeof (OPTION))
XX
XX/*
XX * description of an option and what to do with it
XX */
XXstruct optstruct {
XX char *o_name; /* option name */
XX int *o_opt; /* pointer to thing to set */
XX int o_type /* Boolean or string */
XX};
XX
XXtypedef struct optstruct OPTION;
XX
XXextern int terse;
XXextern char captain[];
XXextern char sex[];
XXextern char shipbuf[];
XXextern char science[];
XXextern char engineer[];
XXextern char com[];
XXextern char nav[];
XXextern char helmsman[];
XXextern char shipname[];
XXextern char foename[];
XXextern char racename[];
XXextern int silly;
XX
XX
XXOPTION optlist[] = {
XX {"terse", (int *)&terse, BOOLEAN},
XX {"name", (int *)captain, STRING},
XX {"sex", (int *)sex, STRING},
XX {"ships", (int *)shipbuf, STRING},
XX {"science", (int *)science, STRING},
XX {"engineer", (int *)engineer, STRING},
XX {"com", (int *)com, STRING},
XX {"nav", (int *)nav, STRING},
XX {"helmsman", (int *)helmsman, STRING},
XX {"shipname", (int *)shipname, STRING},
XX {"enemy", (int *)racename, STRING},
XX {"foename", (int *)foename, STRING},
XX {"silly", (int *)&silly, BOOLEAN},
XX};
XX
XX/*
XX * parse_opts:
XX * Parse options from string, usually taken from the environment.
XX * The string is a series of comma seperated values, with booleans
XX * being stated as "name" (true) or "noname" (false), and strings
XX * being "name=....", with the string being defined up to a comma
XX * or the end of the entire option string.
XX */
XXparse_opts(str)
XXregister char *str;
XX{
XX register char *sp;
XX register OPTION *op;
XX register int len;
XX
XX while (*str)
XX {
XX /*
XX * Get option name
XX */
XX for (sp = str; isalpha(*sp); sp++)
XX continue;
XX len = sp - str;
XX /*
XX * Look it up and deal with it
XX */
XX for (op = optlist; op < &optlist[NUM_OPTS]; op++)
XX if (EQSTR(str, op->o_name, len))
XX {
XX if (op->o_type == BOOLEAN) /* if option is a boolean */
XX *op->o_opt = 1;
XX else /* string option */
XX {
XX register char *start;
XX /*
XX * Skip to start of string value
XX */
XX for (str = sp + 1; *str == '='; str++)
XX continue;
XX start = (char *) op->o_opt;
XX /*
XX * Skip to end of string value
XX */
XX for (sp = str + 1; *sp && *sp != ','; sp++)
XX continue;
XX strucpy(start, str, sp - str);
XX }
XX break;
XX }
XX /*
XX * check for "noname" for booleans
XX */
XX else if (op->o_type == BOOLEAN
XX && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2))
XX {
XX *op->o_opt = 0;
XX break;
XX }
XX
XX /*
XX * skip to start of next option name
XX */
XX while (*sp && !isalpha(*sp))
XX sp++;
XX str = sp;
XX }
XX}
XX
XX/*
XX * strucpy:
XX * Copy string using unctrl for things
XX */
XXstrucpy(s1, s2, len)
XXregister char *s1, *s2;
XXregister int len;
XX{
XX if (len > 100)
XX len = 100;
XX while (len--)
XX {
XX if (isprint(*s2) || *s2 == ' ')
XX *s1++ = *s2;
XX s2++;
XX }
XX *s1 = '\0';
XX}
XX
SHAR_EOF
if test 3053 -ne "`wc -c parseopts.c`"
then
echo shar: error transmitting parseopts.c '(should have been 3053 characters)'
fi
echo shar: extracting parsit.c '(2631 characters)'
sed 's/^XX//' << \SHAR_EOF > parsit.c
XX/*
XX * TREK73: parsit.c
XX *
XX * Parse and get input
XX *
XX * Gets, parsit (courtesy, P. Lapsley)
XX *
XX */
XX#include
XXstatic int gindex;
XXstatic char **argv;
XXchar *
XXGets(buf)
XXchar *buf;
XX{
XX extern char *gets();
XX
XX if (argv[gindex] == NULL)
XX return (gets (buf));
XX ++gindex;
XX if (argv[gindex] == NULL)
XX return (gets (buf));
XX strcpy (buf, argv[gindex]);
XX puts (buf);
XX return (buf);
XX}
XX
XX/*
XX** parsit.c 23 September 1984 P. Lapsley (phil@Berkeley.ARPA)
XX**
XX** Parse a string of words separated by spaces into an
XX** array of pointers to characters, just like good ol' argv[]
XX** and argc.
XX**
XX** Usage:
XX**
XX** char line[132];
XX** char **argv;
XX** int argc;
XX**
XX** argv = (char **) NULL;
XX** argc = parsit(line, &argv);
XX**
XX** returns the number of words parsed in argc. argv[argc] will
XX** be (char *) NULL to indicate end of list, if you're not
XX** happy with just knowing how many words you have.
XX**
XX** Note that setting argv = (char **) NULL is only done the first
XX** time the routine is called with a new "argv" -- it tells
XX** parsit that "argv" is a new array, and parsit shouldn't free
XX** up the elements (as it would do if it were an old array).
XX*/
XX
XX
XXparsit(line, array)
XXchar *line;
XXchar ***array;
XX{
XX char *malloc();
XX char word[132];
XX char *linecp;
XX int i, j, num_words;
XX
XX gindex = 0;
XX argv = *array;
XX if (argv != (char **) NULL) { /* Check to see if we should */
XX i = 0; /* free up the old array */
XX do {
XX free(argv[i]); /* If so, free each member */
XX } while (argv[i++] != (char *) NULL);
XX free(argv); /* and then free the ptr itself */
XX }
XX
XX linecp = line;
XX num_words = 0;
XX while (1) { /* count words in input */
XX for (; *linecp == ' ' || *linecp == '\t'; ++linecp)
XX ;
XX if (*linecp == '\0')
XX break;
XX
XX for (; *linecp != ' ' && *linecp != '\t' && *linecp != '\0'; ++linecp)
XX ;
XX ++num_words;
XX if (*linecp == '\0')
XX break;
XX }
XX
XX /* Then malloc enough for that many words plus 1 (for null) */
XX
XX if ((argv = (char **) malloc((num_words + 1) * sizeof(char *))) ==
XX (char **) NULL) {
XX fprintf(stderr, "parsit: malloc out of space!\n");
XX return(0);
XX }
XX
XX j = i = 0;
XX while (1) { /* Now build the list of words */
XX for (; *line == ' ' || *line == '\t'; ++line)
XX ;
XX if (*line == '\0')
XX break;
XX
XX i = 0;
XX for (; *line != ' ' && *line != '\t' && *line != '\0'; ++line)
XX word[i++] = *line;
XX word[i] = '\0';
XX argv[j] = malloc(strlen(word) + 1);
XX if (argv[j] == (char *) NULL) {
XX fprintf(stderr, "parsit: malloc out of space!\n");
XX return(0);
XX }
XX
XX strcpy(argv[j], word);
XX ++j;
XX if (*line == '\0')
XX break;
XX }
XX argv[j] = (char *) NULL; /* remember null at end of list */
XX *array = argv;
XX return(j);
XX}
XX
XX
SHAR_EOF
if test 2631 -ne "`wc -c parsit.c`"
then
echo shar: error transmitting parsit.c '(should have been 2631 characters)'
fi
echo shar: extracting strat1.c '(8821 characters)'
sed 's/^XX//' << \SHAR_EOF > strat1.c
XX/*
XX * TREK73: strat1.c
XX *
XX * Standard Enemy Strategy
XX *
XX * standard_strategy
XX *
XX */
XX
XX#include "defines.h"
XX#include "structs.h"
XX
XX
XXstandard_strategy()
XX{
XX extern float fabs();
XX extern struct ship *shiplist[];
XX extern int shipnum;
XX extern int defenseless;
XX extern int corbomite;
XX extern int surrender;
XX extern int surrenderp;
XX extern char captain[];
XX extern char science[];
XX extern char nav[];
XX extern char com[];
XX extern char helmsman[];
XX extern char title[];
XX extern char foename[];
XX extern char foerace[];
XX extern int global;
XX extern char empire[];
XX int i;
XX register struct ship *sp;
XX register struct ship *fed;
XX int bear;
XX int range;
XX float tmpf;
XX int loop, loop2;
XX int probability;
XX
XX fed = shiplist[0];
XX for (i=1; i <= shipnum; i++) {
XX sp = shiplist[i];
XX if (sp->status & S_DEAD)
XX continue;
XX range = rangefind(sp->x, fed->x, sp->y, fed->y);
XX bear = bearing(sp->x, fed->x, sp->y, fed->y);
XX bear = rectify(sp->course - bear);
XX /*
XX * Take care of special commands like defenseless ruses,
XX * corbomite bluffs, surrenders (both sides)
XX */
XX /*
XX * Play dead effects
XX */
XX switch (defenseless) {
XX case 1: {
XX if (randm(10) > 2) {
XX defenseless = 2;
XX dstrat:
XX if (randm(2) == 1) {
XX sp->target = NULL;
XX sp->newwarp = 0.0;
XX } else {
XX sp->newwarp = 1.0;
XX }
XX printf("%s: The %s is ",helmsman, sp->name);
XX if (sp->target != NULL) {
XX printf("cautiously advancing.\n");
XX } else {
XX printf("turning away.\n");
XX }
XX astrat:
XX if ((fabs(sp->target->warp) > 1.0)
XX || (range < 200)) {
XX defenseless = 6;
XX } else {
XX for (loop = 0; loop < 4; loop++) {
XX if (sp->target->shields[loop].drain) {
XX defenseless = 6;
XX }
XX }
XX }
XX } else {
XX printf("%s: No apparent change in the enemy's actions.\n", helmsman);
XX defenseless = 6;
XX }
XX }
XX break;
XX case 2: goto dstrat;
XX case 4: goto astrat;
XX case 5: goto astrat;
XX }
XX /*
XX * Corbomite bluff effects.
XX */
XX switch (corbomite) {
XX case 1: {
XX probability = 30;
XX if (!strcmp(foerace, "Romulan")) {
XX probability = 50;
XX }
XX if (randm(100) < probability) {
XX printf("%s: %ss giving ground, Captain. Obviously, they\n", science, foerace);
XX printf(" tapped in as you expected them to.\n");
XX printf("%s: A logical assumption, Mr. %s. Are they still\n", captain, science);
XX printf(" retreating?\n");
XX printf("%s: Yes, %s\n",science, title);
XX printf("%s: Good. All hands, stand by.\n",captain);
XX corbomite = 2;
XX cstrat:
XX sp->target = NULL;
XX sp->newwarp = 3.0 + randm(7);
XX } else {
XX printf("%s: Message coming in from the %ss.\n",com, foerace);
XX printf("%s: Put it on audio.\n",captain);
XX if (randm(2) == 1) {
XX printf ("%s: Ha, ha, ha, %s. You lose.\n", foename, captain);
XX } else {
XX printf("%s: I fell for that the last time we met, idiot!\n", foename);
XX }
XX corbomite = 6;
XX }
XX }
XX break;
XX case 2: goto cstrat;
XX case 3: if (fabs(sp->target->warp) > 2.0) {
XX corbomite = 6;
XX }
XX break;
XX case 4: if (fabs(sp->target->warp) > 2.0) {
XX corbomite = 6;
XX }
XX break;
XX case 5: if (fabs(sp->target->warp) > 2.0) {
XX corbomite = 6;
XX }
XX break;
XX }
XX /*
XX * Will the enemy accept your surrender?
XX */
XX
XX if (surrender)
XX switch (surrender) {
XX case 1: {
XX probability=49;
XX if (!strcmp(foerace, "Romulan")) {
XX probability = 4;
XX printf("%s: The %ss do not take prisoners.\n", nav, foerace);
XX }
XX if (randm(100) < probability) {
XX if (randm(2) == 1) {
XX printf("%s: Prepare to die, Chicken %s!\n", foename, captain);
XX } else {
XX printf("%s: No reply from the %ss.\n",com, foerace);
XX }
XX surrender = 6;
XX } else {
XX printf("%s: Message coming in from the %s.\n", com, sp->name);
XX printf("%s: On behalf of the %s %s, I accept your surrender.\n", foename, foerace, empire);
XX printf(" You have five seconds to drop your shields, cut\n");
XX printf(" warp, and prepare to be boarded.\n");
XX surrender = 2;
XX global |= F_SURRENDER;
XX sstrat:
XX sp->target = fed;
XX sp->newwarp = 2.0;
XX }
XX break;
XX }
XX case 2:
XX case 3: {
XX warn(3);
XX goto sstrat;
XX }
XX case 4:
XX case 5: {
XX for (loop = 0; loop < 4; loop++) {
XX if (sp->target->shields[loop].attemp_drain)
XX goto breakout;
XX }
XX if (range <= 1400)
XX sp->newwarp = 1.0;
XX if ((range > 1000) || (fabs(sp->target->warp) > 1.0)) {
XX if (surrender == 5) {
XX printf("%s: Captain %s, you have not fulfilled our terms.\n", foename, captain);
XX printf(" We are resuming our attack.\n");
XX }
XX goto breakout;
XX } else {
XX fed->status |= S_SURRENDER;
XX final(3);
XX }
XX }
XX default: global &= ~F_SURRENDER;
XX break;
XX breakout:
XX break;
XX }
XX /*
XX * Enemy surrenders?
XX */
XX switch (surrenderp) {
XX case 1:
XX for (loop = 1; loop < shipnum; loop++)
XX if (!(sp->status & S_ENG) && (sp->crew > 100)) {
XX printf("%s: You must be joking, Captain %s. Why don't you\n", foename, captain);
XX printf(" surrender?\n");
XX surrenderp = 6;
XX break;
XX }
XX if (loop = shipnum) {
XX probability = 49;
XX if (!strcmp (foerace, "Romulan"))
XX probability = 4;
XX if (randm(100) < probability) {
XX printf("%s: As much as I hate to, Captain %s, we will surrender.\n", foename, captain);
XX printf(" We are dropping shields. You may board us.\n");
XX surrenderp = 2;
XX dropshields:
XX for (loop = 0; loop < 3; loop++)
XX sp->shields[0].drain = 0;
XX sp->newwarp = 0.0;
XX for (loop = 1; loop < shipnum; loop++)
XX shiplist[loop]->status |= S_SURRENDER;
XX global |= E_SURRENDER;
XX } else {
XX printf("%s: You must be joking, Captain %s. Why don't you\n", foename, captain);
XX printf(" surrender?\n");
XX surrenderp = 6;
XX }
XX }
XX break;
XX case 2:
XX case 3:
XX warn(4);
XX goto dropshields;
XX }
XX /*
XX * Unsportsmanlike firing
XX */
XX if (betw(defenseless, 0, 6) || betw(corbomite, 0, 6)
XX || betw(surrender, 0, 6) || betw(surrenderp, 0, 6)) {
XX for (loop = 0; loop < 4; loop++)
XX if (fed->phasers[i].status & P_FIRING)
XX break;
XX for (loop2 = 0; loop2 < 6; loop2++)
XX if (fed->tubes[i].status & T_FIRING)
XX break;
XX /* Has he fired? */
XX if ((loop != 4) || (loop2 != 6)) {
XX /* Yes, be angry and disbelieve everything from now on */
XX printf("%s: How dare you fire on us! We are\n", foename);
XX printf(" resuming our attack!\n");
XX global = NORMAL;
XX if (betw(defenseless,0,6))
XX defenseless = 6;
XX if (betw(corbomite,0,6))
XX corbomite = 6;
XX if (betw(surrender,0,6))
XX surrender = 6;
XX if (betw(surrenderp,0,6))
XX surrenderp = 6;
XX for (loop = 0; loop < shipnum; loop++)
XX shiplist[loop]->status &= ~S_SURRENDER;
XX }
XX }
XX if ((global & F_SURRENDER) || (global & E_SURRENDER))
XX continue;
XX /*
XX * short range?
XX * 1). fire phasers
XX * 2). lock phasers
XX * 3). evade probes
XX * 4). enemy to the rear - turn around
XX * 5). launch a probe?
XX * 6). self destruct?
XX * 7). set course.
XX */
XX if (range < 1050) {
XX if (e_closetorps(sp, fed))
XX continue;
XX if (e_lockphasers(sp, fed))
XX continue;
XX if (e_phasers(sp, fed))
XX continue;
XX if (e_checkprobe(sp))
XX continue;
XX if (bear > 90 && bear < 270) {
XX e_pursue(sp, fed, 1);
XX continue;
XX }
XX if (bear > 90 && bear < 270 && e_launchprobe(sp, fed))
XX continue;
XX if (sp->pods<20 && sp->regen < 4.0 && e_destruct(sp))
XX continue;
XX /*
XX * set course?
XX */
XX tmpf = fabs(fed->warp);
XX if (sp->target != fed || sp->warp + tmpf > 2.0) {
XX e_pursue(sp, fed, (int)tmpf);
XX continue;
XX }
XX }
XX if (range < 3800) {
XX /*
XX * either medium range, or we can't figure out what
XX * to do at short range
XX */
XX if (e_torpedo(sp))
XX continue;
XX if (e_locktubes(sp, fed))
XX continue;
XX /*
XX * should we run away; can we?
XX */
XX if (e_checkarms(sp) < randm(3)) {
XX e_runaway(sp, fed);
XX continue;
XX }
XX /*
XX * pursued from behind, low power: jettison engineering!
XX */
XX if (sp->energy<10 && sp->regen < 4.0 && e_jettison(sp))
XX continue;
XX /*
XX * put in other junk later
XX */
XX }
XX /*
XX * either distant range, or we can't figure out
XX * what to do at medium range
XX */
XX if (fed->delay < 15*10 && (sp->status & S_WARP)) {
XX e_runaway(sp, fed);
XX continue;
XX }
XX /*
XX * enemy behind us? make a quick turn.
XX */
XX if (bear > 135 && bear < 225) {
XX e_pursue(sp, fed, 1);
XX continue;
XX }
XX /*
XX * attack?
XX */
XX if (sp->pods > 40 && e_attack(sp, fed))
XX continue;
XX if (sp->energy > 30 && sp->pods > 40)
XX if (e_loadtubes(sp))
XX continue;
XX if (e_locktubes(sp, fed))
XX continue;
XX if (e_lockphasers(sp, fed))
XX continue;
XX /*
XX * gee, there's nothing that we want to do!
XX */
XX printf("%s: We're being scanned by the %s\n", science, sp->name);
XX }
XX}
SHAR_EOF
if test 8821 -ne "`wc -c strat1.c`"
then
echo shar: error transmitting strat1.c '(should have been 8821 characters)'
fi
echo shar: extracting structs.h '(2965 characters)'
sed 's/^XX//' << \SHAR_EOF > structs.h
XX/*
XX * TREK73: structs.h
XX *
XX * Struct Defs for TREK73
XX *
XX */
XX
XX
XXstruct phaser {
XX struct ship *target; /* who we're aimed at */
XX int bearing; /* direction aimed (if no target) */
XX char load; /* energy in phasers */
XX char status; /* Damaged, etc. */
XX int drain; /* Drain from engines (to if negative) */
XX} ;
XX
XXstruct tube {
XX struct ship *target; /* who we're aimed at */
XX int bearing; /* direction aimed (if no target) */
XX char load; /* energy in tubes */
XX char status; /* Damaged, etc */
XX} ;
XX
XXstruct shield {
XX float eff; /* efficiency from 0-1 */
XX float drain; /* Actual drain from engines */
XX float attemp_drain; /* Attempted drain from engines */
XX} ;
XX
XXstruct ship {
XX char name[30]; /* name of ship */
XX char nat; /* nationality */
XX int x, y; /* location */
XX float warp; /* warp speed */
XX float newwarp; /* for speed changes */
XX int course; /* 0-360 */
XX int newcourse; /* for course changes */
XX struct ship *target; /* who we're pursuing */
XX int eluding; /* Flag for eluding */
XX struct phaser phasers[4]; /* phaser banks */
XX int p_spread; /* phaser spread */
XX int p_percent; /* phaser firing percentage */
XX struct tube tubes[6]; /* torpedo tubes */
XX int t_prox; /* proximity delay */
XX int t_delay; /* time delay */
XX int t_lspeed; /* launch speed */
XX struct shield shields[4]; /* shields */
XX float eff; /* efficiency */
XX float regen; /* regeneration (energy per turn) */
XX int energy; /* amount of effective energy */
XX int pods; /* max energy level */
XX int crew; /* crew left alive */
XX int status; /* computer, probe l, warp, sensors, eng */
XX int delay; /* how long 'till we blow up? */
XX int id; /* Unique identifier */
XX int (*strategy)(); /* Which strategy to use */
XX} ;
XX
XX/*
XX * note that probes act like torpedos
XX * but have targets; torps only have
XX * courses
XX */
XXstruct torpedo {
XX struct ship *from; /* pointer to ship they're from */
XX int x, y; /* coords of object */
XX int course; /* where it's going */
XX float speed; /* how fast we're moving */
XX float newspeed; /* what our target speed is */
XX struct ship *target; /* who we're aimed at */
XX int fuel; /* how many antimatter pods it has */
XX int timedelay; /* time clicks left before detonation */
XX int prox; /* proximity fuse */
XX int id; /* Unique identifier */
XX} ;
XX
XX/*
XX * the list of what's in space -- depending on the type, we use
XX * differing parts of the union (data) structure. it's a linked
XX * list of all the stuff in space.
XX */
XXstruct list {
XX int type;
XX struct list *back, *fwd;
XX union {
XX struct torpedo *tp;
XX struct ship *sp;
XX } data;
XX} ;
XX
XXstruct cmd {
XX int (*routine)();
XX char *word1;
XX char *word2;
XX int turns;
XX} ;
XX
XX/*
XX * for the phaser and anti-matter damage lists
XX */
XX
XXstruct dam {
XX int roll;
XX char *mesg;
XX};
XX
XXstruct damage {
XX float eff;
XX float fuel;
XX float regen;
XX float shield;
XX float crew;
XX float weapon;
XX struct dam stats[4];
XX};
XX
XXstruct score {
XX int score;
XX int ships;
XX char captain[30];
XX char username[10];
XX};
XX
XXstruct rates {
XX char *rate;
XX int points;
XX};
SHAR_EOF
if test 2965 -ne "`wc -c structs.h`"
then
echo shar: error transmitting structs.h '(should have been 2965 characters)'
fi
# End of shell archive
exit 0