keep npartitions independent of byte order
[unix-history] / usr / src / games / trek / move.c
CommitLineData
b6f0a7e4
DF
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
44b8edd6 7#ifndef lint
b6f0a7e4 8static char sccsid[] = "@(#)move.c 5.1 (Berkeley) %G%";
44b8edd6
KM
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
06d69904 48double move(ramflag, course, time, speed)
44b8edd6
KM
49int ramflag;
50int course;
06d69904
KL
51double time;
52double speed;
44b8edd6
KM
53{
54 double angle;
06d69904 55 double x, y, dx, dy;
44b8edd6
KM
56 register int ix, iy;
57 double bigger;
58 int n;
59 register int i;
06d69904
KL
60 double dist;
61 double sectsize;
44b8edd6 62 double xn;
06d69904 63 double evtime;
44b8edd6
KM
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))
35b95499 74 angle += Param.navigcrud[1] * (franf() - 0.5);
44b8edd6
KM
75 else
76 if (Ship.sinsbad)
35b95499 77 angle += Param.navigcrud[0] * (franf() - 0.5);
44b8edd6
KM
78 dx = -cos(angle);
79 dy = sin(angle);
80 bigger = fabs(dx);
81 dist = fabs(dy);
82 if (dist > bigger)
83 bigger = dist;
35b95499
KL
84 dx /= bigger;
85 dy /= bigger;
44b8edd6
KM
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 */
35b95499 99 evtime += 0.005;
44b8edd6
KM
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 {
35b95499
KL
120 ix = (x += dx);
121 iy = (y += dy);
44b8edd6
KM
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);
35b95499 173 Ship.energy -= Param.stopengy * speed;
44b8edd6
KM
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}