|
|
researchv10 Norman
# include "trek.h"
/**
** photon torpedo control
**
**/
torped()
{
register int ix, iy;
double x, y, dx, dy;
double angle;
int course, course2, delta;
int burst, spread;
int n;
if (Status.cloaked)
{
printf("Federation regulations do not permit attack while cloaked.\n");
return;
}
if (Damage[TORPED])
{
printf("Photon tubes inoperable.\n");
return;
}
if (Status.torped <= 0)
{
printf("All photon torpedos expended.\n");
return;
}
if(getintpar("Torpedo course", &course)==0) return;
fixco(&course);
if(lineended() && Status.torped<3) {
burst=0;
printf("No burst mode selected.\n");
} else {
if(!digit(peekchar())) {
if((burst=getynpar("Do you want a burst"))<0) return;
} else
burst=1;
if (burst) {
if(getintpar("Burst angle", &spread)==0) return;
if (spread < 0 || spread > 15) {
printf("Angle out of range.\n");
return;
}
if(Status.torped<3) {
printf("Not enough left for a burst.\n");
burst=spread=0;
}
else {
burst = 2;
course =- spread;
}
}
}
for (n=0; n<=burst; n++) {
delta = randcourse();
course2 = course + delta;
angle = course2 * 0.0174532925; /* convert to radians */
dx = -cos(angle);
dy = sin(angle);
x = fabs(dx); y = fabs(dy);
x = (x>y ? x : y);
dx =/ x; dy =/ x;
x = Sectx;
y = Secty;
if (Status.cond != DOCKED)
Status.torped =- 1;
if(burst)
printf("Torpedo %d: ", n);
printf("[%d] ", course2);
printf("track");
while (1)
{
ix = (x =+ dx)+0.5;
iy = (y =+ dy)+0.5;
if (x <= -0.5 || ix >= NSECTS || y <= -0.5 || iy >= NSECTS) {
printf(" MISSED\n");
break;
}
printf(" %d,%d", ix, iy);
switch (Sect[ix][iy])
{
case EMPTY:
continue;
case KLINGON:
printf("\n");
hitkling(ix, iy, 500);
break;
case STAR:
printf("\n");
nova(ix, iy);
break;
case INHABIT:
printf("\n");
kills(ix, iy, -1);
break;
case BASE:
printf("\n");
killb(Quadx, Quady); Game.killb++;
break;
case BLACKHOLE:
printf(" ...\n");
break;
}
break;
}
if (Damage[TORPED]) {
printf("Damages sustained");
if (burst)
printf("; remainder of burst aborted");
printf("\n");
break;
}
course =+ spread;
}
Move.free = 0;
}
randcourse()
{
double r;
register int d;
d = ((franf() + franf()) - 1.0) * 20;
if (abs(d) > 12)
{
printf("Photon tubes misfire.\n");
if (!ranf(3))
{
damage(TORPED, 0.2 * abs(d));
}
d =* 1.0 + 2.0 * franf();
}
if (Status.shldup || Status.cond == DOCKED)
{
r = Status.shield;
r = 1.0 + r / Initial.shield;
if (Status.cond == DOCKED)
r = 2.0;
d =* r;
}
return (d);
}
hitkling(ix, iy, hit)
int ix, iy, hit;
{
register int k;
for (k = 0; k < Nkling; k++)
{
if (Kling[k].x != ix || Kling[k].y != iy)
continue;
Kling[k].power =- hit + ranf(hit+1);
if (Kling[k].power > 0)
{
printf("*** Klingon hit at %d,%d: extensive damages.\n",
ix, iy);
} else
killk(ix, iy);
break;
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.