date and time created 88/01/02 20:53:21 by bostic
[unix-history] / usr / src / games / monop / cards.c
CommitLineData
ec9c86ca
KB
1/*
2 * Copyright (c) 1987 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that this notice is preserved and that due credit is given
7 * to the University of California at Berkeley. The name of the University
8 * may not be used to endorse or promote products derived from this
9 * software without specific prior written permission. This software
10 * is provided ``as is'' without express or implied warranty.
11 */
12
13#ifndef lint
14static char sccsid[] = "@(#)cards.c 5.1 (Berkeley) %G%";
15#endif /* not lint */
16
17# include "monop.ext"
18
19/*
20 * These routine deal with the card decks
21 */
22
23# define GOJF 'F' /* char for get-out-of-jail-free cards */
24
25# ifndef DEV
26static char *cardfile = "/usr/games/lib/cards.pck";
27# else
28static char *cardfile = "cards.pck";
29# endif
30
31static FILE *deckf;
32
33/*
34 * This routine initializes the decks from the data file,
35 * which it opens.
36 */
37init_decks() {
38
39 if ((deckf=fopen(cardfile, "r")) == NULL) {
40file_err:
41 perror(cardfile);
42 exit(1);
43 }
44 if (fread(deck, sizeof (DECK), 2, deckf) != 2)
45 goto file_err;
46 set_up(&CC_D);
47 set_up(&CH_D);
48}
49/*
50 * This routine sets up the offset pointers for the given deck.
51 */
52set_up(dp)
53DECK *dp; {
54
55 reg int r1, r2;
56 int i;
57
58 dp->offsets = (long *) calloc(sizeof (long), dp->num_cards);
59 if (fread(dp->offsets, sizeof(long), dp->num_cards, deckf) != dp->num_cards) {
60 perror(cardfile);
61 exit(1);
62 }
63 dp->last_card = 0;
64 dp->gojf_used = FALSE;
65 for (i = 0; i < dp->num_cards; i++) {
66 reg long temp;
67
68 r1 = roll(1, dp->num_cards) - 1;
69 r2 = roll(1, dp->num_cards) - 1;
70 temp = dp->offsets[r2];
71 dp->offsets[r2] = dp->offsets[r1];
72 dp->offsets[r1] = temp;
73 }
74}
75/*
76 * This routine draws a card from the given deck
77 */
78get_card(dp)
79DECK *dp; {
80
81 reg char type_maj, type_min;
82 reg int num;
83 int i, per_h, per_H, num_h, num_H;
84 OWN *op;
85
86 do {
87 fseek(deckf, dp->offsets[dp->last_card], 0);
88 dp->last_card = ++(dp->last_card) % dp->num_cards;
89 type_maj = getc(deckf);
90 } while (dp->gojf_used && type_maj == GOJF);
91 type_min = getc(deckf);
92 num = getw(deckf);
93 printmes();
94 switch (type_maj) {
95 case '+': /* get money */
96 if (type_min == 'A') {
97 for (i = 0; i < num_play; i++)
98 if (i != player)
99 play[i].money -= num;
100 num = num * (num_play - 1);
101 }
102 cur_p->money += num;
103 break;
104 case '-': /* lose money */
105 if (type_min == 'A') {
106 for (i = 0; i < num_play; i++)
107 if (i != player)
108 play[i].money += num;
109 num = num * (num_play - 1);
110 }
111 cur_p->money -= num;
112 break;
113 case 'M': /* move somewhere */
114 switch (type_min) {
115 case 'F': /* move forward */
116 num -= cur_p->loc;
117 if (num < 0)
118 num += 40;
119 break;
120 case 'J': /* move to jail */
121 goto_jail();
122 return;
123 case 'R': /* move to railroad */
124 spec = TRUE;
125 num = (int)((cur_p->loc + 5)/10)*10 + 5 - cur_p->loc;
126 break;
127 case 'U': /* move to utility */
128 spec = TRUE;
129 if (cur_p->loc >= 12 && cur_p->loc < 28)
130 num = 28 - cur_p->loc;
131 else {
132 num = 12 - cur_p->loc;
133 if (num < 0)
134 num += 40;
135 }
136 break;
137 case 'B':
138 num = -num;
139 break;
140 }
141 move(num);
142 break;
143 case 'T': /* tax */
144 if (dp == &CC_D) {
145 per_h = 40;
146 per_H = 115;
147 }
148 else {
149 per_h = 25;
150 per_H = 100;
151 }
152 num_h = num_H = 0;
153 for (op = cur_p->own_list; op; op = op->next)
154 if (op->sqr->type == PRPTY)
155 if (op->sqr->desc->houses == 5)
156 ++num_H;
157 else
158 num_h += op->sqr->desc->houses;
159 num = per_h * num_h + per_H * num_H;
160 printf("You had %d Houses and %d Hotels, so that cost you $%d\n", num_h, num_H, num);
161 if (num == 0)
162 lucky("");
163 else
164 cur_p->money -= num;
165 break;
166 case GOJF: /* get-out-of-jail-free card */
167 cur_p->num_gojf++;
168 dp->gojf_used = TRUE;
169 break;
170 }
171 spec = FALSE;
172}
173/*
174 * This routine prints out the message on the card
175 */
176printmes() {
177
178 reg char c;
179
180 printline();
181 fflush(stdout);
182 while ((c = getc(deckf)) != '\0')
183 putchar(c);
184 printline();
185 fflush(stdout);
186}