X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=sst.c;h=fb508be4ce8e6dacc46618327b1c5b29424e36ab;hb=fb225a29a207cea8436c2deeced27f366492b227;hp=b31200ecece75d2d857a83983d970aa208a57a35;hpb=ba71f219a8543b5510a53c59ce793339b84903a7;p=super-star-trek.git diff --git a/sst.c b/sst.c index b31200e..fb508be 100644 --- a/sst.c +++ b/sst.c @@ -1,6 +1,9 @@ #define INCLUDED // Define externs here #include #include +#include +#include "conio.h" +#include "sstlinux.h" #include "sst.h" #ifndef SSTDOC @@ -81,72 +84,114 @@ SERGEEV, not yet completely merged): 10. 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 + better anyway. + +Eric Raymond's changes: + + 1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good. + */ -static char *commands[] = { - "srscan", - "lrscan", - "phasers", - "photons", - "move", - "shields", - "dock", - "damages", - "chart", - "impulse", - "rest", - "warp", - "status", - "sensors", - "orbit", - "transport", - "mine", - "crystals", - "shuttle", - "planets", - "request", - "report", - "computer", - "commands", - "emexit", - "probe", - "abandon", - "destruct", - "freeze", - "deathray", - "debug", - "call", - "quit", - "help" +static struct +{ + char *name; + int value; +} +commands[] = { +#ifndef SERGEEV +#define SRSCAN 1 + {"SRSCAN", SRSCAN}, + {"STATUS", SRSCAN}, +#define LRSCAN 2 + {"LRSCAN", LRSCAN}, +#endif /* SERGEEV */ +#define PHASERS 3 + {"PHASERS", PHASERS}, +#define TORPEDO 4 + {"TORPEDO", TORPEDO}, + {"PHOTONS", TORPEDO}, +#define MOVE 5 + {"MOVE", MOVE}, +#define SHIELDS 6 + {"SHIELDS", SHIELDS}, +#define DOCK 7 + {"DOCK", DOCK}, +#define DAMAGES 8 + {"DAMAGES", DAMAGES}, +#define CHART 9 + {"CHART", CHART}, +#define IMPULSE 10 + {"IMPULSE", IMPULSE}, +#define REST 11 + {"REST", REST}, +#define WARP 12 + {"WARP", WARP}, +#define SCORE 13 + {"SCORE", SCORE}, +#ifndef SERGEEV +#define SENSORS 14 + {"SENSORS", SENSORS}, +#endif /* SERGEEV */ +#define ORBIT 15 + {"ORBIT", ORBIT}, +#define TRANSPORT 17 + {"TRANSPORT", TRANSPORT}, +#define MINE 18 + {"MINE", MINE}, +#define CRYSTALS 19 + {"CRYSTALS", CRYSTALS}, +#define SHUTTLE 20 + {"SHUTTLE", SHUTTLE}, +#define PLANETS 21 + {"PLANETS", PLANETS}, +#ifdef SERGEEV +#define REQUEST 22 + {"REQUEST", REQUEST}, +#endif /* SERGEEV */ +#define REPORT 23 + {"REPORT", REPORT}, +#define COMPUTER 24 + {"COMPUTER", COMPUTER}, +#define COMMANDS 25 + {"COMMANDS", COMMANDS}, +#define EMEXIT 26 + {"EMEXIT", EMEXIT}, +#define PROBE 27 + {"PROBE", PROBE}, +#define SAVE 28 + {"SAVE", SAVE}, + {"FREEZE", SAVE}, +#define ABANDON 29 + {"ABANDON", ABANDON}, +#define DESTRUCT 30 + {"DESTRUCT", DESTRUCT}, +#define DEATHRAY 31 + {"DEATHRAY", DEATHRAY}, +#define DEBUGCMD 32 + {"DEBUG", DEBUGCMD}, +#define MAYDAY 33 + {"MAYDAY", MAYDAY}, + {"SOS", MAYDAY}, + {"CALL", MAYDAY}, +#define QUIT 34 + {"QUIT", QUIT}, +#define HELP 35 + {"HELP", HELP}, }; + #define NUMCOMMANDS sizeof(commands)/sizeof(commands[0]) static void listCommands(int x) { - prout(" SRSCAN MOVE PHASERS CALL\n" - " STATUS IMPULSE PHOTONS ABANDON\n" - " LRSCAN WARP SHIELDS DESTRUCT\n" - " CHART REST DOCK QUIT\n" - " DAMAGES REPORT SENSORS ORBIT\n" - " TRANSPORT MINE CRYSTALS SHUTTLE\n" - " PLANETS REQUEST DEATHRAY FREEZE\n" - " COMPUTER EMEXIT PROBE COMMANDS"); - if (x) prout(" HELP"); -} - -#ifdef SERGEEV -void setwnd(short wndnum){ - int cury; - cury=wherey()+wnds[curwnd].wndtop-wnds[wndnum].wndtop; - if ((curwnd==0)&&(wndnum!=0)) clrscr(); - window(wnds[wndnum].wndleft, wnds[wndnum].wndtop, wnds[wndnum].wndright, wnds[wndnum].wndbottom); - if ((curwnd==wndnum)&&(cury>wnds[wndnum].wndbottom-wnds[wndnum].wndtop+1)){ - gotoxy(wnds[wndnum].wndright-wnds[wndnum].wndleft+1,wnds[wndnum].wndbottom-wnds[wndnum].wndtop+1); - skip(1); - } - curwnd=wndnum; - gotoxy(1,cury); + int i; + prout("LEGAL COMMANDS ARE:"); + for (i = 0; i < NUMCOMMANDS; i++) { + proutn("%-12s ", commands[i].name); + if (i % 5 == 4) + skip(1); + } + skip(1); } -#endif /* SERGEEV */ static void helpme(void) { int i, j; @@ -159,17 +204,20 @@ static void helpme(void) { while (TRUE) { if (key == IHEOL) { #ifdef SERGEEV - setwnd(5); + setwnd(BOTTOM_WINDOW); #endif /* SERGEEV */ proutn("Help on what command? "); key = scan(); } #ifdef SERGEEV - setwnd(4); + setwnd(LOWER_WINDOW); #endif /* SERGEEV */ if (key == IHEOL) return; for (i = 0; i < NUMCOMMANDS; i++) { - if (strcmp(commands[i], citem)==0) break; + if (strcasecmp(commands[i].name, citem)==0) { + i = commands[i].value; + break; + } } if (i != NUMCOMMANDS) break; skip(1); @@ -179,19 +227,22 @@ static void helpme(void) { chew(); skip(1); } - if (i == 23) { + if (i == COMMANDS) { strcpy(cmdbuf, " ABBREV"); } else { - for (j = 0; commands[i][j]; j++) - cmdbuf[j] = toupper(commands[i][j]); + for (j = 0; commands[i].name[j]; j++) + cmdbuf[j] = toupper(commands[i].name[j]); cmdbuf[j] = '\0'; } fp = fopen(SSTDOC, "r"); if (fp == NULL) { prout("Spock- \"Captain, that information is missing from the"); - prout(" computer. You need to find SST.DOC and put it in the"); - prout(" current directory.\""); + prout(" computer.\""); + /* + * This used to continue: "You need to find SST.DOC and put + * it in the current directory." + */ return; } for (;;) { @@ -204,7 +255,7 @@ static void helpme(void) { for (cp = linebuf+3; isspace(*cp); cp++) continue; linebuf[strlen(linebuf)-1] = '\0'; - if (strcmp(cp, cmdbuf) == 0) + if (strcasecmp(cp, cmdbuf) == 0) break; } } @@ -221,180 +272,212 @@ static void helpme(void) { fclose(fp); } +void drawmaps(short l) { +/* hook to be called after moving to redraw maps */ #ifdef SERGEEV -void drawmaps(short l){ _setcursortype(_NOCURSOR); if (l==1) sensor(); - if (l!=2) setwnd(1); + if (l!=2) setwnd(LEFTUPPER_WINDOW); gotoxy(1,1); strcpy(line,"s"); srscan(1); if (l!=2){ - setwnd(2); + setwnd(SRSCAN_WINDOW); clrscr(); srscan(2); - setwnd(3); + setwnd(LRSCAN_WINDOW); clrscr(); strcpy(line,"l"); lrscan(); _setcursortype(_NORMALCURSOR); } -} #endif /* SERGEEV */ +} static void makemoves(void) { int i, hitme; +#ifdef SERGEEV + clrscr(); + setwnd(LOWER_WINDOW); +#endif /* SERGEEV */ while (TRUE) { /* command loop */ - hitme = FALSE; - justin = 0; - Time = 0.0; - i = -1; - while (TRUE) { /* get a command */ + drawmaps(1); + while (TRUE) { /* get a command */ + hitme = FALSE; + justin = 0; + Time = 0.0; + i = -1; chew(); - skip(1); +#ifdef SERGEEV + setwnd(BOTTOM_WINDOW); + clrscr(); +#endif /* SERGEEV */ proutn("COMMAND> "); - if (scan() == IHEOL) continue; - for (i=0; i < 26; i++) - if (isit(commands[i])) - break; - if (i < 26) break; + if (scan() == IHEOL) { +#ifdef SERGEEV + _setcursortype(_NOCURSOR); + setwnd(LOWER_WINDOW); + clrscr(); + chart(0); + _setcursortype(_NORMALCURSOR); +#endif /* SERGEEV */ + continue; + } +#ifdef SERGEEV + ididit=0; + clrscr(); + setwnd(LOWER_WINDOW); + clrscr(); +#endif /* SERGEEV */ + for (i=0; i < ABANDON; i++) + if (isit(commands[i].name)) { + i = commands[i].value; + break; + } + if (i < ABANDON) break; for (; i < NUMCOMMANDS; i++) - if (strcmp(commands[i], citem) == 0) break; + if (strcasecmp(commands[i].name, citem) == 0) { + i = commands[i].value; + break; + } if (i < NUMCOMMANDS) break; - if (skill <= 2) { - prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:"); - listCommands(TRUE); - } - else prout("UNRECOGNIZED COMMAND."); + listCommands(TRUE); } - commandhook(commands[i], TRUE); + commandhook(commands[i].name, TRUE); switch (i) { /* command switch */ - case 0: // srscan - srscan(1); - break; - case 1: // lrscan - lrscan(); - break; - case 2: // phasers +#ifndef SERGEEV + case SRSCAN: // srscan + srscan(1); + break; + case LRSCAN: // lrscan + lrscan(); + break; +#endif /* SERGEEV */ + case PHASERS: // phasers phasers(); if (ididit) hitme = TRUE; break; - case 3: // photons + case TORPEDO: // photons photon(); if (ididit) hitme = TRUE; break; - case 4: // move + case MOVE: // move warp(1); break; - case 5: // shields + case SHIELDS: // shields doshield(1); if (ididit) { - attack(2); + hitme=TRUE; shldchg = 0; } break; - case 6: // dock - dock(1); + case DOCK: // dock + dock(1); if (ididit) attack(0); break; - case 7: // damages + case DAMAGES: // damages dreprt(); break; - case 8: // chart + case CHART: // chart chart(0); break; - case 9: // impulse + case IMPULSE: // impulse impuls(); break; - case 10: // rest + case REST: // rest wait(); if (ididit) hitme = TRUE; break; - case 11: // warp + case WARP: // warp setwrp(); break; - case 12: // status - srscan(3); + case SCORE: // score + score(); break; - case 13: // sensors +#ifndef SERGEEV + case SENSORS: // sensors sensor(); break; - case 14: // orbit +#endif /* SERGEEV */ + case ORBIT: // orbit orbit(); if (ididit) hitme = TRUE; break; - case 15: // transport "beam" + case TRANSPORT: // transport "beam" beam(); break; - case 16: // mine + case MINE: // mine mine(); if (ididit) hitme = TRUE; break; - case 17: // crystals + case CRYSTALS: // crystals usecrystals(); + if (ididit) hitme = TRUE; break; - case 18: // shuttle + case SHUTTLE: // shuttle shuttle(); if (ididit) hitme = TRUE; break; - case 19: // Planet list + case PLANETS: // Planet list preport(); break; - case 20: // Status information - srscan(2); - break; - case 21: // Game Report - report(0); + case REPORT: // Game Report + report(); break; - case 22: // use COMPUTER! + case COMPUTER: // use COMPUTER! eta(); break; - case 23: + case COMMANDS: listCommands(TRUE); break; - case 24: // Emergency exit - clearscreen(); // Hide screen + case EMEXIT: // Emergency exit + clrscr(); // Hide screen freeze(TRUE); // forced save exit(1); // And quick exit break; - case 25: + case PROBE: probe(); // Launch probe + if (ididit) hitme = TRUE; break; - case 26: // Abandon Ship + case ABANDON: // Abandon Ship abandn(); break; - case 27: // Self Destruct + case DESTRUCT: // Self Destruct dstrct(); break; - case 28: // Save Game + case SAVE: // Save Game freeze(FALSE); +#ifdef SERGEEV + clrscr(); +#endif /* SERGEEV */ if (skill > 3) - prout("WARNING--Frozen games produce no plaques!"); + prout("WARNING--Saved games produce no plaques!"); break; - case 29: // Try a desparation measure + case DEATHRAY: // Try a desparation measure deathray(); if (ididit) hitme = TRUE; break; - case 30: // What do we want for debug??? + case DEBUGCMD: // What do we want for debug??? #ifdef DEBUG debugme(); #endif break; - case 31: // Call for help + case MAYDAY: // Call for help help(); + if (ididit) hitme = TRUE; break; - case 32: + case QUIT: alldone = 1; // quit the game #ifdef DEBUG if (idebug) score(); #endif break; - case 33: + case HELP: helpme(); // get help break; } - commandhook(commands[i], FALSE); + commandhook(commands[i].name, FALSE); for (;;) { if (alldone) break; // Game has ended #ifdef DEBUG @@ -408,7 +491,6 @@ static void makemoves(void) { atover(0); continue; } - if (nenhere == 0) movetho(); if (hitme && justin==0) { attack(2); if (alldone) break; @@ -426,7 +508,8 @@ static void makemoves(void) { int main(int argc, char **argv) { - int i, option, usecurses = TRUE; + int i, option, usecurses = TRUE; + while ((option = getopt(argc, argv, "t")) != -1) { switch (option) { case 't': @@ -438,21 +521,28 @@ int main(int argc, char **argv) { } } +#ifndef SERGEEV iostart(usecurses); - prelim(); +#else + randomize(); + textattr(7); + clrscr(); + setwnd(FULLSCREEN_WINDOW); +#endif /* SERGEEV */ line[0] = '\0'; for (i = optind; i < argc; i++) { strcat(line, argv[i]); strcat(line, " "); } while (TRUE) { /* Play a game */ + prelim(); setup(line[0] == '\0'); if (alldone) { score(); alldone = 0; } else makemoves(); - skip(2); + skip(1); stars(); skip(1); @@ -466,7 +556,7 @@ int main(int argc, char **argv) { proutn("Do you want to play again? "); if (!ja()) break; #ifdef SERGEEV - setwnd(0); + setwnd(FULLSCREEN_WINDOW); clrscr(); #endif /* SERGEEV */ } @@ -474,8 +564,8 @@ int main(int argc, char **argv) { #ifndef SERGEEV ioend(); #endif /* SERGEEV */ - puts("May the Great Bird of the Galaxy roost upon your home planet."); - exit(0); + prout("May the Great Bird of the Galaxy roost upon your home planet."); + return 0; } @@ -505,7 +595,7 @@ char *cramlc(enum loctype key, int x, int y) { 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", x, y); return buf; } @@ -575,6 +665,14 @@ int scan(void) { return IHEOL; } getline(line, sizeof(line)); +#ifdef SERGEEV + fflush(stdin); + if (curwnd==BOTTOM_WINDOW){ + clrscr(); + setwnd(LOWER_WINDOW); + clrscr(); + } +#endif /* SERGEEV */ linep = line; } // Skip leading white space @@ -629,7 +727,7 @@ int isit(char *s) { /* New function -- compares s to scaned citem and returns true if it matches to the length of s */ - return strncmp(s, citem, max(1, strlen(citem))) == 0; + return strncasecmp(s, citem, max(1, strlen(citem))) == 0; }