Subversion Repositories Kolibri OS

Rev

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

  1. #include "sst.h"
  2.  
  3. static void getcd(int, int);
  4.  
  5. void lmove(void) {
  6.         double angle, deltax, deltay, bigger, x, y,
  7.     finald, finalx, finaly, stopegy;
  8.     int oldquadx, oldquady;
  9.         int trbeam = 0, n, l, ix, iy, kink, kinks, iquad;
  10.  
  11.         if (inorbit) {
  12.                 /* prout("SULU- \"Leaving standard orbit.\""); */
  13.                 prout("‘ã«ã- \"®ª¨¤ ¥¬ áâ ­¤ àâ­ãî ®à¡¨âã.\"");
  14.                 inorbit = 0;
  15.         }
  16.  
  17.         angle = ((15.0 - direc) * 0.5235988);
  18.         deltax = -sin(angle);
  19.         deltay = cos(angle);
  20.         if (fabs(deltax) > fabs(deltay))
  21.                 bigger = fabs(deltax);
  22.         else
  23.                 bigger = fabs(deltay);
  24.                
  25.         deltay /= bigger;
  26.         deltax /= bigger;
  27.  
  28. #ifdef CLOAKING
  29.     if (iscloaked && d.date+Time >= future[FTBEAM])
  30.     {  /* We can't be tracto beamed if cloaked, so move the event into the future */
  31.         future[FTBEAM] = d.date + Time +
  32.                          expran(1.5*intime/d.remcom);
  33.     }
  34. #endif
  35.    
  36.         /* If tractor beam is to occur, don't move full distance */
  37.         if (d.date+Time >= future[FTBEAM]) {
  38.                 trbeam = 1;
  39.                 condit = IHRED;
  40.                 dist = dist*(future[FTBEAM]-d.date)/Time + 0.1;
  41.                 Time = future[FTBEAM] - d.date + 1e-5;
  42.         }
  43.         /* Move within the quadrant */
  44.         quad[sectx][secty] = IHDOT;
  45.         x = sectx;
  46.         y = secty;
  47.         n = 10.0*dist*bigger+0.5;
  48.  
  49.         if (n > 0) {
  50.                 for (l = 1; l <= n; l++) {
  51.                         ix = (x += deltax) + 0.5;
  52.                         iy = (y += deltay) + 0.5;
  53.                         if (ix < 1 || ix > 10 || iy < 1 || iy > 10) {
  54.                                 /* Leaving quadrant -- allow final enemy attack */
  55.                                 /* Don't do it if being pushed by Nova */
  56.                                 if (nenhere != 0 && iattak != 2
  57. #ifdef CLOAKING
  58.                                     && !iscloaked
  59. #endif
  60.                                    ) {
  61.                                         newcnd();
  62.                                         for (l = 1; l <= nenhere; l++) {
  63.                                                 finald = sqrt((ix-kx[l])*(double)(ix-kx[l]) +
  64.                                                                           (iy-ky[l])*(double)(iy-ky[l]));
  65.                                                 kavgd[l] = 0.5 * (finald+kdist[l]);
  66.                                         }
  67.                                         if (d.galaxy[quadx][quady] != 1000) attack(0);
  68.                                         if (alldone) return;
  69.                                 }
  70.                                 /* compute final position -- new quadrant and sector */
  71.                                 x = 10*(quadx-1)+sectx;
  72.                                 y = 10*(quady-1)+secty;
  73.                                 ix = x+10.0*dist*bigger*deltax+0.5;
  74.                                 iy = y+10.0*dist*bigger*deltay+0.5;
  75.                                 /* check for edge of galaxy */
  76.                                 kinks = FALSE;
  77.                                 do {
  78.                                         kink = 0;
  79.                                         if (ix <= 0) {
  80.                                                 ix = -ix + 1;
  81.                                                 kink = 1;
  82.                                         }
  83.                                         if (iy <= 0) {
  84.                                                 iy = -iy + 1;
  85.                                                 kink = 1;
  86.                                         }
  87.                                         if (ix > 80) {
  88.                                                 ix = 161 - ix;
  89.                                                 kink = 1;
  90.                                         }
  91.                                         if (iy > 80) {
  92.                                                 iy = 161 - iy;
  93.                                                 kink = 1;
  94.                                         }
  95.                                         if (kink) kinks = TRUE;
  96.                                 } while (kink);
  97.  
  98.                                 if (kinks) {
  99.                                         nkinks += 1;
  100.                                         if (nkinks == 3) {
  101.                                                 /* Three strikes -- you're out! */
  102.                                                 finish(FNEG3);
  103.                                                 return;
  104.                                         }
  105. /*                                      prout("\nYOU HAVE ATTEMPTED TO CROSS THE NEGATIVE ENERGY BARRIER\n"
  106.                                                  "AT THE EDGE OF THE GALAXY.  THE THIRD TIME YOU TRY THIS,\n"
  107.                           "YOU WILL BE DESTROYED.\n");
  108.  */                                     prout("\n‚› ‘„…‹€‹ˆ Ž›’Š“ ……‘…—œ €œ… …ƒ€’ˆ‚Ž‰ …ƒˆˆ\n"
  109.                                                  "€ Š€ž ƒ€‹€Š’ˆŠˆ. Ž‘‹… ’…’œ…‰ ’€ŠŽ‰ Ž›’Šˆ,\n"
  110.                           "‚› “„…’… “ˆ—’Ž†…›.\n");
  111.                 }
  112.                                 /* Compute final position in new quadrant */
  113.                 if (trbeam) return; /* Don't bother if we are to be beamed */
  114.                 oldquadx = quadx;
  115.                 oldquady = quady;
  116.                                 quadx = (ix+9)/10;
  117.                 quady = (iy+9)/10;
  118.                 sectx = ix - 10*(quadx-1);
  119.                 secty = iy - 10*(quady-1);
  120.                 if (quadx != oldquadx || quady != oldquady) {
  121.                     proutn("\n‚室¨¬ ¢");/*Entering*/
  122.                     cramlc(1, quadx, quady);
  123.                 } else {
  124.                     /* prout("(Negative energy barrier disturbs quadrant.)"); */
  125.                     prout("(Š¢ ¤à ­â ­ àã蠥⠡ àì¥à ­¥£ â¨¢­®© í­¥à£¨¨.)");
  126.                 }
  127.                 skip(1);
  128.                 quad[sectx][secty] = ship;
  129.                 newqad(0);
  130.                 return;
  131.             }
  132.                         iquad = quad[ix][iy];
  133.                         if (iquad != IHDOT) {
  134.                                 /* object encountered in flight path */
  135.                                 stopegy = 50.0*dist/Time;
  136.                                 dist=0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
  137.                                                           (secty-iy)*(double)(secty-iy));
  138.                                 switch (iquad) {
  139.                                         case IHT: /* Ram a Tholean */
  140.                                         case IHK: /* Ram enemy ship */
  141.                                         case IHC:
  142.                                         case IHS:
  143.                                         case IHR:
  144.                                                 sectx = ix;
  145.                                                 secty = iy;
  146.                                                 ram(0, iquad, sectx, secty);
  147.                                                 finalx = sectx;
  148.                                                 finaly = secty;
  149.                                                 break;
  150.                                         case IHBLANK:
  151.                                                 skip(1);
  152.                                                 prouts("***Ž€‘Ž‘’œ!  Ž€‘Ž‘’œ!");/*RED ALERT*/
  153.                                                 skip(1);
  154.                                                 proutn("***");
  155.                                                 crmshp();
  156.                                                 proutn(" ¯à¨â¢ ¥âáï ç¥à­®© ¤ëன ¢ â®çª¥");/*pulled into black hole at*/
  157.                                                 cramlc(2, ix, iy);
  158.                                                 skip(1);
  159.                                                 finish(FHOLE);
  160.                                                 return;
  161.                                         default:
  162.                                                 /* something else */
  163.                                                 skip(1);
  164.                                                 crmshp();
  165.                                                 if (iquad == IHWEB)
  166.                                                         proutn(" ¯®¯ «¨ ¢ ⮫¨ ­áãî á¥âì ¢ â®çª¥");/*encounters Tholian web at*/
  167.                                                 else
  168.                                                         proutn(" ¡«®ª¨à®¢ ­ë ®¡ê¥ªâ®¬ ¢ â®çª¥");/*blocked by object at*/
  169.                                                 cramlc(2, ix,iy);
  170.                                                 prout(";");
  171.                                                 proutn("’ॡã¥âáï  ¢ à¨©­®¥ â®à¬®¦¥­¨¥ ");/*Emergency stop required*/
  172.                                                 cramf(stopegy, 0, 2);
  173.                                                 prout(" ¥¤¨­¨æ í­¥à£¨¨.");/*units of energy*/
  174.                                                 energy -= stopegy;
  175.                                                 finalx = x-deltax+0.5;
  176.                                                 sectx = finalx;
  177.                                                 finaly = y-deltay+0.5;
  178.                                                 secty = finaly;
  179.                                                 if (energy <= 0) {
  180.                                                         finish(FNRG);
  181.                                                         return;
  182.                                                 }
  183.                                                 break;
  184.                 }
  185.                                 goto label100;  /* sorry! */ /* ACTUALLY BREAK SHOULD WORK HERE */
  186.             }
  187.         }
  188.                 dist = 0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
  189.                                                 (secty-iy)*(double)(secty-iy));
  190.                 sectx = ix;
  191.                 secty = iy;
  192.         }
  193.         finalx = sectx; /* THESE STATEMENTS DO NOTHING USEFUL */
  194.         finaly = secty;
  195. label100:
  196.         /* No quadrant change -- compute new avg enemy distances */
  197.         quad[sectx][secty] = ship;
  198.         if (nenhere) {
  199.                 for (l = 1; l <= nenhere; l++) {
  200.                         finald = sqrt((ix-kx[l])*(double)(ix-kx[l]) +
  201.                                                   (iy-ky[l])*(double)(iy-ky[l]));
  202.                         kavgd[l] = 0.5 * (finald+kdist[l]);
  203.                         kdist[l] = finald;
  204.                 }
  205.                 sortkl();
  206.                 if (d.galaxy[quadx][quady] != 1000 && iattak == 0)
  207.                         attack(0);
  208.                 for (l = 1 ; l <= nenhere; l++) kavgd[l] = kdist[l];
  209.         }
  210.         newcnd();
  211.         iattak = 0;
  212.         return;
  213. }
  214.  
  215. void dock(void) {
  216.         chew();
  217.         if (condit == IHDOCKED) {
  218.                 prout("‚ë 㦥 ¢ ¤®ª¥.");/*Already docked*/
  219.                 return;
  220.         }
  221.         if (inorbit) {
  222.                 /* prout("You must first leave standard orbit."); */
  223.                 prout("‘­ ç «  ¯®ª¨­ì⥠áâ ­¤ àâ­ãî ®à¡¨âã.");
  224.                 return;
  225.         }
  226.         if (basex==0 || abs(sectx-basex) > 1 || abs(secty-basey) > 1) {
  227.                 crmshp();
  228.                 prout(" ­¥ à冷¬ á® á⠭樥©.");/*not adjacent to base*/
  229.                 return;
  230.         }
  231. #ifdef CLOAKING
  232.         if (iscloaked) {
  233.                 prout("¥¢®§¬®¦­  áâ몮¢ª  ¢ á®áâ®ï­¨¨ ­¥¢¨¤¨¬®áâ¨.");/*You cannot dock while cloaked*/
  234.                 return;
  235.         }
  236. #endif
  237.         condit = IHDOCKED;
  238.         prout("‘â몮¢ª  ¢ë¯®«­¥­ .");/*Docked*/
  239.         if (energy < inenrg) energy = inenrg;
  240.         shield = inshld;
  241.         torps = intorps;
  242.     lsupres = inlsr;
  243. #ifdef CAPTURE
  244.     if (brigcapacity-brigfree > 0)
  245.     {
  246.         /* printf("%d captured Klingons transferred to base.\n", brigcapacity-brigfree); */
  247.         printf("%d ¯«¥­­ëå ª«¨­£®­®¢ ¯¥à¥¯à ¢«¥­® ­  áâ ­æ¨î.\n", brigcapacity-brigfree);
  248.         kcaptured += brigcapacity-brigfree;
  249.         brigfree = brigcapacity;
  250.     }
  251. #endif
  252.         if (stdamtim != 1e30 &&
  253.                 (future[FCDBAS] < 1e30 || isatb == 1) && iseenit == 0) {
  254.                 /* get attack report from base */
  255.                 /* prout("Lt. Uhura- \"Captain, an important message from the starbase:\""); */
  256.                 prout("‹¥©â¥­ ­â “åãà - \"Š ¯¨â ­, áà®ç­®¥ á®®¡é¥­¨¥ á® á⠭樨:\"");
  257.                 attakreport();
  258.                 iseenit = 1;
  259.         }
  260. }
  261.  
  262. static void getcd(int isprobe, int akey) {
  263.         /* This program originally required input in terms of a (clock)
  264.            direction and distance. Somewhere in history, it was changed to
  265.            cartesian coordinates. So we need to convert. I think
  266.            "manual" input should still be done this way -- it's a real
  267.            pain if the computer isn't working! Manual mode is still confusing
  268.            because it involves giving x and y motions, yet the coordinates
  269.            are always displayed y - x, where +y is downward! */
  270.  
  271.        
  272.         int irowq=quadx, icolq=quady, irows, icols, itemp=0, iprompt=0, key;
  273.         double xi, xj, xk, xl;
  274.         double deltax, deltay;
  275.         int automatic = -1;
  276.  
  277.         /* Get course direction and distance. If user types bad values, return
  278.            with DIREC = -1.0. */
  279.  
  280.         direc = -1.0;
  281.        
  282.         if (landed == 1 && !isprobe) {
  283. /*              prout("Dummy! You can't leave standard orbit until you");
  284.                 proutn("are back aboard the ");
  285.  */             prout("®«¢ ­! ¥¢®§­®¦­® ¯®ª¨­ãâì áâ ­¤ àâãî ®à¡¨âã");
  286.                 proutn("¯®ª  ‚ë ­¥ á拉⥠­  ¡®àâ ");
  287.                 crmshp();
  288.                 prout(".");
  289.                 chew();
  290.                 return;
  291.         }
  292.         while (automatic == -1) {
  293.                 if (damage[DCOMPTR]) {
  294.                         if (isprobe)
  295.                                 /* prout("Computer damaged; manual navigation only"); */
  296.                                 prout("Š®¬¯ìîâ¥à ¯®¢à¥¦¤¥­; ⮫쪮 àãç­ ï ­ ¢¨£ æ¨ï");
  297.                         else
  298.                                 /* prout("Computer damaged; manual movement only"); */
  299.                                 prout("Š®¬¯ìîâ¥à ¯®¢à¥¦¤¥­; ⮫쪮 ¯¥à¥¬¥é¥­¨¥ ¢àãç­ãî");
  300.                         chew();
  301.                         automatic = 0;
  302.                         key = IHEOL;
  303.                         break;
  304.                 }
  305.                 if (isprobe && akey != -1) {
  306.                         /* For probe launch, use pre-scaned value first time */
  307.                         key = akey;
  308.                         akey = -1;
  309.                 }
  310.                 else
  311.                         key = scan();
  312.  
  313.                 if (key == IHEOL) {
  314.                         /* proutn("Manual or automatic- "); */
  315.                         proutn("ãç­®© (manual) or €¢â®¬ â¨ç¥áª¨© (automatic)- ");
  316.                         iprompt = 1;
  317.                         chew();
  318.                 }
  319.                 else if (key == IHALPHA) {
  320.                         if (isit("manual")) {
  321.                                 automatic =0;
  322.                                 key = scan();
  323.                                 break;
  324.                         }
  325.                         else if (isit("automatic")) {
  326.                                 automatic = 1;
  327.                                 key = scan();
  328.                                 break;
  329.                         }
  330.                         else {
  331.                                 huh();
  332.                                 chew();
  333.                                 return;
  334.                         }
  335.                 }
  336.                 else { /* numeric */
  337.                         if (isprobe)
  338.                                 /* prout("(Manual navigation assumed.)"); */
  339.                                 prout("(‚ª«î祭  àãç­ ï ­ ¢¨£ æ¨ï.)");
  340.                         else
  341.                                 /* prout("(Manual movement assumed.)"); */
  342.                                 prout("(‚ª«î祭® àãç­®¥ ¯¥à¥¬¥é¥­¨¥.)");
  343.                         automatic = 0;
  344.                         break;
  345.                 }
  346.         }
  347.  
  348.         if (automatic) {
  349.                 while (key == IHEOL) {
  350.                         if (isprobe)
  351.                                 /* proutn("Target quadrant or quadrant&sector- "); */
  352.                                 proutn(" ¯à ¢«¥­¨¥: ª¢ ¤à ­â ¨«¨ ª¢ ¤à ­â&ᥪâ®à- ");
  353.                         else
  354.                                 /* proutn("Destination sector or quadrant&sector- "); */
  355.                                 proutn("’®çª  ­ §­ ç¥­¨ï: ª¢ ¤à ­â ¨«¨ ª¢ ¤à ­â&ᥪâ®à- ");
  356.                         chew();
  357.                         iprompt = 1;
  358.                         key = scan();
  359.                 }
  360.  
  361.                 if (key != IHREAL) {
  362.                         huh();
  363.                         return;
  364.                 }
  365.                 xi = aaitem;
  366.                 key = scan();
  367.                 if (key != IHREAL){
  368.                         huh();
  369.                         return;
  370.                 }
  371.                 xj = aaitem;
  372.                 key = scan();
  373.                 if (key == IHREAL) {
  374.                         /* both quadrant and sector specified */
  375.                         xk = aaitem;
  376.                         key = scan();
  377.                         if (key != IHREAL) {
  378.                                 huh();
  379.                                 return;
  380.                         }
  381.                         xl = aaitem;
  382.  
  383.                         irowq = xi + 0.5;
  384.                         icolq = xj + 0.5;
  385.                         irows = xk + 0.5;
  386.                         icols = xl + 0.5;
  387.                 }
  388.                 else {
  389.                         if (isprobe) {
  390.                                 /* only quadrant specified -- go to center of dest quad */
  391.                                 irowq = xi + 0.5;
  392.                                 icolq = xj + 0.5;
  393.                                 irows = icols = 5;
  394.                         }
  395.                         else {
  396.                                 irows = xi + 0.5;
  397.                                 icols = xj + 0.5;
  398.                         }
  399.                         itemp = 1;
  400.                 }
  401.                 if (irowq<1 || irowq > 8 || icolq<1 || icolq > 8 ||
  402.                         irows<1 || irows > 10 || icols<1 || icols > 10) {
  403.                                 huh();
  404.                                 return;
  405.                         }
  406.                 skip(1);
  407.                 if (!isprobe) {
  408.                         if (itemp) {
  409.                                 if (iprompt) {
  410.                                         /* proutn("Helmsman Sulu- \"Course locked in for"); */
  411.                                         proutn("ã«¥¢®© ‘ã«ã- \"Šãàá ¯à®«®¦¥­ ¤«ï");
  412.                                         cramlc(2, irows, icols);
  413.                                         prout(".\"");
  414.                                 }
  415.                         }
  416.                         /* else prout("Ensign Chekov- \"Course laid in, Captain.\""); */
  417.                         else prout("Œ¨ç¬ ­ —¥å®¢- \"Šãàá £®â®¢, Š ¯¨â ­.\"");
  418.                 }
  419.                 deltax = icolq - quady + 0.1*(icols-secty);
  420.                 deltay = quadx - irowq + 0.1*(sectx-irows);
  421.         }
  422.         else { /* manual */
  423.                 while (key == IHEOL) {
  424.                         /* proutn("X and Y displacements- "); */
  425.                         proutn("X ¨ Y ᬥ饭¨ï- ");
  426.                         chew();
  427.                         iprompt = 1;
  428.                         key = scan();
  429.                 }
  430.                 itemp = 2;
  431.                 if (key != IHREAL) {
  432.                         huh();
  433.                         return;
  434.                 }
  435.                 deltax = aaitem;
  436.         key = scan();
  437.         if (key == IHEOL) {
  438.             deltay = 0.0;
  439.         } else  if (key != IHREAL) {
  440.                         huh();
  441.                         return;
  442.                 } else {
  443.             deltay = aaitem;
  444.         }
  445.        
  446.         if (coordfixed) {
  447.             double temp = deltax;
  448.             deltax = deltay;
  449.             deltay = -temp;
  450.         }
  451.         }
  452.         /* Check for zero movement */
  453.         if (deltax == 0 && deltay == 0) {
  454.                 chew();
  455.                 return;
  456.         }
  457.         if (itemp == 2 && !isprobe) {
  458.                 skip(1);
  459.                 /* prout("Helmsman Sulu- \"Aye, Sir.\""); */
  460.                 prout("ã«¥¢®© ‘ã«ã- \"’ ª â®ç­®, ‘íà.\"");
  461.         }
  462.         dist = sqrt(deltax*deltax + deltay*deltay);
  463.         direc = atan2(deltax, deltay)*1.90985932;
  464.         if (direc < 0.0) direc += 12.0;
  465.         chew();
  466.         return;
  467.  
  468. }
  469.                
  470.  
  471.  
  472. void impuls(void) {
  473.         double power;
  474.  
  475.         ididit = 0;
  476.         if (damage[DIMPULS]) {
  477.                 chew();
  478.                 skip(1);
  479.                 /* prout("Engineer Scott- \"The impulse engines are damaged, Sir.\""); */
  480.                 prout("ˆ­¦¥­¥à ‘ª®ââ- \"ˆ¬¯ã«ìá­ë¥ ¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë, ‘íà.\"");
  481.                 return;
  482.         }
  483.  
  484.         if (energy > 30.0) {
  485.                 getcd(FALSE, 0);
  486.                 if (direc == -1.0) return;
  487.                 power = 20.0 + 100.0*dist;
  488.         }
  489.         else
  490.                 power = 30.0;
  491.  
  492.         if (power >= energy) {
  493.                 /* Insufficient power for trip */
  494.                 skip(1);
  495. /*              prout("First Officer Spock- \"Captain, the impulse engines");
  496.                 prout("require 20.0 units to engage, plus 100.0 units per");
  497.  */             prout("¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ¨¬¯ã«ìá­ë¥ ¤¢¨£ â¥«¨");
  498.                 prout("¯®âॡ«ïîâ 20.0 ¥¤¨­¨æ ­  à §®£à¥¢, ¯«îá 100.0 ¥¤¨­¨æ ­ ");
  499.                 if (energy > 30) {
  500.                         /* proutn("quadrant.  We can go, therefore, a maximum of "); */
  501.                         proutn("ª¢ ¤à ­â.  ‘«¥¤®¢ â¥«ì­®, ¬ë ¬®¦¥¬ ¯à®«¥â¥âì ");
  502.                         cramf(0.01 * (energy-20.0)-0.05, 0, 1);
  503.                         prout(" ª¢ ¤à ­â®¢.\"");/*quadrants*/
  504.                 }
  505.                 else {
  506.                         /* prout("quadrant.  They are, therefore, useless.\""); */
  507.                         prout("ª¢ ¤à ­â.  ‘«¥¤®¢ â¥«ì­®, ®­¨ ᥩç á ¡¥á¯®«¥§­ë.\"");
  508.                 }
  509.                 chew();
  510.                 return;
  511.         }
  512.         /* Make sure enough time is left for the trip */
  513.         Time = dist/0.095;
  514.         if (Time >= d.remtime) {
  515. /*              prout("First Officer Spock- \"Captain, our speed under impulse");
  516.                 prout("power is only 0.95 sectors per stardate. Are you sure");
  517.                 prout("we dare spend the time?\"");
  518.  */             prout("¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ­ è  ᪮à®áâì ­  ¨¬¯ã«ìá­®©");
  519.                 prout("â á®áâ ¢«ï¥â 0.95 ᥪâ®à®¢ ¢ £®¤. ‚ë 㢥७ë");
  520.                 prout("çâ® ¬ë ¬®¦¥¬ ¯®â¥àïâì á⮫쪮 ¢à¥¬¥­¨?\"");
  521.                 if (ja() == 0) { Time = 0.0; return;}
  522.         }
  523.         /* Activate impulse engines and pay the cost */
  524.         lmove();
  525.         ididit = 1;
  526.         if (alldone) return;
  527.         power = 20.0 + 100.0*dist;
  528.         energy -= power;
  529. //      Time = dist/0.095; Don't recalculate because lmove may have
  530. //      adjusted it for tractor beaming
  531.         if (energy <= 0) finish(FNRG);
  532.         return;
  533. }
  534.  
  535.  
  536. void warp(int i) {
  537.         int blooey=0, twarp=0, iwarp;
  538.         double power;
  539.  
  540.         if (i!=2) { /* Not WARPX entry */
  541.                 ididit = 0;
  542. #ifdef CLOAKING
  543.                 if (iscloaked) {
  544.                         chew();
  545.                         skip(1);
  546.                         /* prout("Engineer Scott- \"The warp engines can better not be used while cloaked, Sir.\""); */
  547.                         prout("ˆ­¦¥­¥à ‘ª®ââ- \"‚ à¯-¤¢¨£ â¥«¨ «ãçè¥ ­¥ ¨á¯®«ì§®¢ âì ¨§ á®áâ®ï­¨ï ¬ áª¨à®¢ª¨, ‘íà.\"");
  548.                         return;
  549.                 }
  550. #endif
  551.                 if (damage[DWARPEN] > 10.0) {
  552.                         chew();
  553.                         skip(1);
  554.                         /* prout("Engineer Scott- \"The warp engines are damaged, Sir.\""); // Was "Impulse" 10/2013 */
  555.                         prout("ˆ­¦¥­¥à ‘ª®ââ- \"‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë, ‘íà.\""); // Was "Impulse" 10/2013
  556.                         return;
  557.                 }
  558.                 if (damage[DWARPEN] > 0.0 && warpfac > 4.0) {
  559.                         chew();
  560.                         skip(1);
  561.                         prout("ˆ­¦¥­¥à ‘ª®ââ- \"à®áâ¨â¥, Š ¯¨â ­. ®ª  ¬ë ­¥ ¯®ç¨­¨¬áï,");
  562.                         prout("  ï ᬮ£ã ®¡¥á¯¥ç¨âì ⮫쪮 ¢ à¯ 4.\"");
  563.                         return;
  564.                 }
  565.                        
  566.                 /* Read in course and distance */
  567.                 getcd(FALSE, 0);
  568.                 if (direc == -1.0) return;
  569.  
  570.                 /* Make sure starship has enough energy for the trip */
  571.                 power = (dist+0.05)*warpfac*warpfac*warpfac*(shldup+1);
  572.  
  573.  
  574.                 if (power >= energy) {
  575.                         /* Insufficient power for trip */
  576.                         ididit = 0;
  577.                         skip(1);
  578.                         /* prout("Engineering to bridge--"); */
  579.                         prout("ˆ­¦¥­¥à­ë© ¤®ª« ¤ë¢ ¥â--");
  580.                         if (shldup==0 || 0.5*power > energy) {
  581.                                 iwarp = pow((energy/(dist+0.05)), 0.333333333);
  582.                                 if (iwarp <= 0) {
  583.                                         /* prout("We can't do it, Captain. We haven't the energy."); */
  584.                                         prout("Œë ­¥ ¬®¦¥¬ ᤥ« âì íâ®, Š ¯¨â ­. “ ­ á ­¥ 墠⠥â í­¥à£¨¨.");
  585.                                 }
  586.                                 else {
  587.                                         /* proutn("We haven't the energy, but we could do it at warp "); */
  588.                                         proutn("“ ­ á ­¥¤®áâ â®ç­® í­¥à£¨¨, ­® ¬ë ᬮ¦¥¬ ᤥ« âì íâ® ¢ ¢ à¯¥ ");
  589.                                         crami(iwarp, 1);
  590.                                         if (shldup)
  591.                                                 /* prout(",\nif you'll lower the shields."); */
  592.                                                 prout(",\n¥á«¨ ®âª«îç¨âì ᨫ®¢ë¥ é¨âë.");
  593.                                         else
  594.                                                 prout(".");
  595.                                 }
  596.                         }
  597.                         else
  598.                                 /* prout("We haven't the energy to go that far with the shields up."); */
  599.                                 prout("¥¤®áâ â®ç­® í­¥à£¨¨ ¤«ï â ª®© ¤ «ì­®á⨠¯®«¥â  ¯à¨ ¯®¤­ïâëå é¨â å.");
  600.                         return;
  601.                 }
  602.                                                
  603.                 /* Make sure enough time is left for the trip */
  604.                 Time = 10.0*dist/wfacsq;
  605.                 if (Time >= 0.8*d.remtime) {
  606.                         skip(1);
  607. /*                      prout("First Officer Spock- \"Captain, I compute that such");
  608.                         proutn("  a trip would require approximately ");
  609.                         cramf(100.0*Time/d.remtime, 0, 2);
  610.                         prout(" percent of our");
  611.                         prout("  remaining time.  Are you sure this is wise?\"");
  612.  */                     prout("¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ï à ááç¨â «, çâ® íâ®â ¬ ­¥¢à");
  613.                         proutn("  ¯®âॡã¥â ¯à¨¡«¨§¨â¥«ì­® ");
  614.                         cramf(100.0*Time/d.remtime, 0, 2);
  615.                         prout(" ¯à®æ¥­â®¢ ­ è¥£®");
  616.                         prout("  ®á⠢襣®áï ¢à¥¬¥­¨.  ‚ë 㢥७ë, çâ® íâ® ¬ã¤à®?\"");
  617.                         if (ja() == 0) { Time = 0.0; return;}
  618.                 }
  619.         }
  620.         /* Entry WARPX */
  621.         if (warpfac > 6.0) {
  622.                 /* Decide if engine damage will occur */
  623.                 double prob = dist*(6.0-warpfac)*(6.0-warpfac)/66.666666666;
  624.                 if (prob > Rand()) {
  625.                         blooey = 1;
  626.                         dist = Rand()*dist;
  627.                 }
  628.                 /* Decide if time warp will occur */
  629.                 if (0.5*dist*pow(7.0,warpfac-10.0) > Rand()) twarp=1;
  630. #ifdef DEBUG
  631.                 if (idebug &&warpfac==10 && twarp==0) {
  632.                         blooey=0;
  633.                         proutn("Force time warp? ");
  634.                         if (ja()==1) twarp=1;
  635.                 }
  636. #endif
  637.                 if (blooey || twarp) {
  638.                         /* If time warp or engine damage, check path */
  639.                         /* If it is obstructed, don't do warp or damage */
  640.                         double angle = ((15.0-direc)*0.5235998);
  641.                         double deltax = -sin(angle);
  642.                         double deltay = cos(angle);
  643.                         double bigger, x, y;
  644.                         int n, l, ix, iy;
  645.                         if (fabs(deltax) > fabs(deltay))
  646.                                 bigger = fabs(deltax);
  647.                         else
  648.                                 bigger = fabs(deltay);
  649.                        
  650.                         deltax /= bigger;
  651.                         deltay /= bigger;
  652.                         n = 10.0 * dist * bigger +0.5;
  653.                         x = sectx;
  654.                         y = secty;
  655.                         for (l = 1; l <= n; l++) {
  656.                                 x += deltax;
  657.                                 ix = x + 0.5;
  658.                                 if (ix < 1 || ix > 10) break;
  659.                                 y += deltay;
  660.                                 iy = y +0.5;
  661.                                 if (iy < 1 || iy > 10) break;
  662.                                 if (quad[ix][iy] != IHDOT) {
  663.                                         blooey = 0;
  664.                                         twarp = 0;
  665.                                 }
  666.                         }
  667.                 }
  668.         }
  669.                                
  670.  
  671.         /* Activate Warp Engines and pay the cost */
  672.         lmove();
  673.         if (alldone) return;
  674.         energy -= dist*warpfac*warpfac*warpfac*(shldup+1);
  675.         if (energy <= 0) finish(FNRG);
  676.         Time = 10.0*dist/wfacsq;
  677.         if (twarp) timwrp();
  678.         if (blooey) {
  679.                 damage[DWARPEN] = damfac*(3.0*Rand()+1.0);
  680.                 skip(1);
  681. /*              prout("Engineering to bridge--");
  682.                 prout("  Scott here.  The warp engines are damaged.");
  683.                 prout("  We'll have to reduce speed to warp 4.");
  684.  */             prout("ˆ­¦¥­¥à­ë© ¤®ª« ¤ë¢ ¥â--");
  685.                 prout("  â® ‘ª®ââ.  ‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë.");
  686.                 prout("   ¬ ¯à¨¤¥âáï ®£à ­¨ç¨âìáï ᪮à®áâìî ¢ à¯  4.");
  687.         }
  688.         ididit = 1;
  689.         return;
  690. }
  691.  
  692.  
  693.  
  694. void setwrp(void) {
  695.         int key;
  696.         double oldfac;
  697.        
  698.         while ((key=scan()) == IHEOL) {
  699.                 chew();
  700.                 proutn("‚ à¯ ä ªâ®à-");/*Warp factor*/
  701.         }
  702.         chew();
  703.         if (key != IHREAL) {
  704.                 huh();
  705.                 return;
  706.         }
  707.         if (damage[DWARPEN] > 10.0) {
  708.                 prout("‚ à¯-¤¢¨£ â¥«¨ ­¥ ä㭪樮­¨àãîâ.");/*Warp engines inoperative*/
  709.                 return;
  710.         }
  711.         if (damage[DWARPEN] > 0.0 && aaitem > 4.0) {
  712. /*              prout("Engineer Scott- \"I'm doing my best, Captain,\n"
  713.                           "  but right now we can only go warp 4.\"");
  714.  */             prout("ˆ­¦¥­¥à ‘ª®ââ- \"Ÿ ¤¥« î çâ® ¬®£ã, Š ¯¨â ­,\n"
  715.                           "  ­® ¯®ª  çâ® ¬ë ®£à ­¨ç¥­ë ¢ à¯ ä ªâ®à®¬ 4.\"");
  716.                 return;
  717.         }
  718.         if (aaitem > 10.0) {
  719.                 /* prout("Helmsman Sulu- \"Our top speed is warp 10, Captain.\""); */
  720.                 prout("ã«¥¢®© ‘ã«ã- \"‘¥©ç á ¬ë ᬮ¦¥¬ ¢ë¦ âì ¢ à¯ 10, Š ¯¨â ­.\"");
  721.                 return;
  722.         }
  723.         if (aaitem < 1.0) {
  724.                 /* prout("Helmsman Sulu- \"We can't go below warp 1, Captain.\""); */
  725.                 prout("ã«¥¢®© ‘ã«ã- \"Œë ­¥ ¬®¦¥¬ § ¤ âì ¢ à¯-᪮à®áâì ¬¥­ìè¥ 1, Captain.\"");
  726.                 return;
  727.         }
  728.         oldfac = warpfac;
  729.         warpfac = aaitem;
  730.         wfacsq=warpfac*warpfac;
  731.         if (warpfac <= oldfac || warpfac <= 6.0) {
  732.                 proutn("ã«¥¢®© ‘ã«ã-\"‚ à¯-ä ªâ®à ");/*Helmsman Sulu- \"Warp factor*/
  733.                 cramf(warpfac, 0, 1);
  734.                 prout(", Š ¯¨â ­.\"");/*Captain*/
  735.                 return;
  736.         }
  737.         if (warpfac < 8.00) {
  738.                 /* prout("Engineer Scott- \"Aye, but our maximum safe speed is warp 6.\""); */
  739.                 prout("ˆ­¦¥­¥à ‘ª®ââ- \"’ ª â®ç­®, ­® ᥩç á ¬ ªá¨¬ «ì­ ï ¡¥§®¯ á­ ï ¢ à¯-᪮à®áâì 6.\"");
  740.                 return;
  741.         }
  742.         if (warpfac == 10.0) {
  743.                 /* prout("Engineer Scott- \"Aye, Captain, we'll try it.\""); */
  744.                 prout("ˆ­¦¥­¥à ‘ª®ââ- \"’ ª â®ç­®, Š ¯¨â ­, ¬ë ᬮ¦¥¬ íâ®.\"");
  745.                 return;
  746.         }
  747.         /* prout("Engineer Scott- \"Aye, Captain, but our engines may not take it.\""); */
  748.         prout("Engineer Scott- \"’ ª â®ç­®, Š ¯¨â ­, ­® ­ è¨ ¤¢¨£ â¥«¨ ¬®£ãâì ­¥ ¯®âï­ãâì.\"");
  749.         return;
  750. }
  751.  
  752. void atover(int igrab) {
  753.         double power, distreq;
  754.  
  755.         chew();
  756.         /* is captain on planet? */
  757.         if (landed==1) {
  758.                 if (damage[DTRANSP]) {
  759.                         finish(FPNOVA);
  760.                         return;
  761.                 }
  762.                 /* prout("Scotty rushes to the transporter controls."); */
  763.                 prout("‘ª®â⨠ࢠ­ã« ª ã¯à ¢«¥­¨î â࠭ᯮàâ â®à®¬.");
  764.                 if (shldup) {
  765.                         /* prout("But with the shields up it's hopeless."); */
  766.                         prout("® á ¯®¤­ïâ묨 é¨â ¬¨ ¢á¥ ¡ë«® ¡¥á¯®«¥§­®.");
  767.                         finish(FPNOVA);
  768.                 }
  769.                 /* prouts("His desperate attempt to rescue you . . ."); */
  770.                 prouts("…£® ®âç ï­­ ï ¯®¯ë⪠ ᯠᥭ¨ï ‚ á . . .");
  771.                 if (Rand() <= 0.5) {
  772.                         prout("¯à®¢ «¨« áì.");/*fails*/
  773.                         finish(FPNOVA);
  774.                         return;
  775.                 }
  776.                 prout("“„€‹€‘œ!");/*SUCCEEDS*/
  777.                 if (imine) {
  778.                         imine = 0;
  779.                         proutn("„®¡ëâë¥ ªà¨áâ ««ë ");/*The crystals mined were*/
  780.                         if (Rand() <= 0.25) {
  781.                                 prout("¯®â¥àï­ë.");/*lost*/
  782.                         }
  783.                         else {
  784.                                 prout("ᯠᥭë.");/*saved*/
  785.                                 icrystl = 1;
  786.                         }
  787.                 }
  788.         }
  789.         if (igrab) return;
  790.  
  791.         /* Check to see if captain in shuttle craft */
  792.         if (icraft) finish(FSTRACTOR);
  793.         if (alldone) return;
  794.  
  795.         /* Inform captain of attempt to reach safety */
  796.         skip(1);
  797.         do {
  798.                 if (justin) {
  799. /*                      prouts("***RED ALERT!  RED ALERT!");
  800.                         skip(1);
  801.                         proutn("The ");
  802.                         crmshp();
  803.                         prout(" has stopped in a quadrant containing");
  804.                         prouts("   a supernova.");
  805.                         skip(2);
  806.  */                     prouts("***Ž€‘Ž‘’œ!  Ž€‘Ž‘’œ!");
  807.                         skip(1);
  808.                         proutn("Š®à ¡«ì ");
  809.                         crmshp();
  810.                         prout(" ®áâ ­®¢¨«áï ¢ ª¢ ¤à â¥ á®");
  811.                         prouts("   ᢥàå­®¢®©.");
  812.                         skip(2);
  813.                 }
  814.                 /* proutn("***Emergency automatic override attempts to hurl "); */
  815.                 proutn("***€¢â®¬ â¨ç¥áª®¥ áà ¡ â뢠­¨¥ á¨á⥬ ¡¥§®¯ á­®á⨠¯ëâ ¥âáï ¢ë¢¥áâ¨");
  816.                 crmshp();
  817.                 skip(1);
  818.                 prout("¨§ ª¢ ¤à ­â .");/*safely out of quadrant*/
  819.                 starch[quadx][quady] = damage[DRADIO] > 0.0 ? d.galaxy[quadx][quady]+1000:1;
  820.  
  821.                 /* Try to use warp engines */
  822.                 if (damage[DWARPEN]) {
  823.                         skip(1);
  824.                         prout("‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë.");/*Warp engines damaged*/
  825.                         finish(FSNOVAED);
  826.                         return;
  827.                 }
  828.                 warpfac = 6.0+2.0*Rand();
  829.                 wfacsq = warpfac * warpfac;
  830.                 proutn("‚ à¯-ä ªâ®à ãáâ ­®¢«¥­ ¢ ");/*Warp factor set to*/
  831.                 cramf(warpfac, 1, 1);
  832.                 skip(1);
  833.                 power = 0.75*energy;
  834.                 dist = power/(warpfac*warpfac*warpfac*(shldup+1));
  835.                 distreq = 1.4142+Rand();
  836.                 if (distreq < dist) dist = distreq;
  837.                 Time = 10.0*dist/wfacsq;
  838.                 direc = 12.0*Rand();    /* How dumb! */
  839.                 justin = 0;
  840.                 inorbit = 0;
  841.                 warp(2);
  842.                 if (justin == 0) {
  843.                         /* This is bad news, we didn't leave quadrant. */
  844.                         if (alldone) return;
  845.                         skip(1);
  846.                         /* prout("Insufficient energy to leave quadrant."); */
  847.                         prout("¥¤®áâ â®ç­® í­¥à£¨¨, ç⮡ë ã«¥â¥âì ¨§ ª¢ ¤à ­â .");
  848.                         finish(FSNOVAED);
  849.                         return;
  850.                 }
  851.                 /* Repeat if another snova */
  852.         } while (d.galaxy[quadx][quady] == 1000);
  853.         if (d.remkl==0) finish(FWON); /* Snova killed remaining enemy. */
  854. }
  855.  
  856. void timwrp() {
  857.         int l, ll, gotit;
  858.         prout("***‚€ ‚Ž ‚…Œ…ˆ.");/*TIME WARP ENTERED*/
  859.         if (d.snap && Rand() < 0.5) {
  860.                 /* Go back in time */
  861.                 /* proutn("You are traveling backwards in time "); */
  862.                 proutn("‚ë ¯à®¢ «¨«¨áì ­ § ¤ ¢® ¢à¥¬¥­¨ ­  ");
  863.                 cramf(d.date-snapsht.date, 0, 2);
  864.                 prout(" §¢¥§¤­ëå «¥â.");/*stardates*/
  865.                 d = snapsht;
  866.                 d.snap = 0;
  867.                 if (d.remcom) {
  868.                         future[FTBEAM] = d.date + expran(intime/d.remcom);
  869.                         future[FBATTAK] = d.date + expran(0.3*intime);
  870.                 }
  871.                 future[FSNOVA] = d.date + expran(0.5*intime);
  872.                 future[FSNAP] = d.date +expran(0.25*d.remtime); /* next snapshot will
  873.                                                                                                            be sooner */
  874.                 if (d.nscrem) future[FSCMOVE] = 0.2777;
  875.                 isatb = 0;
  876.                 future[FCDBAS] = future[FSCDBAS] = 1e30;
  877.                 batx = baty = 0;
  878.  
  879.                 /* Make sure Galileo is consistant -- Snapshot may have been taken
  880.                    when on planet, which would give us two Galileos! */
  881.                 gotit = 0;
  882.                 for (l = 1; l <= inplan; l++) {
  883.                         if (d.plnets[l].known == 2) {
  884.                                 gotit = 1;
  885.                                 if (iscraft==1 && ship==IHE) {
  886.                                         /* prout("Checkov-  \"Security reports the Galileo has disappeared, Sir!"); */
  887.                                         prout("—¥å®¢-  \"‘«ã¦¡  ¡¥§®¯ á­®á⨠¤®ª« ¤ë¢ ¥â - ƒ «¨«¥® ¨á祧, ‘íà!");
  888.                                         iscraft = 0;
  889.                                 }
  890.                         }
  891.                 }
  892.                 /* Likewise, if in the original time the Galileo was abandoned, but
  893.                    was on ship earlier, it would have vanished -- lets restore it */
  894.                 if (iscraft==0 && gotit==0 && damage[DSHUTTL] >= 0.0) {
  895.                         /* prout("Checkov-  \"Security reports the Galileo has reappeared in the dock!\""); */
  896.                         prout("—¥ª®¢-  \"‘«ã¦¡  ¡¥§®¯ á­®á⨠¤®ª« ¤ë¢ ¥â - ƒ «¨«¥® á­®¢  ¢®§­¨ª ¢ ¤®ª¥!\"");
  897.                         iscraft = 1;
  898.                 }
  899.  
  900.                 /* Revert star chart to earlier era, if it was known then*/
  901.                 if (damage[DRADIO]==0.0 || stdamtim > d.date) {
  902.                         for (l = 1; l <= 8; l++)
  903.                                 for (ll = 1; ll <= 8; ll++)
  904.                                         if (starch[l][ll] > 1)
  905.                                                 starch[l][ll]=damage[DRADIO]>0.0 ? d.galaxy[l][ll]+1000 :1;
  906.                         /* prout("Spock has reconstructed a correct star chart from memory"); */
  907.                         prout("‘¯®ª ¢®ááâ ­®¢¨« §¢¥§¤­ãî ª àâã ¯® ¯ ¬ïâ¨");
  908.                         if (damage[DRADIO] > 0.0) stdamtim = d.date;
  909.                 }
  910.         }
  911.         else {
  912.                 /* Go forward in time */
  913.                 Time = -0.5*intime*log(Rand());
  914.                 /* proutn("You are traveling forward in time "); */
  915.                 proutn("‚ë ¯à®¢ «¨«¨áì ¢¯¥à¥¤ ¯® ¢à¥¬¥­¨ ­  ");
  916.                 cramf(Time, 1, 2);
  917.                 prout(" §¢¥§¤­ëå «¥â.");/*stardates*/
  918.                 /* cheat to make sure no tractor beams occur during time warp */
  919.                 future[FTBEAM] += Time;
  920.                 damage[DRADIO] += Time;
  921.         }
  922.         newqad(0);
  923. }
  924.  
  925. void probe(void) {
  926.         double angle, bigger;
  927.         int key;
  928.         /* New code to launch a deep space probe */
  929.         if (nprobes == 0) {
  930.                 chew();
  931.                 skip(1);
  932.                 if (ship == IHE)
  933.                         /* prout("Engineer Scott- \"We have no more deep space probes, Sir.\""); */
  934.                         prout("ˆ­¦¥­¥à ‘ª®ââ- \"“ ­ á § ª®­ç¨«¨áì ᪠­¨àãî騥 §®­¤ë, ‘íà.\"");
  935.                 else
  936.                         /* prout("Ye Faerie Queene has no deep space probes."); */
  937.                         prout("  Š®à®«¥¢¥ ”¥© ­¥â ᪠­¨àãîé¨å §®­¤®¢.");
  938.                 return;
  939.         }
  940.         if (damage[DDSP] != 0.0) {
  941.                 chew();
  942.                 skip(1);
  943.                 /* prout("Engineer Scott- \"The probe launcher is damaged, Sir.\""); */
  944.                 prout("ˆ­¦¥­¥à ‘ª®ââ- \"ã᪮¢ ï ãáâ ­®¢ª  §®­¤®¢ ¯®¢à¥¦¤¥­ , ‘íà.\"");
  945.                 return;
  946.         }
  947.         if (future[FDSPROB] != 1e30) {
  948.                 chew();
  949.                 skip(1);
  950.                 if (REPORTS) {
  951.                         /* prout("Uhura- \"The previous probe is still reporting data, Sir.\""); */
  952.                         prout("“åãà - \" ­¥¥ § ¯ã饭­ë¥ §®­¤ë ¥é¥ à ¡®â îâ, ‘íà.\"");
  953.                 } else {
  954. /*                      prout("Spock-  \"Records show the previous probe has not yet");
  955.                         prout("   reached its destination.\"");
  956.  */                     prout("‘¯®ª-  \"‘ã¤ï ¯® ¦ãà­ «ã, § ¯ã饭­ë¥ §®­¤ë");
  957.                         prout("   ¥é¥ ­¥ ¤®«¥â¥«¨.\"");
  958.                 }
  959.                 return;
  960.         }
  961.         key = scan();
  962.  
  963.         if (key == IHEOL) {
  964.                 /* slow mode, so let Kirk know how many probes there are left */
  965.                 crami(nprobes,1);
  966. /*              prout(nprobes==1 ? " probe left." : " probes left.");
  967.                 proutn("Are you sure you want to fire a probe? ");
  968.  */             prout(nprobes==1 ? " §®­¤ ®áâ «áï." : " §®­¤®¢ ®áâ «®áì.");
  969.                 proutn("‚ë 㢥७ë, çâ® å®â¨â¥ § ¯ãáâ¨âì §®­¤? ");
  970.                 if (ja()==0) return;
  971.         }
  972.  
  973.         isarmed = FALSE;
  974.         if (key == IHALPHA && strcmp(citem,"armed") == 0) {
  975.                 isarmed = TRUE;
  976.                 key = scan();
  977.         }
  978.         else if (key == IHEOL) {
  979.                 proutn("‡ à廊âì ¡®¥£®«®¢ªã NOVAMAX?");/*Arm NOVAMAX warhead*/
  980.                 isarmed = ja();
  981.         }
  982.         getcd(TRUE, key);
  983.         if (direc == -1.0) return;
  984.         nprobes--;
  985.                 angle = ((15.0 - direc) * 0.5235988);
  986.         probeinx = -sin(angle);
  987.         probeiny = cos(angle);
  988.         if (fabs(probeinx) > fabs(probeiny))
  989.                 bigger = fabs(probeinx);
  990.         else
  991.                 bigger = fabs(probeiny);
  992.                
  993.         probeiny /= bigger;
  994.         probeinx /= bigger;
  995.         proben = 10.0*dist*bigger +0.5;
  996.         probex = quadx*10 + sectx - 1;  // We will use better packing than original
  997.         probey = quady*10 + secty - 1;
  998.         probecx = quadx;
  999.         probecy = quady;
  1000.         future[FDSPROB] = d.date + 0.01; // Time to move one sector
  1001.         /* prout("Ensign Chekov-  \"The deep space probe is launched, Captain.\""); */
  1002.         prout("Œ¨ç¬ ­ —¥å®¢-  \"‡®­¤ ¤ «ì­¥£® ᪠­¨à®¢ ­¨ï § ¯ã饭, Š ¯¨â ­.\"");
  1003.         return;
  1004. }
  1005.  
  1006. void help(void) {
  1007.         /* There's more than one way to move in this game! */
  1008.         double ddist, xdist, probf;
  1009.         int line, l, ix, iy;
  1010.  
  1011.         chew();
  1012.         /* Test for conditions which prevent calling for help */
  1013.         if (condit == IHDOCKED) {
  1014.                 /* prout("Lt. Uhura-  \"But Captain, we're already docked.\""); */
  1015.                 prout("‹¥©â¥­ ­â “åãà -  \"® ª ¯¨â ­, ¬ë 㦥 ¯à¨áâ몮¢ ­ë.\"");
  1016.                 return;
  1017.         }
  1018.         if (damage[DRADIO] != 0) {
  1019.                 /* prout("Subspace radio damaged."); */
  1020.                 prout("®¤¯à®áâà ­á⢥­­®¥ à ¤¨® ¯®¢à¥¦¤¥­®.");
  1021.                 return;
  1022.         }
  1023.         if (d.rembase==0) {
  1024.                 /* prout("Lt. Uhura-  \"Captain, I'm not getting any response from Starbase.\""); */
  1025.                 prout("‹¥©â¥­ ­â “åãà -  \"Š ¯¨â ­, ï ­¥ ¯®«ãç î ®â¢¥â  á® á⠭樨.\"");
  1026.                 return;
  1027.         }
  1028.         if (landed == 1) {
  1029.                 proutn("‚ë ¤®«¦­ë ¡ëâì ­  ¡®àâã ");/*You must be aboard the*/
  1030.                 crmshp();
  1031.                 prout(".");
  1032.                 return;
  1033.         }
  1034.         /* OK -- call for help from nearest starbase */
  1035.         nhelp++;
  1036.         if (basex!=0) {
  1037.                 /* There's one in this quadrant */
  1038.                 ddist = sqrt(square(basex-sectx)+square(basey-secty));
  1039.         }
  1040.         else {
  1041.                 ddist = 1e30;
  1042.                 for (l = 1; l <= d.rembase; l++) {
  1043.                         xdist=10.0*sqrt(square(d.baseqx[l]-quadx)+square(d.baseqy[l]-quady));
  1044.                         if (xdist < ddist) {
  1045.                                 ddist = xdist;
  1046.                                 line = l;
  1047.                         }
  1048.                 }
  1049.                 /* Since starbase not in quadrant, set up new quadrant */
  1050.                 quadx = d.baseqx[line];
  1051.                 quady = d.baseqy[line];
  1052.                 newqad(1);
  1053.         }
  1054.         /* dematerialize starship */
  1055.         quad[sectx][secty]=IHDOT;
  1056.         proutn("‘â ­æ¨ï ¢ â®çª¥");/*Starbase in*/
  1057.         cramlc(1, quadx, quady);
  1058.         proutn(" ®â¢¥â¨« --");/*responds*/
  1059.         crmshp();
  1060.         prout(" ¤¥¬ â¥à¨ «¨§®¢ ­.");/*dematerializes*/
  1061.         /* Give starbase three chances to rematerialize starship */
  1062.         probf = pow((1.0 - pow(0.98,ddist)), 0.33333333);
  1063.         for (l = 1; l <= 3; l++) {
  1064.                 switch (l) {
  1065.                         case 1: proutn("1ï"); break;/*1st*/
  1066.                         case 2: proutn("2ï"); break;/*2nd*/
  1067.                         case 3: proutn("3ï"); break;/*3rd*/
  1068.                 }
  1069.                 proutn(" ¯®¯ë⪠ ¬ â¥à¨ «¨§®¢ âì ®¡à â­® ");/*attempt to re-materialize*/
  1070.                 crmshp();
  1071.                 prouts(" . . . . . ");
  1072.                 if (Rand() > probf) break;
  1073.                 prout("¯à®¢ «¨« áì.");/*fails*/
  1074.         }
  1075.         if (l > 3) {
  1076.                 finish(FMATERIALIZE);
  1077.                 return;
  1078.         }
  1079.         /* Rematerialization attempt should succeed if can get adj to base */
  1080.         for (l = 1; l <= 5; l++) {
  1081.                 ix = basex+3.0*Rand()-1;
  1082.                 iy = basey+3.0*Rand()-1;
  1083.                 if (ix>=1 && ix<=10 && iy>=1 && iy<=10 && quad[ix][iy]==IHDOT) {
  1084.                         /* found one -- finish up */
  1085.                         prout("㤠« áì.");/*succeeds*/
  1086.                         sectx=ix;
  1087.                         secty=iy;
  1088.                         quad[ix][iy]=ship;
  1089.                         dock();
  1090.                         skip(1);
  1091.                         /* prout("Lt. Uhura-  \"Captain, we made it!\""); */
  1092.                         prout("‹¥©â¥­ ­â “åãà -  \"Š ¯¨â ­, ¬ë ᤥ« «¨ íâ®!\"");
  1093.                         return;
  1094.                 }
  1095.         }
  1096.         finish(FMATERIALIZE);
  1097.         return;
  1098. }
  1099.