1/*	$NetBSD: end.c,v 1.8 2009/05/25 23:24:54 dholland Exp $	*/
2
3/*
4 * Copyright (c) 1982, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)end.c	8.1 (Berkeley) 5/31/93";
36#else
37__RCSID("$NetBSD: end.c,v 1.8 2009/05/25 23:24:54 dholland Exp $");
38#endif
39#endif /* not lint */
40
41#include "mille.h"
42
43/*
44 * @(#)end.c	1.1 (Berkeley) 4/1/82
45 */
46
47/*
48 *	print out the score as if it was final, and add the totals for
49 * the end-of-games points to the user who deserves it (if any).
50 */
51void
52finalscore(PLAY *pp)
53{
54	int	temp, tot, num;
55
56	if (pp->was_finished == Finished)
57		return;
58
59	pp->was_finished = Finished;
60	num = pp - Player;
61	temp = num * 6 + 21 + 1;
62	for (tot = 5; tot <= 9; tot++)
63		mvaddstr(tot, temp, "  0");
64	if (pp->mileage == End) {
65		mvaddstr(5, temp, "40");
66		tot = SC_TRIP;
67		if (pp->nummiles[C_200] == 0) {
68			mvaddstr(6, temp, "30");
69			tot = SC_TRIP + SC_SAFE;
70		}
71		if (Topcard <= Deck) {
72			mvaddstr(7, temp, "30");
73			tot += SC_DELAY;
74		}
75		if (End == 1000) {
76			mvaddstr(8, temp, "20");
77			tot += SC_EXTENSION;
78		}
79		if (Player[other(num)].mileage == 0) {
80			mvaddstr(9, temp, "50");
81			tot += SC_SHUT_OUT;
82		}
83		pp->total += tot;
84		pp->hand_tot += tot;
85	}
86}
87
88#ifdef EXTRAP
89static int	Last_tot[2];	/* last tot used for extrapolate	*/
90
91/*
92 *	print out the score as if it was final, and add the totals for
93 * the end-of-games points to the user who deserves it (if any).
94 */
95void
96extrapolate(PLAY *pp)
97{
98
99	reg int		x, num, tot, count;
100
101	num = pp - Player;
102	tot += SC_TRIP + SC_DELAY + SC_EXT;
103	x = num * 6 + 21 + 3;
104	for (tot = 5; tot <= 9; tot++)
105		mvaddch(tot, x, '0');
106	x -= 2;
107	pp = &Player[other(num)];
108	for (count = 0, tot = 0; tot < NUM_SAFE; tot++)
109		if (pp->safety[tot] != S_PLAYED)
110			count += SC_SAFE;
111	mvprintw(3, x, "%3d", count);
112	tot += count;
113	if (count == 400) {
114		mvaddstr(4, x, "30");
115		tot += SC_ALL_SAFE;
116	}
117	pp = &Player[num];
118	for (count = 0, tot = 0; tot < NUM_SAFE; tot++)
119		if (pp->safety[tot] != S_PLAYED)
120			count += SC_COUP / 10;
121	mvprintw(4, x - 1, "%3d", count);
122	tot += count;
123	tot += 1000 - pp->mileage;
124	mvaddstr(5, x, "40");
125	mvaddstr(7, x, "30");
126	mvaddstr(8, x, "20");
127	if (pp->nummiles[C_200] == 0) {
128		mvaddstr(6, x, "30");
129		tot = SC_TRIP + SC_SAFE;
130	}
131	if (Player[other(num)].mileage == 0) {
132		mvaddstr(9, x, "50");
133		tot += SC_SHUT_OUT;
134	}
135	pp->total += tot;
136	pp->hand_tot += tot;
137	Last_tot[num] = tot;
138}
139
140void
141undoex(void)
142{
143
144	reg PLAY	*pp;
145	reg int		i;
146
147	i = 0;
148	for (pp = Player; pp < &Player[2]; pp++) {
149		pp->total -= Last_tot[i];
150		pp->hand_tot -= Last_tot[i++];
151	}
152}
153#endif /* EXTRAP */
154