kolibrios/programs/games/sstartrek/ru/moving.c
siemargl 3a4ccc4ac4 startrek rus version-help en, adapt for current tcc
git-svn-id: svn://kolibrios.org@7185 a494cfbc-eb01-0410-851d-a64ba20cac60
2018-03-12 20:53:49 +00:00

1099 lines
31 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "sst.h"
static void getcd(int, int);
void lmove(void) {
double angle, deltax, deltay, bigger, x, y,
finald, finalx, finaly, stopegy;
int oldquadx, oldquady;
int trbeam = 0, n, l, ix, iy, kink, kinks, iquad;
if (inorbit) {
/* prout("SULU- \"Leaving standard orbit.\""); */
prout("‘ã«ã- \"<EFBFBD>®ª¨¤ ¥¬ áâ ­¤ àâ­ãî ®à¡¨âã.\"");
inorbit = 0;
}
angle = ((15.0 - direc) * 0.5235988);
deltax = -sin(angle);
deltay = cos(angle);
if (fabs(deltax) > fabs(deltay))
bigger = fabs(deltax);
else
bigger = fabs(deltay);
deltay /= bigger;
deltax /= bigger;
#ifdef CLOAKING
if (iscloaked && d.date+Time >= future[FTBEAM])
{ /* We can't be tracto beamed if cloaked, so move the event into the future */
future[FTBEAM] = d.date + Time +
expran(1.5*intime/d.remcom);
}
#endif
/* If tractor beam is to occur, don't move full distance */
if (d.date+Time >= future[FTBEAM]) {
trbeam = 1;
condit = IHRED;
dist = dist*(future[FTBEAM]-d.date)/Time + 0.1;
Time = future[FTBEAM] - d.date + 1e-5;
}
/* Move within the quadrant */
quad[sectx][secty] = IHDOT;
x = sectx;
y = secty;
n = 10.0*dist*bigger+0.5;
if (n > 0) {
for (l = 1; l <= n; l++) {
ix = (x += deltax) + 0.5;
iy = (y += deltay) + 0.5;
if (ix < 1 || ix > 10 || iy < 1 || iy > 10) {
/* Leaving quadrant -- allow final enemy attack */
/* Don't do it if being pushed by Nova */
if (nenhere != 0 && iattak != 2
#ifdef CLOAKING
&& !iscloaked
#endif
) {
newcnd();
for (l = 1; l <= nenhere; l++) {
finald = sqrt((ix-kx[l])*(double)(ix-kx[l]) +
(iy-ky[l])*(double)(iy-ky[l]));
kavgd[l] = 0.5 * (finald+kdist[l]);
}
if (d.galaxy[quadx][quady] != 1000) attack(0);
if (alldone) return;
}
/* compute final position -- new quadrant and sector */
x = 10*(quadx-1)+sectx;
y = 10*(quady-1)+secty;
ix = x+10.0*dist*bigger*deltax+0.5;
iy = y+10.0*dist*bigger*deltay+0.5;
/* check for edge of galaxy */
kinks = FALSE;
do {
kink = 0;
if (ix <= 0) {
ix = -ix + 1;
kink = 1;
}
if (iy <= 0) {
iy = -iy + 1;
kink = 1;
}
if (ix > 80) {
ix = 161 - ix;
kink = 1;
}
if (iy > 80) {
iy = 161 - iy;
kink = 1;
}
if (kink) kinks = TRUE;
} while (kink);
if (kinks) {
nkinks += 1;
if (nkinks == 3) {
/* Three strikes -- you're out! */
finish(FNEG3);
return;
}
/* prout("\nYOU HAVE ATTEMPTED TO CROSS THE NEGATIVE ENERGY BARRIER\n"
"AT THE EDGE OF THE GALAXY. THE THIRD TIME YOU TRY THIS,\n"
"YOU WILL BE DESTROYED.\n");
*/ prout("\n ‘„…‹€‹ˆ <20>Ž<EFBFBD>Š“ <20><EFBFBD>…—œ <20><EFBFBD>œ…<C593> <20>…ƒ€ˆ<CB86>Ž‰ <20><><EFBFBD>ƒˆˆ\n"
"<EFBFBD>€ Š<>€ž ƒ€‹€Š’ˆŠˆ. <20>Ž<>œ…‰ ’€ŠŽ‰ <20>Ž<EFBFBD>Šˆ,\n"
" <20>“„…… “<>ˆŽ†…<E280A0>.\n");
}
/* Compute final position in new quadrant */
if (trbeam) return; /* Don't bother if we are to be beamed */
oldquadx = quadx;
oldquady = quady;
quadx = (ix+9)/10;
quady = (iy+9)/10;
sectx = ix - 10*(quadx-1);
secty = iy - 10*(quady-1);
if (quadx != oldquadx || quady != oldquady) {
proutn("\n‚室¨¬ ¢");/*Entering*/
cramlc(1, quadx, quady);
} else {
/* prout("(Negative energy barrier disturbs quadrant.)"); */
prout("(Š¢ ¤à ­â ­ àã蠥⠡ àì¥à ­¥£ â¨¢­®© í­¥à£¨¨.)");
}
skip(1);
quad[sectx][secty] = ship;
newqad(0);
return;
}
iquad = quad[ix][iy];
if (iquad != IHDOT) {
/* object encountered in flight path */
stopegy = 50.0*dist/Time;
dist=0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
(secty-iy)*(double)(secty-iy));
switch (iquad) {
case IHT: /* Ram a Tholean */
case IHK: /* Ram enemy ship */
case IHC:
case IHS:
case IHR:
sectx = ix;
secty = iy;
ram(0, iquad, sectx, secty);
finalx = sectx;
finaly = secty;
break;
case IHBLANK:
skip(1);
prouts("***Ž<><E282AC>Žœ! Ž<><E282AC>Žœ!");/*RED ALERT*/
skip(1);
proutn("***");
crmshp();
proutn(" ¯à¨â¢ ¥âáï ç¥à­®© ¤ëன ¢ â®çª¥");/*pulled into black hole at*/
cramlc(2, ix, iy);
skip(1);
finish(FHOLE);
return;
default:
/* something else */
skip(1);
crmshp();
if (iquad == IHWEB)
proutn(" ¯®¯ «¨ ¢ ⮫¨ ­áãî á¥âì ¢ â®çª¥");/*encounters Tholian web at*/
else
proutn(" ¡«®ª¨à®¢ ­ë ®¡ê¥ªâ®¬ ¢ â®çª¥");/*blocked by object at*/
cramlc(2, ix,iy);
prout(";");
proutn("’ॡã¥âáï  ¢ à¨©­®¥ â®à¬®¦¥­¨¥ ");/*Emergency stop required*/
cramf(stopegy, 0, 2);
prout(" ¥¤¨­¨æ í­¥à£¨¨.");/*units of energy*/
energy -= stopegy;
finalx = x-deltax+0.5;
sectx = finalx;
finaly = y-deltay+0.5;
secty = finaly;
if (energy <= 0) {
finish(FNRG);
return;
}
break;
}
goto label100; /* sorry! */ /* ACTUALLY BREAK SHOULD WORK HERE */
}
}
dist = 0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
(secty-iy)*(double)(secty-iy));
sectx = ix;
secty = iy;
}
finalx = sectx; /* THESE STATEMENTS DO NOTHING USEFUL */
finaly = secty;
label100:
/* No quadrant change -- compute new avg enemy distances */
quad[sectx][secty] = ship;
if (nenhere) {
for (l = 1; l <= nenhere; l++) {
finald = sqrt((ix-kx[l])*(double)(ix-kx[l]) +
(iy-ky[l])*(double)(iy-ky[l]));
kavgd[l] = 0.5 * (finald+kdist[l]);
kdist[l] = finald;
}
sortkl();
if (d.galaxy[quadx][quady] != 1000 && iattak == 0)
attack(0);
for (l = 1 ; l <= nenhere; l++) kavgd[l] = kdist[l];
}
newcnd();
iattak = 0;
return;
}
void dock(void) {
chew();
if (condit == IHDOCKED) {
prout("‚ë 㦥 ¢ ¤®ª¥.");/*Already docked*/
return;
}
if (inorbit) {
/* prout("You must first leave standard orbit."); */
prout("‘­ ç «  ¯®ª¨­ì⥠áâ ­¤ àâ­ãî ®à¡¨âã.");
return;
}
if (basex==0 || abs(sectx-basex) > 1 || abs(secty-basey) > 1) {
crmshp();
prout(" ­¥ à冷¬ á® á⠭樥©.");/*not adjacent to base*/
return;
}
#ifdef CLOAKING
if (iscloaked) {
prout("<EFBFBD>¥¢®§¬®¦­  áâ몮¢ª  ¢ á®áâ®ï­¨¨ ­¥¢¨¤¨¬®áâ¨.");/*You cannot dock while cloaked*/
return;
}
#endif
condit = IHDOCKED;
prout("‘â몮¢ª  ¢ë¯®«­¥­ .");/*Docked*/
if (energy < inenrg) energy = inenrg;
shield = inshld;
torps = intorps;
lsupres = inlsr;
#ifdef CAPTURE
if (brigcapacity-brigfree > 0)
{
/* printf("%d captured Klingons transferred to base.\n", brigcapacity-brigfree); */
printf("%d ¯«¥­­ëå ª«¨­£®­®¢ ¯¥à¥¯à ¢«¥­® ­  áâ ­æ¨î.\n", brigcapacity-brigfree);
kcaptured += brigcapacity-brigfree;
brigfree = brigcapacity;
}
#endif
if (stdamtim != 1e30 &&
(future[FCDBAS] < 1e30 || isatb == 1) && iseenit == 0) {
/* get attack report from base */
/* prout("Lt. Uhura- \"Captain, an important message from the starbase:\""); */
prout("‹¥©â¥­ ­â “åãà - \"Š ¯¨â ­, áà®ç­®¥ á®®¡é¥­¨¥ á® á⠭樨:\"");
attakreport();
iseenit = 1;
}
}
static void getcd(int isprobe, int akey) {
/* This program originally required input in terms of a (clock)
direction and distance. Somewhere in history, it was changed to
cartesian coordinates. So we need to convert. I think
"manual" input should still be done this way -- it's a real
pain if the computer isn't working! Manual mode is still confusing
because it involves giving x and y motions, yet the coordinates
are always displayed y - x, where +y is downward! */
int irowq=quadx, icolq=quady, irows, icols, itemp=0, iprompt=0, key;
double xi, xj, xk, xl;
double deltax, deltay;
int automatic = -1;
/* Get course direction and distance. If user types bad values, return
with DIREC = -1.0. */
direc = -1.0;
if (landed == 1 && !isprobe) {
/* prout("Dummy! You can't leave standard orbit until you");
proutn("are back aboard the ");
*/ prout("<EFBFBD>®«¢ ­! <20>¥¢®§­®¦­® ¯®ª¨­ãâì áâ ­¤ àâãî ®à¡¨âã");
proutn("¯®ª  ‚ë ­¥ á拉⥠­  ¡®àâ ");
crmshp();
prout(".");
chew();
return;
}
while (automatic == -1) {
if (damage[DCOMPTR]) {
if (isprobe)
/* prout("Computer damaged; manual navigation only"); */
prout("Š®¬¯ìîâ¥à ¯®¢à¥¦¤¥­; ⮫쪮 àãç­ ï ­ ¢¨£ æ¨ï");
else
/* prout("Computer damaged; manual movement only"); */
prout("Š®¬¯ìîâ¥à ¯®¢à¥¦¤¥­; ⮫쪮 ¯¥à¥¬¥é¥­¨¥ ¢àãç­ãî");
chew();
automatic = 0;
key = IHEOL;
break;
}
if (isprobe && akey != -1) {
/* For probe launch, use pre-scaned value first time */
key = akey;
akey = -1;
}
else
key = scan();
if (key == IHEOL) {
/* proutn("Manual or automatic- "); */
proutn("<EFBFBD>ãç­®© (manual) or €¢â®¬ â¨ç¥áª¨© (automatic)- ");
iprompt = 1;
chew();
}
else if (key == IHALPHA) {
if (isit("manual")) {
automatic =0;
key = scan();
break;
}
else if (isit("automatic")) {
automatic = 1;
key = scan();
break;
}
else {
huh();
chew();
return;
}
}
else { /* numeric */
if (isprobe)
/* prout("(Manual navigation assumed.)"); */
prout("(‚ª«î祭  àãç­ ï ­ ¢¨£ æ¨ï.)");
else
/* prout("(Manual movement assumed.)"); */
prout("(‚ª«î祭® àãç­®¥ ¯¥à¥¬¥é¥­¨¥.)");
automatic = 0;
break;
}
}
if (automatic) {
while (key == IHEOL) {
if (isprobe)
/* proutn("Target quadrant or quadrant&sector- "); */
proutn("<EFBFBD> ¯à ¢«¥­¨¥: ª¢ ¤à ­â ¨«¨ ª¢ ¤à ­â&ᥪâ®à- ");
else
/* proutn("Destination sector or quadrant&sector- "); */
proutn("’®çª  ­ §­ ç¥­¨ï: ª¢ ¤à ­â ¨«¨ ª¢ ¤à ­â&ᥪâ®à- ");
chew();
iprompt = 1;
key = scan();
}
if (key != IHREAL) {
huh();
return;
}
xi = aaitem;
key = scan();
if (key != IHREAL){
huh();
return;
}
xj = aaitem;
key = scan();
if (key == IHREAL) {
/* both quadrant and sector specified */
xk = aaitem;
key = scan();
if (key != IHREAL) {
huh();
return;
}
xl = aaitem;
irowq = xi + 0.5;
icolq = xj + 0.5;
irows = xk + 0.5;
icols = xl + 0.5;
}
else {
if (isprobe) {
/* only quadrant specified -- go to center of dest quad */
irowq = xi + 0.5;
icolq = xj + 0.5;
irows = icols = 5;
}
else {
irows = xi + 0.5;
icols = xj + 0.5;
}
itemp = 1;
}
if (irowq<1 || irowq > 8 || icolq<1 || icolq > 8 ||
irows<1 || irows > 10 || icols<1 || icols > 10) {
huh();
return;
}
skip(1);
if (!isprobe) {
if (itemp) {
if (iprompt) {
/* proutn("Helmsman Sulu- \"Course locked in for"); */
proutn("<EFBFBD>ã«¥¢®© ‘ã«ã- \"Šãàá ¯à®«®¦¥­ ¤«ï");
cramlc(2, irows, icols);
prout(".\"");
}
}
/* else prout("Ensign Chekov- \"Course laid in, Captain.\""); */
else prout("Œ¨ç¬ ­ —¥å®¢- \"Šãàá £®â®¢, Š ¯¨â ­.\"");
}
deltax = icolq - quady + 0.1*(icols-secty);
deltay = quadx - irowq + 0.1*(sectx-irows);
}
else { /* manual */
while (key == IHEOL) {
/* proutn("X and Y displacements- "); */
proutn("X ¨ Y ᬥ饭¨ï- ");
chew();
iprompt = 1;
key = scan();
}
itemp = 2;
if (key != IHREAL) {
huh();
return;
}
deltax = aaitem;
key = scan();
if (key == IHEOL) {
deltay = 0.0;
} else if (key != IHREAL) {
huh();
return;
} else {
deltay = aaitem;
}
if (coordfixed) {
double temp = deltax;
deltax = deltay;
deltay = -temp;
}
}
/* Check for zero movement */
if (deltax == 0 && deltay == 0) {
chew();
return;
}
if (itemp == 2 && !isprobe) {
skip(1);
/* prout("Helmsman Sulu- \"Aye, Sir.\""); */
prout("<EFBFBD>ã«¥¢®© ‘ã«ã- \"’ ª â®ç­®, ‘íà.\"");
}
dist = sqrt(deltax*deltax + deltay*deltay);
direc = atan2(deltax, deltay)*1.90985932;
if (direc < 0.0) direc += 12.0;
chew();
return;
}
void impuls(void) {
double power;
ididit = 0;
if (damage[DIMPULS]) {
chew();
skip(1);
/* prout("Engineer Scott- \"The impulse engines are damaged, Sir.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"ˆ¬¯ã«ìá­ë¥ ¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë, ‘íà.\"");
return;
}
if (energy > 30.0) {
getcd(FALSE, 0);
if (direc == -1.0) return;
power = 20.0 + 100.0*dist;
}
else
power = 30.0;
if (power >= energy) {
/* Insufficient power for trip */
skip(1);
/* prout("First Officer Spock- \"Captain, the impulse engines");
prout("require 20.0 units to engage, plus 100.0 units per");
*/ prout("<EFBFBD>¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ¨¬¯ã«ìá­ë¥ ¤¢¨£ â¥«¨");
prout("¯®âॡ«ïîâ 20.0 ¥¤¨­¨æ ­  à §®£à¥¢, ¯«îá 100.0 ¥¤¨­¨æ ­ ");
if (energy > 30) {
/* proutn("quadrant. We can go, therefore, a maximum of "); */
proutn("ª¢ ¤à ­â. ‘«¥¤®¢ â¥«ì­®, ¬ë ¬®¦¥¬ ¯à®«¥â¥âì ");
cramf(0.01 * (energy-20.0)-0.05, 0, 1);
prout(" ª¢ ¤à ­â®¢.\"");/*quadrants*/
}
else {
/* prout("quadrant. They are, therefore, useless.\""); */
prout("ª¢ ¤à ­â. ‘«¥¤®¢ â¥«ì­®, ®­¨ ᥩç á ¡¥á¯®«¥§­ë.\"");
}
chew();
return;
}
/* Make sure enough time is left for the trip */
Time = dist/0.095;
if (Time >= d.remtime) {
/* prout("First Officer Spock- \"Captain, our speed under impulse");
prout("power is only 0.95 sectors per stardate. Are you sure");
prout("we dare spend the time?\"");
*/ prout("<EFBFBD>¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ­ è  ᪮à®áâì ­  ¨¬¯ã«ìá­®©");
prout("â á®áâ ¢«ï¥â 0.95 ᥪâ®à®¢ ¢ £®¤. ‚ë 㢥७ë");
prout("çâ® ¬ë ¬®¦¥¬ ¯®â¥àïâì á⮫쪮 ¢à¥¬¥­¨?\"");
if (ja() == 0) { Time = 0.0; return;}
}
/* Activate impulse engines and pay the cost */
lmove();
ididit = 1;
if (alldone) return;
power = 20.0 + 100.0*dist;
energy -= power;
// Time = dist/0.095; Don't recalculate because lmove may have
// adjusted it for tractor beaming
if (energy <= 0) finish(FNRG);
return;
}
void warp(int i) {
int blooey=0, twarp=0, iwarp;
double power;
if (i!=2) { /* Not WARPX entry */
ididit = 0;
#ifdef CLOAKING
if (iscloaked) {
chew();
skip(1);
/* prout("Engineer Scott- \"The warp engines can better not be used while cloaked, Sir.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"‚ à¯-¤¢¨£ â¥«¨ «ãçè¥ ­¥ ¨á¯®«ì§®¢ âì ¨§ á®áâ®ï­¨ï ¬ áª¨à®¢ª¨, ‘íà.\"");
return;
}
#endif
if (damage[DWARPEN] > 10.0) {
chew();
skip(1);
/* prout("Engineer Scott- \"The warp engines are damaged, Sir.\""); // Was "Impulse" 10/2013 */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë, ‘íà.\""); // Was "Impulse" 10/2013
return;
}
if (damage[DWARPEN] > 0.0 && warpfac > 4.0) {
chew();
skip(1);
prout("ˆ­¦¥­¥à ‘ª®ââ- \"<EFBFBD>à®áâ¨â¥, Š ¯¨â ­. <20>®ª  ¬ë ­¥ ¯®ç¨­¨¬áï,");
prout(" ï ᬮ£ã ®¡¥á¯¥ç¨âì ⮫쪮 ¢ à¯ 4.\"");
return;
}
/* Read in course and distance */
getcd(FALSE, 0);
if (direc == -1.0) return;
/* Make sure starship has enough energy for the trip */
power = (dist+0.05)*warpfac*warpfac*warpfac*(shldup+1);
if (power >= energy) {
/* Insufficient power for trip */
ididit = 0;
skip(1);
/* prout("Engineering to bridge--"); */
prout("ˆ­¦¥­¥à­ë© ¤®ª« ¤ë¢ ¥â--");
if (shldup==0 || 0.5*power > energy) {
iwarp = pow((energy/(dist+0.05)), 0.333333333);
if (iwarp <= 0) {
/* prout("We can't do it, Captain. We haven't the energy."); */
prout("Œë ­¥ ¬®¦¥¬ ᤥ« âì íâ®, Š ¯¨â ­. “ ­ á ­¥ 墠⠥â í­¥à£¨¨.");
}
else {
/* proutn("We haven't the energy, but we could do it at warp "); */
proutn("“ ­ á ­¥¤®áâ â®ç­® í­¥à£¨¨, ­® ¬ë ᬮ¦¥¬ ᤥ« âì íâ® ¢ ¢ à¯¥ ");
crami(iwarp, 1);
if (shldup)
/* prout(",\nif you'll lower the shields."); */
prout(",\n¥á«¨ ®âª«îç¨âì ᨫ®¢ë¥ é¨âë.");
else
prout(".");
}
}
else
/* prout("We haven't the energy to go that far with the shields up."); */
prout("<EFBFBD>¥¤®áâ â®ç­® í­¥à£¨¨ ¤«ï â ª®© ¤ «ì­®á⨠¯®«¥â  ¯à¨ ¯®¤­ïâëå é¨â å.");
return;
}
/* Make sure enough time is left for the trip */
Time = 10.0*dist/wfacsq;
if (Time >= 0.8*d.remtime) {
skip(1);
/* prout("First Officer Spock- \"Captain, I compute that such");
proutn(" a trip would require approximately ");
cramf(100.0*Time/d.remtime, 0, 2);
prout(" percent of our");
prout(" remaining time. Are you sure this is wise?\"");
*/ prout("<EFBFBD>¥à¢ë© ®ä¨æ¥à ‘¯®ª- \"Š ¯¨â ­, ï à ááç¨â «, çâ® íâ®â ¬ ­¥¢à");
proutn(" ¯®âॡã¥â ¯à¨¡«¨§¨â¥«ì­® ");
cramf(100.0*Time/d.remtime, 0, 2);
prout(" ¯à®æ¥­â®¢ ­ è¥£®");
prout(" ®á⠢襣®áï ¢à¥¬¥­¨. ‚ë 㢥७ë, çâ® íâ® ¬ã¤à®?\"");
if (ja() == 0) { Time = 0.0; return;}
}
}
/* Entry WARPX */
if (warpfac > 6.0) {
/* Decide if engine damage will occur */
double prob = dist*(6.0-warpfac)*(6.0-warpfac)/66.666666666;
if (prob > Rand()) {
blooey = 1;
dist = Rand()*dist;
}
/* Decide if time warp will occur */
if (0.5*dist*pow(7.0,warpfac-10.0) > Rand()) twarp=1;
#ifdef DEBUG
if (idebug &&warpfac==10 && twarp==0) {
blooey=0;
proutn("Force time warp? ");
if (ja()==1) twarp=1;
}
#endif
if (blooey || twarp) {
/* If time warp or engine damage, check path */
/* If it is obstructed, don't do warp or damage */
double angle = ((15.0-direc)*0.5235998);
double deltax = -sin(angle);
double deltay = cos(angle);
double bigger, x, y;
int n, l, ix, iy;
if (fabs(deltax) > fabs(deltay))
bigger = fabs(deltax);
else
bigger = fabs(deltay);
deltax /= bigger;
deltay /= bigger;
n = 10.0 * dist * bigger +0.5;
x = sectx;
y = secty;
for (l = 1; l <= n; l++) {
x += deltax;
ix = x + 0.5;
if (ix < 1 || ix > 10) break;
y += deltay;
iy = y +0.5;
if (iy < 1 || iy > 10) break;
if (quad[ix][iy] != IHDOT) {
blooey = 0;
twarp = 0;
}
}
}
}
/* Activate Warp Engines and pay the cost */
lmove();
if (alldone) return;
energy -= dist*warpfac*warpfac*warpfac*(shldup+1);
if (energy <= 0) finish(FNRG);
Time = 10.0*dist/wfacsq;
if (twarp) timwrp();
if (blooey) {
damage[DWARPEN] = damfac*(3.0*Rand()+1.0);
skip(1);
/* prout("Engineering to bridge--");
prout(" Scott here. The warp engines are damaged.");
prout(" We'll have to reduce speed to warp 4.");
*/ prout("ˆ­¦¥­¥à­ë© ¤®ª« ¤ë¢ ¥â--");
prout(" <20>â® ‘ª®ââ. ‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë.");
prout(" <20> ¬ ¯à¨¤¥âáï ®£à ­¨ç¨âìáï ᪮à®áâìî ¢ à¯  4.");
}
ididit = 1;
return;
}
void setwrp(void) {
int key;
double oldfac;
while ((key=scan()) == IHEOL) {
chew();
proutn("‚ à¯ ä ªâ®à-");/*Warp factor*/
}
chew();
if (key != IHREAL) {
huh();
return;
}
if (damage[DWARPEN] > 10.0) {
prout("‚ à¯-¤¢¨£ â¥«¨ ­¥ ä㭪樮­¨àãîâ.");/*Warp engines inoperative*/
return;
}
if (damage[DWARPEN] > 0.0 && aaitem > 4.0) {
/* prout("Engineer Scott- \"I'm doing my best, Captain,\n"
" but right now we can only go warp 4.\"");
*/ prout("ˆ­¦¥­¥à ‘ª®ââ- \"Ÿ ¤¥« î çâ® ¬®£ã, Š ¯¨â ­,\n"
" ­® ¯®ª  çâ® ¬ë ®£à ­¨ç¥­ë ¢ à¯ ä ªâ®à®¬ 4.\"");
return;
}
if (aaitem > 10.0) {
/* prout("Helmsman Sulu- \"Our top speed is warp 10, Captain.\""); */
prout("<EFBFBD>ã«¥¢®© ‘ã«ã- \"‘¥©ç á ¬ë ᬮ¦¥¬ ¢ë¦ âì ¢ à¯ 10, Š ¯¨â ­.\"");
return;
}
if (aaitem < 1.0) {
/* prout("Helmsman Sulu- \"We can't go below warp 1, Captain.\""); */
prout("<EFBFBD>ã«¥¢®© ‘ã«ã- \"Œë ­¥ ¬®¦¥¬ § ¤ âì ¢ à¯-᪮à®áâì ¬¥­ìè¥ 1, Captain.\"");
return;
}
oldfac = warpfac;
warpfac = aaitem;
wfacsq=warpfac*warpfac;
if (warpfac <= oldfac || warpfac <= 6.0) {
proutn("<EFBFBD>ã«¥¢®© ‘ã«ã-\"‚ à¯-ä ªâ®à ");/*Helmsman Sulu- \"Warp factor*/
cramf(warpfac, 0, 1);
prout(", Š ¯¨â ­.\"");/*Captain*/
return;
}
if (warpfac < 8.00) {
/* prout("Engineer Scott- \"Aye, but our maximum safe speed is warp 6.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"’ ª â®ç­®, ­® ᥩç á ¬ ªá¨¬ «ì­ ï ¡¥§®¯ á­ ï ¢ à¯-᪮à®áâì 6.\"");
return;
}
if (warpfac == 10.0) {
/* prout("Engineer Scott- \"Aye, Captain, we'll try it.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"’ ª â®ç­®, Š ¯¨â ­, ¬ë ᬮ¦¥¬ íâ®.\"");
return;
}
/* prout("Engineer Scott- \"Aye, Captain, but our engines may not take it.\""); */
prout("Engineer Scott- \"’ ª â®ç­®, Š ¯¨â ­, ­® ­ è¨ ¤¢¨£ â¥«¨ ¬®£ãâì ­¥ ¯®âï­ãâì.\"");
return;
}
void atover(int igrab) {
double power, distreq;
chew();
/* is captain on planet? */
if (landed==1) {
if (damage[DTRANSP]) {
finish(FPNOVA);
return;
}
/* prout("Scotty rushes to the transporter controls."); */
prout("‘ª®â⨠ࢠ­ã« ª ã¯à ¢«¥­¨î â࠭ᯮàâ â®à®¬.");
if (shldup) {
/* prout("But with the shields up it's hopeless."); */
prout("<EFBFBD>® á ¯®¤­ïâ묨 é¨â ¬¨ ¢á¥ ¡ë«® ¡¥á¯®«¥§­®.");
finish(FPNOVA);
}
/* prouts("His desperate attempt to rescue you . . ."); */
prouts("…£® ®âç ï­­ ï ¯®¯ë⪠ ᯠᥭ¨ï ‚ á . . .");
if (Rand() <= 0.5) {
prout("¯à®¢ «¨« áì.");/*fails*/
finish(FPNOVA);
return;
}
prout("“„€‹€‘œ!");/*SUCCEEDS*/
if (imine) {
imine = 0;
proutn("„®¡ëâë¥ ªà¨áâ ««ë ");/*The crystals mined were*/
if (Rand() <= 0.25) {
prout("¯®â¥àï­ë.");/*lost*/
}
else {
prout("ᯠᥭë.");/*saved*/
icrystl = 1;
}
}
}
if (igrab) return;
/* Check to see if captain in shuttle craft */
if (icraft) finish(FSTRACTOR);
if (alldone) return;
/* Inform captain of attempt to reach safety */
skip(1);
do {
if (justin) {
/* prouts("***RED ALERT! RED ALERT!");
skip(1);
proutn("The ");
crmshp();
prout(" has stopped in a quadrant containing");
prouts(" a supernova.");
skip(2);
*/ prouts("***Ž<><E282AC>Žœ! Ž<><E282AC>Žœ!");
skip(1);
proutn("Š®à ¡«ì ");
crmshp();
prout(" ®áâ ­®¢¨«áï ¢ ª¢ ¤à â¥ á®");
prouts(" ᢥàå­®¢®©.");
skip(2);
}
/* proutn("***Emergency automatic override attempts to hurl "); */
proutn("***€¢â®¬ â¨ç¥áª®¥ áà ¡ â뢠­¨¥ á¨á⥬ ¡¥§®¯ á­®á⨠¯ëâ ¥âáï ¢ë¢¥áâ¨");
crmshp();
skip(1);
prout("¨§ ª¢ ¤à ­â .");/*safely out of quadrant*/
starch[quadx][quady] = damage[DRADIO] > 0.0 ? d.galaxy[quadx][quady]+1000:1;
/* Try to use warp engines */
if (damage[DWARPEN]) {
skip(1);
prout("‚ à¯-¤¢¨£ â¥«¨ ¯®¢à¥¦¤¥­ë.");/*Warp engines damaged*/
finish(FSNOVAED);
return;
}
warpfac = 6.0+2.0*Rand();
wfacsq = warpfac * warpfac;
proutn("‚ à¯-ä ªâ®à ãáâ ­®¢«¥­ ¢ ");/*Warp factor set to*/
cramf(warpfac, 1, 1);
skip(1);
power = 0.75*energy;
dist = power/(warpfac*warpfac*warpfac*(shldup+1));
distreq = 1.4142+Rand();
if (distreq < dist) dist = distreq;
Time = 10.0*dist/wfacsq;
direc = 12.0*Rand(); /* How dumb! */
justin = 0;
inorbit = 0;
warp(2);
if (justin == 0) {
/* This is bad news, we didn't leave quadrant. */
if (alldone) return;
skip(1);
/* prout("Insufficient energy to leave quadrant."); */
prout("<EFBFBD>¥¤®áâ â®ç­® í­¥à£¨¨, ç⮡ë ã«¥â¥âì ¨§ ª¢ ¤à ­â .");
finish(FSNOVAED);
return;
}
/* Repeat if another snova */
} while (d.galaxy[quadx][quady] == 1000);
if (d.remkl==0) finish(FWON); /* Snova killed remaining enemy. */
}
void timwrp() {
int l, ll, gotit;
prout("***<E2809A><E282AC> ‚Ž <>…Œ…<C592>ˆ.");/*TIME WARP ENTERED*/
if (d.snap && Rand() < 0.5) {
/* Go back in time */
/* proutn("You are traveling backwards in time "); */
proutn("‚ë ¯à®¢ «¨«¨áì ­ § ¤ ¢® ¢à¥¬¥­¨ ­  ");
cramf(d.date-snapsht.date, 0, 2);
prout(" §¢¥§¤­ëå «¥â.");/*stardates*/
d = snapsht;
d.snap = 0;
if (d.remcom) {
future[FTBEAM] = d.date + expran(intime/d.remcom);
future[FBATTAK] = d.date + expran(0.3*intime);
}
future[FSNOVA] = d.date + expran(0.5*intime);
future[FSNAP] = d.date +expran(0.25*d.remtime); /* next snapshot will
be sooner */
if (d.nscrem) future[FSCMOVE] = 0.2777;
isatb = 0;
future[FCDBAS] = future[FSCDBAS] = 1e30;
batx = baty = 0;
/* Make sure Galileo is consistant -- Snapshot may have been taken
when on planet, which would give us two Galileos! */
gotit = 0;
for (l = 1; l <= inplan; l++) {
if (d.plnets[l].known == 2) {
gotit = 1;
if (iscraft==1 && ship==IHE) {
/* prout("Checkov- \"Security reports the Galileo has disappeared, Sir!"); */
prout("—¥å®¢- \"‘«ã¦¡  ¡¥§®¯ á­®á⨠¤®ª« ¤ë¢ ¥â - ƒ «¨«¥® ¨á祧, ‘íà!");
iscraft = 0;
}
}
}
/* Likewise, if in the original time the Galileo was abandoned, but
was on ship earlier, it would have vanished -- lets restore it */
if (iscraft==0 && gotit==0 && damage[DSHUTTL] >= 0.0) {
/* prout("Checkov- \"Security reports the Galileo has reappeared in the dock!\""); */
prout("—¥ª®¢- \"‘«ã¦¡  ¡¥§®¯ á­®á⨠¤®ª« ¤ë¢ ¥â - ƒ «¨«¥® á­®¢  ¢®§­¨ª ¢ ¤®ª¥!\"");
iscraft = 1;
}
/* Revert star chart to earlier era, if it was known then*/
if (damage[DRADIO]==0.0 || stdamtim > d.date) {
for (l = 1; l <= 8; l++)
for (ll = 1; ll <= 8; ll++)
if (starch[l][ll] > 1)
starch[l][ll]=damage[DRADIO]>0.0 ? d.galaxy[l][ll]+1000 :1;
/* prout("Spock has reconstructed a correct star chart from memory"); */
prout("‘¯®ª ¢®ááâ ­®¢¨« §¢¥§¤­ãî ª àâã ¯® ¯ ¬ïâ¨");
if (damage[DRADIO] > 0.0) stdamtim = d.date;
}
}
else {
/* Go forward in time */
Time = -0.5*intime*log(Rand());
/* proutn("You are traveling forward in time "); */
proutn("‚ë ¯à®¢ «¨«¨áì ¢¯¥à¥¤ ¯® ¢à¥¬¥­¨ ­  ");
cramf(Time, 1, 2);
prout(" §¢¥§¤­ëå «¥â.");/*stardates*/
/* cheat to make sure no tractor beams occur during time warp */
future[FTBEAM] += Time;
damage[DRADIO] += Time;
}
newqad(0);
}
void probe(void) {
double angle, bigger;
int key;
/* New code to launch a deep space probe */
if (nprobes == 0) {
chew();
skip(1);
if (ship == IHE)
/* prout("Engineer Scott- \"We have no more deep space probes, Sir.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"“ ­ á § ª®­ç¨«¨áì ᪠­¨àãî騥 §®­¤ë, ‘íà.\"");
else
/* prout("Ye Faerie Queene has no deep space probes."); */
prout("<EFBFBD>  Š®à®«¥¢¥ ”¥© ­¥â ᪠­¨àãîé¨å §®­¤®¢.");
return;
}
if (damage[DDSP] != 0.0) {
chew();
skip(1);
/* prout("Engineer Scott- \"The probe launcher is damaged, Sir.\""); */
prout("ˆ­¦¥­¥à ‘ª®ââ- \"<EFBFBD>ã᪮¢ ï ãáâ ­®¢ª  §®­¤®¢ ¯®¢à¥¦¤¥­ , ‘íà.\"");
return;
}
if (future[FDSPROB] != 1e30) {
chew();
skip(1);
if (REPORTS) {
/* prout("Uhura- \"The previous probe is still reporting data, Sir.\""); */
prout("“åãà - \"<EFBFBD> ­¥¥ § ¯ã饭­ë¥ §®­¤ë ¥é¥ à ¡®â îâ, ‘íà.\"");
} else {
/* prout("Spock- \"Records show the previous probe has not yet");
prout(" reached its destination.\"");
*/ prout("‘¯®ª- \"‘ã¤ï ¯® ¦ãà­ «ã, § ¯ã饭­ë¥ §®­¤ë");
prout(" ¥é¥ ­¥ ¤®«¥â¥«¨.\"");
}
return;
}
key = scan();
if (key == IHEOL) {
/* slow mode, so let Kirk know how many probes there are left */
crami(nprobes,1);
/* prout(nprobes==1 ? " probe left." : " probes left.");
proutn("Are you sure you want to fire a probe? ");
*/ prout(nprobes==1 ? " §®­¤ ®áâ «áï." : " §®­¤®¢ ®áâ «®áì.");
proutn("‚ë 㢥७ë, çâ® å®â¨â¥ § ¯ãáâ¨âì §®­¤? ");
if (ja()==0) return;
}
isarmed = FALSE;
if (key == IHALPHA && strcmp(citem,"armed") == 0) {
isarmed = TRUE;
key = scan();
}
else if (key == IHEOL) {
proutn("‡ à廊âì ¡®¥£®«®¢ªã NOVAMAX?");/*Arm NOVAMAX warhead*/
isarmed = ja();
}
getcd(TRUE, key);
if (direc == -1.0) return;
nprobes--;
angle = ((15.0 - direc) * 0.5235988);
probeinx = -sin(angle);
probeiny = cos(angle);
if (fabs(probeinx) > fabs(probeiny))
bigger = fabs(probeinx);
else
bigger = fabs(probeiny);
probeiny /= bigger;
probeinx /= bigger;
proben = 10.0*dist*bigger +0.5;
probex = quadx*10 + sectx - 1; // We will use better packing than original
probey = quady*10 + secty - 1;
probecx = quadx;
probecy = quady;
future[FDSPROB] = d.date + 0.01; // Time to move one sector
/* prout("Ensign Chekov- \"The deep space probe is launched, Captain.\""); */
prout("Œ¨ç¬ ­ —¥å®¢- \"‡®­¤ ¤ «ì­¥£® ᪠­¨à®¢ ­¨ï § ¯ã饭, Š ¯¨â ­.\"");
return;
}
void help(void) {
/* There's more than one way to move in this game! */
double ddist, xdist, probf;
int line, l, ix, iy;
chew();
/* Test for conditions which prevent calling for help */
if (condit == IHDOCKED) {
/* prout("Lt. Uhura- \"But Captain, we're already docked.\""); */
prout("‹¥©â¥­ ­â “åãà - \"<EFBFBD>® ª ¯¨â ­, ¬ë 㦥 ¯à¨áâ몮¢ ­ë.\"");
return;
}
if (damage[DRADIO] != 0) {
/* prout("Subspace radio damaged."); */
prout("<EFBFBD>®¤¯à®áâà ­á⢥­­®¥ à ¤¨® ¯®¢à¥¦¤¥­®.");
return;
}
if (d.rembase==0) {
/* prout("Lt. Uhura- \"Captain, I'm not getting any response from Starbase.\""); */
prout("‹¥©â¥­ ­â “åãà - \"Š ¯¨â ­, ï ­¥ ¯®«ãç î ®â¢¥â  á® á⠭樨.\"");
return;
}
if (landed == 1) {
proutn("‚ë ¤®«¦­ë ¡ëâì ­  ¡®àâã ");/*You must be aboard the*/
crmshp();
prout(".");
return;
}
/* OK -- call for help from nearest starbase */
nhelp++;
if (basex!=0) {
/* There's one in this quadrant */
ddist = sqrt(square(basex-sectx)+square(basey-secty));
}
else {
ddist = 1e30;
for (l = 1; l <= d.rembase; l++) {
xdist=10.0*sqrt(square(d.baseqx[l]-quadx)+square(d.baseqy[l]-quady));
if (xdist < ddist) {
ddist = xdist;
line = l;
}
}
/* Since starbase not in quadrant, set up new quadrant */
quadx = d.baseqx[line];
quady = d.baseqy[line];
newqad(1);
}
/* dematerialize starship */
quad[sectx][secty]=IHDOT;
proutn("‘â ­æ¨ï ¢ â®çª¥");/*Starbase in*/
cramlc(1, quadx, quady);
proutn(" ®â¢¥â¨« --");/*responds*/
crmshp();
prout(" ¤¥¬ â¥à¨ «¨§®¢ ­.");/*dematerializes*/
/* Give starbase three chances to rematerialize starship */
probf = pow((1.0 - pow(0.98,ddist)), 0.33333333);
for (l = 1; l <= 3; l++) {
switch (l) {
case 1: proutn(""); break;/*1st*/
case 2: proutn(""); break;/*2nd*/
case 3: proutn(""); break;/*3rd*/
}
proutn(" ¯®¯ë⪠ ¬ â¥à¨ «¨§®¢ âì ®¡à â­® ");/*attempt to re-materialize*/
crmshp();
prouts(" . . . . . ");
if (Rand() > probf) break;
prout("¯à®¢ «¨« áì.");/*fails*/
}
if (l > 3) {
finish(FMATERIALIZE);
return;
}
/* Rematerialization attempt should succeed if can get adj to base */
for (l = 1; l <= 5; l++) {
ix = basex+3.0*Rand()-1;
iy = basey+3.0*Rand()-1;
if (ix>=1 && ix<=10 && iy>=1 && iy<=10 && quad[ix][iy]==IHDOT) {
/* found one -- finish up */
prout("㤠« áì.");/*succeeds*/
sectx=ix;
secty=iy;
quad[ix][iy]=ship;
dock();
skip(1);
/* prout("Lt. Uhura- \"Captain, we made it!\""); */
prout("‹¥©â¥­ ­â “åãà - \"Š ¯¨â ­, ¬ë ᤥ« «¨ íâ®!\"");
return;
}
}
finish(FMATERIALIZE);
return;
}