Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
spc.c
Go to the documentation of this file.
1/*
2 * Space views, star field and object simulation.
3 *
4 * Retail object 0x419C10-0x41E4DF (link order; see docs/ORDER.md).
5 */
6#define SPC_C
7#include "game.h"
8
9signed char g_bLandingCommRequestPending = 0; /* 0x00492fa0 */
10int g_nCapitalShipViewDistance = 0x7d000; /* 0x00492fa4 */
11int g_nCurrentView = -1; /* 0x00492fa8 */
12short g_bAlternateChaseView = 0; /* 0x00492fac */
13int g_nChaseCameraMaximumVelocity = 0x8c00; /* 0x00492fb0 */
14short g_nSpaceExplosionFlashActive = 0; /* 0x00492fb4 */
15short g_bApplyingCollisionDamage = 0; /* 0x00492fb8 */
16short g_asIntelligenceEvent[12] = { 0 }; /* 0x00492fc0 */
17
18extern short g_nCockpitCameraObject; /* 0x0049d770 */
19
20extern FixedVector g_vExternalViewOffset; /* 0x005d3200 */
21
22/* WC2's collision response uses SHL for the signed mass difference. Native C
23 * cannot left-shift a negative value, so use the equivalent bounded multiply
24 * in the port while retaining the original expression for comparison. */
25#define COLLISION_MASS_DIFFERENCE_SCALE(objectMass, partnerMass) \
26 (((objectMass) - (partnerMass)) << 8)
27
28/* Only slots 0-11 have ship maximum-velocity state, but WC2 indexes that
29 * table with any colliding object. Slot 15 reaches the zero high word of the
30 * adjacent alert flags in the retail layout; make that zero result explicit
31 * for every non-ship slot instead of crossing a native global's redzone. */
32#define COLLISION_MAXIMUM_VELOCITY(obj) \
33 g_asShipMaximumVelocity[obj]
34
35#pragma function(abs)
36/* Function start: 0x419C10 */
37unsigned int rotate_eye_to_goal(void)
38{
39 short totalError;
40
41 /* CL 4.1 folds ~~ after selecting retail's roll-first call order. */
42 totalError = (short)(abs(g_anObjectPitchRotation[
43 EYE_OBJECT] -
46 EYE_OBJECT] -
49 EYE_OBJECT] -
53 &g_nEyePitchGoal, totalError,
57 &g_nEyeYawGoal, totalError,
61 &g_nEyeRollGoal, totalError,
63}
64
65/* Function start: 0x419CDC */
66short GetVectorMagnitude(const FixedVector *vector)
67{
69}
70
71/* Function start: 0x419D01 */
73{
74 FixedVector positionError;
75 FixedVector desiredPosition;
76 FixedVector adjustment;
77 FixedVector vector;
78 short desiredDistance;
79 FixedVector direction;
80
82 goto finished;
83
84 switch (g_nCurrentView) {
85 case 5:
91 &direction);
92 desiredPosition = direction;
94 (unsigned int *)&desiredPosition,
95 (short)(g_bAlternateChaseView == 0 ? -700 : -500));
97 &desiredPosition,
99 &desiredPosition);
102 &desiredPosition, &positionError);
103 vector = positionError;
105 &vector,
106 (g_bAlternateChaseView == 0 ? 25 : 7) << 8,
107 &vector);
108 if (Vector_magnitude(&vector) >
112 g_aShipVelocity[EYE_OBJECT] = vector;
113 g_aShipForwardVector[EYE_OBJECT] = direction;
117 EYE_OBJECT, (short)g_cViewObject);
118 if (g_nEyeRollGoal != 0) {
119 if (abs((int)g_nEyeRollGoal) > 4) {
120 g_nEyeRollRate = 4;
123 } else {
124 g_nEyeRollGoal = 0;
127 }
128 }
132 }
133 break;
134 case 6:
138 &g_aShipPosition[g_cViewObject], &vector);
139 if (Vector_magnitude(&vector) > 0x7d000) {
141 NormalizeFixedVector(&vector);
144 if (vector.x == g_aShipUpVector[EYE_OBJECT].x &&
145 vector.y == g_aShipUpVector[EYE_OBJECT].y &&
146 vector.z == g_aShipUpVector[EYE_OBJECT].z) {
149 }
150 ScaleFixedVector(&vector, -0x12430, &vector);
157 0x19000, &vector);
159 &vector,
162 0x6400, &vector);
164 &vector,
168 &g_aShipPosition[g_cViewObject], &vector);
172 } else {
175 }
176 break;
177 case 14:
181 look_at(0);
182 break;
183 case 13:
185 -0xa00, &vector);
191 look_at(0);
192 break;
193 case 7:
194 if (g_nExternalViewShip == -1) {
196 if (g_7_nExternalViewTimeout++ > 20) {
197 if (g_nCockpitDisplayMode == 0) {
198 new_view(0, 0);
199 } else {
203 (unsigned short)(g_nScreenWidth - 1),
204 (unsigned short)(g_nScreenHeight - 1));
206 new_view(0, 0);
209 0, 0, 319, 199);
211 }
212 }
213 } else {
214 desiredDistance = 250;
216 0x13)
217 desiredDistance = 800;
221 &vector);
223 if (Vector_magnitude(&vector) >
224 ((int)desiredDistance + 50) << 8) {
226 &vector,
227 ((int)g_2_nExternalViewDistanceValue & ~1) << 7,
230 (short)(g_2_nExternalViewDistanceValue - 1), 8);
231 } else {
232 adjustment = vector;
233 NormalizeFixedVector(&adjustment);
234 ScaleFixedVector(&adjustment,
235 -((int)desiredDistance << 8),
236 &adjustment);
238 &vector, &adjustment,
240 }
241 }
244 }
248 break;
249 case 15:
251 break;
252 case 8:
253 if (g_acShipTarget[0] != -1) {
255 0x12c00, &vector);
256 AddFixedVectors(&g_aShipPosition[0], &vector,
261 &vector);
262 NormalizeFixedVector(&vector);
264 ScaleFixedVector(&vector, -0x25800, &vector);
266 &vector,
269 } else {
270 new_view(0, 0);
271 }
272 break;
273 case 0:
274 if (g_nCockpitCameraObject != 0) {
280 } else {
286 }
287 break;
288 case 1:
300 break;
301 case 2:
313 break;
314 case 3:
322 break;
323 case 4:
325 case 0:
329 break;
330 case 1:
338 break;
339 case 2:
347 break;
348 }
360 break;
361 case 10:
369 break;
370 case 11:
376 break;
377 case 12:
380 &g_aShipPosition[g_cViewObject], &vector);
381 if (Vector_magnitude(&vector) < 0x25800) {
382 adjustment = vector;
383 NormalizeFixedVector(&adjustment);
384 ScaleFixedVector(&adjustment, -0x25800, &adjustment);
385 AddFixedVectors(&vector, &adjustment, &adjustment);
387 &adjustment,
389 }
395 break;
396 case 18:
402 break;
403 case 16:
407 break;
408 case 17:
415 break;
416 }
417
418finished:
419 ;
420}
421
422/* Function start: 0x41AD51 */
423void force_view(int view, short obj)
424{
425 if (IsCockpitExplosionActive() != 0)
426 return;
427 g_nCurrentView = -1;
428 new_view(view, obj);
429}
430
431/* Function start: 0x41AD8B */
433{
434 if (g_bSavedPlayerTarget == 0 &&
435 previousView == 0 &&
437 unactive(g_acShipTarget[0]) == 0 &&
438 g_bTargetLockMode != 0 &&
440 ((ShipWeaponSlot *)&g_aShipWeapons[0][1])[
441 g_nSelectedReleaseWeaponIndex].type == 0x13) {
447 }
448}
449
450/* Function start: 0x41AE40 */
451unsigned int new_view(int view, short obj)
452{
453 int previousView;
454 FixedVector eyeOffset;
455
456 if (IsCockpitExplosionActive() != 0)
457 goto finished;
458 if (g_nCurrentView == view) {
459 if (view == 5)
461 (short)(1 - g_bAlternateChaseView);
462 goto finished;
463 }
464 if (view <= 3 && g_1_cStoredViewDisplayModeValue == view) {
465 if (g_nCurrentView == -1)
466 g_nCurrentView = view;
467 goto finished;
468 }
469 if (view == 7 && g_nExternalViewShip == -1)
470 goto finished;
471
472 if (g_nTargetCameraFrame == 1)
474 g_cViewObject = (signed char)obj;
475 previousView = g_nCurrentView;
477 if (view == 0 && previousView == 4) {
478 if (g_bSavedPlayerTarget != 0) {
480 (short)(g_nSavedTargetLockCountdown + 1);
484 g_acShipTarget[0] =
485 (signed char)g_nSavedPlayerTarget;
486 }
488 }
489 if (view == 0)
491 g_nCurrentView = view;
492 if (obj != -1) {
495 } else {
497 }
498
499 switch (view) {
500 case 0:
502 break;
503 case 1:
504 if (CountShipCockpitGunDisplays(0) > 1) {
505 g_nCurrentView = 4;
507 }
509 break;
510 case 2:
511 if (CountShipCockpitGunDisplays(0) > 1) {
512 g_nCurrentView = 4;
514 }
516 break;
517 case 3:
518 if (HasShipCockpitGunDisplay(0) != 0) {
519 g_nCurrentView = 4;
521 }
523 break;
524 case 6:
526 eyeOffset = g_aShipVelocity[g_cViewObject];
527 if (NormalizeFixedVector(&eyeOffset) == 0)
528 eyeOffset =
532 if (eyeOffset.x == g_aShipUpVector[EYE_OBJECT].x &&
533 eyeOffset.y == g_aShipUpVector[EYE_OBJECT].y &&
534 eyeOffset.z == g_aShipUpVector[EYE_OBJECT].z) {
537 }
538 ScaleFixedVector(&eyeOffset, -0x12430, &eyeOffset);
541 &eyeOffset, &g_aShipPosition[EYE_OBJECT]);
542 g_aShipForwardVector[EYE_OBJECT] = eyeOffset;
546 0x19000, &eyeOffset);
548 &eyeOffset,
551 0x6400, &eyeOffset);
553 &eyeOffset,
558 &eyeOffset);
559 g_aShipForwardVector[EYE_OBJECT] = eyeOffset;
561 break;
562 case 13:
566 0, 0, 0, 2000);
568 look_at(0);
569 break;
570 case 14:
571 break;
572 case 5:
576 -0x4b000, &eyeOffset);
579 &eyeOffset, &g_aShipPosition[EYE_OBJECT]);
582 g_aShipForwardVector[EYE_OBJECT] = eyeOffset;
585 break;
586 case 7:
590 0x25800, &eyeOffset);
593 &eyeOffset, &g_aShipPosition[EYE_OBJECT]);
597 &eyeOffset);
600 g_aShipForwardVector[EYE_OBJECT] = eyeOffset;
605 break;
606 case 8:
610 break;
611 case 15:
613 break;
614 case 10:
616 break;
617 case 11:
618 break;
619 case 12:
620 case 18:
624 g_nEyeRollGoal = 0;
627 g_nEyeRollRate = 1;
628 break;
629 case 17:
634 break;
635 case 16:
637 break;
638 }
639
642
643finished:
644 ;
645}
646
647/* Function start: 0x41B62E */
648unsigned int start_dust(short obj, FixedVector origin,
649 short forwardDistance, int rightOffset,
650 int upOffset)
651{
652 FixedVector offset;
653
654 set_objects_data(obj, 0x2e, -1, 0);
656 (int)forwardDistance << 8, &offset);
657 AddFixedVectors(&origin, &offset, &origin);
659 rightOffset, &offset);
660 AddFixedVectors(&offset, &origin, &origin);
662 upOffset, &offset);
663 AddFixedVectors(&offset, &origin, &origin);
664 AddFixedVectors(&origin,
666 &g_aShipPosition[obj]);
669 (short)(MaxShort((short)(1 - RandomInRange(0, 3)), 0) * 0x10 +
670 RandomInRange(0, 3));
671}
672
673/* Function start: 0x41B762 */
674unsigned int generate_stars(void)
675{
676 FixedVector origin;
677 short distance;
678 short star;
679
680 origin.x = 0;
681 origin.y = 0;
682 origin.z = 0;
683 for (star = 40; star < 55; star++) {
684 if (star < 48) {
685 distance = RandomInRange(0, 1400);
686 start_dust(star, origin, distance,
687 signed_random(distance) << 8,
688 signed_random(distance) << 8);
689 } else {
698 &g_aShipUpVector[69],
701 15000 << 8,
702 &g_aShipPosition[star]);
703 g_asObjectViewFrame[star] =
704 (short)(RandomInRange(0, 5) + 32);
705 }
706 }
707}
708
709/* Function start: 0x41B8D6 */
710unsigned int update_star_field(void)
711{
712 unsigned char scaleShift;
713 int rightOffset;
714 short hazardFlag;
715 short upSpread;
716 short slot;
717 FixedVector motion;
718 int range;
719 int dustUp;
720 FixedVector delta;
721 FixedVector cameraMotion;
722 short outcome;
723 short lateralSpread;
724
725 hazardFlag = g_pActiveHazardField != 0;
728 200 << 8, &cameraMotion);
730 20 << 8, &g_vStarFieldMotion);
731 AddFixedVectors(&cameraMotion, &g_vStarFieldMotion,
734 &g_vStarFieldMotion, &delta);
735 for (slot = 40; slot < 55; slot++) {
736 if (g_asObjectScreenX[slot] == (short)0x8001) {
737 outcome = RandomInRange(0, 7);
738 if (hazardFlag == 0) {
739 if (g_aeObjectClass[slot] ==
741 (int)g_aeObjectClass[slot] == 0x15 ||
743 set_objects_data(slot, 0x2e, -1, 0);
744 outcome = 0;
745 }
746 } else if (slot < 48) {
747 extra_hazard(slot);
748 }
749 if ((g_aeObjectClass[slot] == OBJECT_CLASS_STAR ||
751 outcome == 0) {
752 if ((g_anObjectYawRotation[0] |
754 continue;
756 if (g_anObjectPitchRotation[0] != 0) {
758 g_anObjectPitchRotation[0] < 0 ? -45 : 45;
760 }
761 if (g_anObjectYawRotation[0] != 0 &&
762 (g_anObjectPitchRotation[0] == 0 ||
763 RandomInRange(0, 1) != 0)) {
765 g_anObjectYawRotation[0] < 0 ? -45 : 45;
767 }
769 &g_aShipUpVector[69],
775 15000 << 8,
776 &g_aShipPosition[slot]);
777 g_asObjectViewFrame[slot] =
778 RandomInRange(0, 5) + 32;
779 break;
780 } else if (g_aeObjectClass[slot] == OBJECT_CLASS_DUST &&
781 outcome < 2) {
784 &motion, EYE_OBJECT);
785 ScaleFixedVector(&motion, 10 << 8, &motion);
786 if (motion.z >= 0) {
787 range = (unsigned short)RandomInRange(
788 0, (short)(motion.z >> 8)) * 2 +
789 (unsigned short)RandomInRange(0, 350) +
791 } else {
792 range = (unsigned short)RandomInRange(0, 40) +
794 }
795 lateralSpread = signed_random((short)(range >> 1));
796 upSpread = signed_random((short)(range >> 1));
797 scaleShift = (unsigned char)(motion.z <= 0 ? 9 : 8);
798 rightOffset = ((int)lateralSpread << scaleShift) + motion.x;
799 dustUp = ((int)upSpread << scaleShift) + motion.y;
800 start_dust(slot, delta, range, rightOffset, dustUp);
801 break;
802 }
803 }
804 }
805 if (g_pActiveHazardField != 0 &&
808}
809
810/* Function start: 0x41BD44 */
811short count_down(short obj)
812{
813 if (g_asObjectCounter[obj] != -1)
814 g_asObjectCounter[obj]--;
815 return g_asObjectCounter[obj];
816}
817
818/* Function start: 0x41BD81 */
820{
821 short missile;
822 short obj;
823 short gun;
824 short projectileDetonated;
825
826 for (obj = 0; obj <= SPACE_LAST_MOVING_OBJECT; obj++) {
827 switch (g_aeObjectClass[obj]) {
829 switch (g_asObjectType[obj]) {
830 case 0x0c:
831 case 0x2b:
832 remove_object(obj);
833 break;
834 }
835 break;
837 projectileDetonated = 0;
838 if (g_asObjectType[obj] == 0x0c) {
839 for (missile = 0; missile < 10; missile++) {
840 if (g_aeObjectClass[missile] ==
842 g_asObjectType[missile] ==
844 g_asMissileProximityFuseValues[missile] != 0 &&
845 distance_from_object(obj, missile) < 200) {
846 explode((short)g_acObjectOwner[obj], obj);
847 projectileDetonated = 1;
848 }
849 }
850 }
851 if (projectileDetonated == 0 && count_down(obj) == 0) {
852 if (g_asObjectType[obj] == 0x0c)
853 explode((short)g_acObjectOwner[obj], obj);
854 else
855 remove_object(obj);
856 }
857 break;
859 if (g_asObjectType[obj] == 0x2f &&
860 count_down(obj) == -1 &&
861 g_asObjectScreenX[obj] == (short)0x8001)
862 remove_object(obj);
863 break;
865 if (g_asObjectType[obj] == 0x25 &&
866 g_asObjectAnimationIndex[obj] == 0x0c &&
867 g_asObjectScreenX[obj] != (short)0x8001) {
868 if (g_nSpacePaletteFadeMode == 0x13) {
872 << 2);
875 << 2);
881 } else {
886 }
887 }
888 break;
890 if (g_asObjectType[obj] == 0x3d ||
891 g_asObjectType[obj] ==
893 break;
894 if (count_down(obj) == -1 &&
895 g_asObjectScreenX[obj] == (short)0x8001)
896 remove_object(obj);
897 break;
901 if (count_down(obj) == 0)
902 explode(obj, obj);
903 break;
905 g_acShipExhaustHeat[obj] = 0;
906 if (g_asObjectType[obj] ==
908 if (count_down(obj) <= 0)
909 explode(obj, obj);
910 } else {
913 if (g_asObjectType[obj] !=
915 g_asShipTactic[obj] == TACTIC_RAM &&
917 g_acShipTarget[obj]] == 1) {
918 explode(obj, obj);
919 } else if (g_asShipTactic[obj] ==
921 g_nCannedSceneMode == 0) {
922 if (count_down(obj) <= 0) {
924 g_asObjectCounter[obj] = (short)(
925 *(int *)&g_aObjectTypeData[
926 g_acObjectType[obj]].lifetime);
927 if (g_asObjectType[obj] ==
930 &g_aShipVelocity[obj],
932 &g_aShipVelocity[obj]);
933 }
934 }
935 } else if (count_down(obj) <= 0) {
936 explode(obj, obj);
937 }
938 }
939 break;
943 if (g_2_asFlakCooldownTable[obj] > 0)
945 if (g_asProjectileEvasionTicks[obj] > 0)
947 if (g_2_asFlakCooldownTable[obj] > 0 &&
948 g_asObjectType[obj] < 0x3a)
950 if (g_asSpikeriCooldown[obj] > 0)
951 g_asSpikeriCooldown[obj]--;
954 /* Masked off with "& 0" in the original; the compiler keeps
955 * the dead test behind a jump. */
956 if ((g_nSpaceFrame & 0) &&
959 for (gun = 0; gun < 3; gun++) {
960 if (g_27_aasGunCooldown[obj][gun] > 0)
961 g_27_aasGunCooldown[obj][gun]--;
962 }
963 if (g_asShipCloakCooldown[obj] > 0)
966 if (g_asShipFriendlyFireCooldown[obj] > 0)
968 g_acShipExhaustHeat[obj] = 0;
969 if (count_down(obj) > 0) {
970 if (g_asShipManeuver[obj] ==
972 g_asObjectScale[obj] >>= 1;
973 if (g_aeSpecialManeuver[obj] ==
975 g_aeObjectClass[obj] >=
978 0 ? 8 : 4) - 1 ==
979 g_asObjectCounter[obj]) {
980 ShipExplosion(obj);
983 g_acObjectType[obj]].
984 explosionDamage);
985 } else {
986 while ((unsigned short)RandomInRange(0, 100) < 50)
988 }
989 }
990 } else if (g_asObjectCounter[obj] == 0) {
991 if (g_aeSpecialManeuver[obj] ==
993 if (g_nYourWingman != -1 &&
994 g_acShipLastAttacker[obj] == 0 &&
995 g_asShipSide[obj] == SIDE_KILRATHI &&
996 RandomBelowOrEqual(100) < 20) {
998 }
1000 if (g_nArcadeState != 0)
1001 return;
1005 break;
1006 }
1007 switch (g_asShipManeuver[obj]) {
1009 if (g_asShipSide[obj] != SIDE_NEUTRAL) {
1010 if (obj != 0 && obj != g_nYourWingman) {
1012 g_asShipMissionIndex[obj]].state = 2;
1013 remove_object(obj);
1014 if (g_nCannedSceneMode == 0)
1016 } else if (obj == 0) {
1018 }
1019 }
1020 break;
1022 if (g_asShipTactic[obj] != TACTIC_WARP_IN) {
1023 if ((short)g_acObjectOwner[obj] != obj) {
1024 remove_object(obj);
1025 } else {
1027 obj,
1028 (short)g_abShipNavPointIndex[obj],
1029 -1, 1);
1030 reset_maneuver(obj, -1);
1031 }
1032 }
1033 break;
1034 }
1035 }
1036 if (g_asShipMissionIndex[obj] ==
1040 normal_speed(0) != 0 &&
1041 distance_from_object(0, obj) < 700) {
1043 g_nArcadeState = 1;
1044 }
1045 break;
1046 }
1047 }
1048}
1049
1050/* Function start: 0x41C7ED */
1052{
1053 short obj;
1054
1055 if (g_nCannedSceneMode != 0) {
1056 if (g_bSceneEscapeRequested != 0) {
1059 } else {
1065 }
1066 } else {
1070 }
1071
1072 for (obj = 0; obj <= SPACE_LAST_MOVING_OBJECT; obj++) {
1073 if (g_aeObjectClass[obj] == OBJECT_CLASS_NULL) {
1074 if (g_nCannedSceneMode == 0 &&
1075 g_aeSpecialManeuver[obj] ==
1078 continue;
1079 }
1082 continue;
1083 } else if (g_aeObjectClass[obj] > OBJECT_CLASS_PLANET) {
1084 animate_object(obj);
1085 if (g_nCannedSceneMode != 0) {
1087 &g_aShipVelocity[obj],
1088 &g_aShipPosition[obj]);
1089 if (obj < 10)
1090 fix_objects_ijk(obj);
1091 continue;
1092 }
1093 if (g_aeObjectClass[obj] >=
1095 object_collision(obj);
1096 rotate_object(obj);
1097 if (obj >= 10 ||
1098 g_aeSpecialManeuver[obj] !=
1100 if (obj != 0 ||
1101 g_bJumpSequenceActive != 0) {
1103 } else if (g_nCurrentView == 4) {
1105 }
1106 if (g_aeObjectClass[obj] ==
1108 g_asShipTurretFireEnabled[obj] != 0)
1110 if (obj < 10 &&
1111 g_aeObjectClass[obj] >=
1113 if (g_nCannedSceneMode == 0)
1115 if (obj != 0 || g_nCurrentView == 4)
1117 }
1118 }
1119 }
1120 if (g_nCurrentView == 4 &&
1121 g_nAimCameraMode == 1 &&
1122 g_nTargetCameraObject == obj &&
1126 if (g_aeObjectClass[obj] >= OBJECT_CLASS_SHIP) {
1127 replenish_shields(obj);
1130 }
1131 }
1132 }
1133}
1134
1135/* Function start: 0x41CB3C */
1136unsigned int rotate_object(short obj)
1137{
1138 if (g_anObjectPitchRotation[obj] != 0) {
1141 }
1142 if (g_anObjectYawRotation[obj] != 0) {
1145 }
1146 if (g_anObjectRollRotation[obj] != 0) {
1149 }
1150}
1151
1152/* Function start: 0x41CC0A */
1154{
1155 int size;
1156 int thrust;
1157 int accel;
1158 FixedVector delta;
1159 FixedVector impulse;
1160
1162 switch (g_aeSpecialManeuver[obj]) {
1164 g_acShipExhaustHeat[obj] = 0;
1165 if (RandomBelowOrEqual(100) < 10)
1167 break;
1171 g_anShipSpeed[obj]);
1172 if (g_anShipSpeed[obj] == 0)
1174 break;
1175 }
1176 if (g_aeSpecialManeuver[obj] <
1179 zero_vector(&impulse);
1180 switch (g_aeSpecialManeuver[obj]) {
1183 if (g_asShipAfterburnerTimer[obj] == 0) {
1184 if (obj == 0) {
1185 /* The DOS build stopped the afterburner sound here;
1186 * the Win32 port compiled the body out. */
1187 }
1188 g_aeSpecialManeuver[obj] =
1191 g_anShipSpeed[obj], &delta);
1192 } else {
1193 thrust = (g_aObjectTypeData[
1194 g_acObjectType[obj]]
1196 2 +
1197 40) << 8;
1199 thrust, &delta);
1200 drain_fuel(obj, 200);
1201 g_acShipExhaustHeat[obj] = 3;
1202 }
1203 break;
1206 if (g_asShipAfterburnerTimer[obj] == 0) {
1207 g_aeSpecialManeuver[obj] =
1210 g_anShipSpeed[obj], &delta);
1211 } else {
1212 zero_vector(&delta);
1213 drain_fuel(obj, 140);
1214 }
1215 break;
1216 default:
1218 g_anShipSpeed[obj], &delta);
1219 break;
1220 }
1221 ComputeVectorDelta(&g_aShipVelocity[obj], &delta,
1222 &delta);
1223 size = Vector_magnitude(&delta);
1224 if (size > 0) {
1225 accel = GetShipAccelerationRate(obj);
1226 if (alert_flag(obj, 1) != 0 && accel < 0x500)
1227 accel = 0x500;
1228 if (g_aeSpecialManeuver[obj] ==
1230 g_aeSpecialManeuver[obj] ==
1232 accel *= 2;
1233 }
1234 accel = MultiplyFixed(
1235 accel,
1238 &delta,
1239 &g_aShipForwardVector[obj]),
1240 size) + 0x200) >> 1;
1241 accel = MinInt(DivideFixed(accel, size), 0x100);
1242 ScaleFixedVector(&delta, accel, &impulse);
1243 if (g_aeSpecialManeuver[obj] !=
1245 g_acShipExhaustHeat[obj] = 2;
1246 }
1247 }
1248 AddFixedVectors(&impulse,
1249 &g_aShipVelocity[obj],
1250 &g_aShipVelocity[obj]);
1251 if (obj == 0)
1252 g_vPlayerAcceleration = impulse;
1253 }
1254 }
1256 &g_aShipVelocity[obj],
1257 &g_aShipPosition[obj]);
1258}
1259
1260/* Function start: 0x41D07B */
1261void animate_shape(short obj)
1262{
1263 short type;
1264 unsigned char *sequence;
1265 short entry;
1266
1267 type = g_acObjectType[obj];
1268 sequence = g_aObjectTypeData[type].animation;
1269 if (sequence == 0)
1270 return;
1271 if (--g_acObjectAnimationDelay[obj] > 0)
1272 return;
1275 entry = *(unsigned short *)(sequence +
1276 g_asObjectAnimationIndex[obj] * 2);
1277 switch (entry & 0xf000) {
1278 case 0x9000:
1279 g_asObjectAnimationIndex[obj] = entry & 0x0fff;
1280 entry = *(unsigned short *)(sequence +
1281 g_asObjectAnimationIndex[obj] * 2);
1282 if (g_asObjectScreenX[obj] != (short)0x8001 &&
1283 (g_asObjectType[obj] == 0x20 ||
1284 g_asObjectType[obj] == 0x1f ||
1285 g_asObjectType[obj] == 0x3d)) {
1286 PlaySfxWaveFileByNumber(13, obj, 0);
1287 }
1288 break;
1289 case 0xa000:
1290 remove_object(obj);
1291 return;
1292 }
1293
1294 switch (entry & 0x0c00) {
1295 case 0x0400:
1296 g_asObjectScale[obj] +=
1297 (entry & 0x3f) *
1298 ((unsigned short)g_asObjectScale[obj] >> 6);
1299 break;
1300 case 0x0800:
1301 g_asObjectScale[obj] -=
1302 (entry & 0x3f) *
1303 ((unsigned short)g_asObjectScale[obj] >> 6);
1304 break;
1305 default:
1306 entry &= 0x3f;
1307 g_asObjectViewFrame[obj] = entry;
1308 }
1309 g_asObjectFlip[obj] = (entry & 0xc0) >> 2;
1311}
1312
1313/* Function start: 0x41D2DA */
1314void animate_object(short obj)
1315{
1316 FixedVector offset;
1317 short effect;
1318
1319 switch (g_aeObjectClass[obj]) {
1324 case OBJECT_CLASS_MINE:
1325 animate_shape(obj);
1326 break;
1327 case OBJECT_CLASS_SHIP:
1328 if (g_asObjectScreenX[obj] != (short)0x8001 &&
1329 (g_nRenderedSpaceFrame & 3) == 0 &&
1331 g_acObjectType[obj]].damageCapacity >> 1) - 1 <=
1332 g_asObjectDamage[obj]) {
1333 effect = find_vacant_3d_object();
1334 if (effect != -1) {
1336 -((int)g_asObjectCollisionRadius[obj]
1337 << 8),
1338 &offset);
1339 AddFixedVectors(&g_aShipPosition[obj], &offset,
1340 &g_aShipPosition[effect]);
1342 AddFixedVectors(&g_aShipPosition[effect], &offset,
1343 &g_aShipPosition[effect]);
1344 zero_vector(&g_aShipVelocity[effect]);
1346 effect,
1347 (enum ObjectType)((unsigned short)RandomInRange(0, 2) +
1349 obj, 0);
1350 g_asObjectScale[effect] =
1351 g_asObjectScale[obj];
1352 if (RandomInRange(0, 3) == 0)
1353 PlaySfxWaveFileByNumber(7, obj, 0);
1354 }
1355 }
1356 break;
1357 }
1358}
1359
1360/* Function start: 0x41D4C7 */
1361void hit_asteroid(short asteroid, short destructionChance)
1362{
1363 short fragments;
1364
1365 if (RandomBelowOrEqual((short)(destructionChance - 1)) == 0) {
1366 destructionChance = (short)(RandomBelowOrEqual(1) + 2);
1367 for (fragments = 0; fragments < destructionChance; fragments++) {
1368 make_shard(asteroid, g_aShipVelocity[asteroid]);
1369 }
1370 explode(-1, asteroid);
1371 } else if (RandomBelowOrEqual(7) == 0) {
1372 make_shard(asteroid, g_vCollisionDelta);
1373 }
1374}
1375
1376/* Function start: 0x41D591 */
1377void object_collision(short obj)
1378{
1379 short damage;
1380 short scale;
1381 SphericalVector impactBearing;
1382 short adaptiveDamageScale;
1383 FixedVector component;
1384 int elasticity;
1385 FixedVector offAxis;
1386 short objectMass;
1387 short otherMass;
1388 int forceMagnitude;
1389 FixedVector hitDirection;
1390 FixedVector otherComponent;
1391 FixedVector relativePosition;
1392 short impactDamage;
1393 short lifespan;
1394 FixedVector closingVelocity;
1395 int total;
1396 FixedVector cameraSpace;
1397 short travelSpeed;
1398 short collider;
1399
1400 objectMass = g_aObjectTypeData[
1402 collider = check_for_collision(obj);
1403 if (collider != -1) {
1404 if (g_bPlayerCollisionEnabled == 0 &&
1405 (collider == 0 || obj == 0))
1406 return;
1407 otherMass = g_aObjectTypeData[
1408 g_acObjectType[collider]].radarRadius;
1411 &g_aShipVelocity[obj],
1412 &hitDirection);
1413 NormalizeFixedVector(&hitDirection);
1414
1415 switch (g_aeObjectClass[obj]) {
1417 if (g_acObjectOwner[obj] != collider &&
1418 g_aeObjectClass[collider] !=
1420 if (g_aeObjectClass[collider] >=
1422 if (collider == 0) {
1425 &g_aShipPosition[obj],
1426 &relativePosition);
1428 &relativePosition, &cameraSpace, EYE_OBJECT);
1429 rectangular_to_spherical(&cameraSpace,
1430 &impactBearing);
1431 if (abs(impactBearing.pitch) < 45) {
1432 if (abs(impactBearing.yaw) < 45)
1434 0x38;
1435 else if (abs(impactBearing.yaw) > 135)
1437 0x38;
1438 else if (impactBearing.yaw < 0)
1440 0x38;
1441 else
1443 0x38;
1444 } else if (impactBearing.pitch < 0) {
1446 0x38;
1447 } else {
1449 0x38;
1450 }
1451 }
1452 g_acShipLastAttacker[collider] =
1453 g_acObjectOwner[obj];
1454 g_acShipCollisionCooldown[collider] += 4;
1455 if (g_abProjectileCollisionBonus[obj] != 0)
1456 g_asProjectileEvasionTicks[collider] += 4;
1457 if (g_asObjectType[obj] == 9 ||
1458 g_asObjectType[obj] == 0x0e) {
1459 damage = g_asObjectDamage[obj];
1460 } else {
1461 lifespan = *(int *)&g_aObjectTypeData[
1462 g_acObjectType[obj]].lifetime;
1463 damage = (short)(
1464 (g_asObjectCounter[obj] / lifespan +
1465 1) *
1466 (g_asObjectDamage[obj] >> 1));
1467 }
1468 adaptiveDamageScale = MinShort(
1469 150, MaxShort(70, GetAdaptiveTurnRate()));
1470 if (g_asShipSide[collider] == 0) {
1471 damage = (short)(adaptiveDamageScale * damage /
1472 100);
1473 }
1474 component = g_aShipVelocity[obj];
1475 NormalizeFixedVector(&component);
1476 ScaleFixedVector(&component, (int)damage << 8,
1477 &component);
1480 &component, collider);
1482 inflict_damage(obj, collider, damage, &hitDirection);
1484 }
1485 scale = g_asObjectScale[obj];
1488 g_acObjectOwner[obj], 0);
1489 g_asObjectScale[obj] =
1490 (unsigned short)(scale * 2);
1491 g_aShipVelocity[obj] =
1492 g_aShipVelocity[collider];
1494 if (g_aeObjectClass[collider] ==
1496 hit_asteroid(collider, 3);
1497 }
1498 break;
1499
1500 case OBJECT_CLASS_MINE:
1501 if (g_acObjectOwner[obj] == collider ||
1503 return;
1504 if (easy2see(obj) == 0 &&
1505 (g_nCurrentView == 0 || collider != 0))
1506 remove_object(obj);
1507 else
1508 explode(obj, obj);
1509 break;
1510
1512 if (g_acObjectOwner[obj] != collider ||
1515 (int)objectMass << 8, &component);
1518 &component, collider);
1519 explode(obj, obj);
1521 }
1522 break;
1523
1525 if (g_aeObjectClass[collider] ==
1527 if (g_asObjectScreenX[obj] == (short)0x8001)
1528 remove_object(obj);
1529 else
1530 hit_asteroid(obj, 0);
1531 }
1532 break;
1533
1534 case OBJECT_CLASS_SHIP:
1536 case OBJECT_CLASS_BASE:
1537 if ((g_aeObjectClass[collider] ==
1539 (g_aeObjectClass[collider] ==
1541 g_acObjectOwner[collider] == -1)) &&
1542 easy2see(collider) == 0 &&
1543 (g_nCurrentView == 0 || obj != 0))
1544 remove_object(collider);
1545 if ((g_aeObjectClass[collider] ==
1547 g_aeObjectClass[collider] ==
1549 g_aeObjectClass[collider] >=
1551 g_acLastCollisionObject[obj] != collider) {
1552 PlaySfxWaveFileByNumber(0x1c, obj, 0);
1553 g_acLastCollisionObject[collider] =
1554 (signed char)obj;
1556 (signed char)collider;
1557
1558 forceMagnitude =
1560 forceMagnitude = DivideFixed(
1561 (g_asObjectCollisionRadius[collider] +
1562 g_asObjectCollisionRadius[obj]) << 8,
1563 forceMagnitude);
1564 forceMagnitude = MinInt(forceMagnitude, 0x7d000);
1566 forceMagnitude, &component);
1567 AddFixedVectors(&g_aShipPosition[obj], &component,
1568 &g_aShipPosition[collider]);
1569
1571 &g_aShipVelocity[obj],
1572 &g_vCollisionDelta, &component);
1574 &component, &offAxis);
1576 &g_aShipVelocity[collider],
1577 &g_vCollisionDelta, &otherComponent);
1578 ComputeVectorDelta(&otherComponent, &component,
1579 &closingVelocity);
1580 impactDamage =
1581 (short)(Vector_magnitude(&closingVelocity) >> 8);
1582 impactDamage = (short)((impactDamage * impactDamage) >> 1);
1583 total = otherMass + objectMass;
1585 objectMass, otherMass) /
1586 total;
1587 elasticity = MinInt(MaxInt(0x40, elasticity), 0x400);
1588 ScaleFixedVector(&closingVelocity, elasticity, &component);
1589 AddFixedVectors(&component, &otherComponent, &component);
1590 forceMagnitude = MultiplyFixed(
1591 (int)objectMass * 0x600,
1592 Vector_magnitude(&component)) + 0xa00;
1593 travelSpeed = (short)(Vector_magnitude(
1594 &g_aShipVelocity[obj]) >> 8);
1595 if (travelSpeed < COLLISION_MAXIMUM_VELOCITY(obj)) {
1596 AddFixedVectors(&component,
1597 &g_aShipVelocity[obj],
1598 &g_aShipVelocity[obj]);
1599 }
1600
1601 if (g_aeObjectClass[obj] == OBJECT_CLASS_SHIP) {
1602 NormalizeFixedVector(&offAxis);
1603 negate_vector(&offAxis);
1604 ScaleFixedVector(&offAxis, forceMagnitude, &offAxis);
1606 &offAxis, obj);
1607 negate_vector(&hitDirection);
1608 if (g_asObjectType[obj] == 0x33 &&
1609 g_aeObjectClass[collider] ==
1611 impactDamage /= 2;
1612 inflict_damage(collider, obj, impactDamage,
1613 &hitDirection);
1614 negate_vector(&hitDirection);
1615 }
1616
1618 &otherComponent, &offAxis);
1619 elasticity = ((objectMass + objectMass) << 8) / total;
1620 elasticity = MinInt(MaxInt(0x40, elasticity), 0x400);
1621 ScaleFixedVector(&closingVelocity, elasticity, &component);
1622 AddFixedVectors(&component, &otherComponent, &component);
1623 travelSpeed = (short)(Vector_magnitude(
1624 &g_aShipVelocity[obj]) >> 8);
1625 if (travelSpeed < COLLISION_MAXIMUM_VELOCITY(collider)) {
1626 AddFixedVectors(&component,
1627 &g_aShipVelocity[collider],
1628 &g_aShipVelocity[collider]);
1629 }
1630 if (g_aeObjectClass[collider] ==
1632 NormalizeFixedVector(&offAxis);
1633 negate_vector(&offAxis);
1634 ScaleFixedVector(&offAxis, forceMagnitude, &offAxis);
1637 &offAxis, collider);
1638 inflict_damage(obj, collider, impactDamage,
1639 &hitDirection);
1640 }
1641 if (g_aeObjectClass[collider] >=
1644 &g_aShipVelocity[obj],
1645 &g_aShipPosition[obj]);
1646 g_anShipSpeed[obj] = 0;
1647 g_aShipVelocity[obj] =
1648 g_aShipVelocity[collider];
1649 }
1650 }
1651 break;
1652 }
1653 } else {
1654 g_acLastCollisionObject[obj] = -1;
1655 }
1656}
1657
1658/* Function start: 0x41E276 */
1659void object_intelligence(short obj)
1660{
1661 short target;
1662
1663 if (g_nTrainSimActive == 4)
1664 return;
1665 switch (g_aeObjectClass[obj]) {
1666 case OBJECT_CLASS_SHIP:
1667 if (g_asObjectType[obj] == 0x33 &&
1668 (obj == 0 ||
1669 (g_bJumpSequenceActive != 0 &&
1670 g_nYourWingman == obj))) {
1672 } else {
1673 ship_intelligence(obj);
1674 }
1675 break;
1678 break;
1679 case OBJECT_CLASS_BASE:
1681 break;
1684 break;
1685 case OBJECT_CLASS_MINE:
1686 mine_intelligence(obj);
1687 break;
1689 if (g_nSpaceFrame % 4 == 0 ||
1690 g_nExternalViewShip == obj) {
1691 target = g_acShipTarget[obj];
1692 if (target != -1)
1693 get_facing_range_from_object(obj, target);
1694 switch (g_asObjectType[obj]) {
1696 g_anShipSpeed[obj] =
1697 (get_ship_max_velocity(obj) + 10) * 0x100;
1698 break;
1701 break;
1704 break;
1707 point_ship(obj, 0, &g_vToTarget);
1708 g_anShipSpeed[obj] =
1709 (get_ship_max_velocity(obj) + 10) * 0x100;
1710 break;
1712 chaff_intelligence(obj);
1713 break;
1714 }
1715 }
1716 break;
1717 }
1718}
1719
1720/* Linker commons defined here. LINK lays a unit's commons out by the
1721 * identifiers' hash keys, so these spellings follow the original addresses. */
1723short g_nStarFieldJRotationNumber; /* 0x005d320c */
1724short g_2_nExternalViewDistanceValue; /* 0x005d320e */
1725short g_1_nStarFieldIRotation; /* 0x005d3210 */
1726short g_7_nExternalViewTimeout; /* 0x005d3212 */
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
unsigned int approach_zero_speed(short ship)
Definition logic.c:508
void housekeep_power_plant_and_fuel(short ship)
Definition ship.c:2939
void replenish_shields(short ship)
Definition ship.c:2949
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 set_special(short ship, short special)
Definition logic.c:493
short count_down(short obj)
Definition spc.c:811
short ShipExplosion(short obj)
Definition ship.c:1786
short HasShipCockpitGunDisplay(short ship)
Definition ship.c:106
void make_shard(short asteroid, FixedVector direction)
Definition fields.c:46
short MaxShort(short a, short b)
Definition disk.c:36
long MultiplyFixed(int left, int right)
Definition eventmgr.c:51
void initialize_view_buffer(void)
Definition main.c:217
void SetViewportRect(Viewport *viewport, unsigned short left, unsigned short top, unsigned short right, unsigned short bottom)
Definition viewrect.c:9
short explode(short attacker, short victim)
Definition ship.c:1915
void fix_objects_ijk(short obj)
Definition geom.c:481
void FillFixedVectorWithRandomComponents(short limit, FixedVector *vector)
Definition geom.c:272
unsigned int generate_stars(void)
Definition spc.c:674
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 SetPaletteEntry(short index, short *rgb)
Definition gr.c:676
void object_collision(short obj)
Definition spc.c:1377
void UpdateSavedTorpedoTargetLock(void)
Definition turret.c:931
void remove_object(short obj)
Definition geom.c:858
void house_keep_objects(void)
Definition spc.c:819
void alter_pitch(short angle, short obj)
Definition geom.c:504
void UpdateTargetCameraObject(short obj)
Definition turret.c:789
void CompleteStarSystemJump(void)
Definition jump.c:216
long Vector_magnitude(const FixedVector *vector)
Definition eventmgr.c:157
void Create_explosion_debris(short obj)
Definition ship.c:1557
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:211
unsigned int match_rotation_goal(short *rotation, short *goal, short totalError, short rate)
Definition ship.c:538
void rotate_object_to_goal(short obj)
Definition ship.c:576
short easy2see(short obj)
Definition fields.c:25
void alter_roll(short angle, short obj)
Definition geom.c:520
short unactive(short ship)
Definition logic.c:186
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
void replenish_weapon_energy_bank(short ship)
Definition ship.c:2973
void object_intelligence(short obj)
Definition spc.c:1659
void HandleCannedSceneBufferBoundary(void)
Definition taperec.c:48
short check_for_collision(short obj)
Definition geom.c:769
void FF_missile_intelligence(short obj)
Definition brains.c:1463
short onboard_explosion(short obj)
Definition ship.c:1031
void ClearTargetCameraView(void)
Definition turret.c:718
void rotational_acceleration(FixedVector *point, FixedVector *force, short obj)
Definition geom.c:965
short FixedToShortSaturating(int value)
Definition geom.c:122
short CountShipCockpitGunDisplays(short ship)
Definition turret.c:659
short MinShort(short a, short b)
Definition disk.c:27
short get_ship_max_velocity(short obj)
Definition geom.c:9
short inflict_damage(short attacker, short victim, short damage, const FixedVector *impactDirection)
Definition ship.c:804
void point_ship(short obj, short turnRate, const FixedVector *direction)
Definition geom.c:667
short distance_from_object(short obj, short other)
Definition geom.c:547
void extra_hazard(short obj)
Definition fields.c:317
void copy_frame(short source, short destination)
Definition geom.c:470
int MaxInt(int a, int b)
Definition geom.c:142
short signed_random(short range)
Definition logic.c:19
void SetTargetCameraEyePosition(short cameraMode)
Definition turret.c:972
void accelerate_and_move_object(short obj)
Definition spc.c:1153
void alter_yaw(short angle, short obj)
Definition geom.c:512
void force_view(int view, short obj)
Definition spc.c:423
short GetVectorMagnitude(const FixedVector *vector)
Definition spc.c:66
short IsCockpitExplosionActive(void)
Definition cockpt.c:133
unsigned int rotate_object(short obj)
Definition spc.c:1136
void SaveTorpedoTargetLockForViewChange(int previousView)
Definition spc.c:432
void RecordCannedSceneObjectState(short obj)
Definition taperec.c:115
void SetFleetOverviewView(short initializeCockpit)
Definition fleetvw.c:9
short GetAdaptiveTurnRate(void)
Definition ship.c:137
void animate_shape(short obj)
Definition spc.c:1261
unsigned int rotate_eye_to_goal(void)
Definition spc.c:37
long DivideFixed(int numerator, int denominator)
Definition eventmgr.c:64
void zero_vector(FixedVector *vector)
Definition geom.c:197
void SubtractFixedVectors(FixedVector *left, FixedVector *right, FixedVector *difference)
Definition geom.c:220
int MinInt(int a, int b)
Definition geom.c:133
void ship_intelligence(short obj)
Definition brains.c:861
unsigned int update_star_field(void)
Definition spc.c:710
void ClearViewport(Viewport *viewport, short colour)
Definition gr.c:1027
void UpdateShipTurretGuns(int ship)
short find_vacant_3d_object(void)
Definition geom.c:841
void SpawnMissionEjectionPod(short obj)
Definition destroy.c:43
void get_facing_range_from_object(short obj, short other)
Definition geom.c:578
void PlaySfxWaveFileByNumber(int soundNumber, int sourceObject, int looping)
Definition music.c:490
void rectangular_to_spherical(const FixedVector *rectangular, SphericalVector *spherical)
Definition geom.c:289
unsigned int shrink_vector(FixedVector *vector)
Definition eventmgr.c:2036
void initialize_cockpit(signed char mode)
Definition fltsetup.c:100
void UpdateFleetOverviewCameraRotation(void)
Definition turret.c:270
void capital_ship_intelligence(short obj)
Definition brains.c:1292
unsigned int new_view(int view, short obj)
Definition spc.c:451
void futurion_intelligence(short obj)
Definition brains.c:1370
void chaff_intelligence(short obj)
Definition brains.c:1523
void NormalizeAndScaleVector(FixedVector *vector, int scale)
Definition geom.c:747
void mine_intelligence(short obj)
Definition brains.c:1550
void send_message(short obj, signed char message)
Definition cockpt.c:3116
void ClampVectorTo30(short *p)
Definition geom.c:1001
void stationary_intelligence(short obj)
Definition brains.c:969
void RecordCannedSceneObjectEvent(short obj, int event)
Definition taperec.c:176
void divide_vector(FixedVector *vector, int divisor, FixedVector *result)
Definition geom.c:245
void heat_seeking_missile_intelligence(short obj)
Definition brains.c:1389
unsigned int set_eye_direction_and_position(void)
Definition spc.c:72
void vector_component_in_dir(const FixedVector *vector, const FixedVector *direction, FixedVector *component)
Definition geom.c:375
unsigned int start_dust(short obj, FixedVector origin, short forwardDistance, int rightOffset, int upOffset)
Definition spc.c:648
void free_view_buffer(void)
Definition main.c:208
unsigned short RandomInRange(unsigned short lo, unsigned short hi)
Definition eventmgr.c:31
void set_objects_data(short obj, short type, short owner, short matchObjectClass)
Definition ship.c:347
void animate_object(short obj)
Definition spc.c:1314
short normal_speed(short obj)
Definition logic.c:68
void update_objects_in_space(void)
Definition spc.c:1051
void ApplyCannedSceneFrameEvents(void)
Definition replay.c:150
void update_hazards(void)
Definition fields.c:375
void reset_maneuver(short ship, short maneuver)
Definition logic.c:476
short RandomBelowOrEqual(short n)
Definition eventmgr.c:43
void explosion_shock_wave(short obj, short blastDamage)
Definition ship.c:1729
void hit_asteroid(short asteroid, short destructionChance)
Definition spc.c:1361
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
short alert_flag(short ship, unsigned int bits)
Definition logic.c:25
int GetShipAccelerationRate(short ship)
Definition geom.c:62
Shared Win32 declarations, types and library interfaces.
#define OBJECT_DATA_CHAFF_POD
Definition game_data.h:1614
#define SPACE_LAST_MOVING_OBJECT
Definition game_data.h:1579
@ OBJECT_DATA_EJECTION_POD
Definition game_data.h:457
@ OBJECT_DATA_PROJECTILE_IMPACT_EFFECT
Definition game_data.h:455
@ OBJECT_DATA_SHIP_DAMAGE_EFFECT_FIRST
Definition game_data.h:456
#define EYE_OBJECT
Definition game_data.h:1580
ObjectType
Definition game_data.h:54
@ OBJECT_TYPE_EXPLOSION2
Definition game_data.h:105
@ SIDE_KILRATHI
Definition game_data.h:176
@ SIDE_NEUTRAL
Definition game_data.h:177
#define OBJECT_DATA_INDEX(sourceType)
Definition game_data.h:1596
#define OBJECT_DATA_TORPEDO
Definition game_data.h:1613
@ OBJECT_DATA_SPICULUM_IMAGE_RECOGNITION_MISSILE
Definition game_data.h:443
@ OBJECT_DATA_DART_DUMB_FIRE_MISSILE
Definition game_data.h:440
@ OBJECT_DATA_PILUM_FRIEND_OR_FOE_MISSILE
Definition game_data.h:442
@ OBJECT_DATA_JAVELIN_HEAT_SEEKING_MISSILE
Definition game_data.h:441
@ SPECIAL_MANEUVER_STOP_DRIFT
Definition game_data.h:266
@ SPECIAL_MANEUVER_SUPER_BRAKE
Definition game_data.h:263
@ SPECIAL_MANEUVER_UNKNOWN_9
Definition game_data.h:269
@ SPECIAL_MANEUVER_KILL_ENGINES
Definition game_data.h:265
@ SPECIAL_MANEUVER_AFTERBURNER
Definition game_data.h:261
@ SPECIAL_MANEUVER_NONE
Definition game_data.h:259
@ MANEUVER_WARPING_OUT
Definition game_data.h:210
@ MANEUVER_WARPING_IN
Definition game_data.h:209
@ 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_MINE
Definition game_data.h:47
@ OBJECT_CLASS_EXPLOSION
Definition game_data.h:42
@ OBJECT_CLASS_NULL
Definition game_data.h:37
@ OBJECT_CLASS_BASE
Definition game_data.h:51
@ TACTIC_WARP_IN
Definition game_data.h:160
@ TACTIC_RAM
Definition game_data.h:157
@ TACTIC_SIT_STILL
Definition game_data.h:154
short g_asObjectScreenAngle[SPACE_OBJECT_COUNT]
Definition viewrect.c:97
HazardField * g_pActiveHazardField
Definition viewrect.c:60
short g_asShipCloakCooldown[10]
Definition viewrect.c:180
short g_27_aasGunCooldown[10][3]
Definition turret.c:1283
short g_asObjectCollisionRadius[SPACE_OBJECT_COUNT]
Definition viewrect.c:120
short g_asProjectileEvasionTicks[8]
Definition viewrect.c:186
short g_asShipAfterburnerTimer[10]
Definition viewrect.c:137
short g_bApplyingCollisionDamage
Definition spc.c:15
short g_nExternalViewShip
Definition viewrect.c:74
short g_nSpaceBlastFlashIncrement
Definition main.c:2006
short g_asShipFriendlyFireCooldown[10]
Definition viewrect.c:183
short g_2_nExternalViewDistanceValue
Definition spc.c:1724
short g_nTargetCameraObject
Definition turret.c:1235
short g_nYourWingman
Definition viewrect.c:75
FixedVector g_vToTarget
Definition viewrect.c:44
int g_nCockpitDisplayMode
Definition main.c:1929
short g_nEyeRollRate
Definition viewrect.c:40
short g_nTargetLockMusicCooldown
Definition cockpt.c:3811
short g_anObjectRollRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:119
signed char g_bSceneEscapeRequested
Definition eventmgr.c:2420
int g_nCurrentView
Definition spc.c:11
short g_7_asShipBurstStageCountdown[10]
Definition ship.c:3063
short g_1_nStarFieldIRotation
Definition spc.c:1725
short g_nPlayerCollisionObject
Definition viewrect.c:78
signed char g_acShipExhaustHeat[16]
Definition viewrect.c:145
short g_asSpikeriCooldown[16]
Definition brains.c:1574
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
signed char g_acLastCollisionObject[SPACE_OBJECT_COUNT]
Definition viewrect.c:123
signed char g_abProjectileCollisionBonus[SPACE_OBJECT_COUNT]
Definition viewrect.c:185
short g_nSelectedReleaseWeaponIndex
Definition viewrect.c:84
signed char g_acShipTarget[16]
Definition viewrect.c:167
short g_anObjectYawRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:118
short g_asObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:124
short g_nCannedSceneRecordedFrameCountNumber
Definition taperec.c:324
short g_9_aasCockpitHitPaletteFades[6][3]
Definition message.c:235
short g_nEyeYawGoal
Definition viewrect.c:36
short g_asObjectFlip[SPACE_OBJECT_COUNT]
Definition viewrect.c:102
signed char g_acShipCollisionCooldown[16]
Definition viewrect.c:178
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
short g_asPlayerHitsCreditValues[10]
Definition ship.c:3067
short g_nEyePitchGoal
Definition viewrect.c:35
signed char g_cViewObject
Definition viewrect.c:34
FixedVector g_aShipForwardVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:107
short g_nStarFieldJRotationNumber
Definition spc.c:1723
short g_asObjectScreenX[SPACE_OBJECT_COUNT]
Definition viewrect.c:95
short g_nSavedTargetLockCountdown
Definition turret.c:1270
FixedVector g_vStarFieldMotion
Definition viewrect.c:41
short g_asShipCloakElapsedFrames[10]
Definition viewrect.c:181
short g_nSpaceExplosionFlashActive
Definition spc.c:14
int g_9_nTargetCameraOverlayMode
Definition turret.c:1285
short g_aeSpecialManeuver[12]
Definition viewrect.c:141
unsigned short g_asObjectScale[SPACE_OBJECT_COUNT]
Definition viewrect.c:115
FixedVector g_aShipRightVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:105
short g_bJumpSequenceActive
Definition jump.c:10
FixedVector g_vPreviousStarFieldMotion
Definition viewrect.c:42
short g_nCannedSceneBufferNearCapacityFlag
Definition taperec.c:12
signed char g_acObjectOwner[SPACE_OBJECT_COUNT]
Definition viewrect.c:122
signed char g_abShipNavPointIndex[16]
Definition viewrect.c:170
short g_bViewportDirty
Definition main.c:1942
short g_bPlayerCollisionEnabled
Definition main.c:1947
short g_nSpaceFrame
Definition viewrect.c:32
short g_6_nHomeOperationShipIndexValue
Definition cockpt.c:3806
short g_asObjectDamage[SPACE_OBJECT_COUNT]
Definition viewrect.c:121
signed char g_bLandingCommRequestPending
Definition spc.c:9
short g_nEyePitchRate
Definition viewrect.c:38
short g_bTargetLockMode
Definition viewrect.c:92
short g_anObjectPitchRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:117
short g_asShipTactic[12]
Definition viewrect.c:168
short g_nRenderedSpaceFrame
Definition viewrect.c:33
short g_nSpacePaletteFadeMode
Definition palalloc.c:8
short g_asObjectAnimationIndex[SPACE_OBJECT_COUNT]
Definition viewrect.c:111
short g_bCarrierLandingEnabled
Definition main.c:1945
int g_nArcadeState
Definition main.c:1938
signed char g_acObjectCollisionGraceTicks[SPACE_OBJECT_COUNT]
Definition viewrect.c:114
short g_nSavedPlayerTarget
Definition turret.c:1265
int g_anShipSpeed[SPACE_OBJECT_COUNT]
Definition viewrect.c:116
short g_aSpaceExplosionFlashPalette[13][3]
Definition main.c:1977
short g_nScreenHeight
Definition eventmgr.c:2431
unsigned char g_aShipWeapons[10][0xA1]
Definition viewrect.c:150
short g_2_asFlakCooldownTable[16]
Definition brains.c:1573
short g_asMissileProximityFuseValues[16]
Definition ship.c:3068
Viewport g_27_stViewScratchInfo
Definition cockpt.c:3841
FixedVector g_vPlayerAcceleration
Definition viewrect.c:79
int g_anShipCloakState[10]
Definition viewrect.c:179
short g_1_asSpacePaletteFade[3]
Definition message.c:241
short g_nEyeYawRate
Definition viewrect.c:39
unsigned char g_bPrimaryViewBufferColour
Definition startup.c:545
short g_bAlternateChaseView
Definition spc.c:12
FixedVector g_aShipPosition[SPACE_OBJECT_COUNT]
Definition viewrect.c:108
unsigned char g_cPrimaryViewBufferColour
Definition startup.c:559
short g_7_nExternalViewTimeout
Definition spc.c:1726
FixedVector g_aShipUpVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:106
short g_nTargetCameraFrame
Definition turret.c:1239
short g_asShipManeuver[12]
Definition viewrect.c:169
short g_nEyeRollGoal
Definition viewrect.c:37
FixedVector g_aShipVelocity[SPACE_OBJECT_COUNT]
Definition viewrect.c:109
short g_asShipMissionIndex[12]
Definition viewrect.c:153
int g_nCapitalShipViewDistance
Definition spc.c:10
short g_bTargetLockActive
Definition cockpt.c:9
int g_nTrainSimActive
Definition main.c:1937
signed char g_1_cStoredViewDisplayModeValue
Definition eventmgr.c:2515
short g_asShipTurretFireEnabled[10]
Definition turret.c:1269
MissionShipRecord g_aMissionShips[MISSION_SHIP_COUNT]
Definition hotspot.c:240
short g_nFleetOverviewPitch
Definition turret.c:1243
short g_nCannedSceneSegmentEndFrame
Definition taperec.c:13
signed char g_acShipLastAttacker[16]
Definition viewrect.c:138
short g_asIntelligenceEvent[12]
Definition spc.c:16
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
short g_5_nCannedSceneFrameCount
Definition taperec.c:329
int g_nAimCameraMode
Definition turret.c:1279
FixedVector g_vCollisionDelta
Definition viewrect.c:43
signed char g_acObjectAnimationDelay[SPACE_OBJECT_COUNT]
Definition viewrect.c:112
short g_asObjectCounter[SPACE_OBJECT_COUNT]
Definition viewrect.c:110
short g_nCannedSceneMode
Definition taperec.c:14
short g_nPendingEjectionShip
Definition destroy.c:69
short g_bSavedPlayerTarget
Definition turret.c:1266
short g_bMissionDeathSequencePending
Definition destroy.c:8
short g_nTargetLockCountdown
Definition viewrect.c:87
short g_asObjectViewFrame[SPACE_OBJECT_COUNT]
Definition viewrect.c:94
short g_bStarSystemJumpTransition
Definition jump.c:9
short g_nFleetOverviewYaw
Definition turret.c:1242
short g_nCockpitCameraObject
Definition main.c:1943
#define COLLISION_MAXIMUM_VELOCITY(obj)
Definition spc.c:32
int g_nChaseCameraMaximumVelocity
Definition spc.c:13
FixedVector g_vExternalViewOffset
Definition spc.c:1722
#define COLLISION_MASS_DIFFERENCE_SCALE(objectMass, partnerMass)
Definition spc.c:25
signed char state
Definition game_data.h:1380
short maximumVelocity
Definition game_data.h:377
unsigned char * animation
Definition game_data.h:379
short radarRadius
Definition game_data.h:371