|
|
1.1 ! root 1: /* $Header: weapon.c,v 7.0.1.2 86/10/20 14:36:33 lwall Exp $ */ ! 2: ! 3: /* $Log: weapon.c,v $ ! 4: * Revision 7.0.1.2 86/10/20 14:36:33 lwall ! 5: * Picked some lint. ! 6: * ! 7: * Revision 7.0.1.1 86/10/16 10:54:42 lwall ! 8: * Added Damage. Fixed random bugs. ! 9: * ! 10: * Revision 7.0 86/10/08 15:18:08 lwall ! 11: * Split into separate files. Added amoebas and pirates. ! 12: * ! 13: */ ! 14: ! 15: #include "EXTERN.h" ! 16: #include "warp.h" ! 17: #include "bang.h" ! 18: #include "object.h" ! 19: #include "move.h" ! 20: #include "score.h" ! 21: #include "sig.h" ! 22: #include "term.h" ! 23: #include "them.h" ! 24: #include "us.h" ! 25: #include "util.h" ! 26: #include "INTERN.h" ! 27: #include "weapon.h" ! 28: ! 29: void ! 30: weapon_init() ! 31: { ! 32: ; ! 33: } ! 34: ! 35: void ! 36: fire_torp(from, ydir, xdir) ! 37: Reg1 OBJECT *from; ! 38: Reg3 int ydir; ! 39: Reg4 int xdir; ! 40: { ! 41: Reg2 OBJECT *to; ! 42: ! 43: if (from->type == Enemy || ! 44: (from == ent && etorp > 0) || ! 45: (from == base && btorp > 0)) { ! 46: to = occupant[(from->posy+from->vely+ydir+YSIZE00)%YSIZE] ! 47: [(from->posx+from->velx+xdir+XSIZE00)%XSIZE]; ! 48: if (from->type != Enemy || !to || to->vely || to->velx) { ! 49: if (from->type != Enemy && ! 50: (to = isatorp[from==base][ydir+1][xdir+1])) { ! 51: to->vely += ydir; ! 52: to->velx += xdir; ! 53: } ! 54: else { ! 55: if (from == ent) { ! 56: to = make_object(Torp, '+', from->posy,from->posx, ! 57: from->vely+ydir,from->velx+xdir, 0L, 1L,&root); ! 58: aretorps++; ! 59: isatorp[0][ydir+1][xdir+1] = to; ! 60: etorp--; ! 61: } ! 62: else if (from == base) { ! 63: to = make_object(Torp, '+', from->posy,from->posx, ! 64: from->vely+ydir,from->velx+xdir, 0L, 1L,&root); ! 65: aretorps++; ! 66: isatorp[1][ydir+1][xdir+1] = to; ! 67: btorp--; ! 68: } ! 69: else if (from->image == 'G') { ! 70: numos++; ! 71: to = make_object(Torp, 'o', from->posy,from->posx, ! 72: from->vely+ydir,from->velx+xdir, 100L, 1L,&root); ! 73: if (madgorns) { ! 74: possiblescore += 35; ! 75: to->image = '0'; ! 76: to->mass = 2000; ! 77: to->energy = 2000; ! 78: } ! 79: else if (rand_mod(120)+10 > smarts) ! 80: possiblescore += 100; ! 81: else { ! 82: possiblescore += 200; ! 83: to->image = 'O'; ! 84: } ! 85: } ! 86: else { ! 87: to = make_object(Torp, 'x', from->posy,from->posx, ! 88: from->vely+ydir,from->velx+xdir, 0L, 1L,&root); ! 89: if (rand_mod(160)+10 > smarts) ! 90: possiblescore += 10; ! 91: else { ! 92: possiblescore += 100; ! 93: to->image = 'X'; ! 94: to->mass = 1000+super*20; ! 95: numxes++; ! 96: } ! 97: } ! 98: } ! 99: } ! 100: } ! 101: } ! 102: ! 103: void ! 104: attack(attackee) ! 105: Reg7 OBJECT *attackee; ! 106: { ! 107: Reg1 int dx; ! 108: Reg2 int dy; ! 109: Reg3 int curx; ! 110: Reg4 int cury; ! 111: Reg5 int prob; ! 112: Reg6 OBJECT *obj; ! 113: Reg8 bool torps; ! 114: Reg9 bool webnear = FALSE; ! 115: Reg10 bool thru_stars; ! 116: int nukey; ! 117: int nukex; ! 118: int nukedist; ! 119: ! 120: if (attackee) { ! 121: if (attackee == nuke) { ! 122: if (amb[attackee->posy][attackee->posx] != '~') ! 123: return; ! 124: nukey = nukex = 0; ! 125: nukedist = 100; ! 126: } ! 127: for (dx= -1; dx<=1 ; dx++) { ! 128: for (dy= -1; dy<=1; dy++) { ! 129: if (dx||dy) { ! 130: cury = attackee->posy; ! 131: curx = attackee->posx; ! 132: torps = thru_stars = FALSE; ! 133: if (massacre || madgorns || !rand_mod(53-super) ) ! 134: webnear += rand_mod(2); ! 135: else ! 136: webnear = FALSE; ! 137: for (prob = scandist;prob;prob--) { ! 138: cury = (cury + dy + YSIZE00) % YSIZE; ! 139: curx = (curx + dx + XSIZE00) % XSIZE; ! 140: if (obj = occupant[cury][curx]) { ! 141: switch (obj->image) { ! 142: case 'P': case 'K': case 'R': case ' ': ! 143: pot_shot: ! 144: if (attackee == nuke) { ! 145: if (rand_mod(2+scandist-prob) < ! 146: rand_mod(smarts/40+1)) ! 147: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 148: } ! 149: if (rand_mod(51 - sm50) <= prob) { ! 150: switch (obj->strategy||thru_stars?0: ! 151: rand_mod(ent?4:2)) { ! 152: case 1: case 2: ! 153: if (-dy + attackee->vely == obj->vely ! 154: && -dx + attackee->velx == obj->velx) ! 155: fire_torp(obj, ! 156: -dy + attackee->vely, ! 157: -dx + attackee->velx); ! 158: else ! 159: fire_torp(obj, ! 160: -dy + attackee->vely - obj->vely, ! 161: -dx + attackee->velx - obj->velx); ! 162: if (obj->image == ' ') ! 163: setimage(obj, ! 164: obj->flags & PIRATE ? 'P' : 'R'); ! 165: break; ! 166: case 3: { ! 167: int newspeed = ! 168: rand_mod(prob<5&&smarts>70?4:3)-1; ! 169: ! 170: obj->vely = -dy * newspeed; ! 171: obj->velx = -dx * newspeed; ! 172: if (newspeed >= 0 && ! 173: !rand_mod(82-sm80)) { ! 174: obj->vely += attackee->vely; ! 175: obj->velx += attackee->velx; ! 176: } ! 177: break; ! 178: } ! 179: case 0: ! 180: if (!torps && obj->energy > 1000) { ! 181: fire_phaser(obj, -dy, -dx); ! 182: if (smarts > 40 && ! 183: (scandist-prob > 5 ! 184: || attackee==base) && ! 185: (massacre || obj->strategy || ! 186: rand_mod(2))) ! 187: while (rand_mod(2)) ! 188: fire_phaser(obj, -dy, -dx); ! 189: if (obj->image == ' ') ! 190: setimage(obj, ! 191: obj->flags&PIRATE ? 'P':'R'); ! 192: } ! 193: if (obj->strategy) { ! 194: obj->velx = obj->vely = 0; ! 195: if (obj->energy < 1000 || ! 196: bvely || bvelx) ! 197: obj->strategy = 0; ! 198: } ! 199: else if ((attackee==base || ! 200: (cloaking && attackee==ent) ! 201: ) && ! 202: scandist-prob > 5 && ! 203: !(rand_mod( ! 204: ent?antibase*2:antibase)) ) ! 205: obj->strategy = 1; ! 206: break; ! 207: } ! 208: } ! 209: goto bombout; ! 210: case 'G': ! 211: if (thru_stars && obj->strategy < 7) ! 212: goto bombout; ! 213: if (attackee == nuke) { ! 214: if (rand_mod(2+scandist-prob) < ! 215: rand_mod(smarts/40+1)) ! 216: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 217: goto bombout; ! 218: } ! 219: if (obj->strategy) { ! 220: if (madgorns || !rand_mod(4)) { ! 221: obj->vely = attackee->vely; ! 222: obj->velx = attackee->velx; ! 223: } ! 224: obj->strategy += (!torps && deados > 10); ! 225: if (obj->strategy > 4) ! 226: madgorns = TRUE; ! 227: if (!torps && obj->strategy > 5) { ! 228: do { ! 229: fire_phaser(obj, -dy, -dx); ! 230: } while (rand_mod(2)); ! 231: } ! 232: } ! 233: else if (numgorns >= numenemies-1 && ! 234: deados > 15+numgorns*5) ! 235: obj->strategy = 1; ! 236: if (madgorns || rand_mod(51 - sm50) <= prob) { ! 237: if (-dy + attackee->vely == obj->vely ! 238: && -dx + attackee->velx == obj->velx) ! 239: fire_torp(obj, ! 240: -dy + attackee->vely, ! 241: -dx + attackee->velx); ! 242: else ! 243: fire_torp(obj, ! 244: -dy + attackee->vely - obj->vely, ! 245: -dx + attackee->velx - obj->velx); ! 246: } ! 247: goto bombout; ! 248: case 'T': ! 249: if (attackee == nuke) { ! 250: if (rand_mod(2+scandist-prob) < ! 251: rand_mod(smarts/40+1)) ! 252: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 253: } ! 254: if (thru_stars) ! 255: goto bombout; ! 256: if (webnear && scandist-prob > 5) { ! 257: if (massacre || rand_mod(50) < super) { ! 258: if (!torps && obj->energy > 1000) { ! 259: fire_phaser(obj, -dy, -dx); ! 260: while (!rand_mod(57-sm55)) ! 261: fire_phaser(obj, -dy, -dx); ! 262: } ! 263: } ! 264: } ! 265: goto bombout; ! 266: case 'C': case 'c': ! 267: if (thru_stars) ! 268: goto bombout; ! 269: break; ! 270: case 'Q': case 'W': case 'Y': case 'U': ! 271: case 'I': case 'S': case 'D': case 'H': case 'J': ! 272: case 'L': case 'Z': case 'V': case 'M': case 'F': ! 273: if (attackee == nuke) { ! 274: if (rand_mod(2+scandist-prob) < ! 275: rand_mod(smarts/40+1)) ! 276: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 277: if (rand_mod(2)) ! 278: goto pot_shot; ! 279: } ! 280: if (madfriends > 1000) { ! 281: madfriends -= 200; ! 282: goto pot_shot; ! 283: } ! 284: /* FALL THROUGH */ ! 285: case '+': ! 286: if (attackee == nuke) { ! 287: if (smarts > 70) { ! 288: if ( ! 289: (obj->posx + obj->velx + XSIZE00)%XSIZE ! 290: == attackee->posx && ! 291: (obj->posy + obj->vely + YSIZE00)%YSIZE ! 292: == attackee->posy ) { ! 293: Tract(nuke,dy,dx,-1); ! 294: } ! 295: else ! 296: while (!rand_mod(82-sm80)) ! 297: Tract(nuke,dy,dx,-1); ! 298: } ! 299: else if (smarts > 60 || ! 300: rand_mod(2+scandist-prob) < ! 301: rand_mod(smarts/20+1)) ! 302: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 303: } ! 304: torps = FALSE; ! 305: thru_stars = FALSE; ! 306: break; ! 307: case '|': case '-': case '/': case '\\': ! 308: if (thru_stars) ! 309: goto bombout; ! 310: webnear = (scandist-prob < 3); ! 311: torps = FALSE; ! 312: break; ! 313: case 'x': ! 314: if (attackee == nuke) { ! 315: if (rand_mod(2+scandist-prob) < ! 316: rand_mod(smarts/20+1)) ! 317: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 318: } ! 319: if (thru_stars) ! 320: goto bombout; ! 321: torps = TRUE; ! 322: break; ! 323: case 'o': case 'O': case '0': ! 324: if (attackee == nuke) { ! 325: if (rand_mod(2+scandist-prob) < ! 326: rand_mod(smarts/20+1)) ! 327: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 328: } ! 329: if (thru_stars) ! 330: goto bombout; ! 331: torps = TRUE; ! 332: if (rand_mod(99+3*scandist) < smarts+3*prob) { ! 333: obj->vely = -dy + attackee->vely; ! 334: obj->velx = -dx + attackee->velx; ! 335: if (obj->flags & STATIC) {/* not a mover? */ ! 336: obj->flags &= ~STATIC; ! 337: obj->prev->next = obj->next; ! 338: obj->next->prev = obj->prev; ! 339: root.prev->next = obj; ! 340: obj->prev = root.prev; ! 341: root.prev = obj; ! 342: obj->next = &root; ! 343: } ! 344: } ! 345: if (obj->image != '0') ! 346: break; ! 347: /* DROP THROUGH! */ ! 348: case 'X': ! 349: if (attackee == nuke) { ! 350: if (rand_mod(2+scandist-prob) < ! 351: rand_mod(smarts/20+1)) ! 352: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 353: } ! 354: torps = TRUE; ! 355: if (thru_stars) ! 356: goto bombout; ! 357: if (prob == scandist) { ! 358: int y, x; ! 359: ! 360: blast[y=(obj->posy+obj->vely+YSIZE00)%YSIZE] ! 361: [x=(obj->posx+obj->velx+XSIZE00)%XSIZE] ! 362: += (obj->image == '0' ? 2000 : 200); ! 363: yblasted[y] |= 1; ! 364: xblasted[x] |= 1; ! 365: blasted = TRUE; ! 366: } ! 367: break; ! 368: case 'A': ! 369: if (attackee != nuke) { ! 370: if (scandist-prob>1 && !rand_mod(51-super)) ! 371: Tract(obj,-dy,-dx,1); ! 372: } ! 373: /* FALL THROUGH */ ! 374: case '*': case '@': ! 375: if (attackee == nuke) { ! 376: if (amb[cury][curx] != '~') { ! 377: if (scandist-prob < nukedist) { ! 378: nukedist = scandist-prob; ! 379: nukey = dy; /* nearest food in */ ! 380: nukex = dx; /* this direction */ ! 381: } ! 382: if (smarts > 55 && scandist-prob > 8) { ! 383: if (rand_mod(30+scandist-prob) < ! 384: rand_mod(smarts/20+1)) ! 385: Tract(nuke,dy,dx,1); ! 386: } ! 387: } ! 388: else if (obj->vely || obj->velx) { ! 389: Tract(nuke,dy,dx,1); /* for looks */ ! 390: obj->vely = obj->velx = 0; ! 391: } ! 392: } ! 393: if (!thru_stars) ! 394: if (rand_mod(97-sm95)) ! 395: goto bombout; ! 396: else ! 397: thru_stars = TRUE; ! 398: break; ! 399: case '<': case '>': ! 400: if (attackee == nuke) { ! 401: if ((!dy && scandist-prob < 8) || ! 402: rand_mod(2+scandist-prob) < ! 403: rand_mod(smarts/20+1) ) { ! 404: nuke->mass += 10000; ! 405: Tract(nuke,dy,dx,-1); ! 406: nuke->mass -= 10000; ! 407: } ! 408: } ! 409: goto bombout; ! 410: case 'E': case 'B': ! 411: if (attackee == nuke) { ! 412: if (rand_mod(2+scandist-prob) < ! 413: rand_mod(smarts/40+1)) ! 414: Tract(nuke,dy,dx,rand_mod(3)?1:-1); ! 415: } ! 416: goto bombout; ! 417: default: ! 418: goto bombout; ! 419: } ! 420: } ! 421: else { ! 422: if (thru_stars) ! 423: goto bombout; ! 424: } ! 425: } ! 426: bombout: ; /* end of loop */ ! 427: } ! 428: } ! 429: } ! 430: if (attackee == nuke && nukedist < 100) {/* aim amoeba at nearest */ ! 431: if (nukey < 0) /* free star */ ! 432: nukey = 2; ! 433: if (nukex < 0) ! 434: nukex = 2; ! 435: nuke->strategy = nukey + (nukex << 2); ! 436: } ! 437: } ! 438: } ! 439: ! 440: void ! 441: fire_phaser(obj, dy, dx) ! 442: Reg7 OBJECT *obj; ! 443: Reg5 int dy; ! 444: Reg6 int dx; ! 445: { ! 446: Reg1 int y; ! 447: Reg2 int x; ! 448: Reg3 int skipping; ! 449: Reg4 int size=5000; ! 450: int decr = 50, oldy, oldx; ! 451: static char curchar[] = "@* "; ! 452: ! 453: if (obj == ent) ! 454: decr = 100; ! 455: else if (obj == base) { ! 456: decr = 1000; ! 457: size = 200; ! 458: } ! 459: if (!dy) ! 460: curchar[2] = '-'; ! 461: else if (!dx) ! 462: curchar[2] = '!'; ! 463: else if (dy == dx) ! 464: curchar[2] = '\\'; ! 465: else ! 466: curchar[2] = '/'; ! 467: if (obj->energy >= decr) { ! 468: obj->energy -= decr; ! 469: for ( ! 470: /* initialize */ ! 471: skipping = (obj != base), ! 472: y = (obj->posy+(obj==base?dy*2:dy)+YSIZE00)%YSIZE, ! 473: x = (obj->posx+(obj==base?dx*2:dx)+XSIZE00)%XSIZE; ! 474: /* while */ ! 475: size && (!occupant[y][x]||(skipping && occupant[y][x]->type==Star)); ! 476: /* at end of loop */ ! 477: y = (y+dy+YSIZE00) % YSIZE, ! 478: x = (x+dx+XSIZE00) % XSIZE, ! 479: size = size * 3 / 4 ) { ! 480: move(y+1,x*2,0); ! 481: beg_qwrite(); ! 482: if (obj == base || obj->image == 'T') { ! 483: *filler = '@'; ! 484: qwrite(); ! 485: *filler = '#'; ! 486: qwrite(); ! 487: *filler = '~'; ! 488: qwrite(); ! 489: *filler = '%'; ! 490: qwrite(); ! 491: *filler = ':'; ! 492: qwrite(); ! 493: *filler = '@'; ! 494: } ! 495: else { ! 496: *filler = size >= 500 ? ! 497: *curchar : (size >= 50 ? ! 498: curchar[1] : ! 499: curchar[2]); ! 500: } ! 501: qwrite(); ! 502: if (occupant[y][x]) ! 503: qaddc(occupant[y][x]->image); ! 504: else { ! 505: if (numamoebas) ! 506: qaddc(amb[y][x]); ! 507: else ! 508: qaddspace(); ! 509: if (skipping) ! 510: skipping = 0; ! 511: } ! 512: end_qwrite(); ! 513: } ! 514: if (size) { ! 515: char img; ! 516: ! 517: assert(occupant[y][x]); ! 518: img = occupant[y][x]->image; ! 519: if (occupant[y][x]->type == Crusher) { ! 520: if (dy) ! 521: return; ! 522: if (dx==(img == '<' ? 1 : -1) ) { ! 523: occupant[y][x]->image = ! 524: (occupant[y][x]->velx *= -1) < 0 ? '>' : '<'; ! 525: return; ! 526: } ! 527: } ! 528: else if (occupant[y][x]->flags & FRIENDLY) ! 529: madfriends += 200; ! 530: if (numamoebas && amb[y][x] == '~' && smarts % 3 && ! 531: (smarts > 70 || rand_mod(smarts) > rand_mod(20)) ) { ! 532: if (size > 10000) ! 533: modify_amoeba(y,x,1,'~',10); ! 534: else if (size > 1000) ! 535: modify_amoeba(y,x,1,'~',7); ! 536: else if (size > 50) ! 537: modify_amoeba(y,x,1,'~',5); ! 538: else ! 539: modify_amoeba(y,x,1,'~',2); ! 540: if (occupant[y][x] == nuke) { ! 541: nuke->strategy = rand_mod(30); ! 542: nuke->flags |= COUNTDOWN; ! 543: } ! 544: return; ! 545: } ! 546: else { ! 547: move(y+1,x*2,0); ! 548: beg_qwrite(); ! 549: if (img == ' ') { ! 550: *filler = occupant[y][x]->flags & PIRATE ? 'P' : 'R'; ! 551: occupant[y][x]->image = *filler; ! 552: occupant[y][x]->strategy = 0; ! 553: qwrite(); ! 554: qwrite(); ! 555: } ! 556: else if (img == 'C' || img == 'c') { ! 557: cloaked = 0; ! 558: img += 2; ! 559: occupant[y][x]->image = img; ! 560: *filler = img; ! 561: qwrite(); ! 562: qwrite(); ! 563: } ! 564: else if (img == 'K' && size > 50) ! 565: occupant[y][x]->strategy = 0; ! 566: *filler = '@'; ! 567: qwrite(); ! 568: *filler = '#'; ! 569: qwrite(); ! 570: *filler = '@'; ! 571: qwrite(); ! 572: *filler = '#'; ! 573: qwrite(); ! 574: *filler = '@'; ! 575: qwrite(); ! 576: qaddc(img); ! 577: end_qwrite(); ! 578: oldy = y; ! 579: oldx = x; ! 580: y = (occupant[oldy][oldx]->posy + occupant[oldy][oldx]->vely + ! 581: YSIZE00) % YSIZE; ! 582: x = (occupant[oldy][oldx]->posx + occupant[oldy][oldx]->velx + ! 583: XSIZE00) % XSIZE; ! 584: if (occupant[y][x] && occupant[y][x]->type == Star) { ! 585: y = occupant[oldy][oldx]->posy; ! 586: x = occupant[oldy][oldx]->posx; ! 587: } ! 588: if (obj==base) ! 589: blast[y][x] += size>50 ? 15000 : (size>15 ? 1500 : 150); ! 590: else if (obj==ent) ! 591: blast[y][x] += size*4; ! 592: else if (obj->image=='T') ! 593: blast[y][x] += 15000; ! 594: else ! 595: blast[y][x] += size*smarts/25; ! 596: yblasted[y] |= 1; ! 597: xblasted[x] |= 1; ! 598: blasted = TRUE; ! 599: } ! 600: } ! 601: } ! 602: } ! 603: ! 604: int ! 605: tract(obj, dy, dx, to_or_fro) ! 606: Reg7 OBJECT *obj; ! 607: Reg4 int dy; ! 608: Reg5 int dx; ! 609: int to_or_fro; ! 610: { ! 611: Reg1 int y; ! 612: Reg2 int x; ! 613: Reg3 int size=10; ! 614: static char ch; ! 615: Reg6 OBJECT *tractee; ! 616: ! 617: if (!dy) ! 618: ch = '|'; ! 619: else if (!dx) ! 620: ch = '-'; ! 621: else if (dy == dx) ! 622: ch = '/'; ! 623: else ! 624: ch = '\\'; ! 625: { ! 626: for ( ! 627: y = (obj->posy+dy+YSIZE00)%YSIZE, ! 628: x = (obj->posx+dx+XSIZE00)%XSIZE; ! 629: size && (!occupant[y][x]); ! 630: y = (y+dy+YSIZE00) % YSIZE, x = (x+dx+XSIZE00) % XSIZE, size--) { ! 631: move(y+1,x*2,0); ! 632: beg_qwrite(); ! 633: *filler = ch; ! 634: qwrite(); ! 635: qwrite(); ! 636: if (numamoebas) ! 637: qaddch(amb[y][x]); ! 638: else ! 639: qaddspace(); ! 640: end_qwrite(); ! 641: } ! 642: tractee = occupant[y][x]; ! 643: if (size) { ! 644: assert(tractee); ! 645: if (numamoebas && obj != nuke && amb[y][x] == '~') { ! 646: if (to_or_fro > 0) ! 647: modify_amoeba(y,x,2,'~',size); ! 648: else ! 649: modify_amoeba(y,x,1,' ',size); ! 650: } ! 651: if (tractee->type != Web && ! 652: (tractee->mass < obj->mass * 5 || ! 653: (tractee->type == Crusher && !dx) ) ) { ! 654: if (tractee == ent) { ! 655: evely -= dy * to_or_fro; ! 656: evelx -= dx * to_or_fro; ! 657: } ! 658: else if (tractee == base) { ! 659: bvely -= dy * to_or_fro; ! 660: bvelx -= dx * to_or_fro; ! 661: } ! 662: else { ! 663: tractee->vely -= dy * to_or_fro; ! 664: tractee->velx -= dx * to_or_fro; ! 665: } ! 666: if (tractee->type == Torp || ! 667: tractee->type == Star) { ! 668: if (tractee->flags & STATIC) { /* not a mover? */ ! 669: tractee->flags &= ~STATIC; ! 670: tractee->prev->next = tractee->next; ! 671: tractee->next->prev = tractee->prev; ! 672: root.prev->next = tractee; ! 673: tractee->prev = root.prev; ! 674: root.prev = tractee; ! 675: tractee->next = &root; ! 676: } ! 677: } ! 678: } ! 679: else if (tractee->type == Crusher && !dy && ! 680: dx==(tractee->image == '<' ? 1 : -1) ) { ! 681: setimage(tractee, (tractee->velx *= -1) < 0 ? '>' : '<'); ! 682: } ! 683: if (tractee->mass * 5 > obj->mass) ! 684: return(1); ! 685: } ! 686: } ! 687: return(0); ! 688: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.