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