3a4ccc4ac4
git-svn-id: svn://kolibrios.org@7185 a494cfbc-eb01-0410-851d-a64ba20cac60
1552 lines
42 KiB
C
1552 lines
42 KiB
C
#include "sst.h"
|
||
|
||
#ifdef CLOAKING
|
||
void cloak(void) {
|
||
int key;
|
||
enum {NONE, CLON, CLOFF} action = NONE;
|
||
|
||
if (ship == IHF) {
|
||
/* prout("Ye Faerie Queene has no cloaking device.");*/
|
||
prout("<EFBFBD> Š®à®«¥¢¥ ”¥© ¥ ãáâ ®¢«¥ £¥¥à â®à ¥¢¨¤¨¬®áâ¨.");
|
||
return;
|
||
}
|
||
|
||
key = scan();
|
||
|
||
if (key == IHREAL) return;
|
||
|
||
if (key == IHALPHA) {
|
||
if (isit("on")) {
|
||
if (iscloaked) {
|
||
/* prout("The cloaking device has already been switched on.");*/
|
||
prout("ƒ¥¥à â®à ¥¢¨¤¨¬®á⨠㦥 ¡ë« ¢ª«îç¥.");
|
||
return;
|
||
}
|
||
action = CLON;
|
||
}
|
||
else if (isit("off")) {
|
||
if (!iscloaked) {
|
||
/* prout("The cloaking device has already been switched off.");*/
|
||
prout("ƒ¥¥à â®à ¥¢¨¤¨¬®á⨠㦥 ¢ª«îç¥.");
|
||
return;
|
||
}
|
||
action = CLOFF;
|
||
}
|
||
else {
|
||
huh();
|
||
return;
|
||
}
|
||
} else {
|
||
if (!iscloaked) {
|
||
/* proutn("Switch cloaking device on?");*/
|
||
prout("‚ª«îç¨âì £¥¥à â®à ¥¢¨¤¨¬®áâ¨?");
|
||
if (ja()==0) return;
|
||
action = CLON;
|
||
}
|
||
if (iscloaked) {
|
||
/* proutn("Switch cloaking device off?");*/
|
||
prout("Žâª«îç¨âì £¥¥à â®à ¥¢¨¤¨¬®áâ¨?");
|
||
if (ja()==0) return;
|
||
action = CLOFF;
|
||
}
|
||
if (action == NONE) return;
|
||
}
|
||
|
||
if (action==CLOFF) {
|
||
if (irhere && d.date >= ALGERON && !isviolreported) {
|
||
/* prout("Spock- \"Captain, the Treaty of Algeron is in effect.\n Are you sure this is wise?\"");*/
|
||
prout("‘¯®ª- \"Š ¯¨â , ¬ë ¢ §®¥ ¤¥©áâ¢¨ï €«£¥à®áª®£® ᮣ« 襨ï.\n ‚ë 㢥à¥ë, çâ® íâ® à §ã¬®?\"");
|
||
if (ja() == 0) return;
|
||
}
|
||
/* prout("Engineer Scott- \"Aye, Sir.\"");*/
|
||
prout("Engineer Scott- \"’ ª â®ç®, ‘íà.\"");
|
||
iscloaked = FALSE;
|
||
if (irhere && d.date >= ALGERON && !isviolreported) {
|
||
/* prout("The Romulan ship discovers you are breaking the Treaty of Algeron!");*/
|
||
prout("Š®à ¡«ì <20>®¬ã« 楢 ®¡ à㦨«, çâ® ¢ë àã訫¨ €«£¥à®áª®¥ ᮣ« 襨¥!");
|
||
ncviol++;
|
||
isviolreported = TRUE;
|
||
}
|
||
|
||
// if (neutz && d.date >= ALGERON) finish(FCLOAK);
|
||
return;
|
||
}
|
||
|
||
if (damage[DCLOAK]!=0) {
|
||
/* prout("Engineer Scott- \"The cloaking device is damaged, Sir.\"");*/
|
||
prout("ˆ¦¥¥à ‘ª®ââ- \"ƒ¥¥à â®à ¥¢¨¤¨¬®á⨠¯®¢à¥¦¤¥, ‘íà.\"");
|
||
return;
|
||
}
|
||
|
||
if (condit==IHDOCKED) {
|
||
/* prout("You cannot cloak while docked.");*/
|
||
prout("<EFBFBD>ਠáâ몮¢ª¥ ¥¢®§¬®¦® ¢ª«îç âì £¥¥à â®à ¥¢¨¤¨¬®áâ¨.");
|
||
return;
|
||
}
|
||
|
||
if (d.date >= ALGERON && !isviolreported)
|
||
{
|
||
/* prout("Spock- \"Captain, using the cloaking device is be a violation");
|
||
prout(" of the Treaty of Algeron. Considering the alternatives,");
|
||
proutn(" are you sure this is wise?");*/
|
||
prout("‘¯®ª- \"Š ¯¨â , ¨á¯®«ì§®¢ ¨¥ £¥¥à â®à ¥¢¨¤¨¬®á⨠¡ã¤¥â àã襨¥¬");
|
||
prout(" €«£¥à®áª®£® ᮣ« 襨ï. <20> áᬮâà¨â¥ «ìâ¥à ⨢ë,");
|
||
proutn(" ‚ë 㢥à¥ë, çâ® íâ® à §ã¬®?");
|
||
if (ja()==0) return;
|
||
}
|
||
|
||
/* prout("Engineer Scott- \"The cloaking device has been engaged, Sir.\"");*/
|
||
prout("ˆ¦¥¥à ‘ª®ââ- \"ƒ¥¥à â®à ¥¢¨¤¨¬®á⨠ªâ¨¢¨à®¢ , ‘íà.\"");
|
||
iscloaking = TRUE;
|
||
if (irhere && d.date >= ALGERON && !isviolreported) {
|
||
/* prout("The Romulan ship discovers you are breaking the Treaty of Algeron!");*/
|
||
prout("Š®à ¡«ì <20>®¬ã« 楢 ®¡ à㦨«, çâ® ¢ë àã訫¨ €«£¥à®áª®¥ ᮣ« 襨¥!");
|
||
ncviol++;
|
||
isviolreported = TRUE;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void sheild(int i) {
|
||
int key;
|
||
enum {NONE, SHUP, SHDN, NRG} action = NONE;
|
||
|
||
ididit = 0;
|
||
|
||
if (i == 2) action = SHUP;
|
||
else {
|
||
key = scan();
|
||
if (key == IHALPHA) {
|
||
if (isit("transfer"))
|
||
action = NRG;
|
||
else {
|
||
chew();
|
||
if (damage[DSHIELD]) {
|
||
prout("™¨âë ¯à®¡¨âë ¨ ®âª«î稫¨áì.");/*Shields damaged and down.*/
|
||
return;
|
||
}
|
||
if (isit("up"))
|
||
action = SHUP;
|
||
else if (isit("down"))
|
||
action = SHDN;
|
||
}
|
||
}
|
||
if (action==NONE) {
|
||
proutn("‚ë å®â¨â¥ ¨§¬¥¨âì ¯à殮®áâì ᨫ®¢ëå é¨â®¢? ");/*Do you wish to change shield energy?*/
|
||
if (ja()) {
|
||
proutn("<EFBFBD>¥à£¨¨ ¯¥à¥¤ âì é¨âë- ");/*Energy to transfer to shields*/
|
||
action = NRG;
|
||
}
|
||
else if (damage[DSHIELD]) {
|
||
prout("™¨âë ¯à®¡¨âë ¨ ®âª«î稫¨áì.");/*Shields damaged and down*/
|
||
return;
|
||
}
|
||
else if (shldup) {
|
||
/* proutn("Shields are up. Do you want them down? ");*/
|
||
proutn("™¨âë ¢ª«îç¥ë, å®â¨â¥ ¯®£ á¨âì ¨å? ");
|
||
if (ja()) action = SHDN;
|
||
else {
|
||
chew();
|
||
return;
|
||
}
|
||
}
|
||
else {
|
||
/* proutn("Shields are down. Do you want them up? ");*/
|
||
proutn("™¨âë ¯®£ è¥ë, å®â¨â¥ ªâ¨¢¨à®¢ âì ¨å? ");
|
||
if (ja()) action = SHUP;
|
||
else {
|
||
chew();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
switch (action) {
|
||
case SHUP: /* raise shields */
|
||
if (shldup) {
|
||
/* prout("Shields already up.");*/
|
||
prout("‘¨«®¢ë¥ é¨âë 㦥 ªâ¨¢¨à®¢ ë.");
|
||
return;
|
||
}
|
||
shldup = 1;
|
||
shldchg = 1;
|
||
if (condit != IHDOCKED) energy -= 50.0;
|
||
prout("‘¨«®¢ë¥ é¨âë ªâ¨¢¨à®¢ ë.");/*Shields raised*/
|
||
if (energy <= 0) {
|
||
skip(1);
|
||
/* prout("Shields raising uses up last of energy.");*/
|
||
prout("<EFBFBD> ªâ¨¢ æ¨î é¨â®¢ ¯®âà ç¥ ¢áï í¥à£¨ï.");
|
||
finish(FNRG);
|
||
return;
|
||
}
|
||
ididit=1;
|
||
return;
|
||
case SHDN:
|
||
if (shldup==0) {
|
||
prout("‘¨«®¢ë¥ é¨âë 㦥 ¯®£ è¥ë."); /*Shields already down*/
|
||
return;
|
||
}
|
||
shldup=0;
|
||
shldchg=1;
|
||
prout("<EFBFBD> ¯à殮®áâì ᨫ®¢ëå é¨â®¢ ¯®¨¦¥ .");/*Shields lowered*/
|
||
ididit=1;
|
||
return;
|
||
case NRG:
|
||
while (scan() != IHREAL) {
|
||
chew();
|
||
/* proutn("Energy to transfer to shields- ");*/
|
||
proutn("‘ª®«ìª® í¥à£¨¨ ¯®¤ âì é¨âë- ");
|
||
}
|
||
chew();
|
||
if (aaitem==0) return;
|
||
if (aaitem > energy) {
|
||
prout("<EFBFBD>¥¤®áâ â®ç® í¥à£¨¨ ª®à ¡«¥.");/*Insufficient ship energy*/
|
||
return;
|
||
}
|
||
ididit = 1;
|
||
if (shield+aaitem >= inshld) {
|
||
prout("<EFBFBD> ¯à殮®áâì ᨫ®¢ëå é¨â®¢ ¤®á⨣« ¬ ªá¨¬ã¬ .");/*Shield energy maximized*/
|
||
if (shield+aaitem > inshld) {
|
||
/* prout("Excess energy requested returned to ship energy");*/
|
||
prout("ˆ§¡ë⮪ § ¯à®è¥®© í¥à£¨¨ ¢®§¢à é¥");
|
||
}
|
||
energy -= inshld-shield;
|
||
shield = inshld;
|
||
return;
|
||
}
|
||
if (aaitem < 0.0 && energy-aaitem > inenrg) {
|
||
/* Prevent shield drain loophole */
|
||
skip(1);
|
||
/* prout("Engineering to bridge--");
|
||
prout(" Scott here. Power circuit problem, Captain.");
|
||
prout(" I can't drain the shields.");*/
|
||
prout("ˆ¦¥¥àë© ¤®ª« ¤ë¢ ¥â--");
|
||
prout(" <20>â® ‘ª®ââ. “ á ¯à®¡«¥¬ á ᨫ®¢ë¬¨ ª ¡¥«ï¬¨, Š ¯¨â .");
|
||
prout(" Ÿ ¥ ¬®£ã ¤à¥¨à®¢ âì ᨫ®¢ë¥ é¨âë.");
|
||
ididit = 0;
|
||
return;
|
||
}
|
||
if (shield+aaitem < 0) {
|
||
/* prout("All shield energy transferred to ship.");*/
|
||
prout("<EFBFBD>¥à£¨ï ᨫ®¢ëå é¨â®¢ ¢®§¢à é¥ ª®à ¡«ì.");
|
||
energy += shield;
|
||
shield = 0.0;
|
||
return;
|
||
}
|
||
proutn("‘ª®ââ- \""); /*Scotty*/
|
||
if (aaitem > 0)
|
||
/* prout("Transferring energy to shields.\"");*/
|
||
prout("<EFBFBD>¥à¥¤ ¥¬ í¥à£¨î ᨫ®¢ë¥ é¨âë.\"");
|
||
else
|
||
/* prout("Draining energy from shields.\"");*/
|
||
prout("„२à㥬 í¥à£¨î á ᨫ®¢ëå é¨â®¢.\"");
|
||
shield += aaitem;
|
||
energy -= aaitem;
|
||
return;
|
||
case NONE: break;
|
||
}
|
||
}
|
||
|
||
void ram(int ibumpd, int ienm, int ix, int iy) {
|
||
double type = 1.0, extradm;
|
||
int icas, l;
|
||
|
||
prouts("***Ž<>€‘<E282AC>Ž‘’œ! Ž<>€‘<E282AC>Ž‘’œ!");/*RED ALERT! RED ALERT!*/
|
||
skip(1);
|
||
prout("***<2A>…ˆ‡<CB86>…†<E280A6>Ž… ‘’Ž‹Š<E280B9>Ž‚…<E2809A>ˆ….");/*COLLISION IMMINENT*/
|
||
skip(2);
|
||
proutn("***");
|
||
crmshp();
|
||
switch (ienm) {
|
||
case IHR: type = 1.5; break;
|
||
case IHC: type = 2.0; break;
|
||
case IHS: type = 2.5; break;
|
||
case IHT: type = 0.5; break;
|
||
}
|
||
/* proutn(ibumpd ? " rammed by " : " rams ");*/
|
||
proutn(ibumpd ? " á⮫ª®¢¥¨¥ ¢ â®çª¥" : " 㤠஢ ");
|
||
crmena(0, ienm, 2, ix, iy);
|
||
if (ibumpd) proutn(" (®à¨£¨ «ì®¥ ¯®«®¦¥¨¥)");/*(original position)*/
|
||
skip(1);
|
||
deadkl(ix, iy, ienm, sectx, secty);
|
||
proutn("***");
|
||
crmshp();
|
||
prout(" â殮«® ¯®¢à¥¦¤¥®.");/*heavily damaged*/
|
||
icas = 10.0+20.0*Rand();
|
||
proutn("***Œ¥¤®âᥪ ¤®ª« ¤ë¢ ¥â ");/*Sickbay reports*/
|
||
crami(icas, 1);
|
||
prout(" ᬥà⥩.");/*casualties*/
|
||
casual += icas;
|
||
for (l=1; l <= ndevice; l++) {
|
||
if (l == DDRAY) continue; // Don't damage deathray
|
||
if (damage[l] < 0) continue;
|
||
extradm = (10.0*type*Rand()+1.0)*damfac;
|
||
damage[l] += Time + extradm; /* Damage for at least time of travel! */
|
||
}
|
||
shldup = 0;
|
||
if (d.remkl) {
|
||
pause(2);
|
||
dreprt();
|
||
}
|
||
else finish(FWON);
|
||
return;
|
||
}
|
||
|
||
void torpedo(double course, double r, int inx, int iny, double *hit) {
|
||
int l, iquad, ix, iy, jx, jy, shoved=0, ll;
|
||
double ac=course + 0.25*r;
|
||
double angle = (15.0-ac)*0.5235988;
|
||
double bullseye = (15.0 - course)*0.5235988;
|
||
double deltax=-sin(angle), deltay=cos(angle), x=inx, y=iny, bigger;
|
||
double ang, temp, xx, yy, kp, h1;
|
||
|
||
bigger = fabs(deltax);
|
||
if (fabs(deltay) > bigger) bigger = fabs(deltay);
|
||
deltax /= bigger;
|
||
deltay /= bigger;
|
||
|
||
/* Loop to move a single torpedo */
|
||
for (l=1; l <= 15; 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 (l==4 || l==9) skip(1);
|
||
cramf(x, 0, 1);
|
||
proutn(" - ");
|
||
cramf(y, 0, 1);
|
||
proutn(" ");
|
||
iquad=quad[ix][iy];
|
||
if (iquad==IHDOT) continue;
|
||
/* hit something */
|
||
skip(1);
|
||
switch(iquad) {
|
||
case IHE: /* Hit our ship */
|
||
case IHF:
|
||
skip(1);
|
||
proutn("’®à¯¥¤ ¯®¯ « ¢ ");/*Torpedo hits*/
|
||
crmshp();
|
||
prout(".");
|
||
*hit = 700.0 + 100.0*Rand() -
|
||
1000.0*sqrt(square(ix-inx)+square(iy-iny))*
|
||
fabs(sin(bullseye-angle));
|
||
*hit = fabs(*hit);
|
||
newcnd(); /* undock */
|
||
/* We may be displaced. */
|
||
if (landed==1) return; /* Cheat if on a planet */
|
||
ang = angle + 2.5*(Rand()-0.5);
|
||
temp = fabs(sin(ang));
|
||
if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
|
||
xx = -sin(ang)/temp;
|
||
yy = cos(ang)/temp;
|
||
jx=ix+xx+0.5;
|
||
jy=iy+yy+0.5;
|
||
if (jx<1 || jx>10 || jy<1 ||jy > 10) return;
|
||
if (quad[jx][jy]==IHBLANK) {
|
||
finish(FHOLE);
|
||
return;
|
||
}
|
||
if (quad[jx][jy]!=IHDOT) {
|
||
/* can't move into object */
|
||
return;
|
||
}
|
||
sectx = jx;
|
||
secty = jy;
|
||
crmshp();
|
||
shoved = 1;
|
||
break;
|
||
|
||
case IHC: /* Hit a commander */
|
||
case IHS:
|
||
if (Rand() <= 0.05) {
|
||
crmena(1, iquad, 2, ix, iy);
|
||
prout(" ¨á¯®«ì§®¢ ® â¨-ä®â®®¥ ãáâனá⢮;");/*uses anti-photon device*/
|
||
prout(" â®à¯¥¤ ¥©âà «¨§®¢ .");/*torpedo neutralized*/
|
||
return;
|
||
}
|
||
case IHR: /* Hit a regular enemy */
|
||
case IHK:
|
||
/* find the enemy */
|
||
for (ll=1; ll <= nenhere; ll++)
|
||
if (ix==kx[ll] && iy==ky[ll]) break;
|
||
kp = fabs(kpower[ll]);
|
||
h1 = 700.0 + 100.0*Rand() -
|
||
1000.0*sqrt(square(ix-inx)+square(iy-iny))*
|
||
fabs(sin(bullseye-angle));
|
||
h1 = fabs(h1);
|
||
if (kp < h1) h1 = kp;
|
||
kpower[ll] -= (kpower[ll]<0 ? -h1 : h1);
|
||
if (kpower[ll] == 0) {
|
||
deadkl(ix, iy, iquad, ix, iy);
|
||
return;
|
||
}
|
||
crmena(1, iquad, 2, ix, iy);
|
||
/* If enemy damaged but not destroyed, try to displace */
|
||
ang = angle + 2.5*(Rand()-0.5);
|
||
temp = fabs(sin(ang));
|
||
if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
|
||
xx = -sin(ang)/temp;
|
||
yy = cos(ang)/temp;
|
||
jx=ix+xx+0.5;
|
||
jy=iy+yy+0.5;
|
||
if (jx<1 || jx>10 || jy<1 ||jy > 10) {
|
||
prout(" ¯®¢à¥¦¤¥, ® ¥ ã¨ç⮦¥.");/*damaged but not destroyed*/
|
||
return;
|
||
}
|
||
if (quad[jx][jy]==IHBLANK) {
|
||
prout(" ®â¯à ¢«¥ ¢ ç¥àãî ¤ëàã.");/*buffeted into black hole*/
|
||
deadkl(ix, iy, iquad, jx, jy);
|
||
return;
|
||
}
|
||
if (quad[jx][jy]!=IHDOT) {
|
||
/* can't move into object */
|
||
prout(" ¯®¢à¥¦¤¥, ® ¥ ã¨ç⮦¥.");/*damaged but not destroyed*/
|
||
return;
|
||
}
|
||
prout(" ¯®¢à¥¦¤¥--");/*damaged*/
|
||
kx[ll] = jx;
|
||
ky[ll] = jy;
|
||
shoved = 1;
|
||
break;
|
||
case IHB: /* Hit a base */
|
||
prout("***‘’€<E28099>–ˆŸ “<>ˆ—’Ž†…<E280A0>€..");/*STARBASE DESTROYED*/
|
||
if (starch[quadx][quady] < 0) starch[quadx][quady] = 0;
|
||
for (ll=1; ll<=d.rembase; ll++) {
|
||
if (d.baseqx[ll]==quadx && d.baseqy[ll]==quady) {
|
||
d.baseqx[ll]=d.baseqx[d.rembase];
|
||
d.baseqy[ll]=d.baseqy[d.rembase];
|
||
break;
|
||
}
|
||
}
|
||
quad[ix][iy]=IHDOT;
|
||
d.rembase--;
|
||
basex=basey=0;
|
||
d.galaxy[quadx][quady] -= 10;
|
||
d.basekl++;
|
||
newcnd();
|
||
return;
|
||
case IHP: /* Hit a planet */
|
||
crmena(1, iquad, 2, ix, iy);
|
||
prout(" ã¨ç⮦¥ .");/*destroyed*/
|
||
d.nplankl++;
|
||
d.newstuf[quadx][quady] -= 1;
|
||
d.plnets[iplnet] = nulplanet;
|
||
iplnet = 0;
|
||
plnetx = plnety = 0;
|
||
quad[ix][iy] = IHDOT;
|
||
if (landed==1) {
|
||
/* captain parishes on planet */
|
||
finish(FDPLANET);
|
||
}
|
||
return;
|
||
case IHSTAR: /* Hit a star */
|
||
if (Rand() > 0.10) {
|
||
nova(ix, iy);
|
||
return;
|
||
}
|
||
crmena(1, IHSTAR, 2, ix, iy);
|
||
prout(" ¥çã¢áâ¢¨â¥«ì ª ä®â®®¬ã ¢§àë¢ã.");/*unaffected by photon blast*/
|
||
return;
|
||
case IHQUEST: /* Hit a thingy */
|
||
skip(1);
|
||
/* prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!");*/
|
||
prouts("“““““<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>€€€€€€€€€€€€€€€€€€€€€€€!!!");
|
||
skip(1);
|
||
/* prouts(" HACK! HACK! HACK! *CHOKE!* ");*/
|
||
prouts(" •‹Ž<E280B9>! •‹Ž<E280B9>! •‹Ž<E280B9>! *˜‹…<E280B9>!* ");
|
||
skip(1);
|
||
/* proutn("Mr. Spock-");
|
||
prouts(" \"Facinating!\"");*/
|
||
proutn("Œ¨áâ¥à ‘¯®ª-");
|
||
prouts(" \"‚¥«¨ª®«¥¯®!\"");
|
||
skip(1);
|
||
quad[ix][iy] = IHDOT;
|
||
return;
|
||
case IHBLANK: /* Black hole */
|
||
skip(1);
|
||
crmena(1, IHBLANK, 2, ix, iy);
|
||
prout(" ¯®£«®â¨« â®à¯¥¤ã.");/*swallows torpedo*/
|
||
return;
|
||
case IHWEB: /* hit the web */
|
||
skip(1);
|
||
prout("***’®à¯¥¤ ¯®¯ « ¢ ’®«¨ áªãî á¥âì.");/*Torpedo absorbed by Tholian web*/
|
||
return;
|
||
case IHT: /* Hit a Tholian */
|
||
skip(1);
|
||
crmena(1, IHT, 2, ix, iy);
|
||
h1 = 700.0 + 100.0*Rand() -
|
||
1000.0*sqrt(square(ix-inx)+square(iy-iny))*
|
||
fabs(sin(bullseye-angle));
|
||
h1 = fabs(h1);
|
||
if (h1 >= 600) {
|
||
prout(" ã¨ç⮦¥.");/*destroyed*/
|
||
quad[ix][iy] = IHDOT;
|
||
ithere = 0;
|
||
ithx = ithy = 0;
|
||
return;
|
||
}
|
||
if (Rand() > 0.05) {
|
||
prout(" ¯¥à¥¦¨« ä®â®ë© ¢§àë¢.");/*survives photon blast*/
|
||
return;
|
||
}
|
||
prout(" ¨á祧.");/*disappears*/
|
||
quad[ix][iy] = IHWEB;
|
||
ithere = ithx = ithy = 0;
|
||
{
|
||
int dum, my;
|
||
dropin(IHBLANK, &dum, &my);
|
||
}
|
||
return;
|
||
|
||
default: /* Problem! */
|
||
skip(1);
|
||
/* proutn("Don't know how to handle collision with ");*/
|
||
proutn("<EFBFBD>¥ § î, ª ª ®¡à ¡®â âì á⮫ª®¢¥¨¥ á ");
|
||
crmena(1, iquad, 2, ix, iy);
|
||
skip(1);
|
||
return;
|
||
}
|
||
break;
|
||
}
|
||
if (shoved) {
|
||
quad[jx][jy]=iquad;
|
||
quad[ix][iy]=IHDOT;
|
||
proutn(" ®â¡à®è¥® ¢§à뢮¬ ¢");/*displaced by blast to*/
|
||
cramlc(2, jx, jy);
|
||
skip(1);
|
||
for (ll=1; ll<=nenhere; ll++)
|
||
kdist[ll] = kavgd[ll] = sqrt(square(sectx-kx[ll])+square(secty-ky[ll]));
|
||
sortkl();
|
||
return;
|
||
}
|
||
skip(1);
|
||
prout("’®à¯¥¤ ¯à®è« ¬¨¬®."); /*Torpedo missed*/
|
||
return;
|
||
}
|
||
|
||
static void fry(double hit) {
|
||
double ncrit, extradm;
|
||
int ktr=1, l, ll, j, cdam[6], crptr;
|
||
|
||
/* a critical hit occured */
|
||
if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return;
|
||
|
||
ncrit = 1.0 + hit/(500.0+100.0*Rand());
|
||
proutn("***Š<>ˆ’ˆ—…‘ŠŽ… <20>Ž<EFBFBD>€„€<E2809E>ˆ…--");/*CRITICAL HIT*/
|
||
/* Select devices and cause damage */
|
||
for (l = 1; l <= ncrit; l++) {
|
||
do {
|
||
j = ndevice*Rand()+1.0;
|
||
/* Cheat to prevent shuttle damage unless on ship */
|
||
} while (damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||
|
||
#ifdef CLOAKING
|
||
(j == DCLOAK && ship != IHE) ||
|
||
#endif
|
||
j == DDRAY);
|
||
cdam[l] = j;
|
||
extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand()));
|
||
damage[j] += extradm;
|
||
if (l > 1) {
|
||
for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ;
|
||
if (ll<=l) continue;
|
||
ktr += 1;
|
||
if (ktr==3) skip(1);
|
||
proutn(" ¨ ");/*and*/
|
||
}
|
||
proutn(device[j]);
|
||
}
|
||
prout(" ¯®¢à¥¦¤¥.");/*damaged*/
|
||
if (damage[DSHIELD] && shldup) {
|
||
prout("***‘¨«®¢ë¥ é¨âë ¯à®¡¨âë ¨ ®âª«îç¥ë.");/*Shields knocked down*/
|
||
shldup=0;
|
||
}
|
||
#ifdef CLOAKING
|
||
if (damage[DCLOAK] && iscloaked)
|
||
{
|
||
/* prout("***Cloaking device rendered inoperative.");*/
|
||
prout("***ƒ¥¥à â®à ¥¢¨¤¨¬®á⨠¢ë襫 ¨§ áâà®ï.");
|
||
iscloaked = FALSE;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
void attack(int k) {
|
||
/* k == 0 forces use of phasers in an attack */
|
||
int percent, ihurt=0, l, i=0, jx, jy, iquad, itflag;
|
||
int atackd = 0, attempt = 0;
|
||
double hit;
|
||
double pfac, dustfac, hitmax=0.0, hittot=0.0, chgfac=1.0, r;
|
||
|
||
#ifdef CLOAKING
|
||
if (iscloaked && !iscloaking) return; // Nothing happens if we are cloaked
|
||
#endif
|
||
|
||
iattak = 1;
|
||
if (alldone) return;
|
||
#ifdef DEBUG
|
||
if (idebug) prout("ATTACK!");
|
||
#endif
|
||
|
||
if (ithere) movetho();
|
||
|
||
if (neutz) { /* The one chance not to be attacked */
|
||
neutz = 0;
|
||
return;
|
||
}
|
||
if (((comhere || ishere) && (justin == 0)) || skill == SEMERITUS) movcom();
|
||
if (nenhere==0) return;
|
||
pfac = 1.0/inshld;
|
||
if (shldchg == 1) chgfac = 0.25+0.5*Rand();
|
||
skip(1);
|
||
if (skill <= SFAIR) i = 2;
|
||
for (l=1; l <= nenhere; l++) {
|
||
if (kpower[l] < 0) continue; /* too weak to attack */
|
||
/* compute hit strength and diminsh shield power */
|
||
r = Rand();
|
||
/* Increase chance of photon torpedos if docked or enemy energy low */
|
||
if (condit == IHDOCKED) r *= 0.25;
|
||
if (kpower[l] < 500) r *= 0.25;
|
||
jx = kx[l];
|
||
jy = ky[l];
|
||
iquad = quad[jx][jy];
|
||
itflag = (iquad == IHK && r > 0.0005) || k == 0 ||
|
||
(iquad==IHC && r > 0.015) ||
|
||
(iquad==IHR && r > 0.3) ||
|
||
(iquad==IHS && r > 0.07);
|
||
if (itflag) {
|
||
/* Enemy uses phasers */
|
||
if (condit == IHDOCKED) continue; /* Don't waste the effort! */
|
||
attempt = 1; /* Attempt to attack */
|
||
dustfac = 0.8+0.05*Rand();
|
||
hit = kpower[l]*pow(dustfac,kavgd[l]);
|
||
kpower[l] *= 0.75;
|
||
}
|
||
else { /* Enemy used photon torpedo */
|
||
double course = 1.90985*atan2((double)secty-jy, (double)jx-sectx);
|
||
hit = 0;
|
||
proutn("***’Ž<E28099><C5BD>…„€ ‹…’ˆ’");/*TORPEDO INCOMING*/
|
||
if (damage[DSRSENS] <= 0.0) {
|
||
proutn(" ˆ§ â®çª¨ ");/*From*/
|
||
crmena(0, iquad, i, jx, jy);
|
||
}
|
||
attempt = 1;
|
||
prout("--");
|
||
r = (Rand()+Rand())*0.5 -0.5;
|
||
r += 0.002*kpower[l]*r;
|
||
torpedo(course, r, jx, jy, &hit);
|
||
if (d.remkl==0) finish(FWON); /* Klingons did themselves in! */
|
||
if (d.galaxy[quadx][quady] == 1000 ||
|
||
alldone) return; /* Supernova or finished */
|
||
if (hit == 0) continue;
|
||
}
|
||
if (shldup != 0 || shldchg != 0) {
|
||
/* shields will take hits */
|
||
double absorb, hitsh, propor = pfac*shield;
|
||
if(propor < 0.1) propor = 0.1;
|
||
hitsh = propor*chgfac*hit+1.0;
|
||
atackd=1;
|
||
absorb = 0.8*hitsh;
|
||
if (absorb > shield) absorb = shield;
|
||
shield -= absorb;
|
||
hit -= hitsh;
|
||
if (propor > 0.1 && hit < 0.005*energy) continue;
|
||
}
|
||
/* It's a hit -- print out hit size */
|
||
atackd = 1; /* We weren't going to check casualties, etc. if
|
||
shields were down for some strange reason. This
|
||
doesn't make any sense, so I've fixed it */
|
||
ihurt = 1;
|
||
cramf(hit, 0, 2);
|
||
proutn(" ¬®¤ã«ì ¯®¢à¥¦¤¥");/*unit hit*/
|
||
if ((damage[DSRSENS] > 0 && itflag) || skill <= SFAIR) {
|
||
proutn(" áâ®à®¥ ");/*on the*/
|
||
crmshp();
|
||
}
|
||
if (damage[DSRSENS] <= 0.0 && itflag) {
|
||
proutn(" ¨§ â®çª¨ ");/*from*/
|
||
crmena(0, iquad, i, jx, jy);
|
||
}
|
||
skip(1);
|
||
/* Decide if hit is critical */
|
||
if (hit > hitmax) hitmax = hit;
|
||
hittot += hit;
|
||
fry(hit);
|
||
printf("“à® %g í¥à£¨ï %g\n", hit, energy);/*Hit %g energy %g*/
|
||
energy -= hit;
|
||
}
|
||
if (energy <= 0) {
|
||
/* Returning home upon your shield, not with it... */
|
||
finish(FBATTLE);
|
||
return;
|
||
}
|
||
if (attempt == 0 && condit == IHDOCKED)
|
||
/*prout("***Enemies decide against attacking your ship.");*/
|
||
prout("***‚à £¨ à¥è¨«¨ ¥ â ª®¢ âì ¢ è ª®à ¡«ì.");
|
||
if (atackd == 0) return;
|
||
percent = 100.0*pfac*shield+0.5;
|
||
if (ihurt==0) {
|
||
/* Shields fully protect ship */
|
||
/*proutn("Enemy attack reduces shield strength to ");*/
|
||
proutn("‚à ¦¥áª ï â ª 㬥ì訫 ᨫ®¢ë¥ é¨âë ¤® ");
|
||
}
|
||
else {
|
||
/* Print message if starship suffered hit(s) */
|
||
skip(1);
|
||
proutn("<EFBFBD>¥à£¨¨ ®áâ «®áì ");/*Energy left*/
|
||
cramf(energy, 0, 2);
|
||
proutn(" ᨫ®¢ë¥ é¨âë ");/*shields*/
|
||
if (shldup) proutn(" ªâ¨¢ë, ");/*up*/
|
||
else if (damage[DSHIELD] == 0) proutn("¯®£ è¥ë, ");/*down*/
|
||
else proutn("¯®¢à¥¦¤¥ë, "); /*damaged*/
|
||
}
|
||
crami(percent, 1);
|
||
/* proutn("% torpedoes left ");*/
|
||
proutn("% â®à¯¥¤ ®áâ «®áì ");
|
||
crami(torps, 1);
|
||
skip(1);
|
||
/* Check if anyone was hurt */
|
||
if (hitmax >= 200 || hittot >= 500) {
|
||
int icas= hittot*Rand()*0.015;
|
||
if (icas >= 2) {
|
||
skip(1);
|
||
/* proutn("Mc Coy- \"Sickbay to bridge. We suffered ");*/
|
||
proutn("Œ ªŠ®©- \"Œ¥¤®âᥪ ¤®ª« ¤ë¢ ¥â. Œë ¯®â¥à﫨 ");
|
||
crami(icas, 1);
|
||
prout(" 祫®¢¥ª");/*casualties*/
|
||
prout(" ¯à¨ ¯®á«¥¤¥© â ª¥.\"");/*in that last attack*/
|
||
casual += icas;
|
||
}
|
||
}
|
||
/* After attack, reset average distance to enemies */
|
||
for (l = 1; l <= nenhere; l++)
|
||
kavgd[l] = kdist[l];
|
||
sortkl();
|
||
return;
|
||
}
|
||
|
||
void deadkl(int ix, int iy, int type, int ixx, int iyy) {
|
||
/* Added ixx and iyy allow enemy to "move" before dying */
|
||
|
||
int i,j;
|
||
|
||
crmena(1, type, 2, ixx, iyy);
|
||
/* Decide what kind of enemy it is and update approriately */
|
||
if (type == IHR) {
|
||
/* chalk up a Romulan */
|
||
d.newstuf[quadx][quady] -= 10;
|
||
irhere--;
|
||
d.nromkl++;
|
||
d.nromrem--;
|
||
}
|
||
else if (type == IHT) {
|
||
/* Killed a Tholean */
|
||
ithere = 0;
|
||
}
|
||
else {
|
||
/* Some type of a Klingon */
|
||
d.galaxy[quadx][quady] -= 100;
|
||
klhere--;
|
||
d.remkl--;
|
||
switch (type) {
|
||
case IHC:
|
||
comhere = 0;
|
||
for (i=1; i<=d.remcom; i++)
|
||
if (d.cx[i]==quadx && d.cy[i]==quady) break;
|
||
d.cx[i] = d.cx[d.remcom];
|
||
d.cy[i] = d.cy[d.remcom];
|
||
d.cx[d.remcom] = 0;
|
||
d.cy[d.remcom] = 0;
|
||
d.remcom--;
|
||
future[FTBEAM] = 1e30;
|
||
if (d.remcom != 0)
|
||
future[FTBEAM] = d.date + expran(1.0*incom/d.remcom);
|
||
d.killc++;
|
||
break;
|
||
case IHK:
|
||
d.killk++;
|
||
break;
|
||
case IHS:
|
||
d.nscrem = ishere = d.isx = d.isy = isatb = iscate = 0;
|
||
d.nsckill = 1;
|
||
future[FSCMOVE] = future[FSCDBAS] = 1e30;
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* For each kind of enemy, finish message to player */
|
||
prout(" ã¨ç⮦¥.");/*destroyed*/
|
||
quad[ix][iy] = IHDOT;
|
||
if (d.remkl==0) return;
|
||
|
||
d.remtime = d.remres/(d.remkl + 4*d.remcom);
|
||
|
||
if (type == IHT) return;
|
||
|
||
/* Remove enemy ship from arrays describing local conditions */
|
||
|
||
for (i=1; i<=nenhere; i++)
|
||
if (kx[i]==ix && ky[i]==iy) break;
|
||
nenhere--;
|
||
if (i <= nenhere) {
|
||
for (j=i; j<=nenhere; j++) {
|
||
kx[j] = kx[j+1];
|
||
ky[j] = ky[j+1];
|
||
kpower[j] = kpower[j+1];
|
||
kavgd[j] = kdist[j] = kdist[j+1];
|
||
}
|
||
}
|
||
kx[nenhere+1] = 0;
|
||
ky[nenhere+1] = 0;
|
||
kdist[nenhere+1] = 0;
|
||
kavgd[nenhere+1] = 0;
|
||
kpower[nenhere+1] = 0;
|
||
return;
|
||
}
|
||
|
||
static int targetcheck(double x, double y, double *course) {
|
||
double deltx, delty;
|
||
/* Return TRUE if target is invalid */
|
||
if (x < 1.0 || x > 10.0 || y < 1.0 || y > 10.0) {
|
||
huh();
|
||
return 1;
|
||
}
|
||
deltx = 0.1*(y - secty);
|
||
delty = 0.1*(sectx - x);
|
||
if (deltx==0 && delty== 0) {
|
||
skip(1);
|
||
/* prout("Spock- \"Bridge to sickbay. Dr. McCoy,");
|
||
prout(" I recommend an immediate review of");
|
||
prout(" the Captain's psychological profile.");*/
|
||
prout("‘¯®ª- \"Œ®á⨪ - ¬¥¤®âᥪã. „®ªâ®à Œ ªŠ®©,");
|
||
prout(" Ÿ ४®¬¥¤ãî ¥¬¥¤«¥® ¯à®¢¥à¨âì");
|
||
prout(" ¯á¨å®«®£¨ç¥áª®¥ á®áâ®ï¨¥ Š ¯¨â .");
|
||
chew();
|
||
return 1;
|
||
}
|
||
*course = 1.90985932*atan2(deltx, delty);
|
||
return 0;
|
||
}
|
||
|
||
void photon(void) {
|
||
double targ[4][3], course[4];
|
||
double r, dummy;
|
||
int key, n, i, osuabor;
|
||
|
||
ididit = 0;
|
||
|
||
if (damage[DPHOTON]) {
|
||
prout("<EFBFBD>ã᪮¢ë¥ ãáâ ®¢ª¨ ä®â®ëå â®à¯¥¤ ¯®¢à¥¦¤¥ë.");/*Photon tubes damaged*/
|
||
chew();
|
||
return;
|
||
}
|
||
if (torps == 0) {
|
||
prout("’®à¯¥¤ë ª®ç¨«¨áì.");/*No torpedoes left*/
|
||
chew();
|
||
return;
|
||
}
|
||
key = scan();
|
||
for (;;) {
|
||
if (key == IHALPHA) {
|
||
huh();
|
||
return;
|
||
}
|
||
else if (key == IHEOL) {
|
||
crami(torps,1);
|
||
prout(" â®à¯¥¤ ®áâ «®áì.");/*torpedoes left*/
|
||
proutn("‘ª®«ìª® â®à¯¥¤ ¢ë¯ã᪠âì?- ");/*Number of torpedoes to fire*/
|
||
key = scan();
|
||
}
|
||
else /* key == IHREAL */ {
|
||
n = aaitem + 0.5;
|
||
if (n <= 0) { /* abort command */
|
||
chew();
|
||
return;
|
||
}
|
||
if (n > 3) {
|
||
prout("Œ ªá¨¬ «ìë© § «¯ - 3 â®à¯¥¤ë.");/*Maximum of 3 torpedoes per burst*/
|
||
} else if (n <= torps) break;
|
||
chew();
|
||
key = IHEOL;
|
||
}
|
||
}
|
||
for (i = 1; i <= n; i++) {
|
||
key = scan();
|
||
if (i==1 && key == IHEOL) {
|
||
break; /* we will try prompting */
|
||
}
|
||
if (i==2 && key == IHEOL) {
|
||
/* direct all torpedoes at one target */
|
||
while (i <= n) {
|
||
targ[i][1] = targ[1][1];
|
||
targ[i][2] = targ[1][2];
|
||
course[i] = course[1];
|
||
i++;
|
||
}
|
||
break;
|
||
}
|
||
if (key != IHREAL) {
|
||
huh();
|
||
return;
|
||
}
|
||
targ[i][1] = aaitem;
|
||
key = scan();
|
||
if (key != IHREAL) {
|
||
huh();
|
||
return;
|
||
}
|
||
targ[i][2] = aaitem;
|
||
if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
|
||
}
|
||
chew();
|
||
if (i == 1 && key == IHEOL) {
|
||
/* prompt for each one */
|
||
for (i = 1; i <= n; i++) {
|
||
proutn("‘¥ªâ®à ¯à¨æ¥«¨¢ ¨ï ¤«ï â®à¯¥¤ë");/*Target sector for torpedo number*/
|
||
crami(i, 2);
|
||
proutn("- ");
|
||
key = scan();
|
||
if (key != IHREAL) {
|
||
huh();
|
||
return;
|
||
}
|
||
targ[i][1] = aaitem;
|
||
key = scan();
|
||
if (key != IHREAL) {
|
||
huh();
|
||
return;
|
||
}
|
||
targ[i][2] = aaitem;
|
||
chew();
|
||
if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
|
||
}
|
||
}
|
||
ididit = 1;
|
||
/* Loop for moving <n> torpedoes */
|
||
osuabor = 0;
|
||
for (i = 1; i <= n && !osuabor; i++) {
|
||
if (condit != IHDOCKED) torps--;
|
||
r = (Rand()+Rand())*0.5 -0.5;
|
||
if (fabs(r) >= 0.47) {
|
||
/* misfire! */
|
||
r = (Rand()+1.2) * r;
|
||
if (n>1) {
|
||
prouts("***’Ž<E28099><C5BD>…„€");/*TORPEDO NUMBER*/
|
||
crami(i, 2);
|
||
prouts(" - ‘<>Ž‰ <20>“‘Š€.");/*MISFIRES*/
|
||
}
|
||
else prouts("***’Ž<E28099><C5BD>…„€ - ‘<>Ž‰ <20>“‘Š€.");/*TORPEDO MISFIRES*/
|
||
skip(1);
|
||
if (i < n)
|
||
prout(" ‡ «¯ ¯à¥à¢ .");/*Remainder of burst aborted*/
|
||
osuabor=1;
|
||
if (Rand() <= 0.2) {
|
||
prout("***<2A>ã᪮¢ë¥ ãáâ ®¢ª¨ ¯®¢à¥¦¤¥ë ¯à¨ á¡®¥.");/*Photon tubes damaged by misfire*/
|
||
damage[DPHOTON] = damfac*(1.0+2.0*Rand());
|
||
break;
|
||
}
|
||
}
|
||
#ifdef CLOAKING
|
||
if (iscloaked) r *= 1.2; /* Torpedoes are less accurate */
|
||
else
|
||
#endif
|
||
if (shldup != 0 || condit == IHDOCKED) r *= 1.0 + 0.0001*shield; /* Torpedos are less accurate */
|
||
|
||
if (n != 1) {
|
||
skip(1);
|
||
proutn("’®à¯¥¤ë© á«¥¤ ®¬¥à");/*Track for torpedo number*/
|
||
crami(i, 2);
|
||
proutn("- ");
|
||
}
|
||
else {
|
||
skip(1);
|
||
proutn("’®à¯¥¤ë© á«¥¤- ");/*Torpedo track*/
|
||
}
|
||
torpedo(course[i], r, sectx, secty, &dummy);
|
||
if (alldone || d.galaxy[quadx][quady]==1000) return;
|
||
}
|
||
if (d.remkl==0) finish(FWON);
|
||
}
|
||
|
||
|
||
|
||
static void overheat(double rpow) {
|
||
if (rpow > 1500) {
|
||
double chekbrn = (rpow-1500.)*0.00038;
|
||
if (Rand() <= chekbrn) {
|
||
/*prout("Weapons officer Sulu- \"Phasers overheated, sir.\"");*/
|
||
prout("Žà㤨©ë© ®ä¨æ¥à ‘ã«ã- \"” §¥àë ¯¥à¥£à¥âë, ‘íà.\"");
|
||
damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);
|
||
}
|
||
}
|
||
}
|
||
|
||
static int checkshctrl(double rpow) {
|
||
double hit;
|
||
int icas;
|
||
|
||
skip(1);
|
||
if (Rand() < .998) {
|
||
prout("‘¨«®¢ë¥ é¨âë ®á« ¡«¥ë.");/*Shields lowered*/
|
||
return 0;
|
||
}
|
||
/* Something bad has happened */
|
||
prouts("***Š<>€‘<E282AC>€Ÿ ’<>…‚Žƒ€!");/*RED ALERT! RED ALERT!*/
|
||
skip(2);
|
||
hit = rpow*shield/inshld;
|
||
energy -= rpow+hit*0.8;
|
||
shield -= hit*0.2;
|
||
if (energy <= 0.0) {
|
||
/* prouts("Sulu- \"Captain! Shield malf***********************\"");*/
|
||
prouts("‘ã«ã- \"Š ¯¨â ! ‘¨«®¢ë¥ é¨âë ¥¡*****************\"");
|
||
skip(1);
|
||
stars();
|
||
finish(FPHASER);
|
||
return 1;
|
||
}
|
||
/* prouts("Sulu- \"Captain! Shield malfunction! Phaser fire contained!\"");*/
|
||
prouts("‘ã«ã- \"Š ¯¨â ! ‘¨«®¢ë¥ é¨âë ¯®¢à¥¦¤¥ë! Ž£¥¬ ä §¥à®¢!\"");
|
||
skip(2);
|
||
/* prout("Lt. Uhura- \"Sir, all decks reporting damage.\"");*/
|
||
prout("‹¥©â¥ â “åãà - \"‘íà, ¢á¥ ¯ «ã¡ë ¤®ª« ¤ë¢ îâ ® ¯®¢à¥¦¤¥¨ïå.\"");
|
||
icas = hit*Rand()*0.012;
|
||
skip(1);
|
||
fry(0.8*hit);
|
||
if (icas) {
|
||
skip(1);
|
||
/* prout("McCoy to bridge- \"Severe radiation burns, Jim.");*/
|
||
prout("Œ ªŠ®© - ¬®á⨪ã- \"‘¥à쥧 ï ãâ¥çª à ¤¨ 樨, „¦¨¬.");
|
||
proutn(" ");
|
||
crami(icas, 1);
|
||
prout(" ¯®â¥àì ¤ ë© ¬®¬¥â.\"");/*casualties so far*/
|
||
casual += icas; // Changed from -=, October 2013
|
||
}
|
||
skip(1);
|
||
/* prout("Phaser energy dispersed by shields.");
|
||
prout("Enemy unaffected.");*/
|
||
prout("” §¥àë¥ «ãç¨ ¯®£«®é¥ë é¨â ¬¨.");
|
||
prout("‚à £ ¯®¢à¥¦¤¥¨© ¥ ¯®«ã稫.");
|
||
overheat(rpow);
|
||
return 1;
|
||
}
|
||
|
||
|
||
void phasers(void) {
|
||
double hits[21], rpow, extra, powrem, over, temp;
|
||
int kz = 0, k=1, i; /* Cheating inhibitor */
|
||
int ifast=0, no=0, ipoop=1, msgflag = 1;
|
||
enum {NOTSET, MANUAL, FORCEMAN, AUTOMATIC} automode = NOTSET;
|
||
int key;
|
||
|
||
skip(1);
|
||
/* SR sensors and Computer */
|
||
if (damage[DSRSENS]+damage[DCOMPTR] > 0) ipoop = 0;
|
||
if (condit == IHDOCKED) {
|
||
/* prout("Phasers can't be fired through base shields.");*/
|
||
prout("‘¨«®¢®¥ ¯®«¥ áâ 樨 ¬¥è ¥â ®âªàëâì ®£®ì ¨§ ä §¥à®¢.");
|
||
chew();
|
||
return;
|
||
}
|
||
if (damage[DPHASER] != 0) {
|
||
prout("<EFBFBD> ¥«ì ã¯à ¢«¥¨ï ä §¥à ¬¨ ¯®¢à¥¦¤¥ .");/*Phaser control damaged*/
|
||
chew();
|
||
return;
|
||
}
|
||
if (shldup) {
|
||
if (damage[DSHCTRL]) {
|
||
prout("<EFBFBD> ¥«ì ¡ëáâண® ॣ㫨஢ ¨ï ᨫ®¢ëå é¨â®¢ ¯®¢à¥¦¤¥ .");/*High speed shield control damaged*/
|
||
chew();
|
||
return;
|
||
}
|
||
if (energy <= 200.0) {
|
||
/* prout("Insufficient energy to activate high-speed shield control.");*/
|
||
prout("<EFBFBD>¥¤®áâ â®ç® í¥à£¨¨ ¤«ï ०¨¬ ¡ëáâண® ॣ㫨஢ ¨ï ᨫ®¢ëå é¨â®¢.");
|
||
chew();
|
||
return;
|
||
}
|
||
/* prout("Weapons Officer Sulu- \"High-speed shield control enabled, sir.\"");*/
|
||
prout("Žà㤨©ë© ®ä¨æ¥à ‘ã«ã- \"<EFBFBD>¥¦¨¬ ¡ëáâண® ॣ㫨஢ ¨ï ᨫ®¢ëå é¨â®¢ ¢ª«îç¥, ‘íà.\"");
|
||
ifast = 1;
|
||
|
||
}
|
||
ididit = 1;
|
||
/* Original code so convoluted, I re-did it all */
|
||
while (automode==NOTSET) {
|
||
key=scan();
|
||
if (key == IHALPHA) {
|
||
if (isit("manual")) {
|
||
if (nenhere==0) {
|
||
prout("‚à ¦¥áª¨¥ 楫¨ ®âáãâáâ¢ãîâ.");/*There is no enemy present to select*/
|
||
chew();
|
||
key = IHEOL;
|
||
automode=AUTOMATIC;
|
||
}
|
||
else {
|
||
automode = MANUAL;
|
||
key = scan();
|
||
}
|
||
}
|
||
else if (isit("automatic")) {
|
||
if ((!ipoop) && nenhere != 0) {
|
||
automode = FORCEMAN;
|
||
}
|
||
else {
|
||
if (nenhere==0)
|
||
prout("<EFBFBD>¥à£¨ï à áᥥâáï ¢ ª®á¬®á¥.");/*Energy will be expended into space*/
|
||
automode = AUTOMATIC;
|
||
key = scan();
|
||
}
|
||
}
|
||
else if (isit("no")) {
|
||
no = 1;
|
||
}
|
||
else {
|
||
huh();
|
||
ididit = 0;
|
||
return;
|
||
}
|
||
}
|
||
else if (key == IHREAL) {
|
||
if (nenhere==0) {
|
||
prout("<EFBFBD>¥à£¨ï à áᥥâáï ¢ ª®á¬®á¥.");/*Energy will be expended into space*/
|
||
automode = AUTOMATIC;
|
||
}
|
||
else if (!ipoop)
|
||
automode = FORCEMAN;
|
||
else
|
||
automode = AUTOMATIC;
|
||
}
|
||
else {
|
||
/* IHEOL */
|
||
if (nenhere==0) {
|
||
prout("<EFBFBD>¥à£¨ï à áᥥâáï ¢ ª®á¬®á¥.");/*Energy will be expended into space*/
|
||
automode = AUTOMATIC;
|
||
}
|
||
else if (!ipoop)
|
||
automode = FORCEMAN;
|
||
else
|
||
proutn("<EFBFBD>ã箩 (manual) ¨«¨ ¢â®¬ â¨ç¥áª¨© (automatic)? ");/*Manual or automatic?*/
|
||
}
|
||
}
|
||
|
||
switch (automode) {
|
||
case AUTOMATIC:
|
||
if (key == IHALPHA && isit("no")) {
|
||
no = 1;
|
||
key = scan();
|
||
}
|
||
if (key != IHREAL && nenhere != 0) {
|
||
/* proutn("Phasers locked on target. Energy available =");*/
|
||
proutn("” §¥àë ¢¥¤¥ë 楫ì. <20>¥à£¨¨ ¤®áâ㯮 =");
|
||
cramf(ifast?energy-200.0:energy,1,2);
|
||
skip(1);
|
||
}
|
||
do {
|
||
while (key != IHREAL) {
|
||
chew();
|
||
proutn("Œ®é®áâì ¢ëáâ५ =");/*Units to fire*/
|
||
key = scan();
|
||
}
|
||
rpow = aaitem;
|
||
if (rpow >= (ifast?energy-200:energy)) {
|
||
proutn("<EFBFBD>¥à£¨¨ ¤®áâ㯮= ");/*Energy available*/
|
||
cramf(ifast?energy-200:energy, 1,2);
|
||
skip(1);
|
||
key = IHEOL;
|
||
}
|
||
} while (rpow >= (ifast?energy-200:energy));
|
||
if (rpow<=0) {
|
||
/* chicken out */
|
||
ididit = 0;
|
||
chew();
|
||
return;
|
||
}
|
||
if ((key=scan()) == IHALPHA && isit("no")) {
|
||
no = 1;
|
||
}
|
||
if (ifast) {
|
||
energy -= 200; /* Go and do it! */
|
||
if (checkshctrl(rpow)) return;
|
||
}
|
||
chew();
|
||
energy -= rpow;
|
||
extra = rpow;
|
||
if (nenhere) {
|
||
extra = 0.0;
|
||
powrem = rpow;
|
||
for (i = 1; i <= nenhere; i++) {
|
||
hits[i] = 0.0;
|
||
if (powrem <= 0) continue;
|
||
hits[i] = fabs(kpower[i])/(phasefac*pow(0.90,kdist[i]));
|
||
over = (0.01 + 0.05*Rand())*hits[i];
|
||
temp = powrem;
|
||
powrem -= hits[i] + over;
|
||
if (powrem <= 0 && temp < hits[i]) hits[i] = temp;
|
||
if (powrem <= 0) over = 0.0;
|
||
extra += over;
|
||
}
|
||
if (powrem > 0.0) extra += powrem;
|
||
hittem(hits);
|
||
}
|
||
if (extra > 0 && alldone == 0) {
|
||
if (ithere) {
|
||
proutn("*** ’®«¨ ᪠ï á¥âì ¯®£«®â¨« ");/*Tholian web absorbs*/
|
||
if (nenhere>0) proutn("¨§¡ë⮪ ");/*excess*/
|
||
prout("í¥à£¨¨ ä §¥à®¢.");/*phaser energy*/
|
||
}
|
||
else {
|
||
cramf(extra, 0, 2);
|
||
prout(" à áá¥ï ¢ ¯ãá⮬ ª®á¬®á¥.");/*expended on empty space*/
|
||
}
|
||
}
|
||
break;
|
||
|
||
case FORCEMAN:
|
||
chew();
|
||
key = IHEOL;
|
||
if (damage[DCOMPTR]!=0)
|
||
/* prout("Battle computer damaged, manual file only.");*/
|
||
prout("’ ªâ¨ç¥áª¨© ª®¬¯ìîâ¥à ¯®¢à¥¦¤¥, ⮫쪮 àã箥 ã¯à ¢«¥¨¥.");
|
||
else {
|
||
skip(1);
|
||
prouts("---Ž<><C5BD>€<EFBFBD>Ž’Š€---");/*WORKING*/
|
||
skip(1);
|
||
/* prout("Short-range-sensors-damaged");
|
||
prout("Insufficient-data-for-automatic-phaser-fire");
|
||
prout("Manual-fire-must-be-used");*/
|
||
prout("‘¥á®àë-¡«¨¦¥£®-à ¤¨ãá -¤¥©á⢨ï-¯®¢à¥¦¤¥ë");
|
||
prout("<EFBFBD>¥¤®áâ â®ç®-¨ä®à¬ 樨-¤«ï- ¢â®¬ â¨ç¥áª®£®-ã¯à ¢«¥¨ï-ä §¥à ¬¨");
|
||
prout("<EFBFBD>ã箥-ã¯à ¢«¥¨¥-¤®«¦®-¡ëâì-¨á¯®«ì§®¢ ®");
|
||
skip(1);
|
||
}
|
||
case MANUAL:
|
||
rpow = 0.0;
|
||
for (k = 1; k <= nenhere;) {
|
||
int ii = kx[k], jj = ky[k];
|
||
int ienm = quad[ii][jj];
|
||
if (msgflag) {
|
||
proutn("<EFBFBD>¥à£¨¨ ¤®áâ㯮= ");/*Energy available*/
|
||
cramf(energy-.006-(ifast?200:0), 0, 2);
|
||
skip(1);
|
||
msgflag = 0;
|
||
rpow = 0.0;
|
||
}
|
||
if (damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&
|
||
(ienm == IHC || ienm == IHS)) {
|
||
cramen(ienm);
|
||
/* prout(" can't be located without short range scan.");*/
|
||
prout(" ¥¢®§¬®¦® ®¡ à㦥¨¥ ¡¥§ á¥á®à®¢ ¡«¨¦¥£® à ¤¨ãá .");
|
||
chew();
|
||
key = IHEOL;
|
||
hits[k] = 0; /* prevent overflow -- thanks to Alexei Voitenko */
|
||
k++;
|
||
continue;
|
||
}
|
||
if (key == IHEOL) {
|
||
chew();
|
||
if (ipoop && k > kz) {
|
||
int irec=(fabs(kpower[k])/(phasefac*pow(0.9,kdist[k])))*
|
||
(1.01+0.05*Rand()) + 1.0;
|
||
kz = k;
|
||
proutn("(");
|
||
crami(irec, 1);
|
||
proutn(") ");
|
||
}
|
||
proutn("¥¤¨¨æ § âà â¨âì ¯® â®çª¥ ");/*units to fire at*/
|
||
crmena(0, ienm, 2, ii, jj);
|
||
proutn("- ");
|
||
key = scan();
|
||
}
|
||
if (key == IHALPHA && isit("no")) {
|
||
no = 1;
|
||
key = scan();
|
||
continue;
|
||
}
|
||
if (key == IHALPHA) {
|
||
huh();
|
||
ididit = 0;
|
||
return;
|
||
}
|
||
if (key == IHEOL) {
|
||
if (k==1) { /* Let me say I'm baffled by this */
|
||
msgflag = 1;
|
||
}
|
||
continue;
|
||
}
|
||
if (aaitem < 0) {
|
||
/* abort out */
|
||
ididit = 0;
|
||
chew();
|
||
return;
|
||
}
|
||
hits[k] = aaitem;
|
||
rpow += aaitem;
|
||
/* If total requested is too much, inform and start over */
|
||
|
||
if (rpow >= (ifast?energy-200:energy)) {
|
||
/* prout("Available energy exceeded -- try again.");*/
|
||
prout("<EFBFBD>ॢëè¥ § ¯ á í¥à£¨¨ -- ¯®¢â®à¨â¥.");
|
||
chew();
|
||
key = IHEOL;
|
||
k = 1;
|
||
msgflag = 1;
|
||
continue;
|
||
}
|
||
key = scan(); /* scan for next value */
|
||
k++;
|
||
}
|
||
if (rpow == 0.0) {
|
||
/* zero energy -- abort */
|
||
ididit = 0;
|
||
chew();
|
||
return;
|
||
}
|
||
if (key == IHALPHA && isit("no")) {
|
||
no = 1;
|
||
}
|
||
energy -= rpow;
|
||
chew();
|
||
if (ifast) {
|
||
energy -= 200.0;
|
||
if (checkshctrl(rpow)) return;
|
||
}
|
||
hittem(hits);
|
||
ididit=1;
|
||
break;
|
||
case NOTSET: break; // cannot occur
|
||
}
|
||
/* Say shield raised or malfunction, if necessary */
|
||
if (alldone) return;
|
||
if (ifast) {
|
||
skip(1);
|
||
if (no == 0) {
|
||
if (Rand() >= 0.99) {
|
||
/* prout("Sulu- \"Sir, the high-speed shield control has malfunctioned . . .");
|
||
prouts(" CLICK CLICK POP . . .");
|
||
prout(" No response, sir!");*/
|
||
prout("‘ã«ã- \"‘íà, ¯ ¥«ì ¡ëáâண® ॣ㫨஢ ¨ï ᨫ®¢ëå é¨â®¢ ¥ à ¡®â ¥â . . .");
|
||
prouts(" Š‹ˆŠ Š‹ˆŠ <20>“Œ . . .");
|
||
prout(" <20>¥ ॠ£¨àã¥â, ‘íà!");
|
||
shldup = 0;
|
||
}
|
||
else
|
||
prout("‘¨«®¢ë¥ é¨âë ªâ¨¢¨à®¢ ë.");/*Shields raised*/
|
||
}
|
||
else
|
||
shldup = 0;
|
||
}
|
||
overheat(rpow);
|
||
}
|
||
|
||
void hittem(double *hits) {
|
||
double kp, kpow, wham, hit, dustfac, kpini;
|
||
int nenhr2=nenhere, k=1, kk=1, ii, jj, ienm;
|
||
|
||
skip(1);
|
||
|
||
for (; k <= nenhr2; k++, kk++) {
|
||
if ((wham = hits[k])==0) continue;
|
||
dustfac = 0.9 + 0.01*Rand();
|
||
hit = wham*pow(dustfac,kdist[kk]);
|
||
kpini = kpower[kk];
|
||
kp = fabs(kpini);
|
||
if (phasefac*hit < kp) kp = phasefac*hit;
|
||
kpower[kk] -= (kpower[kk] < 0 ? -kp: kp);
|
||
kpow = kpower[kk];
|
||
ii = kx[kk];
|
||
jj = ky[kk];
|
||
if (hit > 0.005) {
|
||
cramf(hit, 0, 2);
|
||
proutn(" ¬®¤ã«ì ¯®¢à¥¦¤¥ ¢ â®çª¥ ");/*unit hit on*/
|
||
}
|
||
else
|
||
proutn("Œ «®¥ ¯®¢à¥¦¤¥¨¥ ¢ â®çª¥ ");/*Very small hit on*/
|
||
ienm = quad[ii][jj];
|
||
crmena(0,ienm,2,ii,jj);
|
||
skip(1);
|
||
if (kpow == 0) {
|
||
deadkl(ii, jj, ienm, ii, jj);
|
||
if (d.remkl==0) finish(FWON);
|
||
if (alldone) return;
|
||
kk--; /* don't do the increment */
|
||
}
|
||
else /* decide whether or not to emasculate klingon */
|
||
if (kpow > 0 && Rand() >= 0.9 &&
|
||
kpow <= ((0.4 + 0.4*Rand())*kpini)) {
|
||
/* proutn("***Mr. Spock- \"Captain, the vessel at");*/
|
||
proutn("***Œ¨áâ¥à ‘¯®ª- \"Š ¯¨â , á㤮 ¢ â®çª¥");
|
||
cramlc(2,ii,jj);
|
||
skip(1);
|
||
prout(" ⮫쪮 çâ® «¨è¨«®áì ®£¥¢®© ¬®é¨.\"");/*has just lost its firepower*/
|
||
kpower[kk] = -kpow;
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
#ifdef CAPTURE
|
||
/* $NetBSD: capture.c,v 1.6 2003/08/07 09:37:50 agc Exp $ */
|
||
|
||
/*
|
||
* Copyright (c) 1980, 1993
|
||
* The Regents of the University of California. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. Neither the name of the University nor the names of its contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*/
|
||
|
||
/*
|
||
** Ask a Klingon To Surrender
|
||
**
|
||
** (Fat chance)
|
||
**
|
||
** The Subspace Radio is needed to ask a Klingon if he will kindly
|
||
** surrender. A random Klingon from the ones in the quadrant is
|
||
** chosen.
|
||
**
|
||
** The Klingon is requested to surrender. The probability of this
|
||
** is a function of that Klingon's remaining power, our power,
|
||
** etc.
|
||
*/
|
||
|
||
int selectklingon(void);
|
||
|
||
void
|
||
capture(void)
|
||
{
|
||
int i;
|
||
int k;
|
||
double x;
|
||
|
||
ididit = FALSE; // Nothing if we fail
|
||
Time = 0.0;
|
||
|
||
/* Make sure there is room in the brig */
|
||
if (brigfree == 0)
|
||
{
|
||
/* printf("Security reports the brig is already full.\n");*/
|
||
printf("‘«ã¦¡ ¡¥§®¯ á®á⨠¤®ª« ¤ë¢ ¥â, çâ® ª®à ¡«ì ¯¥à¥¯®«¥.\n");
|
||
return;
|
||
}
|
||
|
||
if (!REPORTS) {
|
||
/* printf("Uhura- \"We have no subspace radio communication, sir.\"\n");*/
|
||
printf("“åãà - \"<EFBFBD> ¤¨®á¨£ «ë ®âáãâáâ¢ãîâ, ‘íà.\"\n");
|
||
return;
|
||
}
|
||
|
||
if (damage[DTRANSP] != 0) {
|
||
/* printf("Scotty- \"Transporter damaged, sir.\"\n");*/
|
||
printf("‘ª®ââ¨- \"’à ᯮàâ ¯®¢à¥¦¤¥, ‘íà.\"\n");
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
/* find out if there are any at all */
|
||
if (klhere < 1)
|
||
{
|
||
/* printf("Uhura- \"Getting no response, sir.\"\n");*/
|
||
printf("“åãà - \"<EFBFBD>¨ªâ® ¥ ®â¢¥ç ¥â, ‘íà.\"\n");
|
||
return;
|
||
}
|
||
|
||
/* if there is more than one Klingon, find out which one */
|
||
k = selectklingon();
|
||
Time = 0.05; // This action will take some time
|
||
ididit = TRUE; // So any others can strike back
|
||
|
||
/* check out that Klingon */
|
||
/* The algorithm isn't that great and could use some more
|
||
* intelligent design */
|
||
// x = 300 + 25*skill;
|
||
x = energy;
|
||
x /= kpower[k] * nenhere;
|
||
x *= 2.5; /* would originally have been equivalent of 1.4, but we want command to work more often, more humanely */
|
||
i = x;
|
||
#ifdef DEBUG
|
||
printf("Prob = %d (%.4f)\n", i, x);
|
||
// i = 100; // For testing, of course!
|
||
#endif
|
||
if (i > 100*Rand())
|
||
{
|
||
/* guess what, he surrendered!!! */
|
||
/* printf("Klingon captain at %d,%d surrenders\n", kx[k], ky[k]);*/
|
||
printf("Š«¨£®áª¨© ª ¯¨â ¢ â®çª¥ %d,%d ᤠ¥âáï\n", kx[k], ky[k]);
|
||
i = 200*Rand();
|
||
if ( i > 0 )
|
||
/* printf("%d Klingons commit suicide rather than be taken captive\n", 200 - i);*/
|
||
printf("%d ª«¨£®®¢ ¯à¥¤¯®ç«¨ á ¬®ã¡¨©á⢮ á¤ ç¥ ¢ ¯«¥\n", 200 - i);
|
||
if (i > brigfree)
|
||
{
|
||
/* printf("%d Klingons die because there is no room for them in the brig.\n", i-brigfree);*/
|
||
printf("%d ª«¨£®®¢ 㬥૮, ¯®áª®«ìª® ¤«ï ¨å ¥ å¢ â¨«® ¦¨«®£® ¯à®áâà á⢠ª®à ¡«¥.\n", i-brigfree);
|
||
i = brigfree;
|
||
}
|
||
brigfree -= i;
|
||
printf("%d captives taken\n", i);
|
||
deadkl(kx[k], ky[k], quad[kx[k]][ky[k]], kx[k], ky[k]);
|
||
if (d.remkl==0) finish(FWON);
|
||
return;
|
||
}
|
||
|
||
/* big surprise, he refuses to surrender */
|
||
printf("<EFBFBD>®«ìè ï 㤠ç , ª ¯¨â \n");/*Fat chance, captain*/
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
** SELECT A KLINGON
|
||
**
|
||
** Cruddy, just takes one at random. Should ask the captain.
|
||
** Nah, just select the weakest one since it is most likely to
|
||
** surrender (Tom Almy mod)
|
||
*/
|
||
|
||
int selectklingon()
|
||
{
|
||
int i;
|
||
|
||
if (nenhere < 2)
|
||
i = 1;
|
||
else
|
||
{ // Select the weakest one
|
||
double pow = 1e6;
|
||
int j;
|
||
for (j=1; j <= nenhere; j++)
|
||
{
|
||
if (quad[kx[j]][ky[j]] == IHR) continue; // No Romulans surrender
|
||
if (kpower[j]< pow)
|
||
{
|
||
pow = kpower[j];
|
||
i = j;
|
||
}
|
||
}
|
||
}
|
||
return i;
|
||
}
|
||
|
||
#endif |