Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
auto.c
Go to the documentation of this file.
1/*
2 * Autopilot travel and interstitial flight sequences.
3 *
4 * Retail object 0x4228B0-0x42347F (link order; see docs/ORDER.md).
5 */
6#include "game.h"
7
8short g_nAutopilotFormationShipCount = 0; /* 0x00493060 */
9short g_bAutopilotSequenceActive = 0; /* 0x00493064 */
10
11/* WC2's auto.c declares the autopilot debug flag two bytes wide where every
12 * other translation unit declares it as a char. In the retail image the byte
13 * above it is padding, so the value is the same and only the load width
14 * differs; on the port the byte above it is the sanitizer's redzone, so read
15 * the flag at its own width there. */
16#define g_nAutopilotDebugEnabled \
17 (*(const short *)&g_bAutopilotDebugEnabled)
18
19
20/* Function start: 0x4228B0 */
21void visit_the_cinema(int view, int obj, short frames)
22{
23 int originalUnlock;
24 int savedInputFlag;
25 int savedKeyboardFlag;
26
27 originalUnlock = g_nOriginDevUnlock;
28 savedInputFlag = g_bPlayerDamageEnabled;
29 savedKeyboardFlag = g_bPlayerCollisionEnabled;
33 /* The retail call converts both int parameters implicitly. Making the
34 * narrowing explicit changes the register setup and loses an exact match. */
35 force_view(view, obj);
36 while (frames-- > 0) {
41 }
42 g_nOriginDevUnlock = originalUnlock;
43 g_bPlayerDamageEnabled = (short)savedInputFlag;
44 g_bPlayerCollisionEnabled = (short)savedKeyboardFlag;
45}
46
47/* Function start: 0x422953 */
48short player_wingman(short obj)
49{
50 return obj != -1 && g_asShipWingLeader[obj] == 0;
51}
52
53/* Function start: 0x422990 */
54void set_speed(short obj, short speed)
55{
56 g_anShipSpeed[obj] = (int)speed << 8;
57 fix_velocity(obj);
58}
59
60#pragma function(abs)
61void set_speed(short obj, short speed);
62
63/* Function start: 0x4229B9 */
64void auto_position(short obj, short *formationSlot)
65{
66 short sideways;
67 short vertical;
68 short forward;
69
70 if (player_wingman(obj) != 0) {
75 return;
76 }
77
78 (*formationSlot)++;
79 if ((*formationSlot & 1) != 0)
80 sideways = 650;
81 else
82 sideways = -650;
83 if (g_nAutopilotFormationShipCount == *formationSlot)
84 sideways = 0;
85 vertical = 0;
86 forward = (short)(MaxShort(1, (short)(*formationSlot >> 1)) * -1800);
87 if (g_nYourWingman != -1) {
88 if (abs(
90 forward) <
93 vertical = 500;
94 }
96 sideways, vertical, forward);
97}
98
99/* Function start: 0x422B1C */
101{
102 short cruiseSpeed;
103 short ordnance;
104 FixedVector destination;
105 short ownCruise;
106 signed char inFormation[10];
108 short savedMode;
109 short slot;
110 short obj;
111 short destinationRange;
112 short nearest;
113 short startRange;
114 short moveOn;
115 FILE *autoLog;
116
117 savedMode = g_nTrainSimActive;
118 slot = 0;
119 moveOn = 1;
120 autoLog = 0;
122 destination = g_aMissionObjectives[
124
125 if (auto_pilot_valid(1) == 0)
126 return;
128 autoLog = fopen("auto.$$$", "w+");
130 LogMemoryStateToFile(autoLog);
131 if (g_ucPendingEjectionTransition != 0xff &&
138 if (g_nArcadeState == 1)
139 return;
140 }
143 g_cCurrentObjective].position,
145 g_nCurrentNavPoint].position) <
147 g_nCurrentNavPoint].proximityRadius + 25)
148 moveOn = 0;
149
150 for (ordnance = 0; ordnance < 10; ordnance++) {
151 if (g_aeObjectClass[ordnance] == OBJECT_CLASS_MISSILE)
152 remove_object(ordnance);
153 }
157
158 for (obj = 0; obj < 10; obj++) {
159 inFormation[obj] = 0;
160 g_anShipSpeed[obj] = 0;
163 g_aeSpecialManeuver[obj] !=
165 g_asShipSide[obj] == SIDE_IMPERIAL) {
166 if (is_team_member(
167 g_asShipMissionIndex[obj]) != 0) {
168 if (kilrathi_near(obj, 10000) == 0) {
169 inFormation[obj] = -1;
171 g_anYawGoal[obj] =
173 g_anPitchGoal[obj] =
175 g_anRollGoal[obj] = 0;
178 if (obj != 0 &&
179 obj != g_nYourWingman)
181 }
182 } else if (moveOn != 0) {
183 remove_object(obj);
184 }
185 }
186 }
187
188 startRange = distance_from_point(0, &destination);
189 point_at(0, destination);
190 set_speed(0, 60);
191 inFormation[0] = 1;
192 slot = 0;
193
194 for (obj = 0; obj < 10; obj++) {
195 if (inFormation[obj] == -1 && obj != 0) {
196 if (distance_from_object(obj, 0) > 20000) {
197 if (player_wingman(obj) != 0)
198 inFormation[obj] = 1;
199 else if (equ_vector(
200 &g_aShipDestination[obj],
201 &destination) != 0 &&
202 g_asShipSide[obj] ==
203 g_asShipSide[0])
204 inFormation[obj] = 2;
205 else
206 inFormation[obj] = 3;
207 } else {
208 if (player_wingman(obj) != 0 ||
210 &destination) != 0)
211 inFormation[obj] = 1;
212 else
213 inFormation[obj] = 3;
214 }
215 if (inFormation[obj] == 1 &&
216 g_asShipSide[obj] ==
217 g_asShipSide[0]) {
218 auto_position(obj, &slot);
220 0x3c00,
221 &g_aShipVelocity[obj]);
222 copy_frame(0, obj);
223 g_anShipSpeed[obj] =
224 g_anShipSpeed[0];
225 g_aShipVelocity[obj] =
227 }
228 }
229 }
230
232 visit_the_cinema(13, 0, 90);
233 while (g_nTrainSimActive == 4) {
235 &destination, &advance);
237 ScaleFixedVector(&advance, 0x19000, &advance);
239 &g_aShipPosition[0]);
242
243 destinationRange = distance_from_point(0, &destination);
244 nearest = 0x7fff;
245 for (obj = 0; obj < 10; obj++) {
247 inFormation[obj] == 0)
248 nearest = MinShort(
249 nearest, distance_from_object(0, obj));
250 }
251
252 if ((unsigned short)destinationRange < 1000 ||
254 nearest < 4000 ||
255 report_kilrathi_rout(1) != 0)
256 g_nTrainSimActive = savedMode;
257 }
258
260 &g_aShipPosition[0]);
261 cruiseSpeed = g_asShipMaximumVelocity[0];
262 for (obj = 0; obj < 10; obj++) {
263 if (inFormation[obj] != 0) {
264 ownCruise = g_aObjectTypeData[
266 if (ownCruise < cruiseSpeed)
267 cruiseSpeed = ownCruise;
268 }
269 }
270
271 slot = 0;
272 for (obj = 0; obj < 10; obj++) {
273 if (inFormation[obj] != 0 &&
274 g_asShipSide[obj] == g_asShipSide[0]) {
275 set_speed(obj, cruiseSpeed);
276 if (obj != 0) {
277 switch (inFormation[obj]) {
278 case 1:
279 case 2:
280 auto_position(obj, &slot);
281 break;
282 case 3:
284 obj,
285 &g_aShipDestination[obj]) <
286 startRange)
287 g_aShipPosition[obj] =
289 break;
290 }
291 }
292 }
293 }
294
296 if (g_nCockpitDisplayMode == 0) {
297 force_view(0, 0);
298 } else {
301 (unsigned short)(g_nScreenWidth - 1),
302 (unsigned short)(g_nScreenHeight - 1));
305 force_view(0, 0);
308 SetViewportRect(&g_27_stViewScratchInfo, 0, 0, 319, 199);
310 }
314 LogMemoryStateToFile(autoLog);
316 if (autoLog != 0)
317 fclose(autoLog);
318}
#define g_nAutopilotDebugEnabled
Definition auto.c:16
void ComputeVectorDelta(FixedVector *from, FixedVector *to, FixedVector *delta)
Definition geom.c:229
short kilrathi_near(short obj, short range)
Definition cockpt.c:395
short MaxShort(short a, short b)
Definition disk.c:36
short distance_between_points(const FixedVector *from, const FixedVector *to)
Definition geom.c:528
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 distance_from_point(short obj, const FixedVector *point)
Definition geom.c:538
void remove_object(short obj)
Definition geom.c:858
void LogMemoryStateToFile(FILE *file)
Definition gameflow.c:132
void ejection_sequence(short outcome, signed char restoreCockpit)
Definition midscene.c:63
short is_team_member(short missionShip)
Definition mission.c:1217
void auto_position(short obj, short *formationSlot)
Definition auto.c:64
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:211
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 auto_pilot_sequence(void)
Definition auto.c:100
short MinShort(short a, short b)
Definition disk.c:27
void DIBslamReal(void)
Definition dib.cpp:562
short distance_from_object(short obj, short other)
Definition geom.c:547
void RenderSpaceViewFrame(void)
Definition main.c:1705
void copy_frame(short source, short destination)
Definition geom.c:470
void ResetSoundState(void)
Definition music.c:381
void force_view(int view, short obj)
Definition spc.c:423
void visit_the_cinema(int view, int obj, short frames)
Definition auto.c:21
short auto_pilot_valid(short showReason)
Definition cockpt.c:440
void zero_vector(FixedVector *vector)
Definition geom.c:197
void advance(short ship)
Definition fl.c:181
void SubtractFixedVectors(FixedVector *left, FixedVector *right, FixedVector *difference)
Definition geom.c:220
unsigned int fix_velocity(short obj)
Definition ship.c:712
void Update_3Space(void)
Definition main.c:294
short report_kilrathi_rout(int mode)
Definition logic.c:214
void point_at(short obj, FixedVector point)
Definition geom.c:84
short player_wingman(short obj)
Definition auto.c:48
unsigned int ReleaseStaleNavTarget(void)
Definition main.c:1769
void set_speed(short obj, short speed)
Definition auto.c:54
short equ_vector(const FixedVector *left, const FixedVector *right)
Definition geom.c:182
void clean_up_cockpit(void)
Definition jump.c:121
void free_view_buffer(void)
Definition main.c:208
void MarkDibDirty(void)
Definition dib.cpp:532
short NormalizeFixedVector(FixedVector *vector)
Definition geom.c:347
void ResetCannedSceneRecording(void)
Definition taperec.c:20
void check_hazards(void)
Definition fields.c:428
Shared Win32 declarations, types and library interfaces.
@ SIDE_IMPERIAL
Definition game_data.h:175
@ SPECIAL_MANEUVER_UNKNOWN_9
Definition game_data.h:269
@ SPECIAL_MANEUVER_NONE
Definition game_data.h:259
@ OBJECT_CLASS_MISSILE
Definition game_data.h:48
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
HazardField * g_pActiveHazardField
Definition viewrect.c:60
short g_asObjectCollisionRadius[SPACE_OBJECT_COUNT]
Definition viewrect.c:120
ShortVector g_aShipFormationOffset[10]
Definition viewrect.c:129
short g_nYourWingman
Definition viewrect.c:75
int g_nCockpitDisplayMode
Definition main.c:1929
short g_78_bHighMemoryBuffersSetState
Definition cockpt.c:3839
short g_anObjectRollRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:119
short g_nPendingEjectionSequenceCount
Definition mission.c:14
signed char g_abFlightPath[MISSION_OBJECTIVE_COUNT]
Definition viewrect.c:68
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
short g_anObjectYawRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:118
signed char g_cCurrentObjective
Definition viewrect.c:57
short g_nEjectionSequenceState
Definition mission.c:16
short g_anRollGoal[12]
Definition viewrect.c:132
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
MissionNavPoint g_aMissionNavPoints[MISSION_NAV_POINT_COUNT]
Definition hotspot.c:237
FixedVector g_aShipForwardVector[SPACE_OBJECT_COUNT]
Definition viewrect.c:107
short g_aeSpecialManeuver[12]
Definition viewrect.c:141
short g_anYawGoal[12]
Definition viewrect.c:131
unsigned char g_ucPendingEjectionTransition
Definition mission.c:11
short g_bPlayerCollisionEnabled
Definition main.c:1947
short g_nAutopilotFormationShipCount
Definition auto.c:8
short g_anObjectPitchRotation[SPACE_OBJECT_COUNT]
Definition viewrect.c:117
short g_asShipMaximumVelocity[12]
Definition viewrect.c:171
short g_bAutopilotSequenceActive
Definition auto.c:9
int g_nArcadeState
Definition main.c:1938
short g_anPitchGoal[12]
Definition viewrect.c:130
int g_anShipSpeed[SPACE_OBJECT_COUNT]
Definition viewrect.c:116
short g_nScreenHeight
Definition eventmgr.c:2431
Viewport g_27_stViewScratchInfo
Definition cockpt.c:3841
short g_asShipWingLeader[12]
Definition viewrect.c:162
signed char g_cCurrentNavPointIndex
Definition viewrect.c:67
FixedVector g_aShipPosition[SPACE_OBJECT_COUNT]
Definition viewrect.c:108
short g_bPlayerDamageEnabled
Definition main.c:1946
FixedVector g_aShipVelocity[SPACE_OBJECT_COUNT]
Definition viewrect.c:109
short g_asShipMissionIndex[12]
Definition viewrect.c:153
int g_nTrainSimActive
Definition main.c:1937
FixedVector g_aShipDestination[10]
Definition viewrect.c:128
MissionObjective g_aMissionObjectives[MISSION_OBJECTIVE_COUNT]
Definition viewrect.c:69
short g_nOriginDevUnlock
Definition main.c:1944
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_nCurrentNavPoint
Definition viewrect.c:53
FixedVector position
Definition game_data.h:1422
short cruiseVelocity
Definition game_data.h:378