xref: /netbsd-src/games/adventure/done.c (revision aa19a9d0a5dba8e0b5bb1974b44d136f24cc40df)
1*aa19a9d0Sdholland /*	$NetBSD: done.c,v 1.10 2009/08/25 06:56:52 dholland Exp $	*/
243b95251Scgd 
3107c0a28Sjtc /*-
4107c0a28Sjtc  * Copyright (c) 1991, 1993
5107c0a28Sjtc  *	The Regents of the University of California.  All rights reserved.
6107c0a28Sjtc  *
7107c0a28Sjtc  * The game adventure was originally written in Fortran by Will Crowther
8107c0a28Sjtc  * and Don Woods.  It was later translated to C and enhanced by Jim
9107c0a28Sjtc  * Gillogly.  This code is derived from software contributed to Berkeley
10107c0a28Sjtc  * by Jim Gillogly at The Rand Corporation.
11107c0a28Sjtc  *
12107c0a28Sjtc  * Redistribution and use in source and binary forms, with or without
13107c0a28Sjtc  * modification, are permitted provided that the following conditions
14107c0a28Sjtc  * are met:
15107c0a28Sjtc  * 1. Redistributions of source code must retain the above copyright
16107c0a28Sjtc  *    notice, this list of conditions and the following disclaimer.
17107c0a28Sjtc  * 2. Redistributions in binary form must reproduce the above copyright
18107c0a28Sjtc  *    notice, this list of conditions and the following disclaimer in the
19107c0a28Sjtc  *    documentation and/or other materials provided with the distribution.
20e5aeb4eaSagc  * 3. Neither the name of the University nor the names of its contributors
21107c0a28Sjtc  *    may be used to endorse or promote products derived from this software
22107c0a28Sjtc  *    without specific prior written permission.
23107c0a28Sjtc  *
24107c0a28Sjtc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25107c0a28Sjtc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26107c0a28Sjtc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27107c0a28Sjtc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28107c0a28Sjtc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29107c0a28Sjtc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30107c0a28Sjtc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31107c0a28Sjtc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32107c0a28Sjtc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33107c0a28Sjtc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34107c0a28Sjtc  * SUCH DAMAGE.
35107c0a28Sjtc  */
36107c0a28Sjtc 
37690bee10Schristos #include <sys/cdefs.h>
38107c0a28Sjtc #ifndef lint
3943b95251Scgd #if 0
40107c0a28Sjtc static char sccsid[] = "@(#)done.c	8.1 (Berkeley) 5/31/93";
4143b95251Scgd #else
42*aa19a9d0Sdholland __RCSID("$NetBSD: done.c,v 1.10 2009/08/25 06:56:52 dholland Exp $");
4343b95251Scgd #endif
44107c0a28Sjtc #endif /* not lint */
45107c0a28Sjtc 
46107c0a28Sjtc /*      Re-coding of advent in C: termination routines */
47107c0a28Sjtc 
48690bee10Schristos #include <stdio.h>
4932330650Smatt #include <stdlib.h>
50107c0a28Sjtc #include "hdr.h"
51690bee10Schristos #include "extern.h"
52107c0a28Sjtc 
53690bee10Schristos int
score(void)54243d04efSjmc score(void)
5584f80fd6Slukem {				/* sort of like 20000 */
56*aa19a9d0Sdholland 	int     myscore, i;
57*aa19a9d0Sdholland 
58*aa19a9d0Sdholland 	maxscore = myscore = 0;
5984f80fd6Slukem 	for (i = 50; i <= maxtrs; i++) {
6084f80fd6Slukem 		if (ptext[i].txtlen == 0)
6184f80fd6Slukem 			continue;
62107c0a28Sjtc 		k = 12;
6384f80fd6Slukem 		if (i == chest)
6484f80fd6Slukem 			k = 14;
6584f80fd6Slukem 		if (i > chest)
6684f80fd6Slukem 			k = 16;
6784f80fd6Slukem 		if (prop[i] >= 0)
68*aa19a9d0Sdholland 			myscore += 2;
6984f80fd6Slukem 		if (place[i] == 3 && prop[i] == 0)
70*aa19a9d0Sdholland 			myscore += k - 2;
71*aa19a9d0Sdholland 		maxscore += k;
72107c0a28Sjtc 	}
73*aa19a9d0Sdholland 	myscore += (maxdie - numdie) * 10;
74*aa19a9d0Sdholland 	maxscore += maxdie * 10;
75*aa19a9d0Sdholland 	if (!(scoring || gaveup))
76*aa19a9d0Sdholland 		myscore += 4;
77*aa19a9d0Sdholland 	maxscore += 4;
7884f80fd6Slukem 	if (dflag != 0)
79*aa19a9d0Sdholland 		myscore += 25;
80*aa19a9d0Sdholland 	maxscore += 25;
81*aa19a9d0Sdholland 	if (isclosing)
82*aa19a9d0Sdholland 		myscore += 25;
83*aa19a9d0Sdholland 	maxscore += 25;
8484f80fd6Slukem 	if (closed) {
8584f80fd6Slukem 		if (bonus == 0)
86*aa19a9d0Sdholland 			myscore += 10;
8784f80fd6Slukem 		if (bonus == 135)
88*aa19a9d0Sdholland 			myscore += 25;
8984f80fd6Slukem 		if (bonus == 134)
90*aa19a9d0Sdholland 			myscore += 30;
9184f80fd6Slukem 		if (bonus == 133)
92*aa19a9d0Sdholland 			myscore += 45;
93107c0a28Sjtc 	}
94*aa19a9d0Sdholland 	maxscore += 45;
95*aa19a9d0Sdholland 	if (place[magazine] == 108)
96*aa19a9d0Sdholland 		myscore++;
97*aa19a9d0Sdholland 	maxscore++;
98*aa19a9d0Sdholland 	myscore += 2;
99*aa19a9d0Sdholland 	maxscore += 2;
100*aa19a9d0Sdholland 	for (i = 1; i <= hintmax; i++)
10184f80fd6Slukem 		if (hinted[i])
102*aa19a9d0Sdholland 			myscore -= hints[i][2];
103*aa19a9d0Sdholland 	return myscore;
104107c0a28Sjtc }
105107c0a28Sjtc 
106243d04efSjmc /* entry=1 means goto 13000 */	/* game is over */
107243d04efSjmc /* entry=2 means goto 20000 */	/* 3=19000 */
108690bee10Schristos void
done(int entry)109243d04efSjmc done(int entry)
11084f80fd6Slukem {
11184f80fd6Slukem 	int     i, sc;
11284f80fd6Slukem 	if (entry == 1)
11384f80fd6Slukem 		mspeak(1);
11484f80fd6Slukem 	if (entry == 3)
11584f80fd6Slukem 		rspeak(136);
116107c0a28Sjtc 	printf("\n\n\nYou scored %d out of a ", (sc = score()));
117*aa19a9d0Sdholland 	printf("possible %d using %d turns.\n", maxscore, turns);
118*aa19a9d0Sdholland 	for (i = 1; i <= classes; i++)
11984f80fd6Slukem 		if (cval[i] >= sc) {
12084f80fd6Slukem 			speak(&ctext[i]);
121*aa19a9d0Sdholland 			if (i == classes - 1) {
12284f80fd6Slukem 				printf("To achieve the next higher rating");
123107c0a28Sjtc 				printf(" would be a neat trick!\n\n");
124107c0a28Sjtc 				printf("Congratulations!!\n");
125107c0a28Sjtc 				exit(0);
126107c0a28Sjtc 			}
127107c0a28Sjtc 			k = cval[i] + 1 - sc;
128107c0a28Sjtc 			printf("To achieve the next higher rating, you need");
129107c0a28Sjtc 			printf(" %d more point", k);
13084f80fd6Slukem 			if (k == 1)
13184f80fd6Slukem 				printf(".\n");
13284f80fd6Slukem 			else
13384f80fd6Slukem 				printf("s.\n");
134107c0a28Sjtc 			exit(0);
135107c0a28Sjtc 		}
136107c0a28Sjtc 	printf("You just went off my scale!!!\n");
137107c0a28Sjtc 	exit(0);
138107c0a28Sjtc }
139107c0a28Sjtc 
140243d04efSjmc /* label 90 */
141dd397c84Shubertf void
die(int entry)142243d04efSjmc die(int entry)
14384f80fd6Slukem {
14484f80fd6Slukem 	int     i;
14584f80fd6Slukem 	if (entry != 99) {
14684f80fd6Slukem 		rspeak(23);
147*aa19a9d0Sdholland 		oldloc2 = loc;
148107c0a28Sjtc 	}
149*aa19a9d0Sdholland 	if (isclosing) {		/* 99 */
15084f80fd6Slukem 		rspeak(131);
151107c0a28Sjtc 		numdie++;
152107c0a28Sjtc 		done(2);
153107c0a28Sjtc 	}
154107c0a28Sjtc 	yea = yes(81 + numdie * 2, 82 + numdie * 2, 54);
155107c0a28Sjtc 	numdie++;
15684f80fd6Slukem 	if (numdie == maxdie || !yea)
15784f80fd6Slukem 		done(2);
158107c0a28Sjtc 	place[water] = 0;
159107c0a28Sjtc 	place[oil] = 0;
16084f80fd6Slukem 	if (toting(lamp))
16184f80fd6Slukem 		prop[lamp] = 0;
16284f80fd6Slukem 	for (i = 100; i >= 1; i--) {
16384f80fd6Slukem 		if (!toting(i))
16484f80fd6Slukem 			continue;
165*aa19a9d0Sdholland 		k = oldloc2;
16684f80fd6Slukem 		if (i == lamp)
16784f80fd6Slukem 			k = 1;
168107c0a28Sjtc 		drop(i, k);
169107c0a28Sjtc 	}
170107c0a28Sjtc 	loc = 3;
171107c0a28Sjtc 	oldloc = loc;
172107c0a28Sjtc }
173