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