|
|
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[] = "@(#)execute.c 5.3 (Berkeley) 6/18/88";
20: #endif /* not lint */
21:
22: # include "monop.ext"
23: # include <sys/types.h>
24: # include <sys/stat.h>
25: # include <sys/time.h>
26:
27: # define SEGSIZE 8192
28:
29: typedef struct stat STAT;
30: typedef struct tm TIME;
31:
32: extern char etext[], /* end of text space */
33: rub();
34:
35: static char buf[257],
36: *yn_only[] = { "yes", "no"};
37:
38: static bool new_play; /* set if move on to new player */
39:
40: /*
41: * This routine executes the given command by index number
42: */
43: execute(com_num)
44: reg int com_num; {
45:
46: new_play = FALSE; /* new_play is true if fixing */
47: (*func[com_num])();
48: notify();
49: force_morg();
50: if (new_play)
51: next_play();
52: else if (num_doub)
53: printf("%s rolled doubles. Goes again\n", cur_p->name);
54: }
55: /*
56: * This routine moves a piece around.
57: */
58: do_move() {
59:
60: reg int r1, r2;
61: reg bool was_jail;
62:
63: new_play = was_jail = FALSE;
64: printf("roll is %d, %d\n", r1=roll(1, 6), r2=roll(1, 6));
65: if (cur_p->loc == JAIL) {
66: was_jail++;
67: if (!move_jail(r1, r2)) {
68: new_play++;
69: goto ret;
70: }
71: }
72: else {
73: if (r1 == r2 && ++num_doub == 3) {
74: printf("That's 3 doubles. You go to jail\n");
75: goto_jail();
76: new_play++;
77: goto ret;
78: }
79: move(r1+r2);
80: }
81: if (r1 != r2 || was_jail)
82: new_play++;
83: ret:
84: return;
85: }
86: /*
87: * This routine moves a normal move
88: */
89: move(rl)
90: reg int rl; {
91:
92: reg int old_loc;
93:
94: old_loc = cur_p->loc;
95: cur_p->loc = (cur_p->loc + rl) % N_SQRS;
96: if (cur_p->loc < old_loc && rl > 0) {
97: cur_p->money += 200;
98: printf("You pass %s and get $200\n", board[0].name);
99: }
100: show_move();
101: }
102: /*
103: * This routine shows the results of a move
104: */
105: show_move() {
106:
107: reg SQUARE *sqp;
108:
109: sqp = &board[cur_p->loc];
110: printf("That puts you on %s\n", sqp->name);
111: switch (sqp->type) {
112: case SAFE:
113: printf("That is a safe place\n");
114: break;
115: case CC:
116: cc(); break;
117: case CHANCE:
118: chance(); break;
119: case INC_TAX:
120: inc_tax(); break;
121: case GOTO_J:
122: goto_jail(); break;
123: case LUX_TAX:
124: lux_tax(); break;
125: case PRPTY:
126: case RR:
127: case UTIL:
128: if (sqp->owner < 0) {
129: printf("That would cost $%d\n", sqp->cost);
130: if (getyn("Do you want to buy? ") == 0) {
131: buy(player, sqp);
132: cur_p->money -= sqp->cost;
133: }
134: else if (num_play > 2)
135: bid(sqp);
136: }
137: else if (sqp->owner == player)
138: printf("You own it.\n");
139: else
140: rent(sqp);
141: }
142: }
143: /*
144: * This routine saves the current game for use at a later date
145: */
146: save() {
147:
148: reg char *sp;
149: reg int outf, num;
150: TIME tme, *tp;
151: int *dat_end, junk[18];
152: unsgn start, end;
153:
154: tp = &tme;
155: printf("Which file do you wish to save it in? ");
156: sp = buf;
157: while ((*sp++=getchar()) != '\n')
158: continue;
159: *--sp = '\0';
160:
161: /*
162: * check for existing files, and confirm overwrite if needed
163: */
164:
165: if (stat(buf, junk) > -1
166: && getyn("File exists. Do you wish to overwrite? ", yn_only) > 0)
167: return;
168:
169: if ((outf=creat(buf, 0644)) < 0) {
170: perror(buf);
171: return;
172: }
173: printf("\"%s\" ", buf);
174: time(tp); /* get current time */
175: strcpy(buf, ctime(tp));
176: for (sp = buf; *sp != '\n'; sp++)
177: continue;
178: *sp = '\0';
179: # if 0
180: start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE;
181: # else
182: start = 0;
183: # endif
184: end = sbrk(0);
185: while (start < end) { /* write out entire data space */
186: num = start + 16 * 1024 > end ? end - start : 16 * 1024;
187: write(outf, start, num);
188: start += num;
189: }
190: close(outf);
191: printf("[%s]\n", buf);
192: }
193: /*
194: * This routine restores an old game from a file
195: */
196: restore() {
197:
198: reg char *sp;
199:
200: printf("Which file do you wish to restore from? ");
201: for (sp = buf; (*sp=getchar()) != '\n'; sp++)
202: continue;
203: *sp = '\0';
204: rest_f(buf);
205: }
206: /*
207: * This does the actual restoring. It returns TRUE if the
208: * backup was successful, else false.
209: */
210: rest_f(file)
211: reg char *file; {
212:
213: reg char *sp;
214: reg int inf, num;
215: char buf[80];
216: unsgn start, end;
217: STAT sbuf;
218:
219: if ((inf=open(file, 0)) < 0) {
220: perror(file);
221: return FALSE;
222: }
223: printf("\"%s\" ", file);
224: if (fstat(inf, &sbuf) < 0) { /* get file stats */
225: perror(file);
226: exit(1);
227: }
228: # if 0
229: start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE;
230: # else
231: start = 0;
232: # endif
233: brk(end = start + sbuf.st_size);
234: while (start < end) { /* write out entire data space */
235: num = start + 16 * 1024 > end ? end - start : 16 * 1024;
236: read(inf, start, num);
237: start += num;
238: }
239: close(inf);
240: strcpy(buf, ctime(sbuf.st_mtime));
241: for (sp = buf; *sp != '\n'; sp++)
242: continue;
243: *sp = '\0';
244: printf("[%s]\n", buf);
245: return TRUE;
246: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.