|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.