X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/a77b3f8edc13dc6efdbcf80e336689cfa1de08ab..087b6e7b7c1861c118eb976452acc50a866f916f:/monop/houses.c?ds=sidebyside diff --git a/monop/houses.c b/monop/houses.c index bda0ad7b..ce313cc3 100644 --- a/monop/houses.c +++ b/monop/houses.c @@ -1,4 +1,4 @@ -/* $NetBSD: houses.c,v 1.4 1997/10/12 17:45:11 christos Exp $ */ +/* $NetBSD: houses.c,v 1.15 2012/06/19 05:35:32 dholland Exp $ */ /* * Copyright (c) 1980, 1993 @@ -12,11 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -38,32 +34,35 @@ #if 0 static char sccsid[] = "@(#)houses.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: houses.c,v 1.4 1997/10/12 17:45:11 christos Exp $"); +__RCSID("$NetBSD: houses.c,v 1.15 2012/06/19 05:35:32 dholland Exp $"); #endif #endif /* not lint */ -#include "monop.ext" +#include "monop.h" -static char *names[N_MON+2], - cur_prop[80]; +static const char *names[N_MON+2]; +static char cur_prop[80]; static MON *monops[N_MON]; -static void buy_h __P((MON *)); -static void sell_h __P((MON *)); -static void list_cur __P((MON *)); +static void buy_h(MON *); +static void sell_h(MON *); +static void list_cur(MON *); +static int get_avail_houses(void); +static int get_avail_hotels(void); +static bool ready_for_hotels(MON *); + /* * These routines deal with buying and selling houses */ void -buy_houses() +buy_houses(void) { - int num_mon; - MON *mp; - OWN *op; - bool good,got_morg; - int i,p; + MON *mp; + OWN *op; + bool good, got_morg; + int i,p; over: num_mon = 0; @@ -79,9 +78,9 @@ over: got_morg = good = FALSE; for (i = 0; i < mp->num_in; i++) { if (op->sqr->desc->morg) - got_morg++; + got_morg = TRUE; if (op->sqr->desc->houses != 5) - good++; + good = TRUE; op = op->next; } if (!good || got_morg) @@ -103,7 +102,9 @@ over: else { names[num_mon++] = "done"; names[num_mon--] = 0; - if ((p=getinp("Which property do you wish to buy houses for? ", names)) == num_mon) + if ((p = getinp( + "Which property do you wish to buy houses for? ", + names)) == num_mon) return; buy_h(monops[p]); goto over; @@ -111,19 +112,34 @@ over: } static void -buy_h(mnp) -MON *mnp; +buy_h(MON *mnp) { - - int i; - MON *mp; - int price; - short input[3],temp[3]; - int tot; - PROP *pp; + int i; + MON *mp; + int price; + short input[3], result[3]; + int wanted_houses, wanted_hotels; + int total_purchase; + PROP *pp; + int avail_houses, avail_hotels; + bool buying_hotels; mp = mnp; price = mp->h_cost * 50; + + avail_houses = get_avail_houses(); + avail_hotels = get_avail_hotels(); + buying_hotels = ready_for_hotels(mnp); + + if (avail_houses == 0 && !buying_hotels) { + printf("Building shortage: no houses available."); + return; + } + if (avail_hotels == 0 && buying_hotels) { + printf("Building shortage: no hotels available."); + return; + } + blew_it: list_cur(mp); printf("Houses will cost $%d\n", price); @@ -134,34 +150,64 @@ over: if (pp->houses == 5) { printf("%s (H):\n", mp->sq[i]->name); input[i] = 0; - temp[i] = 5; + result[i] = 5; continue; } - (void)sprintf(cur_prop, "%s (%d): ", + (void)snprintf(cur_prop, sizeof(cur_prop), "%s (%d): ", mp->sq[i]->name, pp->houses); input[i] = get_int(cur_prop); - temp[i] = input[i] + pp->houses; - if (temp[i] > 5) { + result[i] = input[i] + pp->houses; + if (result[i] > 5 || result[i] < 0) { printf("That's too many. The most you can buy is %d\n", - 5 - pp->houses); + 5 - pp->houses); goto over; } } - if (mp->num_in == 3 && (abs(temp[0] - temp[1]) > 1 || - abs(temp[0] - temp[2]) > 1 || abs(temp[1] - temp[2]) > 1)) { + if (mp->num_in == 3 && + (abs(result[0] - result[1]) > 1 || + abs(result[0] - result[2]) > 1 || + abs(result[1] - result[2]) > 1)) { err: printf("That makes the spread too wide. Try again\n"); goto blew_it; } - else if (mp->num_in == 2 && abs(temp[0] - temp[1]) > 1) + else if (mp->num_in == 2 && abs(result[0] - result[1]) > 1) goto err; - for (tot = i = 0; i < mp->num_in; i++) - tot += input[i]; - if (tot) { - printf("You asked for %d houses for $%d\n", tot, tot * price); + + wanted_houses = 0; + wanted_hotels = 0; + total_purchase = 0; + + for (i = 0; i < mp->num_in; i++) { + wanted_houses += input[i]; + total_purchase += input[i]; + if (result[i] == 5 && input[i] > 0) { + wanted_hotels++; + wanted_houses--; + } + } + if (wanted_houses > avail_houses) { + printf("You have asked for %d %s but only %d are available. " + "Try again\n", + wanted_houses, wanted_houses == 1 ? "house" : "houses", + avail_houses); + goto blew_it; + } else if (wanted_hotels > avail_hotels) { + printf("You have asked for %d %s but only %d are available. " + "Try again\n", + wanted_hotels, wanted_hotels == 1 ? "hotel" : "hotels", + avail_hotels); + goto blew_it; + } + + if (total_purchase) { + printf("You asked for %d %s and %d %s for $%d\n", + wanted_houses, wanted_houses == 1 ? "house" : "houses", + wanted_hotels, wanted_hotels == 1 ? "hotel" : "hotels", + total_purchase * price); if (getyn("Is that ok? ") == 0) { - cur_p->money -= tot * price; - for (tot = i = 0; i < mp->num_in; i++) - mp->sq[i]->desc->houses = temp[i]; + cur_p->money -= total_purchase * price; + for (i = 0; i < mp->num_in; i++) + mp->sq[i]->desc->houses = result[i]; } } } @@ -170,19 +216,18 @@ err: printf("That makes the spread too wide. Try again\n"); * This routine sells houses. */ void -sell_houses() +sell_houses(void) { - - int num_mon; - MON *mp; - OWN *op; - bool good; - int p; + int num_mon; + MON *mp; + OWN *op; + bool good; + int p; over: num_mon = 0; good = TRUE; - for (op = cur_p->own_list; op; op = op->next) + for (op = cur_p->own_list; op;) if (op->sqr->type == PRPTY && op->sqr->desc->monop) { mp = op->sqr->desc->mon_desc; names[num_mon] = (monops[num_mon]=mp)->name; @@ -190,12 +235,13 @@ over: good = 0; do if (!good && op->sqr->desc->houses != 0) - good++; + good = TRUE; while (op->next && op->sqr->desc->mon_desc == mp - && (op=op->next)); + && (op = op->next)); if (!good) --num_mon; - } + } else + op = op->next; if (num_mon == 0) { printf("You don't have any houses to sell!!\n"); return; @@ -205,7 +251,9 @@ over: else { names[num_mon++] = "done"; names[num_mon--] = 0; - if ((p=getinp("Which property do you wish to sell houses from? ", names)) == num_mon) + if ((p = getinp( + "Which property do you wish to sell houses from? ", + names)) == num_mon) return; sell_h(monops[p]); notify(); @@ -214,16 +262,14 @@ over: } static void -sell_h(mnp) -MON *mnp; +sell_h(MON *mnp) { - - int i; - MON *mp; - int price; - short input[3],temp[3]; - int tot; - PROP *pp; + int i; + MON *mp; + int price; + short input[3],temp[3]; + int tot; + PROP *pp; mp = mnp; price = mp->h_cost * 25; @@ -240,14 +286,17 @@ over: continue; } if (pp->houses < 5) - (void)sprintf(cur_prop,"%s (%d): ", + (void)snprintf(cur_prop, sizeof(cur_prop), "%s (%d): ", mp->sq[i]->name,pp->houses); else - (void)sprintf(cur_prop,"%s (H): ",mp->sq[i]->name); + (void)snprintf(cur_prop, sizeof(cur_prop), "%s (H): ", + mp->sq[i]->name); input[i] = get_int(cur_prop); temp[i] = pp->houses - input[i]; if (temp[i] < 0) { - printf("That's too many. The most you can sell is %d\n", pp->houses); + printf( + "That's too many. The most you can sell is %d\n", + pp->houses); goto over; } } @@ -261,7 +310,8 @@ err: printf("That makes the spread too wide. Try again\n"); for (tot = i = 0; i < mp->num_in; i++) tot += input[i]; if (tot) { - printf("You asked to sell %d houses for $%d\n",tot,tot * price); + printf("You asked to sell %d house%s for $%d\n", tot, + tot == 1 ? "" : "s", tot * price); if (getyn("Is that ok? ") == 0) { cur_p->money += tot * price; for (tot = i = 0; i < mp->num_in; i++) @@ -271,12 +321,10 @@ err: printf("That makes the spread too wide. Try again\n"); } static void -list_cur(mp) -MON *mp; +list_cur(MON *mp) { - - int i; - SQUARE *sqp; + int i; + SQUARE *sqp; for (i = 0; i < mp->num_in; i++) { sqp = mp->sq[i]; @@ -287,3 +335,53 @@ MON *mp; } putchar('\n'); } + +static int +get_avail_houses(void) +{ + int i, c; + SQUARE *sqp; + + c = 0; + for (i = 0; i < N_SQRS; i++) { + sqp = &board[i]; + if (sqp->type == PRPTY && sqp->owner >= 0 && sqp->desc->monop) { + if (sqp->desc->houses < 5 && sqp->desc->houses > 0) + c += sqp->desc->houses; + } + } + return(N_HOUSE - c); +} + +static int +get_avail_hotels(void) +{ + int i, c; + SQUARE *sqp; + + c = 0; + for (i = 0; i < N_SQRS; i++) { + sqp = &board[i]; + if (sqp->type == PRPTY && sqp->owner >= 0 && sqp->desc->monop) { + if (sqp->desc->houses == 5) + c++; + } + } + return(N_HOTEL - c); +} + +/* + * If we can put a hotel on, we can't put any houses on, and if we can + * put houses on, then we can't put a hotel on yet. + */ +static bool +ready_for_hotels(MON *mp) +{ + int i; + + for (i = 0; i < mp->num_in; i++) { + if (mp->sq[i]->desc->houses < 4) + return(FALSE); + } + return(TRUE); +}