|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California, ! 3: * All rights reserved. Redistribution permitted subject to ! 4: * the terms of the Berkeley Software License Agreement. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)fly.c 1.3 4/24/85"; ! 9: #endif ! 10: ! 11: #include "externs.h" ! 12: #undef UP ! 13: #include <curses.h> ! 14: ! 15: #define abs(a) ((a) < 0 ? -(a) : (a)) ! 16: #define MIDR (LINES/2 - 1) ! 17: #define MIDC (COLS/2 - 1) ! 18: ! 19: int row, column; ! 20: int dr = 0, dc = 0; ! 21: char destroyed; ! 22: int clock = 120; /* time for all the flights in the game */ ! 23: char cross = 0; ! 24: int (*oldsig)(); ! 25: ! 26: succumb() ! 27: { ! 28: switch (oldsig) { ! 29: case SIG_DFL: ! 30: endfly(); ! 31: exit(1); ! 32: case SIG_IGN: ! 33: break; ! 34: default: ! 35: endfly(); ! 36: (*oldsig)(); ! 37: } ! 38: } ! 39: ! 40: visual() ! 41: { ! 42: int moveenemy(); ! 43: ! 44: destroyed = 0; ! 45: savetty(); ! 46: if(initscr() == ERR){ ! 47: puts("Whoops! No more memory..."); ! 48: return(0); ! 49: } ! 50: oldsig = signal(SIGINT, succumb); ! 51: crmode(); ! 52: noecho(); ! 53: screen(); ! 54: row = rnd(LINES-3) + 1; ! 55: column = rnd(COLS-2) + 1; ! 56: moveenemy(); ! 57: for (;;) { ! 58: switch(getchar()){ ! 59: ! 60: case 'h': ! 61: case 'r': ! 62: dc = -1; ! 63: fuel--; ! 64: break; ! 65: ! 66: case 'H': ! 67: case 'R': ! 68: dc = -5; ! 69: fuel -= 10; ! 70: break; ! 71: ! 72: case 'l': ! 73: dc = 1; ! 74: fuel--; ! 75: break; ! 76: ! 77: case 'L': ! 78: dc = 5; ! 79: fuel -= 10; ! 80: break; ! 81: ! 82: case 'j': ! 83: case 'u': ! 84: dr = 1; ! 85: fuel--; ! 86: break; ! 87: ! 88: case 'J': ! 89: case 'U': ! 90: dr = 5; ! 91: fuel -= 10; ! 92: break; ! 93: ! 94: case 'k': ! 95: case 'd': ! 96: dr = -1; ! 97: fuel--; ! 98: break; ! 99: ! 100: case 'K': ! 101: case 'D': ! 102: dr = -5; ! 103: fuel -= 10; ! 104: break; ! 105: ! 106: case '+': ! 107: if (cross){ ! 108: cross = 0; ! 109: notarget(); ! 110: } ! 111: else ! 112: cross = 1; ! 113: break; ! 114: ! 115: case ' ': ! 116: case 'f': ! 117: if (torps){ ! 118: torps -= 2; ! 119: blast(); ! 120: if (row == MIDR && column - MIDC < 2 && MIDC - column < 2){ ! 121: destroyed = 1; ! 122: alarm(0); ! 123: } ! 124: } ! 125: else ! 126: mvaddstr(0,0,"*** Out of torpedoes. ***"); ! 127: break; ! 128: ! 129: case 'q': ! 130: endfly(); ! 131: return(0); ! 132: ! 133: default: ! 134: mvaddstr(0,26,"Commands = r,R,l,L,u,U,d,D,f,+,q"); ! 135: continue; ! 136: ! 137: case EOF: ! 138: break; ! 139: } ! 140: if (destroyed){ ! 141: endfly(); ! 142: return(1); ! 143: } ! 144: if (clock <= 0){ ! 145: endfly(); ! 146: die(); ! 147: } ! 148: } ! 149: } ! 150: ! 151: screen() ! 152: { ! 153: register int r,c,n; ! 154: int i; ! 155: ! 156: clear(); ! 157: i = rnd(100); ! 158: for (n=0; n < i; n++){ ! 159: r = rnd(LINES-3) + 1; ! 160: c = rnd(COLS); ! 161: mvaddch(r, c, '.'); ! 162: } ! 163: mvaddstr(LINES-1-1,21,"TORPEDOES FUEL TIME"); ! 164: refresh(); ! 165: } ! 166: ! 167: target() ! 168: { ! 169: register int n; ! 170: ! 171: move(MIDR,MIDC-10); ! 172: addstr("------- + -------"); ! 173: for (n = MIDR-4; n < MIDR-1; n++){ ! 174: mvaddch(n,MIDC,'|'); ! 175: mvaddch(n+6,MIDC,'|'); ! 176: } ! 177: } ! 178: ! 179: notarget() ! 180: { ! 181: register int n; ! 182: ! 183: move(MIDR,MIDC-10); ! 184: addstr(" "); ! 185: for (n = MIDR-4; n < MIDR-1; n++){ ! 186: mvaddch(n,MIDC,' '); ! 187: mvaddch(n+6,MIDC,' '); ! 188: } ! 189: } ! 190: ! 191: blast() ! 192: { ! 193: register int n; ! 194: ! 195: alarm(0); ! 196: move(LINES-1, 24); ! 197: printw("%3d", torps); ! 198: for(n = LINES-1-2; n >= MIDR + 1; n--){ ! 199: mvaddch(n, MIDC+MIDR-n, '/'); ! 200: mvaddch(n, MIDC-MIDR+n, '\\'); ! 201: refresh(); ! 202: } ! 203: mvaddch(MIDR,MIDC,'*'); ! 204: for(n = LINES-1-2; n >= MIDR + 1; n--){ ! 205: mvaddch(n, MIDC+MIDR-n, ' '); ! 206: mvaddch(n, MIDC-MIDR+n, ' '); ! 207: refresh(); ! 208: } ! 209: alarm(1); ! 210: } ! 211: ! 212: moveenemy() ! 213: { ! 214: double d; ! 215: int oldr, oldc; ! 216: ! 217: oldr = row; ! 218: oldc = column; ! 219: if (fuel > 0){ ! 220: if (row + dr <= LINES-3 && row + dr > 0) ! 221: row += dr; ! 222: if (column + dc < COLS-1 && column + dc > 0) ! 223: column += dc; ! 224: } else if (fuel < 0){ ! 225: fuel = 0; ! 226: mvaddstr(0,60,"*** Out of fuel ***"); ! 227: } ! 228: d = (double) ((row - MIDR)*(row - MIDR) + (column - MIDC)*(column - MIDC)); ! 229: if (d < 16){ ! 230: row += (rnd(9) - 4) % (4 - abs(row - MIDR)); ! 231: column += (rnd(9) - 4) % (4 - abs(column - MIDC)); ! 232: } ! 233: clock--; ! 234: mvaddstr(oldr, oldc - 1, " "); ! 235: if (cross) ! 236: target(); ! 237: mvaddstr(row, column - 1, "/-\\"); ! 238: move(LINES-1, 24); ! 239: printw("%3d", torps); ! 240: move(LINES-1, 42); ! 241: printw("%3d", fuel); ! 242: move(LINES-1, 57); ! 243: printw("%3d", clock); ! 244: refresh(); ! 245: signal(SIGALRM, moveenemy); ! 246: alarm(1); ! 247: } ! 248: ! 249: endfly() ! 250: { ! 251: alarm(0); ! 252: signal(SIGALRM, SIG_DFL); ! 253: mvcur(0,COLS-1,LINES-1,0); ! 254: endwin(); ! 255: signal(SIGTSTP, SIG_DFL); ! 256: signal(SIGINT, oldsig); ! 257: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.