Subversion Repositories Kolibri OS

Rev

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

  1. #include <time.h>
  2. #include "sst.h"
  3.  
  4. void prelim(void) {
  5.         skip(2);
  6.         prout("-SUPER- STAR TREK");
  7.         skip(1);
  8.         prout("Latest update-21 Sept 78");
  9.         skip(1);
  10.         prout("‚¥àá¨ï ¯¥à¥¢®¤  ®â 27 䥢ࠫï 18");
  11.         skip(1);
  12. }
  13.  
  14. void freeze(int boss) {
  15.         char *x, *y;
  16.         FILE *fp;
  17.         int key;
  18.         if (boss) {
  19.                 strcpy(citem, "emsave.trk");
  20.         }
  21.         else {
  22.                 if ((key = scan()) == IHEOL) {
  23.                         /* proutn("File name(9 characters maximum): "); */
  24.                         proutn("ˆ¬ï ä ©« (9 ᨬ¢®«®¢ ¬ ªá¨¬ã¬): ");
  25.                         key = scan();
  26.                 }
  27.                 if (key != IHALPHA) {
  28.                         huh();
  29.                         return;
  30.                 }
  31.                 chew();
  32.                 if (strchr(citem, '.') == NULL) {
  33.                         strcat(citem, ".trk");
  34.                 }
  35.         }
  36.         if ((fp = fopen(citem, "wb")) == NULL) {
  37.                 /* proutn("Can't freeze game as file "); */
  38.                 proutn("¥¢®§¬®¦­® á®åà ­¨âì ¨£àã ¢ ä ©« ");
  39.                 proutn(citem);
  40.                 skip(1);
  41.                 return;
  42.         }
  43.         fwrite(&d, sizeof(d), 1, fp);
  44.         fwrite(&snapsht, sizeof(snapsht), 1, fp);
  45.         fwrite(quad, sizeof(quad), 1, fp);
  46.         fwrite(kx, sizeof(kx), 1, fp);
  47.         fwrite(ky, sizeof(ky), 1, fp);
  48.         fwrite(starch, sizeof(starch), 1, fp);
  49.         fwrite(kpower, sizeof(kpower), 1, fp);
  50.         fwrite(kdist, sizeof(kdist), 1, fp);
  51.         fwrite(kavgd, sizeof(kavgd), 1, fp);
  52.         fwrite(damage, sizeof(damage), 1, fp);
  53.         fwrite(future, sizeof(future), 1, fp);
  54.         fwrite(&a, sizeof(a), 1, fp);
  55.         fwrite(passwd, sizeof(passwd), 1, fp);
  56.  
  57.         fclose(fp);
  58.  
  59.         /* I hope that's enough! */
  60. }
  61.  
  62.  
  63. void thaw(void) {
  64.         char *x, *y;
  65.         FILE *fp;
  66.         int key;
  67.  
  68.         passwd[0] = '\0';
  69.         if ((key = scan()) == IHEOL) {
  70.                 proutn("ˆ¬ï ä ©« : ");/*File name*/
  71.                 key = scan();
  72.         }
  73.         if (key != IHALPHA) {
  74.                 huh();
  75.                 return;
  76.         }
  77.         chew();
  78.         if (strchr(citem, '.') == NULL) {
  79.                 strcat(citem, ".trk");
  80.         }
  81.         if ((fp = fopen(citem, "rb")) == NULL) {
  82.                 proutn("¥ ¬®£ã ­ ©â¨ ä ©« ");/*Can't find game file*/
  83.                 proutn(citem);
  84.                 skip(1);
  85.                 return;
  86.         }
  87.         fread(&d, sizeof(d), 1, fp);
  88.         fread(&snapsht, sizeof(snapsht), 1, fp);
  89.         fread(quad, sizeof(quad), 1, fp);
  90.         fread(kx, sizeof(kx), 1, fp);
  91.         fread(ky, sizeof(ky), 1, fp);
  92.         fread(starch, sizeof(starch), 1, fp);
  93.         fread(kpower, sizeof(kpower), 1, fp);
  94.         fread(kdist, sizeof(kdist), 1, fp);
  95.         fread(kavgd, sizeof(kavgd), 1, fp);
  96.         fread(damage, sizeof(damage), 1, fp);
  97.         fread(future, sizeof(future), 1, fp);
  98.         fread(&a, sizeof(a), 1, fp);
  99.         fread(passwd, sizeof(passwd), 1, fp);
  100.  
  101.         fclose(fp);
  102.  
  103.         /* I hope that's enough! */
  104. }
  105.  
  106. void abandn(void) {
  107.         int nb, l;
  108.  
  109.         chew();
  110.         if (condit==IHDOCKED) {
  111.                 if (ship!=IHE) {
  112.                         /* prout("You cannot abandon Ye Faerie Queene."); */
  113.                         prout("‚ë ­¥¬®¦¥â¥ ¯®ª¨­ãâì Š®à®«¥¢ã ”¥©.");
  114.                         return;
  115.                 }
  116.         }
  117.         else {
  118.                 /* Must take shuttle craft to exit */
  119.                 if (damage[DSHUTTL]==-1) {
  120.                         /* prout("Ye Faerie Queene has no shuttle craft."); */
  121.                         prout("  Š®à®«¥¢¥ ”¥© ®âáãâáâ¢ã¥â è ââ«.");
  122.                         return;
  123.                 }
  124.                 if (damage[DSHUTTL]<0) {
  125.                         /* prout("Shuttle craft now serving Big Mac's."); */
  126.                         prout("˜ â⫠⥯¥àì ¨á¯®«ì§ã¥âáï ¤«ï à §¢®§ª¨ ¨£Œ ª®¢.");
  127.                         return;
  128.                 }
  129.                 if (damage[DSHUTTL]>0) {
  130.                         /* prout("Shuttle craft damaged."); */
  131.                         prout("˜ ââ« ¯®¢à¥¦¤¥­.");
  132.                         return;
  133.                 }
  134.                 if (landed==1) {
  135.                         /* prout("You must be aboard the Enterprise."); */
  136.                         prout("‚ë ¤®«¦­ë ¡ëâì ­  ¡®àâ㠝­â¥à¯à ©§ .");
  137.                         return;
  138.                 }
  139.                 if (iscraft!=1) {
  140.                         /* prout("Shuttle craft not currently available."); */
  141.                         prout("˜ ââ« ¢ ­ áâ®ï騩 ¬®¬¥­â ­¥¤®áâ㯥­.");
  142.                         return;
  143.                 }
  144.                 /* Print abandon ship messages */
  145.                 skip(1);
  146.                 /* prouts("***ABANDON SHIP!  ABANDON SHIP!"); */
  147.                 prouts("***‚€Š“€–ˆŸ!  ‚€Š“€–ˆŸ!");
  148.                 skip(1);
  149.                 /* prouts("***ALL HANDS ABANDON SHIP!"); */
  150.                 prouts("***‚‘…Œ …Œ…„‹…Ž ŽŠˆ“’œ ŠŽ€‹œ!");
  151.                 skip(2);
  152. /*              prout("Captain and crew escape in shuttle craft.");
  153.                 prout("Remainder of ship's complement beam down");
  154.                 prout("to nearest habitable planet.");
  155.  */             prout("Š ¯¨â ­ ¨ íª¨¯ ¦ ¯®ª¨­ã«¨ ª®à ¡«ì ­  è ââ«¥.");
  156.                 prout("Žáâ âª¨ ª®à ¡«ï 㯠«¨ ­ ");
  157.                 prout("¡«¨§«¥¦ éãî ­ á¥«¥­­ãî ¯« ­¥âã.");
  158.                 if (d.rembase==0) {
  159.                         /* Ops! no place to go... */
  160.                         finish(FABANDN);
  161.                         return;
  162.                 }
  163.                 /* If at least one base left, give 'em the Faerie Queene */
  164.                 skip(1);
  165.                 icrystl = 0; /* crystals are lost */
  166.                 nprobes = 0; /* No probes */
  167. /*              prout("You are captured by Klingons and released to");
  168.                 prout("the Federation in a prisoner-of-war exchange.");
  169.  */             prout("‚ë ¡ë«¨ § å¢ ç¥­ë ª«¨­£®­ ¬¨ ¨ ®â¯à ¢«¥­ë");
  170.                 prout("¢ ”¥¤¥à æ¨î ¯® ¯à®£à ¬¬¥ ®¡¬¥­  ¯«¥­­ë¬¨.");
  171.                 nb = Rand()*d.rembase+1;
  172.                 /* Set up quadrant and position FQ adjacient to base */
  173.                 if (quadx!=d.baseqx[nb] || quady!=d.baseqy[nb]) {
  174.                         quadx = d.baseqx[nb];
  175.                         quady = d.baseqy[nb];
  176.                         sectx = secty = 5;
  177.                         newqad(1);
  178.                 }
  179.                 for (;;) {
  180.                         /* position next to base by trial and error */
  181.                         quad[sectx][secty] = IHDOT;
  182.                         for (l = 1; l <= 10; l++) {
  183.                                 sectx = 3.0*Rand() - 1.0 + basex;
  184.                                 secty = 3.0*Rand() - 1.0 + basey;
  185.                                 if (sectx >= 1 && sectx <= 10 &&
  186.                                         secty >= 1 && secty <= 10 &&
  187.                                         quad[sectx][secty] == IHDOT) break;
  188.                         }
  189.                         if (l < 11) break; /* found a spot */
  190.                         sectx=5;
  191.                         secty=5;
  192.                         newqad(1);
  193.                 }
  194.         }
  195.         /* Get new commission */
  196.         quad[sectx][secty] = ship = IHF;
  197. /*      prout("Starfleet puts you in command of another ship,");
  198.         prout("the Faerie Queene, which is antiquated but,");
  199.         prout("still useable.");
  200.  */     prout("‡¢¥§¤­®¥ Š®¬ ­¤®¢ ­¨¥ ¢ë¤ «® ¯®¤ ‚ è¥ à㪮¢®¤á⢮");
  201.         prout("Š®à®«¥¢ã ”¥©, ª®à ¡«ì å®âì ¨ ãáâ à¥¢è¨©,");
  202.         prout("­® ¢ ­¥¯«®å®¬ á®áâ®ï­¨¨.");
  203.         /* if (icrystl!=0) prout("The dilithium crystals have been moved."); */
  204.         if (icrystl!=0) prout("„¨«¨â¨¥¢ë¥ ªà¨áâ ««ë ¯¥à¥­¥á¥­ë.");
  205.         imine=0;
  206.         iscraft=0; /* Gallileo disappears */
  207. #ifdef CAPTURE
  208.         brigcapacity = 300; // Less capacity now
  209.         brigfree = brigcapacity;
  210. #endif
  211. #ifdef CLOAKING
  212.     iscloaked = iscloaking = FALSE;
  213. #endif
  214.         /* Resupply ship */
  215.         condit=IHDOCKED;
  216.         for (l = 1; l <= ndevice; l++) damage[l] = 0.0;
  217.         damage[DSHUTTL] = -1;
  218.         energy = inenrg = 3000.0;
  219.         shield = inshld = 1250.0;
  220.         torps = intorps = 6;
  221.         lsupres=inlsr=3.0;
  222.         shldup=0;
  223.         warpfac=5.0;
  224.         wfacsq=25.0;
  225.         return;
  226. }
  227.        
  228. void setup(void) {
  229.         int i,j, krem, klumper;
  230.         int ix, iy;
  231.         alldone = gamewon = 0;
  232. #ifdef DEBUG
  233.         idebug = 0;
  234. #endif
  235.         //  Decide how many of everything
  236.         if (choose()) return; // frozen game
  237.         // Prepare the Enterprise
  238.         ship = IHE;
  239.         energy = inenrg = 5000.0;
  240.         shield = inshld = 2500.0;
  241.         shldchg = shldup = 0;
  242.         inlsr = 4.0;
  243.         lsupres = 4.0;
  244.         iran8(&quadx, &quady);
  245.         iran10(&sectx, &secty);
  246.         torps = intorps = 10;
  247.         nprobes = (int)(3.0*Rand() + 2.0);      /* Give them 2-4 of these wonders */
  248.         warpfac = 5.0;
  249.         wfacsq = warpfac * warpfac;
  250.         for (i=0; i <= ndevice; i++) damage[i] = 0.0;
  251.         // Set up assorted game parameters
  252.         batx = baty = 0;
  253.         d.date = indate = 100.0*(int)(31.0*Rand()+20.0);
  254.         d.killk = d.killc = nkinks = nhelp = resting = casual = d.nromkl = 0;
  255. // Added d.starkl=0 6/2015
  256.     isatb = iscate = imine = icrystl = icraft = d.nsckill = d.nplankl = d.starkl = 0;
  257.         iscraft = 1;
  258.         landed = -1;
  259.         alive = 1;
  260.         docfac = 0.25;
  261.         for (i = 1; i <= 8; i++)
  262.                 for (j = 1; j <= 8; j++) d.newstuf[i][j] = starch[i][j] = 0;
  263.         // Initialize times for extraneous events
  264.         future[FSNOVA] = d.date + expran(0.5 * intime);
  265.         future[FTBEAM] = d.date + expran(1.5 * (intime / d.remcom));
  266.         future[FSNAP] = d.date + 1.0 + Rand(); // Force an early snapshot
  267.         future[FBATTAK] = d.date + expran(0.3*intime);
  268.         future[FCDBAS] = 1e30;
  269.         future[FSCMOVE] = d.nscrem ? d.date+0.2777 : 1e30;
  270.         future[FSCDBAS] = 1e30;
  271.         future[FDSPROB] = 1e30;
  272.         // Starchart is functional
  273.         stdamtim = 1e30;
  274.         // Put stars in the galaxy
  275.         instar = 0;
  276.         for (i=1; i<=8; i++)
  277.                 for (j=1; j<=8; j++) {
  278.                         int k = Rand()*9.0 + 1.0;
  279.                         instar += k;
  280.                         d.galaxy[i][j] = k;
  281.                 }
  282.         // Locate star bases in galaxy
  283.         for (i = 1; i <= inbase; i++) {
  284.                 int contflag;
  285.                 do {
  286.                         do iran8(&ix, &iy);
  287.                         while (d.galaxy[ix][iy] >= 10);
  288.                         contflag = FALSE;
  289.                         for (j = i-1; j > 0; j--) {
  290.                                 /* Improved placement algorithm to spread out bases */
  291.                                 double distq = square(ix-d.baseqx[j]) + square(iy-d.baseqy[j]);
  292.                                 if (distq < 6.0*(6-inbase) && Rand() < 0.75) {
  293.                                         contflag = TRUE;
  294. #ifdef DEBUG
  295.                                         printf("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);
  296. #endif
  297.                                         break;
  298.                                 }
  299. #ifdef DEBUG
  300.                                 else if (distq < 6.0 * (6-inbase)) {
  301.                                         printf("DEBUG: saving base #%d, close to #%d\n", i, j);
  302.                                 }
  303. #endif
  304.                         }
  305.                 } while (contflag);
  306.                        
  307.                 d.baseqx[i] = ix;
  308.                 d.baseqy[i] = iy;
  309.                 starch[ix][iy] = -1;
  310.                 d.galaxy[ix][iy] += 10;
  311.         }
  312.         // Position ordinary Klingon Battle Cruisers
  313.         krem = inkling - incom - d.nscrem;
  314.         klumper = 0.25*skill*(9.0-length)+1.0;
  315.         if (klumper > 9) klumper = 9; // Can't have more than 9 in quadrant
  316.         do {
  317.                 double r = Rand();
  318.                 int klump = (1.0 - r*r)*klumper;
  319.                 if (klump > krem) klump = krem;
  320.                 krem -= klump;
  321.                 klump *= 100;
  322.                 do iran8(&ix, &iy);
  323.                 while (d.galaxy[ix][iy] + klump >= 1000);
  324.                 d.galaxy[ix][iy] += klump;
  325.         } while (krem > 0);
  326.         // Position Klingon Commander Ships
  327. #ifdef DEBUG
  328.         klumper = 1;
  329. #endif
  330.         for (i = 1; i <= incom; i++) {
  331.                 do {
  332.                         do { /* IF debugging, put commanders by bases, always! */
  333. #ifdef DEBUG
  334.                                 if (idebug && klumper <= inbase) {
  335.                                         ix = d.baseqx[klumper];
  336.                                         iy = d.baseqy[klumper];
  337.                                         klumper++;
  338.                                 }
  339.                                 else
  340. #endif
  341.                                         iran8(&ix, &iy);
  342.                         }
  343.                         while ((d.galaxy[ix][iy] < 99 && Rand() < 0.75)||
  344.                                    d.galaxy[ix][iy]>899);
  345.                         // check for duplicate
  346.                         for (j = 1; j < i; j++)
  347.                                 if (d.cx[j]==ix && d.cy[j]==iy) break;
  348.                 } while (j < i);
  349.                 d.galaxy[ix][iy] += 100;
  350.                 d.cx[i] = ix;
  351.                 d.cy[i] = iy;
  352.         }
  353.         // Locate planets in galaxy
  354.         for (i = 1; i <= inplan; i++) {
  355.                 do iran8(&ix, &iy);
  356.                 while (d.newstuf[ix][iy] > 0);
  357.                 d.newstuf[ix][iy] = 1;
  358.                 d.plnets[i].x = ix;
  359.                 d.plnets[i].y = iy;
  360.                 d.plnets[i].pclass = Rand()*3.0 + 1.0; // Planet class M N or O
  361.                 d.plnets[i].crystals = 1.5*Rand();              // 1 in 3 chance of crystals
  362.                 d.plnets[i].known = 0;
  363.         }
  364.         // Locate Romulans
  365.         for (i = 1; i <= d.nromrem; i++) {
  366.                 iran8(&ix, &iy);
  367.                 d.newstuf[ix][iy] += 10;
  368.         }
  369.         // Locate the Super Commander
  370.         if (d.nscrem > 0) {
  371.                 do iran8(&ix, &iy);
  372.                 while (d.galaxy[ix][iy] >= 900);
  373.                 d.isx = ix;
  374.                 d.isy = iy;
  375.                 d.galaxy[ix][iy] += 100;
  376.         }
  377.         // Place thing (in tournament game, thingx == -1, don't want one!)
  378.         if (Rand() < 0.1 && thingx != -1) {
  379.                 iran8(&thingx, &thingy);
  380.         }
  381.         else {
  382.                 thingx = thingy = 0;
  383.         }
  384.  
  385. //      idate = date;
  386.         skip(3);
  387.         d.snap = 0;
  388.                
  389.         if (skill == SNOVICE) {
  390.                 /* printf("It is stardate %d. The Federation is being attacked by\n", */
  391. /*                         (int)d.date);
  392.                 printf("a deadly Klingon invasion force. As captain of the United\n"
  393.                            "Starship U.S.S. Enterprise, it is your mission to seek out\n"
  394.                            "and destroy this invasion force of %d battle cruisers.\n",
  395.                            inkling);
  396.                 printf("You have an initial allotment of %d stardates to complete\n"
  397.                            "your mission.  As you proceed you may be given more time.\n\n"
  398.                            "You will have %d supporting starbases.\n"
  399.                            "Starbase locations-  ",
  400.                            (int)intime, inbase);
  401.  */             printf("‡¢¥§¤­ ï ¤ â  %d. ”¥¤¥à æ¨ï  â ª®¢ ­  ᬥà⥫쭮 ®¯ á­ë¬\n",
  402.                            (int)d.date);
  403.                 printf("䫮⮬ ¢â®à¦¥­¨ï ª«¨­£®­®¢. Š ª ª ¯¨â ­ ª®à ¡«ï ‡¢¥§¤­®£®\n"
  404.                            "”«®â  ž.‘.‘. ­â¥à¯à ©§, ¢ è¥ § ¤ ­¨¥ ­ ©â¨ ¨ ã­¨ç⮦¨âì\n"
  405.                            "¢â®à£è¨¥áï á¨«ë ¢ ª®«¨ç¥á⢥ %d «¨­¥©­ëå ªà¥©á¥à®¢.\n",
  406.                            inkling);
  407.                 printf("‚ ¬ ¯¥à¢®­ ç «ì­® ®â¢¥¤¥­® %d §¢¥§¤­ëå «¥â ­  § ¢¥à襭¨¥\n"
  408.                            "¬¨áᨨ.  ® 室㠢믮«­¥­¨ï ¢à¥¬ï ¬®¦¥â ¡ëâì 㢥«¨ç¥­®.\n\n"
  409.                            "’ ª¦¥ ‚ë à á¯®« £ ¥â¥ %d á⠭権 ¯®¤¤¥à¦ª¨.\n"
  410.                            "Œ¥á⮯®«®¦¥­¨¥ á⠭権-  ",
  411.                            (int)intime, inbase);
  412.         }
  413.         else {
  414. /*              printf("Stardate %d.\n\n"
  415.                            "%d Klingons,\nan unknown number of Romulans\n",
  416.                            (int)d.date, inkling);
  417.                 if (d.nscrem) printf("and one (GULP) Super-Commander.\n");
  418.                 printf("%d stardates\n%d starbases in  ",(int)intime, inbase);
  419.  */             printf("‡¢¥§¤­ ï ¤ â  %d.\n\n"
  420.                            "%d ª«¨­£®­®¢,\n¨ ­¥¨§¢¥áâ­®¥ ª®«¨ç¥á⢮ ஬㫠­æ¥¢\n",
  421.                            (int)d.date, inkling);
  422.                 if (d.nscrem) printf("¨ ®¤¨­ (ç¥àâ) ‘ã¯¥àŠ®¬¬ ­¤¥à.\n");
  423.                 printf("%d §¢¥§¤­ëå «¥â\n%d á⠭権 ¢ â®çª å  ",(int)intime, inbase);
  424.         }
  425.         for (i = 1; i <= inbase; i++) {
  426.                 cramlc(0, d.baseqx[i], d.baseqy[i]);
  427.                 if (i < inbase) proutn("  ");
  428.         }
  429.         skip(2);
  430.         /* proutn("The Enterprise is currently in"); */
  431.         proutn("­â¥à¯à ©§ ­ å®¤¨âáï ¢ â®çª¥");
  432.         cramlc(1, quadx, quady);
  433.         proutn(" ");
  434.         cramlc(2, sectx, secty);
  435.         skip(2);
  436.         /* prout("Good Luck!"); */
  437.         prout("“¤ ç¨!");
  438.         if (d.nscrem) proutn("  Ž€ ‚€Œ ˆƒŽ„ˆ’‘Ÿ.");/*YOU'LL NEED IT*/
  439.         skip(1);
  440.         newqad(0);
  441.         if (nenhere) shldup=1.0;
  442.         if (neutz) attack(0);   // bad luck to start in a Romulan Neutral Zone
  443. }
  444.  
  445. int choose(void) {
  446.         tourn = 0;
  447.         thawed = 0;
  448.         skill = 0;
  449.         length = 0;
  450.         while (TRUE) {
  451.                 if (fromcommandline) /* Can start with command line options */
  452.                         fromcommandline = 0;
  453.                 else
  454.                         prout("[‚ᥠª®¬ ­¤ë ¢ ¨£à¥ ®â¤ îâáï ­   ­£«¨©áª®¬ ï§ëª¥.\n „®¯ãá⨬® ᮪à é âì ¤® ¤¢ãå ¯¥à¢ëå ¡ãª¢.]");
  455.                         /* proutn("Would you like a regular, tournament, or frozen game?"); */
  456.                         proutn("‚ë ­ ç¨­ ¥â¥ ®¡ëç­ãî(regular), âãà­¨à­ãî(tournament), \n¨«¨ á®åà ­¥­­ãî(frozen) ¨£àã?");
  457.                 scan();
  458.                 if (strlen(citem)==0) continue; // Try again
  459.                 if (isit("tournament")) {
  460.                         while (scan() == IHEOL) {
  461.                                 /* proutn("Type in tournament number-"); */
  462.                                 proutn(" ¡¥à¨â¥ ­®¬¥à âãà­¨à -");
  463.                         }
  464.                         if (aaitem == 0) {
  465.                                 chew();
  466.                                 continue; // We don't want a blank entry
  467.                         }
  468.                         tourn = (int)aaitem;
  469.                         thingx = -1;
  470.                         srand((unsigned int)(int)aaitem);
  471.                         break;
  472.                 }
  473.                 if (isit("frozen")) {
  474.                         thaw();
  475.                         chew();
  476.                         if (*passwd==0) continue;
  477.                         randomize();
  478.                         Rand(); Rand(); Rand(); Rand();
  479.                         if (!alldone) thawed = 1; // No plaque if not finished
  480.                         report(1);
  481.                         return TRUE;
  482.                 }
  483.                 if (isit("regular")) {
  484.                         skip(2);
  485.                         randomize();
  486.                         Rand(); Rand(); Rand(); Rand();
  487.                         break;
  488.                 }
  489.                 proutn("—â® ¥é¥ §  \"");/*What is*/
  490.                 proutn(citem);
  491.                 prout("\"?");
  492.                 chew();
  493.         }
  494.         while (length==0 || skill==0) {
  495.                 if (scan() == IHALPHA) {
  496.                         if (isit("short")) length = 1;
  497.                         else if (isit("medium")) length = 2;
  498.                         else if (isit("long")) length = 4;
  499.                         else if (isit("novice")) skill = SNOVICE;
  500.                         else if (isit("fair")) skill = SFAIR;
  501.                         else if (isit("good")) skill = SGOOD;
  502.                         else if (isit("expert")) skill = SEXPERT;
  503.                         else if (isit("emeritus")) skill = SEMERITUS;
  504.                         else {
  505.                                 proutn("—â® ¥é¥ §  \"");/*What is*/
  506.                                 proutn(citem);
  507.                                 prout("\"?");
  508.                         }
  509.                 }
  510.                 else {
  511.                         chew();
  512. /*                      if (length==0) proutn("Would you like a Short, Medium, or Long game? ");
  513.                         else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player?");
  514.  */                     if (length==0) proutn("‚ë ¯à¥¤¯®ç¨â ¥â¥ ª®à®âªãî (short), á।­îî (medium), ¨«¨ ¤«¨­­ãî(long) ¨£àã? ");
  515.                         else if (skill == 0) proutn("‚ë ¨£à®ª ã஢­ï ®¢¨ç®ª(novice), ‘ « £ (fair), Žâ«¨ç­¨ª(good), ªá¯¥àâ(expert), ¨«¨ ¬¥à¨âãá(emeritus)?");
  516.                 }
  517.         }
  518.         while (TRUE) {
  519.                 scan();
  520.                 strcpy(passwd, citem);
  521.                 chew();
  522.                 if (*passwd != 0) break;
  523.                 /* proutn("Please type in a secret password (9 characters maximum)-"); */
  524.                 proutn("‚¢¥¤¨â¥ ᥪà¥â­ë© ¯ à®«ì (9 ᨬ¢®«®¢ ¬ ªá¨¬ã¬)-");
  525.         }
  526. #ifdef DEBUG
  527.         if (strcmp(passwd, "debug")==0) idebug = 1;
  528. #endif
  529.  
  530.         // Use parameters to generate initial values of things
  531.         damfac = 0.5 * skill;
  532.         d.rembase = 3.0*Rand()+2.0;
  533.         inbase = d.rembase;
  534.         inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();
  535.         d.nromrem = (2.0+Rand())*skill;
  536.         d.nscrem = (skill > SFAIR? 1 : 0);
  537.         d.remtime = 7.0 * length;
  538.         intime = d.remtime;
  539.         d.remkl = 2.0*intime*((skill+1 - 2*Rand())*skill*0.1+.15); // d.remkl and inkling includes commanders and SC
  540.         inkling = d.remkl;
  541.         incom = skill + 0.0625*inkling*Rand();
  542.         d.remcom= min(10, incom);
  543.         incom = d.remcom;
  544.         d.remres = (inkling+4*incom)*intime;
  545.         inresor = d.remres;
  546.         if (inkling > 50) {
  547.                 inbase = (d.rembase += 1);
  548.     }
  549. #ifdef CAPTURE
  550.         brigcapacity = 400;
  551.     brigfree = brigcapacity;
  552.     kcaptured = 0; // TAA fix 6/2015
  553. #endif
  554. #ifdef CLOAKING
  555.     ncviol = 0; // TAA fix 6/2015
  556.     iscloaked = FALSE;
  557.     iscloaking = FALSE;
  558. #endif
  559.         return FALSE;
  560. }
  561.  
  562. void dropin(int iquad, int *ix, int *iy) {
  563.         do iran10(ix, iy);
  564.         while (quad[*ix][*iy] != IHDOT);
  565.         quad[*ix][*iy] = iquad;
  566. }
  567.  
  568. void newcnd(void) {
  569.         condit = IHGREEN;
  570.         if (energy < 1000.0) condit = IHYELLOW;
  571.         if (d.galaxy[quadx][quady] > 99 || d.newstuf[quadx][quady] > 9)
  572.                 condit = IHRED;
  573. }
  574.  
  575.  
  576. void newqad(int shutup) {
  577.         int quadnum = d.galaxy[quadx][quady];
  578.         int newnum = d.newstuf[quadx][quady];
  579.         int i, j, ix, iy, nplan;
  580.  
  581.         iattak = 1;
  582.         justin = 1;
  583.         basex = basey = 0;
  584.         klhere = 0;
  585.         comhere = 0;
  586.         plnetx = plnety = 0;
  587.         ishere = 0;
  588.         irhere = 0;
  589.         iplnet = 0;
  590.         nenhere = 0;
  591.         neutz = 0;
  592.         inorbit = 0;
  593.         landed = -1;
  594.         ientesc = 0;
  595.         ithere = 0;
  596.     iseenit = 0;
  597.  
  598. #ifdef CLOAKING
  599.     isviolreported = FALSE;
  600. #endif
  601.         if (iscate) {
  602.                 // Attempt to escape Super-commander, so tbeam back!
  603.                 iscate = 0;
  604.                 ientesc = 1;
  605.         }
  606.         // Clear quadrant
  607.         for (i=1; i <= 10; i++)
  608.                 for (j=1; j <= 10; j++) quad[i][j] = IHDOT;
  609.         // cope with supernova
  610.         if (quadnum > 999) {
  611.                 return;
  612.         }
  613.         klhere = quadnum/100;
  614.         irhere = newnum/10;
  615.         nplan = newnum%10;
  616.         nenhere = klhere + irhere;
  617.  
  618.         // Position Starship
  619.         quad[sectx][secty] = ship;
  620.  
  621.         // Decide if quadrant needs a Tholian
  622.         if ((skill <  SGOOD && Rand() <= 0.02) ||   /* Lighten up if skill is low */
  623.                 (skill == SGOOD && Rand() <= 0.05) ||
  624.                 (skill > SGOOD && Rand() <= 0.08)
  625. #ifdef DEBUG
  626.                 || strcmp(passwd, "tholianx")==0
  627. #endif
  628.                 ) {
  629.                 do {
  630.                         ithx = Rand() > 0.5 ? 10 : 1;
  631.                         ithy = Rand() > 0.5 ? 10 : 1;
  632.                 } while (quad[ithx][ithy] != IHDOT);
  633.                 quad[ithx][ithy] = IHT;
  634.                 ithere = 1;
  635.                 /* Reserve unocupied corners */
  636.                 if (quad[1][1]==IHDOT) quad[1][1] = 'X';
  637.                 if (quad[1][10]==IHDOT) quad[1][10] = 'X';
  638.                 if (quad[10][1]==IHDOT) quad[10][1] = 'X';
  639.                 if (quad[10][10]==IHDOT) quad[10][10] = 'X';
  640.         }
  641.  
  642.         if (quadnum >= 100) {
  643.                 // Position ordinary Klingons
  644.                 quadnum -= 100*klhere;
  645.                 for (i = 1; i <= klhere; i++) {
  646.                         dropin(IHK, &ix, &iy);
  647.                         kx[i] = ix;
  648.                         ky[i] = iy;
  649.                         kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
  650.                         kpower[i] = Rand()*150.0 +300.0 +25.0*skill;
  651.                 }
  652.                 // If we need a commander, promote a Klingon
  653.                 for (i = 1; i <= d.remcom ; i++)
  654.                         if (d.cx[i]==quadx && d.cy[i]==quady) break;
  655.                        
  656.                 if (i <= d.remcom) {
  657.                         quad[ix][iy] = IHC;
  658.                         kpower[klhere] = 950.0+400.0*Rand()+50.0*skill;
  659.                         comhere = 1;
  660.                 }
  661.  
  662.                 // If we need a super-commander, promote a Klingon
  663.                 if (quadx == d.isx && quady == d.isy) {
  664.                         quad[kx[1]][ky[1]] = IHS;
  665.                         kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;
  666.                         iscate = 1;
  667.                         ishere = 1;
  668.                 }
  669.         }
  670.         // Put in Romulans if needed
  671.         for (i = klhere+1; i <= nenhere; i++) {
  672.                 dropin(IHR, &ix, &iy);
  673.                 kx[i] = ix;
  674.                 ky[i] = iy;
  675.                 kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
  676.                 kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;
  677.         }
  678.         sortkl();
  679.         // If quadrant needs a starbase, put it in
  680.         if (quadnum >= 10) {
  681.                 quadnum -= 10;
  682.                 dropin(IHB, &basex, &basey);
  683.         }
  684.        
  685.         if (nplan) {
  686.                 // If quadrant needs a planet, put it in
  687.                 for (i=1; i <= inplan; i++)
  688.                         if (d.plnets[i].x == quadx && d.plnets[i].y == quady) break;
  689.                 if (i <= inplan) {
  690.                         iplnet = i;
  691.                         dropin(IHP, &plnetx, &plnety);
  692.                 }
  693.         }
  694.         // Check for condition
  695.         newcnd();
  696.         // And finally the stars
  697.         for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);
  698.  
  699.         // Check for RNZ
  700.         if (irhere > 0 && klhere == 0 && basex == 0) {
  701.                 neutz = 1;
  702.                 if (REPORTS) {
  703.                         skip(1);
  704. /*                      prout("LT. UHURA- \"Captain, an urgent message.");
  705.                         prout("  I'll put it on audio.\"  CLICK");
  706.                         skip(1);
  707.                         prout("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.");
  708.                         prout("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!");
  709.  */                     prout("‹¥©â¥­ ­â “åãà - \"Š ¯¨â ­, áà®ç­®¥ á®®¡é¥­¨¥.");
  710.                         prout("  Ÿ ¢ª«îçã ­  £à®¬ªãî á¢ï§ì.\"  CLICK");
  711.                         skip(1);
  712.                         prout("€“˜ˆ’…‹œ! ‚› ‚’Žƒ‹ˆ‘œ ‚ …‰’€‹œ“ž ‡Ž“ ŽŒ“‹€.");
  713.                         prout("…Œ…„‹…Ž “‹…’€‰’…, ˆ‹ˆ “„…’… “ˆ—’Ž†…›!");
  714.                 }
  715.         }
  716.  
  717.         if (shutup==0) {
  718.                 // Put in THING if needed
  719.                 if (thingx == quadx && thingy == quady) {
  720.                         dropin(IHQUEST, &ix, &iy);
  721.                         thingx = thingy = 0; // Transient
  722.                         if (damage[DSRSENS] == 0.0) {
  723.                                 skip(1);
  724. /*                              prout("MR. SPOCK- \"Captain, this is most unusual.");
  725.                                 prout("    Please examine your short-range scan.\"");
  726.  */                             prout("Œˆ‘’… ‘ŽŠ- \"Š ¯¨â ­, íâ® ®ç¥­ì áâà ­­®.");
  727.                                 prout("    ®¦ «ã©áâ  ¯®á¬®âà¨â¥ ­  ¡«¨¦­¨© ᪠­¥à.\"");
  728.                         }
  729.                 }
  730.         }
  731.  
  732.         // Put in a few black holes
  733.         for (i = 1; i <= 3; i++)
  734.                 if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);
  735.  
  736.         // Take out X's in corners if Tholian present
  737.         if (ithere) {
  738.                 if (quad[1][1]=='X') quad[1][1] = IHDOT;
  739.                 if (quad[1][10]=='X') quad[1][10] = IHDOT;
  740.                 if (quad[10][1]=='X') quad[10][1] = IHDOT;
  741.                 if (quad[10][10]=='X') quad[10][10] = IHDOT;
  742.         }              
  743. }
  744.  
  745. void sortkl(void) {
  746.         double t;
  747.         int sw, j, k;
  748.  
  749.         // The author liked bubble sort. So we will use it. :-(
  750.  
  751.         if (nenhere < 2) return;
  752.  
  753.         do {
  754.                 sw = FALSE;
  755.                 for (j = 1; j < nenhere; j++)
  756.                         if (kdist[j] > kdist[j+1]) {
  757.                                 sw = TRUE;
  758.                                 t = kdist[j];
  759.                                 kdist[j] = kdist[j+1];
  760.                                 kdist[j+1] = t;
  761.                                 t = kavgd[j];
  762.                                 kavgd[j] = kavgd[j+1];
  763.                                 kavgd[j+1] = t;
  764.                                 k = kx[j];
  765.                                 kx[j] = kx[j+1];
  766.                                 kx[j+1] = k;
  767.                                 k = ky[j];
  768.                                 ky[j] = ky[j+1];
  769.                                 ky[j+1] = k;
  770.                                 t = kpower[j];
  771.                                 kpower[j] = kpower[j+1];
  772.                                 kpower[j+1] = t;
  773.                         }
  774.         } while (sw);
  775. }
  776.