BSD 4_1_snap development
[unix-history] / usr / src / games / monop / prop.c
CommitLineData
3fa73c9e
C
1# include "monop.ext"
2
3/*
4 * This routine deals with buying property, setting all the
5 * appropriate flags.
6 */
7buy(player, sqrp)
8reg int player;
9reg SQUARE *sqrp; {
10
11 trading = FALSE;
12 sqrp->owner = player;
13 add_list(player, &(play[player].own_list), cur_p->loc);
14}
15/*
16 * This routine adds an item to the list.
17 */
18add_list(plr, head, op_sqr)
19int plr;
20OWN **head;
21int op_sqr; {
22
23 reg int val;
24 reg OWN *tp, *last_tp;
25 MON *mp;
26 OWN *op;
27
28 op = calloc(1, sizeof (OWN));
29 op->sqr = &board[op_sqr];
30 val = value(op->sqr);
31 last_tp = NULL;
32 for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next)
33 if (val == value(tp->sqr)) {
34 cfree(op);
35 return;
36 }
37 else
38 last_tp = tp;
39 op->next = tp;
40 if (last_tp != NULL)
41 last_tp->next = op;
42 else
43 *head = op;
44 if (!trading)
45 set_ownlist(plr);
46}
47/*
48 * This routine deletes property from the list.
49 */
50del_list(plr, head, op_sqr)
51int plr;
52OWN **head;
53shrt op_sqr; {
54
55 reg int i;
56 reg OWN *op, *last_op;
57
58 switch (board[op_sqr].type) {
59 case PRPTY:
60 board[op_sqr].desc->mon_desc->num_own--;
61 break;
62 case RR:
63 play[plr].num_rr--;
64 break;
65 case UTIL:
66 play[plr].num_util--;
67 break;
68 }
69 last_op = NULL;
70 for (op = *head; op; op = op->next)
71 if (op->sqr == &board[op_sqr])
72 break;
73 else
74 last_op = op;
75 if (last_op == NULL)
76 *head = op->next;
77 else {
78 last_op->next = op->next;
79 cfree(op);
80 }
81}
82/*
83 * This routine calculates the value for sorting of the
84 * given square.
85 */
86value(sqp)
87reg SQUARE *sqp; {
88
89 reg int sqr;
90
91 sqr = sqnum(sqp);
92 switch (sqp->type) {
93 case SAFE:
94 return 0;
95 case SPEC:
96 return 1;
97 case UTIL:
98 if (sqr == 12)
99 return 2;
100 else
101 return 3;
102 case RR:
103 return 4 + sqr/10;
104 case PRPTY:
105 return 8 + (PROP *)(sqp->desc) - prop;
106 }
107}
108/*
109 * This routine accepts bids for the current peice
110 * of property.
111 */
112bid() {
113
114 static bool in[MAX_PL];
115 reg int i, num_in, cur_max;
116 char buf[80];
117 int cur_bid;
118
119 printf("\nSo it goes up for auction. Type your bid after your name\n");
120 for (i = 0; i < num_play; i++)
121 in[i] = TRUE;
122 i = -1;
123 cur_max = 0;
124 num_in = num_play;
125 while (num_in > 1 || (cur_max == 0 && num_in > 0)) {
126 i = ++i % num_play;
127 if (in[i]) {
128 do {
129 sprintf(buf, "%s: ", name_list[i]);
130 cur_bid = get_int(buf);
131 if (cur_bid == 0) {
132 in[i] = FALSE;
133 if (--num_in == 0)
134 break;
135 }
136 else if (cur_bid <= cur_max) {
137 printf("You must bid higher than %d to stay in\n", cur_max);
138 printf("(bid of 0 drops you out)\n");
139 }
140 } while (cur_bid != 0 && cur_bid <= cur_max);
141 cur_max = (cur_bid ? cur_bid : cur_max);
142 }
143 }
144 if (cur_max != 0) {
145 while (!in[i])
146 i = ++i % num_play;
147 printf("It goes to %s (%d) for $%d\n",play[i].name,i+1,cur_max);
148 buy(i, &board[cur_p->loc]);
149 play[i].money -= cur_max;
150 }
151 else
152 printf("Nobody seems to want it, so we'll leave it for later\n");
153}
154/*
155 * This routine calculates the value of the property
156 * of given player.
157 */
158prop_worth(plp)
159reg PLAY *plp; {
160
161 reg OWN *op;
162 reg int worth;
163
164 worth = 0;
165 for (op = plp->own_list; op; op = op->next) {
166 if (op->sqr->type == PRPTY && op->sqr->desc->monop)
167 worth += op->sqr->desc->mon_desc->h_cost * 50 *
168 op->sqr->desc->houses;
169 worth += op->sqr->cost;
170 }
171 return worth;
172}