3a4ccc4ac4
git-svn-id: svn://kolibrios.org@7185 a494cfbc-eb01-0410-851d-a64ba20cac60
515 lines
18 KiB
C
515 lines
18 KiB
C
#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);
|
|
}
|