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