xref: /original-bsd/games/monop/execute.c (revision 79cf7955)
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) 06/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 }
247