|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)move.c 5.3 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: # include "trek.h" ! 23: ! 24: /* ! 25: ** Move Under Warp or Impulse Power ! 26: ** ! 27: ** `Ramflag' is set if we are to be allowed to ram stars, ! 28: ** Klingons, etc. This is passed from warp(), which gets it from ! 29: ** either play() or ram(). Course is the course (0 -> 360) at ! 30: ** which we want to move. `Speed' is the speed we ! 31: ** want to go, and `time' is the expected time. It ! 32: ** can get cut short if a long range tractor beam is to occur. We ! 33: ** cut short the move so that the user doesn't get docked time and ! 34: ** energy for distance which he didn't travel. ! 35: ** ! 36: ** We check the course through the current quadrant to see that he ! 37: ** doesn't run into anything. After that, though, space sort of ! 38: ** bends around him. Note that this puts us in the awkward posi- ! 39: ** tion of being able to be dropped into a sector which is com- ! 40: ** pletely surrounded by stars. Oh Well. ! 41: ** ! 42: ** If the SINS (Space Inertial Navigation System) is out, we ran- ! 43: ** domize the course accordingly before ever starting to move. ! 44: ** We will still move in a straight line. ! 45: ** ! 46: ** Note that if your computer is out, you ram things anyway. In ! 47: ** other words, if your computer and sins are both out, you're in ! 48: ** potentially very bad shape. ! 49: ** ! 50: ** Klingons get a chance to zap you as you leave the quadrant. ! 51: ** By the way, they also try to follow you (heh heh). ! 52: ** ! 53: ** Return value is the actual amount of time used. ! 54: ** ! 55: ** ! 56: ** Uses trace flag 4. ! 57: */ ! 58: ! 59: double move(ramflag, course, time, speed) ! 60: int ramflag; ! 61: int course; ! 62: double time; ! 63: double speed; ! 64: { ! 65: double angle; ! 66: double x, y, dx, dy; ! 67: register int ix, iy; ! 68: double bigger; ! 69: int n; ! 70: register int i; ! 71: double dist; ! 72: double sectsize; ! 73: double xn; ! 74: double evtime; ! 75: ! 76: # ifdef xTRACE ! 77: if (Trace) ! 78: printf("move: ramflag %d course %d time %.2f speed %.2f\n", ! 79: ramflag, course, time, speed); ! 80: # endif ! 81: sectsize = NSECTS; ! 82: /* initialize delta factors for move */ ! 83: angle = course * 0.0174532925; ! 84: if (damaged(SINS)) ! 85: angle += Param.navigcrud[1] * (franf() - 0.5); ! 86: else ! 87: if (Ship.sinsbad) ! 88: angle += Param.navigcrud[0] * (franf() - 0.5); ! 89: dx = -cos(angle); ! 90: dy = sin(angle); ! 91: bigger = fabs(dx); ! 92: dist = fabs(dy); ! 93: if (dist > bigger) ! 94: bigger = dist; ! 95: dx /= bigger; ! 96: dy /= bigger; ! 97: ! 98: /* check for long range tractor beams */ ! 99: /**** TEMPORARY CODE == DEBUGGING ****/ ! 100: evtime = Now.eventptr[E_LRTB]->date - Now.date; ! 101: # ifdef xTRACE ! 102: if (Trace) ! 103: printf("E.ep = %u, ->evcode = %d, ->date = %.2f, evtime = %.2f\n", ! 104: Now.eventptr[E_LRTB], Now.eventptr[E_LRTB]->evcode, ! 105: Now.eventptr[E_LRTB]->date, evtime); ! 106: # endif ! 107: if (time > evtime && Etc.nkling < 3) ! 108: { ! 109: /* then we got a LRTB */ ! 110: evtime += 0.005; ! 111: time = evtime; ! 112: } ! 113: else ! 114: evtime = -1.0e50; ! 115: dist = time * speed; ! 116: ! 117: /* move within quadrant */ ! 118: Sect[Ship.sectx][Ship.secty] = EMPTY; ! 119: x = Ship.sectx + 0.5; ! 120: y = Ship.secty + 0.5; ! 121: xn = NSECTS * dist * bigger; ! 122: n = xn + 0.5; ! 123: # ifdef xTRACE ! 124: if (Trace) ! 125: printf("dx = %.2f, dy = %.2f, xn = %.2f, n = %d\n", dx, dy, xn, n); ! 126: # endif ! 127: Move.free = 0; ! 128: ! 129: for (i = 0; i < n; i++) ! 130: { ! 131: ix = (x += dx); ! 132: iy = (y += dy); ! 133: # ifdef xTRACE ! 134: if (Trace) ! 135: printf("ix = %d, x = %.2f, iy = %d, y = %.2f\n", ix, x, iy, y); ! 136: # endif ! 137: if (x < 0.0 || y < 0.0 || x >= sectsize || y >= sectsize) ! 138: { ! 139: /* enter new quadrant */ ! 140: dx = Ship.quadx * NSECTS + Ship.sectx + dx * xn; ! 141: dy = Ship.quady * NSECTS + Ship.secty + dy * xn; ! 142: if (dx < 0.0) ! 143: ix = -1; ! 144: else ! 145: ix = dx + 0.5; ! 146: if (dy < 0.0) ! 147: iy = -1; ! 148: else ! 149: iy = dy + 0.5; ! 150: # ifdef xTRACE ! 151: if (Trace) ! 152: printf("New quad: ix = %d, iy = %d\n", ix, iy); ! 153: # endif ! 154: Ship.sectx = x; ! 155: Ship.secty = y; ! 156: compkldist(0); ! 157: Move.newquad = 2; ! 158: attack(0); ! 159: checkcond(); ! 160: Ship.quadx = ix / NSECTS; ! 161: Ship.quady = iy / NSECTS; ! 162: Ship.sectx = ix % NSECTS; ! 163: Ship.secty = iy % NSECTS; ! 164: if (ix < 0 || Ship.quadx >= NQUADS || iy < 0 || Ship.quady >= NQUADS) ! 165: if (!damaged(COMPUTER)) ! 166: { ! 167: dumpme(0); ! 168: } ! 169: else ! 170: lose(L_NEGENB); ! 171: initquad(0); ! 172: n = 0; ! 173: break; ! 174: } ! 175: if (Sect[ix][iy] != EMPTY) ! 176: { ! 177: /* we just hit something */ ! 178: if (!damaged(COMPUTER) && ramflag <= 0) ! 179: { ! 180: ix = x - dx; ! 181: iy = y - dy; ! 182: printf("Computer reports navigation error; %s stopped at %d,%d\n", ! 183: Ship.shipname, ix, iy); ! 184: Ship.energy -= Param.stopengy * speed; ! 185: break; ! 186: } ! 187: /* test for a black hole */ ! 188: if (Sect[ix][iy] == HOLE) ! 189: { ! 190: /* get dumped elsewhere in the galaxy */ ! 191: dumpme(1); ! 192: initquad(0); ! 193: n = 0; ! 194: break; ! 195: } ! 196: ram(ix, iy); ! 197: break; ! 198: } ! 199: } ! 200: if (n > 0) ! 201: { ! 202: dx = Ship.sectx - ix; ! 203: dy = Ship.secty - iy; ! 204: dist = sqrt(dx * dx + dy * dy) / NSECTS; ! 205: time = dist / speed; ! 206: if (evtime > time) ! 207: time = evtime; /* spring the LRTB trap */ ! 208: Ship.sectx = ix; ! 209: Ship.secty = iy; ! 210: } ! 211: Sect[Ship.sectx][Ship.secty] = Ship.ship; ! 212: compkldist(0); ! 213: return (time); ! 214: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.