|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)klmove.c 4.2 (Berkeley) 5/27/83"; ! 3: #endif not lint ! 4: ! 5: # include "trek.h" ! 6: ! 7: /* ! 8: ** Move Klingons Around ! 9: ** ! 10: ** This is a largely incomprehensible block of code that moves ! 11: ** Klingons around in a quadrant. It was written in a very ! 12: ** "program as you go" fashion, and is a prime candidate for ! 13: ** rewriting. ! 14: ** ! 15: ** The flag `fl' is zero before an attack, one after an attack, ! 16: ** and two if you are leaving a quadrant. This serves to ! 17: ** change the probability and distance that it moves. ! 18: ** ! 19: ** Basically, what it will try to do is to move a certain number ! 20: ** of steps either toward you or away from you. It will avoid ! 21: ** stars whenever possible. Nextx and nexty are the next ! 22: ** sector to move to on a per-Klingon basis; they are roughly ! 23: ** equivalent to Ship.sectx and Ship.secty for the starship. Lookx and ! 24: ** looky are the sector that you are going to look at to see ! 25: ** if you can move their. Dx and dy are the increment. Fudgex ! 26: ** and fudgey are the things you change around to change your ! 27: ** course around stars. ! 28: */ ! 29: ! 30: klmove(fl) ! 31: int fl; ! 32: { ! 33: int n; ! 34: register struct kling *k; ! 35: double dx, dy; ! 36: int nextx, nexty; ! 37: register int lookx, looky; ! 38: int motion; ! 39: int fudgex, fudgey; ! 40: int qx, qy; ! 41: double bigger; ! 42: int i; ! 43: ! 44: # ifdef xTRACE ! 45: if (Trace) ! 46: printf("klmove: fl = %d, Etc.nkling = %d\n", fl, Etc.nkling); ! 47: # endif ! 48: for (n = 0; n < Etc.nkling; k && n++) ! 49: { ! 50: k = &Etc.klingon[n]; ! 51: i = 100; ! 52: if (fl) ! 53: i = 100.0 * k->power / Param.klingpwr; ! 54: if (ranf(i) >= Param.moveprob[2 * Move.newquad + fl]) ! 55: continue; ! 56: /* compute distance to move */ ! 57: motion = ranf(75) - 25; ! 58: motion *= k->avgdist * Param.movefac[2 * Move.newquad + fl]; ! 59: /* compute direction */ ! 60: dx = Ship.sectx - k->x + ranf(3) - 1; ! 61: dy = Ship.secty - k->y + ranf(3) - 1; ! 62: bigger = dx; ! 63: if (dy > bigger) ! 64: bigger = dy; ! 65: if (bigger == 0.0) ! 66: bigger = 1.0; ! 67: dx = dx / bigger + 0.5; ! 68: dy = dy / bigger + 0.5; ! 69: if (motion < 0) ! 70: { ! 71: motion = -motion; ! 72: dx = -dx; ! 73: dy = -dy; ! 74: } ! 75: fudgex = fudgey = 1; ! 76: /* try to move the klingon */ ! 77: nextx = k->x; ! 78: nexty = k->y; ! 79: for (; motion > 0; motion--) ! 80: { ! 81: lookx = nextx + dx; ! 82: looky = nexty + dy; ! 83: if (lookx < 0 || lookx >= NSECTS || looky < 0 || looky >= NSECTS) ! 84: { ! 85: /* new quadrant */ ! 86: qx = Ship.quadx; ! 87: qy = Ship.quady; ! 88: if (lookx < 0) ! 89: qx -= 1; ! 90: else ! 91: if (lookx >= NSECTS) ! 92: qx += 1; ! 93: if (looky < 0) ! 94: qy -= 1; ! 95: else ! 96: if (looky >= NSECTS) ! 97: qy += 1; ! 98: if (qx < 0 || qx >= NQUADS || qy < 0 || qy >= NQUADS || ! 99: Quad[qx][qy].stars < 0 || Quad[qx][qy].klings > MAXKLQUAD - 1) ! 100: break; ! 101: if (!damaged(SRSCAN)) ! 102: { ! 103: printf("Klingon at %d,%d escapes to quadrant %d,%d\n", ! 104: k->x, k->y, qx, qy); ! 105: motion = Quad[qx][qy].scanned; ! 106: if (motion >= 0 && motion < 1000) ! 107: Quad[qx][qy].scanned += 100; ! 108: motion = Quad[Ship.quadx][Ship.quady].scanned; ! 109: if (motion >= 0 && motion < 1000) ! 110: Quad[Ship.quadx][Ship.quady].scanned -= 100; ! 111: } ! 112: Sect[k->x][k->y] = EMPTY; ! 113: Quad[qx][qy].klings += 1; ! 114: Etc.nkling -= 1; ! 115: bmove(&Etc.klingon[Etc.nkling], k, sizeof *k); ! 116: Quad[Ship.quadx][Ship.quady].klings -= 1; ! 117: k = 0; ! 118: break; ! 119: } ! 120: if (Sect[lookx][looky] != EMPTY) ! 121: { ! 122: lookx = nextx + fudgex; ! 123: if (lookx < 0 || lookx >= NSECTS) ! 124: lookx = nextx + dx; ! 125: if (Sect[lookx][looky] != EMPTY) ! 126: { ! 127: fudgex = -fudgex; ! 128: looky = nexty + fudgey; ! 129: if (looky < 0 || looky >= NSECTS || Sect[lookx][looky] != EMPTY) ! 130: { ! 131: fudgey = -fudgey; ! 132: break; ! 133: } ! 134: } ! 135: } ! 136: nextx = lookx; ! 137: nexty = looky; ! 138: } ! 139: if (k && (k->x != nextx || k->y != nexty)) ! 140: { ! 141: if (!damaged(SRSCAN)) ! 142: printf("Klingon at %d,%d moves to %d,%d\n", ! 143: k->x, k->y, nextx, nexty); ! 144: Sect[k->x][k->y] = EMPTY; ! 145: Sect[k->x = nextx][k->y = nexty] = KLINGON; ! 146: } ! 147: } ! 148: compkldist(0); ! 149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.