Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
mission.c
Go to the documentation of this file.
1/*
2 * Mission setup, action spheres and ship loading.
3 *
4 * Retail object 0x44B200-0x44EA4F (link order; see docs/ORDER.md).
5 */
6#include "game.h"
7
8short g_bMissionShipInitializationInProgress = 0; /* 0x0049b890 */
9short g_bShipResourceReloadInProgress = 0; /* 0x0049b894 */
10void **g_apPacketReferenceGroups[5] = { 0 }; /* 0x0049b898 */
11unsigned char g_ucPendingEjectionTransition = 0xff; /* 0x0049b8ac */
12short g_bEjectionWaitForEnemyWave = 0; /* 0x0049b8b0 */
13short g_bEjectionAwaitingCommCommand = 0; /* 0x0049b8b4 */
14short g_nPendingEjectionSequenceCount = 0; /* 0x0049b8b8 */
15short g_bEjectionTriggerImmediately = 0; /* 0x0049b8bc */
16short g_nEjectionSequenceState = 0; /* 0x0049b8c0 */
17signed char g_cQueuedNpcPortrait = -1; /* 0x0049b8c4 */
18signed char g_cQueuedNpcMessage = -1; /* 0x0049b8c8 */
20 {
21 { 0, 0, 0 }, { -750, 0, 0 }, { 750, 0, 0 }, { 0, 0, -750 },
22 { 0, 0, 750 }, { -750, 0, -750 }, { 750, 0, -750 },
23 { 0, 0, -1500 }
24 },
25 {
26 { 0, 0, 0 }, { 750, 0, 0 }, { -750, -100, -250 },
27 { 1500, -100, -250 }, { -1500, -200, -500 },
28 { -2250, -300, -750 }, { 2250, -200, -500 },
29 { 3000, -300, -750 }
30 },
31 {
32 { 0, 0, 0 }, { 750, 0, -500 }, { -750, 0, -500 },
33 { 0, 0, -1000 }, { -1500, 0, -1000 }, { -750, 0, -1500 },
34 { 1500, 0, -1000 }, { 750, 0, -1500 }
35 },
36 {
37 { 0, 0, 0 }, { 750, 0, -250 }, { 0, 325, -500 },
38 { 750, -325, -750 }, { 0, 325, -500 }, { 750, -325, -750 },
39 { 0, 0, -1000 }, { 750, 0, -1250 }
40 },
41 {
42 { 0, 0, 0 }, { 0, 0, -750 }, { -750, 0, -500 },
43 { -750, 0, -1250 }, { 750, 0, -500 }, { 750, 0, -1250 },
44 { 0, 500, -500 }, { 0, 500, -1250 }
45 }
46}; /* 0x0049b8d0 */
48 5, 5, 4, 4, 3, 1, 1, 0
49}; /* 0x0049b9c0 */
50
51/* Function start: 0x44B200 */
53 FixedVector *position)
54{
57 &record->position, position);
58}
59
60/* Function start: 0x44B239 */
61short is_alive(signed char pilot)
62{
63 return g_pPilotStatus[pilot];
64
65}
66
67/* Function start: 0x44B257 */
75
76/* Function start: 0x44B29D */
78{
79 short index;
80
81 for (index = 0; index < 16; index++)
84}
85
86/* Function start: 0x44B2E2 */
87void init_mission(short series, short mission)
88{
89 /* Two dwords the port kept from the DOS memory budget code; unused. */
90 long freeMemory;
91 long largestBlock;
92 short index;
93
102 LoadMissionData(series, mission);
103 init_3Space_objects(series);
107 "objects.vga");
108 LoadPacketIntoBuffer("difflevl.000", 0,
113 for (index = 0; index < 10; index++) {
114 g_asShipIntelSlot[index] = -1;
115 g_asShipIntelResourceKey[index] = -1;
116 }
127 for (index = 0; index < 5; index++)
128 g_acJumpDriveUsedBySystem[index] = 0;
133}
134
135/* Function start: 0x44B48F */
136/* Re-describe an object from the alternate ship record that
137 * LoadAlternateShipType leaves in object-type slot 4. */
139{
140 ObjectTypeData *typeData;
141 void InitializeShipWeaponTypeIndices(short ship);
142 short weapon;
143
144 typeData = &g_aObjectTypeData[4];
145 g_acObjectType[obj] = 4;
146 g_apObjectShape[obj] = typeData->shapeSet;
147 g_apObjectExhaustShape[obj] = typeData->animation;
148 g_asObjectType[obj] = typeData->field_18;
149 g_aeObjectClass[obj] = typeData->objectClass;
150 init_ijk(obj);
152 g_asObjectScale[obj] = typeData->scale;
153 g_asObjectDamage[obj] = 0;
156 g_acObjectOwner[obj] = -1;
157 g_acLastCollisionObject[obj] = -1;
158 g_asObjectViewFrame[obj] = 0;
159 g_acShipTarget[obj] = -1;
160 g_aasShipShield[obj][0] = typeData->shieldFore;
161 g_aasShipMaximumShield[obj][0] =
162 g_aasShipShield[obj][0];
163 g_aasShipShield[obj][1] = typeData->shieldAft;
164 g_aasShipMaximumShield[obj][1] =
165 g_aasShipShield[obj][1];
166 g_aasShipArmor[obj][0] = typeData->armorFront;
167 g_aasShipArmor[obj][2] = typeData->armorLeft;
168 g_aasShipArmor[obj][3] = typeData->armorRight;
169 g_aasShipArmor[obj][1] = typeData->armorRear;
170 g_anShipFuel[obj] = *(const int *)&typeData->lifetime;
171 g_acShipIonDriveDamage[obj] = 0;
172 g_acShipDamage[obj] = 0;
174 g_acPilotHitPoints[obj] = 4;
175 memcpy(g_aShipWeapons[obj], typeData->weaponLoadout,
176 sizeof(typeData->weaponLoadout));
178
179 if (obj == 0) {
182 weapon = (short)(signed char)g_aShipWeapons[obj][0];
183 while (weapon-- > 0) {
184 if (((struct ShipLoadout *)g_aShipWeapons)[obj].slots[weapon].disabled == 0) {
186 ((struct ShipLoadout *)g_aShipWeapons)[obj].slots[weapon].weaponType].objectClass == 8) {
187 if (g_nSelectedGunType != -1 &&
188 ((struct ShipLoadout *)g_aShipWeapons)[obj].slots[weapon].type !=
190 g_nSelectedGunType = 0x80;
191 else
193 ((struct ShipLoadout *)g_aShipWeapons)[obj].slots[weapon].type;
194 } else {
196 }
197 }
198 }
199 }
200
201 if (HasShipCockpitGunDisplay(obj) != 0)
203 else
205 g_asShipWeaponEnergy[obj] = 100;
206 g_acShipLastAttacker[obj] = -1;
207}
208
209#pragma function(strcat, strcpy)
210/* Function start: 0x44B83C */
211/* Overlay object-type slot 4 with this campaign's altships.NNN record for
212 * the given resource type, keeping the name, animation and shapes that the
213 * type's own resource slot already carries. */
214void LoadAlternateShipType(short resourceType, short logicalFile)
215{
216 unsigned char *keptAnimation;
217 unsigned char *savedShape;
218 char nameCopy[20];
219 unsigned char *savedShapeSet;
220 short slot;
221 char filename[16];
222 char numberText[4];
223
224 slot = FindObjectResourceSlot(resourceType);
225 strcpy(nameCopy, g_aObjectTypeData[slot].displayName);
226 keptAnimation = g_aObjectTypeData[slot].animation;
227 savedShapeSet = g_aObjectTypeData[slot].shapeSet;
228 savedShape = g_aObjectTypeData[slot].shape;
229 strcpy(filename, "altships.");
230 if (g_nSelectedCampaignSlot < 100)
231 strcat(filename, "0");
233 strcat(filename, "0");
234 strcat(filename,
235 itoa(g_nSelectedCampaignSlot, numberText, 10));
236 LOAD_OBJECT_TYPE_RECORD(filename, logicalFile,
238 strcpy(g_aObjectTypeData[4].displayName, nameCopy);
239 g_aObjectTypeData[4].resourceType = resourceType;
240 g_aObjectTypeData[4].animation = keptAnimation;
241 g_aObjectTypeData[4].shapeSet = savedShapeSet;
242 g_aObjectTypeData[4].shape = savedShape;
243}
244
245#pragma intrinsic(strcat, strcpy)
246short find_ships_sphere(short missionShip);
247
248/* Function start: 0x44B981 */
249/* Re-derive the nav point of every mission ship an objective names, so the
250 * briefing map and the objective list agree on where each one is. */
252{
253 short source;
254 short missionShip;
255 short type;
256
257 for (source = 0; source < 8; source++) {
258 type = g_69_aMissionObjectiveSources[source].type;
259 if (type != -1) {
260 switch (type) {
261 case 1:
262 case 2:
263 case 3:
264 case 4:
265 case 6:
266 missionShip =
268 if (g_bBriefingMapActive != 0 || type == 6 ||
269 g_aMissionShips[missionShip].navPoint != -1)
270 g_aMissionShips[missionShip].navPoint =
271 (signed char)find_ships_sphere(missionShip);
272 break;
273 default:
274 break;
275 }
276 }
277 }
278}
279
280/* Function start: 0x44BA73 */
282{
283 short slot;
284 short objectKind;
285 short playerMissionShip;
286 short portraitIndex;
287
290 for (slot = 0; slot < 7; slot++)
295
298 g_aMissionShips[playerMissionShip].type;
299 objectKind = OBJECT_CLASS_SHIP;
301 g_aMissionShips[playerMissionShip].objectType,
302 objectKind, 0);
303 if (g_aMissionShips[playerMissionShip].field_13 != 0) {
306 g_aMissionShips[playerMissionShip].field_13);
308 } else {
310 }
311 g_aMissionShips[playerMissionShip].navPoint =
313 if (g_nMissionEntryNavOverride != -1) {
314 g_aMissionShips[playerMissionShip].navPoint =
315 (signed char)g_nMissionEntryNavOverride;
316 }
317 Set_up_ship_info(0, playerMissionShip, -1);
318
319 for (slot = 0; slot < 9; slot++)
322 g_nYourWingman = -1;
323 for (slot = 0; slot < 8; slot++) {
324 playerMissionShip =
326 if (playerMissionShip != -1) {
327 portraitIndex = g_aMissionShips[playerMissionShip].portrait;
328 if (portraitIndex == 25 ||
329 g_aMissionShips[playerMissionShip].pilot != 5 ||
330 is_alive(portraitIndex) != 0) {
331 if (find_ships_sphere(playerMissionShip) == -1) {
332 init_ship(playerMissionShip,
334 }
335 }
336 }
337 }
344}
345
346void FreePacketAndClear(void *slot, unsigned short releaseFlags);
347void ReportFatalErrorCode(const char *errorCode);
348void release_capital_ship_shapes(short resourceType);
349void free_ship(short slot);
350short FindObjectResourceSlot(short resourceType);
351void ReleasePacketHandle(void *);
352void add_hazard_field(short type, FixedVector center, short radius, short density);
353void flag_objective(short objective, unsigned char flags);
354void *FetchDiskPacketRetrying(char *fileName, short section, short flags);
355
356/* Function start: 0x44BCF7 */
358{
359 short obj;
360
361 for (obj = 0; obj < 10; obj++) {
362 if (g_aeObjectClass[obj] >=
367 g_asLoadedShipViewFrame[obj] = -1;
368 }
369 }
370}
371
372/* Function start: 0x44BD83 */
373void release_capital_ship_shapes(short resourceType)
374{
375 short slot;
376 short obj;
377
378 for (slot = 0; slot < 5; slot++) {
379 if (g_aObjectTypeData[slot].resourceType == resourceType)
380 break;
381 }
382 if (g_aObjectTypeData[slot].objectClass >=
385 g_aObjectTypeData[slot].objectClass ==
387 for (obj = 1; obj < 10; obj++) {
389 g_acObjectType[obj]].resourceType ==
390 resourceType) {
392 g_asLoadedShipViewFrame[obj] = -1;
393 }
394 }
395 }
396}
397
398/* Function start: 0x44BE84 */
399/* The original scans one slot past the five records; index five lands in the
400 * padding before the next global and never matches a live resource type. */
401short FindObjectResourceSlot(short resourceType)
402{
403 short slot;
404
405 for (slot = 0; slot <= 5; slot++) {
406 if (g_aObjectResourceSlots[slot].resourceType ==
407 resourceType)
408 return slot;
409 }
410 return -1;
411}
412
413#pragma function(strcat, strcpy, strlen)
414/* Function start: 0x44BEE5 */
415void load_ship(short resourceType, short objectType,
416 short objectClass, short slot)
417{
418 char fileName[20];
419 short section;
420 char resourceNumber[4];
421 short entry;
422 void **packetRefs;
423
424 if (resourceType != -1) {
425 if (g_aObjectResourceSlots[slot].shapeSet == 0) {
426 g_aObjectResourceSlots[slot].resourceType = resourceType;
427 if (objectClass == OBJECT_CLASS_MISSILE)
428 strcpy(fileName, "missile.v");
429 else
430 strcpy(fileName, "ship.v");
432 objectClass == OBJECT_CLASS_SHIP) {
433 objectClass = OBJECT_CLASS_CAPITAL_SHIP;
434 strcpy(fileName, "xship.v");
435 }
436 itoa((int)resourceType, resourceNumber, 10);
437 if (strlen(resourceNumber) == 1)
438 strcat(fileName, "0");
439 strcat(fileName, resourceNumber);
440 g_aObjectResourceSlots[slot].objectType = objectType;
441 g_aObjectResourceSlots[slot].objectClass = objectClass;
442
443 if (objectType == 0x3d) {
445 FetchDiskPacketRetrying("objects.vga", 0x13, 0);
448 for (entry = 1; entry < 10; entry++) {
449 if (g_asObjectType[entry] == 0x3d) {
450 g_apObjectShape[entry] =
452 g_acObjectType[entry]].shapeSet;
453 }
454 }
455 } else if (objectType == 0x2c) {
456 if (g_aObjectTypeData[44].shapeSet == 0) {
458 FetchDiskPacketRetrying("pilotanm.vga", 2, 0);
461 }
462 for (entry = 1; entry < 70; entry++) {
463 if (g_asObjectType[entry] == 0x2c) {
464 g_apObjectShape[entry] =
466 g_acObjectType[entry]].shapeSet;
467 }
468 }
469 } else if (objectType == 5) {
471 FetchDiskPacketRetrying("objects.vga", 0x10, 0);
478 if (g_98_nMemConfiguration == 2) {
480 FetchDiskPacketRetrying("objects.vga", 0x11, 4);
485 }
486 for (entry = 10; entry <= SPACE_LAST_MOVING_OBJECT;
487 entry++) {
488 if (g_aeObjectClass[entry] ==
490 g_apObjectShape[entry] =
492 g_acObjectType[entry]].shapeSet;
493 }
494 }
495 } else if (objectType == 6) {
496 if (g_aObjectTypeData[21].shapeSet == 0) {
498 FetchDiskPacketRetrying("objects.vga", 0x0f, 0);
501 }
502 for (entry = 10; entry <= SPACE_LAST_MOVING_OBJECT;
503 entry++) {
504 if (g_asObjectType[entry] == 0x15)
505 g_apObjectShape[entry] =
507 }
508 } else if ((objectClass == OBJECT_CLASS_SHIP &&
509 objectType != 0x33) ||
510 objectClass == OBJECT_CLASS_MISSILE) {
511 if (objectClass != OBJECT_CLASS_MISSILE &&
514 fileName, 3,
515 &g_aObjectTypeData[slot]);
516 }
518 FetchDiskPacketRetrying(fileName, 0, 0);
522 FetchDiskPacketRetrying(fileName, 2, 0);
526 FetchDiskPacketRetrying(fileName, 1, 0);
529 if (objectClass == OBJECT_CLASS_SHIP &&
533 FetchDiskPacketRetrying(fileName, 4, 4);
536 }
537 for (entry = 0; entry < 10; entry++) {
538 if (g_aeObjectClass[entry] >=
541 g_acObjectType[entry]].resourceType ==
542 resourceType) {
545 g_apObjectShape[entry] =
547 }
548 }
549 if (objectClass == OBJECT_CLASS_MISSILE) {
550 g_aObjectTypeData[objectType].shapeSet =
552 g_aObjectTypeData[objectType].animation =
554 g_aObjectTypeData[objectType].shape =
556 }
557 } else {
561 (void **)calloc(0x25, HOST_POINTER_SIZE);
562 packetRefs =
564 if (packetRefs == 0)
566 for (section = 0; section < 0x25; section++) {
567 packetRefs[section] =
568 FetchDiskPacketRetrying(fileName, section, 4);
569 if (packetRefs[section] == 0)
570 break;
571 }
573 FetchDiskPacketRetrying(fileName, 0x27, 4);
574 }
576 fileName, 0x26,
577 &g_aObjectTypeData[slot]);
578 g_aObjectTypeData[slot].shapeSet = 0;
580 FetchDiskPacketRetrying(fileName, 0x25, 0);
584 FetchDiskPacketRetrying(fileName, 0x28, 0);
587 for (entry = 0; entry < 10; entry++) {
589 g_acObjectType[entry]].resourceType ==
590 resourceType) {
594 &g_apObjectShape[entry], 0);
595 g_asLoadedShipViewFrame[entry] = -1;
596 }
597 }
598 }
599 }
600 }
601}
602
603/* Function start: 0x44C796 */
604void free_ship(short slot)
605{
606 short section;
607 short resourceType;
608 short obj;
609 void **refCount;
610
611 resourceType = g_aObjectResourceSlots[slot].resourceType;
612 if (g_aObjectResourceSlots[slot].objectClass >=
614 g_aObjectResourceSlots[slot].objectType == 0x33 ||
616 g_aObjectResourceSlots[slot].objectClass ==
619 release_capital_ship_shapes(resourceType);
622 g_apPacketReferenceGroups[slot] != 0) {
623 refCount = g_apPacketReferenceGroups[slot];
624 for (section = 0; section < 0x25; section++) {
625 FreePacketAndClear(&refCount[section], 8);
626 }
627 ReleasePacketHandle(refCount);
629 }
631 &g_aObjectResourceSlots[slot].shape, 8);
632 g_aObjectTypeData[slot].shape = 0;
634 &g_aObjectResourceSlots[slot].animation, 8);
635 if (g_1_nResourcePaletteState == 0) {
637 &g_aObjectResourceSlots[slot].field_12, 8);
638 }
639 }
640 if (g_aObjectResourceSlots[slot].shapeSet == 0)
641 return;
643 &g_aObjectResourceSlots[slot].shapeSet, 8);
644 if (g_aObjectResourceSlots[slot].objectType == 0x3d) {
645 for (obj = 1; obj < 10; obj++) {
646 if (g_asObjectType[obj] == 0x3d)
647 g_apObjectShape[obj] = 0;
648 }
649 return;
650 }
651 if (g_aObjectResourceSlots[slot].objectType == 0x2c) {
652 for (obj = 1; obj < SPACE_OBJECT_COUNT; obj++) {
653 if (g_asObjectType[obj] == 0x2c)
654 g_apObjectShape[obj] = 0;
655 }
656 return;
657 }
658 if (g_aObjectResourceSlots[slot].objectType == 5) {
660 &g_aObjectTypeData[28].shapeSet, 8);
662 &g_aObjectTypeData[23].shapeSet, 8);
670 for (obj = 10; obj <= SPACE_LAST_MOVING_OBJECT; obj++) {
671 if (g_asObjectType[obj] == 0x1c)
672 remove_object(obj);
673 else if (g_aeObjectClass[obj] ==
675 g_apObjectShape[obj] = 0;
676 }
677 return;
678 }
679 if (g_aObjectResourceSlots[slot].objectType == 6) {
681 &g_aObjectTypeData[21].shapeSet, 8);
682 return;
683 }
684 g_aObjectTypeData[slot].shapeSet = 0;
686 &g_aObjectResourceSlots[slot].animation, 8);
689 &g_aObjectResourceSlots[slot].shape, 8);
690 g_aObjectTypeData[slot].shape = 0;
691 if (g_1_nResourcePaletteState == 0) {
693 &g_aObjectResourceSlots[slot].field_12, 8);
694 }
695 for (obj = 0; obj < 10; obj++) {
697 g_acObjectType[obj] == slot)
698 g_apObjectShape[obj] = 0;
699 }
700}
701
702/* Function start: 0x44CC84 */
704{
705 short slot;
706
708 for (slot = 0; slot < 4; slot++) {
709 if (g_aObjectResourceSlots[slot].resourceType != -1)
710 free_ship(slot);
711 }
712}
713
714/* Function start: 0x44CCE1 */
716{
717 short slot;
718 short type;
719 short object;
720
724 for (slot = 0; slot < 4; slot++) {
726 if (type != -1) {
727 load_ship(type,
728 g_aObjectResourceSlots[slot].objectType,
729 g_aObjectResourceSlots[slot].objectClass,
730 slot);
731 }
732 }
733 for (object = 0; object < 10; object++) {
734 g_apObjectExhaustShape[object] =
736 g_acObjectType[object]].animation;
737 }
739}
740
741/* Function start: 0x44CDCF */
743{
744 short i;
745
746 for (i = 0; i < 10; i++)
747 remove_object(i);
748}
749
750/* Function start: 0x44CE0A */
751short get_shape_slot(void)
752{
753 short slot;
754
755 for (slot = 0; slot < 5; slot++) {
756 if (g_aObjectResourceSlots[slot].resourceType == -1)
757 return slot;
758 }
759 return -1;
760}
761
762/* Function start: 0x44CE68 */
763short shape_loaded(short resourceType)
764{
765 short slot;
766
767 for (slot = 0; slot < 5; slot++) {
768 if (g_aObjectResourceSlots[slot].resourceType == resourceType)
769 return 1;
770 }
771 return 0;
772}
773
774/* Function start: 0x44CEC8 */
775short shape_needed(const MissionNavPoint *navPoint, short resourceType)
776{
777 short preload;
778
779 if (resourceType != -1) {
780 for (preload = 0; preload < 3; preload++) {
781 if (navPoint->preloadObjectTypes[preload] == resourceType)
782 return 1;
783 }
784 }
785 return 0;
786}
787
788/* Function start: 0x44CF2D */
790{
791 short objectClass;
792 short slot;
793 short preload;
794 short type;
795
798 for (slot = 1; slot < 4; slot++) {
799 if (g_aObjectResourceSlots[slot].resourceType != -1 &&
800 !shape_needed(navPoint,
801 g_aObjectResourceSlots[slot].resourceType)) {
802 free_ship(slot);
804 }
805 }
806
807 for (preload = 0; preload < 3; preload++) {
808 type = navPoint->preloadObjectTypes[preload];
809 if (type != -1) {
810 if (navPoint->preloadLogicalFiles[preload] == 0x3d ||
811 navPoint->preloadLogicalFiles[preload] == 0x2c) {
812 slot = get_shape_slot();
813 load_ship(0,
814 navPoint->preloadLogicalFiles[preload], 0,
815 slot);
816 } else if (!shape_loaded(type)) {
817 slot = get_shape_slot();
818 if (slot != -1) {
819 objectClass = navPoint->preloadObjectClasses[preload];
820 load_ship(type,
821 navPoint->preloadLogicalFiles[preload],
822 objectClass,
823 slot);
824 }
825 }
826 }
827 }
829}
830
831/* Function start: 0x44D0C7 */
833{
834 short offset;
835 char fileName[16];
836 char digits[4];
837 short pilotIndex;
838 short number;
839 short ejectTarget;
840
841 offset = 0;
842 while (offset < 8) {
843 switch ((unsigned char)navPoint->waveCommands[offset]) {
844 case 0:
845 pilotIndex =
846 (unsigned char)navPoint->waveCommands[offset + 1];
847 number =
848 (unsigned char)navPoint->waveCommands[offset + 2];
849 strcpy(fileName, "altint.");
850 if (number < 100)
851 strcat(fileName, "0");
852 if (number < 10)
853 strcat(fileName, "0");
854 strcat(fileName, itoa((int)number, digits, 10));
856 fileName, 0,
858 g_asShipIntelSlot[pilotIndex]],
859 0);
860 break;
861 case 1:
862 ejectTarget =
863 (unsigned char)navPoint->waveCommands[offset + 1];
868 switch ((unsigned char)
869 navPoint->waveCommands[offset + 2]) {
870 case 0:
873 (signed char)ejectTarget;
875 break;
876 case 1:
878 (signed char)ejectTarget;
879 break;
880 case 2:
882 (signed char)ejectTarget;
884 break;
885 case 3:
887 (signed char)ejectTarget;
889 break;
890 case 4:
892 (unsigned char)navPoint->waveCommands[offset + 1],
893 1);
894 if (g_nArcadeState != 0)
895 return;
896 break;
897 case 5:
899 (signed char)ejectTarget;
902 break;
903 }
904 navPoint->waveCommands[offset] = -1;
905 break;
906 case 2:
908 navPoint->waveCommands[offset + 1];
910 navPoint->waveCommands[offset + 2];
911 break;
912 case 0xff:
913 break;
914 }
915 offset = (short)(offset + 3);
916 }
917}
918
919#pragma intrinsic(strcat, strcpy)
920void new_sphere_shapes(MissionNavPoint *navPoint);
921
922/* Function start: 0x44D35D */
923void set_up_action_sphere(short navPoint)
924{
925 short leftover;
926 short slot;
927 short spawn;
928 short stale;
929 short trigger;
930 MissionNavPoint *point;
931
933 g_nCurrentNavPoint = navPoint;
934 point = &g_aMissionNavPoints[navPoint];
937 if (g_aMissionNavPoints[navPoint + 1].type == 2)
938 g_nCurrentWave = 2;
939 else
940 g_nCurrentWave = -1;
941 g_nEnemySighting = 0x7fff;
942
943 for (stale = 0; stale < 10; stale++) {
945 remove_object(stale);
946 } else if (g_asObjectType[stale] ==
948 remove_object(stale);
950 OBJECT_DATA_EJECTED_PILOT].shapeSet != 0) {
953 OBJECT_DATA_EJECTED_PILOT].shapeSet, 0);
954 }
955 }
956 }
957
958 for (leftover = 1; leftover < 10; leftover++) {
959 if (g_aeObjectClass[leftover] != OBJECT_CLASS_NULL &&
960 g_acShipNavPoint[leftover] != -1) {
961 if (g_aeObjectClass[leftover] >= OBJECT_CLASS_SHIP &&
964 g_asShipMissionIndex[leftover]].state = 3;
965 }
969 FreePacketAndClear(&g_apObjectShape[leftover], 0);
970 if (g_asObjectScreenX[leftover] != -32767 &&
972 explode(-1, leftover);
973 else
974 remove_object(leftover);
975 }
976 }
979 new_sphere_shapes(point);
980
981 for (slot = 0; slot < 10; slot++) {
982 spawn = point->missionShips[slot];
983 if (spawn != -1)
984 init_ship(spawn, navPoint);
985 }
986
987 for (slot = 0; slot < 8; slot += 2) {
988 if (((signed char *)point->triggers)[slot] != -1) {
989 trigger = ((signed char *)point->triggers)[slot + 1];
990 g_aMissionNavPoints[trigger].type =
991 ((signed char *)point->triggers)[slot];
992 }
993 }
994
996 g_cCurrentObjective].type == 0 &&
999 g_cCurrentObjective].index].type == 0)
1001
1002 for (slot = 0; slot < g_cMissionObjectiveCount; slot++)
1007 if (g_bAutopilotSequenceActive == 0 &&
1010}
1011
1012void ComputeVectorDelta(FixedVector *from, FixedVector *to, FixedVector *delta);
1013void random_radial(const FixedVector *center, short radius, FixedVector *position);
1014void place_ship_near_player_until_valid(short obj, short minimum,
1015 short maximum);
1016void Set_up_ship_info(short obj, short missionShip, signed char navPoint);
1017void remove_object(short obj);
1018
1019/* Function start: 0x44D72E */
1020short room_for_me(short obj, short minimum)
1021{
1022 short other;
1023 short distance;
1024
1025 if (distance_from_object(obj, 0) < minimum)
1026 return 0;
1027 for (other = 0; other < SPACE_OBJECT_COUNT; other++) {
1028 if (other != obj && g_aeObjectClass[other] >= 8) {
1030 &g_aShipPosition[other],
1032 distance = (short)((g_asObjectCollisionRadius[other] +
1033 g_asObjectCollisionRadius[obj]) * 2);
1035 distance) != 0)
1036 return 0;
1037 }
1038 }
1039 return 1;
1040}
1041
1042/* Function start: 0x44D81F */
1043void place_ship_near_player_until_valid(short obj, short minimum, short maximum)
1044{
1045 if (obj == -1 || obj == 0)
1046 return;
1047 while (room_for_me(obj, minimum) == 0) {
1048 random_radial(&g_aShipPosition[0], maximum,
1049 &g_aShipPosition[obj]);
1050 }
1051}
1052
1053/* Function start: 0x44D888 */
1055{
1056 MissionNavPoint *waveRecord;
1057 short prevWave;
1058 short obj;
1059 short entry;
1060
1061 if (g_nCurrentWave == -1 ||
1062 g_nTrainSimActive != 0)
1063 return 0;
1064
1065 waveRecord = &g_aMissionNavPoints[
1067 prevWave = g_nCurrentWave;
1069 if (waveRecord->type == prevWave) {
1071 for (obj = 10; obj < SPACE_OBJECT_COUNT; obj++) {
1073 remove_object(obj);
1074 }
1075 }
1076 ProcessMissionWaveCommands(waveRecord);
1077 new_sphere_shapes(waveRecord);
1078 waveRecord->type = -1;
1079 for (entry = 0; entry < 10; entry++) {
1081 init_ship(waveRecord->missionShips[entry],
1083 5000, 10000);
1084 }
1085 } else {
1086 g_nCurrentWave = -1;
1087 return 0;
1088 }
1089 return 1;
1090}
1091
1092/* Function start: 0x44D9E2 */
1094 const ShortVector *right,
1095 ShortVector *difference)
1096{
1097 difference->x = left->x - right->x;
1098 difference->y = left->y - right->y;
1099 difference->z = left->z - right->z;
1100}
1101
1102short find_ship_index(short missionShip);
1103
1104/* Function start: 0x44DA2F */
1105void set_formation_position(short obj, const MissionShipRecord *record)
1106{
1107 const MissionShipRecord *leader;
1108 short source;
1109
1110 if (record->formationIndex != -1) {
1111 leader = record;
1112 source = obj;
1113 while (leader->leaderMissionIndex != -1) {
1114 source = find_ship_index(leader->leaderMissionIndex);
1115 leader = &g_aMissionShips[leader->leaderMissionIndex];
1116 }
1119 [record->formationSpot],
1121 [leader->formationSpot],
1123 if (source == 0 &&
1125 return;
1126 copy_frame(source, obj);
1127 set_sphere_point(leader, &g_aShipPosition[obj]);
1129 &g_aShipPosition[obj]);
1130 g_anShipSpeed[obj] = leader->speed << 8;
1131 }
1132}
1133
1134/* Function start: 0x44DB7E */
1135void Set_up_ship_info(short obj, short missionShip, signed char navPoint)
1136{
1137 MissionShipRecord *record;
1138 short gun;
1139
1143 g_acShipPendingMessage[obj] = -1;
1147 g_asObjectDamage[obj] =
1149 g_acShipDamage[obj] =
1150 g_asActionCount[obj] =
1151 g_acShipExhaustHeat[obj] = 0;
1152 g_asShipMissionIndex[obj] = missionShip;
1153 g_acShipNavPoint[obj] = navPoint;
1154 record = &g_aMissionShips[missionShip];
1155 g_acShipPortrait[obj] = record->portrait;
1156
1157 set_sphere_point(record, &g_aShipPosition[obj]);
1158 alter_yaw((short)-record->pitch, obj);
1159 alter_pitch((short)-record->yaw, obj);
1160 alter_roll(record->roll, obj);
1161 g_asShipSide[obj] = record->side;
1162 g_anShipSpeed[obj] = record->speed << 8;
1163 g_asPilotLevel[obj] = record->pilot;
1164 for (gun = 0; gun < 3; gun++)
1165 g_27_aasGunCooldown[obj][gun] = 0;
1168 g_asWingmanDamageCredit[obj] = 0;
1170 g_2_asFlakCooldownTable[obj] = (short)(
1171 (unsigned short)RandomInRange(0, 200) + 600);
1172 if (g_asShipSide[obj] == SIDE_KILRATHI)
1173 g_2_asFlakCooldownTable[obj] >>= 1;
1174 g_asSpikeriCooldown[obj] = (short)(
1175 (unsigned short)RandomInRange(0, 400) + 600);
1180 g_acObjectType[obj]].damageCapacity +
1181 g_aasShipArmor[obj][0] < 400) {
1185 } else {
1186 g_asCapitalHitDamageStepTable[obj] = (short)(
1188 g_acObjectType[obj]].damageCapacity / 2 + 1);
1189 }
1190 if (ShipHasCloakingDevice(obj) != 0) {
1191 g_anShipCloakState[obj] = 0;
1192 g_aShipWeapons[obj][0]--;
1193 } else {
1194 g_anShipCloakState[obj] = 2;
1195 }
1196 g_asShipCloakCooldown[obj] = 0;
1197 reset_mission_type(obj, record->missionType);
1199 g_asShipWingLeader[obj] =
1201 set_formation_position(obj, record);
1204 if (record->name[0] == '?')
1205 g_asShipIdentified[obj] = 0;
1206 else
1207 g_asShipIdentified[obj] = 1;
1208 g_apShipMissionRecord[obj] = record;
1212 if (g_asObjectType[obj] >= 0x39)
1213 g_2_asCarrierLaunchTimer[obj] = 0;
1214}
1215
1216/* Function start: 0x44E028 */
1217short is_team_member(short missionShip)
1218{
1219 short index;
1220
1222 return 1;
1223 for (index = 0; index < 8; index++) {
1224 if (g_13_stMissionHeaderBlock.initialMissionShips[index] == missionShip)
1225 return 1;
1226 }
1227 return 0;
1228}
1229
1230/* Function start: 0x44E09C */
1232{
1233 short other;
1234
1235 g_acTurnInterval[obj] = (signed char)
1237 g_acTurnRegulator[obj] = 1;
1238 for (other = 1; other <= 9; other++) {
1239 if (g_aeObjectClass[other] == OBJECT_CLASS_SHIP &&
1240 other != obj &&
1241 g_acTurnRegulator[obj] ==
1242 g_acTurnRegulator[other] &&
1243 g_acTurnInterval[other] ==
1244 g_acTurnInterval[obj]) {
1245 g_acTurnRegulator[obj]++;
1246 other = 1;
1247 if (g_acTurnInterval[obj] <
1248 g_acTurnRegulator[obj])
1249 return;
1250 }
1251 }
1252}
1253
1254/* Function start: 0x44E187 */
1255short init_ship(short missionShip, short navPoint)
1256{
1257 MissionShipRecord *record;
1258 FixedVector hazardCenter;
1259 short shipType;
1260 short objectType;
1261 short obj;
1262
1263 if (missionShip == -1)
1264 return -1;
1265 record = &g_aMissionShips[missionShip];
1266 shipType = record->type;
1267 objectType = record->objectType;
1268
1269 if (objectType == 0x3d || objectType == 0x2c) {
1270 obj = initialize_ship(objectType, -1, 0);
1271 g_asShipMissionIndex[obj] = missionShip;
1272 AddFixedVectors(&g_aMissionNavPoints[navPoint].position,
1273 &record->position,
1274 &g_aShipPosition[obj]);
1275 g_asShipSide[obj] = 0;
1276 } else if (objectType == 5 || objectType == 6) {
1277 AddFixedVectors(&g_aMissionNavPoints[navPoint].position,
1278 &record->position, &hazardCenter);
1279 add_hazard_field(objectType, hazardCenter,
1280 (short)(record->speed + 3000),
1281 record->pilot);
1282 } else {
1283 if (find_ship_index(missionShip) != -1 || record->state != 0)
1284 return -1;
1285 if (is_alive((signed char)record->pilot) == 0) {
1286 if (record->pilot == 5 && record->side == 0)
1287 return -1;
1288 else
1289 record->pilot = 3;
1290 }
1291 record->navPoint = (signed char)navPoint;
1292 if (is_team_member(missionShip) != 0)
1293 navPoint = -1;
1294 if (record->field_13 != 0)
1295 LoadAlternateShipType(record->type, record->field_13);
1296 obj = initialize_ship(shipType, -1, 1);
1297 if (obj != -1) {
1298 if (g_nYourWingman == -1 && record->pilot > 4 &&
1299 record->side == 0)
1300 g_nYourWingman = obj;
1301 Set_up_ship_info(obj, missionShip, (signed char)navPoint);
1302 if (record->field_13 != 0)
1305 check_futurion(obj);
1306 }
1307 }
1308 return obj;
1309}
1310
1311#pragma function(strcat, strcpy)
1312void clear_alert(short obj);
1313void LoadCommPortraitResources(short portrait);
1314
1315/* Function start: 0x44E44F */
1317{
1318 char filename[16];
1319 short usedSlots[5];
1320 short matched;
1321 short navEntry;
1323 short shipIntelFile;
1324 short intelNum;
1325 char intelDigits[8];
1326 short member;
1327 short index;
1328
1329 meta = AllocateTaggedMemory(0x0c, 0x40);
1330 g_abShipTurn[obj] = 0;
1331 clear_alert(obj);
1333 g_asShipIntelState[obj] = 0;
1334 index = g_asShipMissionParameter[obj];
1337
1338 switch (g_asShipMissionType[obj]) {
1339 case 0:
1340 break;
1344 g_asShipMissionParameter[obj] = index;
1345 break;
1347 g_asShipMissionParameter[obj] = index;
1348 for (navEntry = 0; navEntry < 10; navEntry++) {
1349 for (member = 0; member < 10;
1350 member++) {
1351 if (g_aMissionNavPoints[navEntry]
1352 .missionShips[member] ==
1354 index = navEntry;
1355 }
1356 }
1357 }
1358 g_aShipMissionSpot[obj] =
1360 break;
1362 g_aShipMissionSpot[obj] =
1364 break;
1368 if (g_asShipSide[obj] == SIDE_KILRATHI)
1369 break;
1370 /* fall through */
1371 case 9: /* WC2's home-base mission value in this dispatch table. */
1373 &g_aShipMissionSpot[obj]);
1374 break;
1375 }
1376
1377 g_acShipStress[obj] = 0;
1378 g_asShipIntelSlot[obj] = -1;
1379 if (obj != 0 && g_aeObjectClass[obj] == OBJECT_CLASS_SHIP &&
1380 (obj == g_nYourWingman ||
1381 g_asShipSide[obj] != SIDE_IMPERIAL)) {
1382 shipIntelFile = 0;
1383 if (g_asPilotLevel[obj] == RATING_ACE_SPIRIT) {
1384 intelNum = g_acShipPortrait[obj];
1385 } else if (g_asPilotLevel[obj] < RATING_ACE_SPIRIT) {
1386 intelNum = g_aObjectTypeData[
1388 shipIntelFile = 1;
1389 } else {
1390 ReportFatalErrorCode("024");
1391 }
1392
1393 for (index = 0; index < 5; index++)
1394 usedSlots[index] = 0;
1395
1396 matched = 0;
1397 for (index = 0; index < 10; index++) {
1398 if (g_asShipIntelSlot[index] != -1) {
1399 usedSlots[
1400 g_asShipIntelSlot[index]] = 1;
1401 }
1402 if (g_asShipIntelResourceKey[index] ==
1403 shipIntelFile * 100 + intelNum) {
1404 matched = 1;
1405 g_asShipIntelSlot[obj] =
1406 g_asShipIntelSlot[index];
1408 (short)(shipIntelFile * 100 + intelNum);
1409 break;
1410 }
1411 }
1412 if (matched == 0) {
1413 for (index = 0; index < 5; index++) {
1414 if (usedSlots[index] == 0)
1415 break;
1416 }
1417 g_asShipIntelSlot[obj] = index;
1419 (short)(shipIntelFile * 100 + intelNum);
1420
1421 strcpy(filename, "intel.0");
1422 if (shipIntelFile != 0)
1423 strcpy(filename, "intelshp.0");
1424 if (intelNum < 10)
1425 strcat(filename, "0");
1426 itoa((int)intelNum, intelDigits, 10);
1427 strcat(filename, intelDigits);
1428
1430 filename, 0,
1432 g_asShipIntelSlot[obj]],
1433 0);
1434 if (obj == g_nYourWingman) {
1436 filename, 1,
1440 if (g_pCommPortraitResource != 0) {
1442 g_acShipPortrait[obj];
1443 }
1444 } else if (shipIntelFile == 0) {
1445 LoadPacketIntoBuffer(filename, 1, meta, 1);
1446 if (meta->musicTrack != 0) {
1448 meta->musicTrack;
1449 }
1450 if (meta->enemyCommCommandBase != 0) {
1454 g_acShipPortrait[obj];
1455 }
1456 }
1457 }
1458 }
1459}
1460
1461/* Linker commons defined here. LINK lays a unit's commons out by the
1462 * identifiers' hash keys, so these spellings follow the original addresses. */
1463short g_1_nEnemyCommCommandBase; /* 0x005d179c */
1464short g_nEnemyCommPilotIndex; /* 0x005d179e */
1465short g_asCapitalHitDamageStepTable[10]; /* 0x005d17a0 */
void clear_alert(short obj)
Definition logic.c:37
void set_formation_position(short obj, const MissionShipRecord *record)
Definition mission.c:1105
short find_ships_sphere(short missionShip)
Definition logic.c:816
void ComputeVectorDelta(FixedVector *from, FixedVector *to, FixedVector *delta)
Definition geom.c:229
void load_ship(short resourceType, short objectType, short objectClass, short slot)
Definition mission.c:415
void Build_objective_list(void)
Definition nav.c:193
void Set_up_ship_info(short obj, short missionShip, signed char navPoint)
Definition mission.c:1135
short IsVectorWithinRange(FixedVector *vector, short range)
Definition eventmgr.c:2023
void init_mission(short series, short mission)
Definition mission.c:87
short HasShipCockpitGunDisplay(short ship)
Definition ship.c:106
void LoadMissionData(short series, short mission)
Definition loadmisn.c:10
void initialize_view_buffer(void)
Definition main.c:217
short explode(short attacker, short victim)
Definition ship.c:1915
void LoadCommPortraitResources(short portrait)
Definition comm.c:25
void InitializeCockpitResources(short shipType)
Definition fltsetup.c:507
short LocateMobileObjective(short objective)
Definition cockpt.c:1345
void free_ship(short slot)
Definition mission.c:604
void remove_object(short obj)
Definition geom.c:858
void alter_pitch(short angle, short obj)
Definition geom.c:504
short is_alive(signed char pilot)
Definition mission.c:61
short shape_needed(const MissionNavPoint *navPoint, short resourceType)
Definition mission.c:775
void ejection_sequence(short outcome, signed char restoreCockpit)
Definition midscene.c:63
short get_shape_slot(void)
Definition mission.c:751
void add_hazard_field(short type, FixedVector center, short radius, short density)
Definition fields.c:411
short is_team_member(short missionShip)
Definition mission.c:1217
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:211
void ProcessMissionWaveCommands(MissionNavPoint *navPoint)
Definition mission.c:832
void alter_roll(short angle, short obj)
Definition geom.c:520
short ShipHasCloakingDevice(short ship)
Definition ship.c:72
void ReportFatalErrorCode(const char *errorCode)
Definition message.c:29
void init_ijk(short obj)
Definition geom.c:453
void set_up_action_sphere(short navPoint)
Definition mission.c:923
unsigned int offset_location(short obj, const ShortVector *offset, FixedVector *location)
Definition smart.c:230
void LoadAlternateShipType(short resourceType, short logicalFile)
Definition mission.c:214
int LoadPacketResourceList(PacketResourceDescriptor *resources, short flags, int availableBytes, char *defaultFileName)
Definition fltsetup.c:51
void release_all_capital_ship_shapes(void)
Definition mission.c:357
void init_3Space_objects(short scene)
Definition fltsetup.c:810
short distance_from_object(short obj, short other)
Definition geom.c:547
void copy_frame(short source, short destination)
Definition geom.c:470
void place_ship_near_player_until_valid(short obj, short minimum, short maximum)
Definition mission.c:1043
void load_all_slots(void)
Definition mission.c:715
void * AllocateTaggedMemory(unsigned int size, short flags)
Definition memapi.c:92
void ApplyAlternateShipType(short obj)
Definition mission.c:138
void * FetchDiskPacketRetrying(char *fileName, short section, short flags)
Definition disk.c:187
void alter_yaw(short angle, short obj)
Definition geom.c:512
void remove_nav_point_objects(void)
Definition mission.c:742
void find_next_ship_turn_slot(short obj)
Definition mission.c:1231
void check_futurion(short i)
Definition mission.c:68
void InitializeShipWeaponTypeIndices(short obj)
Definition ship.c:328
void init_intelligence_data(short obj)
Definition mission.c:1316
void release_capital_ship_shapes(short resourceType)
Definition mission.c:373
void zero_vector(FixedVector *vector)
Definition geom.c:197
void ResetWeaponDisplayPositions(void)
Definition mission.c:77
short locate_ship(short missionShip, FixedVector *point)
Definition logic.c:848
short init_ship(short missionShip, short navPoint)
Definition mission.c:1255
void prepare_mission(void)
Definition mission.c:281
short shape_loaded(short resourceType)
Definition mission.c:763
void * LoadPacketIntoBuffer(char *fileName, short section, void *destination, int registerHandle)
Definition disk.c:141
void sub_int_vector(const ShortVector *left, const ShortVector *right, ShortVector *difference)
Definition mission.c:1093
void flag_objective(short objective, unsigned char flags)
Definition cockpt.c:1153
void ReleasePacketHandle(void *handle)
Definition memapi.c:108
short room_for_me(short obj, short minimum)
Definition mission.c:1020
void RefreshObjectiveShipNavPoints(void)
Definition mission.c:251
void recalc_max_velocity(short ship)
Definition geom.c:28
void random_radial(const FixedVector *center, short radius, FixedVector *position)
Definition geom.c:278
short initialize_ship(short type, short owner, short matchLoadedType)
Definition ship.c:251
void free_all_slots(void)
Definition mission.c:703
void reset_mission_type(short obj, short missionType)
Definition logic.c:426
void new_sphere_shapes(MissionNavPoint *navPoint)
Definition mission.c:789
void clean_up_cockpit(void)
Definition jump.c:121
short set_up_next_wave(void)
Definition mission.c:1054
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
void set_objects_data(short obj, short type, short owner, short matchObjectClass)
Definition ship.c:347
short find_ship_index(short missionShip)
Definition logic.c:251
void set_sphere_point(const MissionShipRecord *record, FixedVector *position)
Definition mission.c:52
short FindObjectResourceSlot(short resourceType)
Definition mission.c:401
void remove_all_hazards(void)
Definition fields.c:83
void ResetCannedSceneRecording(void)
Definition taperec.c:20
Shared Win32 declarations, types and library interfaces.
#define HOST_POINTER_SIZE
Definition game.h:103
#define LOAD_OBJECT_TYPE_RECORD(fileName, section, record)
Definition game.h:73
@ RATING_ACE_SPIRIT
Definition game_data.h:189
#define SPACE_LAST_MOVING_OBJECT
Definition game_data.h:1579
@ MISSION_TYPE_ESCORT
Definition game_data.h:123
@ MISSION_TYPE_WARP_ARRIVE
Definition game_data.h:129
@ MISSION_TYPE_GOTO_WARP
Definition game_data.h:128
@ MISSION_TYPE_WINGMAN
Definition game_data.h:126
@ MISSION_TYPE_ROUT
Definition game_data.h:127
@ MISSION_TYPE_DEFEND
Definition game_data.h:125
@ MISSION_TYPE_STRIKE
Definition game_data.h:124
@ OBJECT_TYPE_TORPEDO
Definition game_data.h:87
@ SIDE_IMPERIAL
Definition game_data.h:175
@ SIDE_KILRATHI
Definition game_data.h:176
#define SPACE_OBJECT_COUNT
Definition game_data.h:1578
#define OBJECT_DATA_SHIP_WING
Definition game_data.h:1626
#define OBJECT_DATA_EJECTED_PILOT
Definition game_data.h:1634
@ SPECIAL_MANEUVER_NONE
Definition game_data.h:259
@ MANEUVER_WARPING_IN
Definition game_data.h:209
@ OBJECT_CLASS_MISSILE
Definition game_data.h:48
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
@ OBJECT_CLASS_CAPITAL_SHIP
Definition game_data.h:50
@ OBJECT_CLASS_FUTURION
Definition game_data.h:38
@ OBJECT_CLASS_ASTEROID
Definition game_data.h:46
@ OBJECT_CLASS_NULL
Definition game_data.h:37
@ TACTIC_WARP_IN
Definition game_data.h:160
short g_asObjectScreenAngle[SPACE_OBJECT_COUNT]
Definition viewrect.c:97
MissionShipRecord * g_apShipMissionRecord[10]
Definition viewrect.c:161
short g_asShipCloakCooldown[10]
Definition viewrect.c:180
signed char g_acShipNavPoint[12]
Definition viewrect.c:127
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_bCockpitDamageFrame2Shown
Definition cockpt.c:106
short g_aasShipMaximumShield[10][2]
Definition viewrect.c:133
short g_2_asCarrierLaunchTimer[10]
Definition carrier.c:110
short g_bMissionShipInitializationInProgress
Definition mission.c:8
ShortVector g_aShipFormationOffset[10]
Definition viewrect.c:129
short g_bCockpitDamageFrame0Shown
Definition cockpt.c:105
short g_asShipMissionParameter[12]
Definition viewrect.c:164
short g_nCurrentWave
Definition viewrect.c:54
unsigned char * g_apObjectShape[SPACE_OBJECT_COUNT]
Definition viewrect.c:100
short g_asShipFriendlyFireCooldown[10]
Definition viewrect.c:183
short g_nCurStellarSystem
Definition nav.c:1238
short g_bBriefingMapActive
Definition nav.c:62
signed char g_acPlayerComponentDamage[9]
Definition viewrect.c:76
short g_nEnemyTauntCommandBase
Definition comm.c:9
short g_nYourWingman
Definition viewrect.c:75
short g_asCapitalHitDamageStepTable[10]
Definition mission.c:1465
short g_78_bHighMemoryBuffersSetState
Definition cockpt.c:3839
short g_asPilotLevel[12]
Definition viewrect.c:157
short g_bFuelGaugeDamaged
Definition cockpt.c:46
unsigned char g_aShipIntelligenceData[5][0x51]
Definition smart.c:796
signed char g_acShipIonDriveDamage[16]
Definition viewrect.c:149
short g_nPendingEjectionSequenceCount
Definition mission.c:14
signed char g_acShipCommunicator[16]
Definition viewrect.c:147
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
short g_nSelectedReleaseWeaponIndex
Definition viewrect.c:84
short g_asShipIdentified[12]
Definition viewrect.c:182
signed char g_acShipTarget[16]
Definition viewrect.c:167
signed char g_13_abShipArrivalMessageSent[16]
Definition cockpt.c:3803
signed char g_cCurrentObjective
Definition viewrect.c:57
short g_asObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:124
short g_aasShipShield[10][2]
Definition viewrect.c:134
short g_bKilrathiAceGreetingSent
Definition logic.c:1049
short g_nEjectionSequenceState
Definition mission.c:16
short g_asObjectFlip[SPACE_OBJECT_COUNT]
Definition viewrect.c:102
signed char g_acShipComputerDamage[16]
Definition viewrect.c:146
signed char g_acShipCollisionCooldown[16]
Definition viewrect.c:178
short g_asSpikeriLaunchCountdown[10]
Definition brains.c:1575
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
short g_nEscapedEnemyCount
Definition jump.c:8
PacketResourceDescriptor g_aMissionResourceDescriptors[8]
Definition fltsetup.c:1014
MissionNavPoint g_aMissionNavPoints[MISSION_NAV_POINT_COUNT]
Definition hotspot.c:237
short g_asPlayerHitsCreditValues[10]
Definition ship.c:3067
short g_asLoadedShipViewFrame[12]
Definition viewrect.c:154
short g_asObjectScreenX[SPACE_OBJECT_COUNT]
Definition viewrect.c:95
int g_98_nMemConfiguration
Definition startup.c:588
signed char g_abPilotEjectionAttempted[16]
Definition viewrect.c:188
short g_asWingmanDamageCredit[10]
Definition ship.c:3061
short g_bWingmanKilledThisMission
Definition logic.c:1055
short g_asShipIntelSlot[10]
Definition viewrect.c:155
signed char g_cMissionObjectiveCount
Definition viewrect.c:66
int g_11_nMissionResourceBudget
Definition startup.c:597
short g_aeSpecialManeuver[12]
Definition viewrect.c:141
short g_nSelectedCampaignSlot
Definition campaign.c:354
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
short g_nCommDeathSequenceFrame
Definition cockpt.c:10
short g_bJumpSequenceActive
Definition jump.c:10
short g_asShipWeaponEnergy[10]
Definition viewrect.c:136
signed char g_acTurnInterval[16]
Definition viewrect.c:143
short g_nEnemySighting
Definition brains.c:9
short g_bMissileLockAcquired
Definition cockpt.c:104
short g_bEjectionAwaitingCommCommand
Definition mission.c:13
unsigned char g_ucPendingEjectionTransition
Definition mission.c:11
short g_nEnemyCommPilotIndex
Definition mission.c:1464
short g_bShipResourceReloadInProgress
Definition mission.c:9
signed char g_acObjectOwner[SPACE_OBJECT_COUNT]
Definition viewrect.c:122
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_asShipIntelResourceKey[10]
Definition viewrect.c:156
short g_bTargetLockMode
Definition viewrect.c:92
ShortPoint g_116_aWeaponDisplayPositions[16]
Definition cockpt.c:3804
short g_bDisplayWingmanTargetData
Definition viewrect.c:77
short g_asShipTactic[12]
Definition viewrect.c:168
int g_nMissionMusicTrackOverride
Definition viewrect.c:194
signed char g_cQueuedNpcPortrait
Definition mission.c:17
short g_8_bUserDestroyedFlag
Definition gameflow.c:3809
MissionObjectiveSource g_69_aMissionObjectiveSources[8]
Definition hotspot.c:252
ShortVector g_aaFormationPositions[5][8]
Definition mission.c:19
short g_anPilotTurnInterval[8]
Definition mission.c:47
short g_bAutopilotSequenceActive
Definition auto.c:9
ShipIntelligenceMetadata g_stWingmanIntelligence
Definition viewrect.c:193
int g_nArcadeState
Definition main.c:1938
int g_anShipSpeed[SPACE_OBJECT_COUNT]
Definition viewrect.c:116
short g_nMissionEntryNavOverride
Definition main.c:1951
unsigned char g_aShipWeapons[10][0xA1]
Definition viewrect.c:150
short g_2_asFlakCooldownTable[16]
Definition brains.c:1573
short g_asShipIntelState[10]
Definition brains.c:11
signed char g_36_cPilotKillCountValue
Definition gameflow.c:3811
short g_asShipWingLeader[12]
Definition viewrect.c:162
signed char g_abShipEjectionSequenceEnabled[12]
Definition viewrect.c:189
short g_asActionCount[12]
Definition viewrect.c:140
int g_anShipCloakState[10]
Definition viewrect.c:179
signed char g_acShipPendingMessage[16]
Definition viewrect.c:160
unsigned char * g_apObjectExhaustShape[10]
Definition viewrect.c:126
short g_bEjectionTriggerImmediately
Definition mission.c:15
signed char g_4_acInitialShipKillNumber[8]
Definition logic.c:1056
signed char g_acPilotHitPoints[16]
Definition viewrect.c:158
FixedVector g_aShipPosition[SPACE_OBJECT_COUNT]
Definition viewrect.c:108
short g_nLastAdaptiveDifficultyChangeFrame
Definition ship.c:11
short g_bExpandedShipGraphicsEnabled
Definition viewrect.c:49
short g_asShipManeuver[12]
Definition viewrect.c:169
short g_19_bStoredHighMemoryEnabled
Definition eventmgr.c:2505
short g_bEjectionWaitForEnemyWave
Definition mission.c:12
FixedVector g_aShipVelocity[SPACE_OBJECT_COUNT]
Definition viewrect.c:109
short g_asShipMissionIndex[12]
Definition viewrect.c:153
signed char g_acTurnRegulator[16]
Definition viewrect.c:142
void ** g_apPacketReferenceGroups[5]
Definition mission.c:10
short g_bTargetLockActive
Definition cockpt.c:9
int g_nTrainSimActive
Definition main.c:1937
signed char g_cQueuedNpcMessage
Definition mission.c:18
signed char g_acShipStress[16]
Definition viewrect.c:187
signed char g_abShipTurn[16]
Definition viewrect.c:175
short g_asShipTurretFireEnabled[10]
Definition turret.c:1269
ObjectResourceSlot g_aObjectResourceSlots[5]
Definition viewrect.c:72
signed char g_acJumpDriveUsedBySystem[5]
Definition jump.c:295
MissionObjective g_aMissionObjectives[MISSION_OBJECTIVE_COUNT]
Definition viewrect.c:69
short g_nLoadedCommPortraitPilot
Definition viewrect.c:55
MissionShipRecord g_aMissionShips[MISSION_SHIP_COUNT]
Definition hotspot.c:240
ShortPoint g_aDefaultWeaponDisplayPositions[16]
Definition cockpt.c:28
unsigned char * g_pCommPortraitResource
Definition comm.c:16
short g_nSelectedGunType
Definition viewrect.c:83
short g_aasShipArmor[10][4]
Definition viewrect.c:135
signed char g_acShipDamage[16]
Definition viewrect.c:148
signed char g_acShipLastAttacker[16]
Definition viewrect.c:138
PilotProfile g_stCurrentPilotProfile
Definition viewrect.c:73
short g_asShipMissionType[12]
Definition viewrect.c:163
short g_bFriendlyFireWarningIssued
Definition ship.c:10
FixedVector g_aShipMissionSpot[20]
Definition viewrect.c:165
short g_asShipSide[12]
Definition viewrect.c:139
signed char g_acObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:101
short g_asDifficultyLevels[16][4]
Definition viewrect.c:23
short g_nCurrentNavPoint
Definition viewrect.c:53
short g_nAdaptiveDifficulty
Definition ship.c:3062
int g_nAvailableGameMemoryNumber
Definition startup.c:596
FixedVector g_vCollisionDelta
Definition viewrect.c:43
short g_1_nEnemyCommCommandBase
Definition mission.c:1463
short g_asObjectCounter[SPACE_OBJECT_COUNT]
Definition viewrect.c:110
MissionHeader g_13_stMissionHeaderBlock
Definition hotspot.c:253
short g_bMissionDeathSequencePending
Definition destroy.c:8
short g_asObjectViewFrame[SPACE_OBJECT_COUNT]
Definition viewrect.c:94
short * g_pPilotStatus
Definition campglob.c:499
short g_nHazardFieldCount
Definition viewrect.c:58
short g_1_nResourcePaletteState
Definition main.c:2000
short playerMissionShip
Definition game_data.h:1346
short entryNavPoint
Definition game_data.h:1343
short initialMissionShips[8]
Definition game_data.h:1347
short homeMissionShip
Definition game_data.h:1345
signed char systemIndex
Definition game_data.h:1329
short preloadObjectTypes[3]
Definition game_data.h:1333
short preloadObjectClasses[3]
Definition game_data.h:1334
FixedVector position
Definition game_data.h:1327
signed char waveCommands[8]
Definition game_data.h:1332
short missionShips[10]
Definition game_data.h:1336
short preloadLogicalFiles[3]
Definition game_data.h:1335
signed char type
Definition game_data.h:1326
signed char triggers[4][2]
Definition game_data.h:1331
signed char portrait
Definition game_data.h:1384
signed char missionParameter
Definition game_data.h:1383
signed char type
Definition game_data.h:1365
signed char navPoint
Definition game_data.h:1371
signed char leaderMissionIndex
Definition game_data.h:1381
FixedVector position
Definition game_data.h:1372
signed char field_19
Definition game_data.h:1368
signed char formationIndex
Definition game_data.h:1382
signed char field_13
Definition game_data.h:1364
signed char formationSpot
Definition game_data.h:1376
signed char state
Definition game_data.h:1380
unsigned char * shapeSet
Definition game_data.h:1400
unsigned char * animation
Definition game_data.h:1401
unsigned char * field_12
Definition game_data.h:1403
unsigned char * shape
Definition game_data.h:1402
unsigned char * animation
Definition game_data.h:379
short resourceType
Definition game_data.h:368
short collisionRadius
Definition game_data.h:370
unsigned char weaponLoadout[0xA1]
Definition game_data.h:385
short objectClass
Definition game_data.h:367
unsigned char * shape
Definition game_data.h:393
short damageCapacity
Definition game_data.h:375
unsigned char * shapeSet
Definition game_data.h:392
short missionScore
Definition game_data.h:1122
short playerShipType
Definition game_data.h:1123