Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "sst.h"
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. void attakreport(void) {
  7.         if (future[FCDBAS] < 1e30) {
  8.                 proutn("Starbase in ");
  9.                 cramlc(1, batx, baty);
  10.                 prout(" is currently under attack.");
  11.                 proutn("It can hold out until Stardate ");
  12.                 cramf(future[FCDBAS], 0,1);
  13.                 prout(".");
  14.         }
  15.         if (isatb == 1) {
  16.                 proutn("Starbase in ");
  17.                 cramlc(1, d.isx, d.isy);
  18.                 prout(" is under Super-commander attack.");
  19.                 proutn("It can hold out until Stardate ");
  20.                 cramf(future[FSCDBAS], 0, 1);
  21.                 prout(".");
  22.         }
  23. }
  24.        
  25.  
  26. void report(int f) {
  27.         char *s1,*s2,*s3;
  28.  
  29.         chew();
  30.         s1 = (thawed?"thawed ":"");
  31.         switch (length) {
  32.                 case 1: s2="short"; break;
  33.                 case 2: s2="medium"; break;
  34.                 case 4: s2="long"; break;
  35.                 default: s2="unknown length"; break;
  36.         }
  37.         switch (skill) {
  38.                 case SNOVICE: s3="novice"; break;
  39.                 case SFAIR: s3="fair"; break;
  40.                 case SGOOD: s3="good"; break;
  41.                 case SEXPERT: s3="expert"; break;
  42.                 case SEMERITUS: s3="emeritus"; break;
  43.                 default: s3="skilled"; break;
  44.         }
  45.         printf("\nYou %s playing a %s%s %s game.\n",
  46.                    alldone? "were": "are now", s1, s2, s3);
  47.         if (skill>SGOOD && thawed && !alldone) prout("No plaque is allowed.");
  48.         if (tourn) printf("This is tournament game %d.\n", tourn);
  49.         if (f) printf("Your secret password is \"%s\"\n",passwd);
  50.         printf("%d of %d Klingon ships have been destroyed",
  51.                    d.killk+d.killc+d.nsckill, inkling);
  52.         if (d.killc) printf(", including %d Commander%s.\n", d.killc, d.killc==1?"":"s");
  53.         else if (d.killk+d.nsckill > 0) prout(", but no Commanders.");
  54.         else prout(".");
  55.         if (skill > SFAIR) printf("The Super Commander has %sbeen destroyed.\n",
  56.                                                   d.nscrem?"not ":"");
  57.         if (d.rembase != inbase) {
  58.                 proutn("There ");
  59.                 if (inbase-d.rembase==1) proutn("has been 1 base");
  60.                 else {
  61.                         proutn("have been ");
  62.                         crami(inbase-d.rembase, 1);
  63.                         proutn(" bases");
  64.                 }
  65.                 proutn(" destroyed, ");
  66.                 crami(d.rembase, 1);
  67.                 prout(" remaining.");
  68.         }
  69.         else printf("There are %d bases.\n", inbase);
  70.         if (REPORTS || iseenit) {
  71.                 /* Don't report this if not seen and
  72.                         either the radio is dead or not at base! */
  73.                 attakreport();
  74.                 iseenit = 1;
  75.         }
  76.         if (casual) printf("%d casualt%s suffered so far.\n",
  77.                                            casual, casual==1? "y" : "ies");
  78. #ifdef CAPTURE
  79.     if (brigcapacity != brigfree) printf("%d Klingon%s in brig.\n",
  80.                                                         brigcapacity-brigfree, brigcapacity-brigfree>1 ? "s" : "");
  81.     if (kcaptured > 0) printf("%d captured Klingon%s turned in to Star Fleet.\n",
  82.                                kcaptured, kcaptured>1 ? "s" : "");
  83. #endif
  84.         if (nhelp) printf("There were %d call%s for help.\n",
  85.                                           nhelp, nhelp==1 ? "" : "s");
  86.         if (ship == IHE) {
  87.                 proutn("You have ");
  88.                 if (nprobes) crami(nprobes,1);
  89.                 else proutn("no");
  90.                 proutn(" deep space probe");
  91.                 if (nprobes!=1) proutn("s");
  92.                 prout(".");
  93.         }
  94.         if (REPORTS && future[FDSPROB] != 1e30) {
  95.                 if (isarmed)
  96.                         proutn("An armed deep space probe is in");
  97.                 else
  98.                         proutn("A deep space probe is in");
  99.                 cramlc(1, probecx, probecy);
  100.                 prout(".");
  101.         }
  102.         if (icrystl) {
  103.                 if (cryprob <= .05)
  104.                         prout("Dilithium crystals aboard ship...not yet used.");
  105.                 else {
  106.                         int i=0;
  107.                         double ai = 0.05;
  108.                         while (cryprob > ai) {
  109.                                 ai *= 2.0;
  110.                                 i++;
  111.                         }
  112.                         printf("Dilithium crystals have been used %d time%s.\n",
  113.                                    i, i==1? "" : "s");
  114.                 }
  115.         }
  116.         skip(1);
  117. }
  118.        
  119. void lrscan(void) {
  120.         int x, y;
  121.         chew();
  122.         if (damage[DLRSENS] != 0.0) {
  123.                 /* Now allow base's sensors if docked */
  124.                 if (condit != IHDOCKED) {
  125.                         prout("LONG-RANGE SENSORS DAMAGED.");
  126.                         return;
  127.                 }
  128.                 skip(1);
  129.                 proutn("Starbase's long-range scan for");
  130.         }
  131.         else {
  132.                 skip(1);
  133.                 proutn("Long-range scan for");
  134.         }
  135.         cramlc(1, quadx, quady);
  136.         skip(1);
  137.         if (coordfixed)
  138.         for (y = quady+1; y >= quady-1; y--) {
  139.                 for (x = quadx-1; x <= quadx+1; x++) {
  140.                         if (x == 0 || x > 8 || y == 0 || y > 8)
  141.                                 printf("   -1");
  142.                         else {
  143.                                 printf("%5d", d.galaxy[x][y]);
  144.                                 // If radio works, mark star chart so
  145.                                 // it will show current information.
  146.                                 // Otherwise mark with current
  147.                                 // value which is fixed.
  148.                                 starch[x][y] = damage[DRADIO] > 0 ? d.galaxy[x][y]+1000 :1;
  149.                         }
  150.                 }
  151.                 putchar('\n');
  152.         }
  153.         else
  154.         for (x = quadx-1; x <= quadx+1; x++) {
  155.                 for (y = quady-1; y <= quady+1; y++) {
  156.                         if (x == 0 || x > 8 || y == 0 || y > 8)
  157.                                 printf("   -1");
  158.                         else {
  159.                                 printf("%5d", d.galaxy[x][y]);
  160.                                 // If radio works, mark star chart so
  161.                                 // it will show current information.
  162.                                 // Otherwise mark with current
  163.                                 // value which is fixed.
  164.                                 starch[x][y] = damage[DRADIO] > 0 ? d.galaxy[x][y]+1000 :1;
  165.                         }
  166.                 }
  167.                 putchar('\n');
  168.         }
  169.  
  170. }
  171.  
  172. void dreprt(void) {
  173.         int jdam = FALSE, i;
  174.         chew();
  175.  
  176.         for (i = 1; i <= ndevice; i++) {
  177.                 if (damage[i] > 0.0) {
  178.                         if (!jdam) {
  179.                                 skip(1);
  180.                                 prout("DEVICE            -REPAIR TIMES-");
  181.                                 prout("                IN FLIGHT   DOCKED");
  182.                                 jdam = TRUE;
  183.                         }
  184.                         printf("  %16s ", device[i]);
  185.                         cramf(damage[i]+0.05, 8, 2);
  186.                         proutn("  ");
  187.                         cramf(docfac*damage[i]+0.005, 8, 2);
  188.                         skip(1);
  189.                 }
  190.         }
  191.         if (!jdam) prout("All devices functional.");
  192. }
  193.  
  194. void chart(int nn) {
  195.         int i,j;
  196.  
  197.         chew();
  198.         skip(1);
  199.         if (stdamtim != 1e30 && stdamtim != d.date && condit == IHDOCKED) {
  200.                 prout("Spock-  \"I revised the Star Chart from the");
  201.                 prout("  starbase's records.\"");
  202.                 skip(1);
  203.         }
  204.         if (nn == 0) prout("STAR CHART FOR THE KNOWN GALAXY");
  205.         if (stdamtim != 1e30) {
  206.                 if (condit == IHDOCKED) {
  207.                         /* We are docked, so restore chart from base information -- these values won't update! */
  208.                         stdamtim = d.date;
  209.                         for (i=1; i <= 8 ; i++)
  210.                                 for (j=1; j <= 8; j++)
  211.                                         if (starch[i][j] == 1) starch[i][j] = d.galaxy[i][j]+1000;
  212.                 }
  213.                 else {
  214.                         proutn("(Last surveillance update ");
  215.                         cramf(d.date-stdamtim, 0, 1);
  216.                         prout(" stardates ago.)");
  217.                 }
  218.         }
  219.         if (nn ==0) skip(1);
  220.  
  221.         prout("      1    2    3    4    5    6    7    8");
  222.         prout("    ----------------------------------------");
  223.         if (nn==0) prout("  -");
  224.         if (coordfixed)
  225.         for (j = 8; j >= 1; j--) {
  226.                 printf("%d -", j);
  227.                 for (i = 1; i <= 8; i++) {
  228.                         if (starch[i][j] < 0) // We know only about the bases
  229.                                 printf("  .1.");
  230.                         else if (starch[i][j] == 0) // Unknown
  231.                                 printf("  ...");
  232.                         else if (starch[i][j] > 999) // Memorized value
  233.                                 printf("%5d", starch[i][j]-1000);
  234.                         else
  235.                                 printf("%5d", d.galaxy[i][j]); // What is actually there (happens when value is 1)
  236.                 }
  237.                 prout("  -");
  238.         }
  239.         else
  240.         for (i = 1; i <= 8; i++) {
  241.                 printf("%d -", i);
  242.                 for (j = 1; j <= 8; j++) {
  243.                         if (starch[i][j] < 0) // We know only about the bases
  244.                                 printf("  .1.");
  245.                         else if (starch[i][j] == 0) // Unknown
  246.                                 printf("  ...");
  247.                         else if (starch[i][j] > 999) // Memorized value
  248.                                 printf("%5d", starch[i][j]-1000);
  249.                         else
  250.                                 printf("%5d", d.galaxy[i][j]); // What is actually there (happens when value is 1)
  251.                 }
  252.                 prout("  -");
  253.         }
  254.         if (nn == 0) {
  255.                 skip(1);
  256.                 crmshp();
  257.                 proutn(" is currently in");
  258.                 cramlc(1, quadx, quady);
  259.                 skip(1);
  260.         }
  261. }
  262.                
  263.                
  264. void srscan(int l) {
  265.         static char requests[][3] =
  266.                 {"","da","co","po","ls","wa","en","to","sh","kl","ti"};
  267.         char *cp;
  268.         int leftside=TRUE, rightside=TRUE, i, j, jj, k=0, nn=FALSE;
  269.         int goodScan=TRUE;
  270.         switch (l) {
  271.                 case 1: // SRSCAN
  272.                         if (damage[DSRSENS] != 0) {
  273.                                 /* Allow base's sensors if docked */
  274.                                 if (condit != IHDOCKED) {
  275.                                         prout("SHORT-RANGE SENSORS DAMAGED");
  276.                                         goodScan=FALSE;
  277.                                 }
  278.                                 else
  279.                                         prout("[Using starbase's sensors]");
  280.                         }
  281.                         if (goodScan)
  282.                                 starch[quadx][quady] = damage[DRADIO]>0.0 ?
  283.                                                                            d.galaxy[quadx][quady]+1000:1;
  284.                         scan();
  285.                         if (isit("chart")) nn = TRUE;
  286.                         if (isit("no")) rightside = FALSE;
  287.                         chew();
  288.                         prout("\n    1 2 3 4 5 6 7 8 9 10");
  289.                         break;
  290.                 case 2: // REQUEST
  291.                         while (scan() == IHEOL)
  292.                                 printf("Information desired? ");
  293.                         chew();
  294.                         for (k = 1; k <= 10; k++)
  295.                                 if (strncmp(citem,requests[k],min(2,strlen(citem)))==0)
  296.                                         break;
  297.                         if (k > 10) {
  298.                                 prout("UNRECOGNIZED REQUEST. Legal requests are:\n"
  299.                                          "  date, condition, position, lsupport, warpfactor,\n"
  300.                                          "  energy, torpedoes, shields, klingons, time.");
  301.                                 return;
  302.                         }
  303.                         // no "break"
  304.                 case 3: // STATUS
  305.                         chew();
  306.                         leftside = FALSE;
  307.                         skip(1);
  308.         }
  309.         for (i = 1; i <= 10; i++) {
  310.                 int jj = (k!=0 ? k : i);
  311.                 if (leftside) {
  312.                         if (coordfixed) {
  313.                                 printf("%2d  ", 11-i);
  314.                                 for (j = 1; j <= 10; j++) {
  315.                                         if (goodScan || (abs((11-i)-secty)<= 1 && abs(j-sectx) <= 1))
  316.                                                 printf("%c ",quad[j][11-i]);
  317.                                         else
  318.                                                 printf("- ");
  319.                                 }
  320.                         } else {
  321.                                 printf("%2d  ", i);
  322.                                 for (j = 1; j <= 10; j++) {
  323.                                         if (goodScan || (abs(i-sectx)<= 1 && abs(j-secty) <= 1))
  324.                                                 printf("%c ",quad[i][j]);
  325.                                         else
  326.                                                 printf("- ");
  327.                                 }
  328.                         }
  329.                 }
  330.                 if (rightside) {
  331.                         switch (jj) {
  332.                                 case 1:
  333.                                         printf(" Stardate      %.1f", d.date);
  334.                                         break;
  335.                                 case 2:
  336.                                         if (condit != IHDOCKED) newcnd();
  337.                                         switch (condit) {
  338.                                                 case IHRED: cp = "RED"; break;
  339.                                                 case IHGREEN: cp = "GREEN"; break;
  340.                                                 case IHYELLOW: cp = "YELLOW"; break;
  341.                                                 case IHDOCKED: cp = "DOCKED"; break;
  342.                                         }
  343.                                         printf(" Condition     %s", cp);
  344. #ifdef CLOAKING
  345.                                     if (iscloaked) printf(", CLOAKED");
  346. #endif
  347.                                         break;
  348.                                 case 3:
  349.                                         printf(" Position     ");
  350.                                         cramlc(0, quadx, quady);
  351.                                         putchar(',');
  352.                                         cramlc(0, sectx, secty);
  353.                                         break;
  354.                                 case 4:
  355.                                         printf(" Life Support  ");
  356.                                         if (damage[DLIFSUP] != 0.0) {
  357.                                                 if (condit == IHDOCKED)
  358.                                                         printf("DAMAGED, supported by starbase");
  359.                                                 else
  360.                                                         printf("DAMAGED, reserves=%4.2f", lsupres);
  361.                                         }
  362.                                         else
  363.                                                 printf("ACTIVE");
  364.                                         break;
  365.                                 case 5:
  366.                                         printf(" Warp Factor   %.1f", warpfac);
  367.                                         break;
  368.                                 case 6:
  369.                                         printf(" Energy        %.2f", energy);
  370.                                         break;
  371.                                 case 7:
  372.                                         printf(" Torpedoes     %d", torps);
  373.                                         break;
  374.                                 case 8:
  375.                                         printf(" Shields       ");
  376.                                         if (damage[DSHIELD] != 0)
  377.                                                 printf("DAMAGED,");
  378.                                         else if (shldup)
  379.                                                 printf("UP,");
  380.                                         else
  381.                                                 printf("DOWN,");
  382.                                         printf(" %d%% %.1f units",
  383.                                                    (int)((100.0*shield)/inshld + 0.5), shield);
  384.                                         break;
  385.                                 case 9:
  386.                                         printf(" Klingons Left %d", d.remkl);
  387.                                         break;
  388.                                 case 10:
  389.                                         printf(" Time Left     %.2f", d.remtime);
  390.                                         break;
  391.                         }
  392.                                        
  393.                 }
  394.                 skip(1);
  395.                 if (k!=0) return;
  396.         }
  397.         if (nn) chart(1);
  398. }
  399.                        
  400.                        
  401. void eta(void) {
  402.         int key, ix1, ix2, iy1, iy2, prompt=FALSE;
  403.         int wfl;
  404.         double ttime, twarp, tpower;
  405.         if (damage[DCOMPTR] != 0.0) {
  406.                 prout("COMPUTER DAMAGED, USE A POCKET CALCULATOR.");
  407.                 skip(1);
  408.                 return;
  409.         }
  410.         if (scan() != IHREAL) {
  411.                 prompt = TRUE;
  412.                 chew();
  413.                 proutn("Destination quadrant and/or sector? ");
  414.                 if (scan()!=IHREAL) {
  415.                         huh();
  416.                         return;
  417.                 }
  418.         }
  419.         iy1 = aaitem +0.5;
  420.         if (scan() != IHREAL) {
  421.                 huh();
  422.                 return;
  423.         }
  424.         ix1 = aaitem + 0.5;
  425.         if (scan() == IHREAL) {
  426.                 iy2 = aaitem + 0.5;
  427.                 if (scan() != IHREAL) {
  428.                         huh();
  429.                         return;
  430.                 }
  431.                 ix2 = aaitem + 0.5;
  432.         }
  433.         else {  // same quadrant
  434.                 ix2 = ix1;
  435.                 iy2 = iy1;
  436.                 ix1 = quady;    // ya got me why x and y are reversed!
  437.                 iy1 = quadx;
  438.         }
  439.  
  440.         if (ix1 > 8 || ix1 < 1 || iy1 > 8 || iy1 < 1 ||
  441.                 ix2 > 10 || ix2 < 1 || iy2 > 10 || iy2 < 1) {
  442.                 huh();
  443.                 return;
  444.         }
  445.         dist = sqrt(square(iy1-quadx+0.1*(iy2-sectx))+
  446.                                 square(ix1-quady+0.1*(ix2-secty)));
  447.         wfl = FALSE;
  448.  
  449.         if (prompt) prout("Answer \"no\" if you don't know the value:");
  450.         while (TRUE) {
  451.                 chew();
  452.                 proutn("Time or arrival date? ");
  453.                 if (scan()==IHREAL) {
  454.                         ttime = aaitem;
  455.                         if (ttime > d.date) ttime -= d.date; // Actually a star date
  456.                         if (ttime <= 1e-10 ||
  457.                                 (twarp=(floor(sqrt((10.0*dist)/ttime)*10.0)+1.0)/10.0) > 10) {
  458.                                 prout("We'll never make it, sir.");
  459.                                 chew();
  460.                                 return;
  461.                         }
  462.                         if (twarp < 1.0) twarp = 1.0;
  463.                         break;
  464.                 }
  465.                 chew();
  466.                 proutn("Warp factor? ");
  467.                 if (scan()== IHREAL) {
  468.                         wfl = TRUE;
  469.                         twarp = aaitem;
  470.                         if (twarp<1.0 || twarp > 10.0) {
  471.                                 huh();
  472.                                 return;
  473.                         }
  474.                         break;
  475.                 }
  476.                 prout("Captain, certainly you can give me one of these.");
  477.         }
  478.         while (TRUE) {
  479.                 chew();
  480.                 ttime = (10.0*dist)/square(twarp);
  481.                 tpower = dist*twarp*twarp*twarp*(shldup+1);
  482.                 if (tpower >= energy) { // Suggestion from Ethan Staffin -- give amount needed
  483.                         prout("Insufficient energy, sir: we would need ");
  484.                         cramf(tpower, 1, 1);
  485.                         proutn (" units.");
  486.                         if (shldup==0 || tpower > energy*2.0) {
  487.                                 if (!wfl) return;
  488.                                 proutn("New warp factor to try? ");
  489.                                 if (scan() == IHREAL) {
  490.                                         wfl = TRUE;
  491.                                         twarp = aaitem;
  492.                                         if (twarp<1.0 || twarp > 10.0) {
  493.                                                 huh();
  494.                                                 return;
  495.                                         }
  496.                                         continue;
  497.                                 }
  498.                                 else {
  499.                                         chew();
  500.                                         skip(1);
  501.                                         return;
  502.                                 }
  503.                         }
  504.                         prout("But if you lower your shields,");
  505.                         proutn("remaining");
  506.                         tpower /= 2;
  507.                 }
  508.                 else
  509.                         proutn("Remaining");
  510.                 proutn(" energy will be ");
  511.                 cramf(energy-tpower, 1, 1);
  512.                 prout(".");
  513.                 if (wfl) {
  514.                         proutn("And we will arrive at stardate ");
  515.                         cramf(d.date+ttime, 1, 1);
  516.                         prout(".");
  517.                 }
  518.                 else if (twarp==1.0)
  519.                         prout("Any warp speed is adequate.");
  520.                 else {
  521.                         proutn("Minimum warp needed is ");
  522.                         cramf(twarp, 1, 2);
  523.                         skip(1);
  524.                         proutn("and we will arrive at stardate ");
  525.                         cramf(d.date+ttime, 1, 2);
  526.                         prout(".");
  527.                 }
  528.                 if (d.remtime < ttime)
  529.                         prout("Unfortunately, the Federation will be destroyed by then.");
  530.                 if (twarp > 6.0)
  531.                         prout("You'll be taking risks at that speed, Captain");
  532.                 if ((isatb==1 && d.isy == ix1 && d.isx == iy1 &&
  533.                          future[FSCDBAS]< ttime+d.date)||
  534.                         (future[FCDBAS]<ttime+d.date && baty==ix1 && batx == iy1))
  535.                         prout("The starbase there will be destroyed by then.");
  536.                 proutn("New warp factor to try? ");
  537.                 if (scan() == IHREAL) {
  538.                         wfl = TRUE;
  539.                         twarp = aaitem;
  540.                         if (twarp<1.0 || twarp > 10.0) {
  541.                                 huh();
  542.                                 return;
  543.                         }
  544.                 }
  545.                 else {
  546.                         chew();
  547.                         skip(1);
  548.                         return;
  549.                 }
  550.         }
  551.                        
  552. }
  553.