Wing Commander
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
launch.c
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup campaign
4 * @brief Carrier departure and cockpit launch sequences.
5 *
6 * Address range 42b9a0-42c40f. Its boundary with the installation helpers
7 * in install.c, which follow, is provisional.
8 */
9#include "wc1.h"
10
11/* 0x0046a550 */
13 -1, -1, -1, -2, -2, -2, -2, -3,
14 -3, -3, -3, -3, -2, -2, -2, -2,
15 -1, -1, -1, -1, -1, 0, 0, 0
16};
17/* 0x0046a580 */
18static signed char acCarrierLaunchApproachFrames[24] = {
19 36, 32, 32, 32, 32, 32, 32, 32,
20 25, 25, 25, 25, 25, 25, 25, 25,
21 18, 18, 18, 18, 18, 18, 18, 18
22};
23/* 0x0046a598 */
25 { -2, 1 }, { -1, 1 }, { -1, 1 },
26 { -1, 0 }, { -1, 1 }, { -1, 0 },
27 { -1, 1 }, { -1, 0 }, { 0, 0 }
28};
29static short asCarrierLaunchFighterDeltaY[14] = {
30 3, 3, 3, 2, 2, 2, 2, 2,
31 1, 1, 1, 1, 1, 1
32}; /* 0x0046a5c0 */
33
34static short asCarrierLaunchViewData[14] = {
35 12, 11, 1, 90, 90, 0, 9, -90, 0, 0, 20, 3, 15, -1
36}; /* 0x0046a5e0 */
37
38
39/* Linker commons defined here; LINK orders them by identifier hash. */
41short nViewConstellationStarCount; /* 0x005a6ab0 */
44short nConstellationParticleTotal; /* 0x005a6b54 */
45const short *pCurrentViewScriptPtr; /* 0x005a6b58 */
46short nCurrentExternalViewDistance; /* 0x005a6b5c */
47Viewport stPilotHandView; /* 0x005a6b60 */
48Viewport stLeftVdu; /* 0x005a6b80 */
50Viewport stScreenView; /* 0x005a6ba0 */
52Viewport stCockpitBar; /* 0x005a6be0 */
53
54/* Function start: 0x42B9A0 */
55void DrawLaunchDoorFrame(short distance)
56{
57 ShortRect bounds;
58 short scale;
59
60 if (distance > 10) {
61 scale = (short)(0x1a00L / distance);
64 (short)((short)nScreenWidth >> 1),
65 (short)((short)nScreenHeight >> 1),
66 pLaunchDoorShape, 1, 0, scale, 0, &bounds);
68 &stSpaceBufferViewport, (short)(bounds.left - 1),
69 (short)((short)nScreenHeight >> 1),
70 pLaunchDoorShape, 0, 0, scale, 0);
73 (short)((short)nScreenWidth >> 1),
74 (short)((short)nScreenHeight >> 1),
75 pLaunchDoorShape, 1, 0, scale, 0);
78 (short)((short)nScreenHeight >> 1),
79 pLaunchDoorShape, 2, 0, scale, 0);
80 }
81}
82
83/* Function start: 0x42BA90 */
85{
86 short doorDistances[4];
87 signed char distanceStep;
88 signed char frame;
89 signed char door;
90
91 doorDistances[0] = 50;
92 doorDistances[1] = 40;
93 doorDistances[2] = 30;
94 doorDistances[3] = 20;
95 distanceStep = 1;
96
97 spacetrack(changetrack(), 1, 0);
98 if (bEscapePressedFlag == 0) {
102 force_view(0, 0);
103 PlaySfxWaveFileByNumber(20, -1, 0);
106 for (frame = 0; frame < 25; frame++) {
108 if (RefreshCockpitStatus() != 0) {
109 door = 0;
110 do {
111 DrawLaunchDoorFrame(doorDistances[door]);
112 doorDistances[door] =
113 (short)(doorDistances[door] - distanceStep);
114 door++;
115 } while (door < 4);
118 }
119 DIBslam();
120 DIBslamReal();
121 if (bEscapePressedFlag == 1)
122 break;
123 if (frame % 5 == 0)
124 distanceStep++;
125 }
126
127 if (bEscapePressedFlag != 0) {
129 spacetrack(changetrack(), 1, 0);
130 }
132 } else {
133 force_view(0, 0);
134 }
135
136 DIBslam();
137 DIBslamReal();
142}
143
144/* Function start: 0x42BC00 */
145unsigned int ShowCarrierLaunchSequence(signed char sceneObject)
146{
147 short launchX;
148 short launchY;
149 struct Shape *carrierShape;
150 ShortPoint actor;
151 struct Shape *fighterShape;
152 short fighterScreenY;
153 short approachScale;
154 short approachDistance;
155 short fighterScreenX;
156 short carrierScreenX;
157 struct Shape *actorShape;
158 short frame;
159 int soundHandle; /* Unset in the original; ignored by the Win32 callee. */
160
162 carrierScreenX = 180;
163 free_ship(1);
164 free_ship(2);
165 free_ship(3);
169 spacetrack(0x1c, 2, 1);
170 carrierShape =
172 actorShape =
174 fighterShape = aObjectTypeData[
177 nScriptedViewObject = sceneObject;
179 fighterScreenY = 64;
180 fighterScreenX = 20;
182 apObjShapeArray[0] = fighterShape;
184 asObjectFlipArray[0] = 0;
185 asObjectViewFrames[0] = 36;
186 asObjScreenAngles[0] = 180;
187 asObjDistancesTable[0] = 300;
188 apObjShapeArray[sceneObject] = carrierShape;
189 asObjectFlipArray[sceneObject] = 0;
190 asObjectViewFrames[sceneObject] = 3;
191 asObjScreenAngles[sceneObject] = 0;
192 asObjScreenScalesArray[sceneObject] = 0x100;
193 asObjDistancesTable[sceneObject] = 2000;
196 frame = 0;
197 approachDistance = 20;
198 do {
201 aeObjectClass[sceneObject] = OBJECT_CLASS_NULL;
204 if (nFrameSkipCounter < 1) {
213 if (frame < 24) {
214 fighterScreenY = (short)(fighterScreenY +
218 } else if (frame < 48) {
219 fighterScreenY = (short)(fighterScreenY -
223 }
225 approachScale = (short)(
226 ((int)awObjectScales[0]
227 << 4) / approachDistance);
228 aeObjectClass[sceneObject] = OBJECT_CLASS_SHIP;
230 (short)(fighterScreenX - nCurrentViewCenterPosX);
232 (short)(fighterScreenY - nCurrentViewCenterPosY);
233 asObjScreenScalesArray[0] = approachScale;
234 asObjectScreenXList[sceneObject] =
237 asObjectScreenYArray[sceneObject] =
243 }
244 fighterScreenX = (short)(fighterScreenX + 2);
248 approachDistance = (short)(approachDistance + 2);
250 (unsigned short)(asObjDistancesTable[0] + 10);
252 &aShipVelocity[61],
254 if (bEscapePressedFlag == 1)
255 break;
256 frame++;
257 DIBslam();
258 DIBslamReal();
259 } while (frame < 100);
260
262 aeObjectClass[sceneObject] = OBJECT_CLASS_NULL;
263 if (bEscapePressedFlag != 1) {
264 copy_frame(sceneObject, 61);
265 aShipPositionsArray[61] = aShipPositionsArray[sceneObject];
267 asObjectCollisionRadius[sceneObject];
270 launchX = 200;
271 launchY = 32;
272 approachDistance = 100;
273 ConfigureScrambleActor(100, 80, 1, 0, actorShape,
274 0x100, 0, 0, 0);
275 ConfigureScrambleActor(116, 130, 0, 0, actorShape,
276 0x100, 0, 0, 1);
277 ConfigureScrambleActor(300, 110, -4, 0, actorShape,
278 0xc0, 0, 0x10, 3);
279 ConfigureScrambleActor(301, 110, -4, 0, actorShape,
280 0xc0, 0, 0x10, 4);
281 PlaySfxWaveFileByNumber(18, -1, 0);
282 frame = 0;
283 actor.x = 60;
284 actor.y = 10;
286 do {
288 alter_yaw(-1, 61);
289 if (RefreshCockpitStatus() != 0) {
292 (short)(nScrambleBackgroundRightCoordX + 239),
294 carrierShape, 0);
297 (short)(nScrambleBackgroundRightCoordX + 240),
299 carrierShape, 1);
301 approachScale = (short)(0x6000L / approachDistance);
303 launchY, fighterShape, 16, 0,
304 approachScale, 0);
310 (short)(nScrambleBackgroundRightCoordX + 60),
311 (short)(nScrambleBackdropPositionY + 10),
312 actorShape, 16);
315 (short)(nScrambleBackgroundRightCoordX + 80),
316 (short)(nScrambleBackdropPositionY + 134),
317 actorShape, 8);
320 carrierShape, 2);
323 }
326 carrierScreenX = (short)(carrierScreenX + 4);
327 launchX = (short)(launchX - 2);
328 launchY++;
329 approachDistance--;
330 if (soundHandle != 0) {
331 ((void (__cdecl *)(int, int, short, int))PaletteFadeHook)(
332 soundHandle, 10, (short)(frame * 4), 0);
333 }
334 if (bEscapePressedFlag == 1)
335 break;
336 DIBslam();
337 DIBslamReal();
338 frame++;
339 } while (frame < 35);
340
341 if (bEscapePressedFlag != 1) {
343 frame = 0;
344 while (frame < 50) {
346 if (RefreshCockpitStatus() != 0) {
349 (short)(nScrambleBackgroundRightCoordX + 239),
351 carrierShape, 0);
354 (short)(nScrambleBackgroundRightCoordX + 240),
356 carrierShape, 1);
359 launchY, fighterShape, 16, 0,
360 approachScale, 0);
366 (short)(nScrambleBackgroundRightCoordX + actor.x),
367 (short)(nScrambleBackdropPositionY + actor.y),
368 actorShape, 16);
371 (short)(nScrambleBackgroundRightCoordX + 80),
372 (short)(nScrambleBackdropPositionY + 134),
373 actorShape, 8);
376 carrierShape, 2);
379 }
380 frame++;
381 if (frame < 9) {
382 launchX = (short)(launchX +
384 launchY = (short)(launchY +
386 } else if (frame < 23) {
387 if (frame == 9)
388 PlaySfxWaveFileByNumber(11, -1, 0);
389 launchY = (short)(launchY +
391 }
392 if (frame == 23) {
393 FlushSoundEffectsAndLog(soundHandle, 0);
394 PlaySfxWaveFileByNumber(19, -1, 0);
395 }
396 actor.x++;
397 if (frame % 7 == 0)
398 actor.y--;
399 DIBslam();
400 DIBslamReal();
401 if (bEscapePressedFlag == 1)
402 break;
403 }
404 }
405 }
406
411 free_ship(0);
412 ReleasePacketHandle(carrierShape);
413 ReleasePacketHandle(actorShape);
414 bScriptedView = 0;
416 return 0;
417}
void(__cdecl *pIxFree)(void *)
unsigned char bEscapePressedFlag
Definition mathfp.c:24
short nCurrentExternalViewDistance
Definition launch.c:46
short asObjScreenScalesArray[SPACE_OBJECT_COUNT]
Definition dib.c:105
short nConstellationParticleTotal
Definition launch.c:44
short nRenderedSpaceFrame
Definition input.c:22
Viewport stPilotHandView
Definition launch.c:47
struct Shape * pLaunchDoorShape
Definition main.c:89
short asObjScreenAngles[SPACE_OBJECT_COUNT]
Definition joycal.c:26
ObjectTypeData aObjectTypeData[OBJECT_TYPE_COUNT]
Definition objdata.c:86
Viewport stConstellationViewport
Definition launch.c:43
Viewport * pScrambleView
Definition mission.c:61
const short * pCurrentViewScriptPtr
Definition launch.c:45
short nFrameSkipCounter
Definition main.c:23
ConstellationParticle aConstellationParticlesList[16]
Definition launch.c:42
short nScrambleBackgroundRightCoordX
Definition cutscene.c:173
short nFrameSkip
Definition main.c:24
enum ObjectClass aeObjectClass[SPACE_OBJECT_COUNT]
Definition video.c:21
short nViewConstellationStarCount
Definition launch.c:41
short asObjectScreenYArray[SPACE_OBJECT_COUNT]
Definition screen.c:20
FixedVector aShipVelocity[SPACE_OBJECT_COUNT]
Definition smart.c:21
int bScriptedView
Definition view.c:14
unsigned int bIntroSceneResourcesActive
Definition logic.c:87
Viewport stLeftVdu
Definition launch.c:48
short asObjectCollisionRadius[64]
Definition ending.c:27
short nCurrentViewCenterPosX
Definition eventmgr.c:25
short nScriptedViewObject
Definition view.c:13
short nScreenWidth
Definition data.c:34
Viewport stScreenView
Definition launch.c:50
unsigned short asObjDistancesTable[SPACE_OBJECT_COUNT]
Definition data.c:253
Viewport stSpaceBufferViewport
Definition timer.c:13
int nCannedSceneMode
Definition main.c:21
CampaignState stCampaignState
Definition dib.c:107
short asObjectScreenXList[SPACE_OBJECT_COUNT]
Definition screen.c:21
short nCurrentSpaceFrameValue
Definition data.c:249
TextContext stHudMessageTextContext
Definition launch.c:51
short nScrambleBackdropPositionY
Definition cutscene.c:172
unsigned short awObjectScales[SPACE_OBJECT_COUNT]
Definition music.c:86
struct Shape * apObjShapeArray[SPACE_OBJECT_COUNT]
Definition comm.c:48
short asObjectViewFrames[SPACE_OBJECT_COUNT]
Definition video.c:23
short asObjectFlipArray[SPACE_OBJECT_COUNT]
Definition dib.c:97
ScreenViewportPacket * pCurrentScreenViewportPkt
Definition launch.c:49
Viewport stCockpitBar
Definition launch.c:52
short nScreenHeight
Definition data.c:37
Viewport * pConstellationViewportPtr
Definition launch.c:40
FixedVector aShipPositionsArray[SPACE_OBJECT_COUNT]
Definition game.c:556
short nCurrentViewCenterPosY
Definition eventmgr.c:26
static signed char acCarrierLaunchApproachFrames[24]
Definition launch.c:18
static ShortPoint aCarrierLaunchFighterPath[9]
Definition launch.c:24
static short asCarrierLaunchFighterDeltaY[14]
Definition launch.c:29
static short asCarrierLaunchApproachDeltaY[24]
Definition launch.c:12
static short asCarrierLaunchViewData[14]
Definition launch.c:34
enum ObjectType playerShipType
Definition wcdata.h:711
struct Shape * shapeSet
Definition wcdata.h:393
short y
Definition wcdata.h:416
short x
Definition wcdata.h:415
short left
Definition wcdata.h:440
short right
Definition wcdata.h:442
Umbrella header for the game core.
short GetTransformedShapeBounds(Viewport *viewport, short x, short y, struct Shape *shape, short frame, short angle, short scale, short flip, ShortRect *bounds)
Definition gr.c:1196
void DIBslam(void)
Definition dib.c:513
void LaunchPlayerShip(void)
Definition launch.c:84
unsigned int force_view(int view, short obj)
Definition spc.c:464
void * FetchDiskPacketRetrying(short logicalFile, short section, short flags)
Definition disk.c:126
void AddFixedVectors(const FixedVector *left, const FixedVector *right, FixedVector *sum)
Definition geom.c:296
void DrawSpriteScaled(Viewport *viewport, short x, short y, struct Shape *shape, short frame, short angle, short scale, short flip)
Definition gr.c:1176
unsigned int spacetrack(int track, int mode, short enabled)
Definition music.c:411
unsigned int DrawScrambleActor(short actorIndex)
Definition cutscene.c:373
void DrawSpriteDefault(Viewport *viewport, short x, short y, struct Shape *shape, short frame)
Definition gr.c:660
void StopMusicUnlessSuppressed(void)
Definition music.c:419
void DIBslamReal(void)
Definition dib.c:519
unsigned int house_keep_objects(void)
Definition spc.c:850
unsigned int clear_view_buffer(void)
Definition main.c:414
unsigned int PreloadMusicTrackHook(short track)
Definition logic.c:2044
unsigned int update_objects_in_space(void)
Definition spc.c:985
void initialize_scripted_view(const short *script)
Definition view.c:175
unsigned int UpdateSpacePaletteFade(void)
Definition main.c:509
unsigned int PumpWindowMessages(void)
Definition winmain.c:740
void copy_frame(short source, short destination)
Definition geom.c:585
unsigned int ConfigureScrambleActor(short x, short y, short deltaX, short deltaY, struct Shape *shape, short scale, short angle, signed char flip, short actorIndex)
Definition cutscene.c:432
void update_cockpit(void)
Definition cockpt.c:2895
void alter_yaw(short angle, short obj)
Definition geom.c:627
void remove_nav_point_objects(void)
Definition mission.c:432
void WaitForVerticalBlankThunk(void)
Definition mathfp.c:158
void ResetSoundState(void)
Definition music.c:669
unsigned int ShowCarrierLaunchSequence(signed char sceneObject)
Definition launch.c:145
void draw_sorted_objects_to_buffer(void)
Definition eventmgr.c:890
unsigned int ReleaseMusicTrackHook(short track)
Definition logic.c:2051
unsigned int update_star_field(void)
Definition spc.c:733
void PaletteFadeHook(void)
Definition music.c:132
void sort_object_depth(void)
Definition eventmgr.c:835
unsigned int RefreshCockpitStatus(void)
Definition main.c:1948
void PlaySfxWaveFileByNumber()
void transform_objects_to_your_view(void)
Definition geom.c:1186
void ReleasePacketHandle(void *handle)
Definition ending.c:50
int changetrack(void)
Definition music.c:520
unsigned int set_eye_direction_and_position(void)
Definition spc.c:152
void FlushSoundEffectsAndLog(int soundHandle, short fadeTicks)
Definition music.c:714
int free_ship(short slot)
Definition mission.c:330
void DrawLaunchDoorFrame(short distance)
Definition launch.c:55
unsigned int dump_buffer_to_screen(void)
Definition main.c:383
@ OBJECT_CLASS_SHIP
Definition wcdata.h:50
@ OBJECT_CLASS_NULL
Definition wcdata.h:38