X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=reports.c;h=e5d261be0f97b41c11686f1c44b14db8cbecf652;hb=0e15d77aa2e0088f1bd917f2f27d170851dbeb56;hp=f71b8c50350d664b5c60cc8048225b53964d2a5a;hpb=f972ad4a9a237ecae732391e0c37345fdfb9acea;p=super-star-trek.git diff --git a/reports.c b/reports.c index f71b8c5..e5d261b 100644 --- a/reports.c +++ b/reports.c @@ -3,8 +3,8 @@ #include #include -void attakreport(int l) { - if (!l) { +void attakreport(int curt) { + if (!curt) { if (game.future[FCDBAS] < 1e30) { prout("Starbase in %s is currently under Commander attack.", cramlc(quadrant, batx, baty)); @@ -132,9 +132,9 @@ void lrscan(void) { if (x == 0 || x > GALSIZE || y == 0 || y > GALSIZE) proutn(" -1"); else { - if (game.state.galaxy[x][y]<1000) proutn(" %3d", game.state.galaxy[x][y]); + if (game.state.galaxy[x][y] 0 ? game.state.galaxy[x][y]+1000 : 1; + game.starch[x][y] = game.damage[DRADIO] > 0 ? game.state.galaxy[x][y]+SUPERNOVA_PLACE : 1; } } prout(" "); @@ -175,7 +175,7 @@ void chart(int nn) { stdamtim = game.state.date; for (i=1; i <= GALSIZE ; i++) for (j=1; j <= GALSIZE; j++) - if (game.starch[i][j] == 1) game.starch[i][j] = game.state.galaxy[i][j]+1000; + if (game.starch[i][j] == 1) game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE; } else { proutn("(Last surveillance update %d stardates ago.", @@ -189,11 +189,11 @@ void chart(int nn) { for (j = 1; j <= GALSIZE; j++) { char buf[4]; proutn(" "); - if (game.starch[i][j] < 0) + if (game.starch[i][j] == CHART_UNKNOWN) strcpy(buf, ".1."); else if (game.starch[i][j] == 0) strcpy(buf, "..."); - else if (game.state.galaxy[i][j]>=1000) + else if (game.state.galaxy[i][j]>=SUPERNOVA_PLACE) strcpy(buf, "***"); else sprintf(buf, "%03d", game.state.galaxy[i][j]); @@ -207,13 +207,109 @@ void chart(int nn) { } prout(""); /* flush output */ } - + +static void sectscan(int goodScan, int i, int j) { + if (goodScan || (abs(i-sectx)<= 1 && abs(j-secty) <= 1)){ + if ((game.quad[i][j]==IHMATER0)||(game.quad[i][j]==IHMATER1)||(game.quad[i][j]==IHMATER2)||(game.quad[i][j]==IHE)||(game.quad[i][j]==IHF)){ + switch (condit) { + case IHRED: textcolor(RED); break; + case IHGREEN: textcolor(GREEN); break; + case IHYELLOW: textcolor(YELLOW); break; + case IHDOCKED: textcolor(CYAN); break; + case IHDEAD: textcolor(BROWN); + } + if (game.quad[i][j] != ship) + highvideo(); + } + if (game.quad[i][j] & DAMAGED) + highvideo(); + proutn("%c ",game.quad[i][j] & ~DAMAGED); + textcolor(DEFAULT); + } + else + proutn("- "); +} + +static void status(int req) { + char *cp = NULL; + int t, dam = 0; + switch (req) { + case 1: + proutn("Stardate %.1f, Time Left %.2f", game.state.date, game.state.remtime); + break; + case 2: + if (condit != IHDOCKED) newcnd(); + switch (condit) { + case IHRED: cp = "RED"; break; + case IHGREEN: cp = "GREEN"; break; + case IHYELLOW: cp = "YELLOW"; break; + case IHDOCKED: cp = "DOCKED"; break; + case IHDEAD: cp="DEAD"; break; + } + for (t=0;t<=NDEVICES;t++) + if (game.damage[t]>0) dam++; + proutn("Condition %s, %i DAMAGES", cp, dam); + break; + case 3: + proutn("Position %d - %d , %d - %d", + quadx, quady, sectx, secty); + break; + case 4: + proutn("Life Support "); + if (game.damage[DLIFSUP] != 0.0) { + if (condit == IHDOCKED) + proutn("DAMAGED, Base provides"); + else + proutn("DAMAGED, reserves=%4.2f", lsupres); + } + else + proutn("ACTIVE"); + break; + case 5: + proutn("Warp Factor %.1f", warpfac); + break; + case 6: + proutn("Energy %.2f", energy); + if (icrystl) /* ESR */ + proutn(" (have crystals)"); + break; + case 7: + proutn("Torpedoes %d", torps); + break; + case 8: + proutn("Shields "); + if (game.damage[DSHIELD] != 0) + proutn("DAMAGED,"); + else if (shldup) + proutn("UP,"); + else + proutn("DOWN,"); + proutn(" %d%% %.1f units", + (int)((100.0*shield)/inshld + 0.5), shield); + break; + case 9: + proutn("Klingons Left %d", game.state.remkl); + break; + case 10: + attakreport(1); + break; + /* + * Note: attakreport() can in some cases produce two lines of + * output. If that happens, and QUADSIZE is the normal 10, items + * 11 and up will be printed past the bottom of the quadrant display. + * Under the curses display logic they will get lost because they're + * written outside the report window. + */ + case 11: /* ESR */ + proutn("Bases Left %d", game.state.rembase); + break; + } +} int srscan(int l) { static char requests[][3] = - {"","da","co","po","ls","wa","en","to","sh","kl","ti"}; - char *cp = NULL; - int leftside=TRUE, rightside=TRUE, i, j, jj, k=0, nn=FALSE, t, dam=0; + {"","da","co","po","ls","wa","en","to","sh","kl","ti", "ba"}; + int leftside=TRUE, rightside=TRUE, i, j, jj, req=0, nn=FALSE; int goodScan=TRUE; switch (l) { case SCAN_FULL: // SRSCAN @@ -227,7 +323,7 @@ int srscan(int l) { prout(" [Using Base's sensors]"); } else proutn(" Short-range scan\n\r"); - if (goodScan) game.starch[quadx][quady] = game.damage[DRADIO]>0.0 ? game.state.galaxy[quadx][quady]+1000:1; + if (goodScan) game.starch[quadx][quady] = game.damage[DRADIO]>0.0 ? game.state.galaxy[quadx][quady]+SUPERNOVA_PLACE:1; scan(); if (isit("chart")) nn = TRUE; if (isit("no")) rightside = FALSE; @@ -238,116 +334,38 @@ int srscan(int l) { while (scan() == IHEOL) proutn("Information desired? "); chew(); - for (k = 1; k <= sizeof(requests)/sizeof(requests[0]); k++) - if (strncmp(citem,requests[k],min(2,strlen(citem)))==0) + for (req = 1; req <= sizeof(requests)/sizeof(requests[0]); req++) + if (strncmp(citem,requests[req],min(2,strlen(citem)))==0) break; - if (k > sizeof(requests)/sizeof(requests[0])) { + if (req > sizeof(requests)/sizeof(requests[0])) { prout("UNRECOGNIZED REQUEST. Legal requests are:\n" " date, condition, position, lsupport, warpfactor,\n" - " energy, torpedoes, shields, klingons, time."); + " energy, torpedoes, shields, klingons, time, bases."); return FALSE; } - // no "break" + // no break case SCAN_STATUS: // STATUS chew(); leftside = FALSE; skip(1); + // no break case SCAN_NO_LEFTSIDE: // REQUEST leftside=FALSE; break; } if (condit != IHDOCKED) newcnd(); - for (i = 1; i <= QUADSIZE; i++) { - jj = (k!=0 ? k : i); - if (leftside) { + for (i = 1; i <= max(QUADSIZE, sizeof(requests)/sizeof(requests[0])); i++) { + jj = (req!=0 ? req : i); + if (leftside && i <= QUADSIZE) { proutn("%2d ", i); for (j = 1; j <= QUADSIZE; j++) { - if (goodScan || (abs(i-sectx)<= 1 && abs(j-secty) <= 1)){ - if ((game.quad[i][j]==IHMATER0)||(game.quad[i][j]==IHMATER1)||(game.quad[i][j]==IHMATER2)||(game.quad[i][j]==IHE)||(game.quad[i][j]==IHF)){ - switch (condit) { - case IHRED: textcolor(RED); break; - case IHGREEN: textcolor(GREEN); break; - case IHYELLOW: textcolor(YELLOW); break; - case IHDOCKED: textcolor(CYAN); break; - case IHDEAD: textcolor(BROWN); - } - if (game.quad[i][j] != ship) - highvideo(); - } - if (game.quad[i][j] & DAMAGED) - highvideo(); - proutn("%c ",game.quad[i][j] & ~DAMAGED); - textcolor(DEFAULT); - } - else - proutn("- "); - } - } - if (rightside) { - switch (jj) { - case 1: - proutn("Stardate %.1f, Time Left %.2f", game.state.date, game.state.remtime); - break; - case 2: - if (condit != IHDOCKED) newcnd(); - switch (condit) { - case IHRED: cp = "RED"; break; - case IHGREEN: cp = "GREEN"; break; - case IHYELLOW: cp = "YELLOW"; break; - case IHDOCKED: cp = "DOCKED"; break; - case IHDEAD: cp="DEAD"; break; - } - for (t=0;t<=NDEVICES;t++) - if (game.damage[t]>0) dam++; - proutn("Condition %s, %i DAMAGES", cp, dam); - break; - case 3: - proutn("Position %d - %d , %d - %d", - quadx, quady, sectx, secty); - break; - case 4: - proutn("Life Support "); - if (game.damage[DLIFSUP] != 0.0) { - if (condit == IHDOCKED) - proutn("DAMAGED, Base provides"); - else - proutn("DAMAGED, reserves=%4.2f", lsupres); - } - else - proutn("ACTIVE"); - break; - case 5: - proutn("Warp Factor %.1f", warpfac); - break; - case 6: - proutn("Energy %.2f", energy); - if (icrystl) - proutn(" (have crystals)"); - break; - case 7: - proutn("Torpedoes %d", torps); - break; - case 8: - proutn("Shields "); - if (game.damage[DSHIELD] != 0) - proutn("DAMAGED,"); - else if (shldup) - proutn("UP,"); - else - proutn("DOWN,"); - proutn(" %d%% %.1f units", - (int)((100.0*shield)/inshld + 0.5), shield); - break; - case 9: - proutn("Klingons Left %d", game.state.remkl); - break; - case 10: - attakreport(1); - break; + sectscan(goodScan, i, j); } } + if (rightside) + status(jj); if (i