1: /* $Header: us.c,v 7.0.1.3 87/01/13 17:13:21 lwall Exp $ */ 2: 3: /* $Log: us.c,v $ 4: * Revision 7.0.1.3 87/01/13 17:13:21 lwall 5: * Partially fixed ^S behavior. It now just ignores ^S. 6: * 7: * Revision 7.0.1.2 86/12/12 17:06:09 lwall 8: * Baseline for net release. 9: * 10: * Revision 7.0.1.1 86/10/16 10:53:50 lwall 11: * Added Damage. Fixed random bugs. 12: * 13: * Revision 7.0 86/10/08 15:14:21 lwall 14: * Split into separate files. Added amoebas and pirates. 15: * 16: */ 17: 18: #include "EXTERN.h" 19: #include "warp.h" 20: #include "bang.h" 21: #include "object.h" 22: #include "play.h" 23: #include "sig.h" 24: #include "term.h" 25: #include "util.h" 26: #include "weapon.h" 27: #include "INTERN.h" 28: #include "us.h" 29: 30: void 31: us_init() 32: { 33: ; 34: } 35: 36: void 37: do_direction(dy,dx) 38: int dy, dx; 39: { 40: Reg1 int decr; 41: Reg2 OBJECT *obj; 42: 43: if (status < 2) { 44: if (cloaking) { 45: char ch; 46: 47: cloaked = FALSE; 48: ch = (ent->energy >= 500?'E':'e'); 49: if (ch != ent->image) { 50: setimage(ent, ch); 51: } 52: } 53: decr = 5+abs(evely)+abs(evelx)+tractor*tractor; 54: if (ent->energy >= decr) { 55: ent->energy -= decr; 56: if (tractor) { 57: if (!damage || !damflag[NOTRACTORS]) { 58: if (!rand_mod(50)) { 59: damage++; 60: damflag[NOTRACTORS] = rand_mod(smarts+10)+2; 61: } 62: if (tract(ent,dy,dx,tractor)) { 63: evely += tractor*dy; 64: evelx += tractor*dx; 65: } 66: } 67: } 68: else if (!damage || 69: (!entmode && !damflag[NOIMPULSE]) || 70: (entmode && !damflag[NOWARP]) ) { 71: if (!rand_mod(30+500/(abs(evely)+abs(evelx)+1))) { 72: damage++; 73: damflag[entmode?NOWARP:NOIMPULSE] = rand_mod(smarts+10)+2; 74: } 75: evely += dy; 76: evelx += dx; 77: } 78: if (inumthols && 79: (obj=occupant[(ent->posy+evely+YSIZE00)%YSIZE] 80: [(ent->posx+evelx+XSIZE00)%XSIZE] ) && 81: obj->type == Web) 82: evely = evelx = 0; 83: } 84: } 85: else if (status == 2) { 86: decr = 500+abs(bvely)*5+abs(bvelx)*5+tractor*tractor*100; 87: if (base->energy >= decr) { 88: base->energy -= decr; 89: if (tractor) { 90: if (tract(base,dy,dx,tractor)) { 91: bvely += tractor*dy; 92: bvelx += tractor*dx; 93: } 94: } 95: else { 96: bvely += dy; 97: bvelx += dx; 98: } 99: if (inumthols && 100: (obj=occupant[(base->posy+bvely+YSIZE00)%YSIZE] 101: [(base->posx+bvelx+XSIZE00)%XSIZE] ) && 102: obj->type == Web) 103: bvely = bvelx = 0; 104: } 105: } 106: tractor = 0; 107: } 108: 109: void 110: ctrl_direction(dy,dx) 111: int dy, dx; 112: { 113: if (status < 2) { 114: if (cloaking) { 115: char ch; 116: 117: cloaked = FALSE; 118: ch = (ent->energy >= 500?'E':'e'); 119: if (ch != ent->image) { 120: setimage(ent, ch); 121: } 122: } 123: if (!damage || !damflag[NOPHASERS]) { 124: if (!rand_mod(200)) { 125: damage++; 126: damflag[NOPHASERS] = rand_mod(smarts+10)+2; 127: } 128: fire_phaser(ent, dy, dx); 129: } 130: } 131: else if (status == 2) 132: fire_phaser(base, dy, dx); 133: } 134: 135: void 136: shift_direction(dy,dx) 137: int dy, dx; 138: { 139: if (status < 2) { 140: if (cloaking) { 141: char ch; 142: 143: cloaked = FALSE; 144: ch = (ent->energy >= 500?'E':'e'); 145: if (ch != ent->image) { 146: setimage(ent, ch); 147: } 148: } 149: if (!damage || !damflag[NOTORPS]) { 150: if (!rand_mod(300)) { 151: damage++; 152: damflag[NOTORPS] = rand_mod(smarts+10)+2; 153: } 154: fire_torp(ent, dy, dx); 155: } 156: } 157: else if (status == 2) 158: fire_torp(base, dy, dx); 159: } 160: 161: void 162: get_commands(done) 163: bool *done; 164: { 165: static char ch[80]; 166: Reg1 int i; 167: Reg2 int count; 168: Reg3 bool ctrla = FALSE; 169: char numdestructs = 0, numzaps = 0; 170: 171: top: 172: while (count = read_nd(ch,(sizeof ch))) { 173: for (i=0; i<count; i++) { 174: if (ch[i] == 'Q') { 175: bombed_out = TRUE; 176: *done = TRUE; 177: keepgoing = FALSE; 178: return; 179: } 180: if (ch[i] == 'q' || ch[i] == BREAKCH || ch[i] == INTRCH) { 181: int x; 182: static char quest[] = "Do you wish to escape from reality? "; 183: 184: if (timer >= whenok) { 185: mvaddstr(12,22,quest); 186: do { 187: getcmd(&ch[i]); 188: } while (ch[i] != 'y' && ch[i] != 'n'); 189: if (ch[i] == 'y') { 190: bombed_out = TRUE; 191: *done = TRUE; 192: return; 193: } 194: else { 195: for (x=11; x<=28; x++) { 196: mvaddch(12,x*2, 197: occupant[11][x] 198: ? occupant[11][x]->image 199: : numamoebas 200: ? amb[11][x] 201: : ' '); 202: addspace(); 203: } 204: roundsleep(2); 205: whenok = timer + 10; 206: goto top; 207: } 208: } 209: else { 210: write(1,"\07",1); 211: goto top; 212: } 213: } 214: } 215: for (i=0; i<count; i++) { 216: if (ctrla) { 217: switch (ch[i]) { 218: case '1': case 'b': 219: ctrl_direction(1, -1); 220: break; 221: case '2': case 'j': 222: ctrl_direction(1, 0); 223: break; 224: case '3': case 'n': 225: ctrl_direction(1, 1); 226: break; 227: case '4': case 'h': 228: ctrl_direction(0, -1); 229: break; 230: case '6': case 'l': 231: ctrl_direction(0, 1); 232: break; 233: case '7': case 'y': 234: ctrl_direction(-1, -1); 235: break; 236: case '8': case 'k': 237: ctrl_direction(-1, 0); 238: break; 239: case '9': case 'u': 240: ctrl_direction(-1, 1); 241: break; 242: case 'r': 243: rewrite(); 244: roundsleep(3); 245: ctrla = FALSE; 246: goto top; 247: case 'w': 248: clear(); 249: while (!input_pending()) 250: sleep(1); 251: rewrite(); 252: roundsleep(3); 253: ctrla = FALSE; 254: goto top; 255: #ifdef SIGTSTP 256: case 'z': 257: clear(); 258: mytstp(); 259: sleep(4); 260: ctrla = FALSE; 261: goto top; 262: #endif 263: default: 264: break; 265: } 266: ctrla = FALSE; 267: } 268: else { 269: switch (ch[i]) { 270: case 'Z': 271: clear(); 272: mytstp(); 273: sleep(4); 274: goto top; 275: case 'i': 276: if (ent && (!damage || !damflag[NOIMPULSE])) { 277: entmode = 0; 278: status = 0; 279: } 280: break; 281: case 'w': 282: if (ent && (!damage || !damflag[NOWARP])) { 283: entmode = 1; 284: status = 1; 285: } 286: break; 287: case 'p': 288: if (base) { 289: status = 2; 290: } 291: break; 292: case 'o': 293: if (status < 2) { 294: if (base) 295: status = 2; 296: } 297: else if (status == 2) { 298: if (ent) 299: status = entmode; 300: } 301: break; 302: case 'v': 303: if (ent) { 304: status = entmode; 305: } 306: cloaking=FALSE; 307: cloaked=FALSE; 308: break; 309: case 'c': 310: if (ent) { 311: status = entmode; 312: if (ent->energy >= 250) 313: cloaking = TRUE; 314: } 315: break; 316: case 'z': 317: if (ent && (!damage || !damflag[NOZAPPER])) { 318: ++numzaps; 319: if (!rand_mod(100/numzaps)) { 320: damage++; 321: damflag[NOZAPPER] = rand_mod(smarts+10)+2; 322: } 323: if (nxtbang && bangm[nxtbang-1] < 0) 324: --nxtbang; /* consolidate zaps */ 325: make_blast(evely*2+ent->posy,evelx*2+ent->posx, 326: -5000000L, 3*numzaps); 327: ent->energy /= 2; 328: } 329: break; 330: case 'D': 331: if (status < 2 && (!damage || !damflag[NODESTRUCT])) { 332: if (ent && !rand_mod(10)) { 333: damage++; 334: damflag[NODESTRUCT] = rand_mod(smarts+10)+2; 335: } 336: if (++numdestructs <= 2) 337: make_blast(evely*2+ent->posy,evelx*2+ent->posx, 338: 15000L, 3); 339: ent->energy /= 4; 340: } 341: else if (status == 2) { 342: if (numdestructs) 343: base->energy = base->energy / 2; 344: if (++numdestructs <= 2) 345: make_blast(base->posy, base->posx, 15000L, 5); 346: } 347: break; 348: case 'd': 349: if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) { 350: Reg4 OBJECT *obj; 351: int x, y; 352: 353: if (ent && !rand_mod(200)) { 354: damage++; 355: damflag[NODESTRUCT] = rand_mod(smarts+10)+2; 356: } 357: for (obj = root.prev; 358: obj != &root; 359: obj = obj->prev) { 360: if (obj->image == '+') { 361: blast[y=(obj->posy+obj->vely+YSIZE00)%YSIZE] 362: [x=(obj->posx+obj->velx+XSIZE00)%XSIZE] 363: += 1; 364: yblasted[y] |= 1; 365: xblasted[x] |= 1; 366: blasted = TRUE; 367: obj->mass = (massacre?3000:4000); 368: } 369: } 370: } 371: break; 372: case 's': 373: if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) { 374: Reg4 OBJECT *obj; 375: if (ent && !rand_mod(200)) { 376: damage++; 377: damflag[NODESTRUCT] = rand_mod(smarts+10)+2; 378: } 379: for (obj = root.prev; 380: obj->type == Torp || obj->type == Web || 381: obj->type == Star; 382: obj = obj->prev) { 383: if (obj->image == '+') 384: obj->vely = obj->velx = 0; 385: } 386: } 387: break; 388: case '\001': 389: ctrla = TRUE; 390: break; 391: case '\002': 392: case '\003': 393: case '\004': 394: case '\005': 395: case '\006': 396: case '\007': 397: case '\010': 398: case '\011': 399: case '\012': 400: case '\013': 401: case '\014': 402: case '\015': 403: case '\016': 404: case '\017': 405: case '\020': 406: case '\021': 407: case '\022': 408: case '\023': 409: case '\024': 410: case '\025': 411: case '\026': 412: case '\027': 413: case '\030': 414: case '\031': 415: case '\032': 416: ch[i] += 96; 417: i--; 418: ctrla = TRUE; 419: break; 420: case '\033': 421: tractor = 0; 422: break; 423: case 'a': 424: tractor++; 425: break; 426: case 'r': 427: tractor--; 428: break; 429: case '1': case 'b': 430: do_direction(1,-1); 431: break; 432: case '2': case 'j': 433: do_direction(1,0); 434: break; 435: case '3': case 'n': 436: do_direction(1,1); 437: break; 438: case '4': case 'h': 439: do_direction(0,-1); 440: break; 441: case '6': case 'l': 442: do_direction(0,1); 443: break; 444: case '7': case 'y': 445: do_direction(-1,-1); 446: break; 447: case '8': case 'k': 448: do_direction(-1,0); 449: break; 450: case '9': case 'u': 451: do_direction(-1,1); 452: break; 453: case '0': case 'S': 454: if (status < 2) { 455: evely = 0; 456: evelx = 0; 457: } 458: break; 459: case '-': 460: if (status < 2 && ent->energy >= 10) { 461: evely *= -1; 462: evelx *= -1; 463: ent->energy -= 10; 464: } 465: break; 466: case '%': case '\177': case '_': 467: shift_direction(0, -1); 468: shift_direction(0, 1); 469: shift_direction(-1, 0); 470: shift_direction(1, 0); 471: shift_direction(-1, -1); 472: shift_direction(-1, 1); 473: shift_direction(1, -1); 474: shift_direction(1, 1); 475: break; 476: case '!': case 'B': 477: shift_direction(1, -1); 478: break; 479: case '@': case 'J': 480: shift_direction(1, 0); 481: break; 482: case '#': case 'N': 483: shift_direction(1, 1); 484: break; 485: case '$': case 'H': 486: shift_direction(0, -1); 487: break; 488: case '^': case 'L': 489: shift_direction(0, 1); 490: break; 491: case '&': case 'Y': 492: shift_direction(-1, -1); 493: break; 494: case '*': case 'K': 495: shift_direction(-1, 0); 496: break; 497: case '(': case 'U': 498: shift_direction(-1, 1); 499: break; 500: case '?': 501: helper(); 502: roundsleep(3); 503: goto top; 504: default: 505: break; 506: } 507: } 508: } 509: } 510: }