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