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; } } }
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 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 }