forked from KolibriOS/kolibrios
add Super Star Trek Game
git-svn-id: svn://kolibrios.org@7142 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
48d37496a2
commit
b165e4f6b6
610
programs/games/sstartrek/en/ai.c
Normal file
610
programs/games/sstartrek/en/ai.c
Normal file
@ -0,0 +1,610 @@
|
|||||||
|
#include "sst.h"
|
||||||
|
|
||||||
|
static int tryexit(int lookx, int looky, int ienm, int loccom, int irun) {
|
||||||
|
int iqx, iqy, l;
|
||||||
|
|
||||||
|
iqx = quadx+(lookx+9)/10 - 1;
|
||||||
|
iqy = quady+(looky+9)/10 - 1;
|
||||||
|
if (iqx < 1 || iqx > 8 || iqy < 1 || iqy > 8 ||
|
||||||
|
d.galaxy[iqx][iqy] > 899)
|
||||||
|
return 0; /* no can do -- neg energy, supernovae, or >8 Klingons */
|
||||||
|
if (ienm == IHR) return 0; /* Romulans cannot escape! */
|
||||||
|
if (irun == 0) {
|
||||||
|
/* avoid intruding on another commander's territory */
|
||||||
|
if (ienm == IHC) {
|
||||||
|
for (l = 1; l <= d.remcom; l++)
|
||||||
|
if (d.cx[l]==iqx && d.cy[l]==iqy) return 0;
|
||||||
|
/* refuse to leave if currently attacking starbase */
|
||||||
|
if (batx==quadx && baty==quady) return 0;
|
||||||
|
}
|
||||||
|
/* don't leave if over 1000 units of energy */
|
||||||
|
if (kpower[loccom] > 1000.) return 0;
|
||||||
|
}
|
||||||
|
/* print escape message and move out of quadrant.
|
||||||
|
We know this if either short or long range sensors are working */
|
||||||
|
if (damage[DSRSENS] == 0.0 || damage[DLRSENS] == 0.0 ||
|
||||||
|
condit == IHDOCKED) {
|
||||||
|
proutn("***");
|
||||||
|
cramen(ienm);
|
||||||
|
proutn(" escapes to");
|
||||||
|
cramlc(1, iqx, iqy);
|
||||||
|
prout(" (and regains strength).");
|
||||||
|
}
|
||||||
|
/* handle local matters related to escape */
|
||||||
|
kx[loccom] = kx[nenhere];
|
||||||
|
ky[loccom] = ky[nenhere];
|
||||||
|
kavgd[loccom] = kavgd[nenhere];
|
||||||
|
kpower[loccom] = kpower[nenhere];
|
||||||
|
kdist[loccom] = kdist[nenhere];
|
||||||
|
klhere--;
|
||||||
|
nenhere--;
|
||||||
|
if (condit != IHDOCKED) newcnd();
|
||||||
|
/* Handle global matters related to escape */
|
||||||
|
d.galaxy[quadx][quady] -= 100;
|
||||||
|
d.galaxy[iqx][iqy] += 100;
|
||||||
|
if (ienm==IHS) {
|
||||||
|
ishere=0;
|
||||||
|
iscate=0;
|
||||||
|
ientesc=0;
|
||||||
|
isatb=0;
|
||||||
|
future[FSCMOVE]=0.2777+d.date;
|
||||||
|
future[FSCDBAS]=1e30;
|
||||||
|
d.isx=iqx;
|
||||||
|
d.isy=iqy;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (l=1; l<=d.remcom; l++) {
|
||||||
|
if (d.cx[l]==quadx && d.cy[l]==quady) {
|
||||||
|
d.cx[l]=iqx;
|
||||||
|
d.cy[l]=iqy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
comhere = 0;
|
||||||
|
}
|
||||||
|
return 1; /* success */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void movebaddy(int comx, int comy, int loccom, int ienm) {
|
||||||
|
int motion, mdist, nsteps, mx, my, nextx, nexty, lookx, looky, ll;
|
||||||
|
int irun = 0;
|
||||||
|
int krawlx, krawly;
|
||||||
|
int success;
|
||||||
|
int attempts;
|
||||||
|
/* This should probably be just comhere + ishere */
|
||||||
|
int nbaddys = skill > SGOOD ?
|
||||||
|
(int)((comhere*2 + ishere*2+klhere*1.23+irhere*1.5)/2.0):
|
||||||
|
(comhere + ishere);
|
||||||
|
double dist1, forces;
|
||||||
|
|
||||||
|
dist1 = kdist[loccom];
|
||||||
|
mdist = dist1 + 0.5; /* Nearest integer distance */
|
||||||
|
|
||||||
|
/* If SC, check with spy to see if should hi-tail it */
|
||||||
|
if (ienm==IHS &&
|
||||||
|
(kpower[loccom] <= 500.0 || (condit==IHDOCKED && damage[DPHOTON]==0))) {
|
||||||
|
irun = 1;
|
||||||
|
motion = -10;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* decide whether to advance, retreat, or hold position */
|
||||||
|
/* Algorithm:
|
||||||
|
* Enterprise has "force" based on condition of phaser and photon torpedoes.
|
||||||
|
If both are operating full strength, force is 1000. If both are damaged,
|
||||||
|
force is -1000. Having shields down subtracts an additional 1000.
|
||||||
|
|
||||||
|
* Enemy has forces equal to the energy of the attacker plus
|
||||||
|
100*(K+R) + 500*(C+S) - 400 for novice through good levels OR
|
||||||
|
346*K + 400*R + 500*(C+S) - 400 for expert and emeritus.
|
||||||
|
|
||||||
|
Attacker Initial energy levels (nominal):
|
||||||
|
Klingon Romulan Commander Super-Commander
|
||||||
|
Novice 400 700 1200
|
||||||
|
Fair 425 750 1250
|
||||||
|
Good 450 800 1300 1750
|
||||||
|
Expert 475 850 1350 1875
|
||||||
|
Emeritus 500 900 1400 2000
|
||||||
|
VARIANCE 75 200 200 200
|
||||||
|
|
||||||
|
Enemy vessels only move prior to their attack. In Novice - Good games
|
||||||
|
only commanders move. In Expert games, all enemy vessels move if there
|
||||||
|
is a commander present. In Emeritus games all enemy vessels move.
|
||||||
|
|
||||||
|
* If Enterprise is not docked, an agressive action is taken if enemy
|
||||||
|
forces are 1000 greater than Enterprise.
|
||||||
|
|
||||||
|
Agressive action on average cuts the distance between the ship and
|
||||||
|
the enemy to 1/4 the original.
|
||||||
|
|
||||||
|
* At lower energy advantage, movement units are proportional to the
|
||||||
|
advantage with a 650 advantage being to hold ground, 800 to move forward
|
||||||
|
1, 950 for two, 150 for back 4, etc. Variance of 100.
|
||||||
|
|
||||||
|
If docked, is reduced by roughly 1.75*skill, generally forcing a
|
||||||
|
retreat, especially at high skill levels.
|
||||||
|
|
||||||
|
* Motion is limited to skill level, except for SC hi-tailing it out.
|
||||||
|
*/
|
||||||
|
|
||||||
|
forces = kpower[loccom]+100.0*nenhere+400*(nbaddys-1);
|
||||||
|
if (shldup==0) forces += 1000; /* Good for enemy if shield is down! */
|
||||||
|
if (damage[DPHASER] == 0.0 || damage[DPHOTON] == 0.0) {
|
||||||
|
if (damage[DPHASER] != 0) /* phasers damaged */
|
||||||
|
forces += 300.0;
|
||||||
|
else
|
||||||
|
forces -= 0.2*(energy - 2500.0);
|
||||||
|
if (damage[DPHOTON] != 0) /* photon torpedoes damaged */
|
||||||
|
forces += 300.0;
|
||||||
|
else
|
||||||
|
forces -= 50.0*torps;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* phasers and photon tubes both out! */
|
||||||
|
forces += 1000.0;
|
||||||
|
}
|
||||||
|
motion = 0;
|
||||||
|
if (forces <= 1000.0 && condit != IHDOCKED) /* Typical situation */
|
||||||
|
motion = ((forces+200.0*Rand())/150.0) - 5.0;
|
||||||
|
else {
|
||||||
|
if (forces > 1000.0) /* Very strong -- move in for kill */
|
||||||
|
motion = (1.0-square(Rand()))*dist1 + 1.0;
|
||||||
|
if (condit==IHDOCKED) /* protected by base -- back off ! */
|
||||||
|
motion -= skill*(2.0-square(Rand()));
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) {
|
||||||
|
proutn("MOTION = ");
|
||||||
|
cramf(motion, 1, 2);
|
||||||
|
proutn(" FORCES = ");
|
||||||
|
cramf(forces, 1, 2);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* don't move if no motion */
|
||||||
|
if (motion==0) return;
|
||||||
|
/* Limit motion according to skill */
|
||||||
|
if (abs(motion) > skill) motion = (motion < 0) ? -skill : skill;
|
||||||
|
}
|
||||||
|
/* calcuate preferred number of steps */
|
||||||
|
nsteps = motion < 0 ? -motion : motion;
|
||||||
|
if (motion > 0 && nsteps > mdist) nsteps = mdist; /* don't overshoot */
|
||||||
|
if (nsteps > 10) nsteps = 10; /* This shouldn't be necessary */
|
||||||
|
if (nsteps < 1) nsteps = 1; /* This shouldn't be necessary */
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) {
|
||||||
|
proutn("NSTEPS = ");
|
||||||
|
crami(nsteps, 1);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Compute preferred values of delta X and Y */
|
||||||
|
mx = sectx - comx;
|
||||||
|
my = secty - comy;
|
||||||
|
if (2.0 * abs(mx) < abs(my)) mx = 0;
|
||||||
|
if (2.0 * abs(my) < abs(sectx-comx)) my = 0;
|
||||||
|
if (mx != 0) mx = mx*motion < 0 ? -1 : 1;
|
||||||
|
if (my != 0) my = my*motion < 0 ? -1 : 1;
|
||||||
|
nextx = comx;
|
||||||
|
nexty = comy;
|
||||||
|
quad[comx][comy] = IHDOT;
|
||||||
|
/* main move loop */
|
||||||
|
for (ll = 1; ll <= nsteps; ll++) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) {
|
||||||
|
crami(ll,2);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Check if preferred position available */
|
||||||
|
lookx = nextx + mx;
|
||||||
|
looky = nexty + my;
|
||||||
|
krawlx = mx < 0 ? 1 : -1;
|
||||||
|
krawly = my < 0 ? 1 : -1;
|
||||||
|
success = 0;
|
||||||
|
attempts = 0; /* Settle mysterious hang problem */
|
||||||
|
while (attempts++ < 20 && !success) {
|
||||||
|
if (lookx < 1 || lookx > 10) {
|
||||||
|
if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
|
||||||
|
return;
|
||||||
|
if (krawlx == mx || my == 0) break;
|
||||||
|
lookx = nextx + krawlx;
|
||||||
|
krawlx = -krawlx;
|
||||||
|
}
|
||||||
|
else if (looky < 1 || looky > 10) {
|
||||||
|
if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
|
||||||
|
return;
|
||||||
|
if (krawly == my || mx == 0) break;
|
||||||
|
looky = nexty + krawly;
|
||||||
|
krawly = -krawly;
|
||||||
|
}
|
||||||
|
else if (quad[lookx][looky] != IHDOT) {
|
||||||
|
/* See if we should ram ship */
|
||||||
|
if (quad[lookx][looky] == ship &&
|
||||||
|
(ienm == IHC || ienm == IHS)) {
|
||||||
|
ram(1, ienm, comx, comy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (krawlx != mx && my != 0) {
|
||||||
|
lookx = nextx + krawlx;
|
||||||
|
krawlx = -krawlx;
|
||||||
|
}
|
||||||
|
else if (krawly != my && mx != 0) {
|
||||||
|
looky = nexty + krawly;
|
||||||
|
krawly = -krawly;
|
||||||
|
}
|
||||||
|
else break; /* we have failed */
|
||||||
|
}
|
||||||
|
else success = 1;
|
||||||
|
}
|
||||||
|
if (success) {
|
||||||
|
nextx = lookx;
|
||||||
|
nexty = looky;
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) {
|
||||||
|
cramlc(0, nextx, nexty);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else break; /* done early */
|
||||||
|
}
|
||||||
|
/* Put commander in place within same quadrant */
|
||||||
|
quad[nextx][nexty] = ienm;
|
||||||
|
if (nextx != comx || nexty != comy) {
|
||||||
|
/* it moved */
|
||||||
|
kx[loccom] = nextx;
|
||||||
|
ky[loccom] = nexty;
|
||||||
|
kdist[loccom] = kavgd[loccom] =
|
||||||
|
sqrt(square(sectx-nextx)+square(secty-nexty));
|
||||||
|
if (damage[DSRSENS] == 0 || condit == IHDOCKED) {
|
||||||
|
proutn("***");
|
||||||
|
cramen(ienm);
|
||||||
|
if (kdist[loccom] < dist1) proutn(" advances to");
|
||||||
|
else proutn(" retreats to");
|
||||||
|
cramlc(2, nextx, nexty);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void movcom(void) {
|
||||||
|
int ix, iy, i;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) prout("MOVCOM");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Figure out which Klingon is the commander (or Supercommander)
|
||||||
|
and do move */
|
||||||
|
if (comhere) for (i = 1; i <= nenhere; i++) {
|
||||||
|
ix = kx[i];
|
||||||
|
iy = ky[i];
|
||||||
|
if (quad[ix][iy] == IHC) {
|
||||||
|
movebaddy(ix, iy, i, IHC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ishere) for (i = 1; i <= nenhere; i++) {
|
||||||
|
ix = kx[i];
|
||||||
|
iy = ky[i];
|
||||||
|
if (quad[ix][iy] == IHS) {
|
||||||
|
movebaddy(ix, iy, i, IHS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* if skill level is high, move other Klingons and Romulans too!
|
||||||
|
Move these last so they can base their actions on what the
|
||||||
|
commander(s) do. */
|
||||||
|
if (skill > SGOOD) for (i = 1; i <= nenhere; i++) {
|
||||||
|
ix = kx[i];
|
||||||
|
iy = ky[i];
|
||||||
|
if (quad[ix][iy] == IHK || quad[ix][iy] == IHR)
|
||||||
|
movebaddy(ix, iy, i, quad[ix][iy]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sortkl();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int checkdest(int iqx, int iqy, int flag, int *ipage) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if ((iqx==quadx && iqy==quady) ||
|
||||||
|
iqx < 1 || iqx > 8 || iqy < 1 || iqy > 8 ||
|
||||||
|
d.galaxy[iqx][iqy] > 899) return 1;
|
||||||
|
if (flag) {
|
||||||
|
/* Avoid quadrants with bases if we want to avoid Enterprise */
|
||||||
|
for (i = 1; i <= d.rembase; i++)
|
||||||
|
if (d.baseqx[i]==iqx && d.baseqy[i]==iqy) return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do the move */
|
||||||
|
d.galaxy[d.isx][d.isy] -= 100;
|
||||||
|
d.isx = iqx;
|
||||||
|
d.isy = iqy;
|
||||||
|
d.galaxy[d.isx][d.isy] += 100;
|
||||||
|
if (iscate) {
|
||||||
|
/* SC has scooted, Remove him from current quadrant */
|
||||||
|
iscate=0;
|
||||||
|
isatb=0;
|
||||||
|
ishere=0;
|
||||||
|
ientesc=0;
|
||||||
|
future[FSCDBAS]=1e30;
|
||||||
|
for (i = 1; i <= nenhere; i++)
|
||||||
|
if (quad[kx[i]][ky[i]] == IHS) break;
|
||||||
|
quad[kx[i]][ky[i]] = IHDOT;
|
||||||
|
kx[i] = kx[nenhere];
|
||||||
|
ky[i] = ky[nenhere];
|
||||||
|
kdist[i] = kdist[nenhere];
|
||||||
|
kavgd[i] = kavgd[nenhere];
|
||||||
|
kpower[i] = kpower[nenhere];
|
||||||
|
klhere--;
|
||||||
|
nenhere--;
|
||||||
|
if (condit!=IHDOCKED) newcnd();
|
||||||
|
sortkl();
|
||||||
|
}
|
||||||
|
/* check for a helpful planet */
|
||||||
|
for (i = 1; i <= inplan; i++) {
|
||||||
|
if (d.plnets[i].x==d.isx && d.plnets[i].y==d.isy &&
|
||||||
|
d.plnets[i].crystals == 1) {
|
||||||
|
/* destroy the planet */
|
||||||
|
d.plnets[i] = nulplanet;
|
||||||
|
d.newstuf[d.isx][d.isy] -= 1;
|
||||||
|
if (REPORTS) {
|
||||||
|
if (*ipage==0) pause(1);
|
||||||
|
*ipage = 1;
|
||||||
|
prout("Lt. Uhura- \"Captain, Starfleet Intelligence reports");
|
||||||
|
proutn(" a planet in");
|
||||||
|
cramlc(1, d.isx, d.isy);
|
||||||
|
prout(" has been destroyed");
|
||||||
|
prout(" by the Super-commander.\"");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; /* looks good! */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void scom(int *ipage) {
|
||||||
|
int i, i2, j, ideltax, ideltay, ibqx, ibqy, sx, sy, ifindit, iwhichb;
|
||||||
|
int iqx, iqy;
|
||||||
|
int basetbl[6];
|
||||||
|
double bdist[6];
|
||||||
|
int flag;
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) prout("SCOM");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Decide on being active or passive */
|
||||||
|
flag = ((d.killc+d.killk)/(d.date+0.01-indate) < 0.1*skill*(skill+1.0) ||
|
||||||
|
(d.date-indate) < 3.0);
|
||||||
|
if (iscate==0 && flag) {
|
||||||
|
/* compute move away from Enterprise */
|
||||||
|
ideltax = d.isx-quadx;
|
||||||
|
ideltay = d.isy-quady;
|
||||||
|
if (sqrt(ideltax*(double)ideltax+ideltay*(double)ideltay) > 2.0) {
|
||||||
|
/* circulate in space */
|
||||||
|
ideltax = d.isy-quady;
|
||||||
|
ideltay = quadx-d.isx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* compute distances to starbases */
|
||||||
|
if (d.rembase <= 0) {
|
||||||
|
/* nothing left to do */
|
||||||
|
future[FSCMOVE] = 1e30;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sx = d.isx;
|
||||||
|
sy = d.isy;
|
||||||
|
for (i = 1; i <= d.rembase; i++) {
|
||||||
|
basetbl[i] = i;
|
||||||
|
ibqx = d.baseqx[i];
|
||||||
|
ibqy = d.baseqy[i];
|
||||||
|
bdist[i] = sqrt(square(ibqx-sx) + square(ibqy-sy));
|
||||||
|
}
|
||||||
|
if (d.rembase > 1) {
|
||||||
|
/* sort into nearest first order */
|
||||||
|
int iswitch;
|
||||||
|
do {
|
||||||
|
iswitch = 0;
|
||||||
|
for (i=1; i < d.rembase-1; i++) {
|
||||||
|
if (bdist[i] > bdist[i+1]) {
|
||||||
|
int ti = basetbl[i];
|
||||||
|
double t = bdist[i];
|
||||||
|
bdist[i] = bdist[i+1];
|
||||||
|
bdist[i+1] = t;
|
||||||
|
basetbl[i] = basetbl[i+1];
|
||||||
|
basetbl[i+1] =ti;
|
||||||
|
iswitch = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (iswitch);
|
||||||
|
}
|
||||||
|
/* look for nearest base without a commander, no Enterprise, and
|
||||||
|
without too many Klingons, and not already under attack. */
|
||||||
|
ifindit = iwhichb = 0;
|
||||||
|
|
||||||
|
for (i2 = 1; i2 <= d.rembase; i2++) {
|
||||||
|
i = basetbl[i2]; /* bug in original had it not finding nearest*/
|
||||||
|
ibqx = d.baseqx[i];
|
||||||
|
ibqy = d.baseqy[i];
|
||||||
|
if ((ibqx == quadx && ibqy == quady) ||
|
||||||
|
(ibqx == batx && ibqy == baty) ||
|
||||||
|
d.galaxy[ibqx][ibqy] > 899) continue;
|
||||||
|
/* if there is a commander, an no other base is appropriate,
|
||||||
|
we will take the one with the commander */
|
||||||
|
for (j = 1; j <= d.remcom; j++) {
|
||||||
|
if (ibqx==d.cx[j] && ibqy==d.cy[j] && ifindit!= 2) {
|
||||||
|
ifindit = 2;
|
||||||
|
iwhichb = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j > d.remcom) { /* no commander -- use this one */
|
||||||
|
ifindit = 1;
|
||||||
|
iwhichb = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ifindit==0) return; /* Nothing suitable -- wait until next time*/
|
||||||
|
ibqx = d.baseqx[iwhichb];
|
||||||
|
ibqy = d.baseqy[iwhichb];
|
||||||
|
/* decide how to move toward base */
|
||||||
|
ideltax = ibqx - d.isx;
|
||||||
|
ideltay = ibqy - d.isy;
|
||||||
|
}
|
||||||
|
/* Maximum movement is 1 quadrant in either or both axis */
|
||||||
|
if (ideltax > 1) ideltax = 1;
|
||||||
|
if (ideltax < -1) ideltax = -1;
|
||||||
|
if (ideltay > 1) ideltay = 1;
|
||||||
|
if (ideltay < -1) ideltay = -1;
|
||||||
|
|
||||||
|
/* try moving in both x and y directions */
|
||||||
|
iqx = d.isx + ideltax;
|
||||||
|
iqy = d.isy + ideltax;
|
||||||
|
if (checkdest(iqx, iqy, flag, ipage)) {
|
||||||
|
/* failed -- try some other maneuvers */
|
||||||
|
if (ideltax==0 || ideltay==0) {
|
||||||
|
/* attempt angle move */
|
||||||
|
if (ideltax != 0) {
|
||||||
|
iqy = d.isy + 1;
|
||||||
|
if (checkdest(iqx, iqy, flag, ipage)) {
|
||||||
|
iqy = d.isy - 1;
|
||||||
|
checkdest(iqx, iqy, flag, ipage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
iqx = d.isx + 1;
|
||||||
|
if (checkdest(iqx, iqy, flag, ipage)) {
|
||||||
|
iqx = d.isx - 1;
|
||||||
|
checkdest(iqx, iqy, flag, ipage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* try moving just in x or y */
|
||||||
|
iqy = d.isy;
|
||||||
|
if (checkdest(iqx, iqy, flag, ipage)) {
|
||||||
|
iqy = d.isy + ideltay;
|
||||||
|
iqx = d.isx;
|
||||||
|
checkdest(iqx, iqy, flag, ipage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* check for a base */
|
||||||
|
if (d.rembase == 0) {
|
||||||
|
future[FSCMOVE] = 1e30;
|
||||||
|
}
|
||||||
|
else for (i=1; i<=d.rembase; i++) {
|
||||||
|
ibqx = d.baseqx[i];
|
||||||
|
ibqy = d.baseqy[i];
|
||||||
|
if (ibqx==d.isx && ibqy == d.isy && d.isx != batx && d.isy != baty) {
|
||||||
|
/* attack the base */
|
||||||
|
if (flag) return; /* no, don't attack base! */
|
||||||
|
iseenit = 0;
|
||||||
|
isatb=1;
|
||||||
|
future[FSCDBAS] = d.date + 1.0 +2.0*Rand();
|
||||||
|
if (batx != 0) future[FSCDBAS] += future[FCDBAS]-d.date;
|
||||||
|
if (!REPORTS)
|
||||||
|
return; /* no warning */
|
||||||
|
iseenit = 1;
|
||||||
|
if (*ipage == 0) pause(1);
|
||||||
|
*ipage=1;
|
||||||
|
proutn("Lt. Uhura- \"Captain, the starbase in");
|
||||||
|
cramlc(1, d.isx, d.isy);
|
||||||
|
skip(1);
|
||||||
|
prout(" reports that it is under attack from the Klingon Super-commander.");
|
||||||
|
proutn(" It can survive until stardate ");
|
||||||
|
cramf(future[FSCDBAS], 0, 1);
|
||||||
|
prout(" .\"");
|
||||||
|
if (resting==0) return;
|
||||||
|
prout("Mr. Spock- \"Captain, shall we cancel the rest period?\"");
|
||||||
|
if (ja()==0) return;
|
||||||
|
resting = 0;
|
||||||
|
Time = 0.0; /* actually finished */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Check for intelligence report */
|
||||||
|
if (
|
||||||
|
#ifdef DEBUG
|
||||||
|
idebug==0 &&
|
||||||
|
#endif
|
||||||
|
(Rand() > 0.2 ||
|
||||||
|
(!REPORTS) ||
|
||||||
|
starch[d.isx][d.isy] > 0))
|
||||||
|
return;
|
||||||
|
if (*ipage==0) pause(1);
|
||||||
|
*ipage = 1;
|
||||||
|
prout("Lt. Uhura- \"Captain, Starfleet Intelligence reports");
|
||||||
|
proutn(" the Super-commander is in");
|
||||||
|
cramlc(1, d.isx, d.isy);
|
||||||
|
prout(".\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void movetho(void) {
|
||||||
|
int idx, idy, im, i, dum, my;
|
||||||
|
/* Move the Tholean */
|
||||||
|
if (ithere==0 || justin == 1) return;
|
||||||
|
|
||||||
|
if (ithx == 1 && ithy == 1) {
|
||||||
|
idx = 1; idy = 10;
|
||||||
|
}
|
||||||
|
else if (ithx == 1 && ithy == 10) {
|
||||||
|
idx = 10; idy = 10;
|
||||||
|
}
|
||||||
|
else if (ithx == 10 && ithy == 10) {
|
||||||
|
idx = 10; idy = 1;
|
||||||
|
}
|
||||||
|
else if (ithx == 10 && ithy == 1) {
|
||||||
|
idx = 1; idy = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* something is wrong! */
|
||||||
|
ithere = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do nothing if we are blocked */
|
||||||
|
if (quad[idx][idy]!= IHDOT && quad[idx][idy]!= IHWEB) return;
|
||||||
|
quad[ithx][ithy] = IHWEB;
|
||||||
|
|
||||||
|
if (ithx != idx) {
|
||||||
|
/* move in x axis */
|
||||||
|
im = fabs((double)idx - ithx)/((double)idx - ithx);
|
||||||
|
while (ithx != idx) {
|
||||||
|
ithx += im;
|
||||||
|
if (quad[ithx][ithy]==IHDOT) quad[ithx][ithy] = IHWEB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ithy != idy) {
|
||||||
|
/* move in y axis */
|
||||||
|
im = fabs((double)idy - ithy)/((double)idy - ithy);
|
||||||
|
while (ithy != idy) {
|
||||||
|
ithy += im;
|
||||||
|
if (quad[ithx][ithy]==IHDOT) quad[ithx][ithy] = IHWEB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quad[ithx][ithy] = IHT;
|
||||||
|
|
||||||
|
/* check to see if all holes plugged */
|
||||||
|
for (i = 1; i < 11; i++) {
|
||||||
|
if (quad[1][i]!=IHWEB && quad[1][i]!=IHT) return;
|
||||||
|
if (quad[10][i]!=IHWEB && quad[10][i]!=IHT) return;
|
||||||
|
if (quad[i][1]!=IHWEB && quad[i][1]!=IHT) return;
|
||||||
|
if (quad[i][10]!=IHWEB && quad[i][10]!=IHT) return;
|
||||||
|
}
|
||||||
|
/* All plugged up -- Tholian splits */
|
||||||
|
quad[ithx][ithy]=IHWEB;
|
||||||
|
dropin(IHBLANK, &dum, &my);
|
||||||
|
crmena(1,IHT, 2, ithx, ithy);
|
||||||
|
prout(" completes web.");
|
||||||
|
ithere = ithx = ithy = 0;
|
||||||
|
return;
|
||||||
|
}
|
1483
programs/games/sstartrek/en/battle.c
Normal file
1483
programs/games/sstartrek/en/battle.c
Normal file
File diff suppressed because it is too large
Load Diff
5
programs/games/sstartrek/en/buildforkolibri.bat
Normal file
5
programs/games/sstartrek/en/buildforkolibri.bat
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
rem To build under Windows, execute
|
||||||
|
|
||||||
|
SET TCC=D:\_bin\ktcc_26_161007
|
||||||
|
|
||||||
|
%TCC%\kos32-tcc -I%TCC%\INCLUDE -L%TCC%\LIB -DWINDOWS -DKOS32 sst.c ai.c battle.c events.c finish.c moving.c osx.c planets.c reports.c setup.c -lck -o SStarTrek -g
|
2
programs/games/sstartrek/en/buildforwindows.txt
Normal file
2
programs/games/sstartrek/en/buildforwindows.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
To build under Windows, execute
|
||||||
|
cl -DWINDOWS sst.c ai.c battle.c events.c finish.c moving.c osx.c planets.c reports.c setup.c
|
783
programs/games/sstartrek/en/events.c
Normal file
783
programs/games/sstartrek/en/events.c
Normal file
@ -0,0 +1,783 @@
|
|||||||
|
#include "sst.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void events(void) {
|
||||||
|
|
||||||
|
int ictbeam=0, ipage=0, istract=0, line, i, j, k, l, ixhold, iyhold;
|
||||||
|
double fintim = d.date + Time, datemin, xtime, repair, yank;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) prout("EVENTS");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (stdamtim == 1e30 && !REPORTS)
|
||||||
|
{
|
||||||
|
/* chart will no longer be updated because radio is dead */
|
||||||
|
stdamtim = d.date;
|
||||||
|
for (i=1; i <= 8 ; i++)
|
||||||
|
for (j=1; j <= 8; j++)
|
||||||
|
if (starch[i][j] == 1) starch[i][j] = d.galaxy[i][j]+1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
/* Select earliest extraneous event, line==0 if no events */
|
||||||
|
line = FSPY;
|
||||||
|
if (alldone) return;
|
||||||
|
datemin = fintim;
|
||||||
|
for (l=1; l<=NEVENTS; l++)
|
||||||
|
if (future[l] <= datemin) {
|
||||||
|
line = l;
|
||||||
|
datemin = future[l];
|
||||||
|
}
|
||||||
|
xtime = datemin-d.date;
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (iscloaking) {
|
||||||
|
energy -= xtime*500.0;
|
||||||
|
if (energy <= 0.) {
|
||||||
|
finish(FNRG);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
d.date = datemin;
|
||||||
|
/* Decrement Federation resources and recompute remaining time */
|
||||||
|
d.remres -= (d.remkl+4*d.remcom)*xtime;
|
||||||
|
d.remtime = d.remres/(d.remkl+4*d.remcom);
|
||||||
|
if (d.remtime <=0) {
|
||||||
|
finish(FDEPLETE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Is life support adequate? */
|
||||||
|
if (damage[DLIFSUP] && condit != IHDOCKED) {
|
||||||
|
if (lsupres < xtime && damage[DLIFSUP] > lsupres) {
|
||||||
|
finish(FLIFESUP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lsupres -= xtime;
|
||||||
|
if (damage[DLIFSUP] <= xtime) lsupres = inlsr;
|
||||||
|
}
|
||||||
|
/* Fix devices */
|
||||||
|
repair = xtime;
|
||||||
|
if (condit == IHDOCKED) repair /= docfac;
|
||||||
|
/* Don't fix Deathray here */
|
||||||
|
for (l=1; l<=ndevice; l++)
|
||||||
|
if (damage[l] > 0.0 && l != DDRAY)
|
||||||
|
damage[l] -= (damage[l]-repair > 0.0 ? repair : damage[l]);
|
||||||
|
/* Fix Deathray if docked */
|
||||||
|
if (damage[DDRAY] > 0.0 && condit == IHDOCKED)
|
||||||
|
damage[DDRAY] -= (damage[l] - xtime > 0.0 ? xtime : damage[DDRAY]);
|
||||||
|
/* If radio repaired, update star chart and attack reports */
|
||||||
|
if (stdamtim != 1e30 && REPORTS) {
|
||||||
|
stdamtim = 1e30;
|
||||||
|
prout("Lt. Uhura- \"Captain, the sub-space radio is working and");
|
||||||
|
prout(" surveillance reports are coming in.");
|
||||||
|
skip(1);
|
||||||
|
for (i=1; i <= 8 ; i++)
|
||||||
|
for (j=1; j <= 8; j++)
|
||||||
|
if (starch[i][j] > 999) starch[i][j] = 1;
|
||||||
|
if (iseenit==0) {
|
||||||
|
attakreport();
|
||||||
|
iseenit = 1;
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
prout(" The star chart is now up to date.\"");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
/* Cause extraneous event LINE to occur */
|
||||||
|
Time -= xtime;
|
||||||
|
switch (line) {
|
||||||
|
case FSNOVA: /* Supernova */
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage=1;
|
||||||
|
snova(0,0);
|
||||||
|
future[FSNOVA] = d.date + expran(0.5*intime);
|
||||||
|
if (d.galaxy[quadx][quady] == 1000) return;
|
||||||
|
break;
|
||||||
|
case FSPY: /* Check with spy to see if S.C. should tractor beam */
|
||||||
|
if (d.nscrem == 0 ||
|
||||||
|
#ifdef CLOAKING
|
||||||
|
iscloaked || /* Cannot tractor beam if we can't be seen! */
|
||||||
|
#endif
|
||||||
|
ictbeam+istract > 0 ||
|
||||||
|
condit==IHDOCKED || isatb==1 || iscate==1) return;
|
||||||
|
if (ientesc ||
|
||||||
|
(energy < 2000 && torps < 4 && shield < 1250) ||
|
||||||
|
(damage[DPHASER]>0 && (damage[DPHOTON]>0 || torps < 4)) ||
|
||||||
|
(damage[DSHIELD] > 0 &&
|
||||||
|
(energy < 2500 || damage[DPHASER] > 0) &&
|
||||||
|
(torps < 5 || damage[DPHOTON] > 0))) {
|
||||||
|
/* Tractor-beam her! */
|
||||||
|
istract=1;
|
||||||
|
yank = square(d.isx-quadx) + square(d.isy-quady);
|
||||||
|
/*********TBEAM CODE***********/
|
||||||
|
}
|
||||||
|
else return;
|
||||||
|
case FTBEAM: /* Tractor beam */
|
||||||
|
if (line==FTBEAM) {
|
||||||
|
if (d.remcom == 0) {
|
||||||
|
future[FTBEAM] = 1e30;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i = Rand()*d.remcom+1.0;
|
||||||
|
yank = square(d.cx[i]-quadx) + square(d.cy[i]-quady);
|
||||||
|
if (istract || condit == IHDOCKED ||
|
||||||
|
#ifdef CLOAKING
|
||||||
|
iscloaked || /* cannot tractor beam if we can't be seen */
|
||||||
|
#endif
|
||||||
|
yank == 0) {
|
||||||
|
/* Drats! Have to reschedule */
|
||||||
|
future[FTBEAM] = d.date + Time +
|
||||||
|
expran(1.5*intime/d.remcom);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* tractor beaming cases merge here */
|
||||||
|
yank = sqrt(yank);
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage=1;
|
||||||
|
Time = (10.0/(7.5*7.5))*yank; /* 7.5 is yank rate (warp 7.5) */
|
||||||
|
ictbeam = 1;
|
||||||
|
skip(1);
|
||||||
|
proutn("***");
|
||||||
|
crmshp();
|
||||||
|
prout(" caught in long range tractor beam--");
|
||||||
|
/* If Kirk & Co. screwing around on planet, handle */
|
||||||
|
atover(1); /* atover(1) is Grab */
|
||||||
|
if (alldone) return;
|
||||||
|
if (icraft == 1) { /* Caught in Galileo? */
|
||||||
|
finish(FSTRACTOR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Check to see if shuttle is aboard */
|
||||||
|
if (iscraft==0) {
|
||||||
|
skip(1);
|
||||||
|
if (Rand() >0.5) {
|
||||||
|
prout("Galileo, left on the planet surface, is captured");
|
||||||
|
prout("by aliens and made into a flying McDonald's.");
|
||||||
|
damage[DSHUTTL] = -10;
|
||||||
|
iscraft = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prout("Galileo, left on the planet surface, is well hidden.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line==0) {
|
||||||
|
quadx = d.isx;
|
||||||
|
quady = d.isy;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
quadx = d.cx[i];
|
||||||
|
quady = d.cy[i];
|
||||||
|
}
|
||||||
|
iran10(§x, §y);
|
||||||
|
crmshp();
|
||||||
|
proutn(" is pulled to");
|
||||||
|
cramlc(1, quadx, quady);
|
||||||
|
proutn(", ");
|
||||||
|
cramlc(2, sectx, secty);
|
||||||
|
skip(1);
|
||||||
|
if (resting) {
|
||||||
|
prout("(Remainder of rest/repair period cancelled.)");
|
||||||
|
resting = 0;
|
||||||
|
}
|
||||||
|
if (shldup==0) {
|
||||||
|
if (damage[DSHIELD]==0 && shield > 0) {
|
||||||
|
sheild(2); /* Shldsup */
|
||||||
|
shldchg=0;
|
||||||
|
}
|
||||||
|
else prout("(Shields not currently useable.)");
|
||||||
|
}
|
||||||
|
newqad(0);
|
||||||
|
/* Adjust finish time to time of tractor beaming */
|
||||||
|
fintim = d.date+Time;
|
||||||
|
if (d.remcom <= 0) future[FTBEAM] = 1e30;
|
||||||
|
else future[FTBEAM] = d.date+Time+expran(1.5*intime/d.remcom);
|
||||||
|
break;
|
||||||
|
case FSNAP: /* Snapshot of the universe (for time warp) */
|
||||||
|
snapsht = d;
|
||||||
|
d.snap = 1;
|
||||||
|
future[FSNAP] = d.date + expran(0.5 * intime);
|
||||||
|
break;
|
||||||
|
case FBATTAK: /* Commander attacks starbase */
|
||||||
|
if (d.remcom==0 || d.rembase==0) {
|
||||||
|
/* no can do */
|
||||||
|
future[FBATTAK] = future[FCDBAS] = 1e30;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
for (j=1; j<=d.rembase; j++) {
|
||||||
|
for (k=1; k<=d.remcom; k++)
|
||||||
|
if (d.baseqx[j]==d.cx[k] && d.baseqy[j]==d.cy[k] &&
|
||||||
|
(d.baseqx[j]!=quadx || d.baseqy[j]!=quady) &&
|
||||||
|
(d.baseqx[j]!=d.isx || d.baseqy[j]!=d.isy)) {
|
||||||
|
i = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == 1) break;
|
||||||
|
}
|
||||||
|
if (j>d.rembase) {
|
||||||
|
/* no match found -- try later */
|
||||||
|
future[FBATTAK] = d.date + expran(0.3*intime);
|
||||||
|
future[FCDBAS] = 1e30;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* commander + starbase combination found -- launch attack */
|
||||||
|
batx = d.baseqx[j];
|
||||||
|
baty = d.baseqy[j];
|
||||||
|
future[FCDBAS] = d.date+1.0+3.0*Rand();
|
||||||
|
if (isatb) /* extra time if SC already attacking */
|
||||||
|
future[FCDBAS] += future[FSCDBAS]-d.date;
|
||||||
|
future[FBATTAK] = future[FCDBAS] +expran(0.3*intime);
|
||||||
|
iseenit = 0;
|
||||||
|
if (!REPORTS)
|
||||||
|
break; /* No warning :-( */
|
||||||
|
iseenit = 1;
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage = 1;
|
||||||
|
skip(1);
|
||||||
|
proutn("Lt. Uhura- \"Captain, the starbase in");
|
||||||
|
cramlc(1, batx, baty);
|
||||||
|
skip(1);
|
||||||
|
prout(" reports that it is under atttack and that it can");
|
||||||
|
proutn(" hold out only until stardate ");
|
||||||
|
cramf(future[FCDBAS],1,1);
|
||||||
|
prout(".\"");
|
||||||
|
if (resting) {
|
||||||
|
skip(1);
|
||||||
|
proutn("Mr. Spock- \"Captain, shall we cancel the rest period?\"");
|
||||||
|
if (ja()) {
|
||||||
|
resting = 0;
|
||||||
|
Time = 0.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FSCDBAS: /* Supercommander destroys base */
|
||||||
|
future[FSCDBAS] = 1e30;
|
||||||
|
isatb = 2;
|
||||||
|
if (d.galaxy[d.isx][d.isy]%100 < 10) break; /* WAS RETURN! */
|
||||||
|
ixhold = batx;
|
||||||
|
iyhold = baty;
|
||||||
|
batx = d.isx;
|
||||||
|
baty = d.isy;
|
||||||
|
case FCDBAS: /* Commander succeeds in destroying base */
|
||||||
|
if (line==FCDBAS) {
|
||||||
|
future[FCDBAS] = 1e30;
|
||||||
|
/* find the lucky pair */
|
||||||
|
for (i = 1; i <= d.remcom; i++)
|
||||||
|
if (d.cx[i]==batx && d.cy[i]==baty) break;
|
||||||
|
if (i > d.remcom || d.rembase == 0 ||
|
||||||
|
d.galaxy[batx][baty] % 100 < 10) {
|
||||||
|
/* No action to take after all */
|
||||||
|
batx = baty = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Code merges here for any commander destroying base */
|
||||||
|
/* Not perfect, but will have to do */
|
||||||
|
if (starch[batx][baty] == -1) starch[batx][baty] = 0;
|
||||||
|
/* Handle case where base is in same quadrant as starship */
|
||||||
|
if (batx==quadx && baty==quady) {
|
||||||
|
if (starch[batx][baty] > 999) starch[batx][baty] -= 10;
|
||||||
|
quad[basex][basey]= IHDOT;
|
||||||
|
basex=basey=0;
|
||||||
|
newcnd();
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"Captain, I believe the starbase has been destroyed.\"");
|
||||||
|
}
|
||||||
|
else if (d.rembase != 1 && REPORTS) {
|
||||||
|
/* Get word via subspace radio */
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage = 1;
|
||||||
|
skip(1);
|
||||||
|
prout("Lt. Uhura- \"Captain, Starfleet Command reports that");
|
||||||
|
proutn(" the starbase in");
|
||||||
|
cramlc(1, batx, baty);
|
||||||
|
prout(" has been destroyed by");
|
||||||
|
if (isatb==2) prout("the Klingon Super-Commander");
|
||||||
|
else prout("a Klingon Commander");
|
||||||
|
}
|
||||||
|
/* Remove Starbase from galaxy */
|
||||||
|
d.galaxy[batx][baty] -= 10;
|
||||||
|
for (i=1; i <= d.rembase; i++)
|
||||||
|
if (d.baseqx[i]==batx && d.baseqy[i]==baty) {
|
||||||
|
d.baseqx[i]=d.baseqx[d.rembase];
|
||||||
|
d.baseqy[i]=d.baseqy[d.rembase];
|
||||||
|
}
|
||||||
|
d.rembase--;
|
||||||
|
if (isatb == 2) {
|
||||||
|
/* reinstate a commander's base attack */
|
||||||
|
batx = ixhold;
|
||||||
|
baty = iyhold;
|
||||||
|
isatb = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
batx = baty = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FSCMOVE: /* Supercommander moves */
|
||||||
|
future[FSCMOVE] = d.date+0.2777;
|
||||||
|
if (ientesc+istract==0 &&
|
||||||
|
isatb!=1 &&
|
||||||
|
(iscate!=1 || justin==1)) scom(&ipage);
|
||||||
|
break;
|
||||||
|
case FDSPROB: /* Move deep space probe */
|
||||||
|
future[FDSPROB] = d.date + 0.01;
|
||||||
|
probex += probeinx;
|
||||||
|
probey += probeiny;
|
||||||
|
i = (int)(probex/10 +0.05);
|
||||||
|
j = (int)(probey/10 + 0.05);
|
||||||
|
if (probecx != i || probecy != j) {
|
||||||
|
probecx = i;
|
||||||
|
probecy = j;
|
||||||
|
if (i < 1 || i > 8 || j < 1 || j > 8 ||
|
||||||
|
d.galaxy[probecx][probecy] == 1000) {
|
||||||
|
// Left galaxy or ran into supernova
|
||||||
|
if (REPORTS) {
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage = 1;
|
||||||
|
skip(1);
|
||||||
|
proutn("Lt. Uhura- \"The deep space probe ");
|
||||||
|
if (i < 1 ||i > 8 || j < 1 || j > 8)
|
||||||
|
proutn("has left the galaxy");
|
||||||
|
else
|
||||||
|
proutn("is no longer transmitting");
|
||||||
|
prout(".\"");
|
||||||
|
}
|
||||||
|
future[FDSPROB] = 1e30;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (REPORTS) {
|
||||||
|
if (ipage==0) pause(1);
|
||||||
|
ipage = 1;
|
||||||
|
skip(1);
|
||||||
|
proutn("Lt. Uhura- \"The deep space probe is now in ");
|
||||||
|
cramlc(1, probecx, probecy);
|
||||||
|
prout(".\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Update star chart if Radio is working or have access to
|
||||||
|
radio. */
|
||||||
|
if (REPORTS)
|
||||||
|
starch[probecx][probecy] = damage[DRADIO] > 0.0 ?
|
||||||
|
d.galaxy[probecx][probecy]+1000 : 1;
|
||||||
|
proben--; // One less to travel
|
||||||
|
if (proben == 0 && isarmed &&
|
||||||
|
d.galaxy[probecx][probecy] % 10 > 0) {
|
||||||
|
/* lets blow the sucker! */
|
||||||
|
snova(1,0);
|
||||||
|
future[FDSPROB] = 1e30;
|
||||||
|
if (d.galaxy[quadx][quady] == 1000) return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void waiting(void) {
|
||||||
|
int key;
|
||||||
|
double temp, delay, origTime;
|
||||||
|
|
||||||
|
ididit = 0;
|
||||||
|
for (;;) {
|
||||||
|
key = scan();
|
||||||
|
if (key != IHEOL) break;
|
||||||
|
proutn("How long? ");
|
||||||
|
}
|
||||||
|
chew();
|
||||||
|
if (key != IHREAL) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
origTime = delay = aaitem;
|
||||||
|
if (delay <= 0.0) return;
|
||||||
|
if (delay >= d.remtime || nenhere != 0) {
|
||||||
|
prout("Are you sure? ");
|
||||||
|
if (ja() == 0) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Alternate resting periods (events) with attacks */
|
||||||
|
|
||||||
|
resting = 1;
|
||||||
|
do {
|
||||||
|
if (delay <= 0) resting = 0;
|
||||||
|
if (resting == 0) {
|
||||||
|
cramf(d.remtime, 0, 2);
|
||||||
|
prout(" stardates left.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
temp = Time = delay;
|
||||||
|
|
||||||
|
if (nenhere) {
|
||||||
|
double rtime = 1.0 + Rand();
|
||||||
|
if (rtime < temp) temp = rtime;
|
||||||
|
Time = temp;
|
||||||
|
}
|
||||||
|
if (Time < delay) attack(0);
|
||||||
|
if (nenhere==0) movetho();
|
||||||
|
if (alldone) return;
|
||||||
|
events();
|
||||||
|
ididit = 1;
|
||||||
|
if (alldone) return;
|
||||||
|
delay -= temp;
|
||||||
|
} while (d.galaxy[quadx][quady] != 1000); // leave if quadrant supernovas
|
||||||
|
|
||||||
|
resting = 0;
|
||||||
|
Time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nova(int ix, int iy) {
|
||||||
|
static double course[] =
|
||||||
|
{0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5};
|
||||||
|
int bot, top, top2, burst, hits[11][3], kount, icx, icy, mm, nn, j;
|
||||||
|
int iquad, iquad1, i, ll, newcx, newcy, ii, jj;
|
||||||
|
if (Rand() < 0.05) {
|
||||||
|
/* Wow! We've supernova'ed */
|
||||||
|
snova(ix, iy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* handle initial nova */
|
||||||
|
quad[ix][iy] = IHDOT;
|
||||||
|
crmena(1, IHSTAR, 2, ix, iy);
|
||||||
|
prout(" novas.");
|
||||||
|
d.galaxy[quadx][quady] -= 1;
|
||||||
|
d.starkl++;
|
||||||
|
|
||||||
|
/* Set up stack to recursively trigger adjacent stars */
|
||||||
|
bot = top = top2 = 1;
|
||||||
|
kount = 0;
|
||||||
|
icx = icy = 0;
|
||||||
|
hits[1][1] = ix;
|
||||||
|
hits[1][2] = iy;
|
||||||
|
while (1) {
|
||||||
|
for (mm = bot; mm <= top; mm++)
|
||||||
|
for (nn = 1; nn <= 3; nn++) /* nn,j represents coordinates around current */
|
||||||
|
for (j = 1; j <= 3; j++) {
|
||||||
|
if (j==2 && nn== 2) continue;
|
||||||
|
ii = hits[mm][1]+nn-2;
|
||||||
|
jj = hits[mm][2]+j-2;
|
||||||
|
if (ii < 1 || ii > 10 || jj < 1 || jj > 10) continue;
|
||||||
|
iquad = quad[ii][jj];
|
||||||
|
switch (iquad) {
|
||||||
|
// case IHDOT: /* Empty space ends reaction
|
||||||
|
// case IHQUEST:
|
||||||
|
// case IHBLANK:
|
||||||
|
// case IHT:
|
||||||
|
// case IHWEB:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case IHSTAR: /* Affect another star */
|
||||||
|
if (Rand() < 0.05) {
|
||||||
|
/* This star supernovas */
|
||||||
|
snova(ii,jj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
top2++;
|
||||||
|
hits[top2][1]=ii;
|
||||||
|
hits[top2][2]=jj;
|
||||||
|
d.galaxy[quadx][quady] -= 1;
|
||||||
|
d.starkl++;
|
||||||
|
crmena(1, IHSTAR, 2, ii, jj);
|
||||||
|
prout(" novas.");
|
||||||
|
quad[ii][jj] = IHDOT;
|
||||||
|
break;
|
||||||
|
case IHP: /* Destroy planet */
|
||||||
|
d.newstuf[quadx][quady] -= 1;
|
||||||
|
d.nplankl++;
|
||||||
|
crmena(1, IHP, 2, ii, jj);
|
||||||
|
prout(" destroyed.");
|
||||||
|
d.plnets[iplnet] = nulplanet;
|
||||||
|
iplnet = plnetx = plnety = 0;
|
||||||
|
if (landed == 1) {
|
||||||
|
finish(FPNOVA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
quad[ii][jj] = IHDOT;
|
||||||
|
break;
|
||||||
|
case IHB: /* Destroy base */
|
||||||
|
d.galaxy[quadx][quady] -= 10;
|
||||||
|
for (i = 1; i <= d.rembase; i++)
|
||||||
|
if (d.baseqx[i]==quadx && d.baseqy[i]==quady) break;
|
||||||
|
d.baseqx[i] = d.baseqx[d.rembase];
|
||||||
|
d.baseqy[i] = d.baseqy[d.rembase];
|
||||||
|
d.rembase--;
|
||||||
|
basex = basey = 0;
|
||||||
|
d.basekl++;
|
||||||
|
newcnd();
|
||||||
|
crmena(1, IHB, 2, ii, jj);
|
||||||
|
prout(" destroyed.");
|
||||||
|
quad[ii][jj] = IHDOT;
|
||||||
|
break;
|
||||||
|
case IHE: /* Buffet ship */
|
||||||
|
case IHF:
|
||||||
|
prout("***Starship buffeted by nova.");
|
||||||
|
if (shldup) {
|
||||||
|
if (shield >= 2000.0) shield -= 2000.0;
|
||||||
|
else {
|
||||||
|
double diff = 2000.0 - shield;
|
||||||
|
energy -= diff;
|
||||||
|
shield = 0.0;
|
||||||
|
shldup = 0;
|
||||||
|
prout("***Shields knocked out.");
|
||||||
|
damage[DSHIELD] += 0.005*damfac*Rand()*diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else energy -= 2000.0;
|
||||||
|
if (energy <= 0) {
|
||||||
|
finish(FNOVA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* add in course nova contributes to kicking starship*/
|
||||||
|
icx += sectx-hits[mm][1];
|
||||||
|
icy += secty-hits[mm][2];
|
||||||
|
kount++;
|
||||||
|
break;
|
||||||
|
case IHK: /* kill klingon */
|
||||||
|
deadkl(ii,jj,iquad, ii, jj);
|
||||||
|
break;
|
||||||
|
case IHC: /* Damage/destroy big enemies */
|
||||||
|
case IHS:
|
||||||
|
case IHR:
|
||||||
|
for (ll = 1; ll <= nenhere; ll++)
|
||||||
|
if (kx[ll]==ii && ky[ll]==jj) break;
|
||||||
|
kpower[ll] -= 800.0; /* If firepower is lost, die */
|
||||||
|
if (kpower[ll] <= 0.0) {
|
||||||
|
deadkl(ii, jj, iquad, ii, jj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
newcx = ii + ii - hits[mm][1];
|
||||||
|
newcy = jj + jj - hits[mm][2];
|
||||||
|
crmena(1, iquad, 2, ii, jj);
|
||||||
|
proutn(" damaged");
|
||||||
|
if (newcx<1 || newcx>10 || newcy<1 || newcy>10) {
|
||||||
|
/* can't leave quadrant */
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iquad1 = quad[newcx][newcy];
|
||||||
|
if (iquad1 == IHBLANK) {
|
||||||
|
proutn(", blasted into ");
|
||||||
|
crmena(0, IHBLANK, 2, newcx, newcy);
|
||||||
|
skip(1);
|
||||||
|
deadkl(ii, jj, iquad, newcx, newcy);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (iquad1 != IHDOT) {
|
||||||
|
/* can't move into something else */
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
proutn(", buffeted to");
|
||||||
|
cramlc(2, newcx, newcy);
|
||||||
|
quad[ii][jj] = IHDOT;
|
||||||
|
quad[newcx][newcy] = iquad;
|
||||||
|
kx[ll] = newcx;
|
||||||
|
ky[ll] = newcy;
|
||||||
|
kavgd[ll] = sqrt(square(sectx-newcx)+square(secty-newcy));
|
||||||
|
kdist[ll] = kavgd[ll];
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (top == top2) break;
|
||||||
|
bot = top + 1;
|
||||||
|
top = top2;
|
||||||
|
}
|
||||||
|
if (kount==0) return;
|
||||||
|
|
||||||
|
/* Starship affected by nova -- kick it away. */
|
||||||
|
dist = kount*0.1;
|
||||||
|
if (icx) icx = (icx < 0 ? -1 : 1);
|
||||||
|
if (icy) icy = (icy < 0 ? -1 : 1);
|
||||||
|
direc = course[3*(icx+1)+icy+2];
|
||||||
|
if (direc == 0.0) dist = 0.0;
|
||||||
|
if (dist == 0.0) return;
|
||||||
|
Time = 10.0*dist/16.0;
|
||||||
|
skip(1);
|
||||||
|
prout("Force of nova displaces starship.");
|
||||||
|
iattak=2; /* Eliminates recursion problem */
|
||||||
|
lmove();
|
||||||
|
Time = 10.0*dist/16.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void snova(int insx, int insy) {
|
||||||
|
int comdead, nqx, nqy, nsx, nsy, num, kldead, iscdead;
|
||||||
|
int nrmdead, npdead;
|
||||||
|
int insipient=0;
|
||||||
|
|
||||||
|
nsx = insx;
|
||||||
|
nsy = insy;
|
||||||
|
|
||||||
|
if (insy== 0) {
|
||||||
|
if (insx == 1) {
|
||||||
|
/* NOVAMAX being used */
|
||||||
|
nqx = probecx;
|
||||||
|
nqy = probecy;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int stars = 0;
|
||||||
|
/* Scheduled supernova -- select star */
|
||||||
|
/* logic changed here so that we won't favor quadrants in top
|
||||||
|
left of universe */
|
||||||
|
for (nqx = 1; nqx<=8; nqx++) {
|
||||||
|
for (nqy = 1; nqy<=8; nqy++) {
|
||||||
|
stars += d.galaxy[nqx][nqy] % 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stars == 0) return; /* nothing to supernova exists */
|
||||||
|
num = Rand()*stars + 1;
|
||||||
|
for (nqx = 1; nqx<=8; nqx++) {
|
||||||
|
for (nqy = 1; nqy<=8; nqy++) {
|
||||||
|
num -= d.galaxy[nqx][nqy] % 10;
|
||||||
|
if (num <= 0) break;
|
||||||
|
}
|
||||||
|
if (num <=0) break;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) {
|
||||||
|
proutn("Super nova here?");
|
||||||
|
if (ja()==1) {
|
||||||
|
nqx = quadx;
|
||||||
|
nqy = quady;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nqx != quady || nqy != quady || justin != 0) {
|
||||||
|
/* it isn't here, or we just entered (treat as inroute) */
|
||||||
|
if (REPORTS) {
|
||||||
|
skip(1);
|
||||||
|
proutn("Message from Starfleet Command Stardate ");
|
||||||
|
cramf(d.date, 0, 1);
|
||||||
|
skip(1);
|
||||||
|
proutn(" Supernova in");
|
||||||
|
cramlc(1, nqx, nqy);
|
||||||
|
prout("; caution advised.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* we are in the quadrant! */
|
||||||
|
insipient = 1;
|
||||||
|
num = Rand()* (d.galaxy[nqx][nqy]%10) + 1;
|
||||||
|
for (nsx=1; nsx < 10; nsx++) {
|
||||||
|
for (nsy=1; nsy < 10; nsy++) {
|
||||||
|
if (quad[nsx][nsy]==IHSTAR) {
|
||||||
|
num--;
|
||||||
|
if (num==0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (num==0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
insipient = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (insipient) {
|
||||||
|
skip(1);
|
||||||
|
prouts("***RED ALERT! RED ALERT!");
|
||||||
|
skip(1);
|
||||||
|
proutn("***Incipient supernova detected at");
|
||||||
|
cramlc(2, nsx, nsy);
|
||||||
|
skip(1);
|
||||||
|
nqx = quadx;
|
||||||
|
nqy = quady;
|
||||||
|
if (square(nsx-sectx) + square(nsy-secty) <= 2.1) {
|
||||||
|
proutn("Emergency override attempts t");
|
||||||
|
prouts("***************");
|
||||||
|
skip(1);
|
||||||
|
stars();
|
||||||
|
alldone=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* destroy any Klingons in supernovaed quadrant */
|
||||||
|
num=d.galaxy[nqx][nqy];
|
||||||
|
kldead = num/100;
|
||||||
|
d.remkl -= kldead; // Moved here to correctly set remaining Klingon count
|
||||||
|
comdead = iscdead = 0;
|
||||||
|
if (nqx==d.isx && nqy == d.isy) {
|
||||||
|
/* did in the Supercommander! */
|
||||||
|
d.nscrem = d.isx = d.isy = isatb = iscate = 0;
|
||||||
|
iscdead = 1;
|
||||||
|
kldead--; /* Get proper kill credit */
|
||||||
|
future[FSCMOVE] = future[FSCDBAS] = 1e30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d.remcom) {
|
||||||
|
int maxloop = d.remcom, l;
|
||||||
|
for (l = 1; l <= maxloop; l++) {
|
||||||
|
if (d.cx[l] == nqx && d.cy[l] == nqy) {
|
||||||
|
d.cx[l] = d.cx[d.remcom];
|
||||||
|
d.cy[l] = d.cy[d.remcom];
|
||||||
|
d.cx[d.remcom] = d.cy[d.remcom] = 0;
|
||||||
|
d.remcom--;
|
||||||
|
kldead--;
|
||||||
|
comdead++;
|
||||||
|
if (d.remcom==0) future[FTBEAM] = 1e30;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* destroy Romulans and planets in supernovaed quadrant */
|
||||||
|
num = d.newstuf[nqx][nqy];
|
||||||
|
d.newstuf[nqx][nqy] = 0;
|
||||||
|
nrmdead = num/10;
|
||||||
|
d.nromrem -= nrmdead;
|
||||||
|
npdead = num - nrmdead*10;
|
||||||
|
if (npdead) {
|
||||||
|
int l;
|
||||||
|
for (l = 1; l <= inplan; l++)
|
||||||
|
if (d.plnets[l].x == nqx && d.plnets[l].y == nqy) {
|
||||||
|
d.plnets[l] = nulplanet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Destroy any base in supernovaed quadrant */
|
||||||
|
if (d.rembase) {
|
||||||
|
int maxloop = d.rembase, l;
|
||||||
|
for (l = 1; l <= maxloop; l++)
|
||||||
|
if (d.baseqx[l]==nqx && d.baseqy[l]==nqy) {
|
||||||
|
d.baseqx[l] = d.baseqx[d.rembase];
|
||||||
|
d.baseqy[l] = d.baseqy[d.rembase];
|
||||||
|
d.baseqx[d.rembase] = d.baseqy[d.rembase] = 0;
|
||||||
|
d.rembase--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* If starship caused supernova, tally up destruction */
|
||||||
|
if (insx) {
|
||||||
|
num = d.galaxy[nqx][nqy] % 100;
|
||||||
|
d.starkl += num % 10;
|
||||||
|
d.basekl += num/10;
|
||||||
|
d.killk += kldead;
|
||||||
|
d.killc += comdead;
|
||||||
|
d.nromkl += nrmdead;
|
||||||
|
d.nplankl += npdead;
|
||||||
|
d.nsckill += iscdead;
|
||||||
|
}
|
||||||
|
/* mark supernova in galaxy and in star chart */
|
||||||
|
if ((quadx == nqx && quady == nqy) || REPORTS)
|
||||||
|
starch[nqx][nqy] = 1;
|
||||||
|
d.galaxy[nqx][nqy] = 1000;
|
||||||
|
/* If supernova destroys last klingons give special message */
|
||||||
|
if (d.remkl==0 && (nqx != quadx || nqy != quady)) {
|
||||||
|
skip(2);
|
||||||
|
if (insx == 0) prout("Lucky you!");
|
||||||
|
proutn("A supernova in");
|
||||||
|
cramlc(1, nqx, nqy);
|
||||||
|
prout(" has just destroyed the last Klingons.");
|
||||||
|
finish(FWON);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* if some Klingons remain, continue or die in supernova */
|
||||||
|
if (alldone) finish(FSNOVAED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
513
programs/games/sstartrek/en/finish.c
Normal file
513
programs/games/sstartrek/en/finish.c
Normal file
@ -0,0 +1,513 @@
|
|||||||
|
#include "sst.h"
|
||||||
|
#include <string.h>
|
||||||
|
#ifndef KOS32
|
||||||
|
#include <time.h>
|
||||||
|
#else
|
||||||
|
#include <kolibrisys.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void dstrct() {
|
||||||
|
/* Finish with a BANG! */
|
||||||
|
chew();
|
||||||
|
if (damage[DCOMPTR] != 0.0) {
|
||||||
|
prout("Computer damaged; cannot execute destruct sequence.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
prouts("---WORKING---"); skip(1);
|
||||||
|
prout("SELF-DESTRUCT-SEQUENCE-ACTIVATED");
|
||||||
|
prouts(" 10"); skip(1);
|
||||||
|
prouts(" 9"); skip(1);
|
||||||
|
prouts(" 8"); skip(1);
|
||||||
|
prouts(" 7"); skip(1);
|
||||||
|
prouts(" 6"); skip(1);
|
||||||
|
prout("ENTER-CORRECT-PASSWORD-TO-CONTINUE-");
|
||||||
|
prout("SELF-DESTRUCT-SEQUENCE-OTHERWISE-");
|
||||||
|
prout("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED");
|
||||||
|
scan();
|
||||||
|
chew();
|
||||||
|
if (strcmp(passwd, citem) != 0) {
|
||||||
|
prouts("PASSWORD-REJECTED;"); skip(1);
|
||||||
|
prout("CONTINUITY-EFFECTED");
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prouts("PASSWORD-ACCEPTED"); skip(1);
|
||||||
|
prouts(" 5"); skip(1);
|
||||||
|
prouts(" 4"); skip(1);
|
||||||
|
prouts(" 3"); skip(1);
|
||||||
|
prouts(" 2"); skip(1);
|
||||||
|
prouts(" 1"); skip(1);
|
||||||
|
if (Rand() < 0.15) {
|
||||||
|
prouts("GOODBYE-CRUEL-WORLD");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
skip(2);
|
||||||
|
kaboom();
|
||||||
|
}
|
||||||
|
|
||||||
|
void kaboom(void) {
|
||||||
|
stars();
|
||||||
|
if (ship==IHE) prouts("***");
|
||||||
|
prouts("********* Entropy of ");
|
||||||
|
crmshp();
|
||||||
|
prouts(" maximized *********");
|
||||||
|
skip(1);
|
||||||
|
stars();
|
||||||
|
skip(1);
|
||||||
|
if (nenhere != 0) {
|
||||||
|
double whammo = 25.0 * energy;
|
||||||
|
int l=1;
|
||||||
|
while (l <= nenhere) {
|
||||||
|
if (kpower[l]*kdist[l] <= whammo)
|
||||||
|
deadkl(kx[l],ky[l], quad[kx[l]][ky[l]], kx[l], ky[l]);
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finish(FDILITHIUM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void finish(FINTYPE ifin) {
|
||||||
|
int igotit = 0;
|
||||||
|
alldone = 1;
|
||||||
|
skip(3);
|
||||||
|
printf("It is stardate %.1f .\n\n", d.date);
|
||||||
|
switch (ifin) {
|
||||||
|
case FWON: // Game has been won
|
||||||
|
if (d.nromrem != 0)
|
||||||
|
printf("The remaining %d Romulans surrender to Starfleet Command.\n",
|
||||||
|
d.nromrem);
|
||||||
|
|
||||||
|
|
||||||
|
prout("You have smashed the Klingon invasion fleet and saved");
|
||||||
|
prout("the Federation.");
|
||||||
|
|
||||||
|
#ifdef CAPTURE
|
||||||
|
if (alive && brigcapacity-brigfree > 0) { // captured Klingon crew will get transfered to starbase
|
||||||
|
kcaptured += brigcapacity-brigfree;
|
||||||
|
printf("The %d captured Klingons are transferred to Star Fleet Command.\n",
|
||||||
|
brigcapacity-brigfree);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
gamewon=1;
|
||||||
|
if (alive) {
|
||||||
|
double badpt;
|
||||||
|
|
||||||
|
badpt = 5.*d.starkl + casual + 10.*d.nplankl +
|
||||||
|
45.*nhelp+100.*d.basekl;
|
||||||
|
if (ship == IHF) badpt += 100.0;
|
||||||
|
else if (ship == 0) badpt += 200.0;
|
||||||
|
if (badpt < 100.0) badpt = 0.0; // Close enough!
|
||||||
|
if (d.date-indate < 5.0 ||
|
||||||
|
// killsPerDate >= RateMax
|
||||||
|
(d.killk+d.killc+d.nsckill)/(d.date-indate) >=
|
||||||
|
0.1*skill*(skill+1.0) + 0.1 + 0.008*badpt) {
|
||||||
|
skip(1);
|
||||||
|
prout("In fact, you have done so well that Starfleet Command");
|
||||||
|
switch (skill) {
|
||||||
|
case SNOVICE:
|
||||||
|
prout("promotes you one step in rank from \"Novice\" to \"Fair\".");
|
||||||
|
break;
|
||||||
|
case SFAIR:
|
||||||
|
prout("promotes you one step in rank from \"Fair\" to \"Good\".");
|
||||||
|
break;
|
||||||
|
case SGOOD:
|
||||||
|
prout("promotes you one step in rank from \"Good\" to \"Expert\".");
|
||||||
|
break;
|
||||||
|
case SEXPERT:
|
||||||
|
prout("promotes you to Commodore Emeritus.");
|
||||||
|
skip(1);
|
||||||
|
prout("Now that you think you're really good, try playing");
|
||||||
|
prout("the \"Emeritus\" game. It will splatter your ego.");
|
||||||
|
break;
|
||||||
|
case SEMERITUS:
|
||||||
|
skip(1);
|
||||||
|
prout("Computer- ERROR-ERROR-ERROR-ERROR");
|
||||||
|
skip(1);
|
||||||
|
prout(" YOUR-SKILL-HAS-EXCEEDED-THE-CAPACITY-OF-THIS-PROGRAM");
|
||||||
|
prout(" THIS-PROGRAM-MUST-SURVIVE");
|
||||||
|
prout(" THIS-PROGRAM-MUST-SURVIVE");
|
||||||
|
prout(" THIS-PROGRAM-MUST-SURVIVE");
|
||||||
|
prout(" THIS-PROGRAM-MUST?- MUST ? - SUR? ? -? VI");
|
||||||
|
skip(1);
|
||||||
|
prout("Now you can retire and write your own Star Trek game!");
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (skill > SGOOD) {
|
||||||
|
if (thawed
|
||||||
|
#ifdef DEBUG
|
||||||
|
&& !idebug
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
prout("You cannot get a citation, so...");
|
||||||
|
else {
|
||||||
|
prout("Do you want your Commodore Emeritus Citation printed?");
|
||||||
|
proutn("(You need a 132 column printer.)");
|
||||||
|
chew();
|
||||||
|
if (ja()) {
|
||||||
|
igotit = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Only grant long life if alive (original didn't!)
|
||||||
|
skip(1);
|
||||||
|
prout("LIVE LONG AND PROSPER.");
|
||||||
|
}
|
||||||
|
score(0);
|
||||||
|
if (igotit != 0) plaque();
|
||||||
|
return;
|
||||||
|
case FDEPLETE: // Federation Resources Depleted
|
||||||
|
prout("Your time has run out and the Federation has been");
|
||||||
|
prout("conquered. Your starship is now Klingon property,");
|
||||||
|
prout("and you are put on trial as a war criminal. On the");
|
||||||
|
proutn("basis of your record, you are ");
|
||||||
|
if (d.remkl*3.0 > inkling) {
|
||||||
|
prout("aquitted.");
|
||||||
|
skip(1);
|
||||||
|
prout("LIVE LONG AND PROSPER.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prout("found guilty and");
|
||||||
|
prout("sentenced to death by slow torture.");
|
||||||
|
alive = 0;
|
||||||
|
}
|
||||||
|
score(0);
|
||||||
|
return;
|
||||||
|
case FLIFESUP:
|
||||||
|
prout("Your life support reserves have run out, and");
|
||||||
|
prout("you die of thirst, starvation, and asphyxiation.");
|
||||||
|
prout("Your starship is a derelict in space.");
|
||||||
|
break;
|
||||||
|
case FNRG:
|
||||||
|
prout("Your energy supply is exhausted.");
|
||||||
|
skip(1);
|
||||||
|
prout("Your starship is a derelict in space.");
|
||||||
|
break;
|
||||||
|
case FBATTLE:
|
||||||
|
proutn("The ");
|
||||||
|
crmshp();
|
||||||
|
prout("has been destroyed in battle.");
|
||||||
|
skip(1);
|
||||||
|
prout("Dulce et decorum est pro patria mori.");
|
||||||
|
break;
|
||||||
|
case FNEG3:
|
||||||
|
prout("You have made three attempts to cross the negative energy");
|
||||||
|
prout("barrier which surrounds the galaxy.");
|
||||||
|
skip(1);
|
||||||
|
prout("Your navigation is abominable.");
|
||||||
|
score(0);
|
||||||
|
return;
|
||||||
|
case FNOVA:
|
||||||
|
prout("Your starship has been destroyed by a nova.");
|
||||||
|
prout("That was a great shot.");
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
case FSNOVAED:
|
||||||
|
proutn("The ");
|
||||||
|
crmshp();
|
||||||
|
prout(" has been fried by a supernova.");
|
||||||
|
prout("...Not even cinders remain...");
|
||||||
|
break;
|
||||||
|
case FABANDN:
|
||||||
|
prout("You have been captured by the Klingons. If you still");
|
||||||
|
prout("had a starbase to be returned to, you would have been");
|
||||||
|
prout("repatriated and given another chance. Since you have");
|
||||||
|
prout("no starbases, you will be mercilessly tortured to death.");
|
||||||
|
break;
|
||||||
|
case FDILITHIUM:
|
||||||
|
prout("Your starship is now an expanding cloud of subatomic particles");
|
||||||
|
break;
|
||||||
|
case FMATERIALIZE:
|
||||||
|
prout("Starbase was unable to re-materialize your starship.");
|
||||||
|
prout("Sic transit gloria muntdi");
|
||||||
|
break;
|
||||||
|
case FPHASER:
|
||||||
|
proutn("The ");
|
||||||
|
crmshp();
|
||||||
|
prout(" has been cremated by its own phasers.");
|
||||||
|
break;
|
||||||
|
case FLOST:
|
||||||
|
prout("You and your landing party have been");
|
||||||
|
prout("converted to energy, dissipating through space.");
|
||||||
|
break;
|
||||||
|
case FMINING:
|
||||||
|
prout("You are left with your landing party on");
|
||||||
|
prout("a wild jungle planet inhabited by primitive cannibals.");
|
||||||
|
skip(1);
|
||||||
|
prout("They are very fond of \"Captain Kirk\" soup.");
|
||||||
|
skip(1);
|
||||||
|
proutn("Without your leadership, the ");
|
||||||
|
crmshp();
|
||||||
|
prout(" is destroyed.");
|
||||||
|
break;
|
||||||
|
case FDPLANET:
|
||||||
|
prout("You and your mining party perish.");
|
||||||
|
skip(1);
|
||||||
|
prout("That was a great shot.");
|
||||||
|
skip(1);
|
||||||
|
break;
|
||||||
|
case FSSC:
|
||||||
|
prout("The Galileo is instantly annihilated by the supernova.");
|
||||||
|
// no break;
|
||||||
|
case FPNOVA:
|
||||||
|
prout("You and your mining party are atomized.");
|
||||||
|
skip(1);
|
||||||
|
proutn("Mr. Spock takes command of the ");
|
||||||
|
crmshp();
|
||||||
|
prout(" and");
|
||||||
|
prout("joins the Romulans, reigning terror on the Federation.");
|
||||||
|
break;
|
||||||
|
case FSTRACTOR:
|
||||||
|
prout("The shuttle craft Galileo is also caught,");
|
||||||
|
prout("and breaks up under the strain.");
|
||||||
|
skip(1);
|
||||||
|
prout("Your debris is scattered for millions of miles.");
|
||||||
|
proutn("Without your leadership, the ");
|
||||||
|
crmshp();
|
||||||
|
prout(" is destroyed.");
|
||||||
|
break;
|
||||||
|
case FDRAY:
|
||||||
|
prout("The mutants attack and kill Spock.");
|
||||||
|
prout("Your ship is captured by Klingons, and");
|
||||||
|
prout("your crew is put on display in a Klingon zoo.");
|
||||||
|
break;
|
||||||
|
case FTRIBBLE:
|
||||||
|
prout("Tribbles consume all remaining water,");
|
||||||
|
prout("food, and oxygen on your ship.");
|
||||||
|
skip(1);
|
||||||
|
prout("You die of thirst, starvation, and asphyxiation.");
|
||||||
|
prout("Your starship is a derelict in space.");
|
||||||
|
break;
|
||||||
|
case FHOLE:
|
||||||
|
prout("Your ship is drawn to the center of the black hole.");
|
||||||
|
prout("You are crushed into extremely dense matter.");
|
||||||
|
break;
|
||||||
|
#ifdef CLOAKING
|
||||||
|
case FCLOAK:
|
||||||
|
ncviol++;
|
||||||
|
prout("You have violated the Treaty of Algeron.");
|
||||||
|
prout("The Romulan Empire can never trust you again.");
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (ifin!=FWON && ifin!=FCLOAK && iscloaked!=0) {
|
||||||
|
prout("Your ship was cloaked so your subspace radio did not receive anything.");
|
||||||
|
prout("You may have missed some warning messages.");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ship==IHF) ship= 0;
|
||||||
|
else if (ship == IHE) ship = IHF;
|
||||||
|
alive = 0;
|
||||||
|
if (d.remkl != 0) {
|
||||||
|
double goodies = d.remres/inresor;
|
||||||
|
double baddies = (d.remkl + 2.0*d.remcom)/(inkling+2.0*incom);
|
||||||
|
if (goodies/baddies >= 1.0+0.5*Rand()) {
|
||||||
|
prout("As a result of your actions, a treaty with the Klingon");
|
||||||
|
prout("Empire has been signed. The terms of the treaty are");
|
||||||
|
if (goodies/baddies >= 3.0+Rand()) {
|
||||||
|
prout("favorable to the Federation.");
|
||||||
|
skip(1);
|
||||||
|
prout("Congratulations!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
prout("highly unfavorable to the Federation.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
prout("The Federation will be destroyed.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prout("Since you took the last Klingon with you, you are a");
|
||||||
|
prout("martyr and a hero. Someday maybe they'll erect a");
|
||||||
|
prout("statue in your memory. Rest in peace, and try not");
|
||||||
|
prout("to think about pigeons.");
|
||||||
|
gamewon = 1;
|
||||||
|
}
|
||||||
|
score(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void score(int inGame) {
|
||||||
|
double timused = d.date - indate;
|
||||||
|
int ithperd, iwon, klship;
|
||||||
|
int dnromrem = d.nromrem; // Leave global value alone
|
||||||
|
|
||||||
|
if (!inGame) pause(0);
|
||||||
|
|
||||||
|
iskill = skill;
|
||||||
|
if ((timused == 0 || d.remkl != 0) && timused < 5.0) timused = 5.0;
|
||||||
|
perdate = (d.killc + d.killk + d.nsckill)/timused;
|
||||||
|
ithperd = 500*perdate + 0.5;
|
||||||
|
iwon = 0;
|
||||||
|
if (gamewon) iwon = 100*skill;
|
||||||
|
if (ship == IHE) klship = 0;
|
||||||
|
else if (ship == IHF) klship = 1;
|
||||||
|
else klship = 2;
|
||||||
|
if (gamewon == 0 || inGame) dnromrem = 0; // None captured if no win or if still in the game
|
||||||
|
iscore = 10*d.killk + 50*d.killc + ithperd + iwon
|
||||||
|
- 100*d.basekl - 100*klship - 45*nhelp -5*d.starkl - casual
|
||||||
|
+ 20*d.nromkl + 200*d.nsckill - 10*d.nplankl + dnromrem;
|
||||||
|
#ifdef CLOAKING
|
||||||
|
iscore -= 100*ncviol;
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
iscore += 3*kcaptured;
|
||||||
|
#endif
|
||||||
|
if (alive == 0) iscore -= 200;
|
||||||
|
skip(2);
|
||||||
|
if (inGame) prout("Your score so far --");
|
||||||
|
else prout("Your score --");
|
||||||
|
if (d.nromkl)
|
||||||
|
printf(d.nromkl> 1 ? "%6d Romulan ships destroyed %5d\n" : "%6d Romulan ship destroyed %5d\n",
|
||||||
|
d.nromkl, 20*d.nromkl);
|
||||||
|
if (dnromrem)
|
||||||
|
printf(dnromrem > 1 ? "%6d Romulan ships captured %5d\n" : "%6d Romulan ship captured %5d\n",
|
||||||
|
dnromrem, dnromrem);
|
||||||
|
if (d.killk)
|
||||||
|
printf(d.killk > 1 ? "%6d ordinary Klingon ships destroyed %5d\n" : "%6d ordinary Klingon ship destroyed %5d\n",
|
||||||
|
d.killk, 10*d.killk);
|
||||||
|
if (d.killc)
|
||||||
|
printf(d.killc > 1 ? "%6d Klingon Commander ships destroyed %5d\n" : "%6d Klingon Commander ship destroyed %5d\n",
|
||||||
|
d.killc, 50*d.killc);
|
||||||
|
if (d.nsckill)
|
||||||
|
printf("%6d Super-Commander ship destroyed %5d\n",
|
||||||
|
d.nsckill, 200*d.nsckill);
|
||||||
|
if (ithperd)
|
||||||
|
printf("%6.2f Klingons per stardate %5d\n",
|
||||||
|
perdate, ithperd);
|
||||||
|
#ifdef CAPTURE
|
||||||
|
if (kcaptured)
|
||||||
|
printf(kcaptured > 1 ? "%6d Klingons captured %5d\n" : "%6d Klingon captured %5d\n",
|
||||||
|
kcaptured, 3*kcaptured);
|
||||||
|
#endif
|
||||||
|
if (d.starkl)
|
||||||
|
printf(d.starkl > 1 ? "%6d stars destroyed by your action %5d\n" : "%6d star destroyed by your action %5d\n",
|
||||||
|
d.starkl, -5*d.starkl);
|
||||||
|
if (d.nplankl)
|
||||||
|
printf(d.nplankl > 1 ? "%6d planets destroyed by your action %5d\n" : "%6d planet destroyed by your action %5d\n",
|
||||||
|
d.nplankl, -10*d.nplankl);
|
||||||
|
if (d.basekl)
|
||||||
|
printf(d.basekl > 1 ? "%6d bases destroyed by your action %5d\n" : "%6d base destroyed by your action %5d\n",
|
||||||
|
d.basekl, -100*d.basekl);
|
||||||
|
if (nhelp)
|
||||||
|
printf(nhelp > 1 ? "%6d calls for help from starbase %5d\n" : "%6d call for help from starbase %5d\n",
|
||||||
|
nhelp, -45*nhelp);
|
||||||
|
if (casual)
|
||||||
|
printf(casual > 1 ? "%6d casualties incurred %5d\n" : "%6d casualty incurred %5d\n",
|
||||||
|
casual, -casual);
|
||||||
|
if (klship)
|
||||||
|
printf(klship > 1 ? "%6d ships lost or destroyed %5d\n" : "%6d ship lost or destroyed %5d\n",
|
||||||
|
klship, -100*klship);
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (ncviol>0)
|
||||||
|
printf(ncviol > 1 ? "%6d Treaty of Algeron violations %5d\n" : "%6d Treaty of Algeron violation %5d\n",
|
||||||
|
ncviol, -100*ncviol);
|
||||||
|
#endif
|
||||||
|
if (alive==0)
|
||||||
|
prout("Penalty for getting yourself killed -200");
|
||||||
|
if (gamewon) {
|
||||||
|
skip(1);
|
||||||
|
proutn("Bonus for winning ");
|
||||||
|
switch (skill) {
|
||||||
|
case SNOVICE: proutn("Novice game "); break;
|
||||||
|
case SFAIR: proutn("Fair game "); break;
|
||||||
|
case SGOOD: proutn("Good game "); break;
|
||||||
|
case SEXPERT: proutn("Expert game "); break;
|
||||||
|
case SEMERITUS: proutn("Emeritus game"); break;
|
||||||
|
}
|
||||||
|
printf(" %5d\n", iwon);
|
||||||
|
}
|
||||||
|
skip(2);
|
||||||
|
printf("TOTAL SCORE %5d\n", iscore);
|
||||||
|
if (inGame && skill < SGOOD) printf("REMEMBER--The score doesn't really matter until the mission is accomplished!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void plaque(void) {
|
||||||
|
FILE *fp=NULL;
|
||||||
|
#ifndef KOS32
|
||||||
|
time_t t;
|
||||||
|
#else
|
||||||
|
int kos_date, kos_time;
|
||||||
|
#endif
|
||||||
|
char *timestring;
|
||||||
|
int nskip;
|
||||||
|
char winner[128];
|
||||||
|
skip(2);
|
||||||
|
|
||||||
|
while (fp == NULL) {
|
||||||
|
printf("File or device name for your plaque:");
|
||||||
|
#ifndef KOS32
|
||||||
|
fgets(winner, 128, stdin);
|
||||||
|
#else
|
||||||
|
gets(winner);
|
||||||
|
#endif
|
||||||
|
winner[strlen(winner)-1] = '\0';
|
||||||
|
fp = fopen(winner, "w");
|
||||||
|
if (fp==NULL) {
|
||||||
|
printf("Invalid name.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Enter name to go on plaque (up to 30 characters):");
|
||||||
|
#ifndef KOS32
|
||||||
|
fgets(winner, 128, stdin);
|
||||||
|
#else
|
||||||
|
gets(winner);
|
||||||
|
#endif winner[strlen(winner)-1] = '\0';
|
||||||
|
winner[30] = '\0';
|
||||||
|
nskip = 64 - strlen(winner)/2;
|
||||||
|
|
||||||
|
fprintf(fp,"\n\n\n\n");
|
||||||
|
/* --------DRAW ENTERPRISE PICTURE. */
|
||||||
|
fprintf(fp, " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n" );
|
||||||
|
fprintf(fp, " EEE E : : : E\n" );
|
||||||
|
fprintf(fp, " EE EEE E : : NCC-1701 : E\n");
|
||||||
|
fprintf(fp, " EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEE E : : : E\n");
|
||||||
|
fprintf(fp, " E E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n");
|
||||||
|
fprintf(fp, " EEEEEEEEE EEEEEEEEEEEEE E E\n");
|
||||||
|
fprintf(fp, " EEEEEEE EEEEE E E E E\n");
|
||||||
|
fprintf(fp, " EEE E E E E\n");
|
||||||
|
fprintf(fp, " E E E E\n");
|
||||||
|
fprintf(fp, " EEEEEEEEEEEEE E E\n");
|
||||||
|
fprintf(fp, " EEE : EEEEEEE EEEEEEEE\n");
|
||||||
|
fprintf(fp, " :E : EEEE E\n");
|
||||||
|
fprintf(fp, " .-E -:----- E\n");
|
||||||
|
fprintf(fp, " :E : E\n");
|
||||||
|
fprintf(fp, " EE : EEEEEEEE\n");
|
||||||
|
fprintf(fp, " EEEEEEEEEEEEEEEEEEEEEEE\n");
|
||||||
|
fprintf(fp, "\n\n\n");
|
||||||
|
fprintf(fp, " U. S. S. ENTERPRISE\n");
|
||||||
|
fprintf(fp, "\n\n\n\n");
|
||||||
|
fprintf(fp, " For demonstrating outstanding ability as a starship captain\n");
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
fprintf(fp, " Starfleet Command bestows to you\n");
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
fprintf(fp,"%*s%s\n\n", nskip, "", winner);
|
||||||
|
fprintf(fp, " the rank of\n\n");
|
||||||
|
fprintf(fp, " \"Commodore Emeritus\"\n\n");
|
||||||
|
fprintf(fp, " ");
|
||||||
|
switch (iskill) {
|
||||||
|
case SEXPERT: fprintf(fp," Expert level\n\n"); break;
|
||||||
|
case SEMERITUS: fprintf(fp,"Emeritus level\n\n"); break;
|
||||||
|
default: fprintf(fp," Cheat level\n\n"); break;
|
||||||
|
}
|
||||||
|
#ifndef KOS32
|
||||||
|
t = time(NULL);
|
||||||
|
timestring = ctime(&t);
|
||||||
|
fprintf(fp, " This day of %.6s %.4s, %.8s\n\n",
|
||||||
|
timestring+4, timestring+20, timestring+11);
|
||||||
|
#else
|
||||||
|
kos_date = _ksys_get_date();
|
||||||
|
kos_time = _ksys_get_system_clock();
|
||||||
|
fprintf(fp, " This day of %02i/%02i/%02i %02i:%02i:%02i\n\n",
|
||||||
|
kos_date >> 16, (kos_date & 0xFF00) >> 8, (kos_date & 0xFF) + 2000,
|
||||||
|
kos_time & 0xFF, (kos_time & 0xFF00) >> 8, kos_time >> 16 );
|
||||||
|
#endif
|
||||||
|
fprintf(fp," Your score: %d\n\n", iscore);
|
||||||
|
fprintf(fp," Klingons per stardate: %.2f\n", perdate);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
19
programs/games/sstartrek/en/makefile
Normal file
19
programs/games/sstartrek/en/makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# CFLAGS= -O -DSCORE -DCAPTURE -DCLOAKING -Wno-unused-result
|
||||||
|
CFLAGS= -O -Wno-unused-result -DWINDOWS
|
||||||
|
CC=gcc
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
OFILES= sst.o finish.o reports.o setup.o osx.o moving.o battle.o events.o ai.o planets.o
|
||||||
|
|
||||||
|
HFILES= sst.h
|
||||||
|
|
||||||
|
sst: $(OFILES)
|
||||||
|
gcc -o sst $(OFILES) -lm
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm $(OFILES)
|
||||||
|
|
||||||
|
$(OFILES): $(HFILES)
|
||||||
|
|
1017
programs/games/sstartrek/en/moving.c
Normal file
1017
programs/games/sstartrek/en/moving.c
Normal file
File diff suppressed because it is too large
Load Diff
48
programs/games/sstartrek/en/osx.c
Normal file
48
programs/games/sstartrek/en/osx.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifndef KOS32
|
||||||
|
#include <time.h>
|
||||||
|
#else
|
||||||
|
#include <kos32sys1.h>
|
||||||
|
#endif
|
||||||
|
#ifndef WINDOWS
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void randomize(void) {
|
||||||
|
#ifndef KOS32
|
||||||
|
srand((int)time(NULL));
|
||||||
|
#else
|
||||||
|
srand(get_tick_count());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
///#ifndef WINDOWS
|
||||||
|
int max(int a, int b) {
|
||||||
|
if (a > b) return a;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
int min(int a, int b) {
|
||||||
|
if (a < b) return a;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
#ifndef WINDOWS
|
||||||
|
int // <editor-fold defaultstate="collapsed" desc="comment">
|
||||||
|
getch// </editor-fold>
|
||||||
|
(void) {
|
||||||
|
char chbuf[1];
|
||||||
|
struct termios oldstate, newstate;
|
||||||
|
fflush(stdout);
|
||||||
|
tcgetattr(0, &oldstate);
|
||||||
|
newstate = oldstate;
|
||||||
|
newstate.c_lflag &= ~ICANON;
|
||||||
|
newstate.c_lflag &= ~ECHO;
|
||||||
|
tcsetattr(0, TCSANOW, &newstate);
|
||||||
|
read(0, &chbuf, 1);
|
||||||
|
tcsetattr(0, TCSANOW, &oldstate);
|
||||||
|
return chbuf[0];
|
||||||
|
}
|
||||||
|
#endif
|
505
programs/games/sstartrek/en/planets.c
Normal file
505
programs/games/sstartrek/en/planets.c
Normal file
@ -0,0 +1,505 @@
|
|||||||
|
#include "sst.h"
|
||||||
|
|
||||||
|
static char classes[4][2]={"","M","N","O"};
|
||||||
|
static int height;
|
||||||
|
|
||||||
|
static int consumeTime(void) {
|
||||||
|
/* I think most of this avoidance was caused by overlay scheme.
|
||||||
|
Let's see what happens if all events can occur here */
|
||||||
|
|
||||||
|
// double asave;
|
||||||
|
ididit = 1;
|
||||||
|
#if 0
|
||||||
|
/* Don't wory about this */
|
||||||
|
if (future[FTBEAM] <= d.date+Time && d.remcom != 0 && condit != IHDOCKED) {
|
||||||
|
/* We are about to be tractor beamed -- operation fails */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// asave = future[FSNOVA];
|
||||||
|
// future[FSNOVA] = 1e30; /* defer supernovas */
|
||||||
|
events(); /* Used to avoid if future[FSCMOVE] within time */
|
||||||
|
// future[FSNOVA] = asave;
|
||||||
|
/*fails if game over, quadrant super-novas or we've moved to new quadrant*/
|
||||||
|
if (alldone || d.galaxy[quadx][quady] == 1000 || justin != 0) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void preport(void) {
|
||||||
|
int iknow = 0, i;
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
prout("Spock- \"Planet report follows, Captain.\"");
|
||||||
|
skip(1);
|
||||||
|
for (i = 1; i <= inplan; i++) {
|
||||||
|
if (d.plnets[i].known
|
||||||
|
#ifdef DEBUG
|
||||||
|
|| ( idebug && d.plnets[i].x !=0)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
iknow = 1;
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug && d.plnets[i].known==0) proutn("(Unknown) ");
|
||||||
|
#endif
|
||||||
|
cramlc(1, d.plnets[i].x, d.plnets[i].y);
|
||||||
|
proutn(" class ");
|
||||||
|
proutn(classes[d.plnets[i].pclass]);
|
||||||
|
proutn(" ");
|
||||||
|
if (d.plnets[i].crystals == 0) proutn("no ");
|
||||||
|
prout("dilithium crystals present.");
|
||||||
|
if (d.plnets[i].known==2)
|
||||||
|
prout(" Shuttle Craft Galileo on surface.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (iknow==0) prout("No information available.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void orbit(void) {
|
||||||
|
double asave;
|
||||||
|
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
ididit=0;
|
||||||
|
if (inorbit!=0) {
|
||||||
|
prout("Already in standard orbit.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (damage[DWARPEN] != 0 && damage[DIMPULS] != 0) {
|
||||||
|
prout("Both warp and impulse engines damaged.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (plnetx == 0 || abs(sectx-plnetx) > 1 || abs(secty-plnety) > 1) {
|
||||||
|
crmshp();
|
||||||
|
prout(" not adjacent to planet.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Time = 0.02+0.03*Rand();
|
||||||
|
prout("Helmsman Sulu- \"Entering standard orbit, Sir.\"");
|
||||||
|
newcnd();
|
||||||
|
if (consumeTime()) return;
|
||||||
|
proutn("Sulu- \"Entered orbit at altitude ");
|
||||||
|
cramf(height = (1400.+7200.*Rand()), 0, 2);
|
||||||
|
prout(" kilometers.\"");
|
||||||
|
inorbit = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sensor(void) {
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
if (damage[DSRSENS] != 0.0) {
|
||||||
|
prout("Short range sensors damaged.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (plnetx == 0) {
|
||||||
|
prout("No planet in this quadrant.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
proutn("Spock- \"Sensor scan for");
|
||||||
|
cramlc(1, quadx, quady);
|
||||||
|
prout("-");
|
||||||
|
skip(1);
|
||||||
|
proutn(" Planet at");
|
||||||
|
cramlc(2, plnetx, plnety);
|
||||||
|
proutn(" is of class ");
|
||||||
|
proutn(classes[d.plnets[iplnet].pclass]);
|
||||||
|
prout(".");
|
||||||
|
if (d.plnets[iplnet].known==2)
|
||||||
|
prout(" Sensors show Galileo still on surface.");
|
||||||
|
proutn(" Readings indicate");
|
||||||
|
if (d.plnets[iplnet].crystals == 0) proutn(" no");
|
||||||
|
prout(" dilithium crystals present.\"");
|
||||||
|
if (d.plnets[iplnet].known == 0) d.plnets[iplnet].known = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void beam(void) {
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
if (damage[DTRANSP] != 0) {
|
||||||
|
prout("Transporter damaged.");
|
||||||
|
if (damage[DSHUTTL]==0 && (d.plnets[iplnet].known==2 || iscraft == 1)) {
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"May I suggest the shuttle craft, Sir?\" ");
|
||||||
|
if (ja() != 0) shuttle();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (inorbit==0) {
|
||||||
|
crmshp();
|
||||||
|
prout(" not in standard orbit.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (shldup!=0) {
|
||||||
|
prout("Impossible to transport through shields.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (d.plnets[iplnet].known==0) {
|
||||||
|
prout("Spock- \"Captain, we have no information on this planet");
|
||||||
|
prout(" and Starfleet Regulations clearly state that in this situation");
|
||||||
|
prout(" you may not go down.\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (landed==1) {
|
||||||
|
/* Coming from planet */
|
||||||
|
if (d.plnets[iplnet].known==2) {
|
||||||
|
proutn("Spock- \"Wouldn't you rather take the Galileo?\" ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
chew();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prout("Your crew hides the Galileo to prevent capture by aliens.");
|
||||||
|
}
|
||||||
|
prout("Landing party assembled, ready to beam up.");
|
||||||
|
skip(1);
|
||||||
|
prout("Kirk whips out communicator...");
|
||||||
|
prouts("BEEP BEEP BEEP");
|
||||||
|
skip(2);
|
||||||
|
prout("\"Kirk to enterprise- Lock on coordinates...energize.\"");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Going to planet */
|
||||||
|
if (d.plnets[iplnet].crystals==0) {
|
||||||
|
prout("Spock- \"Captain, I fail to see the logic in");
|
||||||
|
prout(" exploring a planet with no dilithium crystals.");
|
||||||
|
proutn(" Are you sure this is wise?\" ");
|
||||||
|
if (ja()==0) {
|
||||||
|
chew();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prout("Scotty- \"Transporter room ready, Sir.\"");
|
||||||
|
skip(1);
|
||||||
|
prout("Kirk, and landing party prepare to beam down to planet surface.");
|
||||||
|
skip(1);
|
||||||
|
prout("Kirk- \"Energize.\"");
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
prouts("WWHOOOIIIIIRRRRREEEE.E.E. . . . . . .");
|
||||||
|
skip(2);
|
||||||
|
if (Rand() > 0.98) {
|
||||||
|
prouts("BOOOIIIOOOIIOOOOIIIOIING . . .");
|
||||||
|
skip(2);
|
||||||
|
prout("Scotty- \"Oh my God! I've lost them.\"");
|
||||||
|
finish(FLOST);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prouts(". . . . . . .E.E.EEEERRRRRIIIIIOOOHWW");
|
||||||
|
skip(2);
|
||||||
|
prout("Transport complete.");
|
||||||
|
landed = -landed;
|
||||||
|
if (landed==1 && d.plnets[iplnet].known==2) {
|
||||||
|
prout("The shuttle craft Galileo is here!");
|
||||||
|
}
|
||||||
|
if (landed!=1 && imine==1) {
|
||||||
|
icrystl = 1;
|
||||||
|
cryprob = 0.05;
|
||||||
|
}
|
||||||
|
imine = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mine(void) {
|
||||||
|
|
||||||
|
ididit = 0;
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
if (landed!= 1) {
|
||||||
|
prout("Mining party not on planet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (d.plnets[iplnet].crystals == 0) {
|
||||||
|
prout("No dilithium crystals on this planet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (imine == 1) {
|
||||||
|
prout("You've already mined enough crystals for this trip.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (icrystl == 1 && cryprob == 0.05) {
|
||||||
|
proutn("With all those fresh crystals aboard the ");
|
||||||
|
crmshp();
|
||||||
|
skip(1);
|
||||||
|
prout("there's no reason to mine more at this time.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Time = (0.1+0.2*Rand())*d.plnets[iplnet].pclass;
|
||||||
|
if (consumeTime()) return;
|
||||||
|
prout("Mining operation complete.");
|
||||||
|
imine = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usecrystals(void) {
|
||||||
|
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
if (icrystl!=1) {
|
||||||
|
prout("No dilithium crystals available.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (energy >= 1000) {
|
||||||
|
prout("Spock- \"Captain, Starfleet Regulations prohibit such an operation");
|
||||||
|
prout(" except when condition Yellow exists.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prout("Spock- \"Captain, I must warn you that loading");
|
||||||
|
prout(" raw dilithium crystals into the ship's power");
|
||||||
|
prout(" system may risk a severe explosion.");
|
||||||
|
proutn(" Are you sure this is wise?\" ");
|
||||||
|
if (ja()==0) {
|
||||||
|
chew();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
prout("Engineering Officer Scott- \"(GULP) Aye Sir.");
|
||||||
|
prout(" Mr. Spock and I will try it.\"");
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"Crystals in place, Sir.");
|
||||||
|
prout(" Ready to activate circuit.\"");
|
||||||
|
skip(1);
|
||||||
|
prouts("Scotty- \"Keep your fingers crossed, Sir!\"");
|
||||||
|
skip(1);
|
||||||
|
if (Rand() <= cryprob) {
|
||||||
|
prouts(" \"Activating now! - - No good! It's***");
|
||||||
|
skip(2);
|
||||||
|
prouts("***RED ALERT! RED A*L********************************");
|
||||||
|
skip(1);
|
||||||
|
stars();
|
||||||
|
prouts("****************** KA-BOOM!!!! *******************");
|
||||||
|
skip(1);
|
||||||
|
kaboom();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
energy += 5000.0*(1.0 + 0.9*Rand());
|
||||||
|
prouts(" \"Activating now! - - ");
|
||||||
|
prout("The instruments");
|
||||||
|
prout(" are going crazy, but I think it's");
|
||||||
|
prout(" going to work!! Congratulations, Sir!\"");
|
||||||
|
cryprob *= 2.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shuttle(void) {
|
||||||
|
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
ididit = 0;
|
||||||
|
if(damage[DSHUTTL] != 0.0) {
|
||||||
|
if (damage[DSHUTTL] == -1.0) {
|
||||||
|
if (inorbit && d.plnets[iplnet].known == 2)
|
||||||
|
prout("Ye Faerie Queene has no shuttle craft bay to dock it at.");
|
||||||
|
else
|
||||||
|
prout("Ye Faerie Queene had no shuttle craft.");
|
||||||
|
}
|
||||||
|
else if (damage[DSHUTTL] > 0)
|
||||||
|
prout("The Galileo is damaged.");
|
||||||
|
else prout("Shuttle craft is now serving Big Mac's.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (inorbit==0) {
|
||||||
|
crmshp();
|
||||||
|
prout(" not in standard orbit.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((d.plnets[iplnet].known != 2) && iscraft != 1) {
|
||||||
|
prout("Shuttle craft not currently available.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (landed==-1 && d.plnets[iplnet].known==2) {
|
||||||
|
prout("You will have to beam down to retrieve the shuttle craft.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (shldup!=0 || condit == IHDOCKED) {
|
||||||
|
prout("Shuttle craft cannot pass through shields.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (d.plnets[iplnet].known==0) {
|
||||||
|
prout("Spock- \"Captain, we have no information on this planet");
|
||||||
|
prout(" and Starfleet Regulations clearly state that in this situation");
|
||||||
|
prout(" you may not fly down.\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Time = 3.0e-5*height;
|
||||||
|
if (Time >= 0.8*d.remtime) {
|
||||||
|
prout("First Officer Spock- \"Captain, I compute that such");
|
||||||
|
prout(" a maneuver would require approximately ");
|
||||||
|
cramf(100*Time/d.remtime,0,4);
|
||||||
|
prout("% of our");
|
||||||
|
prout("remaining time.");
|
||||||
|
prout("Are you sure this is wise?\" ");
|
||||||
|
if (ja()==0) {
|
||||||
|
Time = 0.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (landed == 1) {
|
||||||
|
/* Kirk on planet */
|
||||||
|
if (iscraft==1) {
|
||||||
|
/* Galileo on ship! */
|
||||||
|
if (damage[DTRANSP]==0) {
|
||||||
|
proutn("Spock- \"Would you rather use the transporter?\" ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
beam();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
proutn("Shuttle crew");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
proutn("Rescue party");
|
||||||
|
prout(" boards Galileo and swoops toward planet surface.");
|
||||||
|
iscraft = 0;
|
||||||
|
skip(1);
|
||||||
|
if (consumeTime()) return;
|
||||||
|
d.plnets[iplnet].known=2;
|
||||||
|
prout("Trip complete.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Ready to go back to ship */
|
||||||
|
prout("You and your mining party board the");
|
||||||
|
prout("shuttle craft for the trip back to the Enterprise.");
|
||||||
|
skip(1);
|
||||||
|
prout("The short hop begins . . .");
|
||||||
|
d.plnets[iplnet].known=1;
|
||||||
|
icraft = 1;
|
||||||
|
skip(1);
|
||||||
|
landed = -1;
|
||||||
|
if (consumeTime()) return;
|
||||||
|
iscraft = 1;
|
||||||
|
icraft = 0;
|
||||||
|
if (imine!=0) {
|
||||||
|
icrystl = 1;
|
||||||
|
cryprob = 0.05;
|
||||||
|
}
|
||||||
|
imine = 0;
|
||||||
|
prout("Trip complete.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Kirk on ship */
|
||||||
|
/* and so is Galileo */
|
||||||
|
prout("Mining party assembles in the hangar deck,");
|
||||||
|
prout("ready to board the shuttle craft \"Galileo\".");
|
||||||
|
skip(1);
|
||||||
|
prouts("The hangar doors open; the trip begins.");
|
||||||
|
skip(1);
|
||||||
|
icraft = 1;
|
||||||
|
iscraft = 0;
|
||||||
|
if (consumeTime()) return;
|
||||||
|
d.plnets[iplnet].known = 2;
|
||||||
|
landed = 1;
|
||||||
|
icraft = 0;
|
||||||
|
prout("Trip complete");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void deathray(void) {
|
||||||
|
double r = Rand();
|
||||||
|
|
||||||
|
ididit = 0;
|
||||||
|
skip(1);
|
||||||
|
chew();
|
||||||
|
if (ship != IHE) {
|
||||||
|
prout("Ye Faerie Queene has no death ray.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (nenhere==0) {
|
||||||
|
prout("Sulu- \"But Sir, there are no enemies in this quadrant.\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (damage[DDRAY] > 0.0) {
|
||||||
|
prout("Death Ray is damaged.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prout("Spock- \"Captain, the 'Experimental Death Ray'");
|
||||||
|
prout(" is highly unpredictable. Considering the alternatives,");
|
||||||
|
prout(" are you sure this is wise?\" ");
|
||||||
|
if (ja()==0) return;
|
||||||
|
prout("Spock- \"Acknowledged.\"");
|
||||||
|
skip(1);
|
||||||
|
ididit=1;
|
||||||
|
prouts("WHOOEE ... WHOOEE ... WHOOEE ... WHOOEE");
|
||||||
|
skip(1);
|
||||||
|
prout("Crew scrambles in emergency preparation.");
|
||||||
|
prout("Spock and Scotty ready the death ray and");
|
||||||
|
prout("prepare to channel all ship's power to the device.");
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"Preparations complete, sir.\"");
|
||||||
|
prout("Kirk- \"Engage!\"");
|
||||||
|
skip(1);
|
||||||
|
prouts("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
|
||||||
|
skip(1);
|
||||||
|
if (r > .30) {
|
||||||
|
prouts("Sulu- \"Captain! It's working!\"");
|
||||||
|
skip(2);
|
||||||
|
while (nenhere > 0) {
|
||||||
|
deadkl(kx[1],ky[1],quad[kx[1]][ky[1]],kx[1],ky[1]);
|
||||||
|
}
|
||||||
|
prout("Ensign Chekov- \"Congratulations, Captain!\"");
|
||||||
|
if (d.remkl == 0) finish(FWON);
|
||||||
|
prout("Spock- \"Captain, I believe the `Experimental Death Ray'");
|
||||||
|
if (Rand() <= 0.05) {
|
||||||
|
prout(" is still operational.\"");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prout(" has been rendered dysfunctional.\"");
|
||||||
|
damage[DDRAY] = 39.95;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
r = Rand(); // Pick failure method
|
||||||
|
if (r <= .30) {
|
||||||
|
prouts("Sulu- \"Captain! It's working!\"");
|
||||||
|
skip(1);
|
||||||
|
prouts("***RED ALERT! RED ALERT!");
|
||||||
|
skip(1);
|
||||||
|
prout("***MATTER-ANTIMATTER IMPLOSION IMMINENT!");
|
||||||
|
skip(1);
|
||||||
|
prouts("***RED ALERT! RED A*L********************************");
|
||||||
|
skip(1);
|
||||||
|
stars();
|
||||||
|
prouts("****************** KA-BOOM!!!! *******************");
|
||||||
|
skip(1);
|
||||||
|
kaboom();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r <= .55) {
|
||||||
|
prouts("Sulu- \"Captain! Yagabandaghangrapl, brachriigringlanbla!\"");
|
||||||
|
skip(1);
|
||||||
|
prout("Lt. Uhura- \"Graaeek! Graaeek!\"");
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"Fascinating! . . . All humans aboard");
|
||||||
|
prout(" have apparently been transformed into strange mutations.");
|
||||||
|
prout(" Vulcans do not seem to be affected.");
|
||||||
|
skip(1);
|
||||||
|
prout("Kirk- \"Raauch! Raauch!\"");
|
||||||
|
finish(FDRAY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r <= 0.75) {
|
||||||
|
int i,j;
|
||||||
|
prouts("Sulu- \"Captain! It's --WHAT?!?!\"");
|
||||||
|
skip(2);
|
||||||
|
proutn("Spock- \"I believe the word is");
|
||||||
|
prouts(" *ASTONISHING*");
|
||||||
|
prout(" Mr. Sulu.");
|
||||||
|
for (i=1; i<=10; i++)
|
||||||
|
for (j=1; j<=10; j++)
|
||||||
|
if (quad[i][j] == IHDOT) quad[i][j] = IHQUEST;
|
||||||
|
prout(" Captain, our quadrant is now infested with");
|
||||||
|
prouts(" - - - - - - *THINGS*.");
|
||||||
|
skip(1);
|
||||||
|
prout(" I have no logical explanation.\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prouts("Sulu- \"Captain! The Death Ray is creating tribbles!\"");
|
||||||
|
skip(1);
|
||||||
|
prout("Scotty- \"There are so many tribbles down here");
|
||||||
|
prout(" in Engineering, we can't move for 'em, Captain.\"");
|
||||||
|
finish(FTRIBBLE);
|
||||||
|
return;
|
||||||
|
}
|
552
programs/games/sstartrek/en/reports.c
Normal file
552
programs/games/sstartrek/en/reports.c
Normal file
@ -0,0 +1,552 @@
|
|||||||
|
#include "sst.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void attakreport(void) {
|
||||||
|
if (future[FCDBAS] < 1e30) {
|
||||||
|
proutn("Starbase in ");
|
||||||
|
cramlc(1, batx, baty);
|
||||||
|
prout(" is currently under attack.");
|
||||||
|
proutn("It can hold out until Stardate ");
|
||||||
|
cramf(future[FCDBAS], 0,1);
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
if (isatb == 1) {
|
||||||
|
proutn("Starbase in ");
|
||||||
|
cramlc(1, d.isx, d.isy);
|
||||||
|
prout(" is under Super-commander attack.");
|
||||||
|
proutn("It can hold out until Stardate ");
|
||||||
|
cramf(future[FSCDBAS], 0, 1);
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void report(int f) {
|
||||||
|
char *s1,*s2,*s3;
|
||||||
|
|
||||||
|
chew();
|
||||||
|
s1 = (thawed?"thawed ":"");
|
||||||
|
switch (length) {
|
||||||
|
case 1: s2="short"; break;
|
||||||
|
case 2: s2="medium"; break;
|
||||||
|
case 4: s2="long"; break;
|
||||||
|
default: s2="unknown length"; break;
|
||||||
|
}
|
||||||
|
switch (skill) {
|
||||||
|
case SNOVICE: s3="novice"; break;
|
||||||
|
case SFAIR: s3="fair"; break;
|
||||||
|
case SGOOD: s3="good"; break;
|
||||||
|
case SEXPERT: s3="expert"; break;
|
||||||
|
case SEMERITUS: s3="emeritus"; break;
|
||||||
|
default: s3="skilled"; break;
|
||||||
|
}
|
||||||
|
printf("\nYou %s playing a %s%s %s game.\n",
|
||||||
|
alldone? "were": "are now", s1, s2, s3);
|
||||||
|
if (skill>SGOOD && thawed && !alldone) prout("No plaque is allowed.");
|
||||||
|
if (tourn) printf("This is tournament game %d.\n", tourn);
|
||||||
|
if (f) printf("Your secret password is \"%s\"\n",passwd);
|
||||||
|
printf("%d of %d Klingon ships have been destroyed",
|
||||||
|
d.killk+d.killc+d.nsckill, inkling);
|
||||||
|
if (d.killc) printf(", including %d Commander%s.\n", d.killc, d.killc==1?"":"s");
|
||||||
|
else if (d.killk+d.nsckill > 0) prout(", but no Commanders.");
|
||||||
|
else prout(".");
|
||||||
|
if (skill > SFAIR) printf("The Super Commander has %sbeen destroyed.\n",
|
||||||
|
d.nscrem?"not ":"");
|
||||||
|
if (d.rembase != inbase) {
|
||||||
|
proutn("There ");
|
||||||
|
if (inbase-d.rembase==1) proutn("has been 1 base");
|
||||||
|
else {
|
||||||
|
proutn("have been ");
|
||||||
|
crami(inbase-d.rembase, 1);
|
||||||
|
proutn(" bases");
|
||||||
|
}
|
||||||
|
proutn(" destroyed, ");
|
||||||
|
crami(d.rembase, 1);
|
||||||
|
prout(" remaining.");
|
||||||
|
}
|
||||||
|
else printf("There are %d bases.\n", inbase);
|
||||||
|
if (REPORTS || iseenit) {
|
||||||
|
/* Don't report this if not seen and
|
||||||
|
either the radio is dead or not at base! */
|
||||||
|
attakreport();
|
||||||
|
iseenit = 1;
|
||||||
|
}
|
||||||
|
if (casual) printf("%d casualt%s suffered so far.\n",
|
||||||
|
casual, casual==1? "y" : "ies");
|
||||||
|
#ifdef CAPTURE
|
||||||
|
if (brigcapacity != brigfree) printf("%d Klingon%s in brig.\n",
|
||||||
|
brigcapacity-brigfree, brigcapacity-brigfree>1 ? "s" : "");
|
||||||
|
if (kcaptured > 0) printf("%d captured Klingon%s turned in to Star Fleet.\n",
|
||||||
|
kcaptured, kcaptured>1 ? "s" : "");
|
||||||
|
#endif
|
||||||
|
if (nhelp) printf("There were %d call%s for help.\n",
|
||||||
|
nhelp, nhelp==1 ? "" : "s");
|
||||||
|
if (ship == IHE) {
|
||||||
|
proutn("You have ");
|
||||||
|
if (nprobes) crami(nprobes,1);
|
||||||
|
else proutn("no");
|
||||||
|
proutn(" deep space probe");
|
||||||
|
if (nprobes!=1) proutn("s");
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
if (REPORTS && future[FDSPROB] != 1e30) {
|
||||||
|
if (isarmed)
|
||||||
|
proutn("An armed deep space probe is in");
|
||||||
|
else
|
||||||
|
proutn("A deep space probe is in");
|
||||||
|
cramlc(1, probecx, probecy);
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
if (icrystl) {
|
||||||
|
if (cryprob <= .05)
|
||||||
|
prout("Dilithium crystals aboard ship...not yet used.");
|
||||||
|
else {
|
||||||
|
int i=0;
|
||||||
|
double ai = 0.05;
|
||||||
|
while (cryprob > ai) {
|
||||||
|
ai *= 2.0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
printf("Dilithium crystals have been used %d time%s.\n",
|
||||||
|
i, i==1? "" : "s");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lrscan(void) {
|
||||||
|
int x, y;
|
||||||
|
chew();
|
||||||
|
if (damage[DLRSENS] != 0.0) {
|
||||||
|
/* Now allow base's sensors if docked */
|
||||||
|
if (condit != IHDOCKED) {
|
||||||
|
prout("LONG-RANGE SENSORS DAMAGED.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
proutn("Starbase's long-range scan for");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
skip(1);
|
||||||
|
proutn("Long-range scan for");
|
||||||
|
}
|
||||||
|
cramlc(1, quadx, quady);
|
||||||
|
skip(1);
|
||||||
|
if (coordfixed)
|
||||||
|
for (y = quady+1; y >= quady-1; y--) {
|
||||||
|
for (x = quadx-1; x <= quadx+1; x++) {
|
||||||
|
if (x == 0 || x > 8 || y == 0 || y > 8)
|
||||||
|
printf(" -1");
|
||||||
|
else {
|
||||||
|
printf("%5d", d.galaxy[x][y]);
|
||||||
|
// If radio works, mark star chart so
|
||||||
|
// it will show current information.
|
||||||
|
// Otherwise mark with current
|
||||||
|
// value which is fixed.
|
||||||
|
starch[x][y] = damage[DRADIO] > 0 ? d.galaxy[x][y]+1000 :1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (x = quadx-1; x <= quadx+1; x++) {
|
||||||
|
for (y = quady-1; y <= quady+1; y++) {
|
||||||
|
if (x == 0 || x > 8 || y == 0 || y > 8)
|
||||||
|
printf(" -1");
|
||||||
|
else {
|
||||||
|
printf("%5d", d.galaxy[x][y]);
|
||||||
|
// If radio works, mark star chart so
|
||||||
|
// it will show current information.
|
||||||
|
// Otherwise mark with current
|
||||||
|
// value which is fixed.
|
||||||
|
starch[x][y] = damage[DRADIO] > 0 ? d.galaxy[x][y]+1000 :1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void dreprt(void) {
|
||||||
|
int jdam = FALSE, i;
|
||||||
|
chew();
|
||||||
|
|
||||||
|
for (i = 1; i <= ndevice; i++) {
|
||||||
|
if (damage[i] > 0.0) {
|
||||||
|
if (!jdam) {
|
||||||
|
skip(1);
|
||||||
|
prout("DEVICE -REPAIR TIMES-");
|
||||||
|
prout(" IN FLIGHT DOCKED");
|
||||||
|
jdam = TRUE;
|
||||||
|
}
|
||||||
|
printf(" %16s ", device[i]);
|
||||||
|
cramf(damage[i]+0.05, 8, 2);
|
||||||
|
proutn(" ");
|
||||||
|
cramf(docfac*damage[i]+0.005, 8, 2);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!jdam) prout("All devices functional.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void chart(int nn) {
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
if (stdamtim != 1e30 && stdamtim != d.date && condit == IHDOCKED) {
|
||||||
|
prout("Spock- \"I revised the Star Chart from the");
|
||||||
|
prout(" starbase's records.\"");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
if (nn == 0) prout("STAR CHART FOR THE KNOWN GALAXY");
|
||||||
|
if (stdamtim != 1e30) {
|
||||||
|
if (condit == IHDOCKED) {
|
||||||
|
/* We are docked, so restore chart from base information -- these values won't update! */
|
||||||
|
stdamtim = d.date;
|
||||||
|
for (i=1; i <= 8 ; i++)
|
||||||
|
for (j=1; j <= 8; j++)
|
||||||
|
if (starch[i][j] == 1) starch[i][j] = d.galaxy[i][j]+1000;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
proutn("(Last surveillance update ");
|
||||||
|
cramf(d.date-stdamtim, 0, 1);
|
||||||
|
prout(" stardates ago.)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nn ==0) skip(1);
|
||||||
|
|
||||||
|
prout(" 1 2 3 4 5 6 7 8");
|
||||||
|
prout(" ----------------------------------------");
|
||||||
|
if (nn==0) prout(" -");
|
||||||
|
if (coordfixed)
|
||||||
|
for (j = 8; j >= 1; j--) {
|
||||||
|
printf("%d -", j);
|
||||||
|
for (i = 1; i <= 8; i++) {
|
||||||
|
if (starch[i][j] < 0) // We know only about the bases
|
||||||
|
printf(" .1.");
|
||||||
|
else if (starch[i][j] == 0) // Unknown
|
||||||
|
printf(" ...");
|
||||||
|
else if (starch[i][j] > 999) // Memorized value
|
||||||
|
printf("%5d", starch[i][j]-1000);
|
||||||
|
else
|
||||||
|
printf("%5d", d.galaxy[i][j]); // What is actually there (happens when value is 1)
|
||||||
|
}
|
||||||
|
prout(" -");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (i = 1; i <= 8; i++) {
|
||||||
|
printf("%d -", i);
|
||||||
|
for (j = 1; j <= 8; j++) {
|
||||||
|
if (starch[i][j] < 0) // We know only about the bases
|
||||||
|
printf(" .1.");
|
||||||
|
else if (starch[i][j] == 0) // Unknown
|
||||||
|
printf(" ...");
|
||||||
|
else if (starch[i][j] > 999) // Memorized value
|
||||||
|
printf("%5d", starch[i][j]-1000);
|
||||||
|
else
|
||||||
|
printf("%5d", d.galaxy[i][j]); // What is actually there (happens when value is 1)
|
||||||
|
}
|
||||||
|
prout(" -");
|
||||||
|
}
|
||||||
|
if (nn == 0) {
|
||||||
|
skip(1);
|
||||||
|
crmshp();
|
||||||
|
proutn(" is currently in");
|
||||||
|
cramlc(1, quadx, quady);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void srscan(int l) {
|
||||||
|
static char requests[][3] =
|
||||||
|
{"","da","co","po","ls","wa","en","to","sh","kl","ti"};
|
||||||
|
char *cp;
|
||||||
|
int leftside=TRUE, rightside=TRUE, i, j, jj, k=0, nn=FALSE;
|
||||||
|
int goodScan=TRUE;
|
||||||
|
switch (l) {
|
||||||
|
case 1: // SRSCAN
|
||||||
|
if (damage[DSRSENS] != 0) {
|
||||||
|
/* Allow base's sensors if docked */
|
||||||
|
if (condit != IHDOCKED) {
|
||||||
|
prout("SHORT-RANGE SENSORS DAMAGED");
|
||||||
|
goodScan=FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
prout("[Using starbase's sensors]");
|
||||||
|
}
|
||||||
|
if (goodScan)
|
||||||
|
starch[quadx][quady] = damage[DRADIO]>0.0 ?
|
||||||
|
d.galaxy[quadx][quady]+1000:1;
|
||||||
|
scan();
|
||||||
|
if (isit("chart")) nn = TRUE;
|
||||||
|
if (isit("no")) rightside = FALSE;
|
||||||
|
chew();
|
||||||
|
prout("\n 1 2 3 4 5 6 7 8 9 10");
|
||||||
|
break;
|
||||||
|
case 2: // REQUEST
|
||||||
|
while (scan() == IHEOL)
|
||||||
|
printf("Information desired? ");
|
||||||
|
chew();
|
||||||
|
for (k = 1; k <= 10; k++)
|
||||||
|
if (strncmp(citem,requests[k],min(2,strlen(citem)))==0)
|
||||||
|
break;
|
||||||
|
if (k > 10) {
|
||||||
|
prout("UNRECOGNIZED REQUEST. Legal requests are:\n"
|
||||||
|
" date, condition, position, lsupport, warpfactor,\n"
|
||||||
|
" energy, torpedoes, shields, klingons, time.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// no "break"
|
||||||
|
case 3: // STATUS
|
||||||
|
chew();
|
||||||
|
leftside = FALSE;
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
for (i = 1; i <= 10; i++) {
|
||||||
|
int jj = (k!=0 ? k : i);
|
||||||
|
if (leftside) {
|
||||||
|
if (coordfixed) {
|
||||||
|
printf("%2d ", 11-i);
|
||||||
|
for (j = 1; j <= 10; j++) {
|
||||||
|
if (goodScan || (abs((11-i)-secty)<= 1 && abs(j-sectx) <= 1))
|
||||||
|
printf("%c ",quad[j][11-i]);
|
||||||
|
else
|
||||||
|
printf("- ");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("%2d ", i);
|
||||||
|
for (j = 1; j <= 10; j++) {
|
||||||
|
if (goodScan || (abs(i-sectx)<= 1 && abs(j-secty) <= 1))
|
||||||
|
printf("%c ",quad[i][j]);
|
||||||
|
else
|
||||||
|
printf("- ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rightside) {
|
||||||
|
switch (jj) {
|
||||||
|
case 1:
|
||||||
|
printf(" Stardate %.1f", d.date);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (condit != IHDOCKED) newcnd();
|
||||||
|
switch (condit) {
|
||||||
|
case IHRED: cp = "RED"; break;
|
||||||
|
case IHGREEN: cp = "GREEN"; break;
|
||||||
|
case IHYELLOW: cp = "YELLOW"; break;
|
||||||
|
case IHDOCKED: cp = "DOCKED"; break;
|
||||||
|
}
|
||||||
|
printf(" Condition %s", cp);
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (iscloaked) printf(", CLOAKED");
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
printf(" Position ");
|
||||||
|
cramlc(0, quadx, quady);
|
||||||
|
putchar(',');
|
||||||
|
cramlc(0, sectx, secty);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
printf(" Life Support ");
|
||||||
|
if (damage[DLIFSUP] != 0.0) {
|
||||||
|
if (condit == IHDOCKED)
|
||||||
|
printf("DAMAGED, supported by starbase");
|
||||||
|
else
|
||||||
|
printf("DAMAGED, reserves=%4.2f", lsupres);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("ACTIVE");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
printf(" Warp Factor %.1f", warpfac);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
printf(" Energy %.2f", energy);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
printf(" Torpedoes %d", torps);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
printf(" Shields ");
|
||||||
|
if (damage[DSHIELD] != 0)
|
||||||
|
printf("DAMAGED,");
|
||||||
|
else if (shldup)
|
||||||
|
printf("UP,");
|
||||||
|
else
|
||||||
|
printf("DOWN,");
|
||||||
|
printf(" %d%% %.1f units",
|
||||||
|
(int)((100.0*shield)/inshld + 0.5), shield);
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
printf(" Klingons Left %d", d.remkl);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
printf(" Time Left %.2f", d.remtime);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
if (k!=0) return;
|
||||||
|
}
|
||||||
|
if (nn) chart(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void eta(void) {
|
||||||
|
int key, ix1, ix2, iy1, iy2, prompt=FALSE;
|
||||||
|
int wfl;
|
||||||
|
double ttime, twarp, tpower;
|
||||||
|
if (damage[DCOMPTR] != 0.0) {
|
||||||
|
prout("COMPUTER DAMAGED, USE A POCKET CALCULATOR.");
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (scan() != IHREAL) {
|
||||||
|
prompt = TRUE;
|
||||||
|
chew();
|
||||||
|
proutn("Destination quadrant and/or sector? ");
|
||||||
|
if (scan()!=IHREAL) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iy1 = aaitem +0.5;
|
||||||
|
if (scan() != IHREAL) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ix1 = aaitem + 0.5;
|
||||||
|
if (scan() == IHREAL) {
|
||||||
|
iy2 = aaitem + 0.5;
|
||||||
|
if (scan() != IHREAL) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ix2 = aaitem + 0.5;
|
||||||
|
}
|
||||||
|
else { // same quadrant
|
||||||
|
ix2 = ix1;
|
||||||
|
iy2 = iy1;
|
||||||
|
ix1 = quady; // ya got me why x and y are reversed!
|
||||||
|
iy1 = quadx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ix1 > 8 || ix1 < 1 || iy1 > 8 || iy1 < 1 ||
|
||||||
|
ix2 > 10 || ix2 < 1 || iy2 > 10 || iy2 < 1) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dist = sqrt(square(iy1-quadx+0.1*(iy2-sectx))+
|
||||||
|
square(ix1-quady+0.1*(ix2-secty)));
|
||||||
|
wfl = FALSE;
|
||||||
|
|
||||||
|
if (prompt) prout("Answer \"no\" if you don't know the value:");
|
||||||
|
while (TRUE) {
|
||||||
|
chew();
|
||||||
|
proutn("Time or arrival date? ");
|
||||||
|
if (scan()==IHREAL) {
|
||||||
|
ttime = aaitem;
|
||||||
|
if (ttime > d.date) ttime -= d.date; // Actually a star date
|
||||||
|
if (ttime <= 1e-10 ||
|
||||||
|
(twarp=(floor(sqrt((10.0*dist)/ttime)*10.0)+1.0)/10.0) > 10) {
|
||||||
|
prout("We'll never make it, sir.");
|
||||||
|
chew();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (twarp < 1.0) twarp = 1.0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
chew();
|
||||||
|
proutn("Warp factor? ");
|
||||||
|
if (scan()== IHREAL) {
|
||||||
|
wfl = TRUE;
|
||||||
|
twarp = aaitem;
|
||||||
|
if (twarp<1.0 || twarp > 10.0) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
prout("Captain, certainly you can give me one of these.");
|
||||||
|
}
|
||||||
|
while (TRUE) {
|
||||||
|
chew();
|
||||||
|
ttime = (10.0*dist)/square(twarp);
|
||||||
|
tpower = dist*twarp*twarp*twarp*(shldup+1);
|
||||||
|
if (tpower >= energy) { // Suggestion from Ethan Staffin -- give amount needed
|
||||||
|
prout("Insufficient energy, sir: we would need ");
|
||||||
|
cramf(tpower, 1, 1);
|
||||||
|
proutn (" units.");
|
||||||
|
if (shldup==0 || tpower > energy*2.0) {
|
||||||
|
if (!wfl) return;
|
||||||
|
proutn("New warp factor to try? ");
|
||||||
|
if (scan() == IHREAL) {
|
||||||
|
wfl = TRUE;
|
||||||
|
twarp = aaitem;
|
||||||
|
if (twarp<1.0 || twarp > 10.0) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prout("But if you lower your shields,");
|
||||||
|
proutn("remaining");
|
||||||
|
tpower /= 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
proutn("Remaining");
|
||||||
|
proutn(" energy will be ");
|
||||||
|
cramf(energy-tpower, 1, 1);
|
||||||
|
prout(".");
|
||||||
|
if (wfl) {
|
||||||
|
proutn("And we will arrive at stardate ");
|
||||||
|
cramf(d.date+ttime, 1, 1);
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
else if (twarp==1.0)
|
||||||
|
prout("Any warp speed is adequate.");
|
||||||
|
else {
|
||||||
|
proutn("Minimum warp needed is ");
|
||||||
|
cramf(twarp, 1, 2);
|
||||||
|
skip(1);
|
||||||
|
proutn("and we will arrive at stardate ");
|
||||||
|
cramf(d.date+ttime, 1, 2);
|
||||||
|
prout(".");
|
||||||
|
}
|
||||||
|
if (d.remtime < ttime)
|
||||||
|
prout("Unfortunately, the Federation will be destroyed by then.");
|
||||||
|
if (twarp > 6.0)
|
||||||
|
prout("You'll be taking risks at that speed, Captain");
|
||||||
|
if ((isatb==1 && d.isy == ix1 && d.isx == iy1 &&
|
||||||
|
future[FSCDBAS]< ttime+d.date)||
|
||||||
|
(future[FCDBAS]<ttime+d.date && baty==ix1 && batx == iy1))
|
||||||
|
prout("The starbase there will be destroyed by then.");
|
||||||
|
proutn("New warp factor to try? ");
|
||||||
|
if (scan() == IHREAL) {
|
||||||
|
wfl = TRUE;
|
||||||
|
twarp = aaitem;
|
||||||
|
if (twarp<1.0 || twarp > 10.0) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
725
programs/games/sstartrek/en/setup.c
Normal file
725
programs/games/sstartrek/en/setup.c
Normal file
@ -0,0 +1,725 @@
|
|||||||
|
#ifndef KOS32
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#include "sst.h"
|
||||||
|
|
||||||
|
void prelim(void) {
|
||||||
|
skip(2);
|
||||||
|
prout("-SUPER- STAR TREK");
|
||||||
|
skip(1);
|
||||||
|
prout("Latest update-21 Sept 78");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeze(int boss) {
|
||||||
|
char *x, *y;
|
||||||
|
FILE *fp;
|
||||||
|
int key;
|
||||||
|
if (boss) {
|
||||||
|
strcpy(citem, "emsave.trk");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((key = scan()) == IHEOL) {
|
||||||
|
proutn("File name(9 characters maximum): ");
|
||||||
|
key = scan();
|
||||||
|
}
|
||||||
|
if (key != IHALPHA) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chew();
|
||||||
|
if (strchr(citem, '.') == NULL) {
|
||||||
|
strcat(citem, ".trk");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((fp = fopen(citem, "wb")) == NULL) {
|
||||||
|
proutn("Can't freeze game as file ");
|
||||||
|
proutn(citem);
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fwrite(&d, sizeof(d), 1, fp);
|
||||||
|
fwrite(&snapsht, sizeof(snapsht), 1, fp);
|
||||||
|
fwrite(quad, sizeof(quad), 1, fp);
|
||||||
|
fwrite(kx, sizeof(kx), 1, fp);
|
||||||
|
fwrite(ky, sizeof(ky), 1, fp);
|
||||||
|
fwrite(starch, sizeof(starch), 1, fp);
|
||||||
|
fwrite(kpower, sizeof(kpower), 1, fp);
|
||||||
|
fwrite(kdist, sizeof(kdist), 1, fp);
|
||||||
|
fwrite(kavgd, sizeof(kavgd), 1, fp);
|
||||||
|
fwrite(damage, sizeof(damage), 1, fp);
|
||||||
|
fwrite(future, sizeof(future), 1, fp);
|
||||||
|
fwrite(&a, sizeof(a), 1, fp);
|
||||||
|
fwrite(passwd, sizeof(passwd), 1, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* I hope that's enough! */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void thaw(void) {
|
||||||
|
char *x, *y;
|
||||||
|
FILE *fp;
|
||||||
|
int key;
|
||||||
|
|
||||||
|
passwd[0] = '\0';
|
||||||
|
if ((key = scan()) == IHEOL) {
|
||||||
|
proutn("File name: ");
|
||||||
|
key = scan();
|
||||||
|
}
|
||||||
|
if (key != IHALPHA) {
|
||||||
|
huh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chew();
|
||||||
|
if (strchr(citem, '.') == NULL) {
|
||||||
|
strcat(citem, ".trk");
|
||||||
|
}
|
||||||
|
if ((fp = fopen(citem, "rb")) == NULL) {
|
||||||
|
proutn("Can't find game file ");
|
||||||
|
proutn(citem);
|
||||||
|
skip(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fread(&d, sizeof(d), 1, fp);
|
||||||
|
fread(&snapsht, sizeof(snapsht), 1, fp);
|
||||||
|
fread(quad, sizeof(quad), 1, fp);
|
||||||
|
fread(kx, sizeof(kx), 1, fp);
|
||||||
|
fread(ky, sizeof(ky), 1, fp);
|
||||||
|
fread(starch, sizeof(starch), 1, fp);
|
||||||
|
fread(kpower, sizeof(kpower), 1, fp);
|
||||||
|
fread(kdist, sizeof(kdist), 1, fp);
|
||||||
|
fread(kavgd, sizeof(kavgd), 1, fp);
|
||||||
|
fread(damage, sizeof(damage), 1, fp);
|
||||||
|
fread(future, sizeof(future), 1, fp);
|
||||||
|
fread(&a, sizeof(a), 1, fp);
|
||||||
|
fread(passwd, sizeof(passwd), 1, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* I hope that's enough! */
|
||||||
|
}
|
||||||
|
|
||||||
|
void abandn(void) {
|
||||||
|
int nb, l;
|
||||||
|
|
||||||
|
chew();
|
||||||
|
if (condit==IHDOCKED) {
|
||||||
|
if (ship!=IHE) {
|
||||||
|
prout("You cannot abandon Ye Faerie Queene.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Must take shuttle craft to exit */
|
||||||
|
if (damage[DSHUTTL]==-1) {
|
||||||
|
prout("Ye Faerie Queene has no shuttle craft.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (damage[DSHUTTL]<0) {
|
||||||
|
prout("Shuttle craft now serving Big Mac's.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (damage[DSHUTTL]>0) {
|
||||||
|
prout("Shuttle craft damaged.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (landed==1) {
|
||||||
|
prout("You must be aboard the Enterprise.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (iscraft!=1) {
|
||||||
|
prout("Shuttle craft not currently available.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Print abandon ship messages */
|
||||||
|
skip(1);
|
||||||
|
prouts("***ABANDON SHIP! ABANDON SHIP!");
|
||||||
|
skip(1);
|
||||||
|
prouts("***ALL HANDS ABANDON SHIP!");
|
||||||
|
skip(2);
|
||||||
|
prout("Captain and crew escape in shuttle craft.");
|
||||||
|
prout("Remainder of ship's complement beam down");
|
||||||
|
prout("to nearest habitable planet.");
|
||||||
|
if (d.rembase==0) {
|
||||||
|
/* Ops! no place to go... */
|
||||||
|
finish(FABANDN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* If at least one base left, give 'em the Faerie Queene */
|
||||||
|
skip(1);
|
||||||
|
icrystl = 0; /* crystals are lost */
|
||||||
|
nprobes = 0; /* No probes */
|
||||||
|
prout("You are captured by Klingons and released to");
|
||||||
|
prout("the Federation in a prisoner-of-war exchange.");
|
||||||
|
nb = Rand()*d.rembase+1;
|
||||||
|
/* Set up quadrant and position FQ adjacient to base */
|
||||||
|
if (quadx!=d.baseqx[nb] || quady!=d.baseqy[nb]) {
|
||||||
|
quadx = d.baseqx[nb];
|
||||||
|
quady = d.baseqy[nb];
|
||||||
|
sectx = secty = 5;
|
||||||
|
newqad(1);
|
||||||
|
}
|
||||||
|
for (;;) {
|
||||||
|
/* position next to base by trial and error */
|
||||||
|
quad[sectx][secty] = IHDOT;
|
||||||
|
for (l = 1; l <= 10; l++) {
|
||||||
|
sectx = 3.0*Rand() - 1.0 + basex;
|
||||||
|
secty = 3.0*Rand() - 1.0 + basey;
|
||||||
|
if (sectx >= 1 && sectx <= 10 &&
|
||||||
|
secty >= 1 && secty <= 10 &&
|
||||||
|
quad[sectx][secty] == IHDOT) break;
|
||||||
|
}
|
||||||
|
if (l < 11) break; /* found a spot */
|
||||||
|
sectx=5;
|
||||||
|
secty=5;
|
||||||
|
newqad(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Get new commission */
|
||||||
|
quad[sectx][secty] = ship = IHF;
|
||||||
|
prout("Starfleet puts you in command of another ship,");
|
||||||
|
prout("the Faerie Queene, which is antiquated but,");
|
||||||
|
prout("still useable.");
|
||||||
|
if (icrystl!=0) prout("The dilithium crystals have been moved.");
|
||||||
|
imine=0;
|
||||||
|
iscraft=0; /* Gallileo disappears */
|
||||||
|
#ifdef CAPTURE
|
||||||
|
brigcapacity = 300; // Less capacity now
|
||||||
|
brigfree = brigcapacity;
|
||||||
|
#endif
|
||||||
|
#ifdef CLOAKING
|
||||||
|
iscloaked = iscloaking = FALSE;
|
||||||
|
#endif
|
||||||
|
/* Resupply ship */
|
||||||
|
condit=IHDOCKED;
|
||||||
|
for (l = 1; l <= ndevice; l++) damage[l] = 0.0;
|
||||||
|
damage[DSHUTTL] = -1;
|
||||||
|
energy = inenrg = 3000.0;
|
||||||
|
shield = inshld = 1250.0;
|
||||||
|
torps = intorps = 6;
|
||||||
|
lsupres=inlsr=3.0;
|
||||||
|
shldup=0;
|
||||||
|
warpfac=5.0;
|
||||||
|
wfacsq=25.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
int i,j, krem, klumper;
|
||||||
|
int ix, iy;
|
||||||
|
alldone = gamewon = 0;
|
||||||
|
#ifdef DEBUG
|
||||||
|
idebug = 0;
|
||||||
|
#endif
|
||||||
|
// Decide how many of everything
|
||||||
|
if (choose()) return; // frozen game
|
||||||
|
// Prepare the Enterprise
|
||||||
|
ship = IHE;
|
||||||
|
energy = inenrg = 5000.0;
|
||||||
|
shield = inshld = 2500.0;
|
||||||
|
shldchg = shldup = 0;
|
||||||
|
inlsr = 4.0;
|
||||||
|
lsupres = 4.0;
|
||||||
|
iran8(&quadx, &quady);
|
||||||
|
iran10(§x, §y);
|
||||||
|
torps = intorps = 10;
|
||||||
|
nprobes = (int)(3.0*Rand() + 2.0); /* Give them 2-4 of these wonders */
|
||||||
|
warpfac = 5.0;
|
||||||
|
wfacsq = warpfac * warpfac;
|
||||||
|
for (i=0; i <= ndevice; i++) damage[i] = 0.0;
|
||||||
|
// Set up assorted game parameters
|
||||||
|
batx = baty = 0;
|
||||||
|
d.date = indate = 100.0*(int)(31.0*Rand()+20.0);
|
||||||
|
d.killk = d.killc = nkinks = nhelp = resting = casual = d.nromkl = 0;
|
||||||
|
// Added d.starkl=0 6/2015
|
||||||
|
isatb = iscate = imine = icrystl = icraft = d.nsckill = d.nplankl = d.starkl = 0;
|
||||||
|
iscraft = 1;
|
||||||
|
landed = -1;
|
||||||
|
alive = 1;
|
||||||
|
docfac = 0.25;
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
for (j = 1; j <= 8; j++) d.newstuf[i][j] = starch[i][j] = 0;
|
||||||
|
// Initialize times for extraneous events
|
||||||
|
future[FSNOVA] = d.date + expran(0.5 * intime);
|
||||||
|
future[FTBEAM] = d.date + expran(1.5 * (intime / d.remcom));
|
||||||
|
future[FSNAP] = d.date + 1.0 + Rand(); // Force an early snapshot
|
||||||
|
future[FBATTAK] = d.date + expran(0.3*intime);
|
||||||
|
future[FCDBAS] = 1e30;
|
||||||
|
future[FSCMOVE] = d.nscrem ? d.date+0.2777 : 1e30;
|
||||||
|
future[FSCDBAS] = 1e30;
|
||||||
|
future[FDSPROB] = 1e30;
|
||||||
|
// Starchart is functional
|
||||||
|
stdamtim = 1e30;
|
||||||
|
// Put stars in the galaxy
|
||||||
|
instar = 0;
|
||||||
|
for (i=1; i<=8; i++)
|
||||||
|
for (j=1; j<=8; j++) {
|
||||||
|
int k = Rand()*9.0 + 1.0;
|
||||||
|
instar += k;
|
||||||
|
d.galaxy[i][j] = k;
|
||||||
|
}
|
||||||
|
// Locate star bases in galaxy
|
||||||
|
for (i = 1; i <= inbase; i++) {
|
||||||
|
int contflag;
|
||||||
|
do {
|
||||||
|
do iran8(&ix, &iy);
|
||||||
|
while (d.galaxy[ix][iy] >= 10);
|
||||||
|
contflag = FALSE;
|
||||||
|
for (j = i-1; j > 0; j--) {
|
||||||
|
/* Improved placement algorithm to spread out bases */
|
||||||
|
double distq = square(ix-d.baseqx[j]) + square(iy-d.baseqy[j]);
|
||||||
|
if (distq < 6.0*(6-inbase) && Rand() < 0.75) {
|
||||||
|
contflag = TRUE;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
else if (distq < 6.0 * (6-inbase)) {
|
||||||
|
printf("DEBUG: saving base #%d, close to #%d\n", i, j);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} while (contflag);
|
||||||
|
|
||||||
|
d.baseqx[i] = ix;
|
||||||
|
d.baseqy[i] = iy;
|
||||||
|
starch[ix][iy] = -1;
|
||||||
|
d.galaxy[ix][iy] += 10;
|
||||||
|
}
|
||||||
|
// Position ordinary Klingon Battle Cruisers
|
||||||
|
krem = inkling - incom - d.nscrem;
|
||||||
|
klumper = 0.25*skill*(9.0-length)+1.0;
|
||||||
|
if (klumper > 9) klumper = 9; // Can't have more than 9 in quadrant
|
||||||
|
do {
|
||||||
|
double r = Rand();
|
||||||
|
int klump = (1.0 - r*r)*klumper;
|
||||||
|
if (klump > krem) klump = krem;
|
||||||
|
krem -= klump;
|
||||||
|
klump *= 100;
|
||||||
|
do iran8(&ix, &iy);
|
||||||
|
while (d.galaxy[ix][iy] + klump >= 1000);
|
||||||
|
d.galaxy[ix][iy] += klump;
|
||||||
|
} while (krem > 0);
|
||||||
|
// Position Klingon Commander Ships
|
||||||
|
#ifdef DEBUG
|
||||||
|
klumper = 1;
|
||||||
|
#endif
|
||||||
|
for (i = 1; i <= incom; i++) {
|
||||||
|
do {
|
||||||
|
do { /* IF debugging, put commanders by bases, always! */
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug && klumper <= inbase) {
|
||||||
|
ix = d.baseqx[klumper];
|
||||||
|
iy = d.baseqy[klumper];
|
||||||
|
klumper++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
iran8(&ix, &iy);
|
||||||
|
}
|
||||||
|
while ((d.galaxy[ix][iy] < 99 && Rand() < 0.75)||
|
||||||
|
d.galaxy[ix][iy]>899);
|
||||||
|
// check for duplicate
|
||||||
|
for (j = 1; j < i; j++)
|
||||||
|
if (d.cx[j]==ix && d.cy[j]==iy) break;
|
||||||
|
} while (j < i);
|
||||||
|
d.galaxy[ix][iy] += 100;
|
||||||
|
d.cx[i] = ix;
|
||||||
|
d.cy[i] = iy;
|
||||||
|
}
|
||||||
|
// Locate planets in galaxy
|
||||||
|
for (i = 1; i <= inplan; i++) {
|
||||||
|
do iran8(&ix, &iy);
|
||||||
|
while (d.newstuf[ix][iy] > 0);
|
||||||
|
d.newstuf[ix][iy] = 1;
|
||||||
|
d.plnets[i].x = ix;
|
||||||
|
d.plnets[i].y = iy;
|
||||||
|
d.plnets[i].pclass = Rand()*3.0 + 1.0; // Planet class M N or O
|
||||||
|
d.plnets[i].crystals = 1.5*Rand(); // 1 in 3 chance of crystals
|
||||||
|
d.plnets[i].known = 0;
|
||||||
|
}
|
||||||
|
// Locate Romulans
|
||||||
|
for (i = 1; i <= d.nromrem; i++) {
|
||||||
|
iran8(&ix, &iy);
|
||||||
|
d.newstuf[ix][iy] += 10;
|
||||||
|
}
|
||||||
|
// Locate the Super Commander
|
||||||
|
if (d.nscrem > 0) {
|
||||||
|
do iran8(&ix, &iy);
|
||||||
|
while (d.galaxy[ix][iy] >= 900);
|
||||||
|
d.isx = ix;
|
||||||
|
d.isy = iy;
|
||||||
|
d.galaxy[ix][iy] += 100;
|
||||||
|
}
|
||||||
|
// Place thing (in tournament game, thingx == -1, don't want one!)
|
||||||
|
if (Rand() < 0.1 && thingx != -1) {
|
||||||
|
iran8(&thingx, &thingy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
thingx = thingy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// idate = date;
|
||||||
|
skip(3);
|
||||||
|
d.snap = 0;
|
||||||
|
|
||||||
|
if (skill == SNOVICE) {
|
||||||
|
printf("It is stardate %d. The Federation is being attacked by\n",
|
||||||
|
(int)d.date);
|
||||||
|
printf("a deadly Klingon invasion force. As captain of the United\n"
|
||||||
|
"Starship U.S.S. Enterprise, it is your mission to seek out\n"
|
||||||
|
"and destroy this invasion force of %d battle cruisers.\n",
|
||||||
|
inkling);
|
||||||
|
printf("You have an initial allotment of %d stardates to complete\n"
|
||||||
|
"your mission. As you proceed you may be given more time.\n\n"
|
||||||
|
"You will have %d supporting starbases.\n"
|
||||||
|
"Starbase locations- ",
|
||||||
|
(int)intime, inbase);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Stardate %d.\n\n"
|
||||||
|
"%d Klingons,\nan unknown number of Romulans\n",
|
||||||
|
(int)d.date, inkling);
|
||||||
|
if (d.nscrem) printf("and one (GULP) Super-Commander.\n");
|
||||||
|
printf("%d stardates\n%d starbases in ",(int)intime, inbase);
|
||||||
|
}
|
||||||
|
for (i = 1; i <= inbase; i++) {
|
||||||
|
cramlc(0, d.baseqx[i], d.baseqy[i]);
|
||||||
|
if (i < inbase) proutn(" ");
|
||||||
|
}
|
||||||
|
skip(2);
|
||||||
|
proutn("The Enterprise is currently in");
|
||||||
|
cramlc(1, quadx, quady);
|
||||||
|
proutn(" ");
|
||||||
|
cramlc(2, sectx, secty);
|
||||||
|
skip(2);
|
||||||
|
prout("Good Luck!");
|
||||||
|
if (d.nscrem) proutn(" YOU'LL NEED IT.");
|
||||||
|
skip(1);
|
||||||
|
newqad(0);
|
||||||
|
if (nenhere) shldup=1.0;
|
||||||
|
if (neutz) attack(0); // bad luck to start in a Romulan Neutral Zone
|
||||||
|
}
|
||||||
|
|
||||||
|
int choose(void) {
|
||||||
|
tourn = 0;
|
||||||
|
thawed = 0;
|
||||||
|
skill = 0;
|
||||||
|
length = 0;
|
||||||
|
while (TRUE) {
|
||||||
|
if (fromcommandline) /* Can start with command line options */
|
||||||
|
fromcommandline = 0;
|
||||||
|
else
|
||||||
|
proutn("Would you like a regular, tournament, or frozen game?");
|
||||||
|
scan();
|
||||||
|
if (strlen(citem)==0) continue; // Try again
|
||||||
|
if (isit("tournament")) {
|
||||||
|
while (scan() == IHEOL) {
|
||||||
|
proutn("Type in tournament number-");
|
||||||
|
}
|
||||||
|
if (aaitem == 0) {
|
||||||
|
chew();
|
||||||
|
continue; // We don't want a blank entry
|
||||||
|
}
|
||||||
|
tourn = (int)aaitem;
|
||||||
|
thingx = -1;
|
||||||
|
srand((unsigned int)(int)aaitem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (isit("frozen")) {
|
||||||
|
thaw();
|
||||||
|
chew();
|
||||||
|
if (*passwd==0) continue;
|
||||||
|
randomize();
|
||||||
|
Rand(); Rand(); Rand(); Rand();
|
||||||
|
if (!alldone) thawed = 1; // No plaque if not finished
|
||||||
|
report(1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (isit("regular")) {
|
||||||
|
skip(2);
|
||||||
|
randomize();
|
||||||
|
Rand(); Rand(); Rand(); Rand();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
proutn("What is \"");
|
||||||
|
proutn(citem);
|
||||||
|
prout("\"?");
|
||||||
|
chew();
|
||||||
|
}
|
||||||
|
while (length==0 || skill==0) {
|
||||||
|
if (scan() == IHALPHA) {
|
||||||
|
if (isit("short")) length = 1;
|
||||||
|
else if (isit("medium")) length = 2;
|
||||||
|
else if (isit("long")) length = 4;
|
||||||
|
else if (isit("novice")) skill = SNOVICE;
|
||||||
|
else if (isit("fair")) skill = SFAIR;
|
||||||
|
else if (isit("good")) skill = SGOOD;
|
||||||
|
else if (isit("expert")) skill = SEXPERT;
|
||||||
|
else if (isit("emeritus")) skill = SEMERITUS;
|
||||||
|
else {
|
||||||
|
proutn("What is \"");
|
||||||
|
proutn(citem);
|
||||||
|
prout("\"?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
chew();
|
||||||
|
if (length==0) proutn("Would you like a Short, Medium, or Long game? ");
|
||||||
|
else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (TRUE) {
|
||||||
|
scan();
|
||||||
|
strcpy(passwd, citem);
|
||||||
|
chew();
|
||||||
|
if (*passwd != 0) break;
|
||||||
|
proutn("Please type in a secret password (9 characters maximum)-");
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (strcmp(passwd, "debug")==0) idebug = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Use parameters to generate initial values of things
|
||||||
|
damfac = 0.5 * skill;
|
||||||
|
d.rembase = 3.0*Rand()+2.0;
|
||||||
|
inbase = d.rembase;
|
||||||
|
inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();
|
||||||
|
d.nromrem = (2.0+Rand())*skill;
|
||||||
|
d.nscrem = (skill > SFAIR? 1 : 0);
|
||||||
|
d.remtime = 7.0 * length;
|
||||||
|
intime = d.remtime;
|
||||||
|
d.remkl = 2.0*intime*((skill+1 - 2*Rand())*skill*0.1+.15); // d.remkl and inkling includes commanders and SC
|
||||||
|
inkling = d.remkl;
|
||||||
|
incom = skill + 0.0625*inkling*Rand();
|
||||||
|
d.remcom= min(10, incom);
|
||||||
|
incom = d.remcom;
|
||||||
|
d.remres = (inkling+4*incom)*intime;
|
||||||
|
inresor = d.remres;
|
||||||
|
if (inkling > 50) {
|
||||||
|
inbase = (d.rembase += 1);
|
||||||
|
}
|
||||||
|
#ifdef CAPTURE
|
||||||
|
brigcapacity = 400;
|
||||||
|
brigfree = brigcapacity;
|
||||||
|
kcaptured = 0; // TAA fix 6/2015
|
||||||
|
#endif
|
||||||
|
#ifdef CLOAKING
|
||||||
|
ncviol = 0; // TAA fix 6/2015
|
||||||
|
iscloaked = FALSE;
|
||||||
|
iscloaking = FALSE;
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dropin(int iquad, int *ix, int *iy) {
|
||||||
|
do iran10(ix, iy);
|
||||||
|
while (quad[*ix][*iy] != IHDOT);
|
||||||
|
quad[*ix][*iy] = iquad;
|
||||||
|
}
|
||||||
|
|
||||||
|
void newcnd(void) {
|
||||||
|
condit = IHGREEN;
|
||||||
|
if (energy < 1000.0) condit = IHYELLOW;
|
||||||
|
if (d.galaxy[quadx][quady] > 99 || d.newstuf[quadx][quady] > 9)
|
||||||
|
condit = IHRED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void newqad(int shutup) {
|
||||||
|
int quadnum = d.galaxy[quadx][quady];
|
||||||
|
int newnum = d.newstuf[quadx][quady];
|
||||||
|
int i, j, ix, iy, nplan;
|
||||||
|
|
||||||
|
iattak = 1;
|
||||||
|
justin = 1;
|
||||||
|
basex = basey = 0;
|
||||||
|
klhere = 0;
|
||||||
|
comhere = 0;
|
||||||
|
plnetx = plnety = 0;
|
||||||
|
ishere = 0;
|
||||||
|
irhere = 0;
|
||||||
|
iplnet = 0;
|
||||||
|
nenhere = 0;
|
||||||
|
neutz = 0;
|
||||||
|
inorbit = 0;
|
||||||
|
landed = -1;
|
||||||
|
ientesc = 0;
|
||||||
|
ithere = 0;
|
||||||
|
iseenit = 0;
|
||||||
|
|
||||||
|
#ifdef CLOAKING
|
||||||
|
isviolreported = FALSE;
|
||||||
|
#endif
|
||||||
|
if (iscate) {
|
||||||
|
// Attempt to escape Super-commander, so tbeam back!
|
||||||
|
iscate = 0;
|
||||||
|
ientesc = 1;
|
||||||
|
}
|
||||||
|
// Clear quadrant
|
||||||
|
for (i=1; i <= 10; i++)
|
||||||
|
for (j=1; j <= 10; j++) quad[i][j] = IHDOT;
|
||||||
|
// cope with supernova
|
||||||
|
if (quadnum > 999) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
klhere = quadnum/100;
|
||||||
|
irhere = newnum/10;
|
||||||
|
nplan = newnum%10;
|
||||||
|
nenhere = klhere + irhere;
|
||||||
|
|
||||||
|
// Position Starship
|
||||||
|
quad[sectx][secty] = ship;
|
||||||
|
|
||||||
|
// Decide if quadrant needs a Tholian
|
||||||
|
if ((skill < SGOOD && Rand() <= 0.02) || /* Lighten up if skill is low */
|
||||||
|
(skill == SGOOD && Rand() <= 0.05) ||
|
||||||
|
(skill > SGOOD && Rand() <= 0.08)
|
||||||
|
#ifdef DEBUG
|
||||||
|
|| strcmp(passwd, "tholianx")==0
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
do {
|
||||||
|
ithx = Rand() > 0.5 ? 10 : 1;
|
||||||
|
ithy = Rand() > 0.5 ? 10 : 1;
|
||||||
|
} while (quad[ithx][ithy] != IHDOT);
|
||||||
|
quad[ithx][ithy] = IHT;
|
||||||
|
ithere = 1;
|
||||||
|
/* Reserve unocupied corners */
|
||||||
|
if (quad[1][1]==IHDOT) quad[1][1] = 'X';
|
||||||
|
if (quad[1][10]==IHDOT) quad[1][10] = 'X';
|
||||||
|
if (quad[10][1]==IHDOT) quad[10][1] = 'X';
|
||||||
|
if (quad[10][10]==IHDOT) quad[10][10] = 'X';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quadnum >= 100) {
|
||||||
|
// Position ordinary Klingons
|
||||||
|
quadnum -= 100*klhere;
|
||||||
|
for (i = 1; i <= klhere; i++) {
|
||||||
|
dropin(IHK, &ix, &iy);
|
||||||
|
kx[i] = ix;
|
||||||
|
ky[i] = iy;
|
||||||
|
kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
|
||||||
|
kpower[i] = Rand()*150.0 +300.0 +25.0*skill;
|
||||||
|
}
|
||||||
|
// If we need a commander, promote a Klingon
|
||||||
|
for (i = 1; i <= d.remcom ; i++)
|
||||||
|
if (d.cx[i]==quadx && d.cy[i]==quady) break;
|
||||||
|
|
||||||
|
if (i <= d.remcom) {
|
||||||
|
quad[ix][iy] = IHC;
|
||||||
|
kpower[klhere] = 950.0+400.0*Rand()+50.0*skill;
|
||||||
|
comhere = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we need a super-commander, promote a Klingon
|
||||||
|
if (quadx == d.isx && quady == d.isy) {
|
||||||
|
quad[kx[1]][ky[1]] = IHS;
|
||||||
|
kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;
|
||||||
|
iscate = 1;
|
||||||
|
ishere = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Put in Romulans if needed
|
||||||
|
for (i = klhere+1; i <= nenhere; i++) {
|
||||||
|
dropin(IHR, &ix, &iy);
|
||||||
|
kx[i] = ix;
|
||||||
|
ky[i] = iy;
|
||||||
|
kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
|
||||||
|
kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;
|
||||||
|
}
|
||||||
|
sortkl();
|
||||||
|
// If quadrant needs a starbase, put it in
|
||||||
|
if (quadnum >= 10) {
|
||||||
|
quadnum -= 10;
|
||||||
|
dropin(IHB, &basex, &basey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nplan) {
|
||||||
|
// If quadrant needs a planet, put it in
|
||||||
|
for (i=1; i <= inplan; i++)
|
||||||
|
if (d.plnets[i].x == quadx && d.plnets[i].y == quady) break;
|
||||||
|
if (i <= inplan) {
|
||||||
|
iplnet = i;
|
||||||
|
dropin(IHP, &plnetx, &plnety);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check for condition
|
||||||
|
newcnd();
|
||||||
|
// And finally the stars
|
||||||
|
for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);
|
||||||
|
|
||||||
|
// Check for RNZ
|
||||||
|
if (irhere > 0 && klhere == 0 && basex == 0) {
|
||||||
|
neutz = 1;
|
||||||
|
if (REPORTS) {
|
||||||
|
skip(1);
|
||||||
|
prout("LT. UHURA- \"Captain, an urgent message.");
|
||||||
|
prout(" I'll put it on audio.\" CLICK");
|
||||||
|
skip(1);
|
||||||
|
prout("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.");
|
||||||
|
prout("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shutup==0) {
|
||||||
|
// Put in THING if needed
|
||||||
|
if (thingx == quadx && thingy == quady) {
|
||||||
|
dropin(IHQUEST, &ix, &iy);
|
||||||
|
thingx = thingy = 0; // Transient
|
||||||
|
if (damage[DSRSENS] == 0.0) {
|
||||||
|
skip(1);
|
||||||
|
prout("MR. SPOCK- \"Captain, this is most unusual.");
|
||||||
|
prout(" Please examine your short-range scan.\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put in a few black holes
|
||||||
|
for (i = 1; i <= 3; i++)
|
||||||
|
if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);
|
||||||
|
|
||||||
|
// Take out X's in corners if Tholian present
|
||||||
|
if (ithere) {
|
||||||
|
if (quad[1][1]=='X') quad[1][1] = IHDOT;
|
||||||
|
if (quad[1][10]=='X') quad[1][10] = IHDOT;
|
||||||
|
if (quad[10][1]=='X') quad[10][1] = IHDOT;
|
||||||
|
if (quad[10][10]=='X') quad[10][10] = IHDOT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sortkl(void) {
|
||||||
|
double t;
|
||||||
|
int sw, j, k;
|
||||||
|
|
||||||
|
// The author liked bubble sort. So we will use it. :-(
|
||||||
|
|
||||||
|
if (nenhere < 2) return;
|
||||||
|
|
||||||
|
do {
|
||||||
|
sw = FALSE;
|
||||||
|
for (j = 1; j < nenhere; j++)
|
||||||
|
if (kdist[j] > kdist[j+1]) {
|
||||||
|
sw = TRUE;
|
||||||
|
t = kdist[j];
|
||||||
|
kdist[j] = kdist[j+1];
|
||||||
|
kdist[j+1] = t;
|
||||||
|
t = kavgd[j];
|
||||||
|
kavgd[j] = kavgd[j+1];
|
||||||
|
kavgd[j+1] = t;
|
||||||
|
k = kx[j];
|
||||||
|
kx[j] = kx[j+1];
|
||||||
|
kx[j+1] = k;
|
||||||
|
k = ky[j];
|
||||||
|
ky[j] = ky[j+1];
|
||||||
|
ky[j+1] = k;
|
||||||
|
t = kpower[j];
|
||||||
|
kpower[j] = kpower[j+1];
|
||||||
|
kpower[j+1] = t;
|
||||||
|
}
|
||||||
|
} while (sw);
|
||||||
|
}
|
818
programs/games/sstartrek/en/sst.c
Normal file
818
programs/games/sstartrek/en/sst.c
Normal file
@ -0,0 +1,818 @@
|
|||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#ifdef MSDOS
|
||||||
|
#include <dos.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef KOS32
|
||||||
|
#include <time.h>
|
||||||
|
#else
|
||||||
|
#include <conio.h>
|
||||||
|
#include <kos32sys1.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INCLUDED // Define externs here
|
||||||
|
#include "sst.h"
|
||||||
|
|
||||||
|
/*int getch(void);
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char line[128], *linep = line;
|
||||||
|
static int linecount; /* for paging */
|
||||||
|
|
||||||
|
static void clearscreen(void);
|
||||||
|
|
||||||
|
/* Compared to original version, I've changed the "help" command to
|
||||||
|
"call" and the "terminate" command to "quit" to better match
|
||||||
|
user expectations. The DECUS version apparently made those changes
|
||||||
|
as well as changing "freeze" to "save". However I like "freeze".
|
||||||
|
|
||||||
|
When I got a later version of Super Star Trek that I was converting
|
||||||
|
from, I added the emexit command.
|
||||||
|
|
||||||
|
That later version also mentions srscan and lrscan working when
|
||||||
|
docked (using the starbase's scanners), so I made some changes here
|
||||||
|
to do this (and indicating that fact to the player), and then realized
|
||||||
|
the base would have a subspace radio as well -- doing a Chart when docked
|
||||||
|
updates the star chart, and all radio reports will be heard. The Dock
|
||||||
|
command will also give a report if a base is under attack.
|
||||||
|
|
||||||
|
Movecom no longer reports movement if sensors are damaged so you wouldn't
|
||||||
|
otherwise know it.
|
||||||
|
|
||||||
|
Also added:
|
||||||
|
|
||||||
|
1. Better base positioning at startup
|
||||||
|
|
||||||
|
2. deathray improvement (but keeping original failure alternatives)
|
||||||
|
|
||||||
|
3. Tholian Web
|
||||||
|
|
||||||
|
4. Enemies can ram the Enterprise. Regular Klingons and Romulans can
|
||||||
|
move in Expert and Emeritus games. This code could use improvement.
|
||||||
|
|
||||||
|
5. The deep space probe looks interesting! DECUS version
|
||||||
|
|
||||||
|
6. Cloaking (with contributions from Erik Olofsen) and Capturing (BSD version).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// I don't like the way this is done, relying on an index. But I don't
|
||||||
|
// want to invest the time to make this nice and table driven.
|
||||||
|
|
||||||
|
static char *commands[] = {
|
||||||
|
"srscan",
|
||||||
|
"lrscan",
|
||||||
|
"phasers",
|
||||||
|
"photons",
|
||||||
|
"move",
|
||||||
|
"shields",
|
||||||
|
"dock",
|
||||||
|
"damages",
|
||||||
|
"chart",
|
||||||
|
"impulse",
|
||||||
|
"rest",
|
||||||
|
"warp",
|
||||||
|
"status",
|
||||||
|
"sensors",
|
||||||
|
"orbit",
|
||||||
|
"transport",
|
||||||
|
"mine",
|
||||||
|
"crystals",
|
||||||
|
"shuttle",
|
||||||
|
"planets",
|
||||||
|
"request",
|
||||||
|
"report",
|
||||||
|
"computer",
|
||||||
|
"commands",
|
||||||
|
"emexit",
|
||||||
|
"probe",
|
||||||
|
"cloak",
|
||||||
|
"capture",
|
||||||
|
"score",
|
||||||
|
"abandon",
|
||||||
|
"destruct",
|
||||||
|
"freeze",
|
||||||
|
"deathray",
|
||||||
|
"debug",
|
||||||
|
"call",
|
||||||
|
"quit",
|
||||||
|
"help"
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUMCOMMANDS (sizeof(commands)/sizeof(char *))
|
||||||
|
|
||||||
|
static void listCommands(int x) {
|
||||||
|
prout(" SRSCAN MOVE PHASERS CALL\n"
|
||||||
|
" STATUS IMPULSE PHOTONS ABANDON\n"
|
||||||
|
" LRSCAN WARP SHIELDS DESTRUCT\n"
|
||||||
|
" CHART REST DOCK QUIT\n"
|
||||||
|
" DAMAGES REPORT SENSORS ORBIT\n"
|
||||||
|
" TRANSPORT MINE CRYSTALS SHUTTLE\n"
|
||||||
|
" PLANETS REQUEST DEATHRAY FREEZE\n"
|
||||||
|
" COMPUTER EMEXIT PROBE COMMANDS");
|
||||||
|
proutn(" ");
|
||||||
|
#ifdef SCORE
|
||||||
|
proutn("SCORE ");
|
||||||
|
#endif
|
||||||
|
#ifdef CLOAKING
|
||||||
|
proutn("CLOAK ");
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
proutn("CAPTURE ");
|
||||||
|
#endif
|
||||||
|
if (x) proutn("HELP ");
|
||||||
|
prout("");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void helpme(void) {
|
||||||
|
int i, j;
|
||||||
|
char cmdbuf[32];
|
||||||
|
char linebuf[132];
|
||||||
|
FILE *fp;
|
||||||
|
/* Give help on commands */
|
||||||
|
int key;
|
||||||
|
key = scan();
|
||||||
|
while (TRUE) {
|
||||||
|
if (key == IHEOL) {
|
||||||
|
proutn("Help on what command?");
|
||||||
|
key = scan();
|
||||||
|
}
|
||||||
|
if (key == IHEOL) return;
|
||||||
|
for (i = 0; i < NUMCOMMANDS; i++) {
|
||||||
|
if (strcmp(commands[i], citem)==0) break;
|
||||||
|
}
|
||||||
|
if (i != NUMCOMMANDS) break;
|
||||||
|
skip(1);
|
||||||
|
prout("Valid commands:");
|
||||||
|
listCommands(FALSE);
|
||||||
|
key = IHEOL;
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
if (i == 23) {
|
||||||
|
strcpy(cmdbuf, " ABBREV");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcpy(cmdbuf, " Mnemonic: ");
|
||||||
|
j = 0;
|
||||||
|
while ((cmdbuf[j+13] = toupper(commands[i][j])) != 0) j++;
|
||||||
|
}
|
||||||
|
fp = fopen("sst.doc", "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
prout("Spock- \"Captain, that information is missing from the");
|
||||||
|
prout(" computer. You need to find SST.DOC and put it in the");
|
||||||
|
prout(" current directory.\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i = strlen(cmdbuf);
|
||||||
|
do {
|
||||||
|
if (fgets(linebuf, 132, fp) == NULL) {
|
||||||
|
prout("Spock- \"Captain, there is no information on that command.\"");
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while (strncmp(linebuf, cmdbuf, i) != 0);
|
||||||
|
|
||||||
|
skip(1);
|
||||||
|
prout("Spock- \"Captain, I've found the following information:\"");
|
||||||
|
skip(1);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (linebuf[0]!=12) { // ignore page break lines
|
||||||
|
linebuf[strlen(linebuf)-1] = '\0'; // No \n at end
|
||||||
|
prout(linebuf);
|
||||||
|
}
|
||||||
|
fgets(linebuf,132,fp);
|
||||||
|
} while (strstr(linebuf, "******")==NULL);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void makemoves(void) {
|
||||||
|
int i, hitme;
|
||||||
|
char ch;
|
||||||
|
while (TRUE) { /* command loop */
|
||||||
|
hitme = FALSE;
|
||||||
|
justin = 0;
|
||||||
|
Time = 0.0;
|
||||||
|
i = -1;
|
||||||
|
while (TRUE) { /* get a command */
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
proutn("COMMAND> ");
|
||||||
|
if (scan() == IHEOL) continue;
|
||||||
|
for (i=0; i < 29; i++) // Abbreviations allowed for the first 29 commands, only.
|
||||||
|
if (isit(commands[i]))
|
||||||
|
break;
|
||||||
|
if (i < 29) break;
|
||||||
|
for (; i < NUMCOMMANDS; i++)
|
||||||
|
if (strcmp(commands[i], citem) == 0) break;
|
||||||
|
if (i < NUMCOMMANDS
|
||||||
|
#ifndef CLOAKING
|
||||||
|
&& i != 26 // ignore the CLOAK command
|
||||||
|
#endif
|
||||||
|
#ifndef CAPTURE
|
||||||
|
&& i != 27 // ignore the CAPTURE command
|
||||||
|
#endif
|
||||||
|
#ifndef SCORE
|
||||||
|
&& i != 28 // ignore the SCORE command
|
||||||
|
#endif
|
||||||
|
#ifndef DEBUG
|
||||||
|
&& i != 33 // ignore the DEBUG command
|
||||||
|
#endif
|
||||||
|
) break;
|
||||||
|
|
||||||
|
if (skill <= SFAIR) {
|
||||||
|
prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:");
|
||||||
|
listCommands(TRUE);
|
||||||
|
}
|
||||||
|
else prout("UNRECOGNIZED COMMAND.");
|
||||||
|
}
|
||||||
|
switch (i) { /* command switch */
|
||||||
|
case 0: // srscan
|
||||||
|
srscan(1);
|
||||||
|
break;
|
||||||
|
case 1: // lrscan
|
||||||
|
lrscan();
|
||||||
|
break;
|
||||||
|
case 2: // phasers
|
||||||
|
phasers();
|
||||||
|
if (ididit) {
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) {
|
||||||
|
prout("The Romulan ship discovers you are breaking the Treaty of Algeron!");
|
||||||
|
ncviol++;
|
||||||
|
isviolreported = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
hitme = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: // photons
|
||||||
|
photon();
|
||||||
|
if (ididit) {
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) {
|
||||||
|
prout("The Romulan ship discovers you are breaking the Treaty of Algeron!");
|
||||||
|
ncviol++;
|
||||||
|
isviolreported = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
hitme = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4: // move
|
||||||
|
warp(1);
|
||||||
|
break;
|
||||||
|
case 5: // shields
|
||||||
|
sheild(1);
|
||||||
|
if (ididit) {
|
||||||
|
attack(2);
|
||||||
|
shldchg = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6: // dock
|
||||||
|
dock();
|
||||||
|
break;
|
||||||
|
case 7: // damages
|
||||||
|
dreprt();
|
||||||
|
break;
|
||||||
|
case 8: // chart
|
||||||
|
chart(0);
|
||||||
|
break;
|
||||||
|
case 9: // impulse
|
||||||
|
impuls();
|
||||||
|
break;
|
||||||
|
case 10: // rest
|
||||||
|
waiting();
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
case 11: // warp
|
||||||
|
setwrp();
|
||||||
|
break;
|
||||||
|
case 12: // status
|
||||||
|
srscan(3);
|
||||||
|
break;
|
||||||
|
case 13: // sensors
|
||||||
|
sensor();
|
||||||
|
break;
|
||||||
|
case 14: // orbit
|
||||||
|
orbit();
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
case 15: // transport "beam"
|
||||||
|
beam();
|
||||||
|
break;
|
||||||
|
case 16: // mine
|
||||||
|
mine();
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
case 17: // crystals
|
||||||
|
usecrystals();
|
||||||
|
break;
|
||||||
|
case 18: // shuttle
|
||||||
|
shuttle();
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
case 19: // Planet list
|
||||||
|
preport();
|
||||||
|
break;
|
||||||
|
case 20: // Status information
|
||||||
|
srscan(2);
|
||||||
|
break;
|
||||||
|
case 21: // Game Report
|
||||||
|
report(0);
|
||||||
|
break;
|
||||||
|
case 22: // use COMPUTER!
|
||||||
|
eta();
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
listCommands(TRUE);
|
||||||
|
break;
|
||||||
|
case 24: // Emergency exit
|
||||||
|
clearscreen(); // Hide screen
|
||||||
|
freeze(TRUE); // forced save
|
||||||
|
#ifdef KOS32
|
||||||
|
con_exit(1);
|
||||||
|
#endif
|
||||||
|
exit(1); // And quick exit
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
probe(); // Launch probe
|
||||||
|
break;
|
||||||
|
#ifdef CLOAKING
|
||||||
|
case 26:
|
||||||
|
cloak(); // turn on/off cloaking
|
||||||
|
if (iscloaking) {
|
||||||
|
attack(2); // We will be seen while we cloak
|
||||||
|
iscloaking = FALSE;
|
||||||
|
iscloaked = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
case 27:
|
||||||
|
capture(); // Attempt to get Klingon ship to surrender
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef SCORE
|
||||||
|
case 28:
|
||||||
|
score(1); // get the score
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 29: // Abandon Ship
|
||||||
|
abandn();
|
||||||
|
break;
|
||||||
|
case 30: // Self Destruct
|
||||||
|
dstrct();
|
||||||
|
break;
|
||||||
|
case 31: // Save Game
|
||||||
|
freeze(FALSE);
|
||||||
|
if (skill > SGOOD)
|
||||||
|
prout("WARNING--Frozen games produce no plaques!");
|
||||||
|
break;
|
||||||
|
case 32: // Try a desparation measure
|
||||||
|
deathray();
|
||||||
|
if (ididit) hitme = TRUE;
|
||||||
|
break;
|
||||||
|
#ifdef DEBUG
|
||||||
|
case 33: // What do we want for debug???
|
||||||
|
debugme();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 34: // Call for help
|
||||||
|
help();
|
||||||
|
break;
|
||||||
|
case 35:
|
||||||
|
alldone = 1; // quit the game
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) score(0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 36:
|
||||||
|
helpme(); // get help
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (;;) {
|
||||||
|
if (alldone) break; // Game has ended
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (idebug) prout("2500");
|
||||||
|
#endif
|
||||||
|
if (Time != 0.0) {
|
||||||
|
events();
|
||||||
|
if (alldone) break; // Events did us in
|
||||||
|
}
|
||||||
|
if (d.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!
|
||||||
|
atover(0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (nenhere == 0) movetho();
|
||||||
|
if (hitme && justin==0) {
|
||||||
|
attack(2);
|
||||||
|
if (alldone) break;
|
||||||
|
if (d.galaxy[quadx][quady] == 1000) { // went NOVA!
|
||||||
|
atover(0);
|
||||||
|
hitme = TRUE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (alldone) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int i;
|
||||||
|
int hitme;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
#ifdef KOS32
|
||||||
|
if (con_init_console_dll()) return 1; // init fail
|
||||||
|
con_set_title("-SUPER- STAR TREK");
|
||||||
|
con_set_flags(CON_COLOR_GREEN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
prelim();
|
||||||
|
|
||||||
|
if (argc > 1) { // look for -f option
|
||||||
|
if (strcmp(argv[1], "-f")== 0) {
|
||||||
|
coordfixed = 1;
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
fromcommandline = 1;
|
||||||
|
line[0] = '\0';
|
||||||
|
while (--argc > 0) {
|
||||||
|
strcat(line, *(++argv));
|
||||||
|
strcat(line, " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else fromcommandline = 0;
|
||||||
|
|
||||||
|
|
||||||
|
while (TRUE) { /* Play a game */
|
||||||
|
setup();
|
||||||
|
if (alldone) {
|
||||||
|
score(0);
|
||||||
|
alldone = 0;
|
||||||
|
}
|
||||||
|
else makemoves();
|
||||||
|
skip(2);
|
||||||
|
stars();
|
||||||
|
skip(1);
|
||||||
|
|
||||||
|
if (tourn && alldone) {
|
||||||
|
printf("Do you want your score recorded?");
|
||||||
|
if (ja()) {
|
||||||
|
chew2();
|
||||||
|
freeze(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Do you want to play again?");
|
||||||
|
if (!ja()) break;
|
||||||
|
}
|
||||||
|
skip(1);
|
||||||
|
prout("May the Great Bird of the Galaxy roost upon your home planet.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cramen(int i) {
|
||||||
|
/* return an enemy */
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case IHR: s = "Romulan"; break;
|
||||||
|
case IHK: s = "Klingon"; break;
|
||||||
|
case IHC: s = "Commander"; break;
|
||||||
|
case IHS: s = "Super-commander"; break;
|
||||||
|
case IHSTAR: s = "Star"; break;
|
||||||
|
case IHP: s = "Planet"; break;
|
||||||
|
case IHB: s = "Starbase"; break;
|
||||||
|
case IHBLANK: s = "Black hole"; break;
|
||||||
|
case IHT: s = "Tholean"; break;
|
||||||
|
case IHWEB: s = "Tholean web"; break;
|
||||||
|
default: s = "Unknown??"; break;
|
||||||
|
}
|
||||||
|
proutn(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cramlc(int key, int x, int y) {
|
||||||
|
if (key == 1) proutn(" Quadrant");
|
||||||
|
else if (key == 2) proutn(" Sector");
|
||||||
|
proutn(" ");
|
||||||
|
crami(x, 1);
|
||||||
|
proutn(" - ");
|
||||||
|
crami(y, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void crmena(int i, int enemy, int key, int x, int y) {
|
||||||
|
if (i == 1) proutn("***");
|
||||||
|
cramen(enemy);
|
||||||
|
proutn(" at");
|
||||||
|
cramlc(key, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void crmshp(void) {
|
||||||
|
char *s;
|
||||||
|
switch (ship) {
|
||||||
|
case IHE: s = "Enterprise"; break;
|
||||||
|
case IHF: s = "Faerie Queene"; break;
|
||||||
|
default: s = "Ship???"; break;
|
||||||
|
}
|
||||||
|
proutn(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stars(void) {
|
||||||
|
prouts("******************************************************");
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
double expran(double avrage) {
|
||||||
|
return -avrage*log(1e-7 + Rand());
|
||||||
|
}
|
||||||
|
|
||||||
|
double Rand(void) {
|
||||||
|
return rand()/(1.0 + (double)RAND_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void iran8(int *i, int *j) {
|
||||||
|
*i = Rand()*8.0 + 1.0;
|
||||||
|
*j = Rand()*8.0 + 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iran10(int *i, int *j) {
|
||||||
|
*i = Rand()*10.0 + 1.0;
|
||||||
|
*j = Rand()*10.0 + 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void chew(void) {
|
||||||
|
linecount = 0;
|
||||||
|
linep = line;
|
||||||
|
*linep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void chew2(void) {
|
||||||
|
/* return IHEOL next time */
|
||||||
|
linecount = 0;
|
||||||
|
linep = line+1;
|
||||||
|
*linep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int scan(void) {
|
||||||
|
int i;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
linecount = 0;
|
||||||
|
|
||||||
|
// Init result
|
||||||
|
aaitem = 0.0;
|
||||||
|
*citem = 0;
|
||||||
|
|
||||||
|
// Read a line if nothing here
|
||||||
|
if (*linep == 0) {
|
||||||
|
if (linep != line) {
|
||||||
|
chew();
|
||||||
|
return IHEOL;
|
||||||
|
}
|
||||||
|
#ifdef KOS32
|
||||||
|
cp = gets(line);
|
||||||
|
if (!cp) exit();
|
||||||
|
#else
|
||||||
|
// We should really be using fgets
|
||||||
|
fgets(line,sizeof(line),stdin);
|
||||||
|
#endif
|
||||||
|
if (line[strlen(line)-1] == '\n')
|
||||||
|
line[strlen(line)-1] = '\0';
|
||||||
|
linep = line;
|
||||||
|
}
|
||||||
|
// Skip leading white space
|
||||||
|
while (*linep == ' ') linep++;
|
||||||
|
// Nothing left
|
||||||
|
if (*linep == 0) {
|
||||||
|
chew();
|
||||||
|
return IHEOL;
|
||||||
|
}
|
||||||
|
if (isdigit(*linep) || *linep=='+' || *linep=='-' || *linep=='.') {
|
||||||
|
// treat as a number
|
||||||
|
if (sscanf(linep, "%lf%n", &aaitem, &i) < 1) {
|
||||||
|
linep = line; // Invalid numbers are ignored
|
||||||
|
*linep = 0;
|
||||||
|
return IHEOL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// skip to end
|
||||||
|
linep += i;
|
||||||
|
return IHREAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Treat as alpha
|
||||||
|
cp = citem;
|
||||||
|
while (*linep && *linep!=' ') {
|
||||||
|
if ((cp - citem) < 9) *cp++ = tolower(*linep);
|
||||||
|
linep++;
|
||||||
|
}
|
||||||
|
*cp = 0;
|
||||||
|
return IHALPHA;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ja(void) {
|
||||||
|
chew();
|
||||||
|
while (TRUE) {
|
||||||
|
scan();
|
||||||
|
chew();
|
||||||
|
if (*citem == 'y') return TRUE;
|
||||||
|
if (*citem == 'n') return FALSE;
|
||||||
|
proutn("Please answer with \"Y\" or \"N\":");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cramf(double x, int w, int d) {
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, "%*.*f", w, d, x);
|
||||||
|
proutn(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void crami(int i, int w) {
|
||||||
|
char buf[16];
|
||||||
|
sprintf(buf, "%*d", w, i);
|
||||||
|
proutn(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
double square(double i) { return i*i; }
|
||||||
|
|
||||||
|
static void clearscreen(void) {
|
||||||
|
/* Somehow we need to clear the screen */
|
||||||
|
proutn("\033[2J\033[0;0H"); /* Hope for an ANSI display */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We will pull these out in case we want to do something special later */
|
||||||
|
|
||||||
|
void pause(int i) {
|
||||||
|
#ifdef CLOAKING
|
||||||
|
if (iscloaked) return;
|
||||||
|
#endif
|
||||||
|
putchar('\n');
|
||||||
|
if (i==1) {
|
||||||
|
if (skill > SFAIR)
|
||||||
|
prout("[ANNOUNCEMENT ARRIVING...]");
|
||||||
|
else
|
||||||
|
prout("[IMPORTANT ANNOUNCEMENT ARRIVING -- HIT ENTER TO CONTINUE]");
|
||||||
|
getchar();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (skill > SFAIR)
|
||||||
|
proutn("[CONTINUE?]");
|
||||||
|
else
|
||||||
|
proutn("[HIT ENTER TO CONTINUE]");
|
||||||
|
getchar();
|
||||||
|
proutn("\r \r");
|
||||||
|
}
|
||||||
|
if (i != 0) {
|
||||||
|
clearscreen();
|
||||||
|
}
|
||||||
|
linecount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void skip(int i) {
|
||||||
|
while (i-- > 0) {
|
||||||
|
linecount++;
|
||||||
|
if (linecount >= 23)
|
||||||
|
pause(0);
|
||||||
|
else
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void proutn(char *s) {
|
||||||
|
#ifndef KOS32
|
||||||
|
fputs(s, stdout);
|
||||||
|
#else
|
||||||
|
con_write_asciiz(s);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void prout(char *s) {
|
||||||
|
proutn(s);
|
||||||
|
skip(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void prouts(char *s) {
|
||||||
|
#ifdef KOS32
|
||||||
|
#define clock_t long int
|
||||||
|
#define clock() get_tick_count()
|
||||||
|
#define CLOCKS_PER_SEC 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
clock_t endTime;
|
||||||
|
/* print slowly! */
|
||||||
|
while (*s) {
|
||||||
|
endTime = clock() + CLOCKS_PER_SEC*0.05;
|
||||||
|
while (clock() < endTime) ;
|
||||||
|
putchar(*s++);
|
||||||
|
#ifndef KOS32
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void huh(void) {
|
||||||
|
chew();
|
||||||
|
skip(1);
|
||||||
|
prout("Beg your pardon, Captain?");
|
||||||
|
}
|
||||||
|
|
||||||
|
int isit(char *s) {
|
||||||
|
/* New function -- compares s to scaned citem and returns true if it
|
||||||
|
matches to the length of s */
|
||||||
|
|
||||||
|
return strncmp(s, citem, max(1, strlen(citem))) == 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void debugme(void) {
|
||||||
|
proutn("Reset levels? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
if (energy < inenrg) energy = inenrg;
|
||||||
|
shield = inshld;
|
||||||
|
torps = intorps;
|
||||||
|
lsupres = inlsr;
|
||||||
|
}
|
||||||
|
proutn("Reset damage? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
int i;
|
||||||
|
for (i=0; i <= ndevice; i++) if (damage[i] > 0.0) damage[i] = 0.0;
|
||||||
|
stdamtim = 1e30;
|
||||||
|
}
|
||||||
|
proutn("Toggle idebug? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
idebug = !idebug;
|
||||||
|
if (idebug) prout("Debug output ON");
|
||||||
|
else prout("Debug output OFF");
|
||||||
|
}
|
||||||
|
proutn("Cause selective damage? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
int i, key;
|
||||||
|
for (i=1; i <= ndevice; i++) {
|
||||||
|
proutn("Kill ");
|
||||||
|
proutn(device[i]);
|
||||||
|
proutn("? ");
|
||||||
|
chew();
|
||||||
|
key = scan();
|
||||||
|
if (key == IHALPHA && isit("y")) {
|
||||||
|
damage[i] = 10.0;
|
||||||
|
if (i == DRADIO) stdamtim = d.date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proutn("Examine/change events? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
int i;
|
||||||
|
for (i = 1; i < NEVENTS; i++) {
|
||||||
|
int key;
|
||||||
|
if (future[i] == 1e30) continue;
|
||||||
|
switch (i) {
|
||||||
|
case FSNOVA: proutn("Supernova "); break;
|
||||||
|
case FTBEAM: proutn("T Beam "); break;
|
||||||
|
case FSNAP: proutn("Snapshot "); break;
|
||||||
|
case FBATTAK: proutn("Base Attack "); break;
|
||||||
|
case FCDBAS: proutn("Base Destroy "); break;
|
||||||
|
case FSCMOVE: proutn("SC Move "); break;
|
||||||
|
case FSCDBAS: proutn("SC Base Destroy "); break;
|
||||||
|
}
|
||||||
|
cramf(future[i]-d.date, 8, 2);
|
||||||
|
chew();
|
||||||
|
proutn(" ?");
|
||||||
|
key = scan();
|
||||||
|
if (key == IHREAL) {
|
||||||
|
future[i] = d.date + aaitem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chew();
|
||||||
|
}
|
||||||
|
proutn("Make universe visible? ");
|
||||||
|
if (ja() != 0) {
|
||||||
|
int i, j;
|
||||||
|
for (i = 1; i < 9; i++)
|
||||||
|
{
|
||||||
|
for (j = 1; j < 9; j++)
|
||||||
|
{
|
||||||
|
starch[i][j] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
1591
programs/games/sstartrek/en/sst.doc
Normal file
1591
programs/games/sstartrek/en/sst.doc
Normal file
File diff suppressed because it is too large
Load Diff
496
programs/games/sstartrek/en/sst.h
Normal file
496
programs/games/sstartrek/en/sst.h
Normal file
@ -0,0 +1,496 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#ifndef INCLUDED
|
||||||
|
#define EXTERN extern
|
||||||
|
#else
|
||||||
|
#define EXTERN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#define DEBUG
|
||||||
|
#define SCORE
|
||||||
|
#define CLOAKING
|
||||||
|
#define CAPTURE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CLOAKING
|
||||||
|
#define ndevice (16)
|
||||||
|
#else
|
||||||
|
#define ndevice (15) // Number of devices
|
||||||
|
#endif
|
||||||
|
#define phasefac (2.0)
|
||||||
|
#define PLNETMAX (10)
|
||||||
|
#define NEVENTS (8)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x; /* Quadrant location of planet */
|
||||||
|
int y;
|
||||||
|
int pclass; /* class M, N, or O (1, 2, or 3) */
|
||||||
|
int crystals; /* has crystals */
|
||||||
|
int known; /* =1 contents known, =2 shuttle on this planet */
|
||||||
|
} PLANETS;
|
||||||
|
|
||||||
|
EXTERN struct foo {
|
||||||
|
int snap, // snapshot taken
|
||||||
|
remkl, // remaining klingons
|
||||||
|
remcom, // remaining commanders
|
||||||
|
rembase, // remaining bases
|
||||||
|
starkl, // destroyed stars
|
||||||
|
basekl, // destroyed bases
|
||||||
|
killk, // Klingons killed
|
||||||
|
killc, // commanders killed
|
||||||
|
galaxy[9][9], // The Galaxy (subscript 0 not used)
|
||||||
|
cx[11],cy[11], // Commander quadrant coordinates
|
||||||
|
baseqx[6], // Base quadrant X
|
||||||
|
baseqy[6], // Base quadrant Y
|
||||||
|
newstuf[9][9], // Extended galaxy goodies
|
||||||
|
isx, isy, // Coordinate of Super Commander
|
||||||
|
nscrem, // remaining super commanders
|
||||||
|
nromkl, // Romulans killed
|
||||||
|
nromrem, // Romulans remaining
|
||||||
|
nsckill, // super commanders killed
|
||||||
|
nplankl; // destroyed planets
|
||||||
|
PLANETS plnets[PLNETMAX+1]; // Planet information
|
||||||
|
#ifdef CAPTURE
|
||||||
|
int kcaptured, brigfree;
|
||||||
|
#endif
|
||||||
|
double date, // stardate
|
||||||
|
remres, // remaining resources
|
||||||
|
remtime; // remaining time
|
||||||
|
} d, snapsht; // Data that is snapshot
|
||||||
|
|
||||||
|
EXTERN char
|
||||||
|
quad[11][11]; // contents of our quadrant
|
||||||
|
|
||||||
|
// Scalar variables that are needed for freezing the game
|
||||||
|
// are placed in a structure. #defines are used to access by their
|
||||||
|
// original names. Gee, I could have done this with the d structure,
|
||||||
|
// but I just didn't think of it back when I started.
|
||||||
|
|
||||||
|
EXTERN struct foo2 {
|
||||||
|
int inkling,
|
||||||
|
inbase,
|
||||||
|
incom,
|
||||||
|
instar,
|
||||||
|
intorps,
|
||||||
|
condit,
|
||||||
|
torps,
|
||||||
|
ship,
|
||||||
|
quadx,
|
||||||
|
quady,
|
||||||
|
sectx,
|
||||||
|
secty,
|
||||||
|
length,
|
||||||
|
skill,
|
||||||
|
basex,
|
||||||
|
basey,
|
||||||
|
klhere,
|
||||||
|
comhere,
|
||||||
|
casual,
|
||||||
|
nhelp,
|
||||||
|
nkinks,
|
||||||
|
ididit,
|
||||||
|
gamewon,
|
||||||
|
alive,
|
||||||
|
justin,
|
||||||
|
alldone,
|
||||||
|
shldchg,
|
||||||
|
thingx,
|
||||||
|
thingy,
|
||||||
|
plnetx,
|
||||||
|
plnety,
|
||||||
|
inorbit,
|
||||||
|
landed,
|
||||||
|
iplnet,
|
||||||
|
imine,
|
||||||
|
inplan,
|
||||||
|
nenhere,
|
||||||
|
ishere,
|
||||||
|
neutz,
|
||||||
|
irhere,
|
||||||
|
icraft,
|
||||||
|
ientesc,
|
||||||
|
iscraft,
|
||||||
|
isatb,
|
||||||
|
iscate,
|
||||||
|
#ifdef DEBUG
|
||||||
|
idebug,
|
||||||
|
#endif
|
||||||
|
#ifdef CLOAKING
|
||||||
|
iscloaked,
|
||||||
|
iscloaking,
|
||||||
|
ncviol,
|
||||||
|
isviolreported,
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
brigcapacity,
|
||||||
|
#endif
|
||||||
|
iattak,
|
||||||
|
icrystl,
|
||||||
|
tourn,
|
||||||
|
thawed,
|
||||||
|
batx,
|
||||||
|
baty,
|
||||||
|
ithere,
|
||||||
|
ithx,
|
||||||
|
ithy,
|
||||||
|
iseenit,
|
||||||
|
probecx,
|
||||||
|
probecy,
|
||||||
|
proben,
|
||||||
|
isarmed,
|
||||||
|
nprobes;
|
||||||
|
|
||||||
|
double inresor,
|
||||||
|
intime,
|
||||||
|
inenrg,
|
||||||
|
inshld,
|
||||||
|
inlsr,
|
||||||
|
indate,
|
||||||
|
energy,
|
||||||
|
shield,
|
||||||
|
shldup,
|
||||||
|
warpfac,
|
||||||
|
wfacsq,
|
||||||
|
lsupres,
|
||||||
|
dist,
|
||||||
|
direc,
|
||||||
|
Time,
|
||||||
|
docfac,
|
||||||
|
resting,
|
||||||
|
damfac,
|
||||||
|
stdamtim,
|
||||||
|
cryprob,
|
||||||
|
probex,
|
||||||
|
probey,
|
||||||
|
probeinx,
|
||||||
|
probeiny;
|
||||||
|
} a;
|
||||||
|
|
||||||
|
#define inkling a.inkling // Initial number of klingons
|
||||||
|
#define inbase a.inbase // Initial number of bases
|
||||||
|
#define incom a.incom // Initian number of commanders
|
||||||
|
#define instar a.instar // Initial stars
|
||||||
|
#define intorps a.intorps // Initial/Max torpedoes
|
||||||
|
#define condit a.condit // Condition (red, yellow, green docked)
|
||||||
|
#define torps a.torps // number of torpedoes
|
||||||
|
#define ship a.ship // Ship type -- 'E' is Enterprise
|
||||||
|
#define quadx a.quadx // where we are
|
||||||
|
#define quady a.quady //
|
||||||
|
#define sectx a.sectx // where we are
|
||||||
|
#define secty a.secty //
|
||||||
|
#define length a.length // length of game
|
||||||
|
#define skill a.skill // skill level
|
||||||
|
#define basex a.basex // position of base in current quad
|
||||||
|
#define basey a.basey //
|
||||||
|
#define klhere a.klhere // klingons here
|
||||||
|
#define comhere a.comhere // commanders here
|
||||||
|
#define casual a.casual // causalties
|
||||||
|
#define nhelp a.nhelp // calls for help
|
||||||
|
#define nkinks a.nkinks //
|
||||||
|
#define ididit a.ididit // Action taken -- allows enemy to attack
|
||||||
|
#define gamewon a.gamewon // Finished!
|
||||||
|
#define alive a.alive // We are alive (not killed)
|
||||||
|
#define justin a.justin // just entered quadrant
|
||||||
|
#define alldone a.alldone // game is now finished
|
||||||
|
#define shldchg a.shldchg // shield is changing (affects efficiency)
|
||||||
|
#define thingx a.thingx // location of strange object in galaxy
|
||||||
|
#define thingy a.thingy //
|
||||||
|
#define plnetx a.plnetx // location of planet in quadrant
|
||||||
|
#define plnety a.plnety //
|
||||||
|
#define inorbit a.inorbit // orbiting
|
||||||
|
#define landed a.landed // party on planet (1), on ship (-1)
|
||||||
|
#define iplnet a.iplnet // planet # in quadrant
|
||||||
|
#define imine a.imine // mining
|
||||||
|
#define inplan a.inplan // initial planets
|
||||||
|
#define nenhere a.nenhere // Number of enemies in quadrant
|
||||||
|
#define ishere a.ishere // Super-commander in quandrant
|
||||||
|
#define neutz a.neutz // Romulan Neutral Zone
|
||||||
|
#define irhere a.irhere // Romulans in quadrant
|
||||||
|
#define icraft a.icraft // Kirk in Galileo
|
||||||
|
#define ientesc a.ientesc // Attempted escape from supercommander
|
||||||
|
#define iscraft a.iscraft // =1 if craft on ship, -1 if removed from game
|
||||||
|
#define isatb a.isatb // =1 if SuperCommander is attacking base
|
||||||
|
#define iscate a.iscate // Super Commander is here
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define idebug a.idebug // Debug mode
|
||||||
|
#endif
|
||||||
|
#ifdef CLOAKING
|
||||||
|
#define iscloaked a.iscloaked // Cloaking is enabled
|
||||||
|
#define iscloaking a.iscloaking // However if iscloaking is TRUE then in process of cloaking and can be attacked
|
||||||
|
#define ncviol a.ncviol // Treaty violations
|
||||||
|
#define isviolreported a.isviolreported // Violation reported by Romulan in quadrant
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
#define kcaptured d.kcaptured // number of captured Klingons
|
||||||
|
#define brigfree d.brigfree // room in the brig
|
||||||
|
#define brigcapacity a.brigcapacity // How many Klingons the brig will hold
|
||||||
|
#endif
|
||||||
|
#define iattak a.iattak // attack recursion elimination (was cracks[4])
|
||||||
|
#define icrystl a.icrystl // dilithium crystals aboard
|
||||||
|
#define tourn a.tourn // Tournament number
|
||||||
|
#define thawed a.thawed // Thawed game
|
||||||
|
#define batx a.batx // Base coordinates being attacked
|
||||||
|
#define baty a.baty //
|
||||||
|
#define ithere a.ithere // Tholean is here
|
||||||
|
#define ithx a.ithx // coordinates of tholean
|
||||||
|
#define ithy a.ithy
|
||||||
|
#define iseenit a.iseenit // Seen base attack report
|
||||||
|
#define inresor a.inresor // initial resources
|
||||||
|
#define intime a.intime // initial time
|
||||||
|
#define inenrg a.inenrg // Initial/Max Energy
|
||||||
|
#define inshld a.inshld // Initial/Max Shield
|
||||||
|
#define inlsr a.inlsr // initial life support resources
|
||||||
|
#define indate a.indate // Initial date
|
||||||
|
#define energy a.energy // Energy level
|
||||||
|
#define shield a.shield // Shield level
|
||||||
|
#define shldup a.shldup // Shields are up
|
||||||
|
#define warpfac a.warpfac // Warp speed
|
||||||
|
#define wfacsq a.wfacsq // squared warp factor
|
||||||
|
#define lsupres a.lsupres // life support reserves
|
||||||
|
#define dist a.dist // movement distance
|
||||||
|
#define direc a.direc // movement direction
|
||||||
|
#define Time a.Time // time taken by current operation
|
||||||
|
#define docfac a.docfac // repair factor when docking (constant?)
|
||||||
|
#define resting a.resting // rest time
|
||||||
|
#define damfac a.damfac // damage factor
|
||||||
|
#define stdamtim a.stdamtim // time that star chart was damaged
|
||||||
|
#define cryprob a.cryprob // probability that crystal will work
|
||||||
|
#define probex a.probex // location of probe
|
||||||
|
#define probey a.probey
|
||||||
|
#define probecx a.probecx // current probe quadrant
|
||||||
|
#define probecy a.probecy
|
||||||
|
#define probeinx a.probeinx // Probe x,y increment
|
||||||
|
#define probeiny a.probeiny
|
||||||
|
#define proben a.proben // number of moves for probe
|
||||||
|
#define isarmed a.isarmed // Probe is armed
|
||||||
|
#define nprobes a.nprobes // number of probes available
|
||||||
|
|
||||||
|
EXTERN int
|
||||||
|
kx[21], // enemy sector locations
|
||||||
|
ky[21],
|
||||||
|
starch[9][9]; // star chart
|
||||||
|
|
||||||
|
EXTERN int fromcommandline; // Game start from command line options
|
||||||
|
EXTERN int coordfixed; // Fix those dumb coordinates.
|
||||||
|
|
||||||
|
EXTERN char passwd[10], // Self Destruct password
|
||||||
|
*device[ndevice+1];
|
||||||
|
|
||||||
|
EXTERN PLANETS nulplanet; // zeroed planet structure
|
||||||
|
|
||||||
|
EXTERN double
|
||||||
|
kpower[21], // enemy energy levels
|
||||||
|
kdist[21], // enemy distances
|
||||||
|
kavgd[21], // average distances
|
||||||
|
damage[ndevice+1], // damage encountered
|
||||||
|
future[NEVENTS+1]; // future events
|
||||||
|
|
||||||
|
EXTERN int iscore, iskill; // Common PLAQ
|
||||||
|
EXTERN double perdate;
|
||||||
|
|
||||||
|
typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE,
|
||||||
|
FNEG3, FNOVA, FSNOVAED, FABANDN, FDILITHIUM,
|
||||||
|
FMATERIALIZE, FPHASER, FLOST, FMINING, FDPLANET,
|
||||||
|
FPNOVA, FSSC, FSTRACTOR, FDRAY, FTRIBBLE,
|
||||||
|
FHOLE
|
||||||
|
#ifdef CLOAKING
|
||||||
|
, FCLOAK
|
||||||
|
#endif
|
||||||
|
} FINTYPE ;
|
||||||
|
|
||||||
|
/* Skill levels */
|
||||||
|
typedef enum {SNOVICE=1, SFAIR, SGOOD, SEXPERT, SEMERITUS} SKILLTYPE;
|
||||||
|
|
||||||
|
EXTERN double aaitem;
|
||||||
|
EXTERN char citem[24];
|
||||||
|
|
||||||
|
|
||||||
|
/* Define devices */
|
||||||
|
#define DSRSENS 1
|
||||||
|
#define DLRSENS 2
|
||||||
|
#define DPHASER 3
|
||||||
|
#define DPHOTON 4
|
||||||
|
#define DLIFSUP 5
|
||||||
|
#define DWARPEN 6
|
||||||
|
#define DIMPULS 7
|
||||||
|
#define DSHIELD 8
|
||||||
|
#define DRADIO 9
|
||||||
|
#define DSHUTTL 10
|
||||||
|
#define DCOMPTR 11
|
||||||
|
#define DTRANSP 12
|
||||||
|
#define DSHCTRL 13
|
||||||
|
#define DDRAY 14 // Added deathray
|
||||||
|
#define DDSP 15 // Added deep space probe
|
||||||
|
#define DCLOAK 16 // Added cloaking device
|
||||||
|
|
||||||
|
/* Define future events */
|
||||||
|
#define FSPY 0 // Spy event happens always (no future[] entry)
|
||||||
|
// can cause SC to tractor beam Enterprise
|
||||||
|
#define FSNOVA 1 // Supernova
|
||||||
|
#define FTBEAM 2 // Commander tractor beams Enterprise
|
||||||
|
#define FSNAP 3 // Snapshot for time warp
|
||||||
|
#define FBATTAK 4 // Commander attacks base
|
||||||
|
#define FCDBAS 5 // Commander destroys base
|
||||||
|
#define FSCMOVE 6 // Supercommander moves (might attack base)
|
||||||
|
#define FSCDBAS 7 // Supercommander destroys base
|
||||||
|
#define FDSPROB 8 // Move deep space probe
|
||||||
|
|
||||||
|
#ifdef INCLUDED
|
||||||
|
PLANETS nulplanet = {0};
|
||||||
|
char *device[ndevice+1] = {
|
||||||
|
"",
|
||||||
|
"S. R. Sensors",
|
||||||
|
"L. R. Sensors",
|
||||||
|
"Phasers",
|
||||||
|
"Photon Tubes",
|
||||||
|
"Life Support",
|
||||||
|
"Warp Engines",
|
||||||
|
"Impulse Engines",
|
||||||
|
"Shields",
|
||||||
|
"Subspace Radio",
|
||||||
|
"Shuttle Craft",
|
||||||
|
"Computer",
|
||||||
|
"Transporter",
|
||||||
|
"Shield Control",
|
||||||
|
"Death Ray",
|
||||||
|
"D. S. Probe"
|
||||||
|
#ifdef CLOAKING
|
||||||
|
,"Cloaking Device"
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ALGERON (2311) /* Date of the Treaty of Algeron */
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE (1)
|
||||||
|
#endif
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IHR 'R'
|
||||||
|
#define IHK 'K'
|
||||||
|
#define IHC 'C'
|
||||||
|
#define IHS 'S'
|
||||||
|
#define IHSTAR '*'
|
||||||
|
#define IHP 'P'
|
||||||
|
#define IHB 'B'
|
||||||
|
#define IHBLANK ' '
|
||||||
|
#define IHDOT '.'
|
||||||
|
#define IHQUEST '?'
|
||||||
|
#define IHE 'E'
|
||||||
|
#define IHF 'F'
|
||||||
|
#define IHT 'T'
|
||||||
|
#define IHWEB '#'
|
||||||
|
#define IHGREEN 'G'
|
||||||
|
#define IHYELLOW 'Y'
|
||||||
|
#define IHRED 'R'
|
||||||
|
#define IHDOCKED 'D'
|
||||||
|
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
void prelim(void);
|
||||||
|
void attack(int);
|
||||||
|
int choose(void);
|
||||||
|
void setup(void);
|
||||||
|
void score(int);
|
||||||
|
void atover(int);
|
||||||
|
void srscan(int);
|
||||||
|
void lrscan(void);
|
||||||
|
void phasers(void);
|
||||||
|
void photon(void);
|
||||||
|
void warp(int);
|
||||||
|
void sheild(int);
|
||||||
|
void dock(void);
|
||||||
|
void dreprt(void);
|
||||||
|
void chart(int);
|
||||||
|
void impuls(void);
|
||||||
|
void waiting(void);
|
||||||
|
void setwrp(void);
|
||||||
|
void events(void);
|
||||||
|
void report(int);
|
||||||
|
void eta(void);
|
||||||
|
void help(void);
|
||||||
|
void abandn(void);
|
||||||
|
void finish(FINTYPE);
|
||||||
|
void dstrct(void);
|
||||||
|
void kaboom(void);
|
||||||
|
void freeze(int);
|
||||||
|
void thaw(void);
|
||||||
|
void plaque(void);
|
||||||
|
int scan(void);
|
||||||
|
#define IHEOL (0)
|
||||||
|
#define IHALPHA (1)
|
||||||
|
#define IHREAL (2)
|
||||||
|
void chew(void);
|
||||||
|
void chew2(void);
|
||||||
|
void skip(int);
|
||||||
|
void prout(char *s);
|
||||||
|
void proutn(char *s);
|
||||||
|
void stars(void);
|
||||||
|
void newqad(int);
|
||||||
|
int ja(void);
|
||||||
|
void cramen(int);
|
||||||
|
void crmshp(void);
|
||||||
|
void cramlc(int, int, int);
|
||||||
|
double expran(double);
|
||||||
|
double Rand(void);
|
||||||
|
void iran8(int *, int *);
|
||||||
|
void iran10(int *, int *);
|
||||||
|
double square(double);
|
||||||
|
void dropin(int, int*, int*);
|
||||||
|
void newcnd(void);
|
||||||
|
void sortkl(void);
|
||||||
|
void lmove(void);
|
||||||
|
void ram(int, int, int, int);
|
||||||
|
void crmena(int, int, int, int, int);
|
||||||
|
void deadkl(int, int, int, int, int);
|
||||||
|
void timwrp(void);
|
||||||
|
void movcom(void);
|
||||||
|
void torpedo(double, double, int, int, double *);
|
||||||
|
void cramf(double, int, int);
|
||||||
|
void crami(int, int);
|
||||||
|
void huh(void);
|
||||||
|
void pause(int);
|
||||||
|
void nova(int, int);
|
||||||
|
void snova(int, int);
|
||||||
|
void scom(int *);
|
||||||
|
void hittem(double *);
|
||||||
|
void prouts(char *);
|
||||||
|
int isit(char *);
|
||||||
|
void preport(void);
|
||||||
|
void orbit(void);
|
||||||
|
void sensor(void);
|
||||||
|
void beam(void);
|
||||||
|
void mine(void);
|
||||||
|
void usecrystals(void);
|
||||||
|
void shuttle(void);
|
||||||
|
void deathray(void);
|
||||||
|
void debugme(void);
|
||||||
|
void attakreport(void);
|
||||||
|
void movetho(void);
|
||||||
|
void probe(void);
|
||||||
|
|
||||||
|
///#ifndef WINDOWS
|
||||||
|
int min(int, int);
|
||||||
|
int max(int, int);
|
||||||
|
///#endif
|
||||||
|
void randomize(void);
|
||||||
|
///int getch(void);
|
||||||
|
|
||||||
|
#ifdef CLOAKING
|
||||||
|
void cloak(void);
|
||||||
|
#endif
|
||||||
|
#ifdef CAPTURE
|
||||||
|
void capture(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CLOAKING
|
||||||
|
#define REPORTS ((condit==IHDOCKED || damage[DRADIO]<=0.0) && !iscloaked)
|
||||||
|
#else
|
||||||
|
#define REPORTS (condit==IHDOCKED || damage[DRADIO]<=0.0)
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user