xref: /openbsd-src/games/monop/prop.c (revision 211c4183895062b2b5d2cd7108ec500b73a28071)
1*211c4183Smestre /*	$OpenBSD: prop.c,v 1.11 2016/01/08 18:20:33 mestre Exp $	*/
2df930be7Sderaadt /*	$NetBSD: prop.c,v 1.3 1995/03/23 08:35:06 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1980, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
167a09557bSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  */
32df930be7Sderaadt 
33bb3b10f2Spjanzen #include <err.h>
3491d73282Smestre #include <stdio.h>
3591d73282Smestre #include <stdlib.h>
3691d73282Smestre 
37df930be7Sderaadt #include "monop.ext"
38df930be7Sderaadt 
39c72b5b24Smillert static int	value(SQUARE *);
40df930be7Sderaadt 
41df930be7Sderaadt /*
42df930be7Sderaadt  *	This routine deals with buying property, setting all the
43df930be7Sderaadt  * appropriate flags.
44df930be7Sderaadt  */
45bb3b10f2Spjanzen void
buy(int plr,SQUARE * sqrp)46*211c4183Smestre buy(int plr, SQUARE *sqrp)
47bb3b10f2Spjanzen {
48df930be7Sderaadt 	trading = FALSE;
49bba3186fSpjanzen 	sqrp->owner = plr;
50bba3186fSpjanzen 	add_list(plr, &(play[plr].own_list), cur_p->loc);
51df930be7Sderaadt }
52df930be7Sderaadt /*
53df930be7Sderaadt  *	This routine adds an item to the list.
54df930be7Sderaadt  */
55bb3b10f2Spjanzen void
add_list(int plr,OWN ** head,int op_sqr)56*211c4183Smestre add_list(int plr, OWN **head, int op_sqr)
57bb3b10f2Spjanzen {
58bb3b10f2Spjanzen 	int	val;
59bb3b10f2Spjanzen 	OWN	*tp, *last_tp;
60df930be7Sderaadt 	OWN	*op;
61df930be7Sderaadt 
62ca161728Sderaadt 	if ((op = calloc(1, sizeof (OWN))) == NULL)
63bba3186fSpjanzen 		err(1, NULL);
64df930be7Sderaadt 	op->sqr = &board[op_sqr];
65df930be7Sderaadt 	val = value(op->sqr);
66df930be7Sderaadt 	last_tp = NULL;
67df930be7Sderaadt 	for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next)
68df930be7Sderaadt 		if (val == value(tp->sqr)) {
690affe7fcStedu 			free(op);
70df930be7Sderaadt 			return;
71df930be7Sderaadt 		}
72df930be7Sderaadt 		else
73df930be7Sderaadt 			last_tp = tp;
74df930be7Sderaadt 	op->next = tp;
75df930be7Sderaadt 	if (last_tp != NULL)
76df930be7Sderaadt 		last_tp->next = op;
77df930be7Sderaadt 	else
78df930be7Sderaadt 		*head = op;
79df930be7Sderaadt 	if (!trading)
80df930be7Sderaadt 		set_ownlist(plr);
81df930be7Sderaadt }
82df930be7Sderaadt /*
83df930be7Sderaadt  *	This routine deletes property from the list.
84df930be7Sderaadt  */
85bb3b10f2Spjanzen void
del_list(int plr,OWN ** head,shrt op_sqr)86*211c4183Smestre del_list(int plr, OWN **head, shrt op_sqr)
87bb3b10f2Spjanzen {
88bb3b10f2Spjanzen 	OWN	*op, *last_op;
89df930be7Sderaadt 
90bba3186fSpjanzen 	switch (board[(int)op_sqr].type) {
91df930be7Sderaadt 	case PRPTY:
92bba3186fSpjanzen 		board[(int)op_sqr].desc->mon_desc->num_own--;
93df930be7Sderaadt 		break;
94df930be7Sderaadt 	case RR:
95df930be7Sderaadt 		play[plr].num_rr--;
96df930be7Sderaadt 		break;
97df930be7Sderaadt 	case UTIL:
98df930be7Sderaadt 		play[plr].num_util--;
99df930be7Sderaadt 		break;
100df930be7Sderaadt 	}
101df930be7Sderaadt 	last_op = NULL;
102df930be7Sderaadt 	for (op = *head; op; op = op->next)
103bba3186fSpjanzen 		if (op->sqr == &board[(int)op_sqr])
104df930be7Sderaadt 			break;
105df930be7Sderaadt 		else
106df930be7Sderaadt 			last_op = op;
107df930be7Sderaadt 	if (last_op == NULL)
108df930be7Sderaadt 		*head = op->next;
109df930be7Sderaadt 	else {
110df930be7Sderaadt 		last_op->next = op->next;
1110affe7fcStedu 		free(op);
112df930be7Sderaadt 	}
113df930be7Sderaadt }
114df930be7Sderaadt /*
115df930be7Sderaadt  *	This routine calculates the value for sorting of the
116df930be7Sderaadt  * given square.
117df930be7Sderaadt  */
118bb3b10f2Spjanzen static int
value(SQUARE * sqp)119*211c4183Smestre value(SQUARE *sqp)
120bb3b10f2Spjanzen {
121bb3b10f2Spjanzen 	int	sqr;
122df930be7Sderaadt 
123df930be7Sderaadt 	sqr = sqnum(sqp);
124df930be7Sderaadt 	switch (sqp->type) {
125df930be7Sderaadt 	case SAFE:
126df930be7Sderaadt 		return 0;
127df930be7Sderaadt 	default:		/* Specials, etc */
128df930be7Sderaadt 		return 1;
129df930be7Sderaadt 	case UTIL:
130df930be7Sderaadt 		if (sqr == 12)
131df930be7Sderaadt 			return 2;
132df930be7Sderaadt 		else
133df930be7Sderaadt 			return 3;
134df930be7Sderaadt 	case RR:
135df930be7Sderaadt 		return 4 + sqr/10;
136df930be7Sderaadt 	case PRPTY:
137df930be7Sderaadt 		return 8 + (sqp->desc) - prop;
138df930be7Sderaadt 	}
139df930be7Sderaadt }
140df930be7Sderaadt /*
141bba3186fSpjanzen  *	This routine accepts bids for the current piece of property.
142df930be7Sderaadt  */
143bb3b10f2Spjanzen void
bid(void)144*211c4183Smestre bid(void)
145bb3b10f2Spjanzen {
146df930be7Sderaadt 	static bool	in[MAX_PL];
147bb3b10f2Spjanzen 	int		i, num_in, cur_max;
148bb3b10f2Spjanzen 	char		buf[257];
149df930be7Sderaadt 	int		cur_bid;
150df930be7Sderaadt 
151df930be7Sderaadt 	printf("\nSo it goes up for auction.  Type your bid after your name\n");
152df930be7Sderaadt 	for (i = 0; i < num_play; i++)
153df930be7Sderaadt 		in[i] = TRUE;
154df930be7Sderaadt 	i = -1;
155df930be7Sderaadt 	cur_max = 0;
156df930be7Sderaadt 	num_in = num_play;
157df930be7Sderaadt 	while (num_in > 1 || (cur_max == 0 && num_in > 0)) {
1584318df1eSpjanzen 		i = (i + 1) % num_play;
159df930be7Sderaadt 		if (in[i]) {
160df930be7Sderaadt 			do {
161bba3186fSpjanzen 				(void)snprintf(buf, sizeof(buf), "%s: ", name_list[i]);
162df930be7Sderaadt 				cur_bid = get_int(buf);
163df930be7Sderaadt 				if (cur_bid == 0) {
164df930be7Sderaadt 					in[i] = FALSE;
165df930be7Sderaadt 					if (--num_in == 0)
166df930be7Sderaadt 						break;
167bba3186fSpjanzen 				} else if (cur_bid <= cur_max) {
168df930be7Sderaadt 					printf("You must bid higher than %d to stay in\n", cur_max);
169df930be7Sderaadt 					printf("(bid of 0 drops you out)\n");
170bba3186fSpjanzen 				} else if (cur_bid > play[i].money) {
171bba3186fSpjanzen 					printf("You can't bid more than your cash ($%d)\n",
172bba3186fSpjanzen 					    play[i].money);
173bba3186fSpjanzen 					cur_bid = -1;
174df930be7Sderaadt 				}
175df930be7Sderaadt 			} while (cur_bid != 0 && cur_bid <= cur_max);
176df930be7Sderaadt 			cur_max = (cur_bid ? cur_bid : cur_max);
177df930be7Sderaadt 		}
178df930be7Sderaadt 	}
179df930be7Sderaadt 	if (cur_max != 0) {
180df930be7Sderaadt 		while (!in[i])
1814318df1eSpjanzen 			i = (i + 1) % num_play;
182df930be7Sderaadt 		printf("It goes to %s (%d) for $%d\n",play[i].name,i+1,cur_max);
183bba3186fSpjanzen 		buy(i, &board[(int)cur_p->loc]);
184df930be7Sderaadt 		play[i].money -= cur_max;
185df930be7Sderaadt 	}
186df930be7Sderaadt 	else
187df930be7Sderaadt 		printf("Nobody seems to want it, so we'll leave it for later\n");
188df930be7Sderaadt }
189df930be7Sderaadt /*
190df930be7Sderaadt  *	This routine calculates the value of the property
191df930be7Sderaadt  * of given player.
192df930be7Sderaadt  */
193bb3b10f2Spjanzen int
prop_worth(PLAY * plp)194*211c4183Smestre prop_worth(PLAY *plp)
195bb3b10f2Spjanzen {
196bb3b10f2Spjanzen 	OWN	*op;
197bb3b10f2Spjanzen 	int	worth;
198df930be7Sderaadt 
199df930be7Sderaadt 	worth = 0;
200df930be7Sderaadt 	for (op = plp->own_list; op; op = op->next) {
201df930be7Sderaadt 		if (op->sqr->type == PRPTY && op->sqr->desc->monop)
202df930be7Sderaadt 			worth += op->sqr->desc->mon_desc->h_cost * 50 *
203df930be7Sderaadt 			    op->sqr->desc->houses;
204df930be7Sderaadt 		worth += op->sqr->cost;
205df930be7Sderaadt 	}
206df930be7Sderaadt 	return worth;
207df930be7Sderaadt }
208