|
|
1.1 root 1: #include <stdio.h>
2: #include "pacdefs.h"
3:
4: extern char
5: *vs_cm;
6:
7: extern char
8: brd[BRDY][BRDX],
9: display[BRDY][BRDX];
10:
11: extern int
12: putch();
13:
14: extern char
15: *tgoto();
16:
17: extern int
18: delay,
19: game,
20: killflg,
21: potion,
22: rounds;
23:
24: extern unsigned
25: pscore;
26:
27: extern struct pac
28: *pacptr;
29:
30: int rscore[MAXMONSTER];
31:
32: struct pac
33: monst[MAXMONSTER];
34:
35: startmonst()
36: {
37: register struct pac *mptr;
38: register int monstnum;
39:
40: if (potion == TRUE)
41: {
42: /* don't start if potion active */
43: return;
44: };
45:
46: for (mptr = &monst[0], monstnum = 0; monstnum < MAXMONSTER; mptr++, monstnum++)
47: {
48: if (mptr->stat == START)
49: {
50: rscore[monstnum] = 1;
51:
52: /* clear home */
53: PLOT(mptr->ypos, mptr->xpos, VACANT);
54:
55: /* initialize moving monster */
56: mptr->ypos = MBEGINY;
57: mptr->xpos = MBEGINX;
58: mptr->speed = SLOW;
59: mptr->danger = TRUE;
60: mptr->stat = RUN;
61: PLOT(MBEGINY, MBEGINX, MONSTER);
62:
63: /* DRIGHT or DLEFT? */
64: mptr->dirn = nrand(2) + DLEFT;
65: break;
66: };
67: };
68: }
69:
70: monster(mnum)
71: int mnum;
72: {
73: register int newx,newy;
74: register int tmpx, tmpy;
75: struct pac *mptr;
76: int gmod2;
77:
78: mptr = &monst[mnum];
79:
80: /* remember monster's current position */
81: tmpx = mptr->xpos;
82: tmpy = mptr->ypos;
83:
84: /* if we can, let's move a monster */
85: if (mptr->stat == RUN)
86: {
87: gmod2 = game % 2;
88: /* if a monster was displayed ... */
89: if ((gmod2 == 1) ||
90: ((gmod2 == 0) &&
91: (( (rounds - 1) % rscore[mnum]) == 0)))
92: {
93: /* replace display character */
94: PLOT(tmpy, tmpx, display[tmpy][tmpx]);
95: };
96:
97: /* get a new direction */
98: mptr->dirn = which(mptr, tmpx, tmpy);
99: switch (mptr->dirn)
100: {
101: case DUP:
102: newy = tmpy + UPINT;
103: newx = tmpx;
104: break;
105:
106: case DDOWN:
107: newy = tmpy + DOWNINT;
108: newx = tmpx;
109: break;
110:
111: case DLEFT:
112: newx = tmpx + LEFTINT;
113: newy = tmpy;
114: if (newx <= 0)
115: newx = XWRAP; /* wrap around */
116: break;
117:
118: case DRIGHT:
119: newx = tmpx + RIGHTINT;
120: newy = tmpy;
121: if (newx >= XWRAP)
122: newx = 0; /* wrap around */
123: break;
124: }
125:
126: /* use brd to determine if this was a valid direction */
127: switch (brd[newy][newx])
128: {
129: case GOLD:
130: case VACANT:
131: case POTION:
132: case TREASURE:
133: case CHOICE:
134: /* set new position */
135: mptr->xpos = newx;
136: mptr->ypos = newy;
137:
138: /* run into a pacman? */
139: if ((newy == pacptr->ypos) &&
140: (newx == pacptr->xpos))
141: {
142: killflg = dokill(mnum);
143: };
144: rscore[mnum] = pscore / 100 + 1;
145: if ((gmod2 == 1) || (killflg == TURKEY) ||
146: ( (gmod2 == 0) &&
147: ((rounds % rscore[mnum]) == 0)))
148: {
149:
150: if (mptr->danger == TRUE)
151: {
152: PLOT(newy, newx, MONSTER);
153: }
154: else if (killflg != GOTONE)
155: {
156: PLOT(newy, newx, RUNNER);
157: };
158: };
159: break;
160:
161: default:
162: errgen("bad direction");
163: break;
164: };
165: }
166: }
167:
168: which(mptr, x, y) /* which directions are available ? */
169: struct pac *mptr;
170: int x, y;
171: {
172: register int movecnt;
173: register int submovecnt;
174: register int next;
175: int moves[4];
176: int submoves[4];
177: int nydirn, nxdirn;
178: int goodmoves;
179: int offx, offy;
180: int tmpdirn;
181: char *brdptr;
182:
183: /*
184: * As a general rule: determine the set of all
185: * possible moves, but select only those moves
186: * that don't require a monster to backtrack.
187: */
188: movecnt = 0;
189: brdptr = &(brd[y][x]);
190: if (((tmpdirn = mptr->dirn) != DDOWN) &&
191: ((next = *(brdptr + (BRDX * UPINT))) != WALL) &&
192: (next != GATE))
193: {
194: moves[movecnt++] = DUP;
195: };
196: if ((tmpdirn != DUP) &&
197: ((next = *(brdptr + (BRDX * DOWNINT))) != WALL) &&
198: (next != GATE))
199: {
200: moves[movecnt++] = DDOWN;
201: };
202: if ((tmpdirn != DRIGHT) &&
203: ((next = *(brdptr + LEFTINT)) != WALL) &&
204: (next != GATE))
205: {
206: moves[movecnt++] = DLEFT;
207: };
208: if ((tmpdirn != DLEFT) &&
209: ((next = *(brdptr + RIGHTINT)) != WALL) &&
210: (next != GATE))
211: {
212: moves[movecnt++] = DRIGHT;
213: };
214:
215: /*
216: * If the player requested intelligent monsters and
217: * the player is scoring high ...
218: */
219: if (((game == 3) || (game == 4)) && (nrand(1000) < pscore))
220: {
221: /* make monsters intelligent */
222: if (pacptr->danger == TRUE)
223: {
224: /*
225: * Holy Cow!! The pacman is dangerous,
226: * permit monsters to reverse direction
227: */
228: switch (tmpdirn)
229: {
230: case DUP:
231: if ((*(brdptr + (BRDX * DOWNINT)) != WALL) &&
232: (*(brdptr + (BRDX * DOWNINT)) != GATE))
233: {
234: moves[movecnt++] = DDOWN;
235: };
236: break;
237:
238: case DDOWN:
239: if ((*(brdptr + (BRDX * UPINT)) != WALL) &&
240: (*(brdptr + (BRDX * UPINT)) != GATE))
241: {
242: moves[movecnt++] = DUP;
243: };
244: break;
245:
246: case DRIGHT:
247: if ((*(brdptr + LEFTINT) != WALL) &&
248: (*(brdptr + LEFTINT) != GATE))
249: {
250: moves[movecnt++] = DLEFT;
251: };
252: break;
253:
254: case DLEFT:
255: if ((*(brdptr + RIGHTINT) != WALL) &&
256: (*(brdptr + RIGHTINT) != GATE))
257: {
258: moves[movecnt++] = DRIGHT;
259: };
260: break;
261: };
262: };
263:
264: /* determine the offset from the pacman */
265: offx = x - pacptr->xpos;
266: offy = y - pacptr->ypos;
267: if (offx > 0)
268: {
269: /*need to go left */
270: nxdirn = DLEFT;
271: }
272: else
273: {
274: if (offx < 0)
275: {
276: nxdirn = DRIGHT;
277: }
278: else
279: {
280: /*need to stay here */
281: nxdirn = DNULL;
282: };
283: };
284: if (offy > 0)
285: {
286: /*need to go up */
287: nydirn = DUP;
288: }
289: else
290: {
291: if (offy < 0)
292: {
293: /* need to go down */
294: nydirn = DDOWN;
295: }
296: else
297: {
298: /* need to stay here */
299: nydirn = DNULL;
300: };
301: };
302: goodmoves = 0;
303: for (submovecnt = 0; submovecnt < movecnt; submovecnt++)
304: {
305: if (pacptr->danger == FALSE)
306: {
307: if ((moves[submovecnt] == nydirn) ||
308: (moves[submovecnt] == nxdirn))
309: {
310: submoves[goodmoves++] = moves[submovecnt];
311: };
312: }
313: else
314: {
315: if ((moves[submovecnt] != nydirn) &&
316: (moves[submovecnt] != nxdirn))
317: {
318: submoves[goodmoves++] = moves[submovecnt];
319: };
320: };
321: };
322: if (goodmoves > 0)
323: {
324: return(submoves[nrand(goodmoves)]);
325: };
326: };
327: return(moves[nrand(movecnt)]);
328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.