forked from KolibriOS/kolibrios
844 lines
18 KiB
C
844 lines
18 KiB
C
|
#include <ctype.h>
|
|||
|
|
|||
|
#ifdef MSDOS
|
|||
|
#include <dos.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef WINDOWS
|
|||
|
#include <windows.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#include <time.h>
|
|||
|
|
|||
|
#ifdef KOS32
|
|||
|
#include <conio.h>
|
|||
|
#include <kos32sys0.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#define INCLUDED // Define externs here
|
|||
|
#include "sst.h"
|
|||
|
|
|||
|
/*int getch(void);
|
|||
|
*/
|
|||
|
|
|||
|
static char line[128], *linep = line;
|
|||
|
static int linecount; /* for paging */
|
|||
|
|
|||
|
static void clearscreen(void);
|
|||
|
|
|||
|
/* Compared to original version, I've changed the "help" command to
|
|||
|
"call" and the "terminate" command to "quit" to better match
|
|||
|
user expectations. The DECUS version apparently made those changes
|
|||
|
as well as changing "freeze" to "save". However I like "freeze".
|
|||
|
|
|||
|
When I got a later version of Super Star Trek that I was converting
|
|||
|
from, I added the emexit command.
|
|||
|
|
|||
|
That later version also mentions srscan and lrscan working when
|
|||
|
docked (using the starbase's scanners), so I made some changes here
|
|||
|
to do this (and indicating that fact to the player), and then realized
|
|||
|
the base would have a subspace radio as well -- doing a Chart when docked
|
|||
|
updates the star chart, and all radio reports will be heard. The Dock
|
|||
|
command will also give a report if a base is under attack.
|
|||
|
|
|||
|
Movecom no longer reports movement if sensors are damaged so you wouldn't
|
|||
|
otherwise know it.
|
|||
|
|
|||
|
Also added:
|
|||
|
|
|||
|
1. Better base positioning at startup
|
|||
|
|
|||
|
2. deathray improvement (but keeping original failure alternatives)
|
|||
|
|
|||
|
3. Tholian Web
|
|||
|
|
|||
|
4. Enemies can ram the Enterprise. Regular Klingons and Romulans can
|
|||
|
move in Expert and Emeritus games. This code could use improvement.
|
|||
|
|
|||
|
5. The deep space probe looks interesting! DECUS version
|
|||
|
|
|||
|
6. Cloaking (with contributions from Erik Olofsen) and Capturing (BSD version).
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
// I don't like the way this is done, relying on an index. But I don't
|
|||
|
// want to invest the time to make this nice and table driven.
|
|||
|
|
|||
|
static char *commands[] = {
|
|||
|
"srscan",
|
|||
|
"lrscan",
|
|||
|
"phasers",
|
|||
|
"photons",
|
|||
|
"move",
|
|||
|
"shields",
|
|||
|
"dock",
|
|||
|
"damages",
|
|||
|
"chart",
|
|||
|
"impulse",
|
|||
|
"rest",
|
|||
|
"warp",
|
|||
|
"status",
|
|||
|
"sensors",
|
|||
|
"orbit",
|
|||
|
"transport",
|
|||
|
"mine",
|
|||
|
"crystals",
|
|||
|
"shuttle",
|
|||
|
"planets",
|
|||
|
"request",
|
|||
|
"report",
|
|||
|
"computer",
|
|||
|
"commands",
|
|||
|
"emexit",
|
|||
|
"probe",
|
|||
|
"cloak",
|
|||
|
"capture",
|
|||
|
"score",
|
|||
|
"abandon",
|
|||
|
"destruct",
|
|||
|
"freeze",
|
|||
|
"deathray",
|
|||
|
"debug",
|
|||
|
"call",
|
|||
|
"quit",
|
|||
|
"help"
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
#define NUMCOMMANDS (sizeof(commands)/sizeof(char *))
|
|||
|
|
|||
|
static void listCommands(int x) {
|
|||
|
prout(" SRSCAN MOVE PHASERS CALL\n"
|
|||
|
" STATUS IMPULSE PHOTONS ABANDON\n"
|
|||
|
" LRSCAN WARP SHIELDS DESTRUCT\n"
|
|||
|
" CHART REST DOCK QUIT\n"
|
|||
|
" DAMAGES REPORT SENSORS ORBIT\n"
|
|||
|
" TRANSPORT MINE CRYSTALS SHUTTLE\n"
|
|||
|
" PLANETS REQUEST DEATHRAY FREEZE\n"
|
|||
|
" COMPUTER EMEXIT PROBE COMMANDS");
|
|||
|
proutn(" ");
|
|||
|
#ifdef SCORE
|
|||
|
proutn("SCORE ");
|
|||
|
#endif
|
|||
|
#ifdef CLOAKING
|
|||
|
proutn("CLOAK ");
|
|||
|
#endif
|
|||
|
#ifdef CAPTURE
|
|||
|
proutn("CAPTURE ");
|
|||
|
#endif
|
|||
|
if (x) proutn("HELP ");
|
|||
|
prout("");
|
|||
|
}
|
|||
|
|
|||
|
static void helpme(void) {
|
|||
|
int i, j;
|
|||
|
char cmdbuf[32];
|
|||
|
char linebuf[132];
|
|||
|
FILE *fp;
|
|||
|
/* Give help on commands */
|
|||
|
int key;
|
|||
|
key = scan();
|
|||
|
while (TRUE) {
|
|||
|
if (key == IHEOL) {
|
|||
|
/* proutn("Help on what command?"); */
|
|||
|
proutn("<EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?");
|
|||
|
key = scan();
|
|||
|
}
|
|||
|
if (key == IHEOL) return;
|
|||
|
for (i = 0; i < NUMCOMMANDS; i++) {
|
|||
|
if (strcmp(commands[i], citem)==0) break;
|
|||
|
}
|
|||
|
if (i != NUMCOMMANDS) break;
|
|||
|
skip(1);
|
|||
|
/* prout("Valid commands:"); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:");
|
|||
|
listCommands(FALSE);
|
|||
|
key = IHEOL;
|
|||
|
chew();
|
|||
|
skip(1);
|
|||
|
}
|
|||
|
if (i == 23) {
|
|||
|
strcpy(cmdbuf, " ABBREV");
|
|||
|
}
|
|||
|
else {
|
|||
|
strcpy(cmdbuf, " Mnemonic: ");
|
|||
|
j = 0;
|
|||
|
while ((cmdbuf[j+13] = toupper(commands[i][j])) != 0) j++;
|
|||
|
}
|
|||
|
fp = fopen("sst.doc", "r");
|
|||
|
if (fp == NULL) {
|
|||
|
/* prout("Spock- \"Captain, that information is missing from the");
|
|||
|
prout(" computer. You need to find SST.DOC and put it in the");
|
|||
|
prout(" current directory.\"");
|
|||
|
*/ prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>- \"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>⠭, <20><><EFBFBD> <20><>ࠢ<EFBFBD>筠<EFBFBD> <20><><EFBFBD><EFBFBD>ଠ<EFBFBD><E0ACA0><EFBFBD> <20>ய<EFBFBD><E0AEAF><EFBFBD> <20> <20><>襣<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
|||
|
prout(" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䠩<> SST.DOC <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ⥪<><E2A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.\"");
|
|||
|
return;
|
|||
|
}
|
|||
|
i = strlen(cmdbuf);
|
|||
|
do {
|
|||
|
if (fgets(linebuf, 132, fp) == NULL) {
|
|||
|
/* prout("Spock- \"Captain, there is no information on that command.\""); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>- \"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>⠭, <20><> <20>⮩ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ࠢ<EFBFBD>筠<EFBFBD> <20><><EFBFBD><EFBFBD>ଠ<EFBFBD><E0ACA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\"");
|
|||
|
fclose(fp);
|
|||
|
return;
|
|||
|
}
|
|||
|
} while (strncmp(linebuf, cmdbuf, i) != 0);
|
|||
|
|
|||
|
skip(1);
|
|||
|
/* prout("Spock- \"Captain, I've found the following information:\""); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>- \"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>⠭, <20> <20><>襫 <><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ଠ<EFBFBD><E0ACA0><EFBFBD>:\"");
|
|||
|
skip(1);
|
|||
|
|
|||
|
do {
|
|||
|
if (linebuf[0]!=12) { // ignore page break lines
|
|||
|
linebuf[strlen(linebuf)-1] = '\0'; // No \n at end
|
|||
|
prout(linebuf);
|
|||
|
}
|
|||
|
fgets(linebuf,132,fp);
|
|||
|
} while (strstr(linebuf, "******")==NULL);
|
|||
|
fclose(fp);
|
|||
|
}
|
|||
|
|
|||
|
static void makemoves(void) {
|
|||
|
int i, hitme;
|
|||
|
char ch;
|
|||
|
while (TRUE) { /* command loop */
|
|||
|
hitme = FALSE;
|
|||
|
justin = 0;
|
|||
|
Time = 0.0;
|
|||
|
i = -1;
|
|||
|
while (TRUE) { /* get a command */
|
|||
|
chew();
|
|||
|
skip(1);
|
|||
|
proutn("COMMAND> ");
|
|||
|
if (scan() == IHEOL) continue;
|
|||
|
for (i=0; i < 29; i++) // Abbreviations allowed for the first 29 commands, only.
|
|||
|
if (isit(commands[i]))
|
|||
|
break;
|
|||
|
if (i < 29) break;
|
|||
|
for (; i < NUMCOMMANDS; i++)
|
|||
|
if (strcmp(commands[i], citem) == 0) break;
|
|||
|
if (i < NUMCOMMANDS
|
|||
|
#ifndef CLOAKING
|
|||
|
&& i != 26 // ignore the CLOAK command
|
|||
|
#endif
|
|||
|
#ifndef CAPTURE
|
|||
|
&& i != 27 // ignore the CAPTURE command
|
|||
|
#endif
|
|||
|
#ifndef SCORE
|
|||
|
&& i != 28 // ignore the SCORE command
|
|||
|
#endif
|
|||
|
#ifndef DEBUG
|
|||
|
&& i != 33 // ignore the DEBUG command
|
|||
|
#endif
|
|||
|
) break;
|
|||
|
|
|||
|
if (skill <= SFAIR) {
|
|||
|
/* prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:"); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:");
|
|||
|
listCommands(TRUE);
|
|||
|
}
|
|||
|
else prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");/*UNRECOGNIZED COMMAND*/
|
|||
|
}
|
|||
|
switch (i) { /* command switch */
|
|||
|
case 0: // srscan
|
|||
|
srscan(1);
|
|||
|
break;
|
|||
|
case 1: // lrscan
|
|||
|
lrscan();
|
|||
|
break;
|
|||
|
case 2: // phasers
|
|||
|
phasers();
|
|||
|
if (ididit) {
|
|||
|
#ifdef CLOAKING
|
|||
|
if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) {
|
|||
|
/* prout("The Romulan ship discovers you are breaking the Treaty of Algeron!"); */
|
|||
|
prout("<EFBFBD><EFBFBD>ࠡ<EFBFBD><EFBFBD> 㫠<E0AEAC>楢 <20><><EFBFBD><EFBFBD>⨫ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>襭<EFBFBD><E8A5AD> <20><><EFBFBD><EFBFBD><E0AEAD><E1AAAE> ᮣ<><E1AEA3>襭<EFBFBD><E8A5AD>!");
|
|||
|
ncviol++;
|
|||
|
isviolreported = TRUE;
|
|||
|
}
|
|||
|
#endif
|
|||
|
hitme = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 3: // photons
|
|||
|
photon();
|
|||
|
if (ididit) {
|
|||
|
#ifdef CLOAKING
|
|||
|
if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) {
|
|||
|
/* prout("The Romulan ship discovers you are breaking the Treaty of Algeron!"); */
|
|||
|
prout("<EFBFBD><EFBFBD>ࠡ<EFBFBD><EFBFBD> 㫠<E0AEAC>楢 <20><><EFBFBD><EFBFBD>⨫ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>襭<EFBFBD><E8A5AD> <20><><EFBFBD><EFBFBD><E0AEAD><E1AAAE> ᮣ<><E1AEA3>襭<EFBFBD><E8A5AD>!");
|
|||
|
ncviol++;
|
|||
|
isviolreported = TRUE;
|
|||
|
}
|
|||
|
#endif
|
|||
|
hitme = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 4: // move
|
|||
|
warp(1);
|
|||
|
break;
|
|||
|
case 5: // shields
|
|||
|
sheild(1);
|
|||
|
if (ididit) {
|
|||
|
attack(2);
|
|||
|
shldchg = 0;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 6: // dock
|
|||
|
dock();
|
|||
|
break;
|
|||
|
case 7: // damages
|
|||
|
dreprt();
|
|||
|
break;
|
|||
|
case 8: // chart
|
|||
|
chart(0);
|
|||
|
break;
|
|||
|
case 9: // impulse
|
|||
|
impuls();
|
|||
|
break;
|
|||
|
case 10: // rest
|
|||
|
waiting();
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
case 11: // warp
|
|||
|
setwrp();
|
|||
|
break;
|
|||
|
case 12: // status
|
|||
|
srscan(3);
|
|||
|
break;
|
|||
|
case 13: // sensors
|
|||
|
sensor();
|
|||
|
break;
|
|||
|
case 14: // orbit
|
|||
|
orbit();
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
case 15: // transport "beam"
|
|||
|
beam();
|
|||
|
break;
|
|||
|
case 16: // mine
|
|||
|
mine();
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
case 17: // crystals
|
|||
|
usecrystals();
|
|||
|
break;
|
|||
|
case 18: // shuttle
|
|||
|
shuttle();
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
case 19: // Planet list
|
|||
|
preport();
|
|||
|
break;
|
|||
|
case 20: // Status information
|
|||
|
srscan(2);
|
|||
|
break;
|
|||
|
case 21: // Game Report
|
|||
|
report(0);
|
|||
|
break;
|
|||
|
case 22: // use COMPUTER!
|
|||
|
eta();
|
|||
|
break;
|
|||
|
case 23:
|
|||
|
listCommands(TRUE);
|
|||
|
break;
|
|||
|
case 24: // Emergency exit
|
|||
|
clearscreen(); // Hide screen
|
|||
|
freeze(TRUE); // forced save
|
|||
|
#ifdef KOS32
|
|||
|
con_exit(1);
|
|||
|
#endif
|
|||
|
exit(1); // And quick exit
|
|||
|
break;
|
|||
|
case 25:
|
|||
|
probe(); // Launch probe
|
|||
|
break;
|
|||
|
#ifdef CLOAKING
|
|||
|
case 26:
|
|||
|
cloak(); // turn on/off cloaking
|
|||
|
if (iscloaking) {
|
|||
|
attack(2); // We will be seen while we cloak
|
|||
|
iscloaking = FALSE;
|
|||
|
iscloaked = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
#endif
|
|||
|
#ifdef CAPTURE
|
|||
|
case 27:
|
|||
|
capture(); // Attempt to get Klingon ship to surrender
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
#endif
|
|||
|
#ifdef SCORE
|
|||
|
case 28:
|
|||
|
score(1); // get the score
|
|||
|
break;
|
|||
|
#endif
|
|||
|
case 29: // Abandon Ship
|
|||
|
abandn();
|
|||
|
break;
|
|||
|
case 30: // Self Destruct
|
|||
|
dstrct();
|
|||
|
break;
|
|||
|
case 31: // Save Game
|
|||
|
freeze(FALSE);
|
|||
|
if (skill > SGOOD)
|
|||
|
/* prout("WARNING--Frozen games produce no plaques!"); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD>࠭<EFBFBD><E0A0AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ࠤ!");
|
|||
|
break;
|
|||
|
case 32: // Try a desparation measure
|
|||
|
deathray();
|
|||
|
if (ididit) hitme = TRUE;
|
|||
|
break;
|
|||
|
#ifdef DEBUG
|
|||
|
case 33: // What do we want for debug???
|
|||
|
debugme();
|
|||
|
break;
|
|||
|
#endif
|
|||
|
case 34: // Call for help
|
|||
|
help();
|
|||
|
break;
|
|||
|
case 35:
|
|||
|
alldone = 1; // quit the game
|
|||
|
#ifdef DEBUG
|
|||
|
if (idebug) score(0);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
case 36:
|
|||
|
helpme(); // get help
|
|||
|
break;
|
|||
|
}
|
|||
|
for (;;) {
|
|||
|
if (alldone) break; // Game has ended
|
|||
|
#ifdef DEBUG
|
|||
|
if (idebug) prout("2500");
|
|||
|
#endif
|
|||
|
if (Time != 0.0) {
|
|||
|
events();
|
|||
|
if (alldone) break; // Events did us in
|
|||
|
}
|
|||
|
if (d.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!
|
|||
|
atover(0);
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (nenhere == 0) movetho();
|
|||
|
if (hitme && justin==0) {
|
|||
|
attack(2);
|
|||
|
if (alldone) break;
|
|||
|
if (d.galaxy[quadx][quady] == 1000) { // went NOVA!
|
|||
|
atover(0);
|
|||
|
hitme = TRUE;
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
if (alldone) break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int main(int argc, char **argv) {
|
|||
|
int i;
|
|||
|
int hitme;
|
|||
|
char ch;
|
|||
|
|
|||
|
#ifdef KOS32
|
|||
|
if (con_init_console_dll()) return 1; // init fail
|
|||
|
con_set_title("-SUPER- STAR TREK");
|
|||
|
con_set_flags(CON_COLOR_GREEN);
|
|||
|
#endif
|
|||
|
#ifdef WINDOWS
|
|||
|
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Get handle to standard output
|
|||
|
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
prelim();
|
|||
|
|
|||
|
if (argc > 1) { // look for -f option
|
|||
|
if (strcmp(argv[1], "-f")== 0) {
|
|||
|
coordfixed = 1;
|
|||
|
argc--;
|
|||
|
argv++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (argc > 1) {
|
|||
|
fromcommandline = 1;
|
|||
|
line[0] = '\0';
|
|||
|
while (--argc > 0) {
|
|||
|
strcat(line, *(++argv));
|
|||
|
strcat(line, " ");
|
|||
|
}
|
|||
|
}
|
|||
|
else fromcommandline = 0;
|
|||
|
|
|||
|
|
|||
|
while (TRUE) { /* Play a game */
|
|||
|
setup();
|
|||
|
if (alldone) {
|
|||
|
score(0);
|
|||
|
alldone = 0;
|
|||
|
}
|
|||
|
else makemoves();
|
|||
|
skip(2);
|
|||
|
stars();
|
|||
|
skip(1);
|
|||
|
|
|||
|
if (tourn && alldone) {
|
|||
|
/* printf("Do you want your score recorded?"); */
|
|||
|
printf("<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <> <20><><EFBFBD>⨦<EFBFBD><E2A8A6><EFBFBD><EFBFBD>?");
|
|||
|
if (ja()) {
|
|||
|
chew2();
|
|||
|
freeze(FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
/* printf("Do you want to play again?"); */
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?");
|
|||
|
if (!ja()) break;
|
|||
|
}
|
|||
|
skip(1);
|
|||
|
/* prout("May the Great Bird of the Galaxy roost upon your home planet."); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪠<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ᮢ<><E1AEA2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>襩 த<><E0AEA4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void cramen(int i) {
|
|||
|
/* return an enemy */
|
|||
|
char *s;
|
|||
|
|
|||
|
switch (i) {
|
|||
|
case IHR: s = "<EFBFBD><EFBFBD><EFBFBD>㫠<EFBFBD><EFBFBD><EFBFBD>"; break;/*Romulan*/
|
|||
|
case IHK: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Klingon*/
|
|||
|
case IHC: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Commander*/
|
|||
|
case IHS: s = "<EFBFBD>㯥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Super-commander*/
|
|||
|
case IHSTAR: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Star*/
|
|||
|
case IHP: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Planet*/
|
|||
|
case IHB: s = "<EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD>"; break;/*Starbase*/
|
|||
|
case IHBLANK: s = "<EFBFBD><EFBFBD>ୠ<EFBFBD> <20><><EFBFBD><EFBFBD>"; break;/*Black hole*/
|
|||
|
case IHT: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; break;/*Tholean*/
|
|||
|
case IHWEB: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪠<EFBFBD> <20><><EFBFBD><EFBFBD>"; break;/*Tholean web*/
|
|||
|
default: s = "<EFBFBD><EFBFBD><EFBFBD>??"; break;/*Unknown*/
|
|||
|
}
|
|||
|
proutn(s);
|
|||
|
}
|
|||
|
|
|||
|
void cramlc(int key, int x, int y) {
|
|||
|
if (key == 1) proutn(" <20><><EFBFBD><EFBFBD>࠭<EFBFBD>");/*Quadrant*/
|
|||
|
else if (key == 2) proutn(" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");/*Sector*/
|
|||
|
proutn(" ");
|
|||
|
crami(x, 1);
|
|||
|
proutn(" - ");
|
|||
|
crami(y, 1);
|
|||
|
}
|
|||
|
|
|||
|
void crmena(int i, int enemy, int key, int x, int y) {
|
|||
|
if (i == 1) proutn("***");
|
|||
|
cramen(enemy);
|
|||
|
proutn(" at");
|
|||
|
cramlc(key, x, y);
|
|||
|
}
|
|||
|
|
|||
|
void crmshp(void) {
|
|||
|
char *s;
|
|||
|
switch (ship) {
|
|||
|
case IHE: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ࠩ<EFBFBD>"; break;/*Enterprise*/
|
|||
|
case IHF: s = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>"; break;/*Faerie Queene*/
|
|||
|
default: s = "<EFBFBD><EFBFBD>ࠡ<EFBFBD><EFBFBD>???"; break;/*Ship*/
|
|||
|
}
|
|||
|
proutn(s);
|
|||
|
}
|
|||
|
|
|||
|
void stars(void) {
|
|||
|
prouts("******************************************************");
|
|||
|
skip(1);
|
|||
|
}
|
|||
|
|
|||
|
double expran(double avrage) {
|
|||
|
return -avrage*log(1e-7 + Rand());
|
|||
|
}
|
|||
|
|
|||
|
double Rand(void) {
|
|||
|
return rand()/(1.0 + (double)RAND_MAX);
|
|||
|
}
|
|||
|
|
|||
|
void iran8(int *i, int *j) {
|
|||
|
*i = Rand()*8.0 + 1.0;
|
|||
|
*j = Rand()*8.0 + 1.0;
|
|||
|
}
|
|||
|
|
|||
|
void iran10(int *i, int *j) {
|
|||
|
*i = Rand()*10.0 + 1.0;
|
|||
|
*j = Rand()*10.0 + 1.0;
|
|||
|
}
|
|||
|
|
|||
|
void chew(void) {
|
|||
|
linecount = 0;
|
|||
|
linep = line;
|
|||
|
*linep = 0;
|
|||
|
}
|
|||
|
|
|||
|
void chew2(void) {
|
|||
|
/* return IHEOL next time */
|
|||
|
linecount = 0;
|
|||
|
linep = line+1;
|
|||
|
*linep = 0;
|
|||
|
}
|
|||
|
|
|||
|
int scan(void) {
|
|||
|
int i;
|
|||
|
char *cp;
|
|||
|
|
|||
|
linecount = 0;
|
|||
|
|
|||
|
// Init result
|
|||
|
aaitem = 0.0;
|
|||
|
*citem = 0;
|
|||
|
|
|||
|
// Read a line if nothing here
|
|||
|
if (*linep == 0) {
|
|||
|
if (linep != line) {
|
|||
|
chew();
|
|||
|
return IHEOL;
|
|||
|
}
|
|||
|
#ifdef KOS32
|
|||
|
cp = gets(line);
|
|||
|
if (!cp) exit(1);
|
|||
|
#else
|
|||
|
// We should really be using fgets
|
|||
|
fgets(line,sizeof(line),stdin);
|
|||
|
#endif
|
|||
|
if (line[strlen(line)-1] == '\n')
|
|||
|
line[strlen(line)-1] = '\0';
|
|||
|
linep = line;
|
|||
|
}
|
|||
|
// Skip leading white space
|
|||
|
while (*linep == ' ') linep++;
|
|||
|
// Nothing left
|
|||
|
if (*linep == 0) {
|
|||
|
chew();
|
|||
|
return IHEOL;
|
|||
|
}
|
|||
|
if (isdigit(*linep) || *linep=='+' || *linep=='-' || *linep=='.') {
|
|||
|
// treat as a number
|
|||
|
if (sscanf(linep, "%lf%n", &aaitem, &i) < 1) {
|
|||
|
linep = line; // Invalid numbers are ignored
|
|||
|
*linep = 0;
|
|||
|
return IHEOL;
|
|||
|
}
|
|||
|
else {
|
|||
|
// skip to end
|
|||
|
linep += i;
|
|||
|
return IHREAL;
|
|||
|
}
|
|||
|
}
|
|||
|
// Treat as alpha
|
|||
|
cp = citem;
|
|||
|
while (*linep && *linep!=' ') {
|
|||
|
if ((cp - citem) < 9) *cp++ = tolower(*linep);
|
|||
|
linep++;
|
|||
|
}
|
|||
|
*cp = 0;
|
|||
|
return IHALPHA;
|
|||
|
}
|
|||
|
|
|||
|
int ja(void) {
|
|||
|
chew();
|
|||
|
while (TRUE) {
|
|||
|
scan();
|
|||
|
chew();
|
|||
|
if (*citem == 'y') return TRUE;
|
|||
|
if (*citem == 'n') return FALSE;
|
|||
|
/* proutn("Please answer with \"Y\" or \"N\":"); */
|
|||
|
proutn("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⢥<EFBFBD><E2A2A5><EFBFBD><EFBFBD> \"y\" or \"n\":");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void cramf(double x, int w, int d) {
|
|||
|
char buf[64];
|
|||
|
sprintf(buf, "%*.*f", w, d, x);
|
|||
|
proutn(buf);
|
|||
|
}
|
|||
|
|
|||
|
void crami(int i, int w) {
|
|||
|
char buf[16];
|
|||
|
sprintf(buf, "%*d", w, i);
|
|||
|
proutn(buf);
|
|||
|
}
|
|||
|
|
|||
|
double square(double i) { return i*i; }
|
|||
|
|
|||
|
static void clearscreen(void) {
|
|||
|
/* Somehow we need to clear the screen */
|
|||
|
proutn("\033[2J\033[0;0H"); /* Hope for an ANSI display */
|
|||
|
}
|
|||
|
|
|||
|
/* We will pull these out in case we want to do something special later */
|
|||
|
|
|||
|
void pause(int i) {
|
|||
|
#ifdef CLOAKING
|
|||
|
if (iscloaked) return;
|
|||
|
#endif
|
|||
|
putchar('\n');
|
|||
|
if (i==1) {
|
|||
|
if (skill > SFAIR)
|
|||
|
prout("[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...]");/*ANNOUNCEMENT ARRIVING*/
|
|||
|
else
|
|||
|
/* prout("[IMPORTANT ANNOUNCEMENT ARRIVING -- HIT ENTER TO CONTINUE]"); */
|
|||
|
prout("[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ENTER <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]");
|
|||
|
getchar();
|
|||
|
}
|
|||
|
else {
|
|||
|
if (skill > SFAIR)
|
|||
|
proutn("[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?]");/*CONTINUE*/
|
|||
|
else
|
|||
|
proutn("[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ENTER <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]");/*HIT ENTER TO CONTINUE*/
|
|||
|
getchar();
|
|||
|
proutn("\r \r");
|
|||
|
}
|
|||
|
if (i != 0) {
|
|||
|
clearscreen();
|
|||
|
}
|
|||
|
linecount = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void skip(int i) {
|
|||
|
while (i-- > 0) {
|
|||
|
linecount++;
|
|||
|
if (linecount >= 23)
|
|||
|
pause(0);
|
|||
|
else
|
|||
|
putchar('\n');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void proutn(char *s) {
|
|||
|
#ifndef KOS32
|
|||
|
fputs(s, stdout);
|
|||
|
#else
|
|||
|
con_write_asciiz(s);
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
void prout(char *s) {
|
|||
|
proutn(s);
|
|||
|
skip(1);
|
|||
|
}
|
|||
|
|
|||
|
void prouts(char *s) {
|
|||
|
#ifdef KOS32
|
|||
|
#define clock_t long int
|
|||
|
#define clock() get_tick_count()
|
|||
|
#define CLOCKS_PER_SEC 100
|
|||
|
#endif
|
|||
|
|
|||
|
clock_t endTime;
|
|||
|
/* print slowly! */
|
|||
|
while (*s) {
|
|||
|
endTime = clock() + CLOCKS_PER_SEC*0.05;
|
|||
|
while (clock() < endTime) ;
|
|||
|
putchar(*s++);
|
|||
|
#ifndef KOS32
|
|||
|
fflush(stdout);
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void huh(void) {
|
|||
|
chew();
|
|||
|
skip(1);
|
|||
|
/* prout("Beg your pardon, Captain?"); */
|
|||
|
prout("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>⠭?");
|
|||
|
}
|
|||
|
|
|||
|
int isit(char *s) {
|
|||
|
/* New function -- compares s to scaned citem and returns true if it
|
|||
|
matches to the length of s */
|
|||
|
|
|||
|
return strncmp(s, citem, max(1, strlen(citem))) == 0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#ifdef DEBUG
|
|||
|
void debugme(void) {
|
|||
|
proutn("Reset levels? ");
|
|||
|
if (ja() != 0) {
|
|||
|
if (energy < inenrg) energy = inenrg;
|
|||
|
shield = inshld;
|
|||
|
torps = intorps;
|
|||
|
lsupres = inlsr;
|
|||
|
}
|
|||
|
proutn("Reset damage? ");
|
|||
|
if (ja() != 0) {
|
|||
|
int i;
|
|||
|
for (i=0; i <= ndevice; i++) if (damage[i] > 0.0) damage[i] = 0.0;
|
|||
|
stdamtim = 1e30;
|
|||
|
}
|
|||
|
proutn("Toggle idebug? ");
|
|||
|
if (ja() != 0) {
|
|||
|
idebug = !idebug;
|
|||
|
if (idebug) prout("Debug output ON");
|
|||
|
else prout("Debug output OFF");
|
|||
|
}
|
|||
|
proutn("Cause selective damage? ");
|
|||
|
if (ja() != 0) {
|
|||
|
int i, key;
|
|||
|
for (i=1; i <= ndevice; i++) {
|
|||
|
proutn("Kill ");
|
|||
|
proutn(device[i]);
|
|||
|
proutn("? ");
|
|||
|
chew();
|
|||
|
key = scan();
|
|||
|
if (key == IHALPHA && isit("y")) {
|
|||
|
damage[i] = 10.0;
|
|||
|
if (i == DRADIO) stdamtim = d.date;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
proutn("Examine/change events? ");
|
|||
|
if (ja() != 0) {
|
|||
|
int i;
|
|||
|
for (i = 1; i < NEVENTS; i++) {
|
|||
|
int key;
|
|||
|
if (future[i] == 1e30) continue;
|
|||
|
switch (i) {
|
|||
|
case FSNOVA: proutn("Supernova "); break;
|
|||
|
case FTBEAM: proutn("T Beam "); break;
|
|||
|
case FSNAP: proutn("Snapshot "); break;
|
|||
|
case FBATTAK: proutn("Base Attack "); break;
|
|||
|
case FCDBAS: proutn("Base Destroy "); break;
|
|||
|
case FSCMOVE: proutn("SC Move "); break;
|
|||
|
case FSCDBAS: proutn("SC Base Destroy "); break;
|
|||
|
}
|
|||
|
cramf(future[i]-d.date, 8, 2);
|
|||
|
chew();
|
|||
|
proutn(" ?");
|
|||
|
key = scan();
|
|||
|
if (key == IHREAL) {
|
|||
|
future[i] = d.date + aaitem;
|
|||
|
}
|
|||
|
}
|
|||
|
chew();
|
|||
|
}
|
|||
|
proutn("Make universe visible? ");
|
|||
|
if (ja() != 0) {
|
|||
|
int i, j;
|
|||
|
for (i = 1; i < 9; i++)
|
|||
|
{
|
|||
|
for (j = 1; j < 9; j++)
|
|||
|
{
|
|||
|
starch[i][j] = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif
|