Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!rutgers!ames!ucbcad!ucbvax!okamoto From: okamoto@ucbvax.BERKELEY.EDU (The New Number Who) Newsgroups: net.sources.games Subject: Trek73 Part 3 (Part 2 of 2) Message-ID: <16632@ucbvax.BERKELEY.EDU> Date: Mon, 15-Dec-86 10:52:36 EST Article-I.D.: ucbvax.16632 Posted: Mon Dec 15 10:52:36 1986 Date-Received: Tue, 16-Dec-86 21:07:31 EST Organization: University of California at Berkeley Lines: 756 #! /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: # misc.c # mission.c # bpv.c # shipyard.c # This archive created: Mon Dec 15 07:44:24 1986 # By: Jeff Okamoto () export PATH; PATH=/bin:$PATH if test -f 'misc.c' then echo shar: will not over-write existing file "'misc.c'" else cat << \SHAR_EOF > 'misc.c' /* * TREK73: misc.c * * Miscellaneous Routines * * help, scancmd, new_slot, return_slot, vowelstr, * check_p_damage, check_t_damage, check_p_turn, check_t_turn, * ship_class * */ #include "externs.h" int help(dummy) struct ship *dummy; { struct cmd *cpbegin, *cpmiddle; puts("\nTrek73 Commands:"); puts("Code Command Code Command"); putchar('\n'); cpbegin = &cmds[0]; cpmiddle = &cmds[(cmdarraysize + 1) >> 1]; while (cpmiddle->routine != NULL) { printf("%3s: %c %-31s:%3s: %c %-31s\n", cpbegin->word1, ((cpbegin->turns) ? ' ' : '*'), cpbegin->word2, cpmiddle->word1, ((cpmiddle->turns) ? ' ' : '*'), cpmiddle->word2); cpbegin++; cpmiddle++; } if (cmdarraysize & 1) printf("%3s: %c %-31s", cpbegin->word1, ((cpbegin->turns) ? ' ' : '*'), cpbegin->word2); puts("\n\n * does not use a turn"); dummy = dummy; /* LINT */ } struct cmd *scancmd(buf) char *buf; { static char **argp = NULL; struct cmd *cp; int argnum; int first; argnum = parsit(buf, &argp); first = strlen(argp[0]); if (argnum && first) for (cp = &cmds[0]; cp->routine != NULL; cp++) if (!strncmp(argp[0], cp->word1, first)) return (cp); return (NULL); } /* * This routine handles getting unique identifier numbers for * all objects. */ new_slot() { /* * This is to make it appear that in a 2-ship duel, for * instance, the first object to appear will be numbered * as 3. */ int i = shipnum + 2; while ((slots[i] == 'X') && (i <= HIGHSLOT)) i++; if (i > HIGHSLOT) { puts("The game will terminate now due to an inability to handle the number of"); puts("objects in space (i.e. vessels, torpedoes, probes, etc). Sorry!"); exit(-1); } slots[i] = 'X'; return i; } /* * This routine handles returning identifiers */ return_slot(i) int i; { if (slots[i] != 'X') printf("FATAL ERROR - Slot already empty!"); slots[i] = ' '; } char *vowelstr(str) char *str; { switch(*str) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': return "n"; default: return ""; } } /* * This routine takes an array generated from commands 1, 3, and 5 * to print out a list of those phasers damaged and unable to * either fire, lock, or turn. */ check_p_damage(array, sp, string) int array[]; struct ship *sp; char *string; { int i, j; j = 0; for (i=0; inum_phasers; i++) { if (array[i] && (sp->phasers[i].status & P_DAMAGED)) { if (!j) printf("Computer: Phaser(s) %d", i+1); else printf(", %d", i+1); j++; } } if (j > 1) printf(" are damaged and unable to %s.\n", string); else if (j == 1) printf(" is damaged and unable to %s.\n", string); } /* * This routine takes an array generated from commands 2, 4, and 6 * to print out a list of those tubes damaged and unable to either * fire, lock, or turn. */ check_t_damage(array, sp, string) int array[]; struct ship *sp; char *string; { int i, j; j = 0; for (i=0; inum_tubes; i++) { if (array[i] && (sp->tubes[i].status & P_DAMAGED)) { if (!j) printf("Computer: Tube(s) %d", i+1); else printf(", %d", i+1); j++; } } if (j > 1) printf(" are damaged and unable to %s.\n", string); else if (j == 1) printf(" is damaged and unable to %s.\n", string); } /* * This routine checks to see if a phaser is pointing into our * blind side */ check_p_turn(array, sp, flag) int array[]; struct ship *sp; int flag; /* If 1, came from fire_phasers */ { register int i; register int j; register float k; register float bear; struct ship *target; j = 0; for (i=0; inum_phasers; i++) { if (!array[i]) continue; if (flag && !(sp->phasers[i].status & P_FIRING)) continue; target = sp->phasers[i].target; /* * This hack is here since when the phaser is locked, * the bearing points at the target, whereas when * not locked, the bearing is relative to the ship. */ if (target == NULL) { bear = sp->phasers[i].bearing + sp->course; k = sp->phasers[i].bearing; } else { bear = bearing(sp->x, target->x, sp->y, target->y); k = bear - sp->course; } k = rectify(k); if (betw(k, sp->p_blind_left, sp->p_blind_right) && !(is_dead(sp, S_ENG))) { if (!j) printf("Computer: Phaser(s) %d", i + 1); else printf(", %d", i + 1); j++; } } if (j > 1) printf(" are pointing into our blind side.\n"); else if (j == 1) printf(" is pointing into our blind side.\n"); } /* * This routine checks to see if a tube is turned into * our blind side. */ check_t_turn(array, sp, flag) int array[]; struct ship *sp; int flag; /* If 1, came from fire_tubes */ { register int i; register int j; register float k; register float bear; struct ship *target; j = 0; for (i=0; inum_tubes; i++) { if (!array[i]) continue; if (flag && !(sp->tubes[i].status & T_FIRING)) continue; target = sp->tubes[i].target; /* * This hack is here since when the tube is locked, * the bearing points at the target, whereas when * not locked, the bearing is relative to the ship. */ if (target == NULL) { bear = sp->tubes[i].bearing + sp->course; k = sp->tubes[i].bearing; } else { bear = bearing(sp->x, target->x, sp->y, target->y); k = bear - sp->course; } k = rectify(k); if (betw(k, sp->t_blind_left, sp->t_blind_right) && !(is_dead(sp, S_ENG))) { if (!j) printf("Computer: Tubes(s) %d", i + 1); else printf(", %d", i + 1); j++; } } if (j > 1) printf(" are pointing into our blind side.\n"); else if (j == 1) printf(" is pointing into our blind side.\n"); } struct ship_stat *ship_class(s) char *s; { int i; for (i = 0; i< MAXSHIPCLASS; i++) if (!strcmp(stats[i].abbr, s)) { return(&stats[i]); } return(NULL); } SHAR_EOF chmod +x 'misc.c' fi # end of overwriting check if test -f 'mission.c' then echo shar: will not over-write existing file "'mission.c'" else cat << \SHAR_EOF > 'mission.c' /* * TREK73: mission.c * * Mission Assignment Routines * * mission, alert, missionlog */ #ifdef BSD #include #endif #ifdef SYSV #include #endif #include "externs.h" mission() { int onef; char temp[3]; if (terse) return; onef = (shipnum == 1); puts("\n\n\nSpace, the final frontier."); printf("These are the voyages of the starship %s.\n", shiplist[0]->name); puts("Its five year mission: to explore strange new worlds,"); puts("to seek out new life and new civilizations,"); puts("to boldly go where no man has gone before!"); puts("\n S T A R T R E K\n"); missionlog(); if (onef) strcpy(temp, "a"); else sprintf(temp,"%d", shipnum); printf("%s: %s, I'm picking up %s vessel%s on an interception\n", helmsman, title, temp, plural(shipnum)); printf(" course with the %s.\n", shiplist[0]->name); printf("%s: Sensors identify %s as ", science, onef ? "it" : "them"); if (onef) printf("a%s ", vowelstr(foerace)); printf("%s %s%s,\n", foerace, foestype, plural(shipnum)); printf(" probably under the command of Captain %s.\n", foename); printf("%s: Sound general quarters, Lieutenant!\n", captain); printf("%s: Aye, %s!\n", com, title); } alert() { register int i; printf("Computer: The %ss are attacking the %s with the ", foerace, shiplist[0]->name); if (shipnum == 1) { printf("%s", shiplist[1]->name); } else { for (i = 1; i <= shipnum; i++) { if (i == shipnum) printf("and the "); printf("%s", shiplist[i]->name); if (i == shipnum) continue; printf(", "); if (i == 1 || i == 6) printf("\n "); } } printf(".\n"); } missionlog() { static char *missiontab[] = { /* "The Trouble with Tribbles" */ " We are acting in response to a Priority 1 distress call from", "space station K7.", /* "The Gamesters of Triskelion" */ " We are orbiting Gamma 2 to make a routine check of automatic", "communications and astrogation stations.", /* "Metamorphosis" */ " We are on course for Epsilon Canares 3 to treat Commissioner", "Headford for Sukaro's disease.", /* "Journey to Babel" */ " We have been assigned to transport ambassadors to a diplomatic", "conference on the planet code named Babel.", /* ?? */ " Our mission is to investigate a find of tritanium on Beta 7.", 0, /* "Shore Leave" */ " We are orbiting Rigel 4 for therapeutic shore leave.", 0, /* "A Piece of the Action" */ " We are orbiting Sigma Iota 2 to study the effects of", "contamination upon a developing culture.", /* "The Immunity Syndrome" */ " We have altered course for a resue mission on the Gamma 7A", "system.", /* "Amok Time" */ " We are presently on course for Altair 6 to attend inauguration", "cermonies on the planet.", /* "Who Mourns for Adonis?" */ " We are on a cartographic mission to Pollux 9.", 0, /* "The Changeling" */ " We are headed for Malurian in response to a distress call", "from that system.", /* "Mirror, Mirror" */ " We are to negotiate a treaty to mine dilithium crystals from", "the Halkans.", /* "The Apple" */ " We are to investigate strange sensor readings reported by a", "scoutship investigating Gamma Triangula 6.", /* "The Doomsday Machine" */ " We are headed for planets L370 and L374 to investigate the", "disappearance of the starship Constellation in that vincinity.", /* "The Ultimate Computer" */ " We are ordered, with a skeleton crew, to proceed to Space", "Station K2 to test Dr. Richard Daystrom's computer M5.", /* "Bread and Circuses" */ " We have encountered debris from the SS Beagle and are", "proceeding to investigate.", /* "Patterns of Force" */ " We are on course for Ekos to locate John Gill.", 0, /* "The Paradise Syndrome" */ " We are to divert an asteroid from destroying an inhabited", "planet.", /* "And The Children Shall Lead" */ " We are responding to a distresss call form the scientific", "expedition on Triacus.", /* "Is There in Truth No Beauty?" */ " We have been assigned to transport the Medusan Ambassador to", "to his home planet.", /* "Star Trek II -- The Wrath of Khan" */ " We are within the Neutral Zone on a mission to rescue the", "Kobayashi Maru.", }; long t1; struct tm *localtime(), *date; t1 = time(0); date = localtime(&t1); printf("%s: Captain's log, stardate %02d%02d.%02d\n", captain, date->tm_year, date->tm_mon+1, date->tm_mday); t1 = (randm(sizeof missiontab / sizeof (char *)) - 1) & ~01; puts(missiontab[t1]); if (missiontab[++t1]) printf(" %s\n", missiontab[t1]); } SHAR_EOF chmod +x 'mission.c' fi # end of overwriting check if test -f 'bpv.c' then echo shar: will not over-write existing file "'bpv.c'" else cat << \SHAR_EOF > 'bpv.c' /* * TREK73: bpv.c * * Calculate Basic Point Values for all ships. * */ #include #include "externs.h" main() { double crew, pods, regen, num_weapons, phaser, torp; double bpv; double atof(); int i; char buf[20]; printf("Regeneration multiplier :"); gets(buf); regen = atof(buf); printf("Pods divisor :"); gets(buf); pods = atof(buf); printf("Phaser multiplier :"); gets(buf); phaser = atof(buf); printf("Torpedo multiplier :"); gets(buf); torp = atof(buf); printf("Weapons multiplier :"); gets(buf); num_weapons = atof(buf); printf("Crew divisor :"); gets(buf); crew = atof(buf); for(i=0; i 'shipyard.c' /* * TREK73: shipyard.c * * Design your own ship * */ #include #include #include #include "externs.h" char buf[20]; char class[3]; char cloak; double bpv; struct { char description[30]; char race[30]; char empire[30]; } stuff; struct ship_stat design; main() { double regen, efficiency, atof(), floor(), round(); int crew, phasers, torps, pods, max_speed, turn, p_div, t_div; int done, atoi(); printf("Class identifier :"); gets(class); class[2] = '\0'; printf("Class description :"); gets(stuff.description); stuff.description[29] = '\0'; printf("Race name :"); gets(stuff.race); stuff.race[29] = '\0'; printf("Empire name :"); gets(stuff.empire); stuff.empire[29] = '\0'; done = 0; while (!done) { printf("Regeneration :"); gets(buf); regen = atof(buf); if (regen >= 0) done = 1; else printf(">>> Be reasonable.\n"); } done = 0; while (!done) { printf("Pods :"); gets(buf); pods = atof(buf); if (pods >= 0) done = 1; else printf(">>> Be reasonable.\n"); } done = 0; while (!done) { printf("Number of phasers :"); gets(buf); phasers = atoi(buf); if ((phasers >= 0) && (phasers < MAXWEAPONS)) done = 1; else if (phasers < 0) printf(">>> Be reasonable.\n"); else printf(">>> Can't have more than %d.\n", MAXWEAPONS-1); } done = 0; while (!done) { printf("Number of tubes :"); gets(buf); torps = atoi(buf); if ((torps >= 0) && (torps < MAXWEAPONS)) done = 1; else if (torps < 0) printf(">>> Be reasonable.\n"); else printf(">>> Can't have more than %d.\n", MAXWEAPONS-1); } done = 0; while (!done) { printf("Shield divisor for phasers :"); gets(buf); p_div = atof(buf); if (p_div > 0) done = 1; else printf(">>> Be reasonable.\n"); } done = 0; while (!done) { printf("Shield divisor for torps :"); gets(buf); t_div = atof(buf); if (t_div > 0) done = 1; else printf(">>> Be reasonable.\n"); } done = 0; while (!done) { printf("Crew :"); gets(buf); crew = atoi(buf); if (crew > 0) done = 1; else printf(">>> Be reasonable.\n"); } printf("Can the ship cloak ?"); gets(buf); if (buf != NULL && (buf[0] == 'y' || buf[0] == 'Y')) cloak = 1; else cloak = 0; bpv = 0.; bpv += regen * 12; bpv += pods / 2; bpv += p_div * 30; bpv += t_div * 40; bpv += (phasers + torps) * 10; bpv += crew / 15; printf("%s: BPV = %.2f\n", class, bpv); efficiency = round(4 * (0.0034 * bpv - 0.78)) / 4; if (efficiency < 0.25) efficiency = 0.25; turn = 10 - floor(bpv / 100); if (turn < 1) turn = 1; max_speed = (int) round(-0.004 * bpv + 11); if (max_speed < 1) max_speed = 1; printf("Efficiency = %.2f\n", efficiency); printf("Turn = %d\n", turn); printf("Max speed = %d\n", max_speed); strcpy(design.abbr, class); design.num_phaser = phasers; design.num_torp = torps; design.o_warpmax = max_speed; design.e_warpmax = max_speed + 2; design.o_eff = efficiency; design.e_eff = efficiency; design.regen = regen; /* XXXX */ design.energy = pods * 3 / 4; design.pods = pods; design.o_crew = crew; design.e_crew = crew * 5 / 4; design.ph_shield = p_div; design.tp_shield = t_div; design.turn_rate = turn; design.cloaking_energy = 4; /* XXXX */ design.t_blind_left = 135; design.t_blind_right = 225; design.p_blind_left = 125; design.p_blind_right = 235; design.p_firing_delay = 4; design.t_firing_delay = 4; save_design(); } double round(x) double x; { return( floor(x + 0.5)); } save_design() { int fd, bytes; char path[BUFSIZ]; char *home, *getenv(); if ((home = getenv("HOME")) != NULL) strcpy(path, home); else strcpy(path, "."); strcat(path, "/.trek"); strcat(path, design.abbr); printf("Saving to file %s\n", path); if ((fd = open(path, O_WRONLY|O_CREAT, 0644)) < 0) { perror("open"); exit(1); } bytes = write(fd, (char *)&design, sizeof(struct ship_stat)); if (bytes != sizeof(struct ship_stat)) { fprintf(stderr, "Wrote only %d, not %d bytes\n", bytes, sizeof(struct ship_stat)); unlink(path); exit(1); } bytes = write(fd, &stuff, sizeof(stuff)); bytes = write(fd, &cloak, 1); bytes = write(fd, (char *)&bpv, sizeof(int)); close(fd); } SHAR_EOF chmod +x 'shipyard.c' fi # end of overwriting check # End of shell archive exit 0