Dave Matuszek says:
- SRSCAN, MOVE, PHASERS, CALL, STATUS, IMPULSE, PHOTONS, ABANDON,
- LRSCAN, WARP, SHIELDS, DESTRUCT, CHART, REST, DOCK, QUIT, and DAMAGE
- were in the original non-"super" version.
+ SRSCAN, MOVE, PHASERS, CALL, STATUS, IMPULSE, PHOTONS, ABANDON,
+ LRSCAN, WARP, SHIELDS, DESTRUCT, CHART, REST, DOCK, QUIT, and DAMAGE
+ were in the original non-"super" version.
- Tholians weren't in the original. Dave is dubious about their merits.
- There weren't even planets. He says the bit about the Galileo getting
- turned into a McDonald's is "consistant with our original vision".
+ Tholians weren't in the original. Dave is dubious about their merits.
- Dilithium crystals weren't in the original. Dave is OK with this idea.
+ Planets and dilithium crystals weren't in the original. Dave is OK
+ with this idea. He says the bit about the Galileo getting
+ turned into a McDonald's is "consistant with our original vision".
- Dave also says the Space Thingy should not be preserved across saved games,
- so you can't prove to others that you've seen it. He says it shouldn't
- fire back, either. It should so nothing except scream and disappear
- when hit by photon torpedos. It's OK that it moves when rammed, but it
- didn't in the original.
+ Dave also says the Space Thingy should not be preserved across saved
+ games, so you can't prove to others that you've seen it. He says it
+ shouldn't fire back, either. It should do nothing except scream and
+ disappear when hit by photon torpedos. It's OK that it may move
+ when attacked, but it didn't in the original.
- The Faerie Queen was in the original.
+ The Faerie Queen, black holes, and time warping were in the original.
Here are Tom Almy's changes:
- Compared to original version, I've changed the "help" command to
+ 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".
chasing SCom can take an eternity).
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)
+ remember what it was, but it was something I had difficulty using.
6. Secret password is now autogenerated.
Eric Raymond's changes:
- Mainly, I translated this C code out of FORTRAN into C -- created #defines
- for a lot of magic numbers and refactored the heck out of it.
+Mainly, I translated this C code out of FORTRAN into C -- created #defines
+for a lot of magic numbers and refactored the heck out of it.
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.
-
- */
+ 3. Per Dave Matuszek's remarks, Thingy state is not saved across games.
+*/
/* the input queue */
static char line[128], *linep = line;
{"DEBUG", DEBUGCMD, 0},
#define MAYDAY 32
{"MAYDAY", MAYDAY, 0},
- {"SOS", MAYDAY, 0},
- {"CALL", MAYDAY, 0},
+ //{"SOS", MAYDAY, 0},
+ //{"CALL", MAYDAY, 0},
#define QUIT 33
{"QUIT", QUIT, 0},
#define HELP 34
};
#define NUMCOMMANDS sizeof(commands)/sizeof(commands[0])
+#define ACCEPT(i) (!commands[i].option || (commands[i].option & game.options))
static void listCommands(void) {
int i, k = 0;
proutn("LEGAL COMMANDS ARE:");
for (i = 0; i < NUMCOMMANDS; i++) {
- if (commands[i].option && !(commands[i].option & game.options))
+ if (!ACCEPT(i))
continue;
if (k % 5 == 0)
skip(1);
setwnd(message_window);
if (key == IHEOL) return;
for (i = 0; i < NUMCOMMANDS; i++) {
- if (strcasecmp(commands[i].name, citem)==0) {
+ if (ACCEPT(i) && strcasecmp(commands[i].name, citem)==0) {
i = commands[i].value;
break;
}
static void makemoves(void)
{
- int i, v, hitme;
+ int i, v = 0, hitme;
clrscr();
setwnd(message_window);
while (TRUE) { /* command loop */
setwnd(message_window);
clrscr();
for (i=0; i < ABANDON; i++)
- if (isit(commands[i].name)) {
+ if (ACCEPT(i) && isit(commands[i].name)) {
v = commands[i].value;
break;
}
- if (i < ABANDON) break;
+ if (i < ABANDON && (!commands[i].option || (commands[i].option & game.options)))
+ break;
for (; i < NUMCOMMANDS; i++)
- if (strcasecmp(commands[i].name, citem) == 0) {
+ if (ACCEPT(i) && strcasecmp(commands[i].name, citem) == 0) {
v = commands[i].value;
break;
}
case IMPULSE: // impulse
impuls();
break;
- case REST: // rest
+ case REST: // rest
wait();
if (ididit) hitme = TRUE;
break;
- case WARP: // warp
+ case WARP: // warp
setwrp();
break;
- case SCORE: // score
+ case SCORE: // score
score();
break;
case SENSORS: // sensors
- sensor(TRUE);
+ sensor();
break;
case ORBIT: // orbit
orbit();
case COMMANDS:
listCommands();
break;
- case EMEXIT: // Emergency exit
- clrscr(); // Hide screen
- freeze(TRUE); // forced save
- exit(1); // And quick exit
+ case EMEXIT: // Emergency exit
+ clrscr(); // Hide screen
+ freeze(TRUE); // forced save
+ exit(1); // And quick exit
break;
case PROBE:
- probe(); // Launch probe
+ probe(); // Launch probe
if (ididit) hitme = TRUE;
break;
case ABANDON: // Abandon Ship
if (skill > SKILL_GOOD)
prout("WARNING--Saved games produce no plaques!");
break;
- case DEATHRAY: // Try a desparation measure
+ case DEATHRAY: // Try a desparation measure
deathray();
if (ididit) hitme = TRUE;
break;
- case DEBUGCMD: // What do we want for debug???
+ case DEBUGCMD: // What do we want for debug???
#ifdef DEBUG
debugme();
#endif
break;
- case MAYDAY: // Call for help
+ case MAYDAY: // Call for help
help();
if (ididit) hitme = TRUE;
break;
case QUIT:
- alldone = 1; // quit the game
+ alldone = 1; // quit the game
#ifdef DEBUG
if (idebug) score();
#endif
#endif
if (Time != 0.0) {
events();
- if (alldone) break; // Events did us in
+ if (alldone) break; // Events did us in
}
- if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) { // Galaxy went Nova!
+ if (game.state.galaxy[quadx][quady].supernova) { // Galaxy went Nova!
atover(0);
continue;
}
if (hitme && justin==0) {
attack(2);
if (alldone) break;
- if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) { // went NOVA!
+ if (game.state.galaxy[quadx][quady].supernova) { // went NOVA!
atover(0);
hitme = TRUE;
continue;
{
int i, option;
- game.options = OPTION_ALL &~ OPTION_IOMODES;
+ game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_SHOWME);
if (getenv("TERM"))
- game.options |= OPTION_CURSES;
+ game.options |= OPTION_CURSES | OPTION_SHOWME;
else
game.options |= OPTION_TTY;
while (TRUE) { /* Play a game */
setwnd(fullscreen_window);
#ifdef DEBUG
- prout("INITIAL OPTIONS: %0lx\n", game.options);
+ prout("INITIAL OPTIONS: %0lx", game.options);
#endif /* DEBUG */
clrscr();
prelim();
proutn("Reset damage? ");
if (ja() != 0) {
int i;
- for (i=0; i <= NDEVICES; i++)
+ for (i=0; i < NDEVICES; i++)
if (game.damage[i] > 0.0)
game.damage[i] = 0.0;
- stdamtim = 1e30;
}
proutn("Toggle idebug? ");
if (ja() != 0) {
proutn("Cause selective damage? ");
if (ja() != 0) {
int i, key;
- for (i=1; i <= NDEVICES; i++) {
+ for (i=0; i < NDEVICES; i++) {
proutn("Kill ");
proutn(device[i]);
proutn("? ");
key = scan();
if (key == IHALPHA && isit("y")) {
game.damage[i] = 10.0;
- if (i == DRADIO) stdamtim = game.state.date;
}
}
}
int i;
for (i = 1; i < NEVENTS; i++) {
int key;
- if (game.future[i] == 1e30) continue;
+ if (game.future[i] == FOREVER) continue;
switch (i) {
case FSNOVA: proutn("Supernova "); break;
case FTBEAM: proutn("T Beam "); break;
}
chew();
}
+ proutn("Induce supernova here? ");
+ if (ja() != 0) {
+ game.state.galaxy[quadx][quady].supernova = TRUE;
+ atover(1);
+ }
}
#endif