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