Wing Commander
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
cutscene.c
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup campaign
4 * @brief Scramble, landing and funeral scenes, and the animation demo.
5 *
6 * Address range 407710-40975f. The initialized scene tables precede their
7 * diagnostic and subtitle literals, which end before the following AI state.
8 */
9#include <signal.h>
10#include <dos.h>
11#include <sys/types.h>
12#include "wc1.h"
13#include <memory.h>
14
15/* The scene callers pass their series byte as a word. */
16unsigned int init_3Space_objects(short scene);
17
18static signed char cScrambleLeftWalkerFrame = 7; /* 0x00465768 */
19static signed char cScrambleRightWalkerFrame = 10; /* 0x0046576c */
20/* 0x00465770 */
21static signed char acScrambleWalkerOverlayFrames[8] = {
22 3, 4, 5, 3, 4, 6, 6, 3
23};
24static short nScrambleLeftWalkerX = 70; /* 0x00465778 */
25static short nScrambleRightWalkerX = 170; /* 0x0046577c */
26static short nScrambleBackgroundX = 0; /* 0x00465780 */
27/* 0x00465788 */
28static unsigned short ausScrambleActorAnimationA[8] = {
29 0, 1, 2, 3, 4, 5, 0x80, 0
30};
31/* 0x00465798 */
32static unsigned short ausScrambleActorAnimationB[11] = {
33 0, 0, 1, 2, 2, 2, 2, 2, 1, 1, 0x80
34};
35/* 0x004657b0 */
37 { 0, 0, 0, 0, 2, 0, 0,
38 ausScrambleActorAnimationA, 0, 0, 0, 0 },
39 { 0, 0, 0, 0, 10, 0, 0,
40 ausScrambleActorAnimationB, 0, 0, 0, 0 },
41 { 0, 0, 0, 0, 13, 0, 0,
42 ausScrambleActorAnimationB, 0, 0, 0, 0 },
43 { 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 },
44 { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0 }
45};
46/* 0x00465828 */
48 {
49 { 2, 23, 5 }, { 3, -112, 16 },
50 { 6, -94, -23 }, { 6, -26, 5 },
51 { 7, -58, -11 }, { 7, -98, 5 },
52 { 7, -14, 13 }, { 7, 60, 6 },
53 { 7, 149, 24 }, { 9, -112, -24 },
54 { 9, -99, -9 }, { 9, -116, 18 },
55 { 9, -81, 15 }, { 9, -41, 9 },
56 { 9, -54, 1 }, { 9, -12, -14 },
57 { 9, 45, 18 }, { 9, 75, 11 },
58 { 9, 130, 14 }, { 9, 166, 24 },
59 { 0, -68, -35 }, { 0, -19, -9 },
60 { 0, 68, 13 }, { 8, -76, -18 },
61 { 8, -33, -1 }, { 8, 97, 31 },
62 { 10, -86, 10 }, { 10, -117, 47 },
63 { 10, 9, 0 }, { 1, -111, 52 },
64 { 1, -50, 15 }, { 1, 75, 5 }
65 },
66 {
67 { 3, -88, 20 }, { 6, -57, 29 },
68 { 7, -139, 63 }, { 7, -72, 5 },
69 { 7, -14, 28 }, { 9, -91, -34 },
70 { 9, -113, -14 }, { 9, -132, 33 },
71 { 9, -95, 34 }, { 9, -60, 12 },
72 { 9, -155, 52 }, { 9, -66, 51 },
73 { 9, -56, 44 }, { 9, 44, 35 },
74 { 9, 57, 25 }, { 9, 59, -1 },
75 { 9, 123, 41 }, { 9, 148, 30 },
76 { 0, -135, -2 }, { 0, -100, 59 },
77 { 8, -40, 11 }, { 10, -157, -19 },
78 { 10, -77, 35 }, { 6, 248, 17 },
79 { 7, 300, 41 }, { 9, 172, 27 },
80 { 9, 194, 12 }, { 9, 291, 17 },
81 { 9, 290, 35 }, { 0, 233, 20 },
82 { 8, 206, 17 }, { 10, 187, 42 }
83 },
84 {
85 { 3, -97, -6 }, { 3, 89, 9 },
86 { 6, 151, -4 }, { 7, -91, -39 },
87 { 7, -78, -16 }, { 7, -56, 41 },
88 { 7, 124, 1 }, { 7, -118, 0 },
89 { 9, -107, -37 }, { 9, -127, 38 },
90 { 9, -102, 21 }, { 9, -67, 35 },
91 { 9, -54, -14 }, { 9, 12, 34 },
92 { 9, 35, 39 }, { 9, 31, 21 },
93 { 9, 130, 35 }, { 9, 185, 10 },
94 { 0, -42, -3 }, { 0, 75, 35 },
95 { 0, 177, 42 }, { 8, -126, -39 },
96 { 10, -16, 37 }, { 10, 148, 5 },
97 { 1, -3, 45 }, { 6, 160, 38 },
98 { 7, 154, 16 }, { 9, 188, 3 },
99 { 9, 150, 37 }, { 9, 214, 31 },
100 { 9, 302, 16 }, { 8, 200, 15 }
101 },
102 {
103 { 6, 103, 18 }, { 7, -114, 4 },
104 { 7, -142, 39 }, { 7, 48, 23 },
105 { 7, 88, 44 }, { 9, -67, -30 },
106 { 9, -134, -24 }, { 9, -82, -1 },
107 { 9, -45, 19 }, { 9, -153, 46 },
108 { 9, -8, 48 }, { 9, 11, 24 },
109 { 9, 64, 27 }, { 9, 141, 38 },
110 { 9, 154, 12 }, { 0, -105, -20 },
111 { 0, 18, 14 }, { 0, 134, 20 },
112 { 8, -153, -11 }, { 10, -76, 64 },
113 { 10, 33, 18 }, { 1, -85, -28 },
114 { 1, -154, 14 }, { 1, 148, 21 },
115 { 3, 198, 23 }, { 6, 260, 14 },
116 { 7, 238, 19 }, { 9, 165, 14 },
117 { 9, 221, 22 }, { 0, 246, 16 },
118 { 8, 221, 33 }, { 1, 282, 22 }
119 }
120};
121/* 0x00465aa8 */
123 0, 8, 16, 24
124};
125/* 0x00465ab8 */
126static const char *apszLandingDamageComments[4] = {
127 "You got away pretty clean, sir!",
128 "Looks like it got a little hot out there, sir!",
129 "You sure got yourself shot up, sir!",
130 "Glad to see you made it back alive, sir."
131};
132/* 0x00465ac8 */
133static signed char acLandingCanopyFramesHeavy[24] = {
134 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10,
135 10, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0x40
136};
137/* 0x00465ae0 */
138static signed char acLandingCanopyFramesLight[24] = {
139 0, 1, 2, 3, 11, 12, 13, 14, 14, 14, 14, 14,
140 14, 14, 13, 12, 11, 3, 2, 1, 0, 0x40, 0, 0
141};
142/* 0x00465af8 */
143static signed char acLandingCanopyFramesModerate[16] = {
144 0, 15, 16, 17, 18, 19, 19, 18,
145 17, 16, 15, 0, 0x40, 0, 0, 0
146};
147/* 0x00465b08 */
154/* 0x00465b18 */
156 { 234, 83 }, { 248, 85 }, { 260, 80 }, { 273, 78 },
157 { 286, 75 }, { 299, 76 }, { 310, 74 }
158};
159/* 0x00465b38 */
160static short asFuneralSceneBySeries[13] = {
161 0, 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 2, 3
162};
163static int bFuneralShowTheEnd = 0; /* 0x00465b54 */
164
166signed char acScrambleShipDetailSlots[24]; /* 0x005a86d0 */
167signed char cCutsceneScrambleWalkTime; /* 0x005a86e8 */
170struct Shape *pSceneScrambleBgShapePtr; /* 0x005a870c */
171short nFuneralParticleDistance; /* 0x005a8710 */
172short nScrambleBackdropPositionY; /* 0x005a8712 */
173short nScrambleBackgroundRightCoordX; /* 0x005a8714 */
175short nSceneFuneralMainScale; /* 0x005a871c */
176short nFuneralRifleFrame; /* 0x005a871e */
177short nCutsceneFuneralBaseX; /* 0x005a8720 */
178short nCutsceneFuneralBasePosY; /* 0x005a8722 */
179/* The player's ship on the flight deck (DOS g_deckShipX/g_deckShipY). */
181short nFuneralParticleScale; /* 0x005a8728 */
182struct Shape *pCurrentScrambleHangarShape; /* 0x005a872c */
183struct Shape *pScrambleCockpitShapePtr; /* 0x005a8730 */
184short nSceneScrambleWalkerPositionY; /* 0x005a8734 */
185
186/* Function start: 0x407710 */
187short __stdcall GetShapeFrameExtent(short x, short y,
188 struct Shape *shape, short frame,
189 short extent)
190{
191 short bounds[4];
192
193 GetShapeFrameBounds(bounds, x, y, shape, frame);
194 return bounds[extent];
195}
196
197/* Function start: 0x407750 */
198unsigned int AnimateScrambleWalk(short ticks)
199{
200 signed char elapsed;
201
203 for (elapsed = 0; elapsed < ticks; elapsed++) {
206 if (nFrameSkipCounter < 1) {
212 (short)(nScrambleBackgroundX +
213 320),
216 (short)(nScrambleBackgroundX +
217 640),
220 (short)(nScrambleBackgroundX +
221 960),
223
239
254 cScrambleWalkerPair * 2 + 1]);
256 DIBslam();
257 DIBslamReal();
258
265 }
272 if (bEscapePressedFlag == 1)
273 break;
274 }
275 return 0;
276}
277
278/* Function start: 0x4079C0 */
279unsigned int PlayScrambleHangarScene(void)
280{
281 int soundHandle; /* Unset in the original; ignored by the Win32 callee. */
282
283 if (nMemoryConfig == 1)
284 SceneLeaveHook(0x1b);
285 else
287 spacetrack(0x1b, 1, -1);
288
298 (signed char)((RandomWord() + 3) % 4);
299 PlaySfxWaveFileByNumber(14, -1, 0);
301
303 if (bEscapePressedFlag != 1) {
315 if (nFrameSkipCounter < 1) {
321 (short)(nScrambleBackgroundX +
322 320),
325 (short)(nScrambleBackgroundX +
326 640),
339 DIBslam();
340 DIBslamReal();
341
348 }
350 (short)(nScrambleBackgroundX - 12);
352 (short)(nScrambleLeftWalkerX + 2);
354 (short)(nScrambleRightWalkerX + 3);
355 if (bEscapePressedFlag == 1)
356 break;
357 }
358
359 if (bEscapePressedFlag != 1) {
363 }
364 }
365
366 FlushSoundEffectsAndLog(soundHandle, 10);
369 return 0;
370}
371
372/* Function start: 0x407C90 */
373unsigned int DrawScrambleActor(short actorIndex)
374{
375 signed char frame;
376 short x;
377 unsigned char control;
378 signed char animationFrame;
379 short y;
380
381 frame = 0;
382 if ((animationFrame = aScrambleAnimationActors[
383 actorIndex].animationFrame) != -1) {
385 actorIndex].animationState != 0xa000) {
386 animationFrame++;
387 do {
389 actorIndex].animation[animationFrame];
390 control = (unsigned char)frame & 0xc0;
391 switch (control) {
392 case 0:
394 actorIndex].animationFrame++;
395 break;
396 case 0x40:
398 actorIndex].animationState = 0;
399 animationFrame--;
400 break;
401 case 0x80:
402 animationFrame = frame & 0x3f;
404 actorIndex].animationFrame = animationFrame;
405 break;
406 }
407 } while (control != 0);
408 } else
409 frame = animationFrame;
410 }
411
412 frame += aScrambleAnimationActors[actorIndex].baseFrame;
414 (aScrambleAnimationActors[actorIndex].x +=
415 aScrambleAnimationActors[actorIndex].deltaX);
417 (aScrambleAnimationActors[actorIndex].y +=
418 aScrambleAnimationActors[actorIndex].deltaY);
421 x,
422 y,
423 aScrambleAnimationActors[actorIndex].shape,
424 (short)frame,
425 aScrambleAnimationActors[actorIndex].angle,
426 aScrambleAnimationActors[actorIndex].scale,
427 aScrambleAnimationActors[actorIndex].flip);
428 return 0;
429}
430
431/* Function start: 0x407D90 */
432unsigned int ConfigureScrambleActor(short x, short y, short deltaX,
433 short deltaY, struct Shape *shape,
434 short scale, short angle,
435 signed char flip, short actorIndex)
436{
437 aScrambleAnimationActors[actorIndex].x = x;
438 aScrambleAnimationActors[actorIndex].y = y;
439 aScrambleAnimationActors[actorIndex].deltaX = deltaX;
440 aScrambleAnimationActors[actorIndex].deltaY = deltaY;
441 aScrambleAnimationActors[actorIndex].shape = shape;
442 if (aScrambleAnimationActors[actorIndex].animationFrame != -1)
444 aScrambleAnimationActors[actorIndex].scale = scale;
445 aScrambleAnimationActors[actorIndex].angle = angle;
446 aScrambleAnimationActors[actorIndex].flip = flip;
447 return 0;
448}
449
450/* Function start: 0x407E10 */
451unsigned int DrawScrambleFrame(void)
452{
453 short detailIndex;
454 short detailSlot;
455 const ScrambleShipDetail *detail;
456
458 if (nFrameSkipCounter < 1) {
460
473
474 if (bScrambleCanopyClosed == 0) {
476 (short)(stScramblePlayerShipPos.x + 40),
477 (short)(stScramblePlayerShipPos.y - 40),
480 }
481
485 (short)(stScramblePlayerShipPos.x + 10),
486 (short)(stScramblePlayerShipPos.y - 25),
496 nScrambleCockpitAngle, 255, 0);
497 break;
500 (short)(stScramblePlayerShipPos.x + 10),
501 (short)(stScramblePlayerShipPos.y - 16),
508 (short)(stScramblePlayerShipPos.x + 153),
509 (short)(stScramblePlayerShipPos.y + 5),
515 break;
518 (short)(stScramblePlayerShipPos.x + 10),
519 (short)(stScramblePlayerShipPos.y - 15),
526 (short)(stScramblePlayerShipPos.x + 148),
533 break;
536 (short)(stScramblePlayerShipPos.x + 10),
537 (short)(stScramblePlayerShipPos.y - 11),
544 (short)(stScramblePlayerShipPos.x + 158),
545 (short)(stScramblePlayerShipPos.y + 6),
551 break;
552 }
553
555 detailIndex = 0;
556 do {
557 detailSlot = acScrambleShipDetailSlots[detailIndex];
558 detail = &aaScrambleShipDetails[
559 stCampaignState.playerShipType][detailSlot];
561 (short)(stScramblePlayerShipPos.x + detail->x),
562 (short)(stScramblePlayerShipPos.y + detail->y),
564 detail->frame);
565 detailIndex++;
566 } while (detailIndex < nSceneScrambleShipDetailCountValue);
567 }
568
569 if (bScrambleCanopyClosed == 1) {
570 if (stScrambleOverlay.x != -1000) {
575 }
579 }
581 DIBslam();
582 DIBslamReal();
583 }
584 return 0;
585}
586
587/* Preserve the scramble actor and sound declaration context. */
588unsigned int ConfigureScrambleActor(short x, short y, short deltaX,
589 short deltaY, struct Shape *shape,
590 short scale, short angle,
591 signed char flip, short actorIndex);
592void FlushSoundEffectsAndLog(int soundHandle, short fadeTicks);
593unsigned int ReleaseMusicTrackHook(short track);
594
595/* Function start: 0x408200 (Mac symbol: scramble) */
596unsigned int scramble(void)
597{
598 struct Shape *actorShape;
599 short frame;
600 int scrambleSound;
601 int canopySound; /* Unset after the Win32 sound-call replacements. */
602
605 stScrambleOverlay.x = -1000;
607 if (bEscapePressedFlag == 0) {
610 (signed char)(stCampaignState.playerShipType + 17);
612 cCockpitLogicalFile, 8, 0);
620 actorShape = FetchDiskPacketRetrying(1, 4, 0);
624
625 ConfigureScrambleActor(130, 94, 1, 0, actorShape,
626 0x100, 0, 0, 0);
627 ConfigureScrambleActor(160, 120, 0, 0, actorShape,
628 0x100, 0, 0, 2);
629 ConfigureScrambleActor(260, 100, -3, 0, actorShape,
630 0xff, 0, 0x10, 3);
631 ConfigureScrambleActor(260, 100, -3, 0, actorShape,
632 0xff, 0, 0x10, 4);
633 PlaySfxWaveFileByNumber(17, -1, 0);
635
643 break;
649 break;
655 break;
661 break;
662 }
663
665 for (frame = 0; frame < 10; frame++) {
669 (short)(stScramblePlayerShipPos.y - 2);
671 (short)(stScrambleCockpitDetail.y - 2);
673 (short)(stScramblePlayerShipPos.x + 4);
675 (short)(stScrambleCockpitDetail.x + 4);
677 if (bEscapePressedFlag == 1)
678 break;
679 }
680
681 if (bEscapePressedFlag != 1) {
683 for (frame = 0; frame < 27; frame++) {
692 if (bEscapePressedFlag == 1)
693 break;
694 }
695 if (bEscapePressedFlag != 1) {
696 FlushSoundEffectsAndLog(scrambleSound, 0);
698 PlaySfxWaveFileByNumber(15, -1, 0);
700 for (frame = 0; frame < 23; frame++) {
702 if (frame == 22)
708 (short)(nScrambleCockpitAngle + 2);
709 break;
713 (short)(stScrambleCockpitDetail.x - 2);
714 break;
716 if (frame == 21)
718 else
720 (short)(stScrambleCockpitDetail.x - 2);
721 break;
722 }
725 if (bEscapePressedFlag == 1)
726 break;
727 }
728
729 FlushSoundEffectsAndLog(canopySound, 0);
730 PlaySfxWaveFileByNumber(16, -1, 0);
731 if (bEscapePressedFlag != 1)
732 WaitForSceneAdvance(60, 0);
733 }
734
735 }
736
742 ReleasePacketHandle(actorShape);
745 }
746
747 if (nMemoryConfig == 0) {
750 }
751 return 0;
752}
753
754/* Preserve the landing resource and event declaration context. */
755void *FetchDiskPacketRetrying(short logicalFile, short section, short flags);
756unsigned int spacetrack(int track, int mode, short enabled);
757void __stdcall SetEventManagerPump(void (*pump)(void));
758unsigned int ReleaseTextFont(short fontIndex);
759
760/* Function start: 0x408650 (Mac symbol: landing) */
761unsigned int landing(signed char damageLevel)
762{
763 struct Shape *actorShape;
764 short frame;
765 signed char detail;
766 signed char prior;
767 int landingSound;
768 int canopySound; /* Unset after the Win32 sound-call replacements. */
769
771 spacetrack(0x1d, 2, 1);
775 anLandingDamageDetailCounts[damageLevel];
776 for (frame = 0;
778 frame++) {
779 do {
780 detail = RandomInRange(0, 31);
781 for (prior = 0; prior < frame; prior++) {
782 if (acScrambleShipDetailSlots[prior] ==
783 detail)
784 break;
785 }
786 } while (prior < frame);
787 acScrambleShipDetailSlots[frame] = detail;
788 }
789
791 (signed char)(stCampaignState.playerShipType + 17);
794 cCockpitLogicalFile, 8, 0);
799 actorShape = FetchDiskPacketRetrying(1, 4, 0);
811 ConfigureScrambleActor(140, 88, 2, 0, actorShape,
812 0x80, 0, 0, 3);
813 ConfigureScrambleActor(139, 88, 2, 0, actorShape,
814 0x80, 0, 0, 4);
815 ConfigureScrambleActor(240, 94, -1, 0, actorShape,
816 0x100, 0, 0x10, 0);
817 ConfigureScrambleActor(160, 120, 0, 0, actorShape,
818 0x100, 0, 0, 2);
821 stScrambleOverlay.x = -1000;
822
830 break;
836 break;
842 break;
848 break;
849 }
850
851 frame = 0;
853 PlaySfxWaveFileByNumber(17, -1, 0);
855 for (; frame < 30; frame++) {
859 (short)(stScramblePlayerShipPos.y - 2);
861 (short)(stScrambleCockpitDetail.y - 2);
862 if (bEscapePressedFlag == 1)
863 break;
864 }
865
866 FlushSoundEffectsAndLog(landingSound, 0);
867 if (bEscapePressedFlag != 1) {
868 short canopyFrame;
869 const signed char *canopyFrames;
870
872 (short)(stScramblePlayerShipPos.x + 180);
873 canopyFrames = apLandingCanopyFrames[damageLevel];
875 (short)(stScramblePlayerShipPos.y + 50);
876 PlaySfxWaveFileByNumber(15, -1, 0);
878 for (canopyFrame = 0; canopyFrame < 30; canopyFrame++) {
880 if (nRenderedSpaceFrame == 29)
885 (short)(stScrambleOverlay.x - 4);
889 (short)(nScrambleCockpitAngle - 2);
890 break;
894 (short)(stScrambleCockpitDetail.x + 2);
895 break;
897 if (canopyFrame == 0)
899 else
901 (short)(stScrambleCockpitDetail.x + 2);
902 break;
903 }
904 if (canopyFrame > 6 && *canopyFrames != 0x40) {
905 nScrambleCanopyOffset = *canopyFrames;
906 canopyFrames++;
907 }
908 if (bEscapePressedFlag == 1)
909 break;
910 }
911
912 FlushSoundEffectsAndLog(canopySound, 0);
913 if (bEscapePressedFlag != 1) {
917 "%X%Y%F%s%P", 0, 160,
919 apszLandingDamageComments[damageLevel]);
920 DIBslam();
921 DIBslamReal();
923 WaitForSceneAdvance(300, 0);
924 }
925 }
926
931 ReleasePacketHandle(actorShape);
940 return 0;
941}
942
943/* Function start: 0x408B30 (Mac symbol: funeral_player) */
944unsigned int funeral_player(void)
945{
946 short index;
947
949 if (nFrameSkipCounter < 1) {
953 (short)(0x7000L / nFuneralMainDist);
962 8, 0, nSceneFuneralMainScale, 0);
977
979 (short)(0x1000L / nFuneralParticleDistance);
980 for (index = 0; index < 7; index++) {
981 if (aFuneralParticlesArray[index].x != 0) {
984 aFuneralParticlesArray[index].x,
985 aFuneralParticlesArray[index].y,
988 aFuneralParticlesArray[index].x -= 6;
989 aFuneralParticlesArray[index].y -= 6;
990 if (stSceneBuffer.top >
992 aFuneralParticlesArray[index].x = 0;
993 }
994 }
995
1001 (short)(stCutsceneFuneralForeground.x + 180),
1004 if (bFuneralShowTheEnd != 0)
1006 "THE END");
1008 DIBslam();
1009 DIBslamReal();
1010 }
1011 return 0;
1012}
1013
1014/* Function start: 0x408D50 (Mac symbol: funeral_wingman) */
1015unsigned int funeral_wingman(char *text, short duration)
1016{
1017 AddPCName(text);
1019 cBlackColour);
1020 FormatTextBufferFromStart("%X%Y%F%s%P",
1021 0, 160,
1025 SetFrameTimerPeriodDirect(duration);
1026 while ((short)IsFrameTickElapsed() == 0) {
1029 if (bEscapePressedFlag == 1)
1030 break;
1031 if (CheckEscaped() != 0)
1032 break;
1033 }
1034 return 0;
1035}
1036
1037/* Preserve the funeral resource and scene declaration context. */
1038void *FetchDiskPacketRetrying(short logicalFile, short section, short flags);
1039void FreePacketAndClear(void *slot, unsigned short releaseFlags);
1040unsigned int InitializeConstellationField(Viewport *viewport,
1041 short direction, short density);
1042void __stdcall FadeViewportPaletteToColour(Viewport *viewport,
1043 unsigned short colour,
1044 short enabled);
1045unsigned int SceneDirector(short sceneType, unsigned char *sceneData,
1046 unsigned char *textData);
1047
1048/* Function start: 0x408DE0 (Mac symbol: funeral_sequence) */
1049unsigned int funeral_sequence(int playerFuneral)
1050{
1051 int *packet;
1052 unsigned char *sceneData;
1053 unsigned char *textData;
1054 unsigned char *followupSceneData;
1055 short frame;
1056 unsigned char *followupTextData;
1057 short volley;
1058 short particle;
1059 short scenePair;
1060
1063 spacetrack(0x20, 1, 0);
1064 packet = FetchDiskPacketRetrying(
1066 0, 0);
1068
1069 if (playerFuneral != 0) {
1070 scenePair = (short)(
1073 followupSceneData = (unsigned char *)packet + packet[0];
1074 followupTextData = (unsigned char *)packet + packet[1];
1075 sceneData = (unsigned char *)packet + packet[scenePair + 2];
1076 textData = (unsigned char *)packet + packet[scenePair + 3];
1077 pIntroFont =
1078 FetchDiskPacketRetrying(9, 1, 0);
1079 } else {
1080 followupSceneData = (unsigned char *)packet + packet[10];
1081 followupTextData = (unsigned char *)packet + packet[11];
1082 sceneData = (unsigned char *)packet + packet[12];
1083 textData = (unsigned char *)packet + packet[13];
1084 }
1085
1088 nFuneralCasketPosY = 70;
1090 nFuneralMainDist = 112;
1097 for (particle = 0; particle < 7; particle++) {
1098 aFuneralParticlesArray[particle].x = 0;
1099 }
1100
1101 frame = 0;
1105 FetchDiskPacketRetrying(4, 9, 0);
1110 SceneDirector(3, sceneData, textData);
1111
1112 if (bEscapePressedFlag != 1) {
1115 cBlackColour);
1117 for (; frame < 10; frame++) {
1120 if (bEscapePressedFlag == 1)
1121 break;
1122 }
1123
1124 if (bEscapePressedFlag != 1) {
1126 "%X%Y%FCompany...%P", 0, 160,
1127 cBlueColour);
1129 for (frame = 0; frame < 15; frame++) {
1132 if (bEscapePressedFlag == 1)
1133 break;
1134 }
1136 cBlackColour);
1137
1138 if (bEscapePressedFlag != 1) {
1139 frame = 0;
1142 "%X%YAtten-SHUN!%P", 0, 160);
1143 for (; frame < 10; frame++) {
1146 if (frame == 0)
1147 PlaySfxWaveFileByNumber(0x24, -1, 0);
1148 if (bEscapePressedFlag == 1)
1149 break;
1150 }
1151
1152 if (bEscapePressedFlag != 1) {
1154 frame = 0;
1156 for (; frame < 10; frame++) {
1159 if (bEscapePressedFlag == 1)
1160 break;
1161 }
1162
1163 if (bEscapePressedFlag != 1) {
1166 cBlackColour);
1169 "%X%YPrepare arms!%P",
1170 0, 160);
1171 for (frame = 10; frame != 0; frame--) {
1174 }
1175
1176 frame = 0;
1179 for (; frame < 10; frame++) {
1182 if (frame == 0)
1183 PlaySfxWaveFileByNumber(0x1f, -1, 0);
1184 if (bEscapePressedFlag == 1)
1185 break;
1186 }
1187
1188 if (bEscapePressedFlag != 1) {
1189 SceneDirector(3, followupSceneData,
1190 followupTextData);
1193
1194 if (bEscapePressedFlag != 1) {
1195 for (volley = 0; volley < 3; volley++) {
1198 cBlackColour);
1200 "%X%Y%FFire!%P",
1201 0, 160, cBlueColour);
1202 if (volley == 1)
1204 0x1e, -1, 0);
1205
1206 frame = 0;
1208 for (; frame < 10; frame++) {
1211 if (volley > 0) {
1214 2 == 0)
1218 160) {
1220 2;
1222 }
1223 }
1224 if (bEscapePressedFlag == 1)
1225 break;
1226 }
1227
1230 cBlackColour);
1231 if (bEscapePressedFlag == 1)
1232 break;
1233
1235 for (particle = 0;
1236 particle < 7;
1237 particle++) {
1238 aFuneralParticlesArray[particle].x =
1239 (short)(
1241 particle].x +
1243 aFuneralParticlesArray[particle].y =
1244 (short)(
1246 particle].y +
1248 }
1249
1250 frame = 0;
1251 PlaySfxWaveFileByNumber(0x1d, -1, 0);
1253 for (; frame < 24; frame++) {
1256 if (volley > 0) {
1259 2 == 0)
1263 160) {
1265 2;
1267 }
1268 }
1270 if (bEscapePressedFlag == 1)
1271 break;
1272 }
1273
1274 if (bEscapePressedFlag == 1)
1275 break;
1276 }
1277
1278 if (bEscapePressedFlag != 1) {
1279 frame = 0;
1281 SetMusBreakpt(0, 0);
1282 while (bEscapePressedFlag == 0) {
1286 if (nFuneralCasketPositionX % 2 ==
1287 0)
1289 frame++;
1294 if (frame == 110 &&
1295 playerFuneral != 0)
1297
1298 if (nMusicPlaybackMode == 0 ||
1299 nWaitForMusicEnabled == 0 ||
1300 nMusicPlaybackMode == 3) {
1301 if (frame > 160)
1302 break;
1303 } else if (GetMusicMode() != 0) {
1304 break;
1305 }
1306 }
1307 }
1308 }
1309 }
1310 }
1311 }
1312 }
1313 }
1314 }
1315
1316 if (playerFuneral != 0)
1318 ReleasePacketHandle(packet);
1321 ReleaseTextFont(0);
1333 return 0;
1334}
1335
1336/* Function start: 0x4094E0 */
1337unsigned int RunAnimationDemoLoop(signed char animation)
1338{
1339 switch (animation) {
1340 case 0:
1345 break;
1346 case 1:
1351 break;
1352 case 2:
1355 break;
1356 case 3:
1358 break;
1359 case 4:
1360 scramble();
1362 break;
1363 case 5:
1367 free_3Space();
1369 break;
1370 case 6:
1371 landing(3);
1373 break;
1374 case 7:
1376 break;
1377 case 8:
1378 RecRoom();
1379 break;
1380 case 10:
1383 break;
1384 case 11:
1386 break;
1387 case 12:
1389 break;
1390 case 13:
1392 break;
1393 }
1394
1395 switch (animation) {
1396 case 14:
1397 landing((signed char)(animation - 14));
1399 break;
1400 case 15:
1401 Office();
1402 break;
1403 case 16:
1405 break;
1406 case 17:
1408 break;
1409 case 18:
1414 break;
1415 case 19:
1420 break;
1421 case 20:
1426 break;
1427 case 21:
1432 break;
1433 case 22:
1435 break;
1436 case 23:
1439 break;
1440 case 24:
1445 break;
1446 case 25:
1449 break;
1450 }
1451 exit_squadron("Animation demo over.");
1452 return 0;
1453}
static short nScrambleBackgroundX
Definition cutscene.c:26
static unsigned short ausScrambleActorAnimationA[8]
Definition cutscene.c:28
ShortPoint stScramblePlayerShipPos
Definition cutscene.c:180
static unsigned short ausScrambleActorAnimationB[11]
Definition cutscene.c:32
static const signed char * apLandingCanopyFrames[4]
Definition cutscene.c:148
static signed char cScrambleLeftWalkerFrame
Definition cutscene.c:18
static const char * apszLandingDamageComments[4]
Definition cutscene.c:126
static short nScrambleLeftWalkerX
Definition cutscene.c:24
static signed char acLandingCanopyFramesModerate[16]
Definition cutscene.c:143
static ShortPoint aFuneralParticleOrigins[7]
Definition cutscene.c:155
static signed char acLandingCanopyFramesHeavy[24]
Definition cutscene.c:133
static ScrambleShipDetail aaScrambleShipDetails[4][32]
Definition cutscene.c:47
static signed char acLandingCanopyFramesLight[24]
Definition cutscene.c:138
static int bFuneralShowTheEnd
Definition cutscene.c:163
static ScrambleAnimationActor aScrambleAnimationActors[5]
Definition cutscene.c:36
static signed char acScrambleWalkerOverlayFrames[8]
Definition cutscene.c:21
static short asFuneralSceneBySeries[13]
Definition cutscene.c:160
static int anLandingDamageDetailCounts[4]
Definition cutscene.c:122
static short nScrambleRightWalkerX
Definition cutscene.c:25
static signed char cScrambleRightWalkerFrame
Definition cutscene.c:19
unsigned char bEscapePressedFlag
Definition mathfp.c:24
short asCampaignBriefingFiles[3]
Definition barracks.c:57
short nCampaignDataSet
Definition gameflow.c:30
short nRenderedSpaceFrame
Definition input.c:22
int nMemoryConfig
Definition ship.c:58
short nFuneralParticleDistance
Definition cutscene.c:171
unsigned char cBlackColour
Definition init.c:12
signed char cCutsceneScrambleWalkTime
Definition cutscene.c:167
struct Shape * pScrambleCockpitShapePtr
Definition cutscene.c:183
char szTxtWorkspaceBuffer[256]
Definition screens.c:164
short nFuneralRifleFrame
Definition cutscene.c:176
Viewport * pScrambleView
Definition mission.c:61
short nConvTextColorValue
Definition screens.c:170
short nFuneralCasketPosY
Definition brains.c:27
ShortPoint aFuneralParticlesArray[7]
Definition cutscene.c:169
short nFuneralParticleScale
Definition cutscene.c:181
unsigned char cBlueColour
Definition init.c:14
struct Shape * pScrambleOverlayShape
Definition fl.c:81
short nFrameSkipCounter
Definition main.c:23
struct Shape * pScrambleDetailShape
Definition brains.c:23
struct Shape * pCurrentConversationSpecialShape
Definition cutscene.c:168
signed char cScrambleWalkerPair
Definition cmpgn.c:18
ShortPoint stCutsceneFuneralForeground
Definition cutscene.c:174
short nFuneralSequenceActive
Definition music.c:20
short nScrambleBackgroundRightCoordX
Definition cutscene.c:173
ShortPoint stScrambleCockpitDetail
Definition brains.c:25
short nSceneScrambleCanopyFrameValue
Definition mission.c:62
struct Shape * pScrambleCanopyShape
Definition cmpgn.c:19
short nFrameSkip
Definition main.c:24
Viewport stCurrentConvTextViewport
Definition timer.c:17
Viewport stSceneBuffer
Definition select.c:17
unsigned char cPrimaryViewBufferColour
Definition init.c:27
struct Shape * pCurrentScrambleHangarShape
Definition cutscene.c:182
signed char cCockpitLogicalFile
Definition logic.c:107
short nScrambleCockpitAngle
Definition brains.c:24
Viewport stScreenView
Definition launch.c:50
ShortPoint stScrambleOverlay
Definition fl.c:80
signed char acScrambleShipDetailSlots[24]
Definition cutscene.c:166
short nSceneFuneralMainScale
Definition cutscene.c:175
short nCutsceneFuneralBasePosY
Definition cutscene.c:178
short nScrambleCanopyOffset
Definition fl.c:76
short nMusicPlaybackMode
Definition music.c:14
CampaignState stCampaignState
Definition dib.c:107
struct Shape * pSceneScrambleBgShapePtr
Definition cutscene.c:170
signed char bScrambleCanopyClosed
Definition fl.c:78
short nScrambleBackdropPositionY
Definition cutscene.c:172
short nCutsceneFuneralBaseX
Definition cutscene.c:177
short nFuneralCasketPositionX
Definition brains.c:26
short nSceneScrambleWalkerPositionY
Definition cutscene.c:184
short nFuneralMainDist
Definition fl.c:77
int nWaitForMusicEnabled
Definition music.c:28
struct Shape * pScrambleShipShape
Definition cmpgn.c:20
short nSceneScrambleShipDetailCountValue
Definition cutscene.c:165
struct Shape * pIntroFont
Definition eject.c:29
short nCurrentConversationMedalIndex
Definition screens.c:167
short nCutsceneFuneralGuardFrame
Definition fl.c:79
enum ObjectType playerShipType
Definition wcdata.h:711
signed char currentSeries
Definition wcdata.h:715
signed char currentMission
Definition wcdata.h:714
struct Shape * shape
Definition wcdata.h:681
signed char baseFrame
Definition wcdata.h:677
signed char animationFrame
Definition wcdata.h:678
signed char animationState
Definition wcdata.h:679
signed char flip
Definition wcdata.h:684
const unsigned short * animation
Definition wcdata.h:680
signed char frame
Definition wcdata.h:690
short y
Definition wcdata.h:416
short x
Definition wcdata.h:415
short top
Definition wc1base.h:77
Umbrella header for the game core.
unsigned int RefreshMemoryStatusOverlay(void)
Definition main.c:467
unsigned int Briefing(short series, short mission)
Definition cmpgn.c:413
unsigned int InitializeConversationText(void)
Definition main.c:448
short RecRoom(void)
Definition killbrd.c:331
void FormatTextBufferFromStart(const char *format,...)
Definition cockpt.c:211
void SceneLeaveHook()
Definition music.c:151
void PollJoystickButtonEvents(void)
Definition input.c:76
void DIBslam(void)
Definition dib.c:513
void ShowMeanwhileTransition(short scene, short variant)
Definition pilot.cpp:36
unsigned int AwardCampaignMedal(short medal)
Definition screens.c:263
void LaunchPlayerShip(void)
Definition launch.c:84
unsigned int free_3Space(void)
Definition logic.c:1975
unsigned int free_inflight_music(void)
Definition logic.c:2024
void * FetchDiskPacketRetrying(short logicalFile, short section, short flags)
Definition disk.c:126
unsigned int RunAnimationDemoLoop(signed char animation)
Definition cutscene.c:1337
int Title_Sequence(void)
Definition title.c:119
void DrawSpriteScaled(Viewport *viewport, short x, short y, struct Shape *shape, short frame, short angle, short scale, short flip)
Definition gr.c:1176
short __stdcall GetShapeFrameExtent(short x, short y, struct Shape *shape, short frame, short extent)
Definition cutscene.c:187
void ClearInputKeyStatePreservingModifiers(void)
Definition eventmgr.c:787
unsigned int spacetrack(int track, int mode, short enabled)
Definition music.c:411
unsigned int DrawConstellationField(void)
Definition view.c:289
unsigned int landing(signed char damageLevel)
Definition cutscene.c:761
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
unsigned int funeral_player(void)
Definition cutscene.c:944
int IsFrameTickElapsed(void)
Definition eventmgr.c:629
void RestoreGamePalette(void)
Definition winmain.c:76
void StopMusicUnlessSuppressed(void)
Definition music.c:419
void FlushInputEvents(void)
Definition eventmgr.c:381
unsigned short GetMusicMode(void)
Definition music.c:426
void DIBslamReal(void)
Definition dib.c:519
short WaitForInputKey(void)
Definition disk.c:467
unsigned int PreloadMusicTrackHook(short track)
Definition logic.c:2044
unsigned int SceneDirector(short sceneType, unsigned char *sceneData, unsigned char *textData)
Definition screens.c:1212
unsigned int init_constellation(short scene)
Definition logic.c:1665
void SetMusBreakpt(int first, int second)
Definition music.c:124
void __stdcall SetEventManagerPump(void(*pump)(void))
Definition strdos.c:126
void WaitForSceneAdvance(short duration, short unused)
Definition disk.c:509
unsigned int PumpWindowMessages(void)
Definition winmain.c:740
unsigned int init_3Space_objects()
unsigned int funeral_sequence(int playerFuneral)
Definition cutscene.c:1049
short BarracksScreen(void)
Definition barracks.c:975
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
unsigned int DrawScrambleFrame(void)
Definition cutscene.c:451
void __stdcall SetFrameTimerPeriodDirect(short p)
Definition eventmgr.c:617
unsigned int ShowTigerClawEscapeScene(void)
Definition ending.c:368
unsigned int ShowCarrierLaunchSequence(signed char sceneObject)
Definition launch.c:145
void __stdcall FadeViewportPaletteToColour(Viewport *viewport, unsigned short colour, short enabled)
Definition main.c:2213
int print_subtitle(Viewport *viewport, short colour, const char *text)
Definition mono.c:197
unsigned int scramble(void)
Definition cutscene.c:596
unsigned int ReleaseMusicTrackHook(short track)
Definition logic.c:2051
unsigned int ResetScreenClipToFullHeight(void)
Definition main.c:439
unsigned int free_constellation(void)
Definition logic.c:1697
unsigned int PlayScrambleHangarScene(void)
Definition cutscene.c:279
void ClearViewport(Viewport *viewport, short colour)
Definition gr.c:963
void exit_squadron(const char *msg)
Definition main.c:122
short __stdcall GetShapeFrameBounds(short *bounds, short x, short y, struct Shape *shape, short frame)
Definition mathfp.c:195
unsigned int funeral_wingman(char *text, short duration)
Definition cutscene.c:1015
unsigned int InitializeCockpitResources(signed char mode)
Definition logic.c:1741
unsigned int DeBriefing(short series, short mission)
Definition cmpgn.c:434
void PlaySfxWaveFileByNumber()
unsigned int death_sequence(void)
Definition screens.c:1645
void ReleasePacketHandle(void *handle)
Definition ending.c:50
void FlushSoundEffectsAndLog(int soundHandle, short fadeTicks)
Definition music.c:714
unsigned int Office(void)
Definition cmpgn.c:478
short CheckEscaped(void)
Definition disk.c:442
void FreePacketAndClear(void *slot, unsigned short releaseFlags)
Definition mathutil.c:37
unsigned int ReleaseTextFont(short fontIndex)
Definition disk.c:222
void FlushSoundEffects(void)
Definition music.c:144
short __stdcall RandomInRange(short lo, short hi)
Definition mathfp.c:49
unsigned int AnimateScrambleWalk(short ticks)
Definition cutscene.c:198
unsigned int InitializeConstellationField(Viewport *viewport, short direction, short density)
Definition view.c:238
unsigned short RandomWord(void)
Definition mathfp.c:43
char * AddPCName(const char *text)
Definition cmpgn.c:102
unsigned int InitializeConversationViewport(void)
Definition main.c:422
unsigned int ShowCampaignVictorySequence(void)
Definition ending.c:132
@ OBJECT_TYPE_SCIMITAR
Definition wcdata.h:57
@ OBJECT_TYPE_RAPTOR
Definition wcdata.h:58
@ OBJECT_TYPE_RAPIER
Definition wcdata.h:56
@ OBJECT_TYPE_HORNET
Definition wcdata.h:55