void ram(int ix, int iy) { int i; char c; printf("\07RED ALERT\07: collision imminent\n"); c = Sect[ix][iy]; switch (c) { case KLINGON: printf("%s rams Klingon at %d,%d\n", Ship.shipname, ix, iy); killk(ix, iy); break; case STAR: case INHABIT: printf("Yeoman Rand: Captain, isn't it getting hot in here?\n"); sleep(2); printf("Spock: Hull temperature approaching 550 Degrees Kelvin.\n"); lose(L_STAR); case BASE: printf("You ran into the starbase at %d,%d\n", ix, iy); killb(Ship.quadx, Ship.quady); /* don't penalize the captain if it wasn't his fault */ if (!damaged(SINS)) Game.killb += 1; break; } sleep(2); printf("%s heavily damaged\n", Ship.shipname); /* select the number of deaths to occur */ i = 10 + ranf(20 * Game.skill); Game.deaths += i; Ship.crew -= i; printf("McCoy: Take it easy Jim; we had %d casualties.\n", i); /* damage devices with an 80% probability */ for (i = 0; i < NDEV; i++) { if (ranf(100) < 20) continue; damage(i, (2.5 * (franf() + franf()) + 1.0) * Param.damfac[i]); } /* no chance that your shields remained up in all that */ Ship.shldup = 0; }
/*ARGSUSED*/ void torped(int v __unused) { int ix, iy; double x, y, dx, dy; double angle; int course, course2; int k; double bigger; double sectsize; int burst; int n; if (Ship.cloaked) { printf("Federation regulations do not permit attack while " "cloaked.\n"); return; } if (check_out(TORPED)) return; if (Ship.torped <= 0) { printf("All photon torpedos expended\n"); return; } /* get the course */ course = getintpar("Torpedo course"); if (course < 0 || course > 360) return; burst = -1; /* need at least three torpedoes for a burst */ if (Ship.torped < 3) { printf("No-burst mode selected\n"); burst = 0; } else { /* see if the user wants one */ if (!testnl()) { k = ungetc(getchar(), stdin); if (k >= '0' && k <= '9') burst = 1; } } if (burst < 0) { burst = getynpar("Do you want a burst"); } if (burst) { burst = getintpar("burst angle"); if (burst <= 0) return; if (burst > 15) { printf("Maximum burst angle is 15 degrees\n"); return; } } sectsize = NSECTS; n = -1; if (burst) { n = 1; course -= burst; } for (; n && n <= 3; n++) { /* select a nice random course */ course2 = course + randcourse(n); /* convert to radians */ angle = course2 * 0.0174532925; dx = -cos(angle); dy = sin(angle); bigger = fabs(dx); x = fabs(dy); if (x > bigger) bigger = x; dx /= bigger; dy /= bigger; x = Ship.sectx + 0.5; y = Ship.secty + 0.5; if (Ship.cond != DOCKED) Ship.torped -= 1; printf("Torpedo track"); if (n > 0) printf(", torpedo number %d", n); printf(":\n%6.1f\t%4.1f\n", x, y); while (1) { ix = x += dx; iy = y += dy; if (x < 0.0 || x >= sectsize || y < 0.0 || y >= sectsize) { printf("Torpedo missed\n"); break; } printf("%6.1f\t%4.1f\n", x, y); switch (Sect[ix][iy]) { case EMPTY: continue; case HOLE: printf("Torpedo disappears into a black " "hole\n"); break; case KLINGON: for (k = 0; k < Etc.nkling; k++) { if (Etc.klingon[k].x != ix || Etc.klingon[k].y != iy) continue; Etc.klingon[k].power -= 500 + ranf(501); if (Etc.klingon[k].power > 0) { printf("*** Hit on Klingon at " "%d,%d: extensive " "damages\n", ix, iy); break; } killk(ix, iy); break; } break; case STAR: nova(ix, iy); break; case INHABIT: kills(ix, iy, -1); break; case BASE: killb(Ship.quadx, Ship.quady); Game.killb += 1; break; default: printf("Unknown object %c at %d,%d destroyed\n", Sect[ix][iy], ix, iy); Sect[ix][iy] = EMPTY; break; } break; } if (damaged(TORPED) || Quad[Ship.quadx][Ship.quady].stars < 0) break; course += burst; } Move.free = 0; }
void snova(int x, int y) { int qx, qy; int ix, iy = 0; int f, n; int dx, dy; struct quad *q; f = 0; ix = x; if (ix < 0) { /* choose a quadrant */ while (1) { qx = ranf(NQUADS); qy = ranf(NQUADS); q = &Quad[qx][qy]; if (q->stars > 0) break; } if (Ship.quadx == qx && Ship.quady == qy) { /* select a particular star */ n = ranf(q->stars); for (ix = 0; ix < NSECTS; ix++) { for (iy = 0; iy < NSECTS; iy++) if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT) if ((n -= 1) <= 0) break; if (n <= 0) break; } f = 1; } } else { /* current quadrant */ iy = y; qx = Ship.quadx; qy = Ship.quady; q = &Quad[qx][qy]; f = 1; } if (f) { /* supernova is in same quadrant as Enterprise */ printf("\a\nRED ALERT: supernova occuring at %d,%d\n", ix, iy); dx = ix - Ship.sectx; dy = iy - Ship.secty; if (dx * dx + dy * dy <= 2) { printf("*** Emergency override attem"); sleep(1); printf("\n"); lose(L_SNOVA); } q->scanned = 1000; } else { if (!damaged(SSRADIO)) { q->scanned = 1000; printf("\nUhura: Captain, Starfleet Command reports a supernova\n"); printf(" in quadrant %d,%d. Caution is advised\n", qx, qy); } } /* clear out the supernova'ed quadrant */ dx = q->klings; dy = q->stars; Now.klings -= dx; if (x >= 0) { /* Enterprise caused supernova */ Game.kills += dy; if (q->bases) killb(qx, qy); Game.killk += dx; } else if (q->bases) killb(qx, qy); killd(qx, qy, (x >= 0)); q->stars = -1; q->klings = 0; if (Now.klings <= 0) { printf("Lucky devil, that supernova destroyed the last klingon\n"); win(); } }
void eloop(){ if(Btop>B||Etop>E)marke(); for(bxy*b=B;b<Btop;b++){ if(0)killb:if(killb(b))break; float bx=b->x,by=b->y; b->x+=b->xd; b->y+=b->yd; if(b->y<0||b->x<0||b->x>128||b->y>256)goto killb; if(T==MT){ glLine(bx,by,b->x,b->y); glRect(b->x-1,b->y-1,b->x+1,b->y+1); } for(int i=0;i<2;i++) if(btop(i,b)<256){ if(Php[i]!=b->p){ Ph[i]--; Php[i]=b->p; } goto killb; } } for(obje*e=E;e<Etop;e++){ if(0)kille:if(kille(e))break; float x=e->x,y=e->y,r; int et=!!(e->t&128); switch(e->t&127){ case(CAN) e->x=x+=e->xd; e->y=y+=e->yd; et=nerdest(e); erotxy(e,Px[et],Py[et],M_PI/16); if(!(T-e->c&3)) mkbd(e->c,x+cos(e->d)*r*2,y+sin(e->d)*r*2,6,e->d); if(x<-5||x>133||y<-5||y>261||e->h<1)goto kille; else(e->h<4||rdmg(x,y,e->h*3/2)){ deceh(e); } if(T==MT){ float r=min(T-e->c,e->h); glColor(wht); glLine(x,y,x+cos(e->d)*r*2,y+sin(e->d)*r*2); glColor(red+et); glCirc(x,y,r); } case(TAR) r=min(T-e->c,abs(e->h)); et=e->h<6?4:rdmg(x,y,r); if(et) seteh(e,e->h-et); setexdyd(e,rrotxy(e->xd,x,y,Px[0],Py[0],M_PI/72),rrotxy(e->yd,x,y,Px[1],Py[1],M_PI/72)); if(e->h<-120)goto kille; if(T==MT){ glColor(wht); glCirc(x,y,r); rndcol(); glCirc(x,y,min(r,24)); glColor(wht); glCirc(x,y,min(r,16)); rndcol(); glCirc(x,y,min(r,8)); } for(int i=0;i<2;i++) xLz(min(T-e->c,127+e->h),x,y,i?e->yd:e->xd); case(ROT) e->x=x+=e->xd; e->y=y+=e->yd; e->d+=M_PI/(et?128:-128); for(int i=0;i<3;i++) mkbd(e->c,x+cos(e->d+i*M_PI*2/3)*32,y+sin(e->d+i*M_PI*2/3)*32,8,e->d+i*M_PI*2/3); if(x<-5||x>133||y<-5||y>261||e->h<1)goto kille; else(e->h<8||rdmg(x,y,e->h)){ deceh(e); } if(T==MT){ rndcol(); glCirc(x,y,e->h); glColor(wht); for(int i=0;i<3;i++) glLine(x+cos(e->d+i*M_PI*2/3)*(32-e->h*3),y+sin(e->d+i*M_PI*2/3)*(32-e->h*3),x+cos(e->d+i*M_PI*2/3)*32,y+sin(e->d+i*M_PI*2/3)*32); } case(DOG) et=nearest(e); if(dst2(x,y,Px[et],Py[et])<64){ setPx(et,e->x); setPy(et,e->y); }else{ erotxy(e,Px[et],Py[et],M_PI/32); setexy(e,x+=cos(e->d)*e->xd,y+=sin(e->d)*e->xd); et=2; } if(rdmg2(x,y,16)&(et==2?0xFFFF:et==1?0x00FF:0xFF00)){ deceh(e); if(!e->h)goto kille; } if(T==MT){ glColor(et==2?wht:red+et); glCirc(x,y,min(e->h,T-e->c)); } case(POO) et=nearest(e); erotxy(e,Px[et],Py[et],M_PI/48); setexy(e,x+=cos(e->d)*e->xd,y+=sin(e->d)*e->xd); if(!(T-e->c&7)) mkbd(e->c,x,y,0,0); if(T==MT){ rndcol(); glCirc(x,y,min(T-e->c,e->h)/2); } if(dst2(x,y,Px[et],Py[et])<sqr(e->h)||e->h<16){ deceh(e); if(!e->h)goto kille; } case(B1) if(y<64){ add2ey(e); y+=2; } mkbxy(e->c,x,y,Px[0],Py[0],4); mkbxy(e->c+1,x,y,Px[1],Py[1],4); mkbxy(e->c+2,x,y,Px[!(e->h&8)],Py[!(e->h&8)],1); et=rdmg2(x,y,e->h); if((e->h&7)!=7&&getb(et,e->h&8)) seteh(e,e->h+1); else(getb(et,!(e->h&8))||e->h<7){ deceh(e); if(!e->h)goto kille; }