type is "plain" or "almy".)
6. User input is now logged so we can do regression testing.
+
+ 7. More BSD-Trek features: You can now lose if your entire crew
+ dies in battle. When abandoning ship in a game with inhabited
+ worlds enabled, they must have one in the quadrant to beam down
+ to; otherwise they die in space and this counts heavily against
+ your score. Docking at a starbase replenishes your crew.
*/
/* the input queue */
struct game game;
coord thing;
-int iqhere, iqengry;
+bool iqhere, iqengry;
int iscore, iskill; // Common PLAQ
double aaitem;
double perdate;
char citem[10];
int seed; // the random-number seed
bool idebug; // debug mode
-bool randready; // Has the random-number generator initialized?
-FILE *logfp;
+FILE *logfp, *replayfp;
char *device[NDEVICES] = {
"S. R. Sensors",
makechart();
continue;
}
- game.ididit=0;
+ game.ididit = false;
clrscr();
setwnd(message_window);
clrscr();
dreprt();
break;
case CHART: // chart
- chart(0);
+ chart(false);
break;
case IMPULSE: // impulse
impuls();
abandn();
break;
case DESTRUCT: // Self Destruct
- dstrct();
+ selfdestruct();
break;
case SAVE: // Save Game
freeze(false);
if (game.alldone) break; // Events did us in
}
if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) { // Galaxy went Nova!
- atover(0);
+ atover(false);
continue;
}
- if (hitme && game.justin==0) {
+ if (hitme && !game.justin) {
attack(2);
if (game.alldone) break;
if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) { // went NOVA!
- atover(0);
+ atover(false);
hitme = true;
continue;
}
else
game.options |= OPTION_TTY;
- while ((option = getopt(argc, argv, "tx")) != -1) {
+ seed = (int)time(NULL);
+ while ((option = getopt(argc, argv, "r:tx")) != -1) {
switch (option) {
+ case 'r':
+ replayfp = fopen(optarg, "r");
+ if (replayfp == NULL) {
+ fprintf(stderr, "sst: can't open replay file %s\n", optarg);
+ exit(1);
+ }
+ if (fscanf(replayfp, "seed %d\n", &seed) != 1) {
+ fprintf(stderr, "sst: replay file %s is ill-formed\n", optarg);
+ exit(1);
+ }
+ /* FALL THROUGH */
case 't':
game.options |= OPTION_TTY;
game.options &=~ OPTION_CURSES;
/* where to save the input in case of bugs */
logfp = fopen("sst-input.log", "w");
setlinebuf(logfp);
+ fprintf(logfp, "seed %d\n", seed);
+ srand(seed);
- randomize();
+ srand(seed);
iostart();
line[0] = '\0';
if (game.tourn && game.alldone) {
proutn("Do you want your score recorded?");
- if (ja()) {
+ if (ja() == true) {
chew2();
freeze(false);
}
return buf;
}
-void crmena(int i, int enemy, int key, coord w)
+void crmena(bool stars, int enemy, enum loctype key, coord w)
{
- if (i == 1) proutn("***");
+ if (stars) proutn("***");
cramen(enemy);
proutn(" at ");
proutn(cramlc(key, w));
double Rand(void)
{
- if (!randready) {
- if (seed == 0)
- seed = (unsigned)time(NULL);
- if (logfp)
- fprintf(logfp, "seed %d\n", seed);
- srand(seed);
- randready = true;
- }
return rand()/(1.0 + (double)RAND_MAX);
}
void debugme(void)
{
proutn("Reset levels? ");
- if (ja() != 0) {
+ if (ja() == true) {
if (game.energy < game.inenrg) game.energy = game.inenrg;
game.shield = game.inshld;
game.torps = game.intorps;
game.lsupres = game.inlsr;
}
proutn("Reset damage? ");
- if (ja() != 0) {
+ if (ja() == true) {
int i;
for (i=0; i < NDEVICES; i++)
if (game.damage[i] > 0.0)
game.damage[i] = 0.0;
}
proutn("Toggle debug flag? ");
- if (ja() != 0) {
+ if (ja() == true) {
idebug = !idebug;
if (idebug) prout("Debug output ON");
else prout("Debug output OFF");
}
proutn("Cause selective damage? ");
- if (ja() != 0) {
+ if (ja() == true) {
int i, key;
for (i=0; i < NDEVICES; i++) {
proutn("Kill ");
}
}
proutn("Examine/change events? ");
- if (ja() != 0) {
+ if (ja() == true) {
event *ev;
coord w;
int i;
case FENSLV: proutn("Enlavement "); break;
case FREPRO: proutn("Klingon Build "); break;
}
- if (is_scheduled(i))
+ if (is_scheduled(i)) {
proutn("%.2f", scheduled(i)-game.state.date);
- else
+ if (i == FENSLV || i == FREPRO) {
+ ev = findevent(i);
+ proutn(" in %d-%d", ev->quadrant.x,ev->quadrant.y);
+ }
+ } else
proutn("never");
- chew();
proutn("? ");
+ chew();
key = scan();
if (key == 'n') {
unschedule(i);
chew();
proutn("In quadrant- ");
key = scan();
- if (key != IHREAL) {
- prout("Event %d canceled, no y coordinate.", i);
- unschedule(i);
- continue;
- }
- w.y = (int)aaitem;
- key = scan();
- if (key != IHREAL) {
- prout("Event %d canceled, no x coordinate.", i);
- unschedule(i);
- continue;
+ /* IHEOL says to leave coordinates as they are */
+ if (key != IHEOL) {
+ if (key != IHREAL) {
+ prout("Event %d canceled, no x coordinate.", i);
+ unschedule(i);
+ continue;
+ }
+ w.x = (int)aaitem;
+ key = scan();
+ if (key != IHREAL) {
+ prout("Event %d canceled, no y coordinate.", i);
+ unschedule(i);
+ continue;
+ }
+ w.y = (int)aaitem;
+ ev->quadrant = w;
}
- w.x = (int)aaitem;
- ev->quadrant = w;
}
}
}
chew();
}
proutn("Induce supernova here? ");
- if (ja()) {
+ if (ja() == true) {
game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova = true;
- atover(1);
+ atover(true);
}
}