|
|
1.1 root 1: /* $Header: /usr/src/games/warp/RCS/score.c,v 1.1 87/07/03 02:13:26 games Exp $ */
2:
3: /* $Log: score.c,v $
4: * Revision 7.0.1.2a 87/07/03 02:13:26 games
5: * Fixed numerous long vs. int bugs in printfs, etc.
6: *
7: * Revision 7.0.1.2 86/10/20 12:06:56 lwall
8: * Made all exits reset tty.
9: *
10: * Revision 7.0.1.1 86/10/16 10:52:47 lwall
11: * Added Damage. Fixed random bugs.
12: *
13: * Revision 7.0 86/10/08 15:13:14 lwall
14: * Split into separate files. Added amoebas and pirates.
15: *
16: */
17:
18: #include "EXTERN.h"
19: #include "warp.h"
20: #include "intrp.h"
21: #include "object.h"
22: #include "play.h"
23: #include "sig.h"
24: #include "term.h"
25: #include "us.h"
26: #include "util.h"
27: #include "weapon.h"
28: #include "INTERN.h"
29: #include "score.h"
30:
31: void
32: score_init()
33: {
34: Reg1 char *s;
35: Reg2 int i;
36: FILE *savfil;
37:
38: if (stat(SAVEDIR,&filestat)) {
39: printf("Cannot access %s\r\n",SAVEDIR);
40: finalize(1);
41: }
42: if (filestat.st_uid != geteuid()) {
43: printf("Warp will not run right without being setuid.\r\n");
44: finalize(1);
45: }
46: if ((filestat.st_mode & 0605) != 0605) {
47: printf("%s is not protected correctly (must be u+rw o+rx).\r\n",SAVEDIR);
48: finalize(1);
49: }
50:
51: #ifdef SCOREFULL
52: interp(longlognam, sizeof longlognam, "%N");
53: for (i=strlen(longlognam); i<24; i++)
54: longlognam[i] = ' '; /* make sure it is 24 long for strncmp */
55: longlognam[24] = '\0';
56: #else
57: interp(longlognam, sizeof longlognam, "%L");
58: for (i=strlen(longlognam); i<8; i++)
59: longlognam[i] = ' '; /* make sure it is 8 long for strncmp */
60: longlognam[8] = '\0';
61: #endif
62:
63: if (scorespec)
64: wscore();
65:
66: Sprintf(savefilename, "save.%s", logname);
67:
68: savfil = experimenting ? NULL : fopen(savefilename,"r");
69: if (savfil != NULL && fgets(spbuf,100,savfil) != NULL) {
70: char tmpbuf[80];
71:
72: spbuf[strlen(spbuf)-1] = '\0';
73: if (fgets(tmpbuf,80,savfil) != NULL) {
74: int processnum;
75:
76: tmpbuf[strlen(tmpbuf)-1] = '\0';
77: printf("You seem to have left a game %s.\r\n",tmpbuf+9);
78: s = index(tmpbuf+9, ',');
79: *s = '\0';
80: processnum = atoi(s+11);
81: if (kill(processnum, SIGINT)) {
82: /* does process not exist? */
83: /* (warp ignores SIGINT) */
84: printf("\r\n\
85: That process does not seem to exist anymore, so you'll have to start the\r\n");
86: printf(
87: "last wave over.\r\n\n");
88: printf(
89: " [type anything to continue]");
90: Fflush(stdout);
91: eat_typeahead();
92: getcmd(tmpbuf);
93: if (*tmpbuf == INTRCH)
94: finalize(0);
95: printf("\r\n");
96: }
97: else {
98: if (strcmp(term+8,tmpbuf+23)) {
99: printf(
100: "That is not your current terminal--you are on %s.\r\n", term+5);
101: printf("\r\nYour options:\r\n");
102: printf(" 1) Exit and find the terminal it's running on\r\n");
103: }
104: else {
105: printf("\r\nYour options:\r\n");
106: printf(" 1) Exit and try to foreground it\r\n");
107: }
108: printf(" 2) Let me terminate the other game\r\n\n");
109: printf("What do you want to do? ");
110: Fflush(stdout);
111: eat_typeahead();
112: getcmd(tmpbuf);
113: printf("\r\n");
114: if (*tmpbuf == INTRCH)
115: finalize(0);
116: if (*tmpbuf == '1') {
117: printf(
118: "If you don't succeed, come back and do option 2 instead. Good luck.\r\n");
119: finalize(0);
120: }
121: printf(
122: "Ok, hang on a few moments \r\n");
123: Fclose(savfil);
124: if (kill(processnum, SIGQUIT)) {
125: printf("Unable to kill process #%d!\r\n",processnum);
126: roundsleep(2);
127: }
128: else {
129: #ifdef SIGCONT
130: kill(processnum, SIGCONT);
131: #endif
132: for (i=15; i; --i) {
133: sleep(1);
134: if (kill(processnum,SIGINT))
135: /* does process not exist? */
136: /* (warp ignores SIGINT) */
137: break;
138: }
139: didkill++;
140: }
141: savfil = fopen(savefilename,"r");
142: if (savfil != NULL) {
143: Fgets(spbuf,100,savfil);
144: }
145: }
146: }
147: }
148: else
149: savfil = NULL;
150: if (savfil == NULL) {
151: totalscore = smarts = cumsmarts = wave = 0;
152: numents = 5;
153: numbases = 3;
154: }
155: else {
156: totalscore = atol(spbuf+9);
157: smarts = atoi(spbuf+20);
158: cumsmarts = atoi(spbuf+24);
159: numents = atoi(spbuf+30);
160: numbases = atoi(spbuf+33);
161: wave = atoi(spbuf+36);
162: apolspec = (spbuf[40] == 'a');
163: beginner = (spbuf[41] == 'b');
164: crushspec = (spbuf[42] == 'c');
165: gornspec = (spbuf[43] == 'g');
166: massacre = (spbuf[44] == 'm');
167: romspec = (spbuf[45] == 'r');
168: tholspec = (spbuf[46] == 't');
169: lowspeed = (spbuf[47] == 'l') || lowspeed;
170: amoebaspec = (spbuf[48] == '&');
171: Fclose(savfil);
172: }
173:
174: if (!ismarts) {
175: ismarts = 1;
176: clear();
177: page(NEWSFILE,FALSE);
178: if (smarts) {
179: printf("\r\nSaved game: SCORE DIFF CUMDIFF ENTERPRISES BASES WAVE");
180: printf("\r\n %7ld %2d %4d %1d %1d %3d",
181: totalscore,smarts,cumsmarts,numents,numbases,wave);
182: }
183: printf("\r\nWould you like instructions? ");
184: Fflush(stdout);
185: eat_typeahead();
186: getcmd(buf);
187: printf("\r\n");
188: if (*buf == INTRCH)
189: finalize(0);
190: if (*buf == 'Y' || *buf == 'y') {
191: page(HELPFILE,FALSE);
192: printf("\r\nWould you like to play easy games for a while? ");
193: Fflush(stdout);
194: eat_typeahead();
195: getcmd(buf);
196: printf("\r\n");
197: if (*buf == 'Y' || *buf == 'y') {
198: beginner = TRUE;
199: lowspeed = TRUE;
200: }
201: }
202: }
203: if (!smarts)
204: smarts = ismarts;
205: }
206:
207: void
208: wscore()
209: {
210: clear();
211: printf(" TOP WARPISTS\r\n\n");
212: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n");
213: page(SCOREBOARD,TRUE);
214: printf(" [Type anything to continue]");
215: Fflush(stdout);
216: getcmd(spbuf);
217: if (*spbuf == INTRCH)
218: finalize(0);
219: clear();
220: printf(" TOP LOW-SPEED WARPISTS\r\n\n");
221: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n");
222: page(LSCOREBOARD,TRUE);
223: printf(" [Type anything to continue]");
224: Fflush(stdout);
225: getcmd(spbuf);
226: if (*spbuf == INTRCH)
227: finalize(0);
228: clear();
229: printf(" TOP FUNNY WARPISTS\r\n\n");
230: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n");
231: page(FSCOREBOARD,TRUE);
232: printf(" [Type anything to continue]");
233: Fflush(stdout);
234: getcmd(spbuf);
235: if (*spbuf == INTRCH)
236: finalize(0);
237: clear();
238: printf(" GAMES SAVED OR IN PROGRESS\r\n\n");
239: printf("WHO SCORE DF CDF E B WV FLAGS\r\n");
240: resetty();
241: Sprintf(spbuf,"/bin/cat %ssave.*",SAVEDIR);
242: #ifndef lint
243: execl("/bin/sh", "sh", "-c", spbuf, 0);
244: #endif
245: finalize(1);
246: }
247:
248:
249: void
250: display_status()
251: {
252: Reg1 int tmp;
253: static char *status_names[] = {"Impl", "Warp", "Base", "****" };
254:
255: if (oldstatus != status) {
256: Sprintf(spbuf,"%-4s",status_names[status]);
257: mvaddstr(0,0, spbuf);
258: oldstatus = status;
259: }
260: if (ent) {
261: if (ent->energy != oldeenergy) {
262: oldeenergy = ent->energy;
263: Sprintf(spbuf,"%4ld",oldeenergy);
264: mvaddstr(0,8, spbuf);
265: }
266: if (etorp != oldetorp) {
267: Sprintf(spbuf,"%2d",etorp);
268: mvaddstr(0,13, spbuf);
269: oldetorp = etorp;
270: }
271: }
272: else {
273: if (etorp >= 0) {
274: etorp = -1;
275: mvaddstr(0,8,"*******");
276: damage = 0;
277: }
278: }
279: if (base) {
280: if (base->energy != oldbenergy) {
281: oldbenergy = base->energy;
282: Sprintf(spbuf,"%5ld",oldbenergy);
283: mvaddstr(0,19, spbuf);
284: }
285: if (btorp != oldbtorp) {
286: Sprintf(spbuf,"%3d",btorp);
287: mvaddstr(0,25, spbuf);
288: oldbtorp = btorp;
289: }
290: }
291: else {
292: if (btorp >= 0) {
293: btorp = -1;
294: mvaddstr(0,19,"*********");
295: }
296: }
297: if (damage) {
298: if (!olddamage)
299: mvaddstr(0,42,"*** ");
300: if (damage > 1 || !damflag[dam]) {
301: do {
302: if (++dam == MAXDAMAGE)
303: dam = 0;
304: } while (!damflag[dam]);
305: }
306: if (!--damflag[dam]) {
307: olddamage = damage;
308: damage--;
309: Sprintf(spbuf,"%s OK *** ",dammess[dam]);
310: spbuf[15] = '\0';
311: mvaddstr(0,46,spbuf);
312: }
313: else if (dam == NOSHIELDS) {
314: olddamage = damage;
315: tmp = (34 - damflag[dam]) * 3 - rand_mod(3);
316: if (tmp < 0)
317: tmp = 0;
318: Sprintf(spbuf,"%d%% %s *** ",tmp,dammess[dam]);
319: spbuf[15] = '\0';
320: mvaddstr(0,46,spbuf);
321: }
322: else if (dam != lastdam || !olddamage) {
323: olddamage = damage;
324: Sprintf(spbuf,"NO %s *** ",dammess[dam]);
325: spbuf[15] = '\0';
326: mvaddstr(0,46,spbuf);
327: }
328: if (status < 2) {
329: if (dam == NOIMPULSE && !entmode)
330: status = entmode = 1;
331: if (dam == NOWARP && entmode)
332: status = entmode = 0;
333: }
334: tmp = damflag[dam] * damage;
335: Sprintf(spbuf,"%3d.%1d ETR",tmp/10,tmp%10);
336: mvaddstr(0,69,spbuf);
337: lastdam = dam;
338: }
339: else {
340: if (olddamage) {
341: Sprintf(spbuf,"Stars: %-3d Stardate",numstars);
342: mvaddstr(0,42,spbuf);
343: lastdam = -1;
344: olddamage = 0;
345: oldcurscore = -1;
346: }
347: else if (numstars != oldstrs) {
348: Sprintf(spbuf,"%-3d",numstars);
349: mvaddstr(0,49, spbuf);
350: }
351: oldstrs = numstars;
352: }
353: if (numenemies != oldenemies) {
354: Sprintf(spbuf,"%-3d",numenemies);
355: mvaddstr(0,38, spbuf);
356: oldenemies = numenemies;
357: }
358: if (tmp = timer%10) {
359: Sprintf(spbuf,"%1d",tmp);
360: mvaddstr(0,67, spbuf);
361: }
362: else {
363: Sprintf(spbuf,"%5d.%1d",timer/10+smarts*100,tmp);
364: mvaddstr(0,61, spbuf);
365: }
366: if ((!damage || !damflag[dam]) && curscore != oldcurscore) {
367: Sprintf(spbuf,"%9ld",curscore);
368: mvaddstr(0,69, spbuf);
369: oldcurscore = curscore;
370: }
371: }
372:
373: void
374: wavescore()
375: {
376: double power, effectscore, starscore, pi_over_2;
377: long bonuses;
378: long tmp;
379: FILE *mapfp;
380: int row;
381: double pow();
382: #ifndef lint
383: double atan2();
384: #endif
385:
386: clear();
387: if (curscore > possiblescore)
388: curscore = possiblescore;
389: pi_over_2 = 3.14159265 / 2.0;
390: power = pow((double)inumenemies+ /* total number of enemies */
391: inumroms*2+ /* count roms 3 times */
392: inumgorns+ /* count gorns 2 times */
393: inumthols+ /* count thols 2 times */
394: inumapollos*4+ /* count apollo 5 times */
395: inumcrushes*3+ /* count crushers 4 times */
396: inumamoebas*5 /* count amoebas 6 times */
397: , 0.50) * /* skew it a little */
398: (double)smarts; /* average energy and intelligence */
399: if (inumstars < 350 && inumenemies > 5)
400: power += (350.0 - (double)inumstars) * ((double)inumenemies - 5.0);
401: if (inumstars > 850 && inumenemies > 2)
402: power += ((double)inumstars - 850.0) * ((double)inumenemies - 2.0);
403: #ifndef lint
404: effectscore = ((double)curscore / possiblescore) *
405: atan2(power, (double) timer + 1.0) / pi_over_2;
406: #else
407: effectscore = pi_over_2;
408: #endif
409: if (inumstars)
410: starscore = (double) numstars / (double) inumstars;
411: else
412: starscore = 1.0;
413: wave++;
414: Sprintf(spbuf,"Wave = %d, Difficulty = %d, cumulative difficulty = %d",
415: wave, smarts, cumsmarts);
416: mvaddstr(1, 13+(smarts<10), spbuf);
417: mvaddstr( 4, 68, " BONUS");
418: Sprintf(spbuf,"Efficiency rating: %1.8f (diff=%0.2f,time=%d)",
419: effectscore, power, timer + 1);
420: mvaddstr( 5,5, spbuf);
421: if (effectscore < 0.8)
422: bonuses = tmp = 0;
423: else
424: bonuses = tmp = (long) ((effectscore-0.8) * smarts * 1000);
425: Sprintf(spbuf, "%6ld", tmp);
426: mvaddstr( 5, 68, spbuf);
427: Sprintf(spbuf,"Star save ratio: %1.8f (%d/%d)",
428: starscore, numstars, inumstars);
429: mvaddstr( 6,5, spbuf);
430: #ifndef lint
431: bonuses += tmp = (long) (((double)curscore / possiblescore) *
432: (starscore*starscore) * smarts * 20);
433: #endif
434: Sprintf(spbuf, "%6ld", tmp);
435: mvaddstr( 6, 68, spbuf);
436: row = 7;
437: if (inuminhab != numinhab) {
438: Sprintf(spbuf, "Inhabited stars depopulated: %5d", inuminhab-numinhab);
439: mvaddstr(row,5, spbuf);
440: bonuses += tmp = (long) (inuminhab-numinhab) * -500;
441: Sprintf(spbuf, "%6ld", tmp);
442: mvaddstr(row, 68, spbuf);
443: row++;
444: }
445: if (inumfriends != numfriends) {
446: Sprintf(spbuf, "Friendly craft destroyed: %5d",
447: inumfriends-numfriends);
448: mvaddstr(row,5, spbuf);
449: bonuses += tmp = (long) (inumfriends-numfriends) * -250;
450: Sprintf(spbuf, "%6ld", tmp);
451: mvaddstr(row, 68, spbuf);
452: row++;
453: }
454: if (deadmudds) {
455: mvaddstr(row,5,"For destroying Harry Mudd:");
456: bonuses += tmp = (long) rand_mod(deadmudds * 20 + 1) - deadmudds*10;
457: Sprintf(spbuf, "%6ld", tmp);
458: mvaddstr(row, 68, spbuf);
459: row++;
460: }
461: if (bombed_out) {
462: mvaddstr(row,5, "For running away from reality:");
463: bonuses += tmp = (long) -possiblescore/2;
464: Sprintf(spbuf, "%6ld", tmp);
465: mvaddstr(row, 68, spbuf);
466: row++;
467: }
468: if (row < 9)
469: row++;
470: Sprintf(spbuf, "Enterprise: %-9s%5d remaining",
471: !ient?"":ent?"saved":"destroyed", numents);
472: mvaddstr(row,5, spbuf);
473: bonuses += tmp = ent && !bombed_out ? (smarts+1)*15 : 0;
474: Sprintf(spbuf, "%6ld", tmp);
475: mvaddstr(row, 68, spbuf);
476: row++;
477: Sprintf(spbuf, "Base: %-9s %5d remaining",
478: !ibase?"":base?"saved":"destroyed", numbases);
479: mvaddstr(row,5, spbuf);
480: bonuses += tmp = base && !bombed_out ? (smarts+1)*10 : 0;
481: Sprintf(spbuf, "%6ld", tmp);
482: mvaddstr(row, 68, spbuf);
483: if (beginner) {
484: mvaddstr(13+(row>11),19, "(Special games count only a tenth as much)");
485: curscore /= 10;
486: bonuses /= 10;
487: }
488: Sprintf(spbuf, "Previous point total:%10ld",lastscore);
489: mvaddstr(15,24, spbuf);
490: Sprintf(spbuf, "Points this round: %10ld",curscore);
491: mvaddstr(16,24, spbuf);
492: Sprintf(spbuf, "Bonuses: %10ld",bonuses);
493: mvaddstr(17,24, spbuf);
494: totalscore = lastscore + curscore + bonuses;
495: Sprintf(spbuf, "New point total: %10ld",totalscore);
496: mvaddstr(18,24, spbuf);
497: if (lastscore / ENTBOUNDARY < totalscore / ENTBOUNDARY) {
498: mvaddstr(row-1,42,"+ 1 new");
499: numents++;
500: }
501: else if (numents>0 &&
502: lastscore / ENTBOUNDARY > totalscore / ENTBOUNDARY) {
503: mvaddstr(row-1,42,"- 1 obsolete");
504: numents--;
505: }
506: if (lastscore / BASEBOUNDARY < totalscore / BASEBOUNDARY) {
507: mvaddstr(row,42,"+ 1 new");
508: numbases++;
509: }
510: else if (numbases>0 &&
511: lastscore / BASEBOUNDARY > totalscore / BASEBOUNDARY) {
512: mvaddstr(row,42,"- 1 obsolete");
513: numbases--;
514: }
515: if (starscore < 0.8 && inumstars > 200 && numstars > 50) {
516: Sprintf(spbuf, "smap.%d",rand_mod(MAPS-PERMMAPS)+PERMMAPS);
517: if ((mapfp = fopen(spbuf,"w")) != NULL) {
518: Reg1 OBJECT *obj;
519:
520: fprintf(mapfp,"%d\n",numstars);
521: for (obj = root.next; obj != &root; obj = obj->next) {
522: if (obj->type == Star) {
523: fprintf(mapfp,"%d %d\n",obj->posy,obj->posx);
524: }
525: }
526: Fclose(mapfp);
527: }
528: }
529: }
530:
531: void
532: score()
533: {
534: char tmp, *retval, cdate[30];
535: Reg1 FILE *logfd;
536: Reg2 FILE *outfd;
537: Reg3 int i;
538: long nowtime, time();
539: char *scoreboard;
540:
541: for (i=0; link(LOGFILE, LOCKFILE) == -1 && i<10; i++)
542: sleep(1);
543: nowtime = time((long *)0);
544: strcpy(cdate,ctime(&nowtime));
545: if ((logfd = fopen(LOGFILE,"a")) != NULL) {
546: fprintf(logfd,
547: "%-24s%-9s%7ld%c%2d %4d %s",
548: realname, logname, totalscore, c,smarts, cumsmarts, cdate);
549: Fclose(logfd);
550: }
551: strcpy(cdate+11,cdate+20);
552: if (beginner)
553: scoreboard = FSCOREBOARD;
554: else if (lowspeed)
555: scoreboard = LSCOREBOARD;
556: else
557: scoreboard = SCOREBOARD;
558: if (eaccess(scoreboard,0)) {
559: if ((logfd = fopen(scoreboard,"w")) != NULL)
560: Fclose(logfd);
561: }
562: if ((logfd = fopen(scoreboard,"r")) != NULL &&
563: (outfd = fopen(TMPSCOREBOARD,"w")) != NULL) {
564: for (i=0; i<20; i++) {
565: if ((retval = fgets(buf, 100, logfd)) == NULL)
566: break;
567: if (atol(buf+32) < totalscore)
568: break;
569: if (strnEQ(buf+COMPOFF,COMPNAME,COMPLEN)) {
570: i = 100;
571: break;
572: }
573: fprintf(outfd, "%s", buf);
574: }
575: if (i == 100) {
576: mvaddstr(20,21, "You did not better your previous score");
577: Fclose(outfd);
578: unlink(TMPSCOREBOARD);
579: }
580: else if (i < 20) {
581: fprintf(outfd, "%-24s%-8s%8ld%c %2d %4d %s",
582: realname, logname, totalscore, c,smarts, cumsmarts, cdate);
583: i++;
584: Sprintf(spbuf, " Congratulations--you've placed %d%s",
585: i, i==1?"st":(i==2?"nd":(i==3?"rd":"th")));
586: if (retval != NULL) {
587: if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) {
588: fprintf(outfd, "%s", buf);
589: i++;
590: }
591: else
592: strcpy(spbuf,"Congratulations--you've bettered your score");
593: while (i<20) {
594: if (fgets(buf, 100, logfd) == NULL)
595: break;
596: if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) {
597: fprintf(outfd, "%s", buf);
598: i++;
599: }
600: }
601: }
602: mvaddstr(20,19, spbuf);
603: Fclose(logfd);
604: Fclose(outfd);
605: while (unlink(scoreboard) == 0)
606: ;
607: link(TMPSCOREBOARD,scoreboard);
608: unlink(TMPSCOREBOARD);
609: logfd = fopen(scoreboard,"r");
610: }
611: else {
612: mvaddstr(20,22,"You did not place within the top 20");
613: Fclose(outfd);
614: }
615: }
616: else {
617: Sprintf(spbuf,"(Cannot access %s file, error %d)",
618: (logfd==NULL?"log":"tmp"),errno);
619: mvaddstr(20,22,spbuf);
620: }
621: move(23,0,0);
622: erase_eol();
623: mvaddstr(23,11,
624: "[Hit space for scoreboard, 'r' for new game, 'q' to quit]");
625: unlink(LOCKFILE);
626: Fflush(stdout);
627: eat_typeahead();
628: do {
629: getcmd(&tmp);
630: } while (tmp != INTRCH && tmp != BREAKCH && !index(" rqQ",tmp));
631: if (index("qQr",tmp)) {
632: justonemoretime = (tmp == 'r');
633: if (logfd != NULL)
634: Fclose(logfd);
635: }
636: else {
637: clear();
638: if (logfd != NULL) {
639: fseek(logfd, 0L, 0);
640: if (beginner)
641: mvaddstr(0,31,"TOP FUNNY WARPISTS");
642: else if (lowspeed)
643: mvaddstr(0,29,"TOP LOW-SPEED WARPISTS");
644: else
645: mvaddstr(0,33,"TOP WARPISTS");
646: mvaddstr(2,0,"RANK WHO AKA SCORE DIFF CUMDIFF WHEN");
647: for (i=1; i<=20; i++) {
648: if (fgets(buf, 100, logfd) == NULL)
649: break;
650: buf[strlen(buf)-1] = '\0';
651: Sprintf(spbuf, " %2d %s", i, buf);
652: mvaddstr(i+2,0, spbuf);
653: }
654: Fclose(logfd);
655: }
656: roundsleep(1);
657: mvaddstr(23,25,"Would you like to play again?");
658: eat_typeahead();
659: do {
660: getcmd(&tmp);
661: } while (tmp != INTRCH && tmp != BREAKCH && !index("nNyY \n\r",tmp));
662: if (tmp == 'n' || tmp == 'N' || tmp == INTRCH || tmp == BREAKCH)
663: justonemoretime = FALSE;
664: }
665:
666: smarts = ismarts;
667: totalscore = cumsmarts = wave = 0;
668: numents = 5;
669: numbases = 3;
670: apolspec = FALSE;
671: beginner = FALSE;
672: crushspec = FALSE;
673: gornspec = FALSE;
674: massacre = (ismarts >= 40);
675: romspec = FALSE;
676: tholspec = FALSE;
677: }
678:
679: void
680: save_game()
681: {
682: FILE *savfil;
683:
684: if (experimenting)
685: return;
686: if ((savfil = fopen(savefilename,"w")) == NULL) {
687: resetty();
688: printf("Cannot save game\r\n");
689: finalize(1);
690: }
691: fprintf(savfil, "%-8s %10ld, %2d,%5d,%2d,%2d,%3d %c%c%c%c%c%c%c%c\n",
692: logname, totalscore, smarts, cumsmarts, numents, numbases, wave,
693: apolspec ? 'a' : ' ',
694: beginner ? 'b' : ' ',
695: crushspec ? 'c' : ' ',
696: gornspec ? 'g' : ' ',
697: massacre ? 'm' : ' ',
698: romspec ? 'r' : ' ',
699: tholspec ? 't' : ' ',
700: lowspeed ? 'l' : ' ',
701: amoebaspec ? '&' : ' '
702: );
703: Fclose(savfil);
704: resetty();
705: if (panic)
706: finalize(0);
707: clear();
708: finalize(0);
709: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.