|
|
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 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.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)cards.c 5.2 (Berkeley) 6/18/88";
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
31: static char *cardfile = "/usr/games/lib/cards.pck";
32: # else
33: static char *cardfile = "cards.pck";
34: # endif
35:
36: static FILE *deckf;
37:
38: /*
39: * This routine initializes the decks from the data file,
40: * which it opens.
41: */
42: init_decks() {
43:
44: if ((deckf=fopen(cardfile, "r")) == NULL) {
45: file_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: */
57: set_up(dp)
58: DECK *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: */
83: get_card(dp)
84: DECK *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: */
181: printmes() {
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.