Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
geom.c
Go to the documentation of this file.
1/*
2 * Ship velocity limits, vector arithmetic and orientation geometry.
3 *
4 * Retail object 0x40A3A0-0x40D6AF (link order; see docs/ORDER.md).
5 */
6#include "game.h"
7
8/* Function start: 0x40A3A0 */
9short get_ship_max_velocity(short obj)
10{
11 short velocity = g_aObjectTypeData[
13
14 if (g_asShipSide[obj] != g_asShipSide[0] &&
16 velocity = (short)(
17 (int)MinShort(150, MaxShort(80, GetAdaptiveTurnRate())) *
18 velocity / 100);
19 }
22 return velocity + velocity / 3;
23 else
24 return velocity;
25}
26
27/* Function start: 0x40A481 */
28void recalc_max_velocity(short ship)
29{
30 short oldVelocity;
31
32 oldVelocity = g_asShipMaximumVelocity[ship];
33 if (g_anShipFuel[ship] <= 0) {
35 } else {
37 (short)(((4 - (int)g_acShipIonDriveDamage[ship]) *
38 (int)get_ship_max_velocity(ship)) >> 2);
39 }
40 if (g_asShipMaximumVelocity[ship] != oldVelocity)
41 celerate(ship, 0);
42}
43
44/* Function start: 0x40A51D */
45void drain_fuel(short ship, short amount)
46{
47 g_anShipFuel[ship] -= (int)amount;
48 if (g_anShipFuel == 0)
50}
51
52/* Function start: 0x40A556 */
53void damage_ion_drive(short ship, short amount, short maximum)
54{
55 g_acShipIonDriveDamage[ship] = (signed char)MaxShort(
56 0, MinShort((short)(g_acShipIonDriveDamage[ship] + amount),
57 maximum));
59}
60
61/* Function start: 0x40A5A0 */
63{
64 int adaptiveScale;
65 int acceleration;
66
67 acceleration = g_aObjectTypeData[
69 if (g_asShipSide[ship] != g_asShipSide[0] &&
71 adaptiveScale =
72 (int)MinShort(150, MaxShort(80, GetAdaptiveTurnRate())) << 8;
73 acceleration = MultiplyFixed(acceleration, adaptiveScale);
74 acceleration = DivideFixed(acceleration, 100 << 8);
75 }
76 if (g_asPilotLevel[ship] == RATING_ACE_SPIRIT &&
78 return acceleration + acceleration / 3;
79 else
80 return acceleration;
81}
82
83/* Function start: 0x40A691 */
84void point_at(short obj, FixedVector point)
85{
86 FixedVector direction;
87
88 ComputeVectorDelta(&g_aShipPosition[obj], &point, &direction);
89 shrink_vector(&direction);
90 g_aShipForwardVector[obj] = direction;
91 fix_objects_ijk(obj);
92}
93
94/* Function start: 0x40A6F7 */
95void look_at(short obj)
96{
98}
99
100/* Function start: 0x40A725 */
101void position_relative(FixedVector *position, FixedVector direction,
102 short distance)
103{
104 if (distance != 0) {
105 NormalizeFixedVector(&direction);
106 ScaleFixedVector(&direction, (int)distance << 8, &direction);
107 AddFixedVectors(position, &direction, position);
108 }
109}
110
111/* Function start: 0x40A774 */
112void position_relative_ijk(FixedVector *position, short obj,
113 short right, short up, short forward)
114{
115 *position = g_aShipPosition[obj];
116 position_relative(position, g_aShipRightVector[obj], right);
117 position_relative(position, g_aShipUpVector[obj], up);
118 position_relative(position, g_aShipForwardVector[obj], forward);
119}
120
121/* Function start: 0x40A81B */
123{
124 if (value < -0x7fff00)
125 return -0x7fff;
126 else if (value > 0x7fff00)
127 return 0x7fff;
128 else
129 return (short)(value >> 8);
130}
131
132/* Function start: 0x40A867 */
133int MinInt(int a, int b)
134{
135 if (b < a)
136 return b;
137 else
138 return a;
139}
140
141/* Function start: 0x40A893 */
142int MaxInt(int a, int b)
143{
144 if (b > a)
145 return b;
146 else
147 return a;
148}
149
150/* Function start: 0x40A8BF */
151int AbsInt(int v)
152{
153 if (v < 0)
154 return -v;
155 else
156 return v;
157}
158
159/* Function start: 0x40A8EB */
160unsigned int SignFixed(int v)
161{
162 if (v < 0)
163 return 0xffffff00;
164 if (v > 0)
165 return 0x100;
166 return 0;
167}
168
169/* Function start: 0x40A925 */
170/* Normalise a degree value into (-180, 180]. 0x168 == 360, 0xB4 == 180. */
171short WrapDegrees(short degrees)
172{
173 degrees %= 0x168;
174 if (degrees < -0xb4)
175 degrees += 0x168;
176 if (0xb4 < degrees)
177 degrees -= 0x168;
178 return degrees;
179}
180
181/* Function start: 0x40A981 */
182short equ_vector(const FixedVector *left, const FixedVector *right)
183{
184 return left->x == right->x && left->y == right->y &&
185 left->z == right->z;
186}
187
188void negate_vector(FixedVector *vector);
189
190/* Function start: 0x40A9D1 */
191short IsPairEqualityDifferentFromFlag(const unsigned int *values)
192{
193 return ((values[1] == values[0]) == values[2]) == 0;
194}
195
196/* Function start: 0x40AA0B */
198{
199 vector->x = vector->y = vector->z = 0;
200}
201
202/* Function start: 0x40AA37 */
204{
205 vector->x = -vector->x;
206 vector->y = -vector->y;
207 vector->z = -vector->z;
208}
209
210/* Function start: 0x40AA6A */
211void AddFixedVectors(const FixedVector *left, const FixedVector *right,
212 FixedVector *sum)
213{
214 sum->x = right->x + left->x;
215 sum->y = right->y + left->y;
216 sum->z = right->z + left->z;
217}
218
219/* Function start: 0x40AAA8 */
221 FixedVector *difference)
222{
223 difference->x = left->x - right->x;
224 difference->y = left->y - right->y;
225 difference->z = left->z - right->z;
226}
227
228/* Function start: 0x40AAE6 */
230{
231 delta->x = to->x - from->x;
232 delta->y = to->y - from->y;
233 delta->z = to->z - from->z;
234}
235
236/* Function start: 0x40AB24 */
237void ScaleFixedVector(FixedVector *vector, int scale, FixedVector *result)
238{
239 result->x = MultiplyFixed(vector->x, scale);
240 result->y = MultiplyFixed(vector->y, scale);
241 result->z = MultiplyFixed(vector->z, scale);
242}
243
244/* Function start: 0x40AB78 */
245void divide_vector(FixedVector *vector, int divisor, FixedVector *result)
246{
247 result->x = DivideFixed(vector->x, divisor);
248 result->y = DivideFixed(vector->y, divisor);
249 result->z = DivideFixed(vector->z, divisor);
250}
251
252/* Function start: 0x40ABCC */
253short ChooseRandomSignedMagnitude(short minimum, short maximum,
254 short allowNegative)
255{
256 short value = RandomInRange(minimum, maximum);
257
258 if (allowNegative != 0 && RandomInRange(0, 1) != 0)
259 value = -value;
260 return value;
261}
262
263/* Function start: 0x40AC24 */
264void MakeRandomVectorFixed(short minimum, short maximum, FixedVector *vector)
265{
266 vector->x = ChooseRandomSignedMagnitude(minimum, maximum, 1) << 8;
267 vector->y = ChooseRandomSignedMagnitude(minimum, maximum, 1) << 8;
268 vector->z = ChooseRandomSignedMagnitude(minimum, maximum, 1) << 8;
269}
270
271/* Function start: 0x40AC88 */
273{
274 MakeRandomVectorFixed(0, limit, vector);
275}
276
277/* Function start: 0x40ACA5 */
278void random_radial(const FixedVector *center, short radius,
279 FixedVector *position)
280{
281 FixedVector offset;
282
284 RandomBelowOrEqual(radius), &offset);
285 AddFixedVectors(center, &offset, position);
286}
287
288/* Function start: 0x40ACE0 */
289void rectangular_to_spherical(const FixedVector *rectangular,
290 SphericalVector *spherical)
291{
292 spherical->radius = Vector_magnitude(rectangular);
293 if (spherical->radius == 0)
294 return;
295 spherical->yaw = (short)ArcCos(
296 DivideFixed(rectangular->z,
297 PlanarMagnitude(rectangular->x, rectangular->z)));
298 if (rectangular->x < 0)
299 spherical->yaw = -spherical->yaw;
300 spherical->pitch = (short)(ArcCos(
301 DivideFixed(rectangular->y, spherical->radius)) - 90);
302}
303
304/* Function start: 0x40AD89 */
305/* No inbound reference is known in the shipped executable; this routine is
306 * believed unreachable. */
308 ShortVector *destination)
309{
310 destination->x = (short)(source->x >> 8);
311 destination->y = (short)(source->y >> 8);
312 destination->z = (short)(source->z >> 8);
313}
314
315/* Function start: 0x40ADC2 */
316int dot_product(const FixedVector *left, const FixedVector *right)
317{
318 return MultiplyFixed(left->x, right->x) +
319 MultiplyFixed(left->y, right->y) +
320 MultiplyFixed(left->z, right->z);
321}
322
323/* Function start: 0x40AE18 */
325{
326 short cosine;
327
329 NormalizeFixedVector(&right);
330 cosine = (short)dot_product(&left, &right);
331 return (short)((cosine * 100) / 0x100);
332}
333
334/* Function start: 0x40AE70 */
335void vector_cross_product(const FixedVector *left, const FixedVector *right,
336 FixedVector *product)
337{
338 product->x = MultiplyFixed(left->y, right->z) -
339 MultiplyFixed(left->z, right->y);
340 product->y = MultiplyFixed(left->z, right->x) -
341 MultiplyFixed(left->x, right->z);
342 product->z = MultiplyFixed(left->x, right->y) -
343 MultiplyFixed(left->y, right->x);
344}
345
346/* Function start: 0x40AF18 */
348{
349 int magnitude = Vector_magnitude(vector);
350
351 if (magnitude != 0) {
352 vector->x = DivideFixed(vector->x, magnitude);
353 vector->y = DivideFixed(vector->y, magnitude);
354 vector->z = DivideFixed(vector->z, magnitude);
355 return 1;
356 }
357 return 0;
358}
359
360/* Function start: 0x40AF99 */
362 const FixedVector *direction)
363{
364 FixedVector normalized;
365 int projection;
366
367 normalized = *vector;
368 NormalizeFixedVector(&normalized);
369 projection = MultiplyFixed(Vector_magnitude(vector),
370 dot_product(direction, &normalized));
371 return projection;
372}
373
374/* Function start: 0x40AFFA */
376 const FixedVector *direction,
377 FixedVector *component)
378{
379 int length;
380
381 length = vector_length_in_dir(vector, direction);
382 ScaleFixedVector((FixedVector *)direction, length, component);
383}
384
385void vector_cross_product(const FixedVector *left, const FixedVector *right, FixedVector *product);
386void vector_component_in_dir(const FixedVector *vector, const FixedVector *direction, FixedVector *component);
387void transform_to_objects_frame(const FixedVector *source, FixedVector *destination, short obj);
388void ScaleFixedVector(FixedVector *vector, int scale, FixedVector *result);
389int vector_length_in_dir(const FixedVector *vector, const FixedVector *direction);
390void copy_frame(short source, short destination);
391
392/* Function start: 0x40B02F */
393void rotate_about_i(short angle, FixedVector *j, FixedVector *k)
394{
395 int original;
396 int sine;
397 int cosine;
398
399 cosine = CosFixed(angle);
400 sine = SinFixed(angle);
401 original = j->x;
402 j->x = MultiplyFixed(original, cosine) - MultiplyFixed(k->x, sine);
403 k->x = MultiplyFixed(original, sine) + MultiplyFixed(k->x, cosine);
404 original = j->y;
405 j->y = MultiplyFixed(original, cosine) - MultiplyFixed(k->y, sine);
406 k->y = MultiplyFixed(original, sine) + MultiplyFixed(k->y, cosine);
407 original = j->z;
408 j->z = MultiplyFixed(original, cosine) - MultiplyFixed(k->z, sine);
409 k->z = MultiplyFixed(original, sine) + MultiplyFixed(k->z, cosine);
410}
411
412/* Function start: 0x40B17F */
413void rotate_about_j(short angle, FixedVector *i, FixedVector *k)
414{
415 int cosine;
416 int sine;
417 int original;
418
419 cosine = CosFixed(angle);
420 sine = SinFixed(angle);
421 original = i->x;
422 i->x = MultiplyFixed(k->x, sine) + MultiplyFixed(original, cosine);
423 k->x = MultiplyFixed(k->x, cosine) - MultiplyFixed(original, sine);
424 original = i->y;
425 i->y = MultiplyFixed(k->y, sine) + MultiplyFixed(original, cosine);
426 k->y = MultiplyFixed(k->y, cosine) - MultiplyFixed(original, sine);
427 original = i->z;
428 i->z = MultiplyFixed(k->z, sine) + MultiplyFixed(original, cosine);
429 k->z = MultiplyFixed(k->z, cosine) - MultiplyFixed(original, sine);
430}
431
432/* Function start: 0x40B2CF */
433void rotate_about_k(short angle, FixedVector *i, FixedVector *j)
434{
435 int original;
436 int sine;
437 int cosine;
438
439 cosine = CosFixed(angle);
440 sine = SinFixed(angle);
441 original = i->x;
442 i->x = MultiplyFixed(original, cosine) - MultiplyFixed(j->x, sine);
443 j->x = MultiplyFixed(original, sine) + MultiplyFixed(j->x, cosine);
444 original = i->y;
445 i->y = MultiplyFixed(original, cosine) - MultiplyFixed(j->y, sine);
446 j->y = MultiplyFixed(original, sine) + MultiplyFixed(j->y, cosine);
447 original = i->z;
448 i->z = MultiplyFixed(original, cosine) - MultiplyFixed(j->z, sine);
449 j->z = MultiplyFixed(original, sine) + MultiplyFixed(j->z, cosine);
450}
451
452/* Function start: 0x40B41F */
453void init_ijk(short obj)
454{
455 g_aShipRightVector[obj].x =
456 g_aShipUpVector[obj].y =
457 g_aShipForwardVector[obj].z = 0x100;
458 g_aShipRightVector[obj].y =
459 g_aShipRightVector[obj].z =
460 g_aShipUpVector[obj].x =
461 g_aShipUpVector[obj].z =
463 g_aShipForwardVector[obj].y = 0;
466 g_anObjectRollRotation[obj] = 0;
467}
468
469/* Function start: 0x40B550 */
470void copy_frame(short source, short destination)
471{
472 g_aShipRightVector[destination] =
473 g_aShipRightVector[source];
474 g_aShipUpVector[destination] =
475 g_aShipUpVector[source];
476 g_aShipForwardVector[destination] =
477 g_aShipForwardVector[source];
478}
479
480/* Function start: 0x40B5DF */
493
494/* Function start: 0x40B699 */
496 FixedVector *destination, short obj)
497{
498 destination->x = dot_product(source, &g_aShipRightVector[obj]);
499 destination->y = dot_product(source, &g_aShipUpVector[obj]);
500 destination->z = dot_product(source, &g_aShipForwardVector[obj]);
501}
502
503/* Function start: 0x40B706 */
504void alter_pitch(short angle, short obj)
505{
506 rotate_about_i(angle, &g_aShipUpVector[obj],
508 fix_objects_ijk(obj);
509}
510
511/* Function start: 0x40B747 */
512void alter_yaw(short angle, short obj)
513{
516 fix_objects_ijk(obj);
517}
518
519/* Function start: 0x40B788 */
520void alter_roll(short angle, short obj)
521{
523 &g_aShipUpVector[obj]);
524 fix_objects_ijk(obj);
525}
526
527/* Function start: 0x40B7C9 */
529 const FixedVector *to)
530{
531 FixedVector delta;
532
533 ComputeVectorDelta((FixedVector *)from, (FixedVector *)to, &delta);
534 return FixedToShortSaturating((int)Vector_magnitude(&delta));
535}
536
537/* Function start: 0x40B805 */
538short distance_from_point(short obj, const FixedVector *point)
539{
541 (FixedVector *)point, &g_vToTarget);
544}
545
546/* Function start: 0x40B85C */
547short distance_from_object(short obj, short other)
548{
549 return distance_from_point(obj, &g_aShipPosition[other]) -
551}
552
553/* Counts facing and range queries; nothing reads it. */
554int g_nFacingRangeQueryCount = 0; /* 0x00492708 */
556 1, 0, 0, 0, 1, 0, 0, 1, 1, 0,
557 0, 0, 1, 1, 1, 0, 0, 1, 1, 0
558}; /* 0x00492710 */
559int g_abObjectShapeOwned[SPACE_OBJECT_COUNT] = { 0 }; /* 0x00492760 */
560
561/* Function start: 0x40B898 */
562void get_facing_range_from_point(short obj, const FixedVector *point)
563{
564 int cosine;
565
567 distance_from_point(obj, point) -
573 g_nFacingToTarget = (short)(((short)cosine * 100) >> 8);
575}
576
577/* Function start: 0x40B92F */
578void get_facing_range_from_object(short obj, short other)
579{
580 int cosine;
581
586 &g_aShipForwardVector[other]);
587 g_nTargetFacing = (short)(((short)cosine * 100) >> 8);
588}
589
590/* Function start: 0x40B9B5 */
591short facing_to_object(short obj, FixedVector *point)
592{
593 FixedVector direction;
594 int cosine;
595
596 ComputeVectorDelta(&g_aShipPosition[obj], point, &direction);
597 NormalizeFixedVector(&direction);
598 cosine = dot_product(&direction, &g_aShipForwardVector[obj]);
599 g_nFacingToTarget = (short)(((short)cosine * 100) >> 8);
600 return g_nFacingToTarget;
601}
602
603/* Function start: 0x40BA2E */
604short match_roll_orientation(short obj, short reference)
605{
606 FixedVector roll;
607 short angle;
608
609 roll.x = dot_product(&g_aShipUpVector[obj],
610 &g_aShipRightVector[reference]);
611 roll.y = dot_product(&g_aShipUpVector[obj],
612 &g_aShipUpVector[reference]);
613 roll.z = 0;
615 angle = (short)ArcCos(roll.y);
616 if (roll.x >= 0)
617 angle = 360 - angle;
618 return WrapDegrees(angle);
619}
620
621/* Function start: 0x40BADB */
622short set_ship_rotation_goals(short obj, short turnRate,
623 const FixedVector *direction,
624 short pointingMode,
625 short *yawGoal, short *pitchGoal)
626{
627 SphericalVector spherical;
628 FixedVector localDirection;
629 int magnitude;
630
631 transform_to_objects_frame(direction, &localDirection, obj);
632 if (pointingMode == 1) {
633 rectangular_to_spherical(&localDirection, &spherical);
634 if (spherical.radius == 0)
635 return 1;
636 if (spherical.yaw > 0)
637 spherical.yaw = (short)(spherical.yaw - turnRate);
638 else
639 spherical.yaw = (short)(spherical.yaw + turnRate);
640 } else {
641 magnitude = Vector_magnitude(&localDirection);
642 if (magnitude == 0)
643 return 1;
644 spherical.yaw = (short)ArcSin(DivideFixed(
645 localDirection.x,
646 PlanarMagnitude(localDirection.x, localDirection.z)));
647 spherical.pitch = (short)-ArcSin(
648 DivideFixed(localDirection.y, magnitude));
649 if (localDirection.z < 0) {
650 spherical.yaw = (short)-spherical.yaw;
651 if (spherical.pitch > 0)
652 spherical.pitch = (short)(spherical.pitch + 180);
653 else
654 spherical.pitch = (short)(spherical.pitch - 180);
655 }
656 if (spherical.pitch > 0)
657 spherical.pitch = (short)(spherical.pitch - turnRate);
658 else
659 spherical.pitch = (short)(spherical.pitch + turnRate);
660 }
661 *yawGoal = WrapDegrees((short)-spherical.yaw);
662 *pitchGoal = WrapDegrees((short)-spherical.pitch);
663 return 0;
664}
665
666/* Function start: 0x40BC6B */
667void point_ship(short obj, short turnRate, const FixedVector *direction)
668{
669 set_ship_rotation_goals(obj, turnRate, direction, 1,
670 &g_anYawGoal[obj],
671 &g_anPitchGoal[obj]);
672 return;
673}
674
675/* Function start: 0x40BCA9 */
676void point_ship_at_point(short obj, const FixedVector *point)
677{
678 FixedVector direction;
679
681 (FixedVector *)point, &direction);
682 point_ship(obj, 0, &direction);
683}
684
685/* Function start: 0x40BCE8 */
686void point_ship_at_object(short obj, short other)
687{
689}
690
691/* Function start: 0x40BD0E */
692void point_capital_ship_at_object(short obj, short other)
693{
694 FixedVector direction;
695
697 &g_aShipPosition[obj], &direction);
698 point_ship(obj, 0, &direction);
699}
700
701/* Function start: 0x40BD58 */
702void point_perpendicular_to_point(short obj, const FixedVector *point)
703{
704 point_ship_at_point(obj, point);
705 if (g_anYawGoal[obj] < 0)
706 g_anYawGoal[obj] += 90;
707 else
708 g_anYawGoal[obj] -= 90;
709}
710
711/* Function start: 0x40BDC2 */
712void point_ship_behind_object(short obj, short other)
713{
714 FixedVector point = g_aShipPosition[other];
715
717 (short)-(g_asObjectCollisionRadius[other] +
718 500));
719 point_ship_at_point(obj, &point);
720}
721
722/* Function start: 0x40BE3A */
723void point_ship_below_object(short obj, short other)
724{
725 FixedVector point = g_aShipPosition[other];
726
727 position_relative(&point, g_aShipUpVector[other],
728 (short)(g_asObjectCollisionRadius[other] +
729 500));
730 point_ship_at_point(obj, &point);
731}
732
733/* Function start: 0x40BEB0 */
734void point_perpendicular(short obj, short other)
735{
737}
738
739/* Function start: 0x40BED6 */
740void point_parallel(short obj, short other)
741{
742 if (other != -1)
743 point_ship(obj, 0, &g_aShipForwardVector[other]);
744}
745
746/* Function start: 0x40BF0B */
747void NormalizeAndScaleVector(FixedVector *vector, int scale)
748{
749 NormalizeFixedVector(vector);
750 ScaleFixedVector(vector, scale, vector);
751}
752
753/* Function start: 0x40BF36 */
754void SetVectorFixedPoint(unsigned int *p, short v)
755{
756 NormalizeAndScaleVector((FixedVector *)p, (int)v << 8);
757}
758
759/* Function start: 0x40BF55 */
760short IsPointWithinRange(FixedVector *from, FixedVector *to, short range)
761{
762 FixedVector delta;
763
764 ComputeVectorDelta(from, to, &delta);
765 return IsVectorWithinRange(&delta, range);
766}
767
768/* Function start: 0x40BF8C */
769short check_for_collision(short obj)
770{
771 FixedVector *objectPosition;
772 FixedVector *position;
773 short candidate;
774 short range;
775
776 objectPosition = &g_aShipPosition[obj];
777 position = g_aShipPosition;
778 for (candidate = 0; candidate <= SPACE_LAST_MOVING_OBJECT;
779 candidate++, position++) {
780 if (candidate != obj &&
782 ComputeVectorDelta(objectPosition, position,
784 range = (short)(
785 g_asObjectCollisionRadius[candidate] +
787 if (g_aeObjectClass[candidate] == OBJECT_CLASS_SHIP &&
789 range >>= 1;
791 range) != 0)
792 return candidate;
793 }
794 }
795 return -1;
796}
797
798void remove_object(short obj);
799
800/* Function start: 0x40C08C */
801void position_child(short parent, short weapon, FixedVector *position)
802{
803 ShortVector *mount;
804
805 mount = &((struct ShipLoadout *)g_aShipWeapons)[parent].slots[
806 weapon].mount;
807 position->x = g_aShipUpVector[parent].x * mount->y +
808 g_aShipForwardVector[parent].x * mount->z +
809 g_aShipRightVector[parent].x * mount->x +
810 g_aShipPosition[parent].x;
811 position->y = g_aShipUpVector[parent].y * mount->y +
812 g_aShipRightVector[parent].y * mount->x +
813 g_aShipForwardVector[parent].y * mount->z +
814 g_aShipPosition[parent].y;
815 position->z = g_aShipUpVector[parent].z * mount->y +
816 g_aShipForwardVector[parent].z * mount->z +
817 g_aShipRightVector[parent].z * mount->x +
818 g_aShipPosition[parent].z;
819}
820
821/* Function start: 0x40C1DA */
822void child_object(short hardpoint, short child, short parent)
823{
824 position_child(parent, hardpoint, &g_aShipPosition[child]);
825 g_acObjectOwner[child] = (signed char)parent;
826}
827
828/* Function start: 0x40C211 */
829short get_ship_slot(void)
830{
831 short slot;
832
833 for (slot = 1; slot <= 9; slot++) {
835 return slot;
836 }
837 return -1;
838}
839
840/* Function start: 0x40C266 */
842{
843 short object;
844
845 for (object = 10; object <= SPACE_LAST_MOVING_OBJECT; object++) {
846 if (g_aeObjectClass[object] == OBJECT_CLASS_NULL) {
847 g_asObjectScreenX[object] = (short)0x8001;
848 return object;
849 }
850 }
851 return -1;
852}
853
854/* Packet-release callee from the resource loader. */
855void FreePacketAndClear(void *slot, unsigned short releaseFlags);
856
857/* Function start: 0x40C2C9 */
858void remove_object(short obj)
859{
860 short slot;
861
862 if (obj == -1)
863 return;
864 g_asObjectScreenX[obj] = (short)0x8001;
865 g_asObjectDistance[obj] = 0;
866 if (obj == g_nNavPointerObject)
868 if (obj == g_nYourWingman)
869 g_nYourWingman = -1;
870 for (slot = 0; slot < 20; slot++) {
871 if (g_abHazardObjects[slot] == obj) {
872 g_abHazardObjects[slot] = -1;
873 break;
874 }
875 }
876 if (obj < 10) {
879 g_asObjectType[obj] == 0x33))
882 g_acShipPortrait[obj] = -1;
883 g_acShipPendingMessage[obj] = -1;
885 clear_alert(obj);
886 g_asLoadedShipViewFrame[obj] = -1;
887 g_asShipIntelSlot[obj] = -1;
888 g_asShipIntelResourceKey[obj] = -1;
889 }
891 g_apObjectShape[obj] = 0;
892}
893
894/* Function start: 0x40C46C */
896{
897 FixedVector acceleration;
898
899 divide_vector(force,
901 g_acObjectType[obj]].radarRadius << 8,
902 &acceleration);
903 AddFixedVectors(&g_aShipVelocity[obj], &acceleration,
904 &g_aShipVelocity[obj]);
905}
906
907/* Function start: 0x40C4D1 */
909 short obj)
910{
911 FixedVector bodyPoint;
912 FixedVector bodyForce;
913 FixedVector linearAcceleration;
914 int rotationalMass;
915 int linearMass;
916
917 transform_to_objects_frame(force, &bodyForce, obj);
918 transform_to_objects_frame(point, &bodyPoint, obj);
919 linearMass = g_aObjectTypeData[
921 rotationalMass = DivideFixed(
923 g_acObjectType[obj]].afterburnerVelocity << 8,
924 (int)g_asObjectCollisionRadius[obj] << 8);
925
927 MultiplyFixed(bodyPoint.x, bodyForce.y) -
928 MultiplyFixed(bodyPoint.y, bodyForce.x),
929 rotationalMass) >> 8;
931 MultiplyFixed(bodyPoint.x, bodyForce.z) -
932 MultiplyFixed(bodyPoint.z, bodyForce.x),
933 rotationalMass) >> 8;
935 MultiplyFixed(bodyPoint.z, bodyForce.y) -
936 MultiplyFixed(bodyPoint.y, bodyForce.z),
937 rotationalMass) >> 8;
941
942 linearMass <<= 8;
943 linearAcceleration.x = DivideFixed(
944 MultiplyFixed(0x16a -
945 PlanarMagnitude(bodyPoint.y, bodyPoint.z),
946 bodyForce.x),
947 MultiplyFixed(0x16a, linearMass));
948 linearAcceleration.y = DivideFixed(
949 MultiplyFixed(0x16a -
950 PlanarMagnitude(bodyPoint.x, bodyPoint.z),
951 bodyForce.y),
952 MultiplyFixed(0x16a, linearMass));
953 linearAcceleration.z = DivideFixed(
954 MultiplyFixed(0x16a -
955 PlanarMagnitude(bodyPoint.x, bodyPoint.y),
956 bodyForce.z),
957 MultiplyFixed(0x16a, linearMass));
958 AddFixedVectors(&g_aShipVelocity[obj], &linearAcceleration,
959 &g_aShipVelocity[obj]);
962}
963
964/* Function start: 0x40C796 */
966 short obj)
967{
968 FixedVector bodyPoint;
969 FixedVector bodyForce;
970 int denominator;
971
972 transform_to_objects_frame(force, &bodyForce, obj);
973 transform_to_objects_frame(point, &bodyPoint, obj);
974 denominator = DivideFixed(
976 g_acObjectType[obj]].afterburnerVelocity << 8,
978 (int)g_asObjectCollisionRadius[obj] << 8,
979 0x123c));
980
982 MultiplyFixed(bodyPoint.x, bodyForce.y) -
983 MultiplyFixed(bodyPoint.y, bodyForce.x),
984 denominator) >> 8;
986 MultiplyFixed(bodyPoint.x, bodyForce.z) -
987 MultiplyFixed(bodyPoint.z, bodyForce.x),
988 denominator) >> 8;
990 MultiplyFixed(bodyPoint.z, bodyForce.y) -
991 MultiplyFixed(bodyPoint.y, bodyForce.z),
992 denominator) >> 8;
998}
999
1000/* Function start: 0x40C959 */
1001void ClampVectorTo30(short *p)
1002{
1003 if (*p < 0) {
1004 *p = *p + 1;
1005 } else if (*p > 0) {
1006 *p = *p - 1;
1007 }
1008}
1009
1010/* Function start: 0x40C99F */
1011void ClampTo30(short *p)
1012{
1013 if (*p > 0x1e) {
1014 *p = 0x1e;
1015 return;
1016 }
1017 if (*p < -0x1e)
1018 *p = -0x1e;
1019}
1020
1021/* Function start: 0x40C9DD */
1023{
1024 FixedVector direction;
1025 int range;
1026 FixedVector viewPos;
1027 short dustSize;
1028 short obj;
1029 int radius;
1030 short screenZoom;
1031
1033 for (obj = 0; obj <= SPACE_LAST_MOVING_OBJECT; obj++) {
1034 if (g_aeObjectClass[obj] == OBJECT_CLASS_NULL ||
1036 continue;
1037 if (obj == g_nNavPointerObject)
1038 continue;
1039 {
1040 g_asObjectDistance[obj] = 0;
1042 g_asObjectScreenX[obj] = (short)0x8001;
1043 continue;
1044 }
1045 if (obj < 10 && g_anShipCloakState[obj] == 1 &&
1046 (g_asShipCloakElapsedFrames[obj] >= 20 ||
1048 g_asShipCloakElapsedFrames[obj]] == 1)) {
1049 g_asObjectScreenX[obj] = (short)0x8001;
1050 continue;
1051 }
1054 direction = g_aShipPosition[obj];
1055 } else {
1057 &g_aShipPosition[obj],
1058 &direction);
1059 }
1060 range = Vector_magnitude(&direction);
1061 if (range <
1063 g_asObjectScreenX[obj] = (short)0x8001;
1064 continue;
1065 }
1066 if (g_aeObjectClass[obj] == OBJECT_CLASS_DUST &&
1067 range > 0x57800) {
1068 g_asObjectScreenX[obj] = (short)0x8001;
1069 continue;
1070 }
1071 transform_to_objects_frame(&direction, &viewPos,
1072 EYE_OBJECT);
1073 if (viewPos.z <
1075 g_asObjectScreenX[obj] = (short)0x8001;
1076 continue;
1077 }
1078 if (DivideFixed(viewPos.z, range) < 0) {
1079 g_asObjectScreenX[obj] = (short)0x8001;
1080 continue;
1081 }
1082 radius = g_asObjectCollisionRadius[obj] * 0x100;
1083 if (range <= radius)
1084 range = radius + 1;
1086 screenZoom = (short)MultiplyFixed(
1087 (unsigned short)g_asObjectScale[obj],
1089 (g_nScreenWidth & ~1) << 7,
1090 range -
1091 g_asObjectCollisionRadius[obj] * 0x100));
1092 screenZoom = MaxShort(0, MinShort(0x2000, screenZoom));
1093 g_asObjectScreenScale[obj] = screenZoom;
1094 if ((unsigned short)g_asObjectScreenScale[obj] <= 4) {
1095 g_asObjectScreenX[obj] = (short)0x8001;
1096 continue;
1097 }
1098 }
1099 g_asObjectDistance[obj] = (short)(range >> 8);
1100 if (range > 0xfffe00)
1101 g_asObjectDistance[obj] = (short)0xfffe;
1102 g_asObjectScreenX[obj] = (short)DivideFixed(
1104 viewPos.x),
1105 viewPos.z);
1106 g_asObjectScreenY[obj] = (short)DivideFixed(
1108 viewPos.y),
1109 viewPos.z);
1110 switch (g_aeObjectClass[obj]) {
1111 case OBJECT_CLASS_STAR:
1112 break;
1113 case OBJECT_CLASS_DUST:
1114 dustSize = (short)(MultiplyFixed(
1115 0x900, DivideFixed(
1117 range)) >> 8);
1118 if (dustSize > 3)
1119 dustSize = 3;
1120 dustSize = (short)(
1121 (g_asObjectScreenAngle[obj] & 0x10) +
1122 (3 - dustSize) * 4);
1123 g_asObjectViewFrame[obj] =
1124 (short)(((g_asObjectCounter[obj] +
1125 g_nSpaceFrame) & 3) +
1126 dustSize);
1127 break;
1129 if ((unsigned short)g_asObjectScreenScale[obj] ==
1130 0xff)
1131 set_background_objects_rotation(obj, &direction);
1132 break;
1136 break;
1138 break;
1140 case OBJECT_CLASS_SHIP:
1142 case 14:
1143 if (g_asObjectType[obj] != 0x14)
1144 get_right_shape(obj, &direction);
1145 break;
1146 }
1147 }
1148 }
1149}
1150
1151/* Function start: 0x40CEF6 */
1153{
1154 SphericalVector spherical;
1155 FixedVector flatUp;
1156 short rollAngle;
1157
1158 negate_vector(direction);
1159 rectangular_to_spherical(direction, &spherical);
1161 alter_yaw((short)-spherical.yaw, SCRATCH_VIEW_OBJECT);
1162 alter_pitch((short)-spherical.pitch, SCRATCH_VIEW_OBJECT);
1163 flatUp.z = 0;
1164 flatUp.x = dot_product(
1167 flatUp.y = dot_product(
1170 NormalizeFixedVector(&flatUp);
1171 rollAngle = (short)ArcCos(flatUp.y);
1172 rollAngle %= 360;
1173 if (flatUp.x >= 0)
1174 rollAngle = 360 - rollAngle;
1175 g_asObjectScreenAngle[obj] = rollAngle;
1176 g_asObjectScreenScale[obj] = 0xff;
1177}
1178
1179#pragma function(strcat, strcpy, strlen)
1180/* Function start: 0x40CFF8 */
1181void get_right_shape(short obj, FixedVector *direction)
1182{
1183 SphericalVector angles;
1184 short yawIndex;
1185 char fileName[20];
1186 short shipType;
1187 short slotIndex;
1188 FixedVector shipForward;
1189 FixedVector projectedUpVector;
1190 short twist;
1191 short pitchBand;
1192 FixedVector right;
1193 char numberString[4];
1194 short directionIndex;
1195 short shipClass;
1196 void **packetGroup;
1197 FixedVector eyeUp;
1198 FixedVector up;
1199 FixedVector forwardAxis;
1200
1201 right.x = 0x100;
1202 right.y = 0;
1203 right.z = 0;
1204 up.x = 0;
1205 up.y = 0x100;
1206 up.z = 0;
1207 forwardAxis.x = 0;
1208 forwardAxis.y = 0;
1209 forwardAxis.z = 0x100;
1210 negate_vector(direction);
1211 rectangular_to_spherical(direction, &angles);
1212 rotate_about_j((short)-angles.yaw, &right, &forwardAxis);
1213 rotate_about_i((short)-angles.pitch, &up, &forwardAxis);
1215 NormalizeFixedVector(&forwardAxis);
1216 transform_to_objects_frame(&forwardAxis, &shipForward, obj);
1218 &eyeUp, obj);
1219 rectangular_to_spherical(&shipForward, &angles);
1220 pitchBand = (short)(angles.pitch / 30 + 3);
1221 if (angles.pitch % 30 > 15)
1222 pitchBand = MinShort(6, (short)(pitchBand + 1));
1223 else if (angles.pitch % 30 < -15)
1224 pitchBand = MaxShort(0, (short)(pitchBand - 1));
1225 yawIndex = (short)((12 - angles.yaw / 30) % 12);
1226 if (angles.yaw % 30 > 15)
1227 yawIndex = (short)((yawIndex + 11) % 12);
1228 else if (angles.yaw % 30 < -15)
1229 yawIndex = (short)((yawIndex + 1) % 12);
1230 switch (pitchBand) {
1231 case 0:
1232 directionIndex = 0;
1233 break;
1234 case 1:
1235 case 2:
1236 case 3:
1237 case 4:
1238 case 5:
1239 directionIndex = (short)((pitchBand - 1) * 12 + yawIndex + 1);
1240 break;
1241 case 6:
1242 directionIndex = 61;
1243 break;
1244 }
1245 projectedUpVector.z = 0;
1246 projectedUpVector.x = dot_product(
1247 &eyeUp, &g_9_aDirectionLookRightVector[directionIndex]);
1248 projectedUpVector.y = dot_product(
1249 &eyeUp, &g_137_aDirectionViewUpVectorArray[directionIndex]);
1250 NormalizeFixedVector(&projectedUpVector);
1251 twist = ArcCos(projectedUpVector.y);
1252 if (projectedUpVector.x >= 0)
1253 twist = (short)(360 - twist);
1254 shipClass = g_aeObjectClass[obj];
1255 if (shipClass >= OBJECT_CLASS_SHIP) {
1256 shipType = g_aObjectTypeData[
1258 } else {
1259 shipType = g_asObjectType[obj];
1260 }
1261 if (shipClass == OBJECT_CLASS_MISSILE ||
1262 (shipClass < OBJECT_CLASS_SHIP && shipType == 12)) {
1263 directionIndex = (short)(directionIndex + DIRECTION_VIEW_COUNT);
1264 } else if (shipClass == OBJECT_CLASS_BASE) {
1265 directionIndex =
1266 (short)(directionIndex + DIRECTION_VIEW_COUNT * 2);
1267 }
1268 if (g_acDirectionShapeFrame[directionIndex] == 0)
1269 twist = (short)(twist + 90);
1270 if (g_acDirectionShapeFrame[directionIndex] == 0x24 &&
1271 shipClass != OBJECT_CLASS_MISSILE)
1272 twist = (short)(twist - 90);
1273 g_asObjectFlip[obj] =
1274 (short)(g_acDirectionShapeFlip[directionIndex] << 4);
1275 twist = (short)(twist % 360);
1276 if (twist < 0)
1277 twist = (short)(twist + 360);
1278 g_asObjectScreenAngle[obj] = twist;
1279 if (g_asObjectType[obj] == 0x33 ||
1280 shipClass >= OBJECT_CLASS_CAPITAL_SHIP ||
1282 shipClass == OBJECT_CLASS_SHIP)) {
1283 if (g_acDirectionShapeFrame[directionIndex] !=
1285 for (slotIndex = 0; slotIndex < 4; slotIndex++) {
1286 if (g_aObjectResourceSlots[slotIndex].resourceType ==
1287 shipType)
1288 break;
1289 }
1290 g_asObjectViewFrame[obj] = 0;
1292 g_acDirectionShapeFrame[directionIndex];
1293 if (g_27_stViewScratchInfo.pixels != 0 &&
1295 (unsigned int)g_apObjectShape[obj]) == 0)
1297 if (g_abObjectShapeOwned[obj] != 0)
1299 packetGroup = g_apPacketReferenceGroups[slotIndex];
1300 if (packetGroup != 0 &&
1301 packetGroup[g_asLoadedShipViewFrame[obj]] != 0) {
1302 g_apObjectShape[obj] =
1303 packetGroup[g_asLoadedShipViewFrame[obj]];
1305 g_abObjectShapeOwned[obj] = 0;
1306 } else {
1309 strcpy(fileName, "ship.v");
1311 shipClass == OBJECT_CLASS_SHIP)
1312 strcpy(fileName, "xship.v");
1313 itoa((int)shipType, numberString, 10);
1314 if (strlen(numberString) == 1)
1315 strcat(fileName, "0");
1316 strcat(fileName, numberString);
1318 fileName, g_asLoadedShipViewFrame[obj], 0);
1320 g_abObjectShapeOwned[obj] = 1;
1321 }
1323 }
1324 } else {
1325 g_asObjectViewFrame[obj] =
1326 g_acDirectionShapeFrame[directionIndex];
1327 }
1328}
1329
1330/* Linker commons defined here. LINK lays a unit's commons out by the
1331 * identifiers' hash keys, so these spellings follow the original addresses. */
1333int g_nUnusedGeomWord[3]; /* 0x005d3be0 */ /* never referenced */
void clear_alert(short obj)
Definition logic.c:37
void SetVectorFixedPoint(unsigned int *p, short v)
Definition geom.c:754
short match_roll_orientation(short obj, short reference)
Definition geom.c:604
void transform_to_objects_frame(const FixedVector *source, FixedVector *destination, short obj)
Definition geom.c:495
void ComputeVectorDelta(FixedVector *from, FixedVector *to, FixedVector *delta)
Definition geom.c:229
short IsVectorWithinRange(FixedVector *vector, short range)
Definition eventmgr.c:2023
void CheckHeapBlockSignature(unsigned char *shape)
Definition gr.c:112
void damage_ion_drive(short ship, short amount, short maximum)
Definition geom.c:53
void apply_force_to_object(FixedVector *point, FixedVector *force, short obj)
Definition geom.c:908
void look_at(short obj)
Definition geom.c:95
void get_facing_range_from_point(short obj, const FixedVector *point)
Definition geom.c:562
short MaxShort(short a, short b)
Definition disk.c:36
long MultiplyFixed(int left, int right)
Definition eventmgr.c:51
short distance_between_points(const FixedVector *from, const FixedVector *to)
Definition geom.c:528
void initialize_view_buffer(void)
Definition main.c:217
unsigned int IdentityWord(unsigned int v)
Definition eventmgr.c:1497
void ClampTo30(short *p)
Definition geom.c:1011
void fix_objects_ijk(short obj)
Definition geom.c:481
void point_ship_at_object(short obj, short other)
Definition geom.c:686
short distance_from_point(short obj, const FixedVector *point)
Definition geom.c:538
void FillFixedVectorWithRandomComponents(short limit, FixedVector *vector)
Definition geom.c:272
void rotate_about_i(short angle, FixedVector *j, FixedVector *k)
Definition geom.c:393
int dot_product(const FixedVector *left, const FixedVector *right)
Definition geom.c:316
void remove_object(short obj)
Definition geom.c:858
void alter_pitch(short angle, short obj)
Definition geom.c:504
long Vector_magnitude(const FixedVector *vector)
Definition eventmgr.c:157
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:211
void position_child(short parent, short weapon, FixedVector *position)
Definition geom.c:801
void draw_nav_pointer(void)
Definition cockpt.c:2323
void point_capital_ship_at_object(short obj, short other)
Definition geom.c:692
void alter_roll(short angle, short obj)
Definition geom.c:520
void position_relative_ijk(FixedVector *position, short obj, short right, short up, short forward)
Definition geom.c:112
void ScaleFixedVector(FixedVector *vector, int scale, FixedVector *result)
Definition geom.c:237
short check_for_collision(short obj)
Definition geom.c:769
void init_ijk(short obj)
Definition geom.c:453
short ArcCos(int value)
Definition eventmgr.c:116
int vector_length_in_dir(const FixedVector *vector, const FixedVector *direction)
Definition geom.c:361
void rotational_acceleration(FixedVector *point, FixedVector *force, short obj)
Definition geom.c:965
short FixedToShortSaturating(int value)
Definition geom.c:122
short get_ship_slot(void)
Definition geom.c:829
long SinFixed(short degrees)
Definition eventmgr.c:80
short MinShort(short a, short b)
Definition disk.c:27
void check_for_lost_control(short obj)
Definition ship.c:629
short get_ship_max_velocity(short obj)
Definition geom.c:9
short ChooseRandomSignedMagnitude(short minimum, short maximum, short allowNegative)
Definition geom.c:253
void set_background_objects_rotation(short obj, FixedVector *direction)
Definition geom.c:1152
void point_ship(short obj, short turnRate, const FixedVector *direction)
Definition geom.c:667
short IsPairEqualityDifferentFromFlag(const unsigned int *values)
Definition geom.c:191
short distance_from_object(short obj, short other)
Definition geom.c:547
short vector_angle(FixedVector left, FixedVector right)
Definition geom.c:324
void copy_frame(short source, short destination)
Definition geom.c:470
int MaxInt(int a, int b)
Definition geom.c:142
long PlanarMagnitude(int x, int y)
Definition eventmgr.c:144
void point_perpendicular(short obj, short other)
Definition geom.c:734
void * FetchDiskPacketRetrying(char *fileName, short section, short flags)
Definition disk.c:187
void alter_yaw(short angle, short obj)
Definition geom.c:512
void apply_force_to_objects_center(FixedVector *force, short obj)
Definition geom.c:895
short WrapDegrees(short degrees)
Definition geom.c:171
long CosFixed(short degrees)
Definition eventmgr.c:91
void point_perpendicular_to_point(short obj, const FixedVector *point)
Definition geom.c:702
short set_ship_rotation_goals(short obj, short turnRate, const FixedVector *direction, short pointingMode, short *yawGoal, short *pitchGoal)
Definition geom.c:622
short GetAdaptiveTurnRate(void)
Definition ship.c:137
void rotate_about_k(short angle, FixedVector *i, FixedVector *j)
Definition geom.c:433
short facing_to_object(short obj, FixedVector *point)
Definition geom.c:591
long DivideFixed(int numerator, int denominator)
Definition eventmgr.c:64
void get_right_shape(short obj, FixedVector *direction)
Definition geom.c:1181
void zero_vector(FixedVector *vector)
Definition geom.c:197
void child_object(short hardpoint, short child, short parent)
Definition geom.c:822
void SubtractFixedVectors(FixedVector *left, FixedVector *right, FixedVector *difference)
Definition geom.c:220
int AbsInt(int v)
Definition geom.c:151
int MinInt(int a, int b)
Definition geom.c:133
void MakeRandomVectorFixed(short minimum, short maximum, FixedVector *vector)
Definition geom.c:264
void point_ship_behind_object(short obj, short other)
Definition geom.c:712
void position_relative(FixedVector *position, FixedVector direction, short distance)
Definition geom.c:101
void ConvertFixedVectorToShortVector(const FixedVector *source, ShortVector *destination)
Definition geom.c:307
short find_vacant_3d_object(void)
Definition geom.c:841
void get_facing_range_from_object(short obj, short other)
Definition geom.c:578
void rectangular_to_spherical(const FixedVector *rectangular, SphericalVector *spherical)
Definition geom.c:289
unsigned int shrink_vector(FixedVector *vector)
Definition eventmgr.c:2036
void point_at(short obj, FixedVector point)
Definition geom.c:84
void transform_objects_to_your_view(void)
Definition geom.c:1022
void NormalizeAndScaleVector(FixedVector *vector, int scale)
Definition geom.c:747
void vector_cross_product(const FixedVector *left, const FixedVector *right, FixedVector *product)
Definition geom.c:335
void ClampVectorTo30(short *p)
Definition geom.c:1001
void divide_vector(FixedVector *vector, int divisor, FixedVector *result)
Definition geom.c:245
void recalc_max_velocity(short ship)
Definition geom.c:28
void random_radial(const FixedVector *center, short radius, FixedVector *position)
Definition geom.c:278
void celerate(short ship, int delta)
Definition ship.c:668
short IsPointWithinRange(FixedVector *from, FixedVector *to, short range)
Definition geom.c:760
void vector_component_in_dir(const FixedVector *vector, const FixedVector *direction, FixedVector *component)
Definition geom.c:375
short equ_vector(const FixedVector *left, const FixedVector *right)
Definition geom.c:182
void free_view_buffer(void)
Definition main.c:208
unsigned short RandomInRange(unsigned short lo, unsigned short hi)
Definition eventmgr.c:31
void FreePacketAndClear(void *slot, unsigned short releaseFlags)
Definition disk.c:45
unsigned int SignFixed(int v)
Definition geom.c:160
void point_ship_at_point(short obj, const FixedVector *point)
Definition geom.c:676
short ArcSin(int value)
Definition eventmgr.c:102
void point_parallel(short obj, short other)
Definition geom.c:740
short RandomBelowOrEqual(short n)
Definition eventmgr.c:43
short NormalizeFixedVector(FixedVector *vector)
Definition geom.c:347
void drain_fuel(short ship, short amount)
Definition geom.c:45
void negate_vector(FixedVector *vector)
Definition geom.c:203
void rotate_about_j(short angle, FixedVector *i, FixedVector *k)
Definition geom.c:413
int GetShipAccelerationRate(short ship)
Definition geom.c:62
void point_ship_below_object(short obj, short other)
Definition geom.c:723
Shared Win32 declarations, types and library interfaces.
#define SCRATCH_VIEW_OBJECT
Definition game_data.h:1581
@ RATING_ACE_SPIRIT
Definition game_data.h:189
#define SPACE_LAST_MOVING_OBJECT
Definition game_data.h:1579
#define DIRECTION_VIEW_COUNT
Definition game_data.h:1582
#define EYE_OBJECT
Definition game_data.h:1580
@ SIDE_KILRATHI
Definition game_data.h:176
@ SIDE_NEUTRAL
Definition game_data.h:177
#define SPACE_OBJECT_COUNT
Definition game_data.h:1578
@ MANEUVER_NONE
Definition game_data.h:208
@ OBJECT_CLASS_PLANET
Definition game_data.h:40
@ OBJECT_CLASS_FIXED_OBJECT
Definition game_data.h:44
@ OBJECT_CLASS_MISSILE
Definition game_data.h:48
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
@ OBJECT_CLASS_DUST
Definition game_data.h:41
@ OBJECT_CLASS_DEBRIS
Definition game_data.h:43
@ OBJECT_CLASS_CAPITAL_SHIP
Definition game_data.h:50
@ OBJECT_CLASS_STAR
Definition game_data.h:39
@ OBJECT_CLASS_FUTURION
Definition game_data.h:38
@ OBJECT_CLASS_ASTEROID
Definition game_data.h:46
@ OBJECT_CLASS_PROJECTILE
Definition game_data.h:45
@ OBJECT_CLASS_EXPLOSION
Definition game_data.h:42
@ OBJECT_CLASS_NULL
Definition game_data.h:37
@ OBJECT_CLASS_BASE
Definition game_data.h:51
int g_nFacingRangeQueryCount
Definition geom.c:554
int g_nUnusedGeomWord[3]
Definition geom.c:1333
short g_asObjectScreenAngle[SPACE_OBJECT_COUNT]
Definition viewrect.c:97
short g_asObjectCollisionRadius[SPACE_OBJECT_COUNT]
Definition viewrect.c:120
unsigned char * g_apObjectShape[SPACE_OBJECT_COUNT]
Definition viewrect.c:100
short g_asObjectDistance[SPACE_OBJECT_COUNT]
Definition viewrect.c:104
short g_nYourWingman
Definition viewrect.c:75
FixedVector g_vToTarget
Definition viewrect.c:44
signed char g_abHazardObjects[0x14]
Definition viewrect.c:62
short g_asPilotLevel[12]
Definition viewrect.c:157
short g_anObjectRollRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:119
short g_nFacingToTarget
Definition viewrect.c:45
signed char g_acShipIonDriveDamage[16]
Definition viewrect.c:149
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
short g_anObjectYawRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:118
short g_asObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:124
short g_asObjectFlip[SPACE_OBJECT_COUNT]
Definition viewrect.c:102
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
int g_abObjectShapeOwned[SPACE_OBJECT_COUNT]
Definition geom.c:559
FixedVector g_137_aDirectionViewUpVectorArray[DIRECTION_VIEW_COUNT]
Definition cockpt.c:3837
FixedVector g_aShipForwardVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:107
short g_asLoadedShipViewFrame[12]
Definition viewrect.c:154
short g_asObjectScreenX[SPACE_OBJECT_COUNT]
Definition viewrect.c:95
short g_asShipIntelSlot[10]
Definition viewrect.c:155
short g_asShipCloakElapsedFrames[10]
Definition viewrect.c:181
signed char g_acShipPortrait[12]
Definition viewrect.c:159
unsigned short g_asObjectScale[SPACE_OBJECT_COUNT]
Definition viewrect.c:115
int g_anShipFuel[10]
Definition viewrect.c:144
FixedVector g_aShipRightVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:105
short g_anYawGoal[12]
Definition viewrect.c:131
int g_anCloakVisibilityPattern[20]
Definition geom.c:555
signed char g_acObjectOwner[SPACE_OBJECT_COUNT]
Definition viewrect.c:122
short g_nSpaceFrame
Definition viewrect.c:32
short g_asShipIntelResourceKey[10]
Definition viewrect.c:156
short g_asObjectScreenScale[SPACE_OBJECT_COUNT]
Definition viewrect.c:103
signed char g_acDirectionShapeFlip[DIRECTION_VIEW_COUNT *DIRECTION_SHAPE_TABLE_COUNT]
Definition eventmgr.c:2463
short g_anObjectPitchRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:117
short g_nTargetFacing
Definition viewrect.c:46
FixedVector g_9_aDirectionLookRightVector[DIRECTION_VIEW_COUNT]
Definition cockpt.c:3836
short g_asShipMaximumVelocity[12]
Definition viewrect.c:171
short g_anPitchGoal[12]
Definition viewrect.c:130
unsigned char g_aShipWeapons[10][0xA1]
Definition viewrect.c:150
Viewport g_27_stViewScratchInfo
Definition cockpt.c:3841
short g_nNavPointerObject
Definition viewrect.c:52
int g_anShipCloakState[10]
Definition viewrect.c:179
signed char g_acShipPendingMessage[16]
Definition viewrect.c:160
FixedVector g_aShipPosition[SPACE_OBJECT_COUNT]
Definition viewrect.c:108
short g_bExpandedShipGraphicsEnabled
Definition viewrect.c:49
FixedVector g_aShipUpVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:106
short g_asShipManeuver[12]
Definition viewrect.c:169
FixedVector g_aShipVelocity[SPACE_OBJECT_COUNT]
Definition viewrect.c:109
void ** g_apPacketReferenceGroups[5]
Definition mission.c:10
ObjectResourceSlot g_aObjectResourceSlots[5]
Definition viewrect.c:72
short g_nTargetRange
Definition viewrect.c:47
signed char g_acDirectionShapeFrame[DIRECTION_VIEW_COUNT *DIRECTION_SHAPE_TABLE_COUNT]
Definition eventmgr.c:2444
short g_nScreenWidth
Definition eventmgr.c:2430
short g_asShipSide[12]
Definition viewrect.c:139
signed char g_acObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:101
FixedVector g_vCollisionDelta
Definition viewrect.c:43
short g_asObjectScreenY[SPACE_OBJECT_COUNT]
Definition viewrect.c:96
FixedVector g_2_vNormalizedToTgt
Definition geom.c:1332
short g_asObjectCounter[SPACE_OBJECT_COUNT]
Definition viewrect.c:110
short g_asObjectViewFrame[SPACE_OBJECT_COUNT]
Definition viewrect.c:94
short maximumVelocity
Definition game_data.h:377
short resourceType
Definition game_data.h:368
short radarRadius
Definition game_data.h:371
unsigned char * pixels
Definition game.h:150