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 SPACE BAR TO CONTINUE]"); getch(); } else { if (skill > SFAIR) proutn("[CONTINUE?]"); else proutn("[HIT SPACE BAR TO CONTINUE]"); getch(); proutn("\r \r"); } if (i != 0) { clearscreen(); } linecount = 0; }
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 (damage[DRADIO] == 0.0 || condit == IHDOCKED) { 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 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; /* Repair Deathray if long rest at starbase */ if (origTime-delay >= 9.99 && condit == IHDOCKED) damage[DDRAY] = 0.0; } while (d.galaxy[quadx][quady] != 1000); // leave if quadrant supernovas resting = 0; Time = 0; }
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"); if (x) prout(" HELP"); }
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); 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]); starch[x][y] = damage[DRADIO] > 0 ? d.galaxy[x][y]+1000 :1; } } putchar('\n'); } }
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; }
void timer(int no)//main.cpp中signal函数对SIGALRM计时器信号的回调函数,no是接收信号标号 { alarm(0);//关闭计时器,防止执行下面功能时计时器再次启动(不合理的shezhi.jiange?) setmap();//调用map.cpp中的setmap()函数将缓存map中的数据存入sqlite数据库,清空缓存流量 string s; prout(false,s,false,s,false,s,false,s,false); alarm(shezhi.jiange);//重新开启计时器 }
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("."); } }
/* toto */ int main() { char*a="#include <stdio.h>%cvoid prout(){}%c/*%c%ctoto%c*/%cint main()%c{%c%cchar*a=%c%s%c;%c%cprintf(a,10,10,10,9,10,10,10,10,9,34,a,34,10,9,10,9,10,9,10,9,9,10,9,10,10);%c%cprout();%c%c/*%c%c%cpouet%c%c*/%c}%c"; printf(a,10,10,10,9,10,10,10,10,9,34,a,34,10,9,10,9,10,9,10,9,9,10,9,10,10); prout(); /* pouet */ }
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 */ 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(" -"); for (i = 1; i <= 8; i++) { printf("%d -", i); for (j = 1; j <= 8; j++) { if (starch[i][j] < 0) printf(" .1."); else if (starch[i][j] == 0) printf(" ..."); else if (starch[i][j] > 999) printf("%5d", starch[i][j]-1000); else printf("%5d", d.galaxy[i][j]); } prout(" -"); } if (nn == 0) { skip(1); crmshp(); proutn(" is currently in"); cramlc(1, quadx, quady); skip(1); } }
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 pause(int i) { putchar('\n'); if (i==1) { if (skill > 2) prout("[ANOUNCEMENT ARRIVING...]"); else prout("[IMPORTANT ANNOUNCEMENT ARRIVING -- HIT SPACE BAR TO CONTINUE]"); getch(); } else { if (skill > 2) proutn("[CONTINUE?]"); else proutn("[HIT SPACE BAR TO CONTINUE]"); getch(); proutn("\r \r"); } if (i != 0) { clearscreen(); } linecount = 0; }
int main(int argc, char **argv) { int i; int hitme; char ch; 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 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 > 3) 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(); }
void snova(int insx, int insy) { int comdead, nqx, nqy, nsx, nsy, num, kldead, iscdead; int nrmdead, npdead; int insipient=0; nsx = insy; 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 (damage[DRADIO] == 0.0 || condit == IHDOCKED) { 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; 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; future[FSCMOVE] = future[FSCDBAS] = 1e30; } d.remkl -= kldead; 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) || damage[DRADIO] == 0 || condit == IHDOCKED) 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; }
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 (damage[DRADIO] > 0 && condit != IHDOCKED) 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 || (damage[DRADIO] > 0.0 && condit != IHDOCKED) || 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 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 && damage[DRADIO] != 0.0) { /* 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; 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]); /* If radio repaired, update star chart and attack reports */ if (stdamtim != 1e30 && damage[DRADIO] == 0.0) { 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 || 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 || 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 (damage[DRADIO] != 0.0 && condit != IHDOCKED) 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 && (damage[DRADIO] <= 0.0 || condit == IHDOCKED)) { /* 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 (damage[DRADIO]==0.0 || condit == IHDOCKED) { 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 (damage[DRADIO]==0.0 || condit == IHDOCKED) { 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 (damage[DRADIO] == 0.0 || condit == IHDOCKED) 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; } } }
/* * ~p command. */ static void print_collf(FILE *collf, struct header *hp) { char *lbuf = NULL; FILE *obuf = stdout; struct attachment *ap; char *cp; enum gfield gf; size_t linecnt, maxlines, linesize = 0, linelen, count, count2; (void)&obuf; (void)&cp; fflush(collf); rewind(collf); count = count2 = fsize(collf); if (is_a_tty[0] && is_a_tty[1] && (cp = value("crt")) != NULL) { for (linecnt = 0; fgetline(&lbuf, &linesize, &count2, NULL, collf, 0); linecnt++); rewind(collf); maxlines = (*cp == '\0' ? screensize() : atoi(cp)); maxlines -= 4; if (hp->h_to) maxlines--; if (hp->h_subject) maxlines--; if (hp->h_cc) maxlines--; if (hp->h_bcc) maxlines--; if (hp->h_attach) maxlines--; maxlines -= myaddrs(hp) != NULL || hp->h_from != NULL; maxlines -= value("ORGANIZATION") != NULL || hp->h_organization != NULL; maxlines -= value("replyto") != NULL || hp->h_replyto != NULL; maxlines -= value("sender") != NULL || hp->h_sender != NULL; if (linecnt > maxlines) { cp = get_pager(); if (sigsetjmp(pipejmp, 1)) goto endpipe; obuf = Popen(cp, "w", NULL, 1); if (obuf == NULL) { perror(cp); obuf = stdout; } else safe_signal(SIGPIPE, onpipe); } } fprintf(obuf, catgets(catd, CATSET, 62, "-------\nMessage contains:\n")); gf = GIDENT|GTO|GSUBJECT|GCC|GBCC|GNL|GFILES; if (value("fullnames")) gf |= GCOMMA; puthead(hp, obuf, gf, SEND_TODISP, CONV_NONE, NULL, NULL); while (fgetline(&lbuf, &linesize, &count, &linelen, collf, 1)) prout(lbuf, linelen, obuf); if (hp->h_attach != NULL) { fputs(catgets(catd, CATSET, 63, "Attachments:"), obuf); for (ap = hp->h_attach; ap != NULL; ap = ap->a_flink) { if (ap->a_msgno) fprintf(obuf, " message %u", ap->a_msgno); else fprintf(obuf, " %s", ap->a_name); if (ap->a_flink) putc(',', obuf); } putc('\n', obuf); } endpipe: if (obuf != stdout) { safe_signal(SIGPIPE, SIG_IGN); Pclose(obuf); safe_signal(SIGPIPE, dflpipe); } if (lbuf) free(lbuf); }
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 */ }
void huh(void) { chew(); skip(1); prout("Beg your pardon, Captain?"); }
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; } } } }
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> "); // Use of scan() here (after chew) will get a new line of input // and will return IHEOL iff new line of input contains nothing // or a numeric input is detected but conversion fails. if (scan() == IHEOL) continue; for (i=0; i < 26; i++) if (isit(commands[i])) break; if (i < 26) break; for (; i < NUMCOMMANDS; i++) if (strcmp(commands[i], citem) == 0) break; if (i < NUMCOMMANDS) break; // we get here iff the first parsed input from the line does not // match one of the commands. In this case, the rest of the line // is discarded, the below message is printed, and we go back to // get a new command. if (skill <= 2) { prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:"); listCommands(TRUE); } else prout("UNRECOGNIZED COMMAND."); } // end get command loop // we get here iff the first parsed input from the line matches one // of the commands (i.e., command i). We use i to dispatch the // handling of the command. The line may still contain additional // inputs (i.e., parameters of the command) that is to be parsed by // the dispatched command handler. If the line does not contain // all the necessary parameters, the dispatched command handler is // responsible to get additional input(s) interactively using scan(). // The dispatched command handler is also responsible to handle any // input errors. switch (i) { /* command switch */ case 0: // srscan srscan(1); break; case 1: // lrscan lrscan(); break; case 2: // phasers phasers(); if (ididit) hitme = TRUE; break; case 3: // photons photon(); if (ididit) 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 exit(1); // And quick exit break; case 25: probe(); // Launch probe break; case 26: // Abandon Ship abandn(); break; case 27: // Self Destruct dstrct(); break; case 28: // Save Game freeze(FALSE); if (skill > 3) prout("WARNING--Frozen games produce no plaques!"); break; case 29: // Try a desparation measure deathray(); if (ididit) hitme = TRUE; break; case 30: // What do we want for debug??? #ifdef DEBUG debugme(); #endif break; case 31: // Call for help help(); break; case 32: alldone = 1; // quit the game #ifdef DEBUG if (idebug) score(); #endif break; case 33: helpme(); // get help break; } // end command switch 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; } // end event loop if (alldone) break; } // end command loop }
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) { prout("Insufficient energy, sir."); 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; } } }
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 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; } }
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); }
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) { 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); 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 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 1: s3="novice"; break; case 2: s3="fair"; break; case 3: s3="good"; break; case 4: s3="expert"; break; case 5: 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>3 && 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 Klingons have been killed", 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 > 2) 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 (damage[DRADIO] == 0.0 || condit == IHDOCKED || 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"); 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 ((damage[DRADIO] == 0.0 || condit == IHDOCKED)&& 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 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; }