Subversion Repositories Kolibri OS

Rev

Rev 7142 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7142 siemargl 1
#include "sst.h"
2
#include 
3
#ifndef KOS32
4
#include 
5
#else
6
#include 
7
#endif
8
 
9
void dstrct() {
10
	/* Finish with a BANG! */
11
	chew();
12
	if (damage[DCOMPTR] != 0.0) {
13
		prout("Computer damaged; cannot execute destruct sequence.");
14
		return;
15
	}
16
	skip(1);
17
	prouts("---WORKING---"); skip(1);
18
	prout("SELF-DESTRUCT-SEQUENCE-ACTIVATED");
19
	prouts("   10"); skip(1);
20
	prouts("       9"); skip(1);
21
	prouts("          8"); skip(1);
22
	prouts("             7"); skip(1);
23
	prouts("                6"); skip(1);
24
	prout("ENTER-CORRECT-PASSWORD-TO-CONTINUE-");
25
	prout("SELF-DESTRUCT-SEQUENCE-OTHERWISE-");
26
	prout("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED");
27
	scan();
28
	chew();
29
	if (strcmp(passwd, citem) != 0) {
30
		prouts("PASSWORD-REJECTED;"); skip(1);
31
		prout("CONTINUITY-EFFECTED");
32
		skip(1);
33
		return;
34
	}
35
	prouts("PASSWORD-ACCEPTED"); skip(1);
36
	prouts("                   5"); skip(1);
37
	prouts("                      4"); skip(1);
38
	prouts("                         3"); skip(1);
39
	prouts("                            2"); skip(1);
40
	prouts("                              1"); skip(1);
41
	if (Rand() < 0.15) {
42
		prouts("GOODBYE-CRUEL-WORLD");
43
		skip(1);
44
	}
45
	skip(2);
46
	kaboom();
47
}
48
 
49
void kaboom(void) {
50
	stars();
51
	if (ship==IHE) prouts("***");
52
	prouts("********* Entropy of ");
53
	crmshp();
54
	prouts(" maximized *********");
55
	skip(1);
56
	stars();
57
	skip(1);
58
	if (nenhere != 0) {
59
		double whammo = 25.0 * energy;
60
		int l=1;
61
		while (l <= nenhere) {
62
			if (kpower[l]*kdist[l] <= whammo)
63
				deadkl(kx[l],ky[l], quad[kx[l]][ky[l]], kx[l], ky[l]);
64
			l++;
65
		}
66
	}
67
	finish(FDILITHIUM);
68
}
69
 
70
 
71
void finish(FINTYPE ifin) {
72
	int igotit = 0;
73
	alldone = 1;
74
	skip(3);
75
	printf("It is stardate %.1f .\n\n", d.date);
76
	switch (ifin) {
77
		case FWON: // Game has been won
78
			if (d.nromrem != 0)
79
				printf("The remaining %d Romulans surrender to Starfleet Command.\n",
80
					   d.nromrem);
81
 
82
 
83
            prout("You have smashed the Klingon invasion fleet and saved");
84
            prout("the Federation.");
85
 
86
#ifdef CAPTURE
87
            if (alive && brigcapacity-brigfree > 0) { // captured Klingon crew will get transfered to starbase
88
                kcaptured += brigcapacity-brigfree;
89
                printf("The %d captured Klingons are transferred to Star Fleet Command.\n",
90
                       brigcapacity-brigfree);
91
            }
92
#endif
93
			gamewon=1;
94
			if (alive) {
95
                double badpt;
96
 
97
				badpt = 5.*d.starkl + casual + 10.*d.nplankl +
98
						45.*nhelp+100.*d.basekl;
99
				if (ship == IHF) badpt += 100.0;
100
				else if (ship == 0) badpt += 200.0;
101
				if (badpt < 100.0) badpt = 0.0;	// Close enough!
102
				if (d.date-indate < 5.0 ||
103
					// killsPerDate >= RateMax
104
					(d.killk+d.killc+d.nsckill)/(d.date-indate) >=
105
					0.1*skill*(skill+1.0) + 0.1 + 0.008*badpt) {
106
					skip(1);
107
					prout("In fact, you have done so well that Starfleet Command");
108
					switch (skill) {
109
						case SNOVICE:
110
							prout("promotes you one step in rank from \"Novice\" to \"Fair\".");
111
							break;
112
						case SFAIR:
113
							prout("promotes you one step in rank from \"Fair\" to \"Good\".");
114
							break;
115
						case SGOOD:
116
							prout("promotes you one step in rank from \"Good\" to \"Expert\".");
117
							break;
118
						case SEXPERT:
119
							prout("promotes you to Commodore Emeritus.");
120
							skip(1);
121
							prout("Now that you think you're really good, try playing");
122
							prout("the \"Emeritus\" game. It will splatter your ego.");
123
							break;
124
						case SEMERITUS:
125
							skip(1);
126
							prout("Computer-  ERROR-ERROR-ERROR-ERROR");
127
							skip(1);
128
							prout("  YOUR-SKILL-HAS-EXCEEDED-THE-CAPACITY-OF-THIS-PROGRAM");
129
							prout("  THIS-PROGRAM-MUST-SURVIVE");
130
							prout("  THIS-PROGRAM-MUST-SURVIVE");
131
							prout("  THIS-PROGRAM-MUST-SURVIVE");
132
							prout("  THIS-PROGRAM-MUST?- MUST ? - SUR? ? -?  VI");
133
							skip(1);
134
							prout("Now you can retire and write your own Star Trek game!");
135
							skip(1);
136
							break;
137
					}
138
					if (skill > SGOOD) {
139
						if (thawed
140
#ifdef DEBUG
141
							&& !idebug
142
#endif
143
							)
144
							prout("You cannot get a citation, so...");
145
						else {
146
							prout("Do you want your Commodore Emeritus Citation printed?");
147
							proutn("(You need a 132 column printer.)");
148
							chew();
149
							if (ja()) {
150
								igotit = 1;
151
							}
152
						}
153
					}
154
				}
155
				// Only grant long life if alive (original didn't!)
156
				skip(1);
157
				prout("LIVE LONG AND PROSPER.");
158
			}
159
			score(0);
160
			if (igotit != 0) plaque();
161
			return;
162
		case FDEPLETE: // Federation Resources Depleted
163
			prout("Your time has run out and the Federation has been");
164
			prout("conquered.  Your starship is now Klingon property,");
165
			prout("and you are put on trial as a war criminal.  On the");
166
			proutn("basis of your record, you are ");
167
			if (d.remkl*3.0 > inkling) {
168
				prout("aquitted.");
169
				skip(1);
170
				prout("LIVE LONG AND PROSPER.");
171
			}
172
			else {
173
				prout("found guilty and");
174
				prout("sentenced to death by slow torture.");
175
				alive = 0;
176
			}
177
			score(0);
178
			return;
179
		case FLIFESUP:
180
			prout("Your life support reserves have run out, and");
181
			prout("you die of thirst, starvation, and asphyxiation.");
182
			prout("Your starship is a derelict in space.");
183
			break;
184
		case FNRG:
185
			prout("Your energy supply is exhausted.");
186
			skip(1);
187
			prout("Your starship is a derelict in space.");
188
			break;
189
		case FBATTLE:
190
			proutn("The ");
191
			crmshp();
192
			prout("has been destroyed in battle.");
193
			skip(1);
194
			prout("Dulce et decorum est pro patria mori.");
195
			break;
196
		case FNEG3:
197
			prout("You have made three attempts to cross the negative energy");
198
			prout("barrier which surrounds the galaxy.");
199
			skip(1);
200
			prout("Your navigation is abominable.");
201
			score(0);
202
			return;
203
		case FNOVA:
204
			prout("Your starship has been destroyed by a nova.");
205
			prout("That was a great shot.");
206
			skip(1);
207
			break;
208
		case FSNOVAED:
209
			proutn("The ");
210
			crmshp();
211
			prout(" has been fried by a supernova.");
212
			prout("...Not even cinders remain...");
213
			break;
214
		case FABANDN:
215
			prout("You have been captured by the Klingons. If you still");
216
			prout("had a starbase to be returned to, you would have been");
217
			prout("repatriated and given another chance. Since you have");
218
			prout("no starbases, you will be mercilessly tortured to death.");
219
			break;
220
		case FDILITHIUM:
221
			prout("Your starship is now an expanding cloud of subatomic particles");
222
			break;
223
		case FMATERIALIZE:
224
			prout("Starbase was unable to re-materialize your starship.");
225
			prout("Sic transit gloria muntdi");
226
			break;
227
		case FPHASER:
228
			proutn("The ");
229
			crmshp();
230
			prout(" has been cremated by its own phasers.");
231
			break;
232
		case FLOST:
233
			prout("You and your landing party have been");
234
			prout("converted to energy, dissipating through space.");
235
			break;
236
		case FMINING:
237
			prout("You are left with your landing party on");
238
			prout("a wild jungle planet inhabited by primitive cannibals.");
239
			skip(1);
240
			prout("They are very fond of \"Captain Kirk\" soup.");
241
			skip(1);
242
			proutn("Without your leadership, the ");
243
			crmshp();
244
			prout(" is destroyed.");
245
			break;
246
		case FDPLANET:
247
			prout("You and your mining party perish.");
248
			skip(1);
249
			prout("That was a great shot.");
250
			skip(1);
251
			break;
252
		case FSSC:
253
			prout("The Galileo is instantly annihilated by the supernova.");
254
			// no break;
255
		case FPNOVA:
256
			prout("You and your mining party are atomized.");
257
			skip(1);
258
			proutn("Mr. Spock takes command of the ");
259
			crmshp();
260
			prout(" and");
261
			prout("joins the Romulans, reigning terror on the Federation.");
262
			break;
263
		case FSTRACTOR:
264
			prout("The shuttle craft Galileo is also caught,");
265
			prout("and breaks up under the strain.");
266
			skip(1);
267
			prout("Your debris is scattered for millions of miles.");
268
			proutn("Without your leadership, the ");
269
			crmshp();
270
			prout(" is destroyed.");
271
			break;
272
		case FDRAY:
273
			prout("The mutants attack and kill Spock.");
274
			prout("Your ship is captured by Klingons, and");
275
			prout("your crew is put on display in a Klingon zoo.");
276
			break;
277
		case FTRIBBLE:
278
			prout("Tribbles consume all remaining water,");
279
			prout("food, and oxygen on your ship.");
280
			skip(1);
281
			prout("You die of thirst, starvation, and asphyxiation.");
282
			prout("Your starship is a derelict in space.");
283
			break;
284
		case FHOLE:
285
			prout("Your ship is drawn to the center of the black hole.");
286
			prout("You are crushed into extremely dense matter.");
287
			break;
288
#ifdef CLOAKING
289
		case FCLOAK:
290
			ncviol++;
291
			prout("You have violated the Treaty of Algeron.");
292
			prout("The Romulan Empire can never trust you again.");
293
			break;
294
#endif
295
	}
296
#ifdef CLOAKING
297
	if (ifin!=FWON && ifin!=FCLOAK && iscloaked!=0) {
298
		prout("Your ship was cloaked so your subspace radio did not receive anything.");
299
		prout("You may have missed some warning messages.");
300
		skip(1);
301
	}
302
#endif
303
 
304
	if (ship==IHF) ship= 0;
305
	else if (ship == IHE) ship = IHF;
306
	alive = 0;
307
	if (d.remkl != 0) {
308
		double goodies = d.remres/inresor;
309
		double baddies = (d.remkl + 2.0*d.remcom)/(inkling+2.0*incom);
310
		if (goodies/baddies >= 1.0+0.5*Rand()) {
311
			prout("As a result of your actions, a treaty with the Klingon");
312
			prout("Empire has been signed. The terms of the treaty are");
313
			if (goodies/baddies >= 3.0+Rand()) {
314
				prout("favorable to the Federation.");
315
				skip(1);
316
				prout("Congratulations!");
317
			}
318
			else
319
				prout("highly unfavorable to the Federation.");
320
		}
321
		else
322
			prout("The Federation will be destroyed.");
323
	}
324
	else {
325
		prout("Since you took the last Klingon with you, you are a");
326
		prout("martyr and a hero. Someday maybe they'll erect a");
327
		prout("statue in your memory. Rest in peace, and try not");
328
		prout("to think about pigeons.");
329
		gamewon = 1;
330
	}
331
	score(0);
332
}
333
 
334
void score(int inGame) {
335
	double timused = d.date - indate;
336
    int ithperd, iwon, klship;
337
    int dnromrem = d.nromrem; // Leave global value alone
338
 
339
    if (!inGame) pause(0);
340
 
341
	iskill = skill;
342
	if ((timused == 0 || d.remkl != 0) && timused < 5.0) timused = 5.0;
343
	perdate = (d.killc + d.killk + d.nsckill)/timused;
344
	ithperd = 500*perdate + 0.5;
345
	iwon = 0;
346
	if (gamewon) iwon = 100*skill;
347
	if (ship == IHE) klship = 0;
348
	else if (ship == IHF) klship = 1;
349
	else klship = 2;
350
	if (gamewon == 0 || inGame) dnromrem = 0; // None captured if no win or if still in the game
351
	iscore = 10*d.killk + 50*d.killc + ithperd + iwon
352
			 - 100*d.basekl - 100*klship - 45*nhelp -5*d.starkl - casual
353
		 + 20*d.nromkl + 200*d.nsckill - 10*d.nplankl + dnromrem;
354
#ifdef CLOAKING
355
	iscore -= 100*ncviol;
356
#endif
357
#ifdef CAPTURE
358
	iscore += 3*kcaptured;
359
#endif
360
	if (alive == 0) iscore -= 200;
361
	skip(2);
362
    if (inGame) prout("Your score so far --");
363
    else prout("Your score --");
364
	if (d.nromkl)
365
		printf(d.nromkl> 1 ? "%6d Romulan ships destroyed            %5d\n" : "%6d Romulan ship destroyed             %5d\n",
366
			   d.nromkl, 20*d.nromkl);
367
	if (dnromrem)
368
		printf(dnromrem > 1 ? "%6d Romulan ships captured             %5d\n" : "%6d Romulan ship captured              %5d\n",
369
			   dnromrem, dnromrem);
370
	if (d.killk)
371
		printf(d.killk > 1 ? "%6d ordinary Klingon ships destroyed   %5d\n" : "%6d ordinary Klingon ship destroyed    %5d\n",
372
			   d.killk,  10*d.killk);
373
	if (d.killc)
374
		printf(d.killc > 1 ? "%6d Klingon Commander ships destroyed  %5d\n" : "%6d Klingon Commander ship destroyed   %5d\n",
375
			   d.killc, 50*d.killc);
376
	if (d.nsckill)
377
		printf("%6d Super-Commander ship destroyed     %5d\n",
378
			   d.nsckill, 200*d.nsckill);
379
	if (ithperd)
380
		printf("%6.2f Klingons per stardate              %5d\n",
381
			   perdate, ithperd);
382
#ifdef CAPTURE
383
	if (kcaptured)
384
		printf(kcaptured > 1 ? "%6d Klingons captured                  %5d\n" : "%6d Klingon captured                   %5d\n",
385
		        kcaptured, 3*kcaptured);
386
#endif
387
	if (d.starkl)
388
		printf(d.starkl > 1 ? "%6d stars destroyed by your action     %5d\n" : "%6d star destroyed by your action      %5d\n",
389
			   d.starkl, -5*d.starkl);
390
	if (d.nplankl)
391
		printf(d.nplankl > 1 ? "%6d planets destroyed by your action   %5d\n" : "%6d planet destroyed by your action    %5d\n",
392
			   d.nplankl, -10*d.nplankl);
393
	if (d.basekl)
394
		printf(d.basekl > 1 ? "%6d bases destroyed by your action     %5d\n" : "%6d base destroyed by your action      %5d\n",
395
			   d.basekl, -100*d.basekl);
396
	if (nhelp)
397
		printf(nhelp > 1 ? "%6d calls for help from starbase       %5d\n" : "%6d call for help from starbase        %5d\n",
398
			   nhelp, -45*nhelp);
399
	if (casual)
400
		printf(casual > 1 ? "%6d casualties incurred                %5d\n" : "%6d casualty incurred                  %5d\n",
401
			   casual, -casual);
402
	if (klship)
403
		printf(klship > 1 ? "%6d ships lost or destroyed            %5d\n" : "%6d ship lost or destroyed             %5d\n",
404
			   klship, -100*klship);
405
#ifdef CLOAKING
406
	if (ncviol>0)
407
		printf(ncviol > 1 ? "%6d Treaty of Algeron violations       %5d\n" : "%6d Treaty of Algeron violation        %5d\n",
408
		       ncviol, -100*ncviol);
409
#endif
410
	if (alive==0)
411
		prout("Penalty for getting yourself killed        -200");
412
	if (gamewon) {
413
		skip(1);
414
		proutn("Bonus for winning ");
415
		switch (skill) {
416
			case SNOVICE: proutn("Novice game  "); break;
417
			case SFAIR: proutn("Fair game    "); break;
418
			case SGOOD: proutn("Good game    "); break;
419
			case SEXPERT: proutn("Expert game  "); break;
420
			case SEMERITUS: proutn("Emeritus game"); break;
421
		}
422
		printf("           %5d\n", iwon);
423
	}
424
	skip(2);
425
    printf("TOTAL SCORE                               %5d\n", iscore);
426
    if (inGame && skill < SGOOD) printf("REMEMBER--The score doesn't really matter until the mission is accomplished!\n");
427
}
428
 
429
void plaque(void) {
430
	FILE *fp=NULL;
431
#ifndef KOS32
432
	time_t t;
433
#else
434
	int kos_date, kos_time;
435
#endif
436
	char *timestring;
437
	int nskip;
438
	char winner[128];
439
	skip(2);
440
 
441
	while (fp == NULL) {
442
		printf("File or device name for your plaque:");
443
#ifndef KOS32
444
		fgets(winner, 128, stdin);
445
#else
446
		gets(winner);
447
#endif
448
		winner[strlen(winner)-1] = '\0';
449
		fp = fopen(winner, "w");
450
		if (fp==NULL) {
451
			printf("Invalid name.\n");
452
		}
453
	}
454
 
455
	printf("Enter name to go on plaque (up to 30 characters):");
456
#ifndef KOS32
457
		fgets(winner, 128, stdin);
458
#else
459
		gets(winner);
7185 siemargl 460
#endif
461
	winner[strlen(winner)-1] = '\0';
7142 siemargl 462
	winner[30] = '\0';
463
	nskip = 64 - strlen(winner)/2;
464
 
465
	fprintf(fp,"\n\n\n\n");
466
	/* --------DRAW ENTERPRISE PICTURE. */
467
	fprintf(fp, "                                                                EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n" );
468
	fprintf(fp, "                                      EEE                      E  : :                                         :  E\n" );
469
	fprintf(fp, "                                    EE   EEE                   E  : :                   NCC-1701              :  E\n");
470
	fprintf(fp, "                    EEEEEEEEEEEEEEEE        EEEEEEEEEEEEEEE    E  : :                                         : E\n");
471
	fprintf(fp, "                     E                                     E    EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n");
472
	fprintf(fp, "                      EEEEEEEEE               EEEEEEEEEEEEE                 E  E\n");
473
	fprintf(fp, "                               EEEEEEE   EEEEE    E          E              E  E\n");
474
	fprintf(fp, "                                      EEE           E          E            E  E\n");
475
	fprintf(fp, "                                                       E         E          E  E\n");
476
	fprintf(fp, "                                                         EEEEEEEEEEEEE      E  E\n");
477
	fprintf(fp, "                                                      EEE :           EEEEEEE  EEEEEEEE\n");
478
	fprintf(fp, "                                                    :E    :                 EEEE       E\n");
479
	fprintf(fp, "                                                   .-E   -:-----                       E\n");
480
	fprintf(fp, "                                                    :E    :                            E\n");
481
	fprintf(fp, "                                                      EE  :                    EEEEEEEE\n");
482
	fprintf(fp, "                                                       EEEEEEEEEEEEEEEEEEEEEEE\n");
483
	fprintf(fp, "\n\n\n");
484
	fprintf(fp, "                                                       U. S. S. ENTERPRISE\n");
485
	fprintf(fp, "\n\n\n\n");
486
	fprintf(fp, "                                  For demonstrating outstanding ability as a starship captain\n");
487
	fprintf(fp, "\n");
488
	fprintf(fp, "                                                Starfleet Command bestows to you\n");
489
	fprintf(fp, "\n");
490
	fprintf(fp,"%*s%s\n\n", nskip, "", winner);
491
	fprintf(fp, "                                                           the rank of\n\n");
492
	fprintf(fp, "                                                       \"Commodore Emeritus\"\n\n");
493
	fprintf(fp, "                                                          ");
494
	switch (iskill) {
495
		case SEXPERT: fprintf(fp," Expert level\n\n"); break;
496
		case SEMERITUS: fprintf(fp,"Emeritus level\n\n"); break;
497
		default: fprintf(fp," Cheat level\n\n"); break;
498
	}
499
#ifndef KOS32
500
	t = time(NULL);
501
	timestring = ctime(&t);
502
	fprintf(fp, "                                                 This day of %.6s %.4s, %.8s\n\n",
503
			timestring+4, timestring+20, timestring+11);
504
#else
505
	kos_date = _ksys_get_date();
506
	kos_time = _ksys_get_system_clock();
507
	fprintf(fp, "                                                 This day of %02i/%02i/%02i %02i:%02i:%02i\n\n",
508
			kos_date >> 16, (kos_date & 0xFF00) >> 8, (kos_date & 0xFF) + 2000,
509
			kos_time & 0xFF, (kos_time & 0xFF00) >> 8, kos_time >> 16 );
510
#endif
511
	fprintf(fp,"                                                        Your score:  %d\n\n", iscore);
512
	fprintf(fp,"                                                    Klingons per stardate:  %.2f\n", perdate);
513
	fclose(fp);
514
}