X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.c;h=5d34a0dd43c58caee73dfeb6c61c8584c5c92162;hp=21c803e770c362e3b494d6ba0e6b818387fad743;hb=fd5a1ba781a0c37fa6181aa8e856d77d321df7a5;hpb=11dc64d8fe2c6e39557fbacdd5d9a1ab8d436b05 diff --git a/src/sst.c b/src/sst.c index 21c803e..5d34a0d 100644 --- a/src/sst.c +++ b/src/sst.c @@ -164,11 +164,16 @@ for a lot of magic numbers and refactored the heck out of it. static char line[128], *linep = line; struct game game; -int thingx, thingy, iqhere, iqengry; -int iscore, iskill; // Common PLAQ +coord thing; +int 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; char *device[NDEVICES] = { "S. R. Sensors", @@ -297,7 +302,7 @@ static void helpme(void) /* Give help on commands */ int key; key = scan(); - while (TRUE) { + for(;;) { if (key == IHEOL) { setwnd(prompt_window); proutn("Help on what command? "); @@ -374,13 +379,14 @@ void enqueue(char *s) static void makemoves(void) { - int i, v = 0, hitme; + int i, v = 0; + bool hitme; clrscr(); setwnd(message_window); - while (TRUE) { /* command loop */ + for(;;) { /* command loop */ drawmaps(1); - while (TRUE) { /* get a command */ - hitme = FALSE; + for(;;) { /* get a command */ + hitme = false; game.justin = 0; game.optime = 0.0; i = -1; @@ -412,7 +418,7 @@ static void makemoves(void) break; listCommands(); } - commandhook(commands[i].name, TRUE); + commandhook(commands[i].name, true); switch (v) { /* command switch */ case SRSCAN: // srscan srscan(SCAN_FULL); @@ -428,11 +434,11 @@ static void makemoves(void) break; case PHASERS: // phasers phasers(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case TORPEDO: // photons photon(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case MOVE: // move warp(1); @@ -440,7 +446,7 @@ static void makemoves(void) case SHIELDS: // shields doshield(1); if (game.ididit) { - hitme=TRUE; + hitme=true; game.shldchg = 0; } break; @@ -459,7 +465,7 @@ static void makemoves(void) break; case REST: // rest wait(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case WARP: // warp setwrp(); @@ -472,22 +478,22 @@ static void makemoves(void) break; case ORBIT: // orbit orbit(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case TRANSPORT: // transport "beam" beam(); break; case MINE: // mine mine(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case CRYSTALS: // crystals usecrystals(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case SHUTTLE: // shuttle shuttle(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case PLANETS: // Planet list preport(); @@ -503,12 +509,12 @@ static void makemoves(void) break; case EMEXIT: // Emergency exit clrscr(); // Hide screen - freeze(TRUE); // forced save + freeze(true); // forced save exit(1); // And quick exit break; case PROBE: probe(); // Launch probe - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case ABANDON: // Abandon Ship abandn(); @@ -517,54 +523,46 @@ static void makemoves(void) dstrct(); break; case SAVE: // Save Game - freeze(FALSE); + freeze(false); clrscr(); if (game.skill > SKILL_GOOD) prout("WARNING--Saved games produce no plaques!"); break; case DEATHRAY: // Try a desparation measure deathray(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case DEBUGCMD: // What do we want for debug??? -#ifdef DEBUG debugme(); -#endif break; case MAYDAY: // Call for help mayday(); - if (game.ididit) hitme = TRUE; + if (game.ididit) hitme = true; break; case QUIT: game.alldone = 1; // quit the game -#ifdef DEBUG - if (game.idebug) score(); -#endif break; case HELP: helpme(); // get help break; } - commandhook(commands[i].name, FALSE); + commandhook(commands[i].name, false); for (;;) { if (game.alldone) break; // Game has ended -#ifdef DEBUG - if (game.idebug) prout("2500"); -#endif if (game.optime != 0.0) { events(); if (game.alldone) break; // Events did us in } - if (game.state.galaxy[game.quadx][game.quady].supernova) { // Galaxy went Nova! + if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) { // Galaxy went Nova! atover(0); continue; } if (hitme && game.justin==0) { attack(2); if (game.alldone) break; - if (game.state.galaxy[game.quadx][game.quady].supernova) { // went NOVA! + if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) { // went NOVA! atover(0); - hitme = TRUE; + hitme = true; continue; } } @@ -572,6 +570,7 @@ static void makemoves(void) } if (game.alldone) break; } + if (idebug) prout("=== Ending"); } @@ -585,14 +584,17 @@ int main(int argc, char **argv) else game.options |= OPTION_TTY; - while ((option = getopt(argc, argv, "t")) != -1) { + while ((option = getopt(argc, argv, "tx")) != -1) { switch (option) { case 't': game.options |= OPTION_TTY; game.options &=~ OPTION_CURSES; break; + case 'x': + idebug = true; + break; default: - fprintf(stderr, "usage: sst [-t] [startcommand...].\n"); + fprintf(stderr, "usage: sst [-t] [-x] [startcommand...].\n"); exit(0); } } @@ -605,11 +607,8 @@ int main(int argc, char **argv) strcat(line, argv[i]); strcat(line, " "); } - while (TRUE) { /* Play a game */ + for(;;) { /* Play a game */ setwnd(fullscreen_window); -#ifdef DEBUG - prout("INITIAL OPTIONS: %0lx", game.options); -#endif /* DEBUG */ clrscr(); prelim(); setup(line[0] == '\0'); @@ -626,7 +625,7 @@ int main(int argc, char **argv) proutn("Do you want your score recorded?"); if (ja()) { chew2(); - freeze(FALSE); + freeze(false); } } proutn("Do you want to play again? "); @@ -660,22 +659,22 @@ void cramen(int i) proutn(s); } -char *cramlc(enum loctype key, int x, int y) +char *cramlc(enum loctype key, coord w) { static char buf[32]; buf[0] = '\0'; if (key == quadrant) strcpy(buf, "Quadrant "); else if (key == sector) strcpy(buf, "Sector "); - sprintf(buf+strlen(buf), "%d - %d", x, y); + sprintf(buf+strlen(buf), "%d - %d", w.x, w.y); return buf; } -void crmena(int i, int enemy, int key, int x, int y) +void crmena(int i, int enemy, int key, coord w) { if (i == 1) proutn("***"); cramen(enemy); proutn(" at "); - proutn(cramlc(key, x, y)); + proutn(cramlc(key, w)); } void crmshp(void) @@ -700,8 +699,17 @@ double expran(double avrage) return -avrage*log(1e-7 + Rand()); } -double Rand(void) { - return rand()/(1.0 + (double)RAND_MAX); +double Rand(void) +{ + if (!randready) { + if (seed == 0) + seed = (unsigned)time(NULL); + if (idebug) + fprintf(logfp, "seed %d\n", seed); + srand(seed); + randready = true; + } + return rand()/(1.0 + (double)RAND_MAX); } void iran(int size, int *i, int *j) @@ -778,14 +786,14 @@ int scan(void) return IHALPHA; } -int ja(void) +bool ja(void) { chew(); - while (TRUE) { + for(;;) { scan(); chew(); - if (*citem == 'y') return TRUE; - if (*citem == 'n') return FALSE; + if (*citem == 'y') return true; + if (*citem == 'n') return false; proutn("Please answer with \"Y\" or \"N\": "); } } @@ -806,14 +814,13 @@ int isit(char *s) } -#ifdef DEBUG void debugme(void) { proutn("Reset levels? "); if (ja() != 0) { - if (energy < game.inenrg) energy = game.inenrg; - shield = game.inshld; - torps = game.intorps; + if (game.energy < game.inenrg) game.energy = game.inenrg; + game.shield = game.inshld; + game.torps = game.intorps; game.lsupres = game.inlsr; } proutn("Reset damage? "); @@ -825,8 +832,8 @@ void debugme(void) } proutn("Toggle game.idebug? "); if (ja() != 0) { - game.idebug = !game.idebug; - if (game.idebug) prout("Debug output ON"); + idebug = !idebug; + if (idebug) prout("Debug output ON"); else prout("Debug output OFF"); } proutn("Cause selective damage? "); @@ -848,7 +855,7 @@ void debugme(void) int i; for (i = 1; i < NEVENTS; i++) { int key; - if (game.future[i] == FOREVER) continue; + if (!is_scheduled(i)) continue; switch (i) { case FSNOVA: proutn("Supernova "); break; case FTBEAM: proutn("T Beam "); break; @@ -858,20 +865,19 @@ void debugme(void) case FSCMOVE: proutn("SC Move "); break; case FSCDBAS: proutn("SC Base Destroy "); break; } - proutn("%.2f", game.future[i]-game.state.date); + proutn("%.2f", scheduled(i)-game.state.date); chew(); proutn(" ?"); key = scan(); if (key == IHREAL) { - game.future[i] = game.state.date + aaitem; + schedule(i, aaitem); } } chew(); } proutn("Induce supernova here? "); if (ja() != 0) { - game.state.galaxy[game.quadx][game.quady].supernova = TRUE; + game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova = true; atover(1); } } -#endif