#include <ctype.h>
#include <getopt.h>
#include <time.h>
-#include "conio.h"
#include "sstlinux.h"
#include "sst.h"
#define SSTDOC "sst.doc"
#endif
-static char line[128], *linep = line;
-
/*
Here are Tom Almy's changes:
6. Perhaps cloaking to be added later? BSD version
-Here are Stas Sergeev's changes (controlled by the proprocessor symbol
-SERGEEV, not yet completely merged):
+Here are Stas Sergeev's changes:
1. The Space Thingy can be shoved, if you it ram, and can fire back if
fired upon.
- 1 The Tholian can be hit with phasers
+ 2. The Tholian can be hit with phasers
- 2. When you are docked, base covers you with an almost invincible shields
+ 3. When you are docked, base covers you with an almost invincible shields
(a commander can still ram you, or a Romulan can destroy the base,
or a SCom can even succeed with direct attack IIRC, but this rarely
happens).
- 3. SCom can't escape from you if no more enemies remain (without this,
- chasing SCom can take an eternity).
+ 4. SCom can't escape from you if no more enemies remain (without this,
+ chasing SCom can take an eternity).
- 4. Probe target you enter is now the destination quadrant. Before I don't
- remember what it was, but it was something I had difficulty using)
+ 5. Probe target you enter is now the destination quadrant. Before I don't
+ remember what it was, but it was something I had difficulty using)
- 5. Secret password is now autogenerated.
+ 6. Secret password is now autogenerated.
- 6. "Plaque" is adjusted for A4 paper:)
+ 7. "Plaque" is adjusted for A4 paper :-)
- 7. Phasers now tells you how much energy needed, but only if the computer
+ 8. Phasers now tells you how much energy needed, but only if the computer
is alive.
- 8. Planets are auto-scanned when you enter the quadrant.
+ 9. Planets are auto-scanned when you enter the quadrant.
- 9. Mining or using crystals in presense of enemy now yields an attack.
+ 10. Mining or using crystals in presense of enemy now yields an attack.
There are other minor adjustments to what yields an attack
and what does not.
- 10. Ramming a black hole is no longer instant death. There is a
- chance you might get timewarped instead.
+ 11. Ramming a black hole is no longer instant death. There is a
+ chance you might get timewarped instead.
- 11. "freeze" command reverts to "save", most people will understand this
+ 12. "freeze" command reverts to "save", most people will understand this
better anyway.
+ 13. Screen-oriented interface, with sensor scans always up.
+
Eric Raymond's changes:
- 1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+ Mainly, I translated this C code out of FORTRAN into C -- created #defines
+ for a lot of magic numbers.
+
+ 1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+
+ 2. Status report now indicates when dilithium crystals are on board.
+
+ 3. Can now report starbases left in scrscan.
*/
+/* the input queue */
+static char line[128], *linep = line;
+static int usecurses = TRUE;
+
static struct
{
char *name;
int value;
}
commands[] = {
-#ifndef SERGEEV
-#define SRSCAN 1
+#define SRSCAN 0
{"SRSCAN", SRSCAN},
- {"STATUS", SRSCAN},
-#define LRSCAN 2
+#define STATUS 1
+ {"STATUS", STATUS},
+#define REQUEST 2
+ {"REQUEST", REQUEST},
+#define LRSCAN 3
{"LRSCAN", LRSCAN},
-#endif /* SERGEEV */
-#define PHASERS 3
+#define PHASERS 4
{"PHASERS", PHASERS},
-#define TORPEDO 4
+#define TORPEDO 5
{"TORPEDO", TORPEDO},
{"PHOTONS", TORPEDO},
-#define MOVE 5
+#define MOVE 6
{"MOVE", MOVE},
-#define SHIELDS 6
+#define SHIELDS 7
{"SHIELDS", SHIELDS},
-#define DOCK 7
+#define DOCK 8
{"DOCK", DOCK},
-#define DAMAGES 8
+#define DAMAGES 9
{"DAMAGES", DAMAGES},
-#define CHART 9
+#define CHART 10
{"CHART", CHART},
-#define IMPULSE 10
+#define IMPULSE 11
{"IMPULSE", IMPULSE},
-#define REST 11
+#define REST 12
{"REST", REST},
-#define WARP 12
+#define WARP 13
{"WARP", WARP},
-#define SCORE 13
+#define SCORE 14
{"SCORE", SCORE},
-#ifndef SERGEEV
-#define SENSORS 14
+#define SENSORS 15
{"SENSORS", SENSORS},
-#endif /* SERGEEV */
-#define ORBIT 15
+#define ORBIT 16
{"ORBIT", ORBIT},
-#define TRANSPORT 16
+#define TRANSPORT 17
{"TRANSPORT", TRANSPORT},
-#define MINE 17
+#define MINE 18
{"MINE", MINE},
-#define CRYSTALS 18
+#define CRYSTALS 19
{"CRYSTALS", CRYSTALS},
-#define SHUTTLE 19
+#define SHUTTLE 20
{"SHUTTLE", SHUTTLE},
-#define PLANETS 20
+#define PLANETS 21
{"PLANETS", PLANETS},
-#define REPORT 21
+#define REPORT 22
{"REPORT", REPORT},
#define COMPUTER 23
{"COMPUTER", COMPUTER},
{"FREEZE", SAVE},
#define ABANDON 28
{"ABANDON", ABANDON},
-#define DESTRUCT 29
+#define DESTRUCT 29
{"DESTRUCT", DESTRUCT},
-#define DEATHRAY 30
+#define DEATHRAY 30
{"DEATHRAY", DEATHRAY},
#define DEBUGCMD 31
{"DEBUG", DEBUGCMD},
#define NUMCOMMANDS sizeof(commands)/sizeof(commands[0])
-static void listCommands(int x) {
- int i;
- prout("LEGAL COMMANDS ARE:");
- for (i = 0; i < NUMCOMMANDS; i++) {
- proutn("%-12s ", commands[i].name);
- if (i % 5 == 4)
+#define MIN_CURSES_COMMAND PHASERS /* might change someday */
+
+static void listCommands(int usecurses) {
+ int i, k = 0;
+ proutn("LEGAL COMMANDS ARE:");
+ for (i = usecurses ? MIN_CURSES_COMMAND : 0; i < NUMCOMMANDS; i++) {
+ if (k % 5 == 0)
skip(1);
+ proutn("%-12s ", commands[i].name);
+ k++;
}
skip(1);
}
key = scan();
while (TRUE) {
if (key == IHEOL) {
- setwnd(BOTTOM_WINDOW);
+ setwnd(prompt_window);
proutn("Help on what command? ");
key = scan();
}
- setwnd(LOWER_WINDOW);
+ setwnd(message_window);
if (key == IHEOL) return;
for (i = 0; i < NUMCOMMANDS; i++) {
if (strcasecmp(commands[i].name, citem)==0) {
if (i != NUMCOMMANDS) break;
skip(1);
prout("Valid commands:");
- listCommands(FALSE);
+ listCommands(usecurses);
key = IHEOL;
chew();
skip(1);
while (fgets(linebuf, sizeof(linebuf),fp)) {
if (strstr(linebuf, "******"))
break;
- proutc(linebuf);
+ proutn(linebuf);
}
fclose(fp);
}
+void enqueue(char *s) {
+ strcpy(line, s);
+}
+
static void makemoves(void) {
int i, hitme;
clrscr();
- setwnd(LOWER_WINDOW);
+ setwnd(message_window);
while (TRUE) { /* command loop */
drawmaps(1);
while (TRUE) { /* get a command */
Time = 0.0;
i = -1;
chew();
- setwnd(BOTTOM_WINDOW);
+ setwnd(prompt_window);
clrscr();
proutn("COMMAND> ");
if (scan() == IHEOL) {
-#ifdef SERGEEV
- _setcursortype(_NOCURSOR);
- setwnd(LOWER_WINDOW);
- clrscr();
- chart(0);
- _setcursortype(_NORMALCURSOR);
-#endif /* SERGEEV */
+ makechart();
continue;
}
ididit=0;
clrscr();
- setwnd(LOWER_WINDOW);
+ setwnd(message_window);
clrscr();
for (i=0; i < ABANDON; i++)
if (isit(commands[i].name)) {
break;
}
if (i < NUMCOMMANDS) break;
-
- listCommands(TRUE);
+ listCommands(usecurses);
}
commandhook(commands[i].name, TRUE);
switch (i) { /* command switch */
-#ifndef SERGEEV
case SRSCAN: // srscan
- srscan(1);
+ srscan(SCAN_FULL);
break;
+ case STATUS: // status
+ srscan(SCAN_STATUS);
+ break;
+ case REQUEST: // status request
+ srscan(SCAN_REQUEST);
+ break;
case LRSCAN: // lrscan
lrscan();
break;
-#endif /* SERGEEV */
case PHASERS: // phasers
phasers();
if (ididit) hitme = TRUE;
case SCORE: // score
score();
break;
-#ifndef SERGEEV
case SENSORS: // sensors
- sensor();
+ sensor(TRUE);
break;
-#endif /* SERGEEV */
case ORBIT: // orbit
orbit();
if (ididit) hitme = TRUE;
eta();
break;
case COMMANDS:
- listCommands(TRUE);
+ listCommands(usecurses);
break;
case EMEXIT: // Emergency exit
clrscr(); // Hide screen
case SAVE: // Save Game
freeze(FALSE);
clrscr();
- if (skill > 3)
+ if (skill > SKILL_GOOD)
prout("WARNING--Saved games produce no plaques!");
break;
case DEATHRAY: // Try a desparation measure
events();
if (alldone) break; // Events did us in
}
- if (game.state.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!
+ if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) { // Galaxy went Nova!
atover(0);
continue;
}
if (hitme && justin==0) {
attack(2);
if (alldone) break;
- if (game.state.galaxy[quadx][quady] == 1000) { // went NOVA!
+ if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) { // went NOVA!
atover(0);
hitme = TRUE;
continue;
int main(int argc, char **argv) {
- int i, option, usecurses = TRUE;
+ int i, option;
while ((option = getopt(argc, argv, "t")) != -1) {
switch (option) {
strcat(line, " ");
}
while (TRUE) { /* Play a game */
+ setwnd(fullscreen_window);
+ clrscr();
prelim();
setup(line[0] == '\0');
if (alldone) {
}
proutn("Do you want to play again? ");
if (!ja()) break;
- setwnd(FULLSCREEN_WINDOW);
- clrscr();
}
skip(1);
- ioend();
prout("May the Great Bird of the Galaxy roost upon your home planet.");
return 0;
}
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 iran(int size, int *i, int *j) {
+ *i = Rand()*(size*1.0) + 1.0;
+ *j = Rand()*(size*1.0) + 1.0;
}
void chew(void) {
}
cgetline(line, sizeof(line));
fflush(stdin);
- if (curwnd==BOTTOM_WINDOW){
+ if (curwnd==prompt_window){
clrscr();
- setwnd(LOWER_WINDOW);
+ setwnd(message_window);
clrscr();
}
linep = line;