+#ifdef SERGEEV\r
+#include <conio.h>\r
+#include <unistd.h>\r
+#include "sstlinux.h"\r
+#endif /* SERGEEV */\r
#include "sst.h"\r
\r
void doshield(int i) {\r
action = NRG;\r
else {\r
chew();\r
- if (frozen.damage[DSHIELD]) {\r
+ if (game.damage[DSHIELD]) {\r
prout("Shields damaged and down.");\r
return;\r
}\r
proutn("Energy to transfer to shields- ");\r
action = NRG;\r
}\r
- else if (frozen.damage[DSHIELD]) {\r
+ else if (game.damage[DSHIELD]) {\r
prout("Shields damaged and down.");\r
return;\r
}\r
shield += aaitem;\r
energy -= aaitem;\r
return;\r
+ case NONE:; /* avoid gcc warning */\r
}\r
}\r
\r
case IHC: type = 2.0; break;\r
case IHS: type = 2.5; break;\r
case IHT: type = 0.5; break;\r
+ case IHQUEST: type = 4.0; break;\r
}\r
proutn(ibumpd ? " rammed by " : " rams ");\r
crmena(0, ienm, 2, ix, iy);\r
crmshp();\r
prout(" heavily damaged.");\r
icas = 10.0+20.0*Rand();\r
- proutn("***Sickbay reports ");\r
- crami(icas, 1);\r
- prout(" casualties.");\r
+ prout("***Sickbay reports %d casualties", icas);\r
casual += icas;\r
- for (l=1; l <= ndevice; l++) {\r
+ for (l=1; l <= NDEVICES; l++) {\r
if (l == DDRAY) continue; // Don't damage deathray \r
- if (frozen.damage[l] < 0) continue;\r
+ if (game.damage[l] < 0) continue;\r
extradm = (10.0*type*Rand()+1.0)*damfac;\r
- frozen.damage[l] += Time + extradm; /* Damage for at least time of travel! */\r
+ game.damage[l] += Time + extradm; /* Damage for at least time of travel! */\r
}\r
shldup = 0;\r
- if (state.remkl) {\r
- pause(2);\r
+ if (game.state.remkl) {\r
+ pause_game(2);\r
dreprt();\r
}\r
else finish(FWON);\r
return;\r
}\r
\r
-void torpedo(double course, double r, int inx, int iny, double *hit) {\r
- int l, iquad, ix, iy, jx, jy, shoved=0, ll;\r
+void torpedo(double course, double r, int inx, int iny, double *hit, int wait) {\r
+ int l, iquad=0, ix=0, iy=0, jx=0, jy=0, shoved=0, ll;\r
+#ifdef SERGEEV\r
+ int crx,cry;\r
+ \r
+#endif /* SERGEEV */\r
double ac=course + 0.25*r;\r
double angle = (15.0-ac)*0.5235988;\r
double bullseye = (15.0 - course)*0.5235988;\r
if (fabs(deltay) > bigger) bigger = fabs(deltay);\r
deltax /= bigger;\r
deltay /= bigger;\r
-\r
+#ifdef SERGEEV\r
+ crx=wherex();\r
+ cry=wherey();\r
+ if (game.damage[DSRSENS]==0 || condit==IHDOCKED) setwnd(1);\r
+ else setwnd(4);\r
+#endif /* SERGEEV */\r
/* Loop to move a single torpedo */\r
for (l=1; l <= 15; l++) {\r
x += deltax;\r
y += deltay;\r
iy = y + 0.5;\r
if (iy < 1 || iy > 10) break;\r
+#ifndef SERGEEV\r
if (l==4 || l==9) skip(1);\r
- cramf(x, 0, 1);\r
- proutn(" - ");\r
- cramf(y, 0, 1);\r
- proutn(" ");\r
- iquad=frozen.quad[ix][iy];\r
+ proutn("%d - %d ", (int)x, (int)y);\r
+ iquad=game.quad[ix][iy];\r
+#else\r
+ iquad=game.quad[ix][iy];\r
+ if (game.damage[DSRSENS]==0 || condit==IHDOCKED){\r
+ drawmaps(2);\r
+ delay((wait!=1)*400);\r
+ wait=1;\r
+ gotoxy(iy*2+3,ix+2);\r
+ if ((game.quad[ix][iy]==IHDOT)||(game.quad[ix][iy]==IHBLANK)){\r
+ game.quad[ix][iy]='+';\r
+ drawmaps(2);\r
+ game.quad[ix][iy]=iquad;\r
+ sound(l*10);\r
+ delay(100);\r
+ nosound();\r
+ }\r
+ else {\r
+ game.quad[ix][iy]|=128;\r
+ drawmaps(2);\r
+ game.quad[ix][iy]=iquad;\r
+ _setcursortype(_NOCURSOR);\r
+ sound(500);\r
+ delay(1000);\r
+ nosound();\r
+ lowvideo();\r
+ _setcursortype(_NORMALCURSOR);\r
+ }\r
+ }\r
+ else {\r
+ proutn("%d - %d ", (int)x, (int)y);\r
+ }\r
+#endif /* SERGEEV */\r
if (iquad==IHDOT) continue;\r
/* hit something */\r
+#ifndef SERGEEV\r
skip(1);\r
+#else\r
+ setwnd(4);\r
+ gotoxy(crx,cry);\r
+#endif\r
switch(iquad) {\r
case IHE: /* Hit our ship */\r
case IHF:\r
1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
fabs(sin(bullseye-angle));\r
*hit = fabs(*hit);\r
+#ifndef SERGEEV\r
newcnd(); /* undock */\r
+#endif /* SERGEEV */\r
/* We may be displaced. */\r
- if (landed==1) return; /* Cheat if on a planet */\r
+ if (landed==1 || condit==IHDOCKED) return; /* Cheat if on a planet */\r
ang = angle + 2.5*(Rand()-0.5);\r
temp = fabs(sin(ang));\r
if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));\r
jx=ix+xx+0.5;\r
jy=iy+yy+0.5;\r
if (jx<1 || jx>10 || jy<1 ||jy > 10) return;\r
- if (frozen.quad[jx][jy]==IHBLANK) {\r
+ if (game.quad[jx][jy]==IHBLANK) {\r
finish(FHOLE);\r
return;\r
}\r
- if (frozen.quad[jx][jy]!=IHDOT) {\r
+ if (game.quad[jx][jy]!=IHDOT) {\r
/* can't move into object */\r
return;\r
}\r
case IHK:\r
/* find the enemy */\r
for (ll=1; ll <= nenhere; ll++)\r
- if (ix==frozen.kx[ll] && iy==frozen.ky[ll]) break;\r
- kp = fabs(frozen.kpower[ll]);\r
+ if (ix==game.kx[ll] && iy==game.ky[ll]) break;\r
+ kp = fabs(game.kpower[ll]);\r
h1 = 700.0 + 100.0*Rand() -\r
1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
fabs(sin(bullseye-angle));\r
h1 = fabs(h1);\r
if (kp < h1) h1 = kp;\r
- frozen.kpower[ll] -= (frozen.kpower[ll]<0 ? -h1 : h1);\r
- if (frozen.kpower[ll] == 0) {\r
+ game.kpower[ll] -= (game.kpower[ll]<0 ? -h1 : h1);\r
+ if (game.kpower[ll] == 0) {\r
deadkl(ix, iy, iquad, ix, iy);\r
return;\r
}\r
prout(" damaged but not destroyed.");\r
return;\r
}\r
- if (frozen.quad[jx][jy]==IHBLANK) {\r
+ if (game.quad[jx][jy]==IHBLANK) {\r
prout(" buffeted into black hole.");\r
deadkl(ix, iy, iquad, jx, jy);\r
return;\r
}\r
- if (frozen.quad[jx][jy]!=IHDOT) {\r
+ if (game.quad[jx][jy]!=IHDOT) {\r
/* can't move into object */\r
prout(" damaged but not destroyed.");\r
return;\r
}\r
- prout(" damaged--");\r
- frozen.kx[ll] = jx;\r
- frozen.ky[ll] = jy;\r
+ proutn(" damaged--");\r
+ game.kx[ll] = jx;\r
+ game.ky[ll] = jy;\r
shoved = 1;\r
break;\r
case IHB: /* Hit a base */\r
+ skip(1);\r
prout("***STARBASE DESTROYED..");\r
- if (frozen.starch[quadx][quady] < 0) frozen.starch[quadx][quady] = 0;\r
- for (ll=1; ll<=state.rembase; ll++) {\r
- if (state.baseqx[ll]==quadx && state.baseqy[ll]==quady) {\r
- state.baseqx[ll]=state.baseqx[state.rembase];\r
- state.baseqy[ll]=state.baseqy[state.rembase];\r
+ if (game.starch[quadx][quady] < 0) game.starch[quadx][quady] = 0;\r
+ for (ll=1; ll<=game.state.rembase; ll++) {\r
+ if (game.state.baseqx[ll]==quadx && game.state.baseqy[ll]==quady) {\r
+ game.state.baseqx[ll]=game.state.baseqx[game.state.rembase];\r
+ game.state.baseqy[ll]=game.state.baseqy[game.state.rembase];\r
break;\r
}\r
}\r
- frozen.quad[ix][iy]=IHDOT;\r
- state.rembase--;\r
+ game.quad[ix][iy]=IHDOT;\r
+ game.state.rembase--;\r
basex=basey=0;\r
- state.galaxy[quadx][quady] -= 10;\r
- state.basekl++;\r
+ game.state.galaxy[quadx][quady] -= 10;\r
+ game.state.basekl++;\r
newcnd();\r
return;\r
case IHP: /* Hit a planet */\r
crmena(1, iquad, 2, ix, iy);\r
prout(" destroyed.");\r
- state.nplankl++;\r
- state.newstuf[quadx][quady] -= 1;\r
- state.plnets[iplnet] = nulplanet;\r
+ game.state.nplankl++;\r
+ game.state.newstuf[quadx][quady] -= 1;\r
+ DESTROY(&game.state.plnets[iplnet]);\r
iplnet = 0;\r
plnetx = plnety = 0;\r
- frozen.quad[ix][iy] = IHDOT;\r
+ game.quad[ix][iy] = IHDOT;\r
if (landed==1) {\r
/* captain parishes on planet */\r
finish(FDPLANET);\r
prout(" unaffected by photon blast.");\r
return;\r
case IHQUEST: /* Hit a thingy */\r
+ if (Rand()>0.7) { // Used to be certain death \r
skip(1);\r
prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!");\r
skip(1);\r
prouts(" HACK! HACK! HACK! *CHOKE!* ");\r
skip(1);\r
proutn("Mr. Spock-");\r
- prouts(" \"Facinating!\"");\r
+ prouts(" \"Fascinating!\"");\r
skip(1);\r
- frozen.quad[ix][iy] = IHDOT;\r
- return;\r
+ deadkl(ix, iy, iquad, ix, iy);\r
+ } else {\r
+ /*\r
+ * Stas Sergeev added the possibility that\r
+ * you can shove the Thingy.\r
+ */\r
+ iqengry=1;\r
+ shoved=1;\r
+ }\r
+ return;\r
case IHBLANK: /* Black hole */\r
skip(1);\r
crmena(1, IHBLANK, 2, ix, iy);\r
prout("***Torpedo absorbed by Tholian web.");\r
return;\r
case IHT: /* Hit a Tholian */\r
- skip(1);\r
- crmena(1, IHT, 2, ix, iy);\r
h1 = 700.0 + 100.0*Rand() -\r
1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
fabs(sin(bullseye-angle));\r
h1 = fabs(h1);\r
if (h1 >= 600) {\r
+#ifndef SERGEEV\r
prout(" destroyed.");\r
- frozen.quad[ix][iy] = IHDOT;\r
+#endif /* SERGEEV */\r
+ game.quad[ix][iy] = IHDOT;\r
ithere = 0;\r
ithx = ithy = 0;\r
+#ifdef SERGEEV\r
+ deadkl(ix, iy, iquad, ix, iy);\r
+#endif /* SERGEEV */\r
return;\r
}\r
+ skip(1);\r
+ crmena(1, IHT, 2, ix, iy);\r
if (Rand() > 0.05) {\r
prout(" survives photon blast.");\r
return;\r
}\r
prout(" disappears.");\r
- frozen.quad[ix][iy] = IHWEB;\r
+ game.quad[ix][iy] = IHWEB;\r
ithere = ithx = ithy = 0;\r
+ nenhere--;\r
{\r
int dum, my;\r
dropin(IHBLANK, &dum, &my);\r
}\r
break;\r
}\r
+#ifdef SERGEEV\r
+ if(curwnd!=4) {\r
+ setwnd(4);\r
+ gotoxy(crx,cry);\r
+ }\r
+#endif /* SERGEEV */\r
if (shoved) {\r
- frozen.quad[jx][jy]=iquad;\r
- frozen.quad[ix][iy]=IHDOT;\r
- proutn(" displaced by blast to");\r
- cramlc(2, jx, jy);\r
- skip(1);\r
+ game.quad[jx][jy]=iquad;\r
+ game.quad[ix][iy]=IHDOT;\r
+ prout(" displaced by blast to %s ", cramlc(sector, jx, jy));\r
for (ll=1; ll<=nenhere; ll++)\r
- frozen.kdist[ll] = frozen.kavgd[ll] = sqrt(square(sectx-frozen.kx[ll])+square(secty-frozen.ky[ll]));\r
+ game.kdist[ll] = game.kavgd[ll] = sqrt(square(sectx-game.kx[ll])+square(secty-game.ky[ll]));\r
sortkl();\r
return;\r
}\r
+#ifndef SERGEEV\r
skip(1);\r
+#endif /* SERGEEV */\r
prout("Torpedo missed.");\r
return;\r
}\r
\r
static void fry(double hit) {\r
double ncrit, extradm;\r
- int ktr=1, l, ll, j, cdam[6], crptr;\r
+ int ktr=1, l, ll, j, cdam[NDEVICES+1];\r
\r
/* a critical hit occured */\r
if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return;\r
ncrit = 1.0 + hit/(500.0+100.0*Rand());\r
proutn("***CRITICAL HIT--");\r
/* Select devices and cause damage */\r
- for (l = 1; l <= ncrit; l++) {\r
+ for (l = 1; l <= ncrit && l <= NDEVICES; l++) {\r
do {\r
- j = ndevice*Rand()+1.0;\r
+ j = NDEVICES*Rand()+1.0;\r
/* Cheat to prevent shuttle damage unless on ship */\r
- } while (frozen.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||\r
+ } while (game.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||\r
j == DDRAY);\r
cdam[l] = j;\r
extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand()));\r
- frozen.damage[j] += extradm;\r
+ game.damage[j] += extradm;\r
if (l > 1) {\r
for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ;\r
if (ll<=l) continue;\r
proutn(device[j]);\r
}\r
prout(" damaged.");\r
- if (frozen.damage[DSHIELD] && shldup) {\r
+ if (game.damage[DSHIELD] && shldup) {\r
prout("***Shields knocked down.");\r
shldup=0;\r
}\r
neutz = 0;\r
return;\r
}\r
- if (((comhere || ishere) && (justin == 0)) || skill == 5) movcom();\r
- if (nenhere==0) return;\r
+ if ((((comhere || ishere) && (justin == 0)) || skill == 5)&&(k!=0)) movcom();\r
+ if (nenhere==0 || (nenhere==1 && iqhere && iqengry==0)) return;\r
pfac = 1.0/inshld;\r
if (shldchg == 1) chgfac = 0.25+0.5*Rand();\r
skip(1);\r
if (skill <= 2) i = 2;\r
for (l=1; l <= nenhere; l++) {\r
- if (frozen.kpower[l] < 0) continue; /* too weak to attack */\r
+ if (game.kpower[l] < 0) continue; /* too weak to attack */\r
/* compute hit strength and diminsh shield power */\r
r = Rand();\r
/* Increase chance of photon torpedos if docked or enemy energy low */\r
if (condit == IHDOCKED) r *= 0.25;\r
- if (frozen.kpower[l] < 500) r *= 0.25; \r
- jx = frozen.kx[l];\r
- jy = frozen.ky[l];\r
- iquad = frozen.quad[jx][jy];\r
+ if (game.kpower[l] < 500) r *= 0.25; \r
+ jx = game.kx[l];\r
+ jy = game.ky[l];\r
+ iquad = game.quad[jx][jy];\r
+ if (iquad==IHT || (iquad==IHQUEST && !iqengry)) continue;\r
itflag = (iquad == IHK && r > 0.0005) || k == 0 ||\r
(iquad==IHC && r > 0.015) ||\r
(iquad==IHR && r > 0.3) ||\r
- (iquad==IHS && r > 0.07);\r
+ (iquad==IHS && r > 0.07) ||\r
+ (iquad==IHQUEST && r > 0.05);\r
if (itflag) {\r
/* Enemy uses phasers */\r
if (condit == IHDOCKED) continue; /* Don't waste the effort! */\r
attempt = 1; /* Attempt to attack */\r
dustfac = 0.8+0.05*Rand();\r
- hit = frozen.kpower[l]*pow(dustfac,frozen.kavgd[l]);\r
- frozen.kpower[l] *= 0.75;\r
+ hit = game.kpower[l]*pow(dustfac,game.kavgd[l]);\r
+ game.kpower[l] *= 0.75;\r
}\r
else { /* Enemy used photon torpedo */\r
double course = 1.90985*atan2((double)secty-jy, (double)jx-sectx);\r
hit = 0;\r
proutn("***TORPEDO INCOMING");\r
- if (frozen.damage[DSRSENS] <= 0.0) {\r
+ if (game.damage[DSRSENS] <= 0.0) {\r
proutn(" From ");\r
crmena(0, iquad, i, jx, jy);\r
}\r
attempt = 1;\r
- prout("--");\r
+ prout(" ");\r
r = (Rand()+Rand())*0.5 -0.5;\r
- r += 0.002*frozen.kpower[l]*r;\r
- torpedo(course, r, jx, jy, &hit);\r
- if (state.remkl==0) finish(FWON); /* Klingons did themselves in! */\r
- if (state.galaxy[quadx][quady] == 1000 ||\r
+ r += 0.002*game.kpower[l]*r;\r
+ torpedo(course, r, jx, jy, &hit, 0);\r
+ if (game.state.remkl==0) finish(FWON); /* Klingons did themselves in! */\r
+ if (game.state.galaxy[quadx][quady] == 1000 ||\r
alldone) return; /* Supernova or finished */\r
if (hit == 0) continue;\r
}\r
- if (shldup != 0 || shldchg != 0) {\r
+ if (shldup != 0 || shldchg != 0 || condit==IHDOCKED) {\r
/* shields will take hits */\r
- double absorb, hitsh, propor = pfac*shield;\r
+ double absorb, hitsh, propor = pfac*shield*(condit==IHDOCKED ? 2.1 : 1.0);\r
if(propor < 0.1) propor = 0.1;\r
hitsh = propor*chgfac*hit+1.0;\r
atackd=1;\r
if (absorb > shield) absorb = shield;\r
shield -= absorb;\r
hit -= hitsh;\r
+ if (condit==IHDOCKED) dock(0);\r
if (propor > 0.1 && hit < 0.005*energy) continue;\r
}\r
/* It's a hit -- print out hit size */\r
shields were down for some strange reason. This\r
doesn't make any sense, so I've fixed it */\r
ihurt = 1;\r
- cramf(hit, 0, 2);\r
- proutn(" unit hit");\r
- if ((frozen.damage[DSRSENS] > 0 && itflag) || skill <= 2) {\r
+ proutn("%d unit hit", (int)hit);\r
+ if ((game.damage[DSRSENS] > 0 && itflag) || skill <= 2) {\r
proutn(" on the ");\r
crmshp();\r
}\r
- if (frozen.damage[DSRSENS] <= 0.0 && itflag) {\r
+ if (game.damage[DSRSENS] <= 0.0 && itflag) {\r
proutn(" from ");\r
crmena(0, iquad, i, jx, jy);\r
}\r
if (hit > hitmax) hitmax = hit;\r
hittot += hit;\r
fry(hit);\r
- printf("Hit %g energy %g\n", hit, energy);\r
+ prout("Hit %g energy %g", hit, energy);\r
energy -= hit;\r
+ if (condit==IHDOCKED) dock(0);\r
}\r
if (energy <= 0) {\r
/* Returning home upon your shield, not with it... */\r
else {\r
/* Print message if starship suffered hit(s) */\r
skip(1);\r
- proutn("Energy left ");\r
- cramf(energy, 0, 2);\r
- proutn(" shields ");\r
- if (shldup) proutn("up, ");\r
- else if (frozen.damage[DSHIELD] == 0) proutn("down, ");\r
+ proutn("Energy left %2d shields ", (int)energy);\r
+ if (shldup) proutn("up ");\r
+ else if (game.damage[DSHIELD] == 0) proutn("down ");\r
else proutn("damaged, ");\r
}\r
- crami(percent, 1);\r
- proutn("% torpedoes left ");\r
- crami(torps, 1);\r
- skip(1);\r
+ prout("%d%%, torpedoes left %d", percent, torps);\r
/* Check if anyone was hurt */\r
if (hitmax >= 200 || hittot >= 500) {\r
int icas= hittot*Rand()*0.015;\r
if (icas >= 2) {\r
skip(1);\r
- proutn("Mc Coy- \"Sickbay to bridge. We suffered ");\r
- crami(icas, 1);\r
- prout(" casualties");\r
+ prout("Mc Coy- \"Sickbay to bridge. We suffered %d casualties", icas);\r
prout(" in that last attack.\"");\r
casual += icas;\r
}\r
}\r
/* After attack, reset average distance to enemies */\r
for (l = 1; l <= nenhere; l++)\r
- frozen.kavgd[l] = frozen.kdist[l];\r
+ game.kavgd[l] = game.kdist[l];\r
sortkl();\r
return;\r
}\r
/* Added ixx and iyy allow enemy to "move" before dying */\r
\r
int i,j;\r
- \r
+\r
+#ifdef SERGEEV \r
+ skip(1);\r
+#endif /* SERGEEV */\r
crmena(1, type, 2, ixx, iyy);\r
/* Decide what kind of enemy it is and update approriately */\r
if (type == IHR) {\r
/* chalk up a Romulan */\r
- state.newstuf[quadx][quady] -= 10;\r
+ game.state.newstuf[quadx][quady] -= 10;\r
irhere--;\r
- state.nromkl++;\r
- state.nromrem--;\r
+ game.state.nromkl++;\r
+ game.state.nromrem--;\r
}\r
else if (type == IHT) {\r
/* Killed a Tholian */\r
ithere = 0;\r
}\r
+ else if (type == IHQUEST) {\r
+ /* Killed a Thingy */\r
+ iqhere=iqengry=thingx=thingy=0;\r
+ }\r
else {\r
/* Some type of a Klingon */\r
- state.galaxy[quadx][quady] -= 100;\r
+ game.state.galaxy[quadx][quady] -= 100;\r
klhere--;\r
- state.remkl--;\r
+ game.state.remkl--;\r
switch (type) {\r
case IHC:\r
comhere = 0;\r
- for (i=1; i<=state.remcom; i++)\r
- if (state.cx[i]==quadx && state.cy[i]==quady) break;\r
- state.cx[i] = state.cx[state.remcom];\r
- state.cy[i] = state.cy[state.remcom];\r
- state.cx[state.remcom] = 0;\r
- state.cy[state.remcom] = 0;\r
- state.remcom--;\r
- frozen.future[FTBEAM] = 1e30;\r
- if (state.remcom != 0)\r
- frozen.future[FTBEAM] = state.date + expran(1.0*incom/state.remcom);\r
- state.killc++;\r
+ for (i=1; i<=game.state.remcom; i++)\r
+ if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;\r
+ game.state.cx[i] = game.state.cx[game.state.remcom];\r
+ game.state.cy[i] = game.state.cy[game.state.remcom];\r
+ game.state.cx[game.state.remcom] = 0;\r
+ game.state.cy[game.state.remcom] = 0;\r
+ game.state.remcom--;\r
+ game.future[FTBEAM] = 1e30;\r
+ if (game.state.remcom != 0)\r
+ game.future[FTBEAM] = game.state.date + expran(1.0*incom/game.state.remcom);\r
+ game.state.killc++;\r
break;\r
case IHK:\r
- state.killk++;\r
+ game.state.killk++;\r
break;\r
case IHS:\r
- state.nscrem = ishere = state.isx = state.isy = isatb = iscate = 0;\r
- state.nsckill = 1;\r
- frozen.future[FSCMOVE] = frozen.future[FSCDBAS] = 1e30;\r
+ game.state.nscrem = ishere = game.state.isx = game.state.isy = isatb = iscate = 0;\r
+ game.state.nsckill = 1;\r
+ game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;\r
break;\r
}\r
}\r
\r
/* For each kind of enemy, finish message to player */\r
prout(" destroyed.");\r
- frozen.quad[ix][iy] = IHDOT;\r
- if (state.remkl==0) return;\r
+ game.quad[ix][iy] = IHDOT;\r
+ if (game.state.remkl==0) return;\r
\r
- state.remtime = state.remres/(state.remkl + 4*state.remcom);\r
-\r
- if (type == IHT) return;\r
+ game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom);\r
\r
/* Remove enemy ship from arrays describing local conditions */\r
-\r
+ if (game.future[FCDBAS] < 1e30 && batx==quadx && baty==quady && type==IHC)\r
+ game.future[FCDBAS] = 1e30;\r
for (i=1; i<=nenhere; i++)\r
- if (frozen.kx[i]==ix && frozen.ky[i]==iy) break;\r
+ if (game.kx[i]==ix && game.ky[i]==iy) break;\r
nenhere--;\r
if (i <= nenhere) {\r
for (j=i; j<=nenhere; j++) {\r
- frozen.kx[j] = frozen.kx[j+1];\r
- frozen.ky[j] = frozen.ky[j+1];\r
- frozen.kpower[j] = frozen.kpower[j+1];\r
- frozen.kavgd[j] = frozen.kdist[j] = frozen.kdist[j+1];\r
+ game.kx[j] = game.kx[j+1];\r
+ game.ky[j] = game.ky[j+1];\r
+ game.kpower[j] = game.kpower[j+1];\r
+ game.kavgd[j] = game.kdist[j] = game.kdist[j+1];\r
}\r
}\r
- frozen.kx[nenhere+1] = 0;\r
- frozen.ky[nenhere+1] = 0;\r
- frozen.kdist[nenhere+1] = 0;\r
- frozen.kavgd[nenhere+1] = 0;\r
- frozen.kpower[nenhere+1] = 0;\r
+ game.kx[nenhere+1] = 0;\r
+ game.ky[nenhere+1] = 0;\r
+ game.kdist[nenhere+1] = 0;\r
+ game.kavgd[nenhere+1] = 0;\r
+ game.kpower[nenhere+1] = 0;\r
return;\r
}\r
\r
skip(1);\r
prout("Spock- \"Bridge to sickbay. Dr. McCoy,");\r
prout(" I recommend an immediate review of");\r
- prout(" the Captain's psychological profile.");\r
+ prout(" the Captain's psychological profile.\"");\r
chew();\r
return 1;\r
}\r
\r
ididit = 0;\r
\r
- if (frozen.damage[DPHOTON]) {\r
+ if (game.damage[DPHOTON]) {\r
prout("Photon tubes damaged.");\r
chew();\r
return;\r
return;\r
}\r
else if (key == IHEOL) {\r
- crami(torps,1);\r
- prout(" torpedoes left.");\r
+ prout("%d torpedoes left.", torps);\r
proutn("Number of torpedoes to fire- ");\r
key = scan();\r
}\r
chew();\r
prout("Maximum of 3 torpedoes per burst.");\r
key = IHEOL;\r
+ return;\r
}\r
if (n <= torps) break;\r
chew();\r
if (i == 1 && key == IHEOL) {\r
/* prompt for each one */\r
for (i = 1; i <= n; i++) {\r
- proutn("Target sector for torpedo number");\r
- crami(i, 2);\r
- proutn("- ");\r
+ proutn("Target sector for torpedo number %d- ", i);\r
key = scan();\r
if (key != IHREAL) {\r
huh();\r
/* misfire! */\r
r = (Rand()+1.2) * r;\r
if (n>1) {\r
- prouts("***TORPEDO NUMBER");\r
- crami(i, 2);\r
- prouts(" MISFIRES.");\r
+ prouts("***TORPEDO NUMBER %d MISFIRES", i);\r
}\r
else prouts("***TORPEDO MISFIRES.");\r
skip(1);\r
osuabor=1;\r
if (Rand() <= 0.2) {\r
prout("***Photon tubes damaged by misfire.");\r
- frozen.damage[DPHOTON] = damfac*(1.0+2.0*Rand());\r
+ game.damage[DPHOTON] = damfac*(1.0+2.0*Rand());\r
break;\r
}\r
}\r
- if (shldup != 0 || condit == IHDOCKED) r *= 1.0 + 0.0001*shield;\r
+ if (shldup || condit == IHDOCKED) r *= 1.0 + 0.0001*shield;\r
+#ifndef SERGEEV\r
if (n != 1) {\r
skip(1);\r
- proutn("Track for torpedo number");\r
- crami(i, 2);\r
- proutn("- ");\r
+ proutn("Track for torpedo number %d- ", i);\r
}\r
else {\r
skip(1);\r
proutn("Torpedo track- ");\r
}\r
- torpedo(course[i], r, sectx, secty, &dummy);\r
- if (alldone || state.galaxy[quadx][quady]==1000) return;\r
+#endif /* SERGEEV */\r
+ torpedo(course[i], r, sectx, secty, &dummy, i);\r
+ if (alldone || game.state.galaxy[quadx][quady]==1000) return;\r
}\r
- if (state.remkl==0) finish(FWON);\r
+ if (game.state.remkl==0) finish(FWON);\r
}\r
\r
\r
double chekbrn = (rpow-1500.)*0.00038;\r
if (Rand() <= chekbrn) {\r
prout("Weapons officer Sulu- \"Phasers overheated, sir.\"");\r
- frozen.damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);\r
+ game.damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);\r
}\r
}\r
}\r
if (icas) {\r
skip(1);\r
prout("McCoy to bridge- \"Severe radiation burns, Jim.");\r
- proutn(" ");\r
- crami(icas, 1);\r
- prout(" casualties so far.\"");\r
+ prout(" %d casualties so far.\"", icas);\r
casual -= icas;\r
}\r
skip(1);\r
\r
\r
void phasers(void) {\r
- double hits[21], rpow, extra, powrem, over, temp;\r
- int kz = 0, k=1, i; /* Cheating inhibitor */\r
+ double hits[21], rpow=0, extra, powrem, over, temp;\r
+ int kz = 0, k=1, i, irec=0; /* Cheating inhibitor */\r
int ifast=0, no=0, ipoop=1, msgflag = 1;\r
enum {NOTSET, MANUAL, FORCEMAN, AUTOMATIC} automode = NOTSET;\r
- int key;\r
+ int key=0;\r
\r
skip(1);\r
/* SR sensors and Computer */\r
- if (frozen.damage[DSRSENS]+frozen.damage[DCOMPTR] > 0) ipoop = 0;\r
+ if (game.damage[DSRSENS]+game.damage[DCOMPTR] > 0) ipoop = 0;\r
if (condit == IHDOCKED) {\r
prout("Phasers can't be fired through base shields.");\r
chew();\r
return;\r
}\r
- if (frozen.damage[DPHASER] != 0) {\r
+ if (game.damage[DPHASER] != 0) {\r
prout("Phaser control damaged.");\r
chew();\r
return;\r
}\r
if (shldup) {\r
- if (frozen.damage[DSHCTRL]) {\r
+ if (game.damage[DSHCTRL]) {\r
prout("High speed shield control damaged.");\r
chew();\r
return;\r
ifast = 1;\r
\r
}\r
- ididit = 1;\r
/* Original code so convoluted, I re-did it all */\r
while (automode==NOTSET) {\r
key=scan();\r
}\r
else {\r
huh();\r
- ididit = 0;\r
return;\r
}\r
}\r
key = scan();\r
}\r
if (key != IHREAL && nenhere != 0) {\r
- proutn("Phasers locked on target. Energy available =");\r
- cramf(ifast?energy-200.0:energy,1,2);\r
- skip(1);\r
+ prout("Phasers locked on target. Energy available: %.2f",\r
+ ifast?energy-200.0:energy,1,2);\r
}\r
+ irec=0;\r
do {\r
- while (key != IHREAL) {\r
+ chew();\r
+ if (!kz) for (i = 1; i <= nenhere; i++)\r
+ irec+=fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]))*\r
+ (1.01+0.05*Rand()) + 1.0;\r
+ kz=1;\r
+ proutn("(%d) units required. ", irec);\r
chew();\r
- proutn("Units to fire=");\r
+ proutn("Units to fire= ");\r
key = scan();\r
- }\r
- rpow = aaitem;\r
- if (rpow >= (ifast?energy-200:energy)) {\r
- proutn("Energy available= ");\r
- cramf(ifast?energy-200:energy, 1,2);\r
+ if (key!=IHREAL) return;\r
+ rpow = aaitem;\r
+ if (rpow > (ifast?energy-200:energy)) {\r
+ proutn("Energy available= %.2f",\r
+ ifast?energy-200:energy);\r
skip(1);\r
key = IHEOL;\r
}\r
- } while (rpow >= (ifast?energy-200:energy));\r
+ } while (rpow > (ifast?energy-200:energy));\r
if (rpow<=0) {\r
/* chicken out */\r
- ididit = 0;\r
chew();\r
return;\r
}\r
for (i = 1; i <= nenhere; i++) {\r
hits[i] = 0.0;\r
if (powrem <= 0) continue;\r
- hits[i] = fabs(frozen.kpower[i])/(phasefac*pow(0.90,frozen.kdist[i]));\r
+ hits[i] = fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]));\r
over = (0.01 + 0.05*Rand())*hits[i];\r
temp = powrem;\r
powrem -= hits[i] + over;\r
}\r
if (powrem > 0.0) extra += powrem;\r
hittem(hits);\r
+ ididit=1;\r
}\r
if (extra > 0 && alldone == 0) {\r
if (ithere) {\r
prout("phaser energy.");\r
}\r
else {\r
- cramf(extra, 0, 2);\r
- prout(" expended on empty space.");\r
+ prout("%d expended on empty space.", (int)extra);\r
}\r
}\r
break;\r
case FORCEMAN:\r
chew();\r
key = IHEOL;\r
- if (frozen.damage[DCOMPTR]!=0)\r
+ if (game.damage[DCOMPTR]!=0)\r
prout("Battle comuter damaged, manual file only.");\r
else {\r
skip(1);\r
case MANUAL:\r
rpow = 0.0;\r
for (k = 1; k <= nenhere;) {\r
- int ii = frozen.kx[k], jj = frozen.ky[k];\r
- int ienm = frozen.quad[ii][jj];\r
+ int ii = game.kx[k], jj = game.ky[k];\r
+ int ienm = game.quad[ii][jj];\r
if (msgflag) {\r
- proutn("Energy available= ");\r
- cramf(energy-.006-(ifast?200:0), 0, 2);\r
+ proutn("Energy available= %.2f",\r
+ energy-.006-(ifast?200:0));\r
skip(1);\r
msgflag = 0;\r
rpow = 0.0;\r
}\r
- if (frozen.damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&\r
+ if (game.damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&\r
(ienm == IHC || ienm == IHS)) {\r
cramen(ienm);\r
prout(" can't be located without short range scan.");\r
}\r
if (key == IHEOL) {\r
chew();\r
- if (ipoop && k > kz) {\r
- int irec=(fabs(frozen.kpower[k])/(phasefac*pow(0.9,frozen.kdist[k])))*\r
+ if (ipoop && k > kz)\r
+ irec=(fabs(game.kpower[k])/(PHASEFAC*pow(0.9,game.kdist[k])))*\r
(1.01+0.05*Rand()) + 1.0;\r
- kz = k;\r
- proutn("(");\r
- crami(irec, 1);\r
- proutn(") ");\r
- }\r
+ kz = k;\r
+ proutn("(");\r
+ if (game.damage[DCOMPTR]==0) proutn("%d", irec);\r
+ else proutn("??");\r
+ proutn(") ");\r
proutn("units to fire at ");\r
crmena(0, ienm, 2, ii, jj);\r
proutn("- ");\r
}\r
if (key == IHALPHA) {\r
huh();\r
- ididit = 0;\r
return;\r
}\r
if (key == IHEOL) {\r
}\r
if (aaitem < 0) {\r
/* abort out */\r
- ididit = 0;\r
chew();\r
return;\r
}\r
rpow += aaitem;\r
/* If total requested is too much, inform and start over */\r
\r
- if (rpow >= (ifast?energy-200:energy)) {\r
+ if (rpow > (ifast?energy-200:energy)) {\r
prout("Available energy exceeded -- try again.");\r
chew();\r
- key = IHEOL;\r
- k = 1;\r
- msgflag = 1;\r
- continue;\r
+ return;\r
}\r
key = scan(); /* scan for next value */\r
k++;\r
}\r
if (rpow == 0.0) {\r
/* zero energy -- abort */\r
- ididit = 0;\r
chew();\r
return;\r
}\r
- if (key == IHALPHA & isit("no")) {\r
+ if (key == IHALPHA && isit("no")) {\r
no = 1;\r
}\r
energy -= rpow;\r
}\r
hittem(hits);\r
ididit=1;\r
+ case NOTSET:; /* avoid gcc warning */\r
}\r
/* Say shield raised or malfunction, if necessary */\r
if (alldone) return;\r
\r
void hittem(double *hits) {\r
double kp, kpow, wham, hit, dustfac, kpini;\r
+#ifdef SERGEEV\r
+ int cx, cy;\r
+#endif /* SERGEEV */\r
int nenhr2=nenhere, k=1, kk=1, ii, jj, ienm;\r
\r
skip(1);\r
for (; k <= nenhr2; k++, kk++) {\r
if ((wham = hits[k])==0) continue;\r
dustfac = 0.9 + 0.01*Rand();\r
- hit = wham*pow(dustfac,frozen.kdist[kk]);\r
- kpini = frozen.kpower[kk];\r
+ hit = wham*pow(dustfac,game.kdist[kk]);\r
+ kpini = game.kpower[kk];\r
kp = fabs(kpini);\r
- if (phasefac*hit < kp) kp = phasefac*hit;\r
- frozen.kpower[kk] -= (frozen.kpower[kk] < 0 ? -kp: kp);\r
- kpow = frozen.kpower[kk];\r
- ii = frozen.kx[kk];\r
- jj = frozen.ky[kk];\r
+ if (PHASEFAC*hit < kp) kp = PHASEFAC*hit;\r
+ game.kpower[kk] -= (game.kpower[kk] < 0 ? -kp: kp);\r
+ kpow = game.kpower[kk];\r
+ ii = game.kx[kk];\r
+ jj = game.ky[kk];\r
if (hit > 0.005) {\r
- cramf(hit, 0, 2);\r
- proutn(" unit hit on ");\r
+#ifdef SERGEEV\r
+ if (game.damage[DSRSENS]==0){\r
+ crx=wherex();\r
+ cry=wherey();\r
+ setwnd(1);\r
+ drawmaps(2);\r
+ gotoxy(jj*2+3,ii+2);\r
+ highvideo();\r
+ proutn("%c", game.quad[ii][jj]);\r
+ gotoxy(wherex()-1,wherey());\r
+ sound(500);\r
+ delay(1000);\r
+ nosound();\r
+ lowvideo();\r
+ proutn("%c", game.quad[ii][jj]);\r
+ setwnd(4);\r
+ gotoxy(crx,cry);\r
+ _setcursortype(_NORMALCURSOR);\r
+ delay(500);\r
+ }\r
+#endif /* SERGEEV */\r
+ proutn("%d unit hit on ", (int)hit);\r
}\r
else\r
proutn("Very small hit on ");\r
- ienm = frozen.quad[ii][jj];\r
+ ienm = game.quad[ii][jj];\r
+ if (ienm==IHQUEST) iqengry=1;\r
crmena(0,ienm,2,ii,jj);\r
skip(1);\r
if (kpow == 0) {\r
deadkl(ii, jj, ienm, ii, jj);\r
- if (state.remkl==0) finish(FWON);\r
+ if (game.state.remkl==0) finish(FWON);\r
if (alldone) return;\r
kk--; /* don't do the increment */\r
}\r
else /* decide whether or not to emasculate klingon */\r
if (kpow > 0 && Rand() >= 0.9 &&\r
kpow <= ((0.4 + 0.4*Rand())*kpini)) {\r
- proutn("***Mr. Spock- \"Captain, the vessel at");\r
- cramlc(2,ii,jj);\r
- skip(1);\r
+ prout("***Mr. Spock- \"Captain, the vessel at ",\r
+ cramlc(sector,ii,jj));\r
prout(" has just lost its firepower.\"");\r
- frozen.kpower[kk] = -kpow;\r
+ game.kpower[kk] = -kpow;\r
}\r
}\r
return;\r