xref: /dragonfly/games/monop/morg.c (revision 631c21f2)
1 /*	$NetBSD: morg.c,v 1.19 2012/06/19 05:35:32 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  *	@(#)morg.c	8.1 (Berkeley) 5/31/93
32  */
33 
34 #include "monop.h"
35 
36 /*
37  *	These routines deal with mortgaging.
38  */
39 
40 static const char	*names[MAX_PRP+2],
41 		*const morg_coms[]	= {
42 			"quit",		/*  0 */
43 			"print",	/*  1 */
44 			"where",	/*  2 */
45 			"own holdings",	/*  3 */
46 			"holdings",	/*  4 */
47 			"mortgage",	/*  5 */
48 			"unmortgage",	/*  6 */
49 			"buy",		/*  7 */
50 			"sell",		/*  8 */
51 			"card",		/*  9 */
52 			"pay",		/* 10 */
53 			"trade",	/* 11 */
54 			"resign",	/* 12 */
55 			"save game",	/* 13 */
56 			"restore game",	/* 14 */
57 			0
58 		};
59 
60 static short	square[MAX_PRP+2];
61 
62 static int	num_good, got_houses;
63 
64 
65 static int set_mlist(void);
66 static void m(int);
67 static int set_umlist(void);
68 static void unm(int);
69 
70 /*
71  *	This routine is the command level response the mortgage command.
72  * it gets the list of mortgageable property and asks which are to
73  * be mortgaged.
74  */
75 void
76 mortgage(void)
77 {
78 	int propnum;
79 
80 	for (;;) {
81 		if (set_mlist() == 0) {
82 			if (got_houses)
83 				printf("You can't mortgage property with "
84 				    "houses on it.\n");
85 			else
86 				printf("You don't have any un-mortgaged "
87 				    "property.\n");
88 			return;
89 		}
90 		if (num_good == 1) {
91 			printf("Your only mortgageable property is %s\n",
92 			    names[0]);
93 			if (getyn("Do you want to mortgage it? ") == 0)
94 				m(square[0]);
95 			return;
96 		}
97 		propnum = getinp("Which property do you want to mortgage? ",
98 				names);
99 		if (propnum == num_good)
100 			return;
101 		m(square[propnum]);
102 		notify();
103 	}
104 }
105 
106 /*
107  *	This routine sets up the list of mortgageable property
108  */
109 static int
110 set_mlist(void)
111 {
112 	OWN *op;
113 
114 	num_good = 0;
115 	for (op = cur_p->own_list; op; op = op->next)
116 		if (!op->sqr->desc->morg) {
117 			if (op->sqr->type == PRPTY && op->sqr->desc->houses)
118 				got_houses++;
119 			else {
120 				names[num_good] = op->sqr->name;
121 				square[num_good++] = sqnum(op->sqr);
122 			}
123 		}
124 	names[num_good++] = "done";
125 	names[num_good--] = 0;
126 	return num_good;
127 }
128 
129 /*
130  *	This routine actually mortgages the property.
131  */
132 static void
133 m(int propnum)
134 {
135 	int price;
136 
137 	price = board[propnum].cost/2;
138 	board[propnum].desc->morg = TRUE;
139 	printf("That got you $%d\n",price);
140 	cur_p->money += price;
141 }
142 
143 /*
144  *	This routine is the command level repsponse to the unmortgage
145  * command.  It gets the list of mortgaged property and asks which are
146  * to be unmortgaged.
147  */
148 void
149 unmortgage(void)
150 {
151 	int propnum;
152 
153 	for (;;) {
154 		if (set_umlist() == 0) {
155 			printf("You don't have any mortgaged property.\n");
156 			return;
157 		}
158 		if (num_good == 1) {
159 			printf("Your only mortgaged property is %s\n",
160 			    names[0]);
161 			if (getyn("Do you want to unmortgage it? ") == 0)
162 				unm(square[0]);
163 			return;
164 		}
165 		propnum = getinp("Which property do you want to unmortgage? ",
166 		    names);
167 		if (propnum == num_good)
168 			return;
169 		unm(square[propnum]);
170 	}
171 }
172 
173 /*
174  *	This routine sets up the list of mortgaged property
175  */
176 static int
177 set_umlist(void)
178 {
179 	OWN *op;
180 
181 	num_good = 0;
182 	for (op = cur_p->own_list; op; op = op->next)
183 		if (op->sqr->desc->morg) {
184 			names[num_good] = op->sqr->name;
185 			square[num_good++] = sqnum(op->sqr);
186 		}
187 	names[num_good++] = "done";
188 	names[num_good--] = 0;
189 	return num_good;
190 }
191 
192 /*
193  *	This routine actually unmortgages the property
194  */
195 static void
196 unm(int propnum)
197 {
198 	int price;
199 
200 	price = board[propnum].cost/2;
201 	board[propnum].desc->morg = FALSE;
202 	price += price/10;
203 	printf("That cost you $%d\n",price);
204 	cur_p->money -= price;
205 	(void)set_umlist();
206 }
207 
208 /*
209  *	This routine forces the indebted player to fix his
210  * financial woes.  It is fine to have $0 but not to be in debt.
211  */
212 void
213 force_morg(void)
214 {
215 	told_em = fixing = TRUE;
216 	while (cur_p->money < 0) {
217 		told_em = FALSE;
218 		(*func[(getinp("How are you going to fix it up? ", morg_coms))])();
219 		notify();
220 	}
221 	fixing = FALSE;
222 }
223