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