Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
turret.c
Go to the documentation of this file.
1/*
2 * Fleet overview, target camera and turret guns.
3 *
4 * Retail object 0x45E9F0-0x46147F (link order; see docs/ORDER.md).
5 */
6#define TURRET_C
7#include "game.h"
8
9static ShortVector g_aTargetCameraEyeOffsets[3]; /* 0x0049d430 */
10
11static ShortVector g_aaTurretProjectileOffsets[2][2]; /* 0x0049d448 */
12
13static short g_nTargetCameraGunCooldown; /* 0x0049d33c */
14
15static short g_asFleetMouseYawThresholds[6]; /* 0x0049d400 */
16
17static short g_asFleetMousePitchThresholds[6]; /* 0x0049d410 */
18
19static signed char g_bFleetPolledInputActive; /* 0x0049d420 */
20
21static signed char g_bFleetButtonInputActive; /* 0x0049d424 */
22
23static short g_nFleetMouseYawVelocity; /* 0x0049d428 */
24
25static short g_nFleetMousePitchVelocity; /* 0x0049d42c */
26
27extern short g_bMapPrimaryInputQueued; /* 0x005c57dc */ /* main.c common */
28
29extern short g_2_bFleetMouseMovePosted; /* 0x005c57ea */ /* main.c common */
30
31#pragma function(abs)
32/* Function start: 0x45E9F0 */
34{
35 short absX;
36 short scrollY;
37 signed char arrowKeys;
38 short otherKeys;
39 InputEventState state;
40 short eventType;
41 short action;
42 short yAbs;
43 short deadZone;
44 int firePressed;
45 short pauseModifiers;
46 short justPressed;
47 short scrollX;
48
49 action = 0;
50 firePressed = 0;
58 arrowKeys = 0;
60 g_cCurrentKey |= (signed char)0x80;
62 g_cCurrentKey |= (signed char)0x80;
66 } else {
67 arrowKeys = 1;
68 }
69 if (g_bMapPrimaryInputQueued == 0 &&
71 g_cCurrentKey = 0x39;
72 firePressed = 1;
73 }
76
77 while ((eventType = GetNextInputEvent(&state)) != 0) {
78 switch (eventType) {
79 case 3:
80 if (g_nCockpitControlState == 0) {
88 }
89 scrollX = (short)(
90 state.x -
93 scrollY = (short)(
94 state.y -
99 absX = (short)abs(scrollX);
100 yAbs = (short)abs(scrollY);
101 deadZone = 0;
102 while (g_asFleetMouseYawThresholds[deadZone] <=
103 absX)
104 deadZone++;
105 if (scrollX < 0)
106 scrollX = (short)-deadZone;
107 else
108 scrollX = deadZone;
109 deadZone = 0;
110 while (g_asFleetMousePitchThresholds[deadZone] <=
111 yAbs)
112 deadZone++;
113 if (scrollY < 0)
114 scrollY = (short)-deadZone;
115 else
116 scrollY = deadZone;
117 if ((int)state.x - 4 <=
119 scrollX = -8;
120 if ((int)state.x + 4 >=
122 scrollX = 8;
123 if ((int)state.y - 4 <=
125 scrollY = -8;
126 if ((int)state.y + 4 >=
128 scrollY = 8;
129 if (scrollX >= 9)
130 scrollX = 8;
131 if (scrollX <= -9)
132 scrollX = -8;
133 if (scrollY >= 9)
134 scrollY = 8;
135 if (scrollY <= -9)
136 scrollY = -8;
138 (short)-scrollX;
144 break;
145 case 7:
147 if (g_nTargetCameraFrame == 0) {
152 }
153 break;
154 case 1:
156 g_cCurrentKey = 0x39;
157 firePressed = 1;
158 break;
159 case 5:
164 break;
165 case 6:
166 action = 1;
167 case 4:
170 g_cCurrentKey = (signed char)state.status;
171 justPressed =
173 action == 0;
174 pauseModifiers =
175 (short)((unsigned short)g_12_wInputDeviceButtonStatus & 0x1800);
176 otherKeys =
177 (short)((unsigned short)g_12_wInputDeviceButtonStatus & 0x600);
178 switch ((signed char)g_cCurrentKey) {
179 case 0x1c:
180 case 0x39:
181 g_cCurrentKey = 0x39;
182 firePressed = 1;
183 break;
184 case 0x50:
187 break;
188 case 0x48:
191 break;
192 case 0x4b:
195 break;
196 case 0x4d:
199 break;
200 case 0x26:
201 if (g_cPreviousKey !=
204 (short)(g_bTargetLockMode == 0);
205 PlaySfxWaveFileByNumber(0x19, -1, 0);
206 }
207 break;
208 case 0x14:
209 if (g_cPreviousKey !=
212 break;
213 case 0x22:
215 case 0x3b:
216 case 0x3c:
217 case 0x3d:
218 case 0x3e:
219 case 0x3f:
220 case 0x40:
221 case 0x41:
222 break;
223 case 0x19:
224 ShowGamePausedBanner(pauseModifiers == 0);
225 default:
226 g_cCurrentKey = (signed char)0x80;
227 break;
228 }
229 break;
230 }
231 }
232
233 if (g_nAimCameraMode == 0) {
234 if ((g_cCurrentKey & 0x80) != 0 &&
236 g_cCurrentKey = 0x39;
237 } else if ((g_cCurrentKey & 0x80) != 0 &&
238 (g_stCurrentFlightInput.buttons & 1) != 0 &&
240 g_cCurrentKey = 0x39;
241 }
242 if (g_nAimCameraMode == 0 &&
243 (g_cCurrentKey & 0x80) != 0 &&
244 (g_6_wQueuedButtonsState & 1) != 0)
245 g_cCurrentKey = 0x39;
247 g_cCurrentKey == 0x39) {
248 if (g_nAimCameraMode == 0) {
250 } else if (g_nTargetCameraZoom >= 0x21 &&
253 }
254 g_cCurrentKey = (signed char)0x80;
255 }
256 if (g_nTargetCameraFrame == 1 &&
257 (g_nCurrentView != 4 ||
258 g_nAimCameraMode != 1 || firePressed == 0))
264 else
266 return action;
267}
268
269/* Function start: 0x45F200 */
271{
272 char yawRotated;
273
274 yawRotated = 0;
276 ((g_nFleetOverviewYaw < 65 &&
277 g_nFleetOverviewYaw > -65) ||
278 (g_nFleetOverviewYaw == 65 &&
280 (g_nFleetOverviewYaw == -65 &&
285 (short)(65 - g_nFleetOverviewYaw);
286 else if (g_nFleetOverviewYaw +
289 (short)(-65 - g_nFleetOverviewYaw);
295 (short)(g_nFleetOverviewYaw +
297 yawRotated++;
298 }
300 yawRotated == 0 &&
301 ((g_nFleetOverviewPitch < 65 &&
302 g_nFleetOverviewPitch > -65) ||
303 (g_nFleetOverviewPitch >= 65 &&
305 (g_nFleetOverviewPitch <= -65 &&
310 (short)(65 - g_nFleetOverviewPitch);
311 else if (g_nFleetOverviewPitch +
314 (short)(-65 - g_nFleetOverviewPitch);
320 (short)(g_nFleetOverviewPitch +
322 }
324}
325
326/* Function start: 0x45F439 */
328{
329 short type;
330 short shot;
331 short projectile;
332 ObjectTypeData *projectileData;
333 short projectileVelocity;
334 FixedVector direction;
335 short travel;
336
337 projectileVelocity = 10;
338 type = 8;
339 if (g_1_nGunShowEnergyPercent <= 0 ||
341 return;
342 for (shot = 0; shot < 2; shot++) {
343 projectile = new_object(type, 0);
344 if (projectile != -1) {
345 g_abProjectileCollisionBonus[projectile] = 1;
346 projectileData =
347 &g_aObjectTypeData[type];
348 copy_frame(EYE_OBJECT, projectile);
349 g_asObjectDamage[projectile] =
350 projectileData->damageCapacity;
351 projectileVelocity = (short)(
353 g_acObjectType[projectile]]
354 .maximumVelocity * 2);
357 projectileData->animationDelay / 2);
358 /* The two gun offsets per display sit inside the gun
359 * display configuration record at +0x88. The ~~ identities
360 * make CL 4.1 emit the up term first, matching retail;
361 * neither complement survives instruction emission. */
362 g_aShipPosition[projectile].x =
363 ~~((*(ShortVector (*)[2][2])(
365 g_8_nGunDisplaySlot][shot].y *
367 (*(ShortVector (*)[2][2])(
369 g_8_nGunDisplaySlot][shot].z *
371 EYE_OBJECT].x +
372 (*(ShortVector (*)[2][2])(
374 g_8_nGunDisplaySlot][shot].x *
376 EYE_OBJECT].x +
378 g_aShipPosition[projectile].y =
379 ~~((*(ShortVector (*)[2][2])(
381 g_8_nGunDisplaySlot][shot].y *
383 (*(ShortVector (*)[2][2])(
385 g_8_nGunDisplaySlot][shot].z *
387 EYE_OBJECT].y +
388 (*(ShortVector (*)[2][2])(
390 g_8_nGunDisplaySlot][shot].x *
392 EYE_OBJECT].y +
394 g_aShipPosition[projectile].z =
395 (*(ShortVector (*)[2][2])(
397 g_8_nGunDisplaySlot][shot].y *
399 (*(ShortVector (*)[2][2])(
401 g_8_nGunDisplaySlot][shot].z *
403 EYE_OBJECT].z +
404 (*(ShortVector (*)[2][2])(
406 g_8_nGunDisplaySlot][shot].x *
408 EYE_OBJECT].z +
410 g_asObjectCounter[projectile] =
411 (short)g_aObjectTypeData[
412 type].lifetime;
413 zero_vector(&g_aShipVelocity[projectile]);
414 direction =
416 NormalizeFixedVector(&direction);
417 travel = (short)(
418 (projectileData->lifetime + 5) *
419 projectileData->maximumVelocity);
421 &direction, (int)travel << 8, &direction);
424 &direction, &direction);
425 point_at(projectile, direction);
427 &g_aShipForwardVector[projectile],
428 (int)projectileVelocity << 8, &direction);
429 g_aShipVelocity[projectile] = direction;
430 RecordCannedSceneObjectEvent(projectile, 0);
432 (short)(g_acGunRefireDelay[
433 type - 7] >> 1);
434 PlaySfxWaveFileByNumber(8, projectile, 0);
435 }
436 }
437}
438
439/* Function start: 0x45F7EC */
440void UpdateShipTurretGuns(short ship)
441{
442 short victim;
443 short whichSide;
444 short aimLead;
445 ObjectTypeData *projectileData;
446 FixedVector front;
447 short projectile;
448 FixedVector spread;
449 FixedVector aimPoint;
450 short boltSpeed;
451 int t;
452 short round;
453 int angle;
454 ShortVector gunOffset;
455 FixedVector gunLateral;
456 short ammo;
457 FixedVector gunUp;
458 short candidate;
459 short turrets;
460 FixedVector gunOrigin;
461
462 boltSpeed = 10;
463 victim = -1;
464 whichSide = 0;
465 turrets = CountShipCockpitGunDisplays(ship);
466 if (turrets == 0)
467 return;
468
469 for (t = 0; t < turrets; t++) {
470 if (ship == 0 && g_nCurrentView == 4 &&
472 continue;
473 if (g_asShipSide[projectile] == SIDE_IMPERIAL &&
474 (unsigned short)RandomInRange(0, 10) < 8)
475 continue;
476 if (g_asShipSide[projectile] == SIDE_KILRATHI &&
477 (unsigned short)RandomInRange(0, 10) < 5)
478 continue;
479 if (g_27_aasGunCooldown[ship][t] > 0)
480 continue;
481
482 switch (t) {
483 case 0:
484 gunLateral = g_aShipRightVector[ship];
485 negate_vector(&gunLateral);
486 gunUp = g_aShipUpVector[ship];
487 front = g_aShipForwardVector[ship];
488 negate_vector(&front);
489 whichSide = 0;
490 break;
491 case 1:
492 gunLateral = g_aShipRightVector[ship];
493 gunUp = g_aShipUpVector[ship];
494 front = g_aShipForwardVector[ship];
495 negate_vector(&front);
496 whichSide = 1;
497 break;
498 case 2:
499 gunLateral = g_aShipRightVector[ship];
500 negate_vector(&gunLateral);
501 gunUp = g_aShipUpVector[ship];
502 front = g_aShipForwardVector[ship];
503 whichSide = 1;
504 break;
505 }
506
507 NormalizeFixedVector(&gunLateral);
508 NormalizeFixedVector(&gunUp);
509 NormalizeFixedVector(&front);
510 for (candidate = 0; candidate < 10; candidate++) {
511 if (g_aeObjectClass[candidate] ==
513 g_asShipSide[candidate] !=
514 g_asShipSide[ship] &&
515 g_anShipCloakState[candidate] != 1) {
516 g_nTargetRange = (short)(
518 ship, &g_aShipPosition[candidate]) -
523 if (t == 2) {
524 angle = dot_product(
526 &g_aShipRightVector[ship]);
527 } else if (t == 1) {
528 aimPoint = g_aShipRightVector[ship];
529 negate_vector(&aimPoint);
530 angle = dot_product(
531 &g_2_vNormalizedToTgt, &aimPoint);
532 } else {
533 angle = dot_product(
534 &g_2_vNormalizedToTgt, &front);
535 }
537 (short)(((short)angle * 100) >> 8);
538 if (g_nFacingToTarget > 85 &&
539 g_nTargetRange < 4000)
540 victim = candidate;
541 }
542 }
543 if (victim == -1)
544 continue;
545
546 gunOffset = g_aTargetCameraEyeOffsets[t];
547 gunOrigin.x =
548 g_aShipUpVector[ship].x * gunOffset.y +
549 g_aShipForwardVector[ship].x * gunOffset.z +
550 g_aShipRightVector[ship].x * gunOffset.x +
551 g_aShipPosition[ship].x;
552 gunOrigin.y =
553 g_aShipUpVector[ship].y * gunOffset.y +
554 g_aShipForwardVector[ship].y * gunOffset.z +
555 g_aShipRightVector[ship].y * gunOffset.x +
556 g_aShipPosition[ship].y;
557 gunOrigin.z =
558 g_aShipUpVector[ship].z * gunOffset.y +
559 g_aShipRightVector[ship].z * gunOffset.x +
560 g_aShipForwardVector[ship].z * gunOffset.z +
561 g_aShipPosition[ship].z;
562 ammo = 8;
563 spread.x =
564 ((unsigned short)RandomInRange(0, 500) - 250) << 8;
565 spread.y =
566 ((unsigned short)RandomInRange(0, 500) - 250) << 8;
567 spread.z =
568 ((unsigned short)RandomInRange(0, 500) - 250) << 8;
569
570 for (round = 0; round < 2; round++) {
571 projectile = new_object(ammo, ship);
572 if (projectile != -1) {
573 projectileData =
574 &g_aObjectTypeData[ammo];
575 g_aShipRightVector[projectile] = gunLateral;
576 g_aShipUpVector[projectile] = gunUp;
577 g_aShipForwardVector[projectile] = front;
578 g_asObjectDamage[projectile] =
579 projectileData->damageCapacity;
580 boltSpeed =
582 g_acObjectType[projectile]]
584 g_aShipPosition[projectile].x =
585 g_aaTurretProjectileOffsets[whichSide][round].y *
586 gunUp.x +
587 g_aaTurretProjectileOffsets[whichSide][round].z *
588 front.x +
589 g_aaTurretProjectileOffsets[whichSide][round].x *
590 gunLateral.x +
591 gunOrigin.x;
592 g_aShipPosition[projectile].y =
593 g_aaTurretProjectileOffsets[whichSide][round].y *
594 gunUp.y +
595 g_aaTurretProjectileOffsets[whichSide][round].z *
596 front.y +
597 g_aaTurretProjectileOffsets[whichSide][round].x *
598 gunLateral.y +
599 gunOrigin.y;
600 g_aShipPosition[projectile].z =
601 g_aaTurretProjectileOffsets[whichSide][round].z *
602 front.z +
603 g_aaTurretProjectileOffsets[whichSide][round].y *
604 gunUp.z +
605 g_aaTurretProjectileOffsets[whichSide][round].x *
606 gunLateral.z +
607 gunOrigin.z;
608 g_asObjectCounter[projectile] =
609 (short)g_aObjectTypeData[ammo].lifetime;
610 zero_vector(&g_aShipVelocity[projectile]);
611 aimPoint = front;
612 NormalizeFixedVector(&aimPoint);
613 aimLead = (short)(
614 (projectileData->lifetime + 5) *
615 projectileData->maximumVelocity);
617 &aimPoint, (int)aimLead << 8, &aimPoint);
618 aimPoint.x = g_aShipPosition[victim].x;
619 aimPoint.y = g_aShipPosition[victim].y;
620 aimPoint.z = g_aShipPosition[victim].z;
621 AddFixedVectors(&spread, &aimPoint, &aimPoint);
622 point_at(projectile, aimPoint);
624 &g_aShipForwardVector[projectile],
625 (int)boltSpeed << 8, &aimPoint);
626 g_aShipVelocity[projectile].x = aimPoint.x;
627 g_aShipVelocity[projectile].y = aimPoint.y;
628 g_aShipVelocity[projectile].z = aimPoint.z;
629 RecordCannedSceneObjectEvent(projectile, 0);
630 PlaySfxWaveFileByNumber(8, projectile, 0);
631 g_27_aasGunCooldown[ship][t] = 12;
632 if (ship != 0 &&
634 g_27_aasGunCooldown[ship][t] =
635 (short)(
636 g_27_aasGunCooldown[ship][t] +
637 6);
638 }
639 }
640 if (ship != 0)
641 return;
642 }
643}
644
645/* Function start: 0x4601F1 */
657
658/* Function start: 0x460242 */
660{
661 short gunCount;
662 short weapon;
663
664 gunCount = 0;
665 for (weapon = 0;
666 weapon < (short)(signed char)g_aShipWeapons[ship][0];
667 weapon++) {
668 if (((ShipWeaponSlot *)&g_aShipWeapons[ship][1])[
669 weapon].type == 0x0b)
670 gunCount++;
671 }
672 return gunCount;
673}
674
675/* Function start: 0x4602BE */
716
717/* Function start: 0x4603C5 */
738
739/* Function start: 0x460498 */
787
788/* Function start: 0x460650 */
790{
791 long speed;
792 short objective;
793
794 if ((g_nSpaceFrame & 7) == 0) {
797 PlaySfxWaveFileByNumber(0x26, -1, 0);
798 }
800 point_ship_at_object(obj, 0);
801 trim_goals(obj, 10);
813 speed = Vector_magnitude(&g_aShipVelocity[obj]);
814 if (speed > 0x6400)
817 &g_aShipPosition[obj]) < 500) {
820 if (g_pCampaignGlobals == 0)
822 if (g_asObjectType[obj] == 0x3d) {
824 } else {
829 }
830 }
831 for (objective = 0;
832 objective < (short)g_cMissionObjectiveCount;
833 objective++) {
834 if (g_aMissionObjectives[objective].type == 6 &&
835 g_aMissionObjectives[objective].index ==
837 flag_reached(objective, 0);
838 }
839 remove_object(obj);
841 g_asShipMissionIndex[obj]].state = 2;
844 }
845}
846
847#pragma function(abs)
848/* Function start: 0x4608E8 */
850{
851 short yawDeviation;
852 short pitchDeviation;
853 short yawOverflow;
854 short excessPitch;
855 short distanceScale;
856 unsigned short distance;
857
858 distanceScale = 0;
859 excessPitch = distanceScale;
860 yawOverflow = excessPitch;
875 distance = (unsigned short)distance_from_object(
877
883 return;
884 }
890 return;
891 }
892 if (distance > 4000) {
896 return;
897 }
898
899 yawDeviation = (short)(abs((int)g_nFleetOverviewYaw) - 17);
900 pitchDeviation = (short)(abs((int)g_nFleetOverviewPitch) - 17);
901 if (yawDeviation > 0)
902 yawOverflow = yawDeviation;
903 if (pitchDeviation > 0)
904 excessPitch = pitchDeviation;
905 distanceScale = (short)(distance >> 6);
907 if (excessPitch < yawOverflow && distanceScale < yawOverflow)
909 (short)(g_nTargetCameraZoom - yawOverflow);
910 if (excessPitch > yawOverflow && distanceScale < excessPitch)
912 (short)(g_nTargetCameraZoom - excessPitch);
913 if (distanceScale > yawOverflow && distanceScale > excessPitch)
915 (short)(g_nTargetCameraZoom - distanceScale);
916 if (g_nTargetCameraZoom > 100)
918 if (g_nTargetCameraZoom < 67)
920}
921
922#pragma intrinsic(abs)
923/* Function start: 0x460BAF */
929
930/* Function start: 0x460BCC */
932{
933 if (g_bSavedPlayerTarget != 0) {
935 if (g_nFacingToTarget < 100)
937 if (g_nTargetRange < 3000)
940 g_nFacingToTarget > 5 &&
941 g_nFacingToTarget < 100) ||
943 g_nTargetRange > 10000 ||
947 "Torpedo Lock Lost",
948 (unsigned short)g_cYellowColour,
949 20);
951 return;
952 } else {
959 }
962 "Torpedo Locked!",
963 (unsigned short)g_cYellowColour,
964 20);
966 }
967 } else
969}
970
971/* Function start: 0x460D3E */
972void SetTargetCameraEyePosition(short cameraMode)
973{
974 ShortVector offset;
975
976 offset = g_aTargetCameraEyeOffsets[cameraMode];
978 offset.y * g_aShipUpVector[0].x +
979 offset.z * g_aShipForwardVector[0].x +
980 offset.x * g_aShipRightVector[0].x +
983 offset.y * g_aShipUpVector[0].y +
984 offset.z * g_aShipForwardVector[0].y +
985 offset.x * g_aShipRightVector[0].y +
988 offset.y * g_aShipUpVector[0].z +
989 offset.z * g_aShipForwardVector[0].z +
990 offset.x * g_aShipRightVector[0].z +
992}
993
994/* Function start: 0x460DFE */
995void DrawTargetCameraAttitudeIndicators(unsigned short colour)
996{
998
999 scanner = ((CockpitScannerGeometry *)(
1002 if (g_nFleetOverviewYaw != 0) {
1003 if (g_nFleetOverviewYaw < 0)
1005 (short)(scanner.centerX +
1006 g_nFleetOverviewYaw * 14 / 65 + 14);
1007 else
1009 (short)(scanner.centerX -
1010 (g_nFleetOverviewYaw * -14 / 65 + 14));
1013 (short)GetViewportPixel(
1021 (short)colour);
1023 (short)GetViewportPixel(
1031 (short)colour);
1033 (short)GetViewportPixel(
1041 (short)colour);
1042 }
1043 if (g_nFleetOverviewPitch != 0) {
1044 if (g_nFleetOverviewPitch > 0)
1046 (short)(scanner.centerY +
1047 g_nFleetOverviewPitch * -14 / 65 + 14);
1048 else
1050 (short)(scanner.centerY -
1051 (g_nFleetOverviewPitch * 14 / 65 + 14));
1054 (short)GetViewportPixel(
1056 (short)(g_4_nTargetCameraPitchPipX - 1),
1060 (short)(g_4_nTargetCameraPitchPipX - 1),
1062 (short)colour);
1064 (short)GetViewportPixel(
1072 (short)colour);
1074 (short)GetViewportPixel(
1076 (short)(g_4_nTargetCameraPitchPipX + 1),
1080 (short)(g_4_nTargetCameraPitchPipX + 1),
1082 (short)colour);
1083 }
1084}
1085
1086/* Function start: 0x4610BC */
1088{
1089 CockpitScannerGeometry scanner;
1090 short colour;
1091
1092 colour = 0xfa;
1093 scanner = ((CockpitScannerGeometry *)(
1113 (short)(g_4_nTargetCameraPitchPipX - 1),
1123 (short)(g_4_nTargetCameraPitchPipX + 1),
1128 scanner.centerX, scanner.centerY, colour);
1131 (short)(scanner.centerX + 1), scanner.centerY, colour);
1134 (short)(scanner.centerX - 1), scanner.centerY, colour);
1137 scanner.centerX, (short)(scanner.centerY + 1), colour);
1140 (short)(scanner.centerX + 1),
1141 (short)(scanner.centerY + 1), colour);
1144 (short)(scanner.centerX - 1),
1145 (short)(scanner.centerY + 1), colour);
1148 scanner.centerX, (short)(scanner.centerY - 1), colour);
1151 (short)(scanner.centerX + 1),
1152 (short)(scanner.centerY - 1), colour);
1155 (short)(scanner.centerX - 1),
1156 (short)(scanner.centerY - 1), colour);
1157}
1158
1159/* Function start: 0x4612C1 */
1160/* Nothing in the shipped executable calls this. The fleet-overview copy of
1161 * determine_pilot_hand: picks the pilot-hand frame from the overview's yaw
1162 * and pitch velocities. */
1164{
1165 short yaw;
1166 short pitch;
1167
1170 if (yaw > 0) {
1172 (signed char)MinShort((short)(yaw + 8), 12);
1173 return;
1174 }
1175 if (yaw < 0) {
1177 (signed char)MinShort((short)(4 - yaw), 8);
1178 return;
1179 }
1180 if (pitch > 0) {
1182 (signed char)MinShort((short)(pitch + 12), 16);
1183 return;
1184 }
1185 if (pitch < 0) {
1187 (signed char)MinShort((short)-pitch, 4);
1188 return;
1189 }
1191}
1192
1193/* Function start: 0x46138D */
1220
1221/* Function start: 0x461456 */
1223{
1224 return;
1225}
1226
1227/* Function start: 0x461466 */
1229{
1230 return;
1231}
1232
1233/* This unit's initialized data, in retail order; the statics are declared
1234 * at the top so that the functions keep their symbol keys. */
1235short g_nTargetCameraObject = -1; /* 0x0049d338 */
1236static short g_nTargetCameraGunCooldown = 4; /* 0x0049d33c */
1237unsigned char g_abGunDisplayConfiguration[0xa4] = { 0 }; /* 0x0049d340 */
1238short g_nTargetCameraZoom = 0; /* 0x0049d3e4 */
1239short g_nTargetCameraFrame = 0; /* 0x0049d3e8 */
1240short g_nFleetOverviewYawVelocity = 0; /* 0x0049d3ec */
1241short g_nFleetOverviewPitchVelocity = 0; /* 0x0049d3f0 */
1242short g_nFleetOverviewYaw = 0; /* 0x0049d3f4 */
1243short g_nFleetOverviewPitch = 0; /* 0x0049d3f8 */
1244int g_nTargetCameraSoundHandle = 0; /* 0x0049d3fc */
1245static short g_asFleetMouseYawThresholds[6] = {
1246 10, 37, 52, 57, 62, 1070
1247}; /* 0x0049d400 */
1248static short g_asFleetMousePitchThresholds[6] = {
1249 5, 18, 27, 35, 38, 1040
1250}; /* 0x0049d410 */
1251int g_nUnusedTurretWord = 0; /* 0x0049d41c */
1252static signed char g_bFleetPolledInputActive = 0; /* 0x0049d420 */
1253static signed char g_bFleetButtonInputActive = 0; /* 0x0049d424 */
1254static short g_nFleetMouseYawVelocity = 0; /* 0x0049d428 */
1255static short g_nFleetMousePitchVelocity = 0; /* 0x0049d42c */
1257 {0, 0, -80},
1258 {-50, 0, 0},
1259 {50, 0, 0}
1260}; /* 0x0049d430 */
1262 {{-25, 0, -80}, {25, 0, -80}},
1263 {{-50, 0, 25}, {-50, 0, -25}}
1264}; /* 0x0049d448 */
1265short g_nSavedPlayerTarget = -1; /* 0x0049d460 */
1266short g_bSavedPlayerTarget = 0; /* 0x0049d464 */
1267short g_nTargetCameraEffectObjectA = -1; /* 0x0049d468 */
1268short g_nTargetCameraEffectObjectB = -1; /* 0x0049d46c */
1269short g_asShipTurretFireEnabled[10] = { 0 }; /* 0x0049d470 */
1270short g_nSavedTargetLockCountdown = 1000; /* 0x0049d484 */
1271short g_bSavedTargetLockAcquired = 0; /* 0x0049d488 */
1272
1273/* Linker commons defined here. LINK lays a unit's commons out by the
1274 * identifiers' hash keys, so these spellings follow the original addresses. */
1275short g_1_nTargetCameraYawIndicatorX; /* 0x005c8d3e */
1277short g_asAimCameraYawIndicatorBackground[3]; /* 0x005c8d48 */
1278short g_1_nGunShowEnergyPercent; /* 0x005c8d4e */
1279int g_nAimCameraMode; /* 0x005c8d50 */
1281short g_4_nTargetCameraPitchPipX; /* 0x005c8d6c */
1282short g_nTargetLensPitchIndicatorY; /* 0x005c8d6e */
1283short g_27_aasGunCooldown[10][3]; /* 0x005c8d70 */
1285int g_9_nTargetCameraOverlayMode; /* 0x005c8db8 */
1286short g_12_nGunDisplayCount; /* 0x005c8dbc */
1287short g_6_bMissionWingmanState; /* 0x005c8dbe */
1288short g_8_nGunDisplaySlot; /* 0x005c8dc0 */
void ShowGamePausedBanner(short showBanner)
Definition message.c:187
unsigned int approach_zero_speed(short ship)
Definition logic.c:508
void UpdateTargetCameraTracking(void)
Definition turret.c:849
void ToggleTargetCameraTracking(void)
Definition turret.c:740
void DrawTargetCameraAttitudeIndicators(unsigned short colour)
Definition turret.c:995
short distance_between_points(const FixedVector *from, const FixedVector *to)
Definition geom.c:528
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
short ServiceInputDevices(short deviceMask)
Definition eventmgr.c:2071
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 UpdateSavedTorpedoTargetLock(void)
Definition turret.c:931
void remove_object(short obj)
Definition geom.c:858
void UpdateTargetCameraObject(short obj)
Definition turret.c:789
long Vector_magnitude(const FixedVector *vector)
Definition eventmgr.c:157
void ejection_sequence(short outcome, signed char restoreCockpit)
Definition midscene.c:63
void FinalizeTargetCameraViewHook(void)
Definition turret.c:1228
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:211
void FireTargetCameraGuns(void)
Definition turret.c:327
void DrawViewportPixel(Viewport *viewport, short x, short y, short colour)
Definition gr.c:1038
void flag_reached(short objective, short reached)
Definition cockpt.c:1379
short unactive(short ship)
Definition logic.c:186
void ScaleFixedVector(FixedVector *vector, int scale, FixedVector *result)
Definition geom.c:237
short HandleFleetOverviewInput(void)
Definition turret.c:33
void ClearTargetCameraView(void)
Definition turret.c:718
void DrawSpriteDefault(Viewport *viewport, short x, short y, unsigned char *shape, short frame)
Definition gr.c:682
short CountShipCockpitGunDisplays(short ship)
Definition turret.c:659
short MinShort(short a, short b)
Definition disk.c:27
void ResetTargetCameraView(void)
Definition turret.c:646
short distance_from_object(short obj, short other)
Definition geom.c:547
void copy_frame(short source, short destination)
Definition geom.c:470
void SetTargetCameraEyePosition(short cameraMode)
Definition turret.c:972
void apply_force_to_objects_center(FixedVector *force, short obj)
Definition geom.c:895
void cycle_onscreen_targets(void)
Definition cockpt.c:2871
void DrawUnreferencedPilotHandFrame(Viewport *viewport, unsigned char *shape, BarracksAnimationState *state)
Definition turret.c:1194
void ResetCockpitPaletteEntries(void)
Definition fltsetup.c:76
void zero_vector(FixedVector *vector)
Definition geom.c:197
void LoadTemporaryCampaignGlobals(void)
Definition campglob.c:180
short handle_collisions(short obj)
Definition smart.c:141
void UpdateTargetCameraCockpitHook(void)
Definition turret.c:1222
void trim_goals(short obj, short amount)
Definition logic.c:201
void UpdateShipTurretGuns(int ship)
short find_vacant_3d_object(void)
Definition geom.c:841
void SetHudMessageText(char *text, unsigned short colour, unsigned short duration)
Definition cockpt.c:2742
void get_facing_range_from_object(short obj, short other)
Definition geom.c:578
void FlushSoundEffectsAndLog(void *effect, short flags)
Definition music.c:439
void ToggleTargetCameraOverlay(void)
Definition turret.c:676
short new_object(short type, short owner)
Definition ship.c:240
void SetPersonnelMousePosition(short x, short y)
Definition mousepos.c:9
void PlaySfxWaveFileByNumber(int soundNumber, int sourceObject, int looping)
Definition music.c:490
void ResetScannerContacts(void)
Definition cockpt.c:1567
void UpdateFleetOverviewCameraRotation(void)
Definition turret.c:270
void point_at(short obj, FixedVector point)
Definition geom.c:84
void NormalizeAndScaleVector(FixedVector *vector, int scale)
Definition geom.c:747
short IsInputEventQueued(int type)
Definition main.c:657
void RecordCannedSceneObjectEvent(short obj, int event)
Definition taperec.c:176
void ClearSavedTorpedoTargetLock(void)
Definition turret.c:924
short GetViewportPixel(Viewport *viewport, short x, short y)
Definition gr.c:1049
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
int GetNextInputEvent(InputEventState *event)
Definition eventmgr.c:800
short NormalizeFixedVector(FixedVector *vector)
Definition geom.c:347
void CopyViewportContents(Viewport *source, Viewport *destination)
Definition gr.c:995
void negate_vector(FixedVector *vector)
Definition geom.c:203
void rotate_about_j(short angle, FixedVector *i, FixedVector *k)
Definition geom.c:413
void RestoreTargetCameraAttitudeIndicators(void)
Definition turret.c:1087
Shared Win32 declarations, types and library interfaces.
#define EYE_OBJECT
Definition game_data.h:1580
@ SIDE_IMPERIAL
Definition game_data.h:175
@ SIDE_KILRATHI
Definition game_data.h:176
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
short g_nObjectType62Index
Definition ship.c:12
FixedVector g_6_vTargetCameraForce
Definition turret.c:1280
signed char g_14_cPilotHandFrameCode
Definition cockpt.c:3788
HostMouseMessage g_6_stHostMouseTextBlock
Definition winmain.c:1384
short g_27_aasGunCooldown[10][3]
Definition turret.c:1283
short g_asObjectCollisionRadius[SPACE_OBJECT_COUNT]
Definition viewrect.c:120
short g_nFleetOverviewPitchVelocity
Definition turret.c:1241
unsigned char * g_apCockpitVduOverlayShapes[2]
Definition personnel.c:9
short g_1_bDiscreteFlightInputWaiting
Definition main.c:1999
short g_nTargetCameraEffectObjectB
Definition turret.c:1268
short g_8_nGunDisplaySlot
Definition turret.c:1288
short g_12_nGunDisplayCount
Definition turret.c:1286
signed char g_acPlayerComponentDamage[9]
Definition viewrect.c:76
short g_nTargetCameraObject
Definition turret.c:1235
FixedVector g_vToTarget
Definition viewrect.c:44
signed char g_acGunRefireDelay[4]
Definition ship.c:54
ShortPoint g_stPilotHandOrigin
Definition cockpt.c:25
short g_nTargetLockMusicCooldown
Definition cockpt.c:3811
InputDeviceSample g_10_stPrevFlightControls
Definition main.c:1996
short g_nFacingToTarget
Definition viewrect.c:45
int g_nCurrentView
Definition spc.c:11
short g_nTargetLensPitchIndicatorY
Definition turret.c:1282
short g_nObjectType63Index
Definition ship.c:13
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
signed char g_abProjectileCollisionBonus[SPACE_OBJECT_COUNT]
Definition viewrect.c:185
short g_asPilotHandOffsets[34]
Definition cockpt.c:35
signed char g_acShipTarget[16]
Definition viewrect.c:167
short g_asObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:124
unsigned char g_cYellowColour
Definition startup.c:547
short g_bSavedTargetLockAcquired
Definition turret.c:1271
CampaignGlobals * g_pCampaignGlobals
Definition gameflow.c:3707
Viewport g_stPilotHandViewportRecord
Definition message.c:233
InputDeviceSample g_stCurrentFlightInput
Definition main.c:1959
unsigned char * g_pPilotHandAnimationShapePtr
Definition message.c:232
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
short g_nCockpitControlGoal
Definition main.c:1965
FixedVector g_aShipForwardVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:107
short g_19_bPolledFlightInputQueued
Definition main.c:2010
short g_asObjectScreenX[SPACE_OBJECT_COUNT]
Definition viewrect.c:95
short g_nSavedTargetLockCountdown
Definition turret.c:1270
signed char g_cMissionObjectiveCount
Definition viewrect.c:66
MouseCursorState g_37_stPersonnelMousePointerState
Definition eventmgr.c:2544
short g_nTargetCameraEffectObjectA
Definition turret.c:1267
int g_9_nTargetCameraOverlayMode
Definition turret.c:1285
FixedVector g_aShipRightVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:105
short g_12_wInputDeviceButtonStatus
Definition eventmgr.c:2531
short g_nSpaceFrame
Definition viewrect.c:32
short g_6_wQueuedButtonsState
Definition eventmgr.c:2499
short g_6_bMissionWingmanState
Definition turret.c:1287
short g_asObjectDamage[SPACE_OBJECT_COUNT]
Definition viewrect.c:121
short g_bTargetLockMode
Definition viewrect.c:92
short g_nFleetOverviewYawVelocity
Definition turret.c:1240
Viewport g_3_stDashViewport
Definition cockpt.c:3829
signed char g_cPreviousKey
Definition viewrect.c:30
Viewport g_stPilotHandBackgroundViewportBlock
Definition cockpt.c:3843
short g_nSavedPlayerTarget
Definition turret.c:1265
unsigned char g_abGunDisplayConfiguration[0xa4]
Definition turret.c:1237
unsigned char g_aShipWeapons[10][0xA1]
Definition viewrect.c:150
Viewport g_27_stViewScratchInfo
Definition cockpt.c:3841
short g_nCockpitControlState
Definition main.c:1958
int g_anShipCloakState[10]
Definition viewrect.c:179
FixedVector g_aShipPosition[SPACE_OBJECT_COUNT]
Definition viewrect.c:108
short g_4_nTargetCameraPitchPipX
Definition turret.c:1281
FixedVector g_aShipUpVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:106
short g_nTargetCameraFrame
Definition turret.c:1239
short g_asAimCameraYawIndicatorBackground[3]
Definition turret.c:1277
short g_19_bStoredHighMemoryEnabled
Definition eventmgr.c:2505
int g_nTargetCameraSoundHandle
Definition turret.c:1244
Viewport g_101_stScrViewInfo
Definition cockpt.c:3831
FixedVector g_aShipVelocity[SPACE_OBJECT_COUNT]
Definition viewrect.c:109
short g_asShipMissionIndex[12]
Definition viewrect.c:153
short g_asShipTurretFireEnabled[10]
Definition turret.c:1269
signed char g_cCurrentKey
Definition viewrect.c:29
short g_1_nTargetLensYawIndicatorYWord
Definition turret.c:1276
MissionObjective g_aMissionObjectives[MISSION_OBJECTIVE_COUNT]
Definition viewrect.c:69
short g_nTargetCameraZoom
Definition turret.c:1238
short g_nTargetRange
Definition viewrect.c:47
MissionShipRecord g_aMissionShips[MISSION_SHIP_COUNT]
Definition hotspot.c:240
short g_nFleetOverviewPitch
Definition turret.c:1243
signed char g_cLastPilotHandFrame
Definition cockpt.c:34
PilotProfile g_stCurrentPilotProfile
Definition viewrect.c:73
short g_asTargetCameraPitchIndicatorBackgroundTable[3]
Definition turret.c:1284
short g_asShipSide[12]
Definition viewrect.c:139
signed char g_acObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:101
short g_1_nTargetCameraYawIndicatorX
Definition turret.c:1275
int g_nAimCameraMode
Definition turret.c:1279
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_1_nGunShowEnergyPercent
Definition turret.c:1278
short g_bSavedPlayerTarget
Definition turret.c:1266
short g_bMissionDeathSequencePending
Definition destroy.c:8
short g_asObjectViewFrame[SPACE_OBJECT_COUNT]
Definition viewrect.c:94
short g_nFleetOverviewYaw
Definition turret.c:1242
short g_bMapPrimaryInputQueued
Definition main.c:1997
short g_2_bFleetMouseMovePosted
Definition main.c:2002
int primaryButton
Definition game.h:182
unsigned int buttons
Definition game.h:224
short status
Definition game.h:213
signed char state
Definition game_data.h:1380
volatile short y
Definition game.h:166
short frame
Definition game.h:173
volatile short x
Definition game.h:165
short maximumVelocity
Definition game_data.h:377
short animationDelay
Definition game_data.h:373
short damageCapacity
Definition game_data.h:375
short playerShipType
Definition game_data.h:1123
short right
Definition game.h:154
short bottom
Definition game.h:155
short left
Definition game.h:152
short top
Definition game.h:153
static signed char g_bFleetButtonInputActive
Definition turret.c:21
void DetermineFleetOverviewPilotHand(void)
Definition turret.c:1163
static short g_nTargetCameraGunCooldown
Definition turret.c:13
int g_nUnusedTurretWord
Definition turret.c:1251
static short g_nFleetMousePitchVelocity
Definition turret.c:25
static ShortVector g_aaTurretProjectileOffsets[2][2]
Definition turret.c:11
static short g_asFleetMouseYawThresholds[6]
Definition turret.c:15
static signed char g_bFleetPolledInputActive
Definition turret.c:19
static short g_nFleetMouseYawVelocity
Definition turret.c:23
static ShortVector g_aTargetCameraEyeOffsets[3]
Definition turret.c:9
static short g_asFleetMousePitchThresholds[6]
Definition turret.c:17