cleanup, add manual page
[unix-history] / usr / src / games / monop / houses.c
CommitLineData
e10e1c15 1/*
d99e6414 2 * Copyright (c) 1980 Regents of the University of California.
e10e1c15
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
d99e6414
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e10e1c15
KB
16 */
17
8cc451b4 18#ifndef lint
d99e6414 19static char sccsid[] = "@(#)houses.c 5.4 (Berkeley) %G%";
e10e1c15 20#endif /* not lint */
8cc451b4
KB
21
22# include "monop.ext"
23
24static char *names[N_MON+2],
25 cur_prop[80];
26
27static MON *monops[N_MON];
28
29/*
30 * These routines deal with buying and selling houses
31 */
32buy_houses() {
33
34 reg int num_mon;
35 reg MON *mp;
36 reg OWN *op;
37 bool good,got_morg;
38 int i,p;
39
40over:
41 num_mon = 0;
42 good = TRUE;
43 got_morg = FALSE;
44 for (op = cur_p->own_list; op && op->sqr->type != PRPTY; op = op->next)
45 continue;
46 while (op)
47 if (op->sqr->desc->monop) {
48 mp = op->sqr->desc->mon_desc;
49 names[num_mon] = (monops[num_mon]=mp)->name;
50 num_mon++;
51 got_morg = good = FALSE;
52 for (i = 0; i < mp->num_in; i++) {
53 if (op->sqr->desc->morg)
54 got_morg++;
55 if (op->sqr->desc->houses != 5)
56 good++;
57 op = op->next;
58 }
59 if (!good || got_morg)
60 --num_mon;
61 }
62 else
63 op = op->next;
64 if (num_mon == 0) {
65 if (got_morg)
66 printf("You can't build on mortgaged monopolies.\n");
67 else if (!good)
68 printf("You can't build any more.\n");
69 else
70 printf("But you don't have any monopolies!!\n");
71 return;
72 }
73 if (num_mon == 1)
74 buy_h(monops[0]);
75 else {
76 names[num_mon++] = "done";
77 names[num_mon--] = 0;
78 if ((p=getinp("Which property do you wish to buy houses for? ", names)) == num_mon)
79 return;
80 buy_h(monops[p]);
81 goto over;
82 }
83}
84
85buy_h(mnp)
86MON *mnp; {
87
88 reg int i;
89 reg MON *mp;
90 reg int price;
91 shrt input[3],temp[3];
92 int tot;
93 PROP *pp;
94
95 mp = mnp;
96 price = mp->h_cost * 50;
97blew_it:
98 list_cur(mp);
99 printf("Houses will cost $%d\n", price);
100 printf("How many houses do you wish to buy for\n");
101 for (i = 0; i < mp->num_in; i++) {
102 pp = mp->sq[i]->desc;
103over:
104 if (pp->houses == 5) {
105 printf("%s (H):\n", mp->sq[i]->name);
106 input[i] = 0;
107 temp[i] = 5;
108 continue;
109 }
e1123b44
KB
110 (void)sprintf(cur_prop, "%s (%d): ",
111 mp->sq[i]->name, pp->houses);
8cc451b4
KB
112 input[i] = get_int(cur_prop);
113 temp[i] = input[i] + pp->houses;
114 if (temp[i] > 5) {
115 printf("That's too many. The most you can buy is %d\n",
116 5 - pp->houses);
117 goto over;
118 }
119 }
120 if (mp->num_in == 3 && (abs(temp[0] - temp[1]) > 1 ||
121 abs(temp[0] - temp[2]) > 1 || abs(temp[1] - temp[2]) > 1)) {
122err: printf("That makes the spread too wide. Try again\n");
123 goto blew_it;
124 }
125 else if (mp->num_in == 2 && abs(temp[0] - temp[1]) > 1)
126 goto err;
127 for (tot = i = 0; i < mp->num_in; i++)
128 tot += input[i];
129 if (tot) {
130 printf("You asked for %d houses for $%d\n", tot, tot * price);
131 if (getyn("Is that ok? ", yn) == 0) {
132 cur_p->money -= tot * price;
133 for (tot = i = 0; i < mp->num_in; i++)
134 mp->sq[i]->desc->houses = temp[i];
135 }
136 }
137}
138
139/*
140 * This routine sells houses.
141 */
142sell_houses() {
143
144 reg int num_mon;
145 reg MON *mp;
146 reg OWN *op;
147 bool good;
148 int p;
149
150over:
151 num_mon = 0;
152 good = TRUE;
153 for (op = cur_p->own_list; op; op = op->next)
154 if (op->sqr->type == PRPTY && op->sqr->desc->monop) {
155 mp = op->sqr->desc->mon_desc;
156 names[num_mon] = (monops[num_mon]=mp)->name;
157 num_mon++;
158 good = 0;
159 do
160 if (!good && op->sqr->desc->houses != 0)
161 good++;
162 while (op->next && op->sqr->desc->mon_desc == mp
163 && (op=op->next));
164 if (!good)
165 --num_mon;
166 }
167 if (num_mon == 0) {
168 printf("You don't have any houses to sell!!\n");
169 return;
170 }
171 if (num_mon == 1)
172 sell_h(monops[0]);
173 else {
174 names[num_mon++] = "done";
175 names[num_mon--] = 0;
176 if ((p=getinp("Which property do you wish to sell houses from? ", names)) == num_mon)
177 return;
178 sell_h(monops[p]);
179 notify();
180 goto over;
181 }
182}
183
184sell_h(mnp)
185MON *mnp; {
186
187 reg int i;
188 reg MON *mp;
189 reg int price;
190 shrt input[3],temp[3];
191 int tot;
192 PROP *pp;
193
194 mp = mnp;
195 price = mp->h_cost * 25;
196blew_it:
197 printf("Houses will get you $%d apiece\n", price);
198 list_cur(mp);
199 printf("How many houses do you wish to sell from\n");
200 for (i = 0; i < mp->num_in; i++) {
201 pp = mp->sq[i]->desc;
202over:
203 if (pp->houses == 0) {
204 printf("%s (0):\n", mp->sq[i]->name);
205 input[i] = temp[i] = 0;
206 continue;
207 }
208 if (pp->houses < 5)
e1123b44
KB
209 (void)sprintf(cur_prop,"%s (%d): ",
210 mp->sq[i]->name,pp->houses);
8cc451b4 211 else
e1123b44 212 (void)sprintf(cur_prop,"%s (H): ",mp->sq[i]->name);
8cc451b4
KB
213 input[i] = get_int(cur_prop);
214 temp[i] = pp->houses - input[i];
215 if (temp[i] < 0) {
216 printf("That's too many. The most you can sell is %d\n", pp->houses);
217 goto over;
218 }
219 }
220 if (mp->num_in == 3 && (abs(temp[0] - temp[1]) > 1 ||
221 abs(temp[0] - temp[2]) > 1 || abs(temp[1] - temp[2]) > 1)) {
222err: printf("That makes the spread too wide. Try again\n");
223 goto blew_it;
224 }
225 else if (mp->num_in == 2 && abs(temp[0] - temp[1]) > 1)
226 goto err;
227 for (tot = i = 0; i < mp->num_in; i++)
228 tot += input[i];
229 if (tot) {
230 printf("You asked to sell %d houses for $%d\n",tot,tot * price);
231 if (getyn("Is that ok? ", yn) == 0) {
232 cur_p->money += tot * price;
233 for (tot = i = 0; i < mp->num_in; i++)
234 mp->sq[i]->desc->houses = temp[i];
235 }
236 }
237}
238
239list_cur(mp)
240reg MON *mp; {
241
242 reg int i;
243 reg SQUARE *sqp;
244
245 for (i = 0; i < mp->num_in; i++) {
246 sqp = mp->sq[i];
247 if (sqp->desc->houses == 5)
248 printf("%s (H) ", sqp->name);
249 else
250 printf("%s (%d) ", sqp->name, sqp->desc->houses);
251 }
252 putchar('\n');
253}