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