|
|
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[] = "@(#)move.c 5.4 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: # include "robots.h"
25: # include <ctype.h>
26:
27: # define ESC '\033'
28:
29: /*
30: * get_move:
31: * Get and execute a move from the player
32: */
33: get_move()
34: {
35: register int c;
36: register int y, x, lastmove;
37: static COORD newpos;
38:
39: if (Waiting)
40: return;
41:
42: #ifdef FANCY
43: if (Pattern_roll) {
44: if (Next_move >= Move_list)
45: lastmove = *Next_move;
46: else
47: lastmove = -1; /* flag for "first time in" */
48: }
49: #endif
50: for (;;) {
51: if (Teleport && must_telep())
52: goto teleport;
53: if (Running)
54: c = Run_ch;
55: else if (Count != 0)
56: c = Cnt_move;
57: #ifdef FANCY
58: else if (Num_robots > 1 && Stand_still)
59: c = '>';
60: else if (Num_robots > 1 && Pattern_roll) {
61: if (*++Next_move == '\0') {
62: if (lastmove < 0)
63: goto over;
64: Next_move = Move_list;
65: }
66: c = *Next_move;
67: mvaddch(0, 0, c);
68: if (c == lastmove)
69: goto over;
70: }
71: #endif
72: else {
73: over:
74: c = getchar();
75: if (isdigit(c)) {
76: Count = (c - '0');
77: while (isdigit(c = getchar()))
78: Count = Count * 10 + (c - '0');
79: if (c == ESC)
80: goto over;
81: Cnt_move = c;
82: if (Count)
83: leaveok(stdscr, TRUE);
84: }
85: }
86:
87: switch (c) {
88: case ' ':
89: case '.':
90: if (do_move(0, 0))
91: goto ret;
92: break;
93: case 'y':
94: if (do_move(-1, -1))
95: goto ret;
96: break;
97: case 'k':
98: if (do_move(-1, 0))
99: goto ret;
100: break;
101: case 'u':
102: if (do_move(-1, 1))
103: goto ret;
104: break;
105: case 'h':
106: if (do_move(0, -1))
107: goto ret;
108: break;
109: case 'l':
110: if (do_move(0, 1))
111: goto ret;
112: break;
113: case 'b':
114: if (do_move(1, -1))
115: goto ret;
116: break;
117: case 'j':
118: if (do_move(1, 0))
119: goto ret;
120: break;
121: case 'n':
122: if (do_move(1, 1))
123: goto ret;
124: break;
125: case 'Y': case 'U': case 'H': case 'J':
126: case 'K': case 'L': case 'B': case 'N':
127: case '>':
128: Running = TRUE;
129: if (c == '>')
130: Run_ch = ' ';
131: else
132: Run_ch = tolower(c);
133: leaveok(stdscr, TRUE);
134: break;
135: case 'q':
136: case 'Q':
137: if (query("Really quit?"))
138: quit();
139: refresh();
140: break;
141: case 'w':
142: case 'W':
143: Waiting = TRUE;
144: leaveok(stdscr, TRUE);
145: flushok(stdscr, FALSE);
146: goto ret;
147: case 't':
148: case 'T':
149: teleport:
150: Running = FALSE;
151: mvaddch(My_pos.y, My_pos.x, ' ');
152: My_pos = *rnd_pos();
153: mvaddch(My_pos.y, My_pos.x, PLAYER);
154: leaveok(stdscr, FALSE);
155: refresh();
156: flush_in();
157: goto ret;
158: case CTRL(L):
159: wrefresh(curscr);
160: break;
161: case EOF:
162: break;
163: default:
164: putchar(CTRL(G));
165: reset_count();
166: fflush(stdout);
167: break;
168: }
169: }
170: ret:
171: if (Count > 0)
172: if (--Count == 0)
173: leaveok(stdscr, FALSE);
174: }
175:
176: /*
177: * must_telep:
178: * Must I teleport; i.e., is there anywhere I can move without
179: * being eaten?
180: */
181: must_telep()
182: {
183: register int x, y;
184: static COORD newpos;
185:
186: #ifdef FANCY
187: if (Stand_still && Num_robots > 1 && eaten(&My_pos))
188: return TRUE;
189: #endif
190:
191: for (y = -1; y <= 1; y++) {
192: newpos.y = My_pos.y + y;
193: if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE)
194: continue;
195: for (x = -1; x <= 1; x++) {
196: newpos.x = My_pos.x + x;
197: if (newpos.x <= 0 || newpos.x >= X_FIELDSIZE)
198: continue;
199: if (Field[newpos.y][newpos.x] > 0)
200: continue;
201: if (!eaten(&newpos))
202: return FALSE;
203: }
204: }
205: return TRUE;
206: }
207:
208: /*
209: * do_move:
210: * Execute a move
211: */
212: do_move(dy, dx)
213: int dy, dx;
214: {
215: static COORD newpos;
216:
217: newpos.y = My_pos.y + dy;
218: newpos.x = My_pos.x + dx;
219: if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE ||
220: newpos.x <= 0 || newpos.x >= X_FIELDSIZE ||
221: Field[newpos.y][newpos.x] > 0 || eaten(&newpos)) {
222: if (Running) {
223: Running = FALSE;
224: leaveok(stdscr, FALSE);
225: move(My_pos.y, My_pos.x);
226: refresh();
227: }
228: else {
229: putchar(CTRL(G));
230: reset_count();
231: }
232: return FALSE;
233: }
234: else if (dy == 0 && dx == 0)
235: return TRUE;
236: mvaddch(My_pos.y, My_pos.x, ' ');
237: My_pos = newpos;
238: mvaddch(My_pos.y, My_pos.x, PLAYER);
239: if (!jumping())
240: refresh();
241: return TRUE;
242: }
243:
244: /*
245: * eaten:
246: * Player would get eaten at this place
247: */
248: eaten(pos)
249: register COORD *pos;
250: {
251: register int x, y;
252:
253: for (y = pos->y - 1; y <= pos->y + 1; y++) {
254: if (y <= 0 || y >= Y_FIELDSIZE)
255: continue;
256: for (x = pos->x - 1; x <= pos->x + 1; x++) {
257: if (x <= 0 || x >= X_FIELDSIZE)
258: continue;
259: if (Field[y][x] == 1)
260: return TRUE;
261: }
262: }
263: return FALSE;
264: }
265:
266: /*
267: * reset_count:
268: * Reset the count variables
269: */
270: reset_count()
271: {
272: Count = 0;
273: Running = FALSE;
274: leaveok(stdscr, FALSE);
275: refresh();
276: }
277:
278: /*
279: * jumping:
280: * See if we are jumping, i.e., we should not refresh.
281: */
282: jumping()
283: {
284: return (Jump && (Count || Running || Waiting));
285: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.