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