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