summaryrefslogtreecommitdiffstats
path: root/monop
diff options
context:
space:
mode:
authorcgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
committercgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
commit77e3814f0c0e3dea4d0032e25666f77e6f83bfff (patch)
tree7eddfcbf3dd12089e71dc3fafb0a106c5c5766c7 /monop
parente81d63576b2e46ab90da7d75fa155ea57ee4d32e (diff)
downloadbsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.gz
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.zst
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.zip
initial import of 386bsd-0.1 sources
Diffstat (limited to 'monop')
-rw-r--r--monop/Makefile24
-rw-r--r--monop/brd.dat78
-rw-r--r--monop/cards.c208
-rw-r--r--monop/cards.inp122
-rw-r--r--monop/deck.h48
-rw-r--r--monop/execute.c262
-rw-r--r--monop/getinp.c116
-rw-r--r--monop/houses.c269
-rw-r--r--monop/initdeck.c184
-rw-r--r--monop/jail.c127
-rw-r--r--monop/misc.c359
-rw-r--r--monop/mon.dat44
-rw-r--r--monop/monop.6191
-rw-r--r--monop/monop.c162
-rw-r--r--monop/monop.def124
-rw-r--r--monop/monop.ext57
-rw-r--r--monop/monop.h137
-rw-r--r--monop/morg.c210
-rw-r--r--monop/pathnames.h36
-rw-r--r--monop/print.c192
-rw-r--r--monop/prop.c211
-rw-r--r--monop/prop.dat58
-rw-r--r--monop/rent.c92
-rw-r--r--monop/roll.c74
-rw-r--r--monop/spec.c86
-rw-r--r--monop/trade.c306
26 files changed, 3777 insertions, 0 deletions
diff --git a/monop/Makefile b/monop/Makefile
new file mode 100644
index 00000000..b7909b58
--- /dev/null
+++ b/monop/Makefile
@@ -0,0 +1,24 @@
+# @(#)Makefile 5.5 (Berkeley) 5/11/90
+
+PROG= monop
+SRCS= monop.c cards.c execute.c getinp.c houses.c jail.c misc.c morg.c \
+ print.c prop.c rent.c roll.c spec.c trade.c
+MAN6= monop.0
+DPADD= ${LIBCOMPAT}
+LDADD= -lcompat
+HIDEGAME=hidegame
+CLEANFILES+=initdeck cards.pck
+
+all: cards.pck
+
+cards.pck: initdeck
+ ./initdeck ${.CURDIR}/cards.inp
+
+initdeck: initdeck.c
+ ${CC} ${CFLAGS} -o ${.TARGET} ${.CURDIR}/initdeck.c
+
+beforeinstall:
+ install -o ${BINOWN} -g ${BINGRP} -m 444 cards.pck \
+ ${DESTDIR}/usr/share/games
+
+.include <bsd.prog.mk>
diff --git a/monop/brd.dat b/monop/brd.dat
new file mode 100644
index 00000000..60586fcd
--- /dev/null
+++ b/monop/brd.dat
@@ -0,0 +1,78 @@
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)brd.dat 5.4 (Berkeley) 4/8/91
+ */
+
+/* name (COLOR) owner type desc cost */
+
+{"=== GO ===", -1, SAFE, 0 },
+{"Mediterranean ave. (P)", -1, PRPTY, &prop[0], 60 },
+{"Community Chest i", -1, CC, },
+{"Baltic ave. (P)", -1, PRPTY, &prop[1], 60 },
+{"Income Tax", -1, INC_TAX, },
+{"Reading RR", -1, RR, &rr[0], 200 },
+{"Oriental ave. (L)", -1, PRPTY, &prop[2], 100 },
+{"Chance i", -1, CHANCE, },
+{"Vermont ave. (L)", -1, PRPTY, &prop[3], 100 },
+{"Connecticut ave. (L)", -1, PRPTY, &prop[4], 120 },
+{"Just Visiting", -1, SAFE, 0 },
+{"St. Charles pl. (V)", -1, PRPTY, &prop[5], 140 },
+{"Electric Co.", -1, UTIL, &util[0], 150 },
+{"States ave. (V)", -1, PRPTY, &prop[6], 140 },
+{"Virginia ave. (V)", -1, PRPTY, &prop[7], 160 },
+{"Pennsylvania RR", -1, RR, &rr[1], 200 },
+{"St. James pl. (O)", -1, PRPTY, &prop[8], 180 },
+{"Community Chest ii", -1, CC, },
+{"Tennessee ave. (O)", -1, PRPTY, &prop[9], 180 },
+{"New York ave. (O)", -1, PRPTY, &prop[10], 200 },
+{"Free Parking", -1, SAFE, 0 },
+{"Kentucky ave. (R)", -1, PRPTY, &prop[11], 220 },
+{"Chance ii", -1, CHANCE, },
+{"Indiana ave. (R)", -1, PRPTY, &prop[12], 220 },
+{"Illinois ave. (R)", -1, PRPTY, &prop[13], 240 },
+{"B&O RR", -1, RR, &rr[2], 200 },
+{"Atlantic ave. (Y)", -1, PRPTY, &prop[14], 260 },
+{"Ventnor ave. (Y)", -1, PRPTY, &prop[15], 260 },
+{"Water Works", -1, UTIL, &util[1], 150 },
+{"Marvin Gardens (Y)", -1, PRPTY, &prop[16], 280 },
+{"GO TO JAIL", -1, GOTO_J, },
+{"Pacific ave. (G)", -1, PRPTY, &prop[17], 300 },
+{"N. Carolina ave. (G)", -1, PRPTY, &prop[18], 300 },
+{"Community Chest iii", -1, CC, },
+{"Pennsylvania ave. (G)", -1, PRPTY, &prop[19], 320 },
+{"Short Line RR", -1, RR, &rr[3], 200 },
+{"Chance iii", -1, CHANCE, },
+{"Park place (D)", -1, PRPTY, &prop[20], 350 },
+{"Luxury Tax", -1, LUX_TAX, },
+{"Boardwalk (D)", -1, PRPTY, &prop[21], 400 },
+{"JAIL", -1, IN_JAIL, }
diff --git a/monop/cards.c b/monop/cards.c
new file mode 100644
index 00000000..5041c089
--- /dev/null
+++ b/monop/cards.c
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)cards.c 5.4 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+# include "pathnames.h"
+
+/*
+ * These routine deal with the card decks
+ */
+
+# define GOJF 'F' /* char for get-out-of-jail-free cards */
+
+# ifndef DEV
+static char *cardfile = _PATH_CARDS;
+# else
+static char *cardfile = "cards.pck";
+# endif
+
+static FILE *deckf;
+
+/*
+ * This routine initializes the decks from the data file,
+ * which it opens.
+ */
+init_decks() {
+
+ if ((deckf=fopen(cardfile, "r")) == NULL) {
+file_err:
+ perror(cardfile);
+ exit(1);
+ }
+ if (fread(deck, sizeof (DECK), 2, deckf) != 2)
+ goto file_err;
+ set_up(&CC_D);
+ set_up(&CH_D);
+}
+/*
+ * This routine sets up the offset pointers for the given deck.
+ */
+set_up(dp)
+DECK *dp; {
+
+ reg int r1, r2;
+ int i;
+
+ dp->offsets = (long *) calloc(sizeof (long), dp->num_cards);
+ if (fread(dp->offsets, sizeof(long), dp->num_cards, deckf) != dp->num_cards) {
+ perror(cardfile);
+ exit(1);
+ }
+ dp->last_card = 0;
+ dp->gojf_used = FALSE;
+ for (i = 0; i < dp->num_cards; i++) {
+ reg long temp;
+
+ r1 = roll(1, dp->num_cards) - 1;
+ r2 = roll(1, dp->num_cards) - 1;
+ temp = dp->offsets[r2];
+ dp->offsets[r2] = dp->offsets[r1];
+ dp->offsets[r1] = temp;
+ }
+}
+/*
+ * This routine draws a card from the given deck
+ */
+get_card(dp)
+DECK *dp; {
+
+ reg char type_maj, type_min;
+ reg int num;
+ int i, per_h, per_H, num_h, num_H;
+ OWN *op;
+
+ do {
+ fseek(deckf, dp->offsets[dp->last_card], 0);
+ dp->last_card = ++(dp->last_card) % dp->num_cards;
+ type_maj = getc(deckf);
+ } while (dp->gojf_used && type_maj == GOJF);
+ type_min = getc(deckf);
+ num = getw(deckf);
+ printmes();
+ switch (type_maj) {
+ case '+': /* get money */
+ if (type_min == 'A') {
+ for (i = 0; i < num_play; i++)
+ if (i != player)
+ play[i].money -= num;
+ num = num * (num_play - 1);
+ }
+ cur_p->money += num;
+ break;
+ case '-': /* lose money */
+ if (type_min == 'A') {
+ for (i = 0; i < num_play; i++)
+ if (i != player)
+ play[i].money += num;
+ num = num * (num_play - 1);
+ }
+ cur_p->money -= num;
+ break;
+ case 'M': /* move somewhere */
+ switch (type_min) {
+ case 'F': /* move forward */
+ num -= cur_p->loc;
+ if (num < 0)
+ num += 40;
+ break;
+ case 'J': /* move to jail */
+ goto_jail();
+ return;
+ case 'R': /* move to railroad */
+ spec = TRUE;
+ num = (int)((cur_p->loc + 5)/10)*10 + 5 - cur_p->loc;
+ break;
+ case 'U': /* move to utility */
+ spec = TRUE;
+ if (cur_p->loc >= 12 && cur_p->loc < 28)
+ num = 28 - cur_p->loc;
+ else {
+ num = 12 - cur_p->loc;
+ if (num < 0)
+ num += 40;
+ }
+ break;
+ case 'B':
+ num = -num;
+ break;
+ }
+ move(num);
+ break;
+ case 'T': /* tax */
+ if (dp == &CC_D) {
+ per_h = 40;
+ per_H = 115;
+ }
+ else {
+ per_h = 25;
+ per_H = 100;
+ }
+ num_h = num_H = 0;
+ for (op = cur_p->own_list; op; op = op->next)
+ if (op->sqr->type == PRPTY)
+ if (op->sqr->desc->houses == 5)
+ ++num_H;
+ else
+ num_h += op->sqr->desc->houses;
+ num = per_h * num_h + per_H * num_H;
+ printf("You had %d Houses and %d Hotels, so that cost you $%d\n", num_h, num_H, num);
+ if (num == 0)
+ lucky("");
+ else
+ cur_p->money -= num;
+ break;
+ case GOJF: /* get-out-of-jail-free card */
+ cur_p->num_gojf++;
+ dp->gojf_used = TRUE;
+ break;
+ }
+ spec = FALSE;
+}
+/*
+ * This routine prints out the message on the card
+ */
+printmes() {
+
+ reg char c;
+
+ printline();
+ fflush(stdout);
+ while ((c = getc(deckf)) != '\0')
+ putchar(c);
+ printline();
+ fflush(stdout);
+}
diff --git a/monop/cards.inp b/monop/cards.inp
new file mode 100644
index 00000000..1867e87b
--- /dev/null
+++ b/monop/cards.inp
@@ -0,0 +1,122 @@
+FF
+>> GET OUT OF JAIL FREE <<
+Keep this card until needed or sold
+%%
+++25
+Receive for Services $25.
+%%
+++200
+Bank Error in Your Favor.
+Collect $200.
+%%
+++20
+Income Tax Refund.
+Collect $20.
+%%
+--100
+Pay Hospital $100
+%%
+++100
+Life Insurance Matures.
+Collect $100
+%%
+++45
+From sale of Stock You get $45.
+%%
+TX
+You are Assessed for street repairs.
+ $40 per House
+ $115 per Hotel
+%%
+++100
+X-mas Fund Matures.
+Collect $100.
+%%
+++11
+You have won Second Prize in a Beauty Contest
+Collect $11
+%%
+MF0
+Advance to GO
+(Collect $200)
+%%
+++100
+You inherit $100
+%%
+--150
+Pay School Tax of $150.
+%%
+MJ
+ >> GO TO JAIL <<
+Go Directly to Jail. Do not pass GO Do not collect $200.
+%%
++A50
+ >> GRAND OPERA OPENING <<
+Collect $50 from each player for opening night seats.
+%%
+--50
+Doctor's Fee: Pay $50.
+%-
+FF
+>> GET OUT OF JAIL FREE <<
+Keep this card until needed or sold
+%%
+MR
+Advance to the nearest Railroad, and pay owner
+Twice the rental to which he is otherwise entitled.
+If Railroad is unowned you may buy it from the bank
+%%
+MU
+Advance to the nearest Utility.
+If unowned, you may buy it from the bank.
+If owned, throw dice and pay oner a total of ten times
+the amount thrown.
+%%
+MB3
+Go Back 3 Spaces
+%%
+MR
+Advance to the nearest Railroad, and pay owner
+Twice the rental to which he is otherwise entitled.
+If Railroad is unowned you may buy it from the bank
+%%
+MJ
+ >> GO DIRECTLY TO JAIL <<
+Do not pass GO, Do not Collect $200.
+%%
+MF5
+Take a Ride on the Reading.
+If you pass GO, collect $200.
+%%
+MF39
+Take a Walk on the Board Walk.
+ (Advance To Board Walk)
+%%
+MF24
+Advance to Illinos Ave.
+%%
+MF0
+Advance to Go
+%%
+MF11
+Advance to St. Charles Place.
+If you pass GO, collect $200.
+%%
+TX
+Make general repairs on all of your Property.
+For Each House pay $25.
+For Each Hotel pay $100.
+%%
+-A50
+You have been elected Chairman of the Board.
+Pay each player $50.
+%%
+--15
+Pay Poor Tax of $15
+%%
+++50
+Bank pays you Dividend of $50.
+%%
+++150
+Your Building and Loan Matures.
+Collect $150.
diff --git a/monop/deck.h b/monop/deck.h
new file mode 100644
index 00000000..507b14c4
--- /dev/null
+++ b/monop/deck.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)deck.h 5.3 (Berkeley) 6/1/90
+ */
+
+# define bool char
+
+# define CC_D deck[0]
+# define CH_D deck[1]
+
+struct dk_st { /* deck description structure */
+ int num_cards; /* number of cards in deck */
+ int last_card; /* number of last card picked */
+ bool gojf_used; /* set if gojf card out of deck */
+ long *offsets; /* offests for start of cards */
+};
+
+typedef struct dk_st DECK;
diff --git a/monop/execute.c b/monop/execute.c
new file mode 100644
index 00000000..9b8889e4
--- /dev/null
+++ b/monop/execute.c
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)execute.c 5.5 (Berkeley) 2/28/91";
+#endif /* not lint */
+
+# include "monop.ext"
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <sys/time.h>
+
+# define SEGSIZE 8192
+
+typedef struct stat STAT;
+typedef struct tm TIME;
+
+extern char etext[], /* end of text space */
+ rub();
+
+static char buf[257],
+ *yn_only[] = { "yes", "no"};
+
+static bool new_play; /* set if move on to new player */
+
+/*
+ * This routine executes the given command by index number
+ */
+execute(com_num)
+reg int com_num; {
+
+ new_play = FALSE; /* new_play is true if fixing */
+ (*func[com_num])();
+ notify();
+ force_morg();
+ if (new_play)
+ next_play();
+ else if (num_doub)
+ printf("%s rolled doubles. Goes again\n", cur_p->name);
+}
+/*
+ * This routine moves a piece around.
+ */
+do_move() {
+
+ reg int r1, r2;
+ reg bool was_jail;
+
+ new_play = was_jail = FALSE;
+ printf("roll is %d, %d\n", r1=roll(1, 6), r2=roll(1, 6));
+ if (cur_p->loc == JAIL) {
+ was_jail++;
+ if (!move_jail(r1, r2)) {
+ new_play++;
+ goto ret;
+ }
+ }
+ else {
+ if (r1 == r2 && ++num_doub == 3) {
+ printf("That's 3 doubles. You go to jail\n");
+ goto_jail();
+ new_play++;
+ goto ret;
+ }
+ move(r1+r2);
+ }
+ if (r1 != r2 || was_jail)
+ new_play++;
+ret:
+ return;
+}
+/*
+ * This routine moves a normal move
+ */
+move(rl)
+reg int rl; {
+
+ reg int old_loc;
+
+ old_loc = cur_p->loc;
+ cur_p->loc = (cur_p->loc + rl) % N_SQRS;
+ if (cur_p->loc < old_loc && rl > 0) {
+ cur_p->money += 200;
+ printf("You pass %s and get $200\n", board[0].name);
+ }
+ show_move();
+}
+/*
+ * This routine shows the results of a move
+ */
+show_move() {
+
+ reg SQUARE *sqp;
+
+ sqp = &board[cur_p->loc];
+ printf("That puts you on %s\n", sqp->name);
+ switch (sqp->type) {
+ case SAFE:
+ printf("That is a safe place\n");
+ break;
+ case CC:
+ cc(); break;
+ case CHANCE:
+ chance(); break;
+ case INC_TAX:
+ inc_tax(); break;
+ case GOTO_J:
+ goto_jail(); break;
+ case LUX_TAX:
+ lux_tax(); break;
+ case PRPTY:
+ case RR:
+ case UTIL:
+ if (sqp->owner < 0) {
+ printf("That would cost $%d\n", sqp->cost);
+ if (getyn("Do you want to buy? ") == 0) {
+ buy(player, sqp);
+ cur_p->money -= sqp->cost;
+ }
+ else if (num_play > 2)
+ bid(sqp);
+ }
+ else if (sqp->owner == player)
+ printf("You own it.\n");
+ else
+ rent(sqp);
+ }
+}
+/*
+ * This routine saves the current game for use at a later date
+ */
+save() {
+
+ reg char *sp;
+ reg int outf, num;
+ time_t t;
+ int *dat_end;
+ struct stat sb;
+ unsgn start, end;
+
+ printf("Which file do you wish to save it in? ");
+ sp = buf;
+ while ((*sp++=getchar()) != '\n')
+ continue;
+ *--sp = '\0';
+
+ /*
+ * check for existing files, and confirm overwrite if needed
+ */
+
+ if (stat(buf, &sb) > -1
+ && getyn("File exists. Do you wish to overwrite? ", yn_only) > 0)
+ return;
+
+ if ((outf=creat(buf, 0644)) < 0) {
+ perror(buf);
+ return;
+ }
+ printf("\"%s\" ", buf);
+ time(&t); /* get current time */
+ strcpy(buf, ctime(&t));
+ for (sp = buf; *sp != '\n'; sp++)
+ continue;
+ *sp = '\0';
+# if 0
+ start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE;
+# else
+ start = 0;
+# endif
+ end = sbrk(0);
+ while (start < end) { /* write out entire data space */
+ num = start + 16 * 1024 > end ? end - start : 16 * 1024;
+ write(outf, start, num);
+ start += num;
+ }
+ close(outf);
+ printf("[%s]\n", buf);
+}
+/*
+ * This routine restores an old game from a file
+ */
+restore() {
+
+ reg char *sp;
+
+ printf("Which file do you wish to restore from? ");
+ for (sp = buf; (*sp=getchar()) != '\n'; sp++)
+ continue;
+ *sp = '\0';
+ rest_f(buf);
+}
+/*
+ * This does the actual restoring. It returns TRUE if the
+ * backup was successful, else false.
+ */
+rest_f(file)
+reg char *file; {
+
+ reg char *sp;
+ reg int inf, num;
+ char buf[80];
+ unsgn start, end;
+ STAT sbuf;
+
+ if ((inf=open(file, 0)) < 0) {
+ perror(file);
+ return FALSE;
+ }
+ printf("\"%s\" ", file);
+ if (fstat(inf, &sbuf) < 0) { /* get file stats */
+ perror(file);
+ exit(1);
+ }
+# if 0
+ start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE;
+# else
+ start = 0;
+# endif
+ brk(end = start + sbuf.st_size);
+ while (start < end) { /* write out entire data space */
+ num = start + 16 * 1024 > end ? end - start : 16 * 1024;
+ read(inf, start, num);
+ start += num;
+ }
+ close(inf);
+ strcpy(buf, ctime(&sbuf.st_mtime));
+ for (sp = buf; *sp != '\n'; sp++)
+ continue;
+ *sp = '\0';
+ printf("[%s]\n", buf);
+ return TRUE;
+}
diff --git a/monop/getinp.c b/monop/getinp.c
new file mode 100644
index 00000000..62ea845f
--- /dev/null
+++ b/monop/getinp.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)getinp.c 5.4 (Berkeley) 2/28/91";
+#endif /* not lint */
+
+# include <stdio.h>
+# include <ctype.h>
+
+# define reg register
+
+# define LINE 70
+
+static char buf[257];
+
+getinp(prompt, list)
+char *prompt, *list[]; {
+
+ reg int i, n_match, match;
+ char *sp;
+ int plen;
+ static int comp();
+
+ for (;;) {
+inter:
+ printf(prompt);
+ for (sp = buf; (*sp=getchar()) != '\n'; )
+ if (*sp == -1) /* check for interupted system call */
+ goto inter;
+ else if (sp != buf || *sp != ' ')
+ sp++;
+ if (buf[0] == '?' && buf[1] == '\n') {
+ printf("Valid inputs are: ");
+ for (i = 0, match = 18; list[i]; i++) {
+ if ((match+=(n_match=strlen(list[i]))) > LINE) {
+ printf("\n\t");
+ match = n_match + 8;
+ }
+ if (*list[i] == '\0') {
+ match += 8;
+ printf("<RETURN>");
+ }
+ else
+ printf(list[i]);
+ if (list[i+1])
+ printf(", ");
+ else
+ putchar('\n');
+ match += 2;
+ }
+ continue;
+ }
+ *sp = '\0';
+ for (sp = buf; *sp; sp++)
+ if (isupper(*sp))
+ *sp = tolower(*sp);
+ for (i = n_match = 0; list[i]; i++)
+ if (comp(list[i])) {
+ n_match++;
+ match = i;
+ }
+ if (n_match == 1)
+ return match;
+ else if (buf[0] != '\0')
+ printf("Illegal response: \"%s\". Use '?' to get list of valid answers\n", buf);
+ }
+}
+
+static
+comp(s1)
+char *s1; {
+
+ reg char *sp, *tsp, c;
+
+ if (buf[0] != '\0')
+ for (sp = buf, tsp = s1; *sp; ) {
+ c = isupper(*tsp) ? tolower(*tsp) : *tsp;
+ tsp++;
+ if (c != *sp++)
+ return 0;
+ }
+ else if (*s1 != '\0')
+ return 0;
+ return 1;
+}
diff --git a/monop/houses.c b/monop/houses.c
new file mode 100644
index 00000000..e59182c3
--- /dev/null
+++ b/monop/houses.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)houses.c 5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+static char *names[N_MON+2],
+ cur_prop[80];
+
+static MON *monops[N_MON];
+
+/*
+ * These routines deal with buying and selling houses
+ */
+buy_houses() {
+
+ reg int num_mon;
+ reg MON *mp;
+ reg OWN *op;
+ bool good,got_morg;
+ int i,p;
+
+over:
+ num_mon = 0;
+ good = TRUE;
+ got_morg = FALSE;
+ for (op = cur_p->own_list; op && op->sqr->type != PRPTY; op = op->next)
+ continue;
+ while (op)
+ if (op->sqr->desc->monop) {
+ mp = op->sqr->desc->mon_desc;
+ names[num_mon] = (monops[num_mon]=mp)->name;
+ num_mon++;
+ got_morg = good = FALSE;
+ for (i = 0; i < mp->num_in; i++) {
+ if (op->sqr->desc->morg)
+ got_morg++;
+ if (op->sqr->desc->houses != 5)
+ good++;
+ op = op->next;
+ }
+ if (!good || got_morg)
+ --num_mon;
+ }
+ else
+ op = op->next;
+ if (num_mon == 0) {
+ if (got_morg)
+ printf("You can't build on mortgaged monopolies.\n");
+ else if (!good)
+ printf("You can't build any more.\n");
+ else
+ printf("But you don't have any monopolies!!\n");
+ return;
+ }
+ if (num_mon == 1)
+ buy_h(monops[0]);
+ else {
+ names[num_mon++] = "done";
+ names[num_mon--] = 0;
+ if ((p=getinp("Which property do you wish to buy houses for? ", names)) == num_mon)
+ return;
+ buy_h(monops[p]);
+ goto over;
+ }
+}
+
+buy_h(mnp)
+MON *mnp; {
+
+ reg int i;
+ reg MON *mp;
+ reg int price;
+ shrt input[3],temp[3];
+ int tot;
+ PROP *pp;
+
+ mp = mnp;
+ price = mp->h_cost * 50;
+blew_it:
+ list_cur(mp);
+ printf("Houses will cost $%d\n", price);
+ printf("How many houses do you wish to buy for\n");
+ for (i = 0; i < mp->num_in; i++) {
+ pp = mp->sq[i]->desc;
+over:
+ if (pp->houses == 5) {
+ printf("%s (H):\n", mp->sq[i]->name);
+ input[i] = 0;
+ temp[i] = 5;
+ continue;
+ }
+ (void)sprintf(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) {
+ printf("That's too many. The most you can buy is %d\n",
+ 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)) {
+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)
+ 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);
+ if (getyn("Is that ok? ", yn) == 0) {
+ cur_p->money -= tot * price;
+ for (tot = i = 0; i < mp->num_in; i++)
+ mp->sq[i]->desc->houses = temp[i];
+ }
+ }
+}
+
+/*
+ * This routine sells houses.
+ */
+sell_houses() {
+
+ reg int num_mon;
+ reg MON *mp;
+ reg OWN *op;
+ bool good;
+ int p;
+
+over:
+ num_mon = 0;
+ good = TRUE;
+ for (op = cur_p->own_list; op; op = op->next)
+ if (op->sqr->type == PRPTY && op->sqr->desc->monop) {
+ mp = op->sqr->desc->mon_desc;
+ names[num_mon] = (monops[num_mon]=mp)->name;
+ num_mon++;
+ good = 0;
+ do
+ if (!good && op->sqr->desc->houses != 0)
+ good++;
+ while (op->next && op->sqr->desc->mon_desc == mp
+ && (op=op->next));
+ if (!good)
+ --num_mon;
+ }
+ if (num_mon == 0) {
+ printf("You don't have any houses to sell!!\n");
+ return;
+ }
+ if (num_mon == 1)
+ sell_h(monops[0]);
+ else {
+ names[num_mon++] = "done";
+ names[num_mon--] = 0;
+ if ((p=getinp("Which property do you wish to sell houses from? ", names)) == num_mon)
+ return;
+ sell_h(monops[p]);
+ notify();
+ goto over;
+ }
+}
+
+sell_h(mnp)
+MON *mnp; {
+
+ reg int i;
+ reg MON *mp;
+ reg int price;
+ shrt input[3],temp[3];
+ int tot;
+ PROP *pp;
+
+ mp = mnp;
+ price = mp->h_cost * 25;
+blew_it:
+ printf("Houses will get you $%d apiece\n", price);
+ list_cur(mp);
+ printf("How many houses do you wish to sell from\n");
+ for (i = 0; i < mp->num_in; i++) {
+ pp = mp->sq[i]->desc;
+over:
+ if (pp->houses == 0) {
+ printf("%s (0):\n", mp->sq[i]->name);
+ input[i] = temp[i] = 0;
+ continue;
+ }
+ if (pp->houses < 5)
+ (void)sprintf(cur_prop,"%s (%d): ",
+ mp->sq[i]->name,pp->houses);
+ else
+ (void)sprintf(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);
+ 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)) {
+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)
+ goto err;
+ 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);
+ if (getyn("Is that ok? ", yn) == 0) {
+ cur_p->money += tot * price;
+ for (tot = i = 0; i < mp->num_in; i++)
+ mp->sq[i]->desc->houses = temp[i];
+ }
+ }
+}
+
+list_cur(mp)
+reg MON *mp; {
+
+ reg int i;
+ reg SQUARE *sqp;
+
+ for (i = 0; i < mp->num_in; i++) {
+ sqp = mp->sq[i];
+ if (sqp->desc->houses == 5)
+ printf("%s (H) ", sqp->name);
+ else
+ printf("%s (%d) ", sqp->name, sqp->desc->houses);
+ }
+ putchar('\n');
+}
diff --git a/monop/initdeck.c b/monop/initdeck.c
new file mode 100644
index 00000000..b5c3b89a
--- /dev/null
+++ b/monop/initdeck.c
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)initdeck.c 5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include <stdio.h>
+# include "deck.h"
+
+/*
+ * This program initializes the card files for monopoly.
+ * It reads in a data file with Com. Chest cards, followed by
+ * the Chance card. The two are seperated by a line of "%-".
+ * All other cards are seperated by lines of "%%". In the front
+ * of the file is the data for the decks in the same order.
+ * This includes the seek pointer for the start of each card.
+ * All cards start with their execution code, followed by the
+ * string to print, terminated with a null byte.
+ */
+
+# define TRUE 1
+# define FALSE 0
+
+# define bool char
+# define reg register
+
+char *infile = "cards.inp", /* input file */
+ *outfile = "cards.pck"; /* "packed" file */
+
+extern long ftell();
+extern char *calloc();
+
+DECK deck[2];
+
+FILE *inf, *outf;
+
+main(ac, av)
+int ac;
+char *av[]; {
+
+ getargs(ac, av);
+ if ((inf = fopen(infile, "r")) == NULL) {
+ perror(infile);
+ exit(1);
+ }
+ count();
+ /*
+ * allocate space for pointers.
+ */
+ CC_D.offsets = (long *)calloc(CC_D.num_cards + 1, sizeof (long));
+ CH_D.offsets = (long *)calloc(CH_D.num_cards + 1, sizeof (long));
+ fseek(inf, 0L, 0);
+ if ((outf = fopen(outfile, "w")) == NULL) {
+ perror(outfile);
+ exit(0);
+ }
+
+ fwrite(deck, sizeof (DECK), 2, outf);
+ fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
+ fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
+ putem();
+
+ fclose(inf);
+ fseek(outf, 0, 0L);
+ fwrite(deck, sizeof (DECK), 2, outf);
+ fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
+ fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
+ fclose(outf);
+ printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards);
+ exit(0);
+}
+
+getargs(ac, av)
+int ac;
+char *av[]; {
+
+ if (ac > 1)
+ infile = av[1];
+ if (ac > 2)
+ outfile = av[2];
+}
+
+/*
+ * count the cards
+ */
+count() {
+
+ reg bool newline;
+ reg DECK *in_deck;
+ reg char c;
+
+ newline = TRUE;
+ in_deck = &CC_D;
+ while ((c=getc(inf)) != EOF)
+ if (newline && c == '%') {
+ newline = FALSE;
+ in_deck->num_cards++;
+ if (getc(inf) == '-')
+ in_deck = &CH_D;
+ }
+ else
+ newline = (c == '\n');
+ in_deck->num_cards++;
+}
+/*
+ * put strings in the file
+ */
+putem() {
+
+ reg bool newline;
+ reg DECK *in_deck;
+ reg char c;
+ reg int num;
+
+ in_deck = &CC_D;
+ CC_D.num_cards = 1;
+ CH_D.num_cards = 0;
+ CC_D.offsets[0] = ftell(outf);
+ putc(getc(inf), outf);
+ putc(getc(inf), outf);
+ for (num = 0; (c=getc(inf)) != '\n'; )
+ num = num * 10 + (c - '0');
+ putw(num, outf);
+ newline = FALSE;
+ while ((c=getc(inf)) != EOF)
+ if (newline && c == '%') {
+ putc('\0', outf);
+ newline = FALSE;
+ if (getc(inf) == '-')
+ in_deck = &CH_D;
+ while (getc(inf) != '\n')
+ continue;
+ in_deck->offsets[in_deck->num_cards++] = ftell(outf);
+ if ((c=getc(inf)) == EOF)
+ break;
+ putc(c, outf);
+ putc(c = getc(inf), outf);
+ for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
+ num = num * 10 + (c - '0');
+ putw(num, outf);
+ }
+ else {
+ putc(c, outf);
+ newline = (c == '\n');
+ }
+ putc('\0', outf);
+}
diff --git a/monop/jail.c b/monop/jail.c
new file mode 100644
index 00000000..dfad88ee
--- /dev/null
+++ b/monop/jail.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)jail.c 5.3 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+/*
+ * This routine uses a get-out-of-jail-free card to get the
+ * player out of jail.
+ */
+card() {
+
+ if (cur_p->loc != JAIL) {
+ printf("But you're not IN Jail\n");
+ return;
+ }
+ if (cur_p->num_gojf == 0) {
+ printf("But you don't HAVE a get out of jail free card\n");
+ return;
+ }
+ ret_card(cur_p);
+ cur_p->loc = 10; /* just visiting */
+ cur_p->in_jail = 0;
+}
+/*
+ * This routine returns the players get-out-of-jail-free card
+ * to a deck.
+ */
+ret_card(plr)
+reg PLAY *plr; {
+
+ plr->num_gojf--;
+ if (CC_D.gojf_used)
+ CC_D.gojf_used = FALSE;
+ else
+ CH_D.gojf_used = FALSE;
+}
+/*
+ * This routine deals with paying your way out of jail.
+ */
+pay() {
+
+ if (cur_p->loc != JAIL) {
+ printf("But you're not IN Jail\n");
+ return;
+ }
+ cur_p->loc = 10;
+ cur_p->money -= 50;
+ cur_p->in_jail = 0;
+ printf("That cost you $50\n");
+}
+/*
+ * This routine deals with a move in jail
+ */
+move_jail(r1, r2)
+reg int r1, r2; {
+
+ if (r1 != r2) {
+ printf("Sorry, that doesn't get you out\n");
+ if (++(cur_p->in_jail) == 3) {
+ printf("It's your third turn and you didn't roll doubles. You have to pay $50\n");
+ cur_p->money -= 50;
+moveit:
+ cur_p->loc = 10;
+ cur_p->in_jail = 0;
+ move(r1+r2);
+ r1 = r2 - 1; /* kludge: stop new roll w/doub */
+ return TRUE;
+ }
+ return FALSE;
+ }
+ else {
+ printf("Double roll gets you out.\n");
+ goto moveit;
+ }
+}
+printturn() {
+
+ if (cur_p->loc != JAIL)
+ return;
+ printf("(This is your ");
+ switch (cur_p->in_jail) {
+ case 0:
+ printf("1st");
+ break;
+ case 1:
+ printf("2nd");
+ break;
+ case 2:
+ printf("3rd (and final)");
+ break;
+ }
+ printf(" turn in JAIL)\n");
+}
diff --git a/monop/misc.c b/monop/misc.c
new file mode 100644
index 00000000..836437a4
--- /dev/null
+++ b/monop/misc.c
@@ -0,0 +1,359 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)misc.c 5.5 (Berkeley) 2/28/91";
+#endif /* not lint */
+
+# include "monop.ext"
+# include <ctype.h>
+# include <signal.h>
+
+# define execsh(sh) execl(sh, shell_name[roll(1, num_names)-1], 0)
+
+static char *shell_def = "/bin/csh",
+ *shell_name[] = {
+ ".Hi Mom!",
+ ".Kick Me",
+ ".I'm really the next process down",
+ ".Hi Kids!",
+ ".This space for rent",
+ ".Singin' in the rain....",
+ ".I am but a Cog in the Wheel of Life",
+ ".Look out!!! Behind you!!!!!",
+ ".Looking for a good time, sailor?",
+ ".I don't get NO respect...",
+ ".Augghh! You peeked!"
+ };
+
+static int num_names = sizeof shell_name / sizeof (char *);;
+
+char *shell_in();
+
+/*
+ * This routine executes a truncated set of commands until a
+ * "yes or "no" answer is gotten.
+ */
+getyn(prompt)
+reg char *prompt; {
+
+ reg int com;
+
+ for (;;)
+ if ((com=getinp(prompt, yn)) < 2)
+ return com;
+ else
+ (*func[com-2])();
+}
+/*
+ * This routine tells the player if he's out of money.
+ */
+notify() {
+
+ if (cur_p->money < 0)
+ printf("That leaves you $%d in debt\n", -cur_p->money);
+ else if (cur_p->money == 0)
+ printf("that leaves you broke\n");
+ else if (fixing && !told_em && cur_p->money > 0) {
+ printf("-- You are now Solvent ---\n");
+ told_em = TRUE;
+ }
+}
+/*
+ * This routine switches to the next player
+ */
+next_play() {
+
+ player = ++player % num_play;
+ cur_p = &play[player];
+ num_doub = 0;
+}
+/*
+ * This routine gets an integer from the keyboard after the
+ * given prompt.
+ */
+get_int(prompt)
+reg char *prompt; {
+
+ reg int num;
+ reg char *sp;
+ char buf[257];
+
+ for (;;) {
+inter:
+ printf(prompt);
+ num = 0;
+ for (sp = buf; (*sp=getchar()) != '\n'; sp++)
+ if (*sp == -1) /* check for interrupted system call */
+ goto inter;
+ if (sp == buf)
+ continue;
+ for (sp = buf; isspace(*sp); sp++)
+ continue;
+ for (; isdigit(*sp); sp++)
+ num = num * 10 + *sp - '0';
+ if (*sp == '\n')
+ return num;
+ else
+ printf("I can't understand that\n");
+ }
+}
+/*
+ * This routine sets the monopoly flag from the list given.
+ */
+set_ownlist(pl)
+int pl; {
+
+ reg int num; /* general counter */
+ reg MON *orig; /* remember starting monop ptr */
+ reg OWN *op; /* current owned prop */
+ OWN *orig_op; /* origianl prop before loop */
+
+ op = play[pl].own_list;
+#ifdef DEBUG
+ printf("op [%d] = play[pl [%d] ].own_list;\n", op, pl);
+#endif
+ while (op) {
+#ifdef DEBUG
+ printf("op->sqr->type = %d\n", op->sqr->type);
+#endif
+ switch (op->sqr->type) {
+ case UTIL:
+#ifdef DEBUG
+ printf(" case UTIL:\n");
+#endif
+ for (num = 0; op && op->sqr->type == UTIL; op = op->next)
+ num++;
+ play[pl].num_util = num;
+#ifdef DEBUG
+ printf("play[pl].num_util = num [%d];\n", num);
+#endif
+ break;
+ case RR:
+#ifdef DEBUG
+ printf(" case RR:\n");
+#endif
+ for (num = 0; op && op->sqr->type == RR; op = op->next) {
+#ifdef DEBUG
+ printf("iter: %d\n", num);
+ printf("op = %d, op->sqr = %d, op->sqr->type = %d\n", op, op->sqr, op->sqr->type);
+#endif
+ num++;
+ }
+ play[pl].num_rr = num;
+#ifdef DEBUG
+ printf("play[pl].num_rr = num [%d];\n", num);
+#endif
+ break;
+ case PRPTY:
+#ifdef DEBUG
+ printf(" case PRPTY:\n");
+#endif
+ orig = op->sqr->desc->mon_desc;
+ orig_op = op;
+ num = 0;
+ while (op && op->sqr->desc->mon_desc == orig) {
+#ifdef DEBUG
+ printf("iter: %d\n", num);
+#endif
+ num++;
+#ifdef DEBUG
+ printf("op = op->next ");
+#endif
+ op = op->next;
+#ifdef DEBUG
+ printf("[%d];\n", op);
+#endif
+ }
+#ifdef DEBUG
+ printf("num = %d\n");
+#endif
+ if (orig == 0) {
+ printf("panic: bad monopoly descriptor: orig = %d\n", orig);
+ printf("player # %d\n", pl+1);
+ printhold(pl);
+ printf("orig_op = %d\n", orig_op);
+ printf("orig_op->sqr->type = %d (PRPTY)\n", op->sqr->type);
+ printf("orig_op->next = %d\n", op->next);
+ printf("orig_op->sqr->desc = %d\n", op->sqr->desc);
+ printf("op = %d\n", op);
+ printf("op->sqr->type = %d (PRPTY)\n", op->sqr->type);
+ printf("op->next = %d\n", op->next);
+ printf("op->sqr->desc = %d\n", op->sqr->desc);
+ printf("num = %d\n", num);
+ }
+#ifdef DEBUG
+ printf("orig->num_in = %d\n", orig->num_in);
+#endif
+ if (num == orig->num_in)
+ is_monop(orig, pl);
+ else
+ isnot_monop(orig);
+ break;
+ }
+ }
+}
+/*
+ * This routine sets things up as if it is a new monopoly
+ */
+is_monop(mp, pl)
+reg MON *mp;
+int pl; {
+
+ reg char *sp;
+ reg int i;
+
+ mp->owner = pl;
+ mp->num_own = mp->num_in;
+ for (i = 0; i < mp->num_in; i++)
+ mp->sq[i]->desc->monop = TRUE;
+ mp->name = mp->mon_n;
+}
+/*
+ * This routine sets things up as if it is no longer a monopoly
+ */
+isnot_monop(mp)
+reg MON *mp; {
+
+ reg char *sp;
+ reg int i;
+
+ mp->owner = -1;
+ for (i = 0; i < mp->num_in; i++)
+ mp->sq[i]->desc->monop = FALSE;
+ mp->name = mp->not_m;
+}
+/*
+ * This routine gives a list of the current player's routine
+ */
+list() {
+
+ printhold(player);
+}
+/*
+ * This routine gives a list of a given players holdings
+ */
+list_all() {
+
+ reg int pl;
+
+ while ((pl=getinp("Whose holdings do you want to see? ", name_list)) < num_play)
+ printhold(pl);
+}
+/*
+ * This routine gives the players a chance before it exits.
+ */
+void
+quit() {
+
+ putchar('\n');
+ if (getyn("Do you all really want to quit? ", yn) == 0)
+ exit(0);
+ signal(SIGINT, quit);
+}
+/*
+ * This routine copies one structure to another
+ */
+cpy_st(s1, s2, size)
+reg int *s1, *s2, size; {
+
+ size /= 2;
+ while (size--)
+ *s1++ = *s2++;
+}
+/*
+ * This routine forks off a shell. It uses the users login shell
+ */
+shell_out() {
+
+ static char *shell = NULL;
+
+ printline();
+ if (shell == NULL)
+ shell = shell_in();
+ fflush(stdout);
+ if (!fork()) {
+ signal(SIGINT, SIG_DFL);
+ execsh(shell);
+ }
+ ignoresigs();
+ wait();
+ resetsigs();
+ putchar('\n');
+ printline();
+}
+/*
+ * This routine looks up the users login shell
+ */
+# include <sys/types.h>
+# include <pwd.h>
+
+char *getenv();
+
+char *
+shell_in() {
+
+ reg struct passwd *pp;
+ reg char *sp;
+
+ if ((sp = getenv("SHELL")) == NULL) {
+ pp = getpwuid(getuid());
+ if (pp->pw_shell[0] != '\0')
+ return pp->pw_shell;
+ else
+ return shell_def;
+ /*return (*(pp->pw_shell) != '\0' ? pp->pw_shell : shell_def);*/
+ }
+ return sp;
+}
+/*
+ * This routine sets things up to ignore all the signals.
+ */
+ignoresigs() {
+
+ reg int i;
+
+ for (i = 0; i < NSIG; i++)
+ signal(i, SIG_IGN);
+}
+/*
+ * This routine sets up things as they were before.
+ */
+resetsigs() {
+
+ reg int i;
+
+ for (i = 0; i < NSIG; i++)
+ signal(i, SIG_DFL);
+ signal(SIGINT, quit);
+}
diff --git a/monop/mon.dat b/monop/mon.dat
new file mode 100644
index 00000000..3c185248
--- /dev/null
+++ b/monop/mon.dat
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mon.dat 5.3 (Berkeley) 4/8/91
+ */
+
+/* name owner num_in num_own h_cost not_m mon_n sq */
+{0, -1, 2, 0, 1, "Purple", "PURPLE", {1,3}},
+{0, -1, 3, 0, 1, "Lt. Blue", "LT. BLUE", {6,8,9}},
+{0, -1, 3, 0, 2, "Violet", "VIOLET", {11,13,14}},
+{0, -1, 3, 0, 2, "Orange", "ORANGE", {16,18,19}},
+{0, -1, 3, 0, 3, "Red", "RED", {21,23,24}},
+{0, -1, 3, 0, 3, "Yellow", "YELLOW", {26,27,29}},
+{0, -1, 3, 0, 4, "Green", "GREEN", {31,32,34}},
+{0, -1, 2, 0, 4, "Dk. Blue", "DK. BLUE", {37,39}}
diff --git a/monop/monop.6 b/monop/monop.6
new file mode 100644
index 00000000..6bc7ba07
--- /dev/null
+++ b/monop/monop.6
@@ -0,0 +1,191 @@
+.\" Copyright (c) 1980 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 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
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)monop.6 6.4 (Berkeley) 6/23/90
+.\"
+.de Sc \" start command list macro
+.ie n .PD 0
+.el .PD 0.5
+.sp
+..
+.de Cm \" define command macro
+.TP 10
+.ie t .BR "\\$1" :
+.el .IR "\\$1" :
+..
+.de Ec \" end command macro
+.PD 1
+..
+.TH MONOP 6 "June 23, 1990"
+.UC 4
+.SH NAME
+monop \- Monopoly game
+.SH SYNOPSIS
+.B /usr/games/monop
+[ file ]
+.SH DESCRIPTION
+.I Monop
+is reminiscent of the Parker Brother's game Monopoly, and
+monitors a game between 1 to 9 users.
+It is assumed that the rules of Monopoly are known.
+The game follows the standard rules, with the exception that,
+if a property goes up for auction and there are only two solvent players,
+no auction is held and the property remains unowned.
+.PP
+The game, in effect, lends the player money,
+so it is possible to buy something which you cannot afford.
+However, as soon as a person goes into debt,
+he must \*(lqfix the problem\*(rq,
+.IR i.e. ,
+make himself solvent, before play can continue.
+If this is not possible, the player's property reverts to his debtee,
+either a player or the bank.
+A player can resign at any time to any person or the bank,
+which puts the property back on the board, unowned.
+.PP
+Any time that the response to a question is a
+.IR string ,
+e.g., a name, place or person, you can type `?' to get a list of valid answers.
+It is not possible to input a negative number, nor is it ever necessary.
+.Sc
+.IR "A Summary of Commands" :
+.Cm quit
+quit game: This allows you to quit the game. It asks you if you're sure.
+.Cm print
+print board: This prints out the current board.
+The columns have the following meanings (column headings are the same for the
+.BR where ,
+.BR "own holdings" ,
+and
+.B holdings
+commands):
+.PP
+.RS 10
+.TP "\w'Name\ \ 'u"
+Name
+The first ten characters of the name of the square
+.TP
+Own
+The \fInumber\fR of the owner of the property.
+.TP
+Price
+The cost of the property (if any)
+.TP
+Mg
+This field has a `*' in it if the property is mortgaged
+.TP
+#
+If the property is a Utility or Railroad, this is the number
+of such owned by the owner.
+If the property is land, this is the number of houses on it.
+.TP
+Rent
+Current rent on the property. If it is not owned, there is no rent.
+.RE
+.Cm where
+where players are: Tells you where all the players are.
+A `*' indicates the current player.
+.Cm "own\ holdings"
+List your own holdings,
+.IR i.e. ,
+money, get-out-of-jail-free cards, and property.
+.Cm holdings
+holdings list: Look at anyone's holdings.
+It will ask you whose holdings you wish to look at.
+When you are finished, type \*(lqdone\*(rq.
+.Cm shell
+shell escape: Escape to a shell. When the shell dies,
+the program continues where you left off.
+.Cm mortgage
+mortgage property:
+Sets up a list of mortgageable property, and asks which you wish to mortgage.
+.Cm unmortgage
+unmortgage property:
+Unmortgage mortgaged property.
+.Cm buy
+buy houses:
+Sets up a list of monopolies on which you can buy houses.
+If there is more than one, it asks you which you want to buy for.
+It then asks you how many for each piece of property,
+giving the current amount in parentheses after the property name.
+If you build in an unbalanced manner
+(a disparity of more than one house within the same monopoly),
+it asks you to re-input things.
+.Cm sell
+sell houses:
+Sets up a list of monopolies from which you can sell houses.
+It operates in an analogous manner to
+.I buy.
+.Cm card
+card for jail:
+Use a get-out-of-jail-free card to get out of jail.
+If you're not in jail, or you don't have one, it tells you so.
+.Cm pay
+pay for jail:
+Pay $50 to get out of jail, from whence you are put on Just Visiting.
+Difficult to do if you're not there.
+.Cm trade
+This allows you to trade with another player.
+It asks you whom you wish to trade with,
+and then asks you what each wishes to give up.
+You can get a summary at the end, and, in all cases,
+it asks for confirmation of the trade before doing it.
+.Cm resign
+Resign to another player or the bank.
+If you resign to the bank, all property reverts to its virgin state,
+and get-out-of-jail free cards revert to the deck.
+.Cm save
+save game:
+Save the current game in a file for later play.
+You can continue play after saving,
+either by adding the file in which you saved the game after the
+.I monop
+command, or by using the
+.I restore
+command (see below).
+It will ask you which file you wish to save it in,
+and, if the file exists, confirm that you wish to overwrite it.
+.Cm restore
+restore game:
+Read in a previously saved game from a file.
+It leaves the file intact.
+.Cm roll
+Roll the dice and move forward to your new location.
+If you simply hit the <RETURN> key instead of a command,
+it is the same as typing
+.IR roll .
+.Ec
+.SH AUTHOR
+Ken Arnold
+.SH FILES
+/usr/games/lib/cards.pck Chance and Community Chest cards
+.SH BUGS
+No command can be given an argument instead of a response to a query.
diff --git a/monop/monop.c b/monop/monop.c
new file mode 100644
index 00000000..4eeba06c
--- /dev/null
+++ b/monop/monop.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)monop.c 5.7 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.def"
+
+/*
+ * This program implements a monopoly game
+ */
+main(ac, av)
+reg int ac;
+reg char *av[]; {
+
+
+ srand(getpid());
+ if (ac > 1) {
+ if (!rest_f(av[1]))
+ restore();
+ }
+ else {
+ getplayers();
+ init_players();
+ init_monops();
+ }
+ num_luck = sizeof lucky_mes / sizeof (char *);
+ init_decks();
+ signal(2, quit);
+ for (;;) {
+ printf("\n%s (%d) (cash $%d) on %s\n", cur_p->name, player + 1,
+ cur_p->money, board[cur_p->loc].name);
+ printturn();
+ force_morg();
+ execute(getinp("-- Command: ", comlist));
+ }
+}
+/*
+ * This routine gets the names of the players
+ */
+getplayers() {
+
+ reg char *sp;
+ reg int i, j;
+ char buf[257];
+
+blew_it:
+ for (;;) {
+ if ((num_play=get_int("How many players? ")) <= 0 ||
+ num_play > MAX_PL)
+ printf("Sorry. Number must range from 1 to 9\n");
+ else
+ break;
+ }
+ cur_p = play = (PLAY *) calloc(num_play, sizeof (PLAY));
+ for (i = 0; i < num_play; i++) {
+over:
+ printf("Player %d's name: ", i + 1);
+ for (sp = buf; (*sp=getchar()) != '\n'; sp++)
+ continue;
+ if (sp == buf)
+ goto over;
+ *sp++ = '\0';
+ strcpy(name_list[i]=play[i].name=(char *)calloc(1,sp-buf),buf);
+ play[i].money = 1500;
+ }
+ name_list[i++] = "done";
+ name_list[i] = 0;
+ for (i = 0; i < num_play; i++)
+ for (j = i + 1; j < num_play; j++)
+ if (strcasecmp(name_list[i], name_list[j]) == 0) {
+ if (i != num_play - 1)
+ printf("Hey!!! Some of those are IDENTICAL!! Let's try that again....\n");
+ else
+ printf("\"done\" is a reserved word. Please try again\n");
+ for (i = 0; i < num_play; i++)
+ cfree(play[i].name);
+ cfree(play);
+ goto blew_it;
+ }
+}
+/*
+ * This routine figures out who goes first
+ */
+init_players() {
+
+ reg int i, rl, cur_max;
+ bool over;
+ int max_pl;
+
+again:
+ putchar('\n');
+ for (cur_max = i = 0; i < num_play; i++) {
+ printf("%s (%d) rolls %d\n", play[i].name, i+1, rl=roll(2, 6));
+ if (rl > cur_max) {
+ over = FALSE;
+ cur_max = rl;
+ max_pl = i;
+ }
+ else if (rl == cur_max)
+ over++;
+ }
+ if (over) {
+ printf("%d people rolled the same thing, so we'll try again\n",
+ over + 1);
+ goto again;
+ }
+ player = max_pl;
+ cur_p = &play[max_pl];
+ printf("%s (%d) goes first\n", cur_p->name, max_pl + 1);
+}
+/*
+ * This routine initalizes the monopoly structures.
+ */
+init_monops() {
+
+ reg MON *mp;
+ reg int i;
+
+ for (mp = mon; mp < &mon[N_MON]; mp++) {
+ mp->name = mp->not_m;
+ for (i = 0; i < mp->num_in; i++)
+ mp->sq[i] = &board[mp->sqnums[i]];
+ }
+}
diff --git a/monop/monop.def b/monop/monop.def
new file mode 100644
index 00000000..27da9e72
--- /dev/null
+++ b/monop/monop.def
@@ -0,0 +1,124 @@
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)monop.def 5.3 (Berkeley) 4/8/91
+ */
+
+# include "monop.h"
+# include "deck.h"
+
+bool fixing, /* set if fixing up debt */
+ trading, /* set if in process of trading */
+ told_em, /* set if told user he's out of debt */
+ spec; /* set if moving by card to RR or UTIL */
+
+char *name_list[MAX_PL+2], /* list of players' names */
+ *comlist[] = { /* list of normal commands */
+ "quit", /* 0 */ "print", /* 1 */
+ "where", /* 2 */ "own holdings", /* 3 */
+ "holdings", /* 4 */ "shell", /* 5 */
+ "mortgage", /* 6 */ "unmortgage", /* 7 */
+ "buy houses", /* 8 */ "sell houses", /* 9 */
+ "card", /* 10 */ "pay", /* 11 */
+ "trade", /* 12 */ "resign", /* 13 */
+ "save", /* 14 */ "restore", /* 15 */
+ "roll", /* 16 */ "", /* 17 */
+ 0
+ },
+ *yn[] = { /* list of commands for yes/no answers */
+ "yes", /* 0 */ "no", /* 1 */
+ "quit", /* 2 */ "print", /* 3 */
+ "where", /* 4 */ "own holdings", /* 5 */
+ "holdings", /* 6 */ "shell", /* 7 */
+ 0
+ },
+ *lucky_mes[] = { /* "got lucky" messages */
+ "You lucky stiff", "You got lucky",
+ "What a lucky person!", "You must have a 4-leaf clover",
+ "My, my! Aren't we lucky!", "Luck smiles upon you",
+ "You got lucky this time", "Lucky person!",
+ "Your karma must certainly be together",
+ "How beautifully Cosmic", "Wow, you must be really with it"
+ /* "I want your autograph", -- Save for later */
+ };
+
+int player, /* current player number */
+ num_play, /* current number of players */
+ num_doub, /* # of doubles current player rolled */
+ /* # of "got lucky" messages */
+ num_luck = sizeof lucky_mes / sizeof (char *),
+ /* list of command functions */
+ buy_houses(), card(), do_move(), do_move(), list(), list_all(),
+ mortgage(), pay(), printboard(), quit(), resign(), restore(),
+ rub(), save(), sell_houses(), shell_out(), trade(),
+ unmortgage(), where(),
+ (*func[])() = { /* array of function calls for commands */
+ quit, /* quit game |* 0 *| */
+ printboard, /* print board |* 1 *| */
+ where, /* where players are |* 2 *| */
+ list, /* own holdings |* 3 *| */
+ list_all, /* holdings list |* 4 *| */
+ shell_out, /* shell |* 5 *| */
+ mortgage, /* mortgage property |* 6 *| */
+ unmortgage, /* unmortgage property |* 7 *| */
+ buy_houses, /* buy houses |* 8 *| */
+ sell_houses, /* sell houses |* 9 *| */
+ card, /* card for jail |* 10 *| */
+ pay, /* pay for jail |* 11 *| */
+ trade, /* trade |* 12 *| */
+ resign, /* resign |* 13 *| */
+ save, /* save game |* 14 *| */
+ restore, /* restore game |* 15 *| */
+ do_move, /* roll |* 16 *| */
+ do_move /* "" |* 17 *| */
+ };
+
+DECK deck[2]; /* Chance and Community Chest */
+
+PLAY *play, /* player structure array ("calloc"ed) */
+ *cur_p; /* pointer to current player's struct */
+
+RR_S rr[N_RR]; /* raildroad descriptions */
+
+UTIL_S util[2]; /* utility descriptions */
+
+MON mon[N_MON] = { /* monopoly descriptions */
+# include "mon.dat"
+};
+
+PROP prop[N_PROP] = { /* typical properties */
+# include "prop.dat"
+};
+
+SQUARE board[N_SQRS+1] = { /* board itself (+1 for Jail) */
+# include "brd.dat"
+};
diff --git a/monop/monop.ext b/monop/monop.ext
new file mode 100644
index 00000000..0f109996
--- /dev/null
+++ b/monop/monop.ext
@@ -0,0 +1,57 @@
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)monop.ext 5.3 (Berkeley) 4/8/91
+ */
+
+# include "monop.h"
+# include "deck.h"
+
+extern bool trading, spec, fixing, told_em;
+
+extern char *yn[], *comlist[], *name_list[], *lucky_mes[];
+
+extern int num_play, player, num_doub, num_luck, (*func[])();
+
+extern DECK deck[2];
+
+extern MON mon[];
+
+extern PLAY *play, *cur_p;
+
+extern PROP prop[];
+
+extern RR_S rr[];
+
+extern SQUARE board[];
+
+extern UTIL_S util[];
diff --git a/monop/monop.h b/monop/monop.h
new file mode 100644
index 00000000..9aa3a090
--- /dev/null
+++ b/monop/monop.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)monop.h 5.5 (Berkeley) 6/1/90
+ */
+
+# include <stdio.h>
+
+# define reg register
+# define shrt char
+# define bool char
+# define unsgn unsigned
+
+# define TRUE (1)
+# define FALSE (0)
+
+# define N_MON 8 /* number of monopolies */
+# define N_PROP 22 /* number of normal property squares */
+# define N_RR 4 /* number of railroads */
+# define N_UTIL 2 /* number of utilities */
+# define N_SQRS 40 /* number of squares on board */
+# define MAX_PL 9 /* maximum number of players */
+# define MAX_PRP (N_PROP+N_RR+N_UTIL) /* max # ownable property */
+
+ /* square type numbers */
+# define PRPTY 0 /* normal property */
+# define RR 1 /* railroad */
+# define UTIL 2 /* water works - electric co */
+# define SAFE 3 /* safe spot */
+# define CC 4 /* community chest */
+# define CHANCE 5 /* chance (surprise!!!) */
+# define INC_TAX 6 /* Income tax */
+# define GOTO_J 7 /* Go To Jail! */
+# define LUX_TAX 8 /* Luxury tax */
+# define IN_JAIL 9 /* In jail */
+
+# define JAIL 40 /* JAIL square number */
+
+# define lucky(str) printf("%s%s\n",str,lucky_mes[roll(1,num_luck)-1])
+# define printline() printf("------------------------------\n")
+# define sqnum(sqp) (sqp - board)
+# define swap(A1,A2) if ((A1) != (A2)) { \
+ (A1) ^= (A2); \
+ (A2) ^= (A1); \
+ (A1) ^= (A2); \
+ }
+
+struct sqr_st { /* structure for square */
+ char *name; /* place name */
+ shrt owner; /* owner number */
+ shrt type; /* place type */
+ struct prp_st *desc; /* description struct */
+ int cost; /* cost */
+};
+
+typedef struct sqr_st SQUARE;
+
+struct mon_st { /* monopoly description structure */
+ char *name; /* monop. name (color) */
+ shrt owner; /* owner of monopoly */
+ shrt num_in; /* # in monopoly */
+ shrt num_own; /* # owned (-1: not poss. monop)*/
+ shrt h_cost; /* price of houses */
+ char *not_m; /* name if not monopoly */
+ char *mon_n; /* name if a monopoly */
+ char sqnums[3]; /* Square numbers (used to init)*/
+ SQUARE *sq[3]; /* list of squares in monop */
+};
+
+typedef struct mon_st MON;
+
+/*
+ * This struct describes a property. For railroads and utilities, only
+ * the "morg" member is used.
+ */
+struct prp_st { /* property description structure */
+ bool morg; /* set if mortgaged */
+ bool monop; /* set if monopoly */
+ shrt square; /* square description */
+ shrt houses; /* number of houses */
+ MON *mon_desc; /* name of color */
+ int rent[6]; /* rents */
+};
+
+struct own_st { /* element in list owned things */
+ SQUARE *sqr; /* pointer to square */
+ struct own_st *next; /* next in list */
+};
+
+typedef struct own_st OWN;
+
+struct plr_st { /* player description structure */
+ char *name; /* owner name */
+ shrt num_gojf; /* # of get-out-of-jail-free's */
+ shrt num_rr; /* # of railroads owned */
+ shrt num_util; /* # of water works/elec. co. */
+ shrt loc; /* location on board */
+ shrt in_jail; /* count of turns in jail */
+ int money; /* amount of money */
+ OWN *own_list; /* start of propery list */
+};
+
+typedef struct plr_st PLAY;
+typedef struct prp_st PROP;
+typedef struct prp_st RR_S;
+typedef struct prp_st UTIL_S;
+
+int cc(), chance(), lux_tax(), goto_jail(), inc_tax();
diff --git a/monop/morg.c b/monop/morg.c
new file mode 100644
index 00000000..2c4b97b5
--- /dev/null
+++ b/monop/morg.c
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)morg.c 5.3 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+/*
+ * These routines deal with mortgaging.
+ */
+
+static char *names[MAX_PRP+2],
+ *morg_coms[] = {
+ "quit", /* 0 */
+ "print", /* 1 */
+ "where", /* 2 */
+ "own holdings", /* 3 */
+ "holdings", /* 4 */
+ "shell", /* 5 */
+ "mortgage", /* 6 */
+ "unmortgage", /* 7 */
+ "buy", /* 8 */
+ "sell", /* 9 */
+ "card", /* 10 */
+ "pay", /* 11 */
+ "trade", /* 12 */
+ "resign", /* 13 */
+ "save game", /* 14 */
+ "restore game", /* 15 */
+ 0
+ };
+
+static shrt square[MAX_PRP+2];
+
+static int num_good,got_houses;
+
+/*
+ * This routine is the command level response the mortgage command.
+ * it gets the list of mortgageable property and asks which are to
+ * be mortgaged.
+ */
+mortgage() {
+
+ reg int prop;
+
+ for (;;) {
+ if (set_mlist() == 0) {
+ if (got_houses)
+ printf("You can't mortgage property with houses on it.\n");
+ else
+ printf("You don't have any un-mortgaged property.\n");
+ return;
+ }
+ if (num_good == 1) {
+ printf("Your only mortageable property is %s\n",names[0]);
+ if (getyn("Do you want to mortgage it? ") == 0)
+ m(square[0]);
+ return;
+ }
+ prop = getinp("Which property do you want to mortgage? ",names);
+ if (prop == num_good)
+ return;
+ m(square[prop]);
+ notify(cur_p);
+ }
+}
+/*
+ * This routine sets up the list of mortgageable property
+ */
+set_mlist() {
+
+ reg OWN *op;
+
+ num_good = 0;
+ for (op = cur_p->own_list; op; op = op->next)
+ if (!op->sqr->desc->morg)
+ if (op->sqr->type == PRPTY && op->sqr->desc->houses)
+ got_houses++;
+ else {
+ names[num_good] = op->sqr->name;
+ square[num_good++] = sqnum(op->sqr);
+ }
+ names[num_good++] = "done";
+ names[num_good--] = 0;
+ return num_good;
+}
+/*
+ * This routine actually mortgages the property.
+ */
+m(prop)
+reg int prop; {
+
+ reg int price;
+
+ price = board[prop].cost/2;
+ board[prop].desc->morg = TRUE;
+ printf("That got you $%d\n",price);
+ cur_p->money += price;
+}
+/*
+ * This routine is the command level repsponse to the unmortgage
+ * command. It gets the list of mortgaged property and asks which are
+ * to be unmortgaged.
+ */
+unmortgage() {
+
+ reg int prop;
+
+ for (;;) {
+ if (set_umlist() == 0) {
+ printf("You don't have any mortgaged property.\n");
+ return;
+ }
+ if (num_good == 1) {
+ printf("Your only mortaged property is %s\n",names[0]);
+ if (getyn("Do you want to unmortgage it? ") == 0)
+ unm(square[0]);
+ return;
+ }
+ prop = getinp("Which property do you want to unmortgage? ",names);
+ if (prop == num_good)
+ return;
+ unm(square[prop]);
+ }
+}
+/*
+ * This routine sets up the list of mortgaged property
+ */
+set_umlist() {
+
+ reg OWN *op;
+
+ num_good = 0;
+ for (op = cur_p->own_list; op; op = op->next)
+ if (op->sqr->desc->morg) {
+ names[num_good] = op->sqr->name;
+ square[num_good++] = sqnum(op->sqr);
+ }
+ names[num_good++] = "done";
+ names[num_good--] = 0;
+ return num_good;
+}
+/*
+ * This routine actually unmortgages the property
+ */
+unm(prop)
+reg int prop; {
+
+ reg int price;
+
+ price = board[prop].cost/2;
+ board[prop].desc->morg = FALSE;
+ price += price/10;
+ printf("That cost you $%d\n",price);
+ cur_p->money -= price;
+ set_umlist();
+}
+/*
+ * This routine forces the indebted player to fix his
+ * financial woes.
+ */
+force_morg() {
+
+ told_em = fixing = TRUE;
+ while (cur_p->money <= 0)
+ fix_ex(getinp("How are you going to fix it up? ",morg_coms));
+ fixing = FALSE;
+}
+/*
+ * This routine is a special execute for the force_morg routine
+ */
+fix_ex(com_num)
+reg int com_num; {
+
+ told_em = FALSE;
+ (*func[com_num])();
+ notify();
+}
diff --git a/monop/pathnames.h b/monop/pathnames.h
new file mode 100644
index 00000000..fb0a3f08
--- /dev/null
+++ b/monop/pathnames.h
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)pathnames.h 5.1 (Berkeley) 6/1/90
+ */
+
+#define _PATH_CARDS "/usr/share/games/cards.pck"
diff --git a/monop/print.c b/monop/print.c
new file mode 100644
index 00000000..6c91a5ec
--- /dev/null
+++ b/monop/print.c
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)print.c 5.4 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+static char buf[80], /* output buffer */
+ *header = "Name Own Price Mg # Rent";
+
+/*
+ * This routine prints out the current board
+ */
+printboard() {
+
+ reg int i;
+
+ printf("%s\t%s\n", header, header);
+ for (i = 0; i < N_SQRS/2; i++) {
+ printsq(i, FALSE);
+ putchar('\t');
+ printsq(i+N_SQRS/2, TRUE);
+ }
+}
+/*
+ * This routine lists where each player is.
+ */
+where() {
+
+ reg int i;
+ char *bsp;
+
+ printf("%s Player\n", header);
+ for (i = 0; i < num_play; i++) {
+ printsq(play[i].loc, FALSE);
+ printf(" %s (%d)", play[i].name, i+1);
+ if (cur_p == &play[i])
+ printf(" *");
+ putchar('\n');
+ }
+}
+/*
+ * This routine prints out an individual square
+ */
+printsq(sqn, eoln)
+int sqn;
+reg bool eoln; {
+
+ reg int rnt;
+ reg PROP *pp;
+ reg SQUARE *sqp;
+ int i;
+
+ sqp = &board[sqn];
+ printf("%-10.10s", sqp->name);
+ switch (sqp->type) {
+ case SAFE:
+ case CC:
+ case CHANCE:
+ case INC_TAX:
+ case GOTO_J:
+ case LUX_TAX:
+ case IN_JAIL:
+spec:
+ if (!eoln)
+ printf(" ");
+ break;
+ case PRPTY:
+ pp = sqp->desc;
+ if (sqp->owner < 0) {
+ printf(" - %-8.8s %3d", pp->mon_desc->name, sqp->cost);
+ if (!eoln)
+ printf(" ");
+ break;
+ }
+ printf(" %d %-8.8s %3d", sqp->owner+1, pp->mon_desc->name,
+ sqp->cost);
+ printmorg(sqp);
+ if (pp->monop) {
+ if (pp->houses < 5)
+ if (pp->houses > 0)
+ printf("%d %4d", pp->houses,
+ pp->rent[pp->houses]);
+ else
+ printf("0 %4d", pp->rent[0] * 2);
+ else
+ printf("H %4d", pp->rent[5]);
+ }
+ else
+ printf(" %4d", pp->rent[0]);
+ break;
+ case UTIL:
+ if (sqp->owner < 0) {
+ printf(" - 150");
+ if (!eoln)
+ printf(" ");
+ break;
+ }
+ printf(" %d 150", sqp->owner+1);
+ printmorg(sqp);
+ printf("%d", play[sqp->owner].num_util);
+ if (!eoln)
+ printf(" ");
+ break;
+ case RR:
+ if (sqp->owner < 0) {
+ printf(" - Railroad 200");
+ if (!eoln)
+ printf(" ");
+ break;
+ }
+ printf(" %d Railroad 200", sqp->owner+1);
+ printmorg(sqp);
+ rnt = 25;
+ rnt <<= play[sqp->owner].num_rr - 1;
+ printf("%d %4d", play[sqp->owner].num_rr, 25 << (play[sqp->owner].num_rr - 1));
+ break;
+ }
+ if (eoln)
+ putchar('\n');
+}
+/*
+ * This routine prints out the mortgage flag.
+ */
+printmorg(sqp)
+reg SQUARE *sqp; {
+
+ if (sqp->desc->morg)
+ printf(" * ");
+ else
+ printf(" ");
+}
+/*
+ * This routine lists the holdings of the player given
+ */
+printhold(pl)
+reg int pl; {
+
+ reg OWN *op;
+ reg PLAY *pp;
+ char *bsp;
+
+ pp = &play[pl];
+ printf("%s's (%d) holdings (Total worth: $%d):\n", name_list[pl], pl+1,
+ pp->money + prop_worth(pp));
+ printf("\t$%d", pp->money);
+ if (pp->num_gojf) {
+ printf(", %d get-out-of-jail-free card", pp->num_gojf);
+ if (pp->num_gojf > 1)
+ putchar('s');
+ }
+ putchar('\n');
+ if (pp->own_list) {
+ printf("\t%s\n", header);
+ for (op = pp->own_list; op; op = op->next) {
+ putchar('\t');
+ printsq(sqnum(op->sqr), TRUE);
+ }
+ }
+}
diff --git a/monop/prop.c b/monop/prop.c
new file mode 100644
index 00000000..86c15958
--- /dev/null
+++ b/monop/prop.c
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)prop.c 5.6 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+extern char *calloc();
+
+/*
+ * This routine deals with buying property, setting all the
+ * appropriate flags.
+ */
+buy(player, sqrp)
+reg int player;
+reg SQUARE *sqrp; {
+
+ trading = FALSE;
+ sqrp->owner = player;
+ add_list(player, &(play[player].own_list), cur_p->loc);
+}
+/*
+ * This routine adds an item to the list.
+ */
+add_list(plr, head, op_sqr)
+int plr;
+OWN **head;
+int op_sqr; {
+
+ reg int val;
+ reg OWN *tp, *last_tp;
+ MON *mp;
+ OWN *op;
+
+ op = (OWN *)calloc(1, sizeof (OWN));
+ op->sqr = &board[op_sqr];
+ val = value(op->sqr);
+ last_tp = NULL;
+ for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next)
+ if (val == value(tp->sqr)) {
+ cfree(op);
+ return;
+ }
+ else
+ last_tp = tp;
+ op->next = tp;
+ if (last_tp != NULL)
+ last_tp->next = op;
+ else
+ *head = op;
+ if (!trading)
+ set_ownlist(plr);
+}
+/*
+ * This routine deletes property from the list.
+ */
+del_list(plr, head, op_sqr)
+int plr;
+OWN **head;
+shrt op_sqr; {
+
+ reg int i;
+ reg OWN *op, *last_op;
+
+ switch (board[op_sqr].type) {
+ case PRPTY:
+ board[op_sqr].desc->mon_desc->num_own--;
+ break;
+ case RR:
+ play[plr].num_rr--;
+ break;
+ case UTIL:
+ play[plr].num_util--;
+ break;
+ }
+ last_op = NULL;
+ for (op = *head; op; op = op->next)
+ if (op->sqr == &board[op_sqr])
+ break;
+ else
+ last_op = op;
+ if (last_op == NULL)
+ *head = op->next;
+ else {
+ last_op->next = op->next;
+ cfree(op);
+ }
+}
+/*
+ * This routine calculates the value for sorting of the
+ * given square.
+ */
+value(sqp)
+reg SQUARE *sqp; {
+
+ reg int sqr;
+
+ sqr = sqnum(sqp);
+ switch (sqp->type) {
+ case SAFE:
+ return 0;
+ default: /* Specials, etc */
+ return 1;
+ case UTIL:
+ if (sqr == 12)
+ return 2;
+ else
+ return 3;
+ case RR:
+ return 4 + sqr/10;
+ case PRPTY:
+ return 8 + (sqp->desc) - prop;
+ }
+}
+/*
+ * This routine accepts bids for the current peice
+ * of property.
+ */
+bid() {
+
+ static bool in[MAX_PL];
+ reg int i, num_in, cur_max;
+ char buf[80];
+ int cur_bid;
+
+ printf("\nSo it goes up for auction. Type your bid after your name\n");
+ for (i = 0; i < num_play; i++)
+ in[i] = TRUE;
+ i = -1;
+ cur_max = 0;
+ num_in = num_play;
+ while (num_in > 1 || (cur_max == 0 && num_in > 0)) {
+ i = ++i % num_play;
+ if (in[i]) {
+ do {
+ (void)sprintf(buf, "%s: ", name_list[i]);
+ cur_bid = get_int(buf);
+ if (cur_bid == 0) {
+ in[i] = FALSE;
+ if (--num_in == 0)
+ break;
+ }
+ else if (cur_bid <= cur_max) {
+ printf("You must bid higher than %d to stay in\n", cur_max);
+ printf("(bid of 0 drops you out)\n");
+ }
+ } while (cur_bid != 0 && cur_bid <= cur_max);
+ cur_max = (cur_bid ? cur_bid : cur_max);
+ }
+ }
+ if (cur_max != 0) {
+ while (!in[i])
+ i = ++i % num_play;
+ printf("It goes to %s (%d) for $%d\n",play[i].name,i+1,cur_max);
+ buy(i, &board[cur_p->loc]);
+ play[i].money -= cur_max;
+ }
+ else
+ printf("Nobody seems to want it, so we'll leave it for later\n");
+}
+/*
+ * This routine calculates the value of the property
+ * of given player.
+ */
+prop_worth(plp)
+reg PLAY *plp; {
+
+ reg OWN *op;
+ reg int worth;
+
+ worth = 0;
+ for (op = plp->own_list; op; op = op->next) {
+ if (op->sqr->type == PRPTY && op->sqr->desc->monop)
+ worth += op->sqr->desc->mon_desc->h_cost * 50 *
+ op->sqr->desc->houses;
+ worth += op->sqr->cost;
+ }
+ return worth;
+}
diff --git a/monop/prop.dat b/monop/prop.dat
new file mode 100644
index 00000000..dd4081d9
--- /dev/null
+++ b/monop/prop.dat
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)prop.dat 5.3 (Berkeley) 4/8/91
+ */
+
+/* morg monop square houses mon_desc rent */
+{0, 0, 1, 0, &mon[0], { 2, 10, 30, 90, 160, 250} },
+{0, 0, 3, 0, &mon[0], { 4, 20, 60, 180, 320, 450} },
+{0, 0, 6, 0, &mon[1], { 6, 30, 90, 270, 400, 550} },
+{0, 0, 7, 0, &mon[1], { 6, 30, 90, 270, 400, 550} },
+{0, 0, 9, 0, &mon[1], { 8, 40,100, 300, 450, 600} },
+{0, 0, 11, 0, &mon[2], {10, 50,150, 450, 625, 750} },
+{0, 0, 13, 0, &mon[2], {10, 50,150, 450, 625, 750} },
+{0, 0, 14, 0, &mon[2], {12, 60,180, 500, 700, 900} },
+{0, 0, 16, 0, &mon[3], {14, 70,200, 550, 750, 950} },
+{0, 0, 17, 0, &mon[3], {14, 70,200, 550, 750, 950} },
+{0, 0, 19, 0, &mon[3], {16, 80,220, 600, 800,1000} },
+{0, 0, 21, 0, &mon[4], {18, 90,250, 700, 875,1050} },
+{0, 0, 23, 0, &mon[4], {18, 90,250, 700, 875,1050} },
+{0, 0, 24, 0, &mon[4], {20,100,300, 750, 925,1100} },
+{0, 0, 26, 0, &mon[5], {22,110,330, 800, 975,1150} },
+{0, 0, 27, 0, &mon[5], {22,110,330, 800, 975,1150} },
+{0, 0, 29, 0, &mon[5], {24,120,360, 850,1025,1200} },
+{0, 0, 31, 0, &mon[6], {26,130,390, 900,1100,1275} },
+{0, 0, 32, 0, &mon[6], {26,130,390, 900,1100,1275} },
+{0, 0, 34, 0, &mon[6], {28,150,450,1000,1200,1400} },
+{0, 0, 37, 0, &mon[7], {35,175,500,1100,1300,1500} },
+{0, 0, 39, 0, &mon[7], {50,200,600,1400,1700,2000} }
diff --git a/monop/rent.c b/monop/rent.c
new file mode 100644
index 00000000..f3c5b050
--- /dev/null
+++ b/monop/rent.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)rent.c 5.3 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+/*
+ * This routine has the player pay rent
+ */
+rent(sqp)
+reg SQUARE *sqp; {
+
+ reg int rnt;
+ reg PROP *pp;
+ PLAY *plp;
+
+ plp = &play[sqp->owner];
+ printf("Owned by %s\n", plp->name);
+ if (sqp->desc->morg) {
+ lucky("The thing is mortgaged. ");
+ return;
+ }
+ switch (sqp->type) {
+ case PRPTY:
+ pp = sqp->desc;
+ if (pp->monop)
+ if (pp->houses == 0)
+ printf("rent is %d\n", rnt=pp->rent[0] * 2);
+ else if (pp->houses < 5)
+ printf("with %d houses, rent is %d\n",
+ pp->houses, rnt=pp->rent[pp->houses]);
+ else
+ printf("with a hotel, rent is %d\n",
+ rnt=pp->rent[pp->houses]);
+ else
+ printf("rent is %d\n", rnt = pp->rent[0]);
+ break;
+ case RR:
+ rnt = 25;
+ rnt <<= (plp->num_rr - 1);
+ if (spec)
+ rnt <<= 1;
+ printf("rent is %d\n", rnt);
+ break;
+ case UTIL:
+ rnt = roll(2, 6);
+ if (plp->num_util == 2 || spec) {
+ printf("rent is 10 * roll (%d) = %d\n", rnt, rnt * 10);
+ rnt *= 10;
+ }
+ else {
+ printf("rent is 4 * roll (%d) = %d\n", rnt, rnt * 4);
+ rnt *= 4;
+ }
+ break;
+ }
+ cur_p->money -= rnt;
+ plp->money += rnt;
+}
diff --git a/monop/roll.c b/monop/roll.c
new file mode 100644
index 00000000..9de116f4
--- /dev/null
+++ b/monop/roll.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)roll.c 5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+/*
+ * This routine rolls ndie nside-sided dice.
+ */
+
+# define reg register
+
+# if !defined(vax) && !defined(tahoe)
+# define MAXRAND 32767L
+
+roll(ndie, nsides)
+int ndie, nsides; {
+
+ reg long tot;
+ reg unsigned n, r;
+
+ tot = 0;
+ n = ndie;
+ while (n--)
+ tot += rand();
+ return (int) ((tot * (long) nsides) / ((long) MAXRAND + 1)) + ndie;
+}
+
+# else
+
+roll(ndie, nsides)
+reg int ndie, nsides; {
+
+ reg int tot, r;
+ reg double num_sides;
+
+ num_sides = nsides;
+ tot = 0;
+ while (ndie--)
+ tot += (r = rand()) * (num_sides / 017777777777) + 1;
+ return tot;
+}
+# endif
diff --git a/monop/spec.c b/monop/spec.c
new file mode 100644
index 00000000..b040ca3b
--- /dev/null
+++ b/monop/spec.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)spec.c 5.3 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+static char *perc[] = {
+ "10%", "ten percent", "%", "$200", "200", 0
+ };
+
+inc_tax() { /* collect income tax */
+
+ reg int worth, com_num;
+
+ com_num = getinp("Do you wish to lose 10%% of your total worth or $200? ", perc);
+ worth = cur_p->money + prop_worth(cur_p);
+ printf("You were worth $%d", worth);
+ worth /= 10;
+ if (com_num > 2) {
+ if (worth < 200)
+ printf(". Good try, but not quite.\n");
+ else if (worth > 200)
+ lucky(".\nGood guess. ");
+ cur_p->money -= 200;
+ }
+ else {
+ printf(", so you pay $%d", worth);
+ if (worth > 200)
+ printf(" OUCH!!!!.\n");
+ else if (worth < 200)
+ lucky("\nGood guess. ");
+ cur_p->money -= worth;
+ }
+ if (worth == 200)
+ lucky("\nIt makes no difference! ");
+}
+goto_jail() { /* move player to jail */
+
+ cur_p->loc = JAIL;
+}
+lux_tax() { /* landing on luxury tax */
+
+ printf("You lose $75\n");
+ cur_p->money -= 75;
+}
+cc() { /* draw community chest card */
+
+ get_card(&CC_D);
+}
+chance() { /* draw chance card */
+
+ get_card(&CH_D);
+}
diff --git a/monop/trade.c b/monop/trade.c
new file mode 100644
index 00000000..57cca984
--- /dev/null
+++ b/monop/trade.c
@@ -0,0 +1,306 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)trade.c 5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+# include "monop.ext"
+
+struct trd_st { /* how much to give to other player */
+ int trader; /* trader number */
+ int cash; /* amount of cash */
+ int gojf; /* # get-out-of-jail-free cards */
+ OWN *prop_list; /* property list */
+};
+
+typedef struct trd_st TRADE;
+
+static char *list[MAX_PRP+2];
+
+static int used[MAX_PRP];
+
+static TRADE trades[2];
+
+trade() {
+
+ reg int tradee, i;
+
+ trading = TRUE;
+ for (i = 0; i < 2; i++) {
+ trades[i].cash = 0;
+ trades[i].gojf = FALSE;
+ trades[i].prop_list = NULL;
+ }
+over:
+ if (num_play == 1) {
+ printf("There ain't no-one around to trade WITH!!\n");
+ return;
+ }
+ if (num_play > 2) {
+ tradee = getinp("Which player do you wish to trade with? ",
+ name_list);
+ if (tradee == num_play)
+ return;
+ if (tradee == player) {
+ printf("You can't trade with yourself!\n");
+ goto over;
+ }
+ }
+ else
+ tradee = 1 - player;
+ get_list(0, player);
+ get_list(1, tradee);
+ if (getyn("Do you wish a summary? ") == 0)
+ summate();
+ if (getyn("Is the trade ok? ") == 0)
+ do_trade();
+}
+/*
+ * This routine gets the list of things to be trader for the
+ * player, and puts in the structure given.
+ */
+get_list(struct_no, play_no)
+int struct_no, play_no; {
+
+ reg int sn, pn;
+ reg PLAY *pp;
+ int numin, prop, num_prp;
+ OWN *op;
+ TRADE *tp;
+
+ for (numin = 0; numin < MAX_PRP; numin++)
+ used[numin] = FALSE;
+ sn = struct_no, pn = play_no;
+ pp = &play[pn];
+ tp = &trades[sn];
+ tp->trader = pn;
+ printf("player %s (%d):\n", pp->name, pn+1);
+ if (pp->own_list) {
+ numin = set_list(pp->own_list);
+ for (num_prp = numin; num_prp; ) {
+ prop = getinp("Which property do you wish to trade? ",
+ list);
+ if (prop == numin)
+ break;
+ else if (used[prop])
+ printf("You've already allocated that.\n");
+ else {
+ num_prp--;
+ used[prop] = TRUE;
+ for (op = pp->own_list; prop--; op = op->next)
+ continue;
+ add_list(pn, &(tp->prop_list), sqnum(op->sqr));
+ }
+ }
+ }
+ if (pp->money > 0) {
+ printf("You have $%d. ", pp->money);
+ tp->cash = get_int("How much are you trading? ");
+ }
+ if (pp->num_gojf > 0) {
+once_more:
+ printf("You have %d get-out-of-jail-free cards. ",pp->num_gojf);
+ tp->gojf = get_int("How many are you trading? ");
+ if (tp->gojf > pp->num_gojf) {
+ printf("You don't have that many. Try again.\n");
+ goto once_more;
+ }
+ }
+}
+/*
+ * This routine sets up the list of tradable property.
+ */
+set_list(the_list)
+reg OWN *the_list; {
+
+ reg int i;
+ reg OWN *op;
+
+ i = 0;
+ for (op = the_list; op; op = op->next)
+ if (!used[i])
+ list[i++] = op->sqr->name;
+ list[i++] = "done";
+ list[i--] = 0;
+ return i;
+}
+/*
+ * This routine summates the trade.
+ */
+summate() {
+
+ reg bool some;
+ reg int i;
+ reg TRADE *tp;
+ OWN *op;
+
+ for (i = 0; i < 2; i++) {
+ tp = &trades[i];
+ some = FALSE;
+ printf("Player %s (%d) gives:\n", play[tp->trader].name,
+ tp->trader+1);
+ if (tp->cash > 0)
+ printf("\t$%d\n", tp->cash), some++;
+ if (tp->gojf > 0)
+ printf("\t%d get-out-of-jail-free card(s)\n", tp->gojf),
+ some++;
+ if (tp->prop_list) {
+ for (op = tp->prop_list; op; op = op->next)
+ putchar('\t'), printsq(sqnum(op->sqr), TRUE);
+ some++;
+ }
+ if (!some)
+ printf("\t-- Nothing --\n");
+ }
+}
+/*
+ * This routine actually executes the trade.
+ */
+do_trade() {
+
+ move_em(&trades[0], &trades[1]);
+ move_em(&trades[1], &trades[0]);
+}
+/*
+ * This routine does a switch from one player to another
+ */
+move_em(from, to)
+TRADE *from, *to; {
+
+ reg PLAY *pl_fr, *pl_to;
+ reg OWN *op;
+
+ pl_fr = &play[from->trader];
+ pl_to = &play[to->trader];
+
+ pl_fr->money -= from->cash;
+ pl_to->money += from->cash;
+ pl_fr->num_gojf -= from->gojf;
+ pl_to->num_gojf += from->gojf;
+ for (op = from->prop_list; op; op = op->next) {
+ add_list(to->trader, &(pl_to->own_list), sqnum(op->sqr));
+ op->sqr->owner = to->trader;
+ del_list(from->trader, &(pl_fr->own_list), sqnum(op->sqr));
+ }
+ set_ownlist(to->trader);
+}
+/*
+ * This routine lets a player resign
+ */
+resign() {
+
+ reg int i, new_own;
+ reg OWN *op;
+ SQUARE *sqp;
+
+ if (cur_p->money <= 0) {
+ switch (board[cur_p->loc].type) {
+ case UTIL:
+ case RR:
+ case PRPTY:
+ new_own = board[cur_p->loc].owner;
+ break;
+ default: /* Chance, taxes, etc */
+ new_own = num_play;
+ break;
+ }
+ if (new_own == num_play)
+ printf("You would resign to the bank\n");
+ else
+ printf("You would resign to %s\n", name_list[new_own]);
+ }
+ else if (num_play == 1) {
+ new_own = num_play;
+ printf("You would resign to the bank\n");
+ }
+ else {
+ name_list[num_play] = "bank";
+ do {
+ new_own = getinp("Who do you wish to resign to? ",
+ name_list);
+ if (new_own == player)
+ printf("You can't resign to yourself!!\n");
+ } while (new_own == player);
+ name_list[num_play] = "done";
+ }
+ if (getyn("Do you really want to resign? ", yn) != 0)
+ return;
+ if (num_play == 1) {
+ printf("Then NOBODY wins (not even YOU!)\n");
+ exit(0);
+ }
+ if (new_own < num_play) { /* resign to player */
+ printf("resigning to player\n");
+ trades[0].trader = new_own;
+ trades[0].cash = trades[0].gojf = 0;
+ trades[0].prop_list = NULL;
+ trades[1].trader = player;
+ trades[1].cash = cur_p->money > 0 ? cur_p->money : 0;
+ trades[1].gojf = cur_p->num_gojf;
+ trades[1].prop_list = cur_p->own_list;
+ do_trade();
+ }
+ else { /* resign to bank */
+ printf("resigning to bank\n");
+ for (op = cur_p->own_list; op; op = op->next) {
+ sqp = op->sqr;
+ sqp->owner = -1;
+ sqp->desc->morg = FALSE;
+ if (sqp->type == PRPTY) {
+ isnot_monop(sqp->desc->mon_desc);
+ sqp->desc->houses = 0;
+ }
+ }
+ if (cur_p->num_gojf)
+ ret_card(cur_p);
+ }
+ for (i = player; i < num_play; i++) {
+ name_list[i] = name_list[i+1];
+ if (i + 1 < num_play)
+ cpy_st(&play[i], &play[i+1], sizeof (PLAY));
+ }
+ name_list[num_play--] = 0;
+ for (i = 0; i < N_SQRS; i++)
+ if (board[i].owner > player)
+ --board[i].owner;
+ player = --player < 0 ? num_play - 1 : player;
+ next_play();
+ if (num_play < 2) {
+ printf("\nThen %s WINS!!!!!\n", play[0].name);
+ printhold(0);
+ printf("That's a grand worth of $%d.\n",
+ play[0].money+prop_worth(&play[0]));
+ exit(0);
+ }
+}