#define INCLUDED // Define externs here\r
#include "sst.h"\r
#include <ctype.h>\r
+#include <stdarg.h>\r
#ifdef MSDOS\r
#include <dos.h>\r
#endif\r
#include <time.h>\r
+\r
+#ifndef SSTDOC\r
+#define SSTDOC "sst.doc"\r
+#endif\r
\r
int getch(void);\r
\r
static char line[128], *linep = line;\r
static int linecount; /* for paging */\r
+static int screenheight = 24;\r
\r
static void clearscreen(void);\r
\r
\r
static void helpme(void) {\r
int i, j;\r
- char cmdbuf[32];\r
+ char cmdbuf[32], *cp;\r
char linebuf[132];\r
FILE *fp;\r
/* Give help on commands */\r
strcpy(cmdbuf, " ABBREV");\r
}\r
else {\r
- strcpy(cmdbuf, " Mnemonic: ");\r
- j = 0;\r
- while ((cmdbuf[j+13] = toupper(commands[i][j])) != 0) j++;\r
+ for (j = 0; commands[i][j]; j++)\r
+ cmdbuf[j] = toupper(commands[i][j]);\r
+ cmdbuf[j] = '\0';\r
}\r
- fp = fopen("sst.doc", "r");\r
+ fp = fopen(SSTDOC, "r");\r
if (fp == NULL) {\r
prout("Spock- \"Captain, that information is missing from the");\r
prout(" computer. You need to find SST.DOC and put it in the");\r
prout(" current directory.\"");\r
return;\r
}\r
- i = strlen(cmdbuf);\r
- do {\r
- if (fgets(linebuf, 132, fp) == NULL) {\r
+ for (;;) {\r
+ if (fgets(linebuf, sizeof(linebuf), fp) == NULL) {\r
prout("Spock- \"Captain, there is no information on that command.\"");\r
fclose(fp);\r
return;\r
}\r
- } while (strncmp(linebuf, cmdbuf, i) != 0);\r
+ if (linebuf[0] == '%' && linebuf[1] == '%'&& linebuf[2] == ' ') {\r
+ for (cp = linebuf+3; isspace(*cp); cp++)\r
+ continue;\r
+ linebuf[strlen(linebuf)-1] = '\0';\r
+ if (strcmp(cp, cmdbuf) == 0)\r
+ break;\r
+ }\r
+ }\r
\r
skip(1);\r
prout("Spock- \"Captain, I've found the following information:\"");\r
skip(1);\r
\r
- do {\r
- if (linebuf[0]!=12) { // ignore page break lines \r
- linebuf[strlen(linebuf)-1] = '\0'; // No \n at end\r
- prout(linebuf);\r
- }\r
- fgets(linebuf,132,fp);\r
- } while (strstr(linebuf, "******")==NULL);\r
+ while (fgets(linebuf, sizeof(linebuf),fp)) {\r
+ if (strstr(linebuf, "******"))\r
+ break;\r
+ /* use fputs here to avoid % expansion */\r
+ fputs(linebuf, stdout);\r
+ }\r
fclose(fp);\r
}\r
\r
events();\r
if (alldone) break; // Events did us in\r
}\r
- if (state.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!\r
+ if (game.state.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!\r
atover(0);\r
continue;\r
}\r
if (hitme && justin==0) {\r
attack(2);\r
if (alldone) break;\r
- if (state.galaxy[quadx][quady] == 1000) { // went NOVA! \r
+ if (game.state.galaxy[quadx][quady] == 1000) { // went NOVA! \r
atover(0);\r
hitme = TRUE;\r
continue;\r
int hitme;\r
char ch;\r
prelim();\r
+ char *LINES = getenv("LINES");\r
+ \r
+ if (LINES)\r
+ screenheight = atoi(LINES);\r
\r
if (argc > 1) {\r
fromcommandline = 1;\r
skip(1);\r
\r
if (tourn && alldone) {\r
- printf("Do you want your score recorded?");\r
+ proutn("Do you want your score recorded?");\r
if (ja()) {\r
chew2();\r
freeze(FALSE);\r
}\r
}\r
- printf("Do you want to play again?");\r
+ proutn("Do you want to play again?");\r
if (!ja()) break;\r
}\r
skip(1);\r
proutn(s);\r
}\r
\r
-void cramlc(int key, int x, int y) {\r
- if (key == 1) proutn(" Quadrant");\r
- else if (key == 2) proutn(" Sector");\r
- proutn(" ");\r
- crami(x, 1);\r
- proutn(" - ");\r
- crami(y, 1);\r
+char *cramlc(enum loctype key, int x, int y) {\r
+ static char buf[32];\r
+ buf[0] = '\0';\r
+ if (key == quadrant) strcpy(buf, "Quadrant ");\r
+ else if (key == sector) strcpy(buf, "Sector ");\r
+ sprintf(buf+strlen(buf), "%d-%d", x, y);\r
+ return buf;\r
}\r
\r
void crmena(int i, int enemy, int key, int x, int y) {\r
if (i == 1) proutn("***");\r
cramen(enemy);\r
proutn(" at");\r
- cramlc(key, x, y);\r
+ proutn(cramlc(key, x, y));\r
}\r
\r
void crmshp(void) {\r
}\r
}\r
\r
-void cramf(double x, int w, int d) {\r
- char buf[64];\r
- sprintf(buf, "%*.*f", w, d, x);\r
- proutn(buf);\r
-}\r
-\r
-void crami(int i, int w) {\r
- char buf[16];\r
- sprintf(buf, "%*d", w, i);\r
- proutn(buf);\r
-}\r
-\r
double square(double i) { return i*i; }\r
\r
static void clearscreen(void) {\r
void skip(int i) {\r
while (i-- > 0) {\r
linecount++;\r
- if (linecount >= 23)\r
+ if (linecount >= screenheight)\r
pause(0);\r
else\r
putchar('\n');\r
}\r
\r
\r
-void proutn(char *s) {\r
- fputs(s, stdout);\r
+void proutn(char *fmt, ...) {\r
+ va_list ap;\r
+ va_start(ap, fmt);\r
+ vprintf(fmt, ap);\r
+ va_end(ap);\r
}\r
\r
-void prout(char *s) {\r
- proutn(s);\r
- skip(1);\r
+void prout(char *fmt, ...) {\r
+ va_list ap;\r
+ va_start(ap, fmt);\r
+ vprintf(fmt, ap);\r
+ va_end(ap);\r
+ skip(1);\r
}\r
\r
-void prouts(char *s) {\r
+void prouts(char *fmt, ...) {\r
clock_t endTime;\r
+ char *s, buf[BUFSIZ];\r
/* print slowly! */\r
- while (*s) {\r
+ va_list ap;\r
+ va_start(ap, fmt);\r
+ vsprintf(buf, fmt, ap);\r
+ va_end(ap);\r
+ skip(1);\r
+ for (s = buf; *s; s++) {\r
endTime = clock() + CLOCKS_PER_SEC*0.05;\r
while (clock() < endTime) ;\r
- putchar(*s++);\r
+ putchar(*s);\r
fflush(stdout);\r
}\r
}\r
proutn("Reset damage? ");\r
if (ja() != 0) {\r
int i;\r
- for (i=0; i <= ndevice; i++) if (damage[i] > 0.0) damage[i] = 0.0;\r
+ for (i=0; i <= NDEVICES; i++) if (damage[i] > 0.0) damage[i] = 0.0;\r
stdamtim = 1e30;\r
}\r
proutn("Toggle idebug? ");\r
proutn("Cause selective damage? ");\r
if (ja() != 0) {\r
int i, key;\r
- for (i=1; i <= ndevice; i++) {\r
+ for (i=1; i <= NDEVICES; i++) {\r
proutn("Kill ");\r
proutn(device[i]);\r
proutn("? ");\r
key = scan();\r
if (key == IHALPHA && isit("y")) {\r
damage[i] = 10.0;\r
- if (i == DRADIO) stdamtim = state.date;\r
+ if (i == DRADIO) stdamtim = game.state.date;\r
}\r
}\r
}\r
case FSCMOVE: proutn("SC Move "); break;\r
case FSCDBAS: proutn("SC Base Destroy "); break;\r
}\r
- cramf(future[i]-state.date, 8, 2);\r
+ proutn("%.2f", future[i]-game.state.date);\r
chew();\r
proutn(" ?");\r
key = scan();\r
if (key == IHREAL) {\r
- future[i] = state.date + aaitem;\r
+ future[i] = game.state.date + aaitem;\r
}\r
}\r
chew();\r