|
|
1.1 ! root 1: /* $Header: them.c,v 7.0.1.5 86/12/12 17:05:41 lwall Exp $ */ ! 2: ! 3: /* $Log: them.c,v $ ! 4: * Revision 7.0.1.5 86/12/12 17:05:41 lwall ! 5: * Baseline for net release. ! 6: * ! 7: * Revision 7.0.1.4 86/10/20 12:32:38 lwall ! 8: * Wasn't clearing FRIENDLY flag on pirate creation. ! 9: * ! 10: * Revision 7.0.1.3 86/10/20 12:15:33 lwall ! 11: * Was trying to create pirates from cloaked pirates. ! 12: * ! 13: * Revision 7.0.1.2 86/10/17 10:03:44 lwall ! 14: * Fixed Romulan writing spaces while cloaked. ! 15: * ! 16: * Revision 7.0.1.1 86/10/16 10:53:39 lwall ! 17: * Added Damage. Fixed random bugs. ! 18: * ! 19: * Revision 7.0 86/10/08 15:14:15 lwall ! 20: * Split into separate files. Added amoebas and pirates. ! 21: * ! 22: */ ! 23: ! 24: #include "EXTERN.h" ! 25: #include "warp.h" ! 26: #include "bang.h" ! 27: #include "object.h" ! 28: #include "move.h" ! 29: #include "score.h" ! 30: #include "term.h" ! 31: #include "us.h" ! 32: #include "util.h" ! 33: #include "weapon.h" ! 34: #include "INTERN.h" ! 35: #include "them.h" ! 36: ! 37: void ! 38: them_init() ! 39: { ! 40: ; ! 41: } ! 42: ! 43: void ! 44: their_smarts() ! 45: { ! 46: Reg1 OBJECT *curkl; ! 47: Reg2 OBJECT *obj; ! 48: Reg3 int prob; ! 49: Reg4 int count; ! 50: Reg5 int y; ! 51: Reg6 int x; ! 52: ! 53: if (numcrushes && (obj=movers)->type == Crusher) { ! 54: if (numamoebas) { ! 55: y = obj->posy; ! 56: x = (obj->posx+(obj->image=='<'?1:-1)+XSIZE00)%XSIZE; ! 57: if (amb[y][x] == '~') { ! 58: obj->velx = 0; /* stop and munch amoeba */ ! 59: modify_amoeba(y,x,1,' ',(int)rand_mod(5+ambsize/10)+1); ! 60: if (occupant[y][x] == nuke) /* except go for nucleus */ ! 61: obj->velx = (obj->image=='<' ? 1 : -1); ! 62: } ! 63: else if (!obj->velx) { ! 64: if (!rand_mod(4)) ! 65: obj->image = rand_mod(2) ? '<' : '>'; ! 66: obj->velx = obj->image == '<' ? 1 : -1; ! 67: } ! 68: } ! 69: obj->vely += (rand_mod(222) - 111) / 100; ! 70: if (!(rand_mod(100))) { ! 71: setimage(obj, (obj->velx *= -1) < 0 ? '>' : '<'); ! 72: } ! 73: } ! 74: if (numamoebas) { ! 75: if (!rand_mod(3)) ! 76: nuke->velx = nuke->vely = 0; ! 77: if (nuke->strategy && ambsize < 90 && !rand_mod(200-smarts)) ! 78: modify_amoeba(0,0,0,'~',(int)rand_mod(10)); ! 79: if (ambsize > 200 || (ambsize > 100 && !rand_mod(15))) ! 80: modify_amoeba(yamblast,xamblast,2,' ',(ambsize-100)/5); ! 81: } ! 82: for (curkl = enemies; curkl->type == Enemy; curkl = curkl->next) { ! 83: if ((curkl->flags & (CLOAKS|FRIENDLY)) == CLOAKS && ! 84: (curkl->image != ' ') && ! 85: (curkl->energy > 300 || massacre) ) { ! 86: setimage(curkl, ' '); ! 87: } ! 88: if (madgorns) ! 89: prob = 3; ! 90: else if (curkl->vely || curkl->velx) ! 91: prob = massacre?10:20; ! 92: else if ((curkl->flags & (PIRATE|FRIENDLY)) == PIRATE) { ! 93: /* pirates want to sit sometimes */ ! 94: if (curkl->strategy) { ! 95: if ((obj = lookimg(curkl->posy, curkl->posx, '@')) || ! 96: (obj = lookimg(curkl->posy, curkl->posx, 'B')) ) { ! 97: make_plink(obj->posy, obj->posx); ! 98: if (!--curkl->strategy) { /* clock ran down */ ! 99: if (obj->image == '@') { ! 100: obj->image = '*'; ! 101: numinhab--; ! 102: if (obj->flags & STATIC) ! 103: mvaddch(obj->posy+1,obj->posx*2,obj->image); ! 104: if (curkl->energy < 20000) ! 105: curkl->energy += 5000; ! 106: } ! 107: prob = 2; /* our work here is done */ ! 108: } ! 109: else if (obj->image == 'B') { ! 110: btorp -= rand_mod(50); ! 111: if (btorp < 0) ! 112: btorp = 0; ! 113: obj->energy -= rand_mod(500); ! 114: if (obj->energy < 0) ! 115: obj->energy = 0; ! 116: prob = 10000; /* stay here */ ! 117: } ! 118: else ! 119: prob = 10000; ! 120: } ! 121: else { /* it went away--go elsewhere */ ! 122: prob = 4; ! 123: curkl->strategy = 0; ! 124: } ! 125: } ! 126: else if (lookimg(curkl->posy, curkl->posx, '@') || ! 127: lookimg(curkl->posy, curkl->posx, 'B')) { ! 128: curkl->strategy = rand_mod(15)+5; ! 129: prob = 10000; ! 130: } ! 131: else ! 132: prob = 4; ! 133: } ! 134: else if (curkl->image == 'M') { /* Mudd wants to sit sometimes */ ! 135: if ((obj = lookimg(curkl->posy, curkl->posx, 'E')) || ! 136: (obj = lookimg(curkl->posy, curkl->posx, 'B')) ) { ! 137: if (obj->image == 'B') { ! 138: btorp -= rand_mod(40); ! 139: if (btorp < 0) ! 140: btorp = 0; ! 141: obj->energy -= rand_mod(100); ! 142: if (obj->energy < 0) ! 143: obj->energy = 0; ! 144: } ! 145: else if (!obj->vely && !obj->velx) { ! 146: etorp -= rand_mod(10); ! 147: if (etorp < 0) ! 148: etorp = 0; ! 149: obj->energy -= rand_mod(20); ! 150: if (obj->energy < 0) ! 151: obj->energy = 0; ! 152: } ! 153: prob = 10000; /* stay here */ ! 154: } ! 155: else /* it went away--go elsewhere */ ! 156: prob = 4; ! 157: } ! 158: else if (curkl->flags & FRIENDLY) { ! 159: if (curkl->energy < 10000 && ! 160: lookimg(curkl->posy, curkl->posx, '@') ) { ! 161: curkl->energy += 100; ! 162: prob = 20; /* do some loading */ ! 163: } ! 164: else ! 165: prob = 4; ! 166: } ! 167: else if (curkl->image == '&') { ! 168: if (curkl->flags & COUNTDOWN) { ! 169: if (curkl->strategy) ! 170: curkl->strategy--; ! 171: else ! 172: curkl->flags &= ~COUNTDOWN; ! 173: prob = 100; /* someone's feeding us, so sit still */ ! 174: } ! 175: else ! 176: prob = 4; ! 177: } ! 178: else ! 179: prob = 4; /* don't sit still too long */ ! 180: count = 11; ! 181: for (;;) { ! 182: if (--count <= 0) /* no opening, just ram something */ ! 183: break; ! 184: ! 185: #ifdef lint ! 186: prob = prob; ! 187: #endif ! 188: if (!(rand_mod(prob))) /* turn randomly occasionally */ ! 189: goto accell; ! 190: ! 191: y=(curkl->posy+curkl->vely+YSIZE00)%YSIZE; /* find prospective */ ! 192: x=(curkl->posx+curkl->velx+XSIZE00)%XSIZE; /* new position */ ! 193: ! 194: if (numamoebas) { ! 195: if (curkl == nuke) { ! 196: if (amb[y][x] != '~') ! 197: goto accell; /* never move nucleus from protoplasm */ ! 198: } ! 199: else { ! 200: if (amb[y][x] == '~' && rand_mod(2)) { ! 201: yamblast = y; ! 202: xamblast = x; ! 203: goto accell; ! 204: } ! 205: } ! 206: } ! 207: ! 208: obj = occupant[y][x]; ! 209: if (!obj) break; /* is anyone there? */ ! 210: ! 211: switch (obj->type) { ! 212: case Star: ! 213: if (obj->image == '@' && (curkl->flags & PIRATE)) { ! 214: if (curkl->image != 'P' && curkl->image != ' ') { ! 215: if (curkl->flags & FRIENDLY) { ! 216: curkl->flags &= ~FRIENDLY; ! 217: curkl->energy += 1000; ! 218: possiblescore += curkl->mass; ! 219: inumfriends--; ! 220: numfriends--; ! 221: inumenemies++; ! 222: numenemies++; ! 223: } ! 224: curkl->image = 'P'; ! 225: } ! 226: break; /* go ahead and ram the star */ ! 227: } ! 228: goto accell; /* try not to ram stars */ ! 229: case Torp: ! 230: if (!obj->vely && !obj->velx && (rand_mod(100) <= smarts) && ! 231: (obj->image == 'o' || obj->image == 'O' || obj->image == 'X')) ! 232: goto accell; /* try not to ram "friendly" torps */ ! 233: break; ! 234: case Web: ! 235: if (curkl->image != 'T') ! 236: goto accell; /* non-Tholians shouldn't ram web */ ! 237: if (count <= 5) ! 238: break; /* Tholians retrace web if desperate */ ! 239: if (obj->image == ! 240: (curkl->vely? ! 241: (curkl->velx? ! 242: (curkl->velx==curkl->vely? ! 243: '\\' ! 244: : ! 245: '/' ! 246: ) ! 247: : ! 248: '|' ! 249: ) ! 250: : ! 251: '-' ! 252: ) ! 253: ) goto accell; /* Tholians try not to retrace web */ ! 254: break; /* No problem with crossing web */ ! 255: } ! 256: break; /* okay to move over object */ ! 257: ! 258: accell: ! 259: /* determine maximum velocity */ ! 260: if (massacre && curkl->image != 'T') { ! 261: curkl->vely = rand_mod(7) - 3; ! 262: curkl->velx = rand_mod(7) - 3; ! 263: } ! 264: else if (curkl->image == '&') { ! 265: if (rand_mod(2)) { ! 266: curkl->vely = rand_mod(3) - 1; ! 267: curkl->velx = rand_mod(3) - 1; ! 268: } ! 269: else { ! 270: curkl->vely = curkl->strategy & 3; ! 271: if (curkl->vely & 2) ! 272: curkl->vely = -1; ! 273: curkl->velx = (curkl->strategy >> 2) & 3; ! 274: if (curkl->velx & 2) ! 275: curkl->velx = -1; ! 276: } ! 277: } ! 278: else if (curkl->energy >= 2500 && curkl->image != 'T') { ! 279: curkl->vely = rand_mod(5) - 2; ! 280: curkl->velx = rand_mod(5) - 2; ! 281: } ! 282: else { ! 283: curkl->vely = rand_mod(3) - 1; ! 284: curkl->velx = rand_mod(3) - 1; ! 285: } ! 286: } ! 287: if (count != 10) { ! 288: if (curkl->image == ' ') { ! 289: setimage(curkl, curkl->flags & PIRATE ? 'P' : 'R'); ! 290: } ! 291: if (!count) { ! 292: curkl->vely = 0; ! 293: curkl->velx = 0; ! 294: } ! 295: } ! 296: if (curkl->image == 'G' && (base||ent) && ! 297: !rand_mod((103-smarts)*10) ) { ! 298: int xxx,yyy; ! 299: ! 300: for (xxx = -1; xxx<=1; xxx++) ! 301: for (yyy = -1; yyy<=1; yyy++) ! 302: if ((xxx||yyy) && rand_mod(2)) ! 303: fire_torp(curkl,yyy,xxx); ! 304: } ! 305: else if (curkl->image == 'T' && (curkl->velx || curkl->vely)) { ! 306: Make_object(Web, ! 307: curkl->vely? ! 308: (curkl->velx? ! 309: (curkl->velx==curkl->vely? ! 310: '\\' ! 311: : ! 312: '/' ! 313: ) ! 314: : ! 315: '|' ! 316: ) ! 317: : ! 318: '-', ! 319: curkl->posy,curkl->posx,0,0,32767L,32767L,&root); ! 320: if (obj && obj->type == Web) { ! 321: unmake_object(obj); ! 322: occupant[y][x] = Null(OBJECT*); ! 323: } ! 324: } ! 325: } ! 326: /* klingon-style fighting */ ! 327: if (numamoebas) ! 328: attack(nuke); ! 329: attack(base); ! 330: if (ent && (!cloaked || ent->image=='E' || ent->image=='e')) ! 331: attack(ent); ! 332: } ! 333: ! 334: void ! 335: modify_amoeba(y,x,where,ch,quant) ! 336: Reg1 int y; ! 337: Reg2 int x; ! 338: int where; ! 339: Reg6 int ch; ! 340: Reg7 int quant; ! 341: { ! 342: Reg3 int dy; ! 343: Reg4 int dx; ! 344: Reg5 int count = 15; ! 345: ! 346: if (!numamoebas) ! 347: return; ! 348: if (!where || (where==1 && rand_mod(2))) { ! 349: y = nuke->posy; ! 350: x = nuke->posx; ! 351: } ! 352: if (nuke->strategy && rand_mod(3)) { ! 353: dy = nuke->strategy & 3; ! 354: if (dy & 2) ! 355: dy = -1; ! 356: dx = (nuke->strategy >> 2) & 3; ! 357: if (dx & 2) ! 358: dx = -1; ! 359: if (ch == ' ') { /* take from the tail */ ! 360: dy = -dy; ! 361: dx = -dx; ! 362: } ! 363: if (!rand_mod(100)) ! 364: nuke->strategy = rand_mod(256); ! 365: } ! 366: else { ! 367: dy = rand_mod(3) - 1; ! 368: dx = rand_mod(3) - 1; ! 369: } ! 370: if (!dy && !dx) ! 371: return; ! 372: do { ! 373: if (--count < 0) ! 374: return; ! 375: y = (y + dy + YSIZE00) % YSIZE; ! 376: x = (x + dx + XSIZE00) % XSIZE; ! 377: } while (amb[y][x] != ' '); ! 378: if (ch == ' ') { ! 379: y = (y - dy + YSIZE00) % YSIZE; ! 380: x = (x - dx + XSIZE00) % XSIZE; ! 381: } ! 382: if (ambsize > 100 && quant > 2) { ! 383: quant >>= (ambsize/100); ! 384: } ! 385: if ((nuke->energy += quant << 6) > 32767) ! 386: nuke->energy = 32767; ! 387: count = quant << 3; /* endless loop catcher */ ! 388: while (count-- > 0 && quant > 0) { ! 389: if (amb[y][x] != ch) { ! 390: quant--; ! 391: amb[y][x] = ch; ! 392: if (ch == '~') { ! 393: ambsize++; ! 394: yblasted[y] |= 2; ! 395: xblasted[x] |= 2; ! 396: blasted = TRUE; ! 397: } ! 398: else ! 399: ambsize--; ! 400: if (!occupant[y][x]) ! 401: mvaddch(y+1,x*2,ch); ! 402: } ! 403: y = (y + rand_mod(3) + YSIZE99) % YSIZE; ! 404: x = (x + rand_mod(3) + XSIZE99) % XSIZE; ! 405: } ! 406: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.