1 /* $NetBSD: prop.c,v 1.19 2008/02/24 05:53:33 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1980, 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 35 static char sccsid[] = "@(#)prop.c 8.1 (Berkeley) 5/31/93"; 36 #else 37 __RCSID("$NetBSD: prop.c,v 1.19 2008/02/24 05:53:33 dholland Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 #include <stdlib.h> 42 43 #include "monop.h" 44 45 static int value(SQUARE *); 46 47 /* 48 * This routine deals with buying property, setting all the 49 * appropriate flags. 50 */ 51 void 52 buy(playernum, sqrp) 53 int playernum; 54 SQUARE *sqrp; 55 { 56 trading = FALSE; 57 sqrp->owner = playernum; 58 add_list(playernum, &(play[playernum].own_list), cur_p->loc); 59 } 60 61 /* 62 * This routine adds an item to the list. 63 */ 64 void 65 add_list(plr, head, op_sqr) 66 int plr; 67 OWN **head; 68 int op_sqr; 69 { 70 int val; 71 OWN *tp, *last_tp; 72 OWN *op; 73 74 op = calloc(1, sizeof (OWN)); 75 if (op == NULL) 76 errx(1, "out of memory"); 77 op->sqr = &board[op_sqr]; 78 val = value(op->sqr); 79 last_tp = NULL; 80 for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next) 81 if (val == value(tp->sqr)) { 82 free(op); 83 return; 84 } 85 else 86 last_tp = tp; 87 op->next = tp; 88 if (last_tp != NULL) 89 last_tp->next = op; 90 else 91 *head = op; 92 if (!trading) 93 set_ownlist(plr); 94 } 95 96 /* 97 * This routine deletes property from the list. 98 */ 99 void 100 del_list(int plr, OWN **head, short op_sqr) 101 { 102 OWN *op, *last_op; 103 104 switch (board[op_sqr].type) { 105 case PRPTY: 106 board[op_sqr].desc->mon_desc->num_own--; 107 break; 108 case RR: 109 play[plr].num_rr--; 110 break; 111 case UTIL: 112 play[plr].num_util--; 113 break; 114 } 115 last_op = NULL; 116 for (op = *head; op; op = op->next) 117 if (op->sqr == &board[op_sqr]) 118 break; 119 else 120 last_op = op; 121 if (op == NULL) 122 return; 123 if (last_op == NULL) 124 *head = op->next; 125 else { 126 last_op->next = op->next; 127 free(op); 128 } 129 } 130 131 /* 132 * This routine calculates the value for sorting of the 133 * given square. 134 */ 135 static int 136 value(sqp) 137 SQUARE *sqp; 138 { 139 int sqr; 140 141 sqr = sqnum(sqp); 142 switch (sqp->type) { 143 case SAFE: 144 return 0; 145 default: /* Specials, etc */ 146 return 1; 147 case UTIL: 148 if (sqr == 12) 149 return 2; 150 else 151 return 3; 152 case RR: 153 return 4 + sqr/10; 154 case PRPTY: 155 return 8 + (sqp->desc) - prop; 156 } 157 } 158 159 /* 160 * This routine accepts bids for the current piece of property. 161 */ 162 void 163 bid() 164 { 165 static bool in[MAX_PL]; 166 int i, num_in, cur_max; 167 char buf[257]; 168 int cur_bid; 169 170 printf("\nSo it goes up for auction. Type your bid after your name\n"); 171 for (i = 0; i < num_play; i++) 172 in[i] = TRUE; 173 i = -1; 174 cur_max = 0; 175 num_in = num_play; 176 while (num_in > 1 || (cur_max == 0 && num_in > 0)) { 177 i = (i + 1) % num_play; 178 if (in[i]) { 179 do { 180 (void)snprintf(buf, sizeof(buf), "%s: ", 181 name_list[i]); 182 cur_bid = get_int(buf); 183 if (cur_bid == 0) { 184 in[i] = FALSE; 185 if (--num_in == 0) 186 break; 187 } else if (cur_bid <= cur_max) { 188 printf("You must bid higher than %d " 189 "to stay in\n", cur_max); 190 printf("(bid of 0 drops you out)\n"); 191 } else if (cur_bid > play[i].money) { 192 printf("You can't bid more than your cash ($%d)\n", 193 play[i].money); 194 cur_bid = -1; 195 } 196 } while (cur_bid != 0 && cur_bid <= cur_max); 197 cur_max = (cur_bid ? cur_bid : cur_max); 198 } 199 } 200 if (cur_max != 0) { 201 while (!in[i]) 202 i = (i + 1) % num_play; 203 printf("It goes to %s (%d) for $%d\n",play[i].name,i+1,cur_max); 204 buy(i, &board[cur_p->loc]); 205 play[i].money -= cur_max; 206 } 207 else 208 printf("Nobody seems to want it, so we'll leave it for " 209 "later\n"); 210 } 211 212 /* 213 * This routine calculates the value of the property 214 * of given player. 215 */ 216 int 217 prop_worth(plp) 218 PLAY *plp; 219 { 220 OWN *op; 221 int worth; 222 223 worth = 0; 224 for (op = plp->own_list; op; op = op->next) { 225 if (op->sqr->type == PRPTY && op->sqr->desc->monop) 226 worth += op->sqr->desc->mon_desc->h_cost * 50 * 227 op->sqr->desc->houses; 228 worth += op->sqr->cost; 229 } 230 return worth; 231 } 232