|
|
1.1 root 1: /*
2: * Hunt
3: * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
4: * San Francisco, California
5: *
6: * Copyright (c) 1985 Regents of the University of California.
7: * All rights reserved. The Berkeley software License Agreement
8: * specifies the terms and conditions for redistribution.
9: */
10:
11: # include "hunt.h"
12:
13: drawmaze(pp)
14: register PLAYER *pp;
15: {
16: register int x;
17: register char *sp;
18: register int y;
19: register char *endp;
20:
21: clrscr(pp);
22: outstr(pp, pp->p_maze[0], WIDTH);
23: for (y = 1; y < HEIGHT - 1; y++) {
24: endp = &pp->p_maze[y][WIDTH];
25: for (x = 0, sp = pp->p_maze[y]; sp < endp; x++, sp++)
26: if (*sp != SPACE) {
27: cgoto(pp, y, x);
28: if (pp->p_x == x && pp->p_y == y)
29: outch(pp, translate(*sp));
30: else
31: outch(pp, *sp);
32: }
33: }
34: cgoto(pp, HEIGHT - 1, 0);
35: outstr(pp, pp->p_maze[HEIGHT - 1], WIDTH);
36: drawstatus(pp);
37: }
38:
39: /*
40: * drawstatus - put up the status lines (this assumes the screen
41: * size is 80x24 with the maze being 64x24)
42: */
43: drawstatus(pp)
44: register PLAYER *pp;
45: {
46: register int i;
47: register PLAYER *np;
48:
49: (void) sprintf(Buf, "%-13.13s", pp->p_ident->i_name);
50: cgoto(pp, STAT_NAME_ROW, STAT_LABEL_COL);
51: outstr(pp, Buf, 13);
52:
53: cgoto(pp, STAT_AMMO_ROW, STAT_LABEL_COL);
54: outstr(pp, "Ammo:", 5);
55: (void) sprintf(Buf, "%3d", pp->p_ammo);
56: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
57: outstr(pp, Buf, 3);
58:
59: cgoto(pp, STAT_CLOAK_ROW, STAT_LABEL_COL);
60: outstr(pp, "Cloak:", 6);
61: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
62: outstr(pp, (pp->p_cloak < 0) ? " " : " on", 3);
63:
64: cgoto(pp, STAT_SCAN_ROW, STAT_LABEL_COL);
65: outstr(pp, "Scan:", 5);
66: cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL);
67: outstr(pp, (pp->p_scan < 0) ? " " : " on", 3);
68:
69: cgoto(pp, STAT_GUN_ROW, STAT_LABEL_COL);
70: outstr(pp, "Gun:", 4);
71: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);
72: outstr(pp, (pp->p_ncshot < MAXNCSHOT) ? " ok" : " ", 3);
73:
74: cgoto(pp, STAT_DAM_ROW, STAT_LABEL_COL);
75: outstr(pp, "Damage:", 7);
76: (void) sprintf(Buf, "%2d/%2d", pp->p_damage, pp->p_damcap);
77: cgoto(pp, STAT_DAM_ROW, STAT_VALUE_COL);
78: outstr(pp, Buf, 5);
79:
80: cgoto(pp, STAT_KILL_ROW, STAT_LABEL_COL);
81: outstr(pp, "Kills:", 6);
82: (void) sprintf(Buf, "%3d", (pp->p_damcap - MAXDAM) / 2);
83: cgoto(pp, STAT_KILL_ROW, STAT_VALUE_COL);
84: outstr(pp, Buf, 3);
85:
86: cgoto(pp, STAT_PLAY_ROW, STAT_LABEL_COL);
87: outstr(pp, "Player:", 7);
88: for (i = STAT_PLAY_ROW + 1, np = Player; np < End_player; np++) {
89: (void) sprintf(Buf, "%5.2f%c%-10.10s", np->p_ident->i_score,
90: stat_char(np), np->p_ident->i_name);
91: cgoto(pp, i++, STAT_NAME_COL);
92: outstr(pp, Buf, STAT_NAME_LEN);
93: }
94:
95: # ifdef MONITOR
96: cgoto(pp, STAT_MON_ROW, STAT_LABEL_COL);
97: outstr(pp, "Monitor:", 8);
98: for (i = STAT_MON_ROW + 1, np = Monitor; np < End_monitor; np++) {
99: (void) sprintf(Buf, "%5.5s %-10.10s", " ", np->p_ident->i_name);
100: cgoto(pp, i++, STAT_NAME_COL);
101: outstr(pp, Buf, STAT_NAME_LEN);
102: }
103: # endif MONITOR
104: }
105:
106: # ifndef CPUHOG
107: look(pp)
108: register PLAYER *pp;
109: {
110: register int x, y;
111:
112: x = pp->p_x;
113: y = pp->p_y;
114:
115: check(pp, y - 1, x - 1);
116: check(pp, y - 1, x );
117: check(pp, y - 1, x + 1);
118: check(pp, y , x - 1);
119: check(pp, y , x );
120: check(pp, y , x + 1);
121: check(pp, y + 1, x - 1);
122: check(pp, y + 1, x );
123: check(pp, y + 1, x + 1);
124:
125: switch (pp->p_face) {
126: case LEFTS:
127: see(pp, LEFTS);
128: see(pp, ABOVE);
129: see(pp, BELOW);
130: break;
131: case RIGHT:
132: see(pp, RIGHT);
133: see(pp, ABOVE);
134: see(pp, BELOW);
135: break;
136: case ABOVE:
137: see(pp, ABOVE);
138: see(pp, LEFTS);
139: see(pp, RIGHT);
140: break;
141: case BELOW:
142: see(pp, BELOW);
143: see(pp, LEFTS);
144: see(pp, RIGHT);
145: break;
146: # ifdef FLY
147: case FLYER:
148: break;
149: # endif FLY
150: }
151: cgoto(pp, y, x);
152: }
153:
154: see(pp, face)
155: register PLAYER *pp;
156: int face;
157: {
158: register char *sp;
159: register int y, x, i, cnt;
160:
161: x = pp->p_x;
162: y = pp->p_y;
163:
164: switch (face) {
165: case LEFTS:
166: sp = &Maze[y][x];
167: for (i = 0; See_over[*--sp]; i++)
168: continue;
169:
170: if (i == 0)
171: break;
172:
173: cnt = i;
174: x = pp->p_x - 1;
175: --y;
176: while (i--)
177: check(pp, y, --x);
178: i = cnt;
179: x = pp->p_x - 1;
180: ++y;
181: while (i--)
182: check(pp, y, --x);
183: i = cnt;
184: x = pp->p_x - 1;
185: ++y;
186: while (i--)
187: check(pp, y, --x);
188: break;
189: case RIGHT:
190: sp = &Maze[y][++x];
191: for (i = 0; See_over[*sp++]; i++)
192: continue;
193:
194: if (i == 0)
195: break;
196:
197: cnt = i;
198: x = pp->p_x + 1;
199: --y;
200: while (i--)
201: check(pp, y, ++x);
202: i = cnt;
203: x = pp->p_x + 1;
204: ++y;
205: while (i--)
206: check(pp, y, ++x);
207: i = cnt;
208: x = pp->p_x + 1;
209: ++y;
210: while (i--)
211: check(pp, y, ++x);
212: break;
213: case ABOVE:
214: sp = &Maze[--y][x];
215: if (!See_over[*sp])
216: break;
217: do {
218: --y;
219: sp -= sizeof Maze[0];
220: check(pp, y, x - 1);
221: check(pp, y, x );
222: check(pp, y, x + 1);
223: } while (See_over[*sp]);
224: break;
225: case BELOW:
226: sp = &Maze[++y][x];
227: if (!See_over[*sp])
228: break;
229: do {
230: y++;
231: sp += sizeof Maze[0];
232: check(pp, y, x - 1);
233: check(pp, y, x );
234: check(pp, y, x + 1);
235: } while (See_over[*sp]);
236: break;
237: }
238: }
239:
240: # else CPUHOG
241:
242: look(pp)
243: register PLAYER *pp;
244: {
245: switch (pp->p_face) {
246: case LEFTS:
247: lookquad2(pp, pp->p_y, pp->p_x);
248: lookquad3(pp, pp->p_y, pp->p_x);
249: break;
250: case RIGHT:
251: lookquad1(pp, pp->p_y, pp->p_x);
252: lookquad4(pp, pp->p_y, pp->p_x);
253: break;
254: case ABOVE:
255: lookquad3(pp, pp->p_y, pp->p_x);
256: lookquad4(pp, pp->p_y, pp->p_x);
257: break;
258: case BELOW:
259: lookquad1(pp, pp->p_y, pp->p_x);
260: lookquad2(pp, pp->p_y, pp->p_x);
261: break;
262: }
263: cgoto(pp, pp->p_y, pp->p_x);
264: }
265: # endif CPUHOG
266:
267: check(pp, y, x)
268: PLAYER *pp;
269: int y, x;
270: {
271: register int index;
272: register int ch;
273: register PLAYER *rpp;
274:
275: index = y * sizeof Maze[0] + x;
276: ch = ((char *) Maze)[index];
277: if (ch != ((char *) pp->p_maze)[index]) {
278: rpp = pp;
279: cgoto(rpp, y, x);
280: if (x == rpp->p_x && y == rpp->p_y)
281: outch(rpp, translate(ch));
282: else
283: outch(rpp, ch);
284: ((char *) rpp->p_maze)[index] = ch;
285: }
286: }
287:
288: /*
289: * showstat
290: * Update the status of players
291: */
292: showstat(pp)
293: register PLAYER *pp;
294: {
295: register PLAYER *np;
296: register int y;
297: register char c;
298:
299: y = STAT_PLAY_ROW + 1 + (pp - Player);
300: c = stat_char(pp);
301: # ifdef MONITOR
302: for (np = Monitor; np < End_monitor; np++) {
303: cgoto(np, y, STAT_SCAN_COL);
304: outch(np, c);
305: }
306: # endif MONITOR
307: for (np = Player; np < End_player; np++) {
308: cgoto(np, y, STAT_SCAN_COL);
309: outch(np, c);
310: }
311: }
312:
313: /*
314: * drawplayer:
315: * Draw the player on the screen and show him to everyone who's scanning
316: * unless he is cloaked.
317: */
318: drawplayer(pp, draw)
319: PLAYER *pp;
320: FLAG draw;
321: {
322: register PLAYER *newp;
323: register int x, y;
324:
325: x = pp->p_x;
326: y = pp->p_y;
327: Maze[y][x] = draw ? pp->p_face : pp->p_over;
328:
329: # ifdef MONITOR
330: for (newp = Monitor; newp < End_monitor; newp++)
331: check(newp, y, x);
332: # endif MONITOR
333:
334: for (newp = Player; newp < End_player; newp++) {
335: if (!draw || newp == pp) {
336: check(newp, y, x);
337: continue;
338: }
339: if (newp->p_scan == 0) {
340: cgoto(newp, STAT_SCAN_ROW, STAT_VALUE_COL);
341: outstr(newp, " ", 3);
342: newp->p_scan--;
343: showstat(newp);
344: }
345: else if (newp->p_scan > 0) {
346: if (pp->p_cloak < 0)
347: check(newp, y, x);
348: newp->p_scan--;
349: }
350: }
351: if (!draw || pp->p_cloak < 0)
352: return;
353: if (pp->p_cloak-- == 0) {
354: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
355: outstr(pp, " ", 3);
356: showstat(pp);
357: }
358: }
359:
360: message(pp, s)
361: register PLAYER *pp;
362: char *s;
363: {
364: cgoto(pp, HEIGHT, 0);
365: outstr(pp, s, strlen(s));
366: ce(pp);
367: }
368:
369: /*
370: * translate:
371: * Turn a charcter into the right direction character if we are
372: * looking at the current player.
373: */
374: translate(ch)
375: char ch;
376: {
377: switch (ch) {
378: case LEFTS:
379: return '<';
380: case RIGHT:
381: return '>';
382: case ABOVE:
383: return '^';
384: case BELOW:
385: return 'v';
386: }
387: return ch;
388: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.