|
|
1.1 root 1: /*
2: * Copyright (c) 1985 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.2 (Berkeley) 6/27/88";
20: #endif /* not lint */
21:
22: /*
23: * Hunt
24: * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
25: * San Francisco, California
26: */
27:
28: # include "hunt.h"
29:
30: # undef CTRL
31: # define CTRL(x) ('x' & 037)
32:
33: # ifdef MONITOR
34: /*
35: * mon_execute:
36: * Execute a single monitor command
37: */
38: mon_execute(pp)
39: register PLAYER *pp;
40: {
41: register char ch;
42:
43: ch = pp->p_cbuf[pp->p_ncount++];
44: switch (ch) {
45: case CTRL(L):
46: sendcom(pp, REDRAW);
47: break;
48: case 'q':
49: (void) strcpy(pp->p_death, "| Quit |");
50: break;
51: }
52: }
53: # endif MONITOR
54:
55: /*
56: * execute:
57: * Execute a single command
58: */
59: execute(pp)
60: register PLAYER *pp;
61: {
62: register char ch;
63:
64: ch = pp->p_cbuf[pp->p_ncount++];
65:
66: # ifdef FLY
67: if (pp->p_flying >= 0) {
68: switch (ch) {
69: case CTRL(L):
70: sendcom(pp, REDRAW);
71: break;
72: case 'q':
73: (void) strcpy(pp->p_death, "| Quit |");
74: break;
75: }
76: return;
77: }
78: # endif FLY
79:
80: switch (ch) {
81: case CTRL(L):
82: sendcom(pp, REDRAW);
83: break;
84: case 'h':
85: move(pp, LEFTS);
86: break;
87: case 'H':
88: face(pp, LEFTS);
89: break;
90: case 'j':
91: move(pp, BELOW);
92: break;
93: case 'J':
94: face(pp, BELOW);
95: break;
96: case 'k':
97: move(pp, ABOVE);
98: break;
99: case 'K':
100: face(pp, ABOVE);
101: break;
102: case 'l':
103: move(pp, RIGHT);
104: break;
105: case 'L':
106: face(pp, RIGHT);
107: break;
108: case 'f':
109: fire(pp, SHOT);
110: break;
111: case 'g':
112: fire(pp, GRENADE);
113: break;
114: case 'F':
115: fire(pp, SATCHEL);
116: break;
117: case 'G':
118: fire(pp, BOMB);
119: break;
120: # ifdef OOZE
121: case 'o':
122: fire_slime(pp, SLIMEREQ);
123: break;
124: case 'O':
125: fire_slime(pp, SSLIMEREQ);
126: break;
127: # endif OOZE
128: case 's':
129: scan(pp);
130: break;
131: case 'c':
132: cloak(pp);
133: break;
134: case 'q':
135: (void) strcpy(pp->p_death, "| Quit |");
136: break;
137: }
138: }
139:
140: /*
141: * move:
142: * Execute a move in the given direction
143: */
144: move(pp, dir)
145: register PLAYER *pp;
146: int dir;
147: {
148: register PLAYER *newp;
149: register int x, y;
150: register FLAG moved;
151: register BULLET *bp;
152:
153: y = pp->p_y;
154: x = pp->p_x;
155:
156: switch (dir) {
157: case LEFTS:
158: x--;
159: break;
160: case RIGHT:
161: x++;
162: break;
163: case ABOVE:
164: y--;
165: break;
166: case BELOW:
167: y++;
168: break;
169: }
170:
171: moved = FALSE;
172: switch (Maze[y][x]) {
173: case SPACE:
174: # ifdef RANDOM
175: case DOOR:
176: # endif RANDOM
177: moved = TRUE;
178: break;
179: case WALL1:
180: case WALL2:
181: case WALL3:
182: # ifdef REFLECT
183: case WALL4:
184: case WALL5:
185: # endif REFLECT
186: break;
187: case MINE:
188: case GMINE:
189: if (dir == pp->p_face)
190: pickup(pp, y, x, 5, Maze[y][x]);
191: else if (opposite(dir, pp->p_face))
192: pickup(pp, y, x, 95, Maze[y][x]);
193: else
194: pickup(pp, y, x, 50, Maze[y][x]);
195: Maze[y][x] = SPACE;
196: moved = TRUE;
197: break;
198: case SHOT:
199: case GRENADE:
200: case SATCHEL:
201: case BOMB:
202: bp = is_bullet(y, x);
203: if (bp != NULL)
204: bp->b_expl = TRUE;
205: Maze[y][x] = SPACE;
206: moved = TRUE;
207: break;
208: case LEFTS:
209: case RIGHT:
210: case ABOVE:
211: case BELOW:
212: # ifdef FLY
213: case FLYER:
214: # endif FLY
215: if (dir != pp->p_face)
216: sendcom(pp, BELL);
217: else {
218: newp = play_at(y, x);
219: checkdam(newp, pp, pp->p_ident, STABDAM, KNIFE);
220: }
221: break;
222: }
223: if (moved) {
224: if (pp->p_ncshot > 0)
225: if (--pp->p_ncshot == MAXNCSHOT) {
226: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);
227: outstr(pp, " ok", 3);
228: }
229: if (pp->p_undershot) {
230: fixshots(pp->p_y, pp->p_x, pp->p_over);
231: pp->p_undershot = FALSE;
232: }
233: drawplayer(pp, FALSE);
234: pp->p_over = Maze[y][x];
235: pp->p_y = y;
236: pp->p_x = x;
237: drawplayer(pp, TRUE);
238: }
239: }
240:
241: /*
242: * face:
243: * Change the direction the player is facing
244: */
245: face(pp, dir)
246: register PLAYER *pp;
247: register int dir;
248: {
249: if (pp->p_face != dir) {
250: pp->p_face = dir;
251: drawplayer(pp, TRUE);
252: }
253: }
254:
255: /*
256: * fire:
257: * Fire a shot of the given type in the given direction
258: */
259: fire(pp, type)
260: register PLAYER *pp;
261: register char type;
262: {
263: register int req_index;
264: static int req[4] = { BULREQ, GRENREQ, SATREQ, BOMBREQ };
265: static int shot_type[4] = { SHOT, GRENADE, SATCHEL, BOMB };
266:
267: if (pp == NULL)
268: return;
269: if (pp->p_ammo == 0) {
270: message(pp, "No more charges.");
271: return;
272: }
273: if (pp->p_ncshot > MAXNCSHOT)
274: return;
275: if (pp->p_ncshot++ == MAXNCSHOT) {
276: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);
277: outstr(pp, " ", 3);
278: }
279: switch (type) {
280: case SHOT:
281: req_index = 0;
282: break;
283: case GRENADE:
284: req_index = 1;
285: break;
286: case SATCHEL:
287: req_index = 2;
288: break;
289: case BOMB:
290: req_index = 3;
291: break;
292: # ifdef DEBUG
293: default:
294: message(pp, "What you do!!!");
295: return;
296: # endif DEBUG
297: }
298: while (pp->p_ammo < req[req_index])
299: req_index--;
300: pp->p_ammo -= req[req_index];
301: (void) sprintf(Buf, "%3d", pp->p_ammo);
302: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
303: outstr(pp, Buf, 3);
304:
305: add_shot(shot_type[req_index], pp->p_y, pp->p_x, pp->p_face,
306: req[req_index], pp, FALSE, pp->p_face);
307: pp->p_undershot = TRUE;
308:
309: /*
310: * Show the object to everyone
311: */
312: showexpl(pp->p_y, pp->p_x, shot_type[req_index]);
313: for (pp = Player; pp < End_player; pp++)
314: sendcom(pp, REFRESH);
315: # ifdef MONITOR
316: for (pp = Monitor; pp < End_monitor; pp++)
317: sendcom(pp, REFRESH);
318: # endif MONITOR
319: }
320:
321: # ifdef OOZE
322: /*
323: * fire_slime:
324: * Fire a slime shot in the given direction
325: */
326: fire_slime(pp, req)
327: register PLAYER *pp;
328: register int req;
329: {
330: if (pp == NULL)
331: return;
332: if (pp->p_ammo < req) {
333: message(pp, "Not enough charges.");
334: return;
335: }
336: if (pp->p_ncshot > MAXNCSHOT)
337: return;
338: if (pp->p_ncshot++ == MAXNCSHOT) {
339: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);
340: outstr(pp, " ", 3);
341: }
342: pp->p_ammo -= req;
343: (void) sprintf(Buf, "%3d", pp->p_ammo);
344: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
345: outstr(pp, Buf, 3);
346:
347: add_shot(SLIME, pp->p_y, pp->p_x, pp->p_face, req, pp, FALSE,
348: pp->p_face);
349:
350: /*
351: * Show the object to everyone
352: */
353: showexpl(pp->p_y, pp->p_x, SLIME);
354: for (pp = Player; pp < End_player; pp++)
355: sendcom(pp, REFRESH);
356: # ifdef MONITOR
357: for (pp = Monitor; pp < End_monitor; pp++)
358: sendcom(pp, REFRESH);
359: # endif MONITOR
360: }
361: # endif OOZE
362:
363: /*
364: * create_shot:
365: * Create a shot with the given properties
366: */
367: add_shot(type, y, x, face, charge, owner, expl, over)
368: int type;
369: int y, x;
370: char face;
371: int charge;
372: PLAYER *owner;
373: int expl;
374: char over;
375: {
376: register BULLET *bp;
377:
378: # ifdef CONSTANT_MOVE
379: /*
380: * if there are no bullets in flight, set up the alarm
381: */
382:
383: if (Bullets == NULL)
384: bul_alarm(1);
385: # endif CONSTANT_MOVE
386:
387: bp = create_shot(type, y, x, face, charge, owner,
388: (owner == NULL) ? NULL : owner->p_ident, expl, over);
389: bp->b_next = Bullets;
390: Bullets = bp;
391: }
392:
393: BULLET *
394: create_shot(type, y, x, face, charge, owner, score, expl, over)
395: int type;
396: int y, x;
397: char face;
398: int charge;
399: PLAYER *owner;
400: IDENT *score;
401: int expl;
402: char over;
403: {
404: register BULLET *bp;
405:
406: bp = (BULLET *) malloc(sizeof (BULLET)); /* NOSTRICT */
407: if (bp == NULL) {
408: if (owner != NULL)
409: message(owner, "Out of memory");
410: return NULL;
411: }
412:
413: bp->b_face = face;
414: bp->b_x = x;
415: bp->b_y = y;
416: bp->b_charge = charge;
417: bp->b_owner = owner;
418: bp->b_score = score;
419: bp->b_type = type;
420: bp->b_expl = expl;
421: bp->b_over = over;
422: bp->b_next = NULL;
423:
424: return bp;
425: }
426:
427: /*
428: * cloak:
429: * Turn on or increase length of a cloak
430: */
431: cloak(pp)
432: register PLAYER *pp;
433: {
434: if (pp->p_ammo <= 0) {
435: message(pp, "No more charges");
436: return;
437: }
438: (void) sprintf(Buf, "%3d", --pp->p_ammo);
439: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
440: outstr(pp, Buf, 3);
441:
442: pp->p_cloak += CLOAKLEN;
443: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
444: outstr(pp, " on", 3);
445:
446: if (pp->p_scan >= 0) {
447: pp->p_scan = -1;
448: cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL);
449: outstr(pp, " ", 3);
450: }
451:
452: showstat(pp);
453: }
454:
455: /*
456: * scan:
457: * Turn on or increase length of a scan
458: */
459: scan(pp)
460: register PLAYER *pp;
461: {
462: if (pp->p_ammo <= 0) {
463: message(pp, "No more charges");
464: return;
465: }
466: (void) sprintf(Buf, "%3d", --pp->p_ammo);
467: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
468: outstr(pp, Buf, 3);
469:
470: pp->p_scan += SCANLEN;
471: cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL);
472: outstr(pp, " on", 3);
473:
474: if (pp->p_cloak >= 0) {
475: pp->p_cloak = -1;
476: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
477: outstr(pp, " ", 3);
478: }
479:
480: showstat(pp);
481: }
482:
483: /*
484: * pickup:
485: * check whether the object blew up or whether he picked it up
486: */
487: pickup(pp, y, x, prob, obj)
488: register PLAYER *pp;
489: register int y, x;
490: int prob;
491: int obj;
492: {
493: register int req;
494:
495: switch (obj) {
496: case MINE:
497: req = BULREQ;
498: break;
499: case GMINE:
500: req = GRENREQ;
501: break;
502: default:
503: abort();
504: }
505: if (rand_num(100) < prob)
506: add_shot(obj, y, x, LEFTS, req, (PLAYER *) NULL,
507: TRUE, pp->p_face);
508: else {
509: pp->p_ammo += req;
510: (void) sprintf(Buf, "%3d", pp->p_ammo);
511: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
512: outstr(pp, Buf, 3);
513: }
514: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.