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