X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.c;h=96e5edb68b34f4af481980f8c9ca80b134faf68e;hp=90b2b307a6ba536b964e2b89cf00621e93633248;hb=a0afd227763655ee0ecd7ef5faea92d63d5c5ba6;hpb=dc45b3ccf42344c238ddb146d79dc62086624848 diff --git a/src/sst.c b/src/sst.c index 90b2b30..96e5edb 100644 --- a/src/sst.c +++ b/src/sst.c @@ -162,6 +162,12 @@ for a lot of magic numbers and refactored the heck out of it. 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 */ @@ -176,8 +182,7 @@ 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", @@ -464,7 +469,7 @@ static void makemoves(void) dreprt(); break; case CHART: // chart - chart(0); + chart(false); break; case IMPULSE: // impulse impuls(); @@ -565,14 +570,14 @@ static void makemoves(void) 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; } @@ -595,8 +600,20 @@ int main(int argc, char **argv) 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; @@ -612,8 +629,10 @@ int main(int argc, char **argv) /* 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'; @@ -715,14 +734,6 @@ double expran(double avrage) 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); } @@ -884,12 +895,16 @@ void debugme(void) 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); @@ -900,20 +915,23 @@ void debugme(void) 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; } } } @@ -922,6 +940,6 @@ void debugme(void) proutn("Induce supernova here? "); if (ja()) { game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova = true; - atover(1); + atover(true); } }