Wing Commander
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
screens.c
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup campaign
4 * @brief Briefing, debriefing, medal and funeral screens, and the conversation
5 * scene director.
6 *
7 * Address range 436d00-439c3f. The briefing and medal state precedes this
8 * unit's text-format literals; the hand-written raster library in raster.asm
9 * follows.
10 */
11#include "wc1.h"
12
13/* 0x0046e188 */
15/* 0x0046e190 */
17 {161, 60, 161, 90},
18 {161, 60, 161, 87},
19 {160, 60, 159, 90},
20 {161, 60, 161, 90},
21 {161, 60, 161, 90},
22 {161, 60, 161, 90},
23 {161, 60, 161, 90},
24 {161, 60, 161, 90},
25 {161, 60, 161, 90},
26 {161, 60, 161, 90},
27 {160, 53, 160, 88},
28};
29/* 0x0046e1e8 */
30static signed char abBriefingSmallCharacterAnimation[24] = {
31 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0
33};
34/* 0x0046e200 */
35static signed char abBriefingLargeCharacterAnimation[24] = {
36 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
37 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0
38};
39/* Eight populated records in ten slots: ReturnToBriefingLongShot clears ten
40 * activity bytes, and the two zero records fill the data up to the medal
41 * positions. */
42/* 0x0046e218 */
44 { 60, 123, 10, 95, 176, 1, 0, 2,
46 {316, 123, 264, 94, 176, 1, 2, 1,
48 {193, 123, 141, 95, 176, 1, 3, 1,
50 {250, 124, 199, 93, 176, 1, 4, 1,
52 {124, 123, 71, 94, 176, 1, 5, 1,
54 {103, 122, 29, 76, 256, 1, 6, 2,
56 {191, 122, 118, 76, 256, 1, 8, 1,
58 {287, 122, 212, 76, 256, 1, 9, 1,
60};
61/* 0x0046e2d0 */
62static short asMedalDisplayX[5] = {191, 199, 207, 216, 228};
63/* 0x0046e2e0 */
64const char *apszMedalNames[5] = {
65 "Bronze Star",
66 "Silver Star",
67 "Gold Star",
68 "Golden Sun",
69 "Terran Medal of Valor"
70};
71/* 0x0046e2f4 */
72static struct Shape *pMedalSceneShape = 0;
73/* 0x0046e2f8 */
74static const char *pszMedalsPilotSummary =
75 "$R $N, aka $C.\n$S system, dateline $D.";
76/* 0x0046e300 */
77static signed char aBriefingPortraitOffsetX[8][12] = {
78 { 0, 0, -2, -2, -1, -2, -4, -3, -5, -7, -7, -4},
79 { -1, 0, -2, -3, -3, -4, -3, -4, -6, -8, -7, -6},
80 { 0, 1, 0, 0, 0, 0, 0, -1, -2, -4, -5, -3},
81 { 0, -1, -2, -3, -1, -3, -2, -3, -4, -4, -5, -4},
82 { 2, 0, 0, 0, 0, 0, 0, 0, -2, -3, -4, -2},
83 { 1, 1, 1, 0, 1, 0, -6, -4, -4, -9, -8, -6},
84 { -2, -1, -4, -4, -4, -7, -8, -7, -5, -8, -9, -7},
85 { 0, 0, 0, 0, 0, -3, -3, -7, -5, -7, -8, -7}
86};
87/* 0x0046e360 */
88static signed char aBriefingPortraitOffsetY[8][12] = {
89 { -6, -2, -3, -1, -4,-10,-12,-20,-32,-38,-42,-43},
90 { -5, 0, -4, -4, -7,-12,-16,-23,-32,-37,-42,-42},
91 { -5, -3, 0, 1, 0, -7,-13,-23,-33,-38,-42,-42},
92 { -3, -2, -1, 0, -5,-10,-16,-25,-33,-38,-41,-41},
93 { -6, 0, 2, 0, -6,-11,-18,-25,-33,-39,-42,-42},
94 { -8, -2, 1, -3, -6,-16,-23,-35,-46,-55,-61,-61},
95 { -6, -4, -3, -5, -9,-14,-23,-34,-49,-57,-61,-62},
96 {-10, -5, 0, 0, -3, -7,-24,-32,-47,-55,-59,-60}
97};
98/* 0x0046e3c0 */
99static short aBriefingPortraitScale[8][12] = {
100 {357, 357, 357, 359, 355, 0, 352, 355, 353, 353, 355, 1},
101 {355, 0, 354, 354, 352, 354, 355, 355, 352, 352, 353, 350},
102 {354, 354, 359, 0, 358, 357, 357, 356, 357, 0, 0, 2},
103 {354, 354, 353, 356, 358, 356, 356, 355, 356, 0, 357, 357},
104 { 0, 0, 0, 0, 358, 0, 358, 0, 0, 4, 0, 359},
105 { 0, 358, 358, 0, 357, 0, 350, 354, 357, 354, 0, 358},
106 {356, 356, 352, 354, 352, 349, 350, 352, 0, 0, 0, 0},
107 { 0, 0, 0, 359, 0, 350, 354, 350, 356, 357, 357, 357}
108};
109/* 0x0046e480 */
111 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4
112};
113/* 0x0046e4b0 */
114static int aiBriefingPodiumVelocity[12] = {
115 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6
116};
117/* 0x0046e4e0 */
119 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 7, 8
120};
121/* 0x0046e510 */
122static signed char abBriefingPodiumFrames[40] = {
123 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
124 10, 11, 12, 13, 14, 15, 15, 15, 15, 15,
125 15, 15, 15, 15, 14, 13, 12, 11, 10, 9,
126 8, 7, 6, 5, 4, 0, 0, 0, 0, 0
127};
128/* The shot uses 48 samples; the original table retains two more -2 samples. */
129/* 0x0046e538 */
130static signed char abDebriefingEstablishDeltas[50] = {
131 -2, -2, -1, -1, 0, 0, 1, 0,
132 1, 0, 1, 0, 1, 0, 1, 1,
133 1, 1, 1, 1, 1, 1, 1, 1,
134 1, 1, 1, 1, 1, 1, 1, 1,
135 1, 1, 1, 1, 0, 1, 0, 1,
136 0, 1, 0, 1, 0, 0, -1, -1, -2, -2
137};
138/* 0x0046e56c */
139static short nDebriefingLeftX = 0;
140/* 0x0046e570 */
141static short nDebriefingPilotX = 80;
142/* 0x0046e574 */
143static short nDebriefingRightX = 278;
144/* 0x0046e578 */
145static short nDebriefingOfficerX = 200;
146/* 0x0046e57c */
148/* 0x0046e580 */
150/* 0x0046e584 */
152/* 0x0046e588 */
154/* 0x0046e58c */
156/* 0x0046e590 */
158
159/* Linker commons defined here; LINK orders them by identifier hash. */
160unsigned char *pCurrentBriefingTextData; /* 0x00598af0 */
161short *pSceneMouthAnimCmds; /* 0x00598af4 */
162unsigned char *pRoomMedalTextData; /* 0x00598af8 */
163unsigned char *pDebriefingSceneDataPtr; /* 0x00598afc */
164char szTxtWorkspaceBuffer[256]; /* 0x00598b00 */
165unsigned char *pBriefingSceneInfo; /* 0x00598c00 */
167short nCurrentConversationMedalIndex; /* 0x00598c08 */
168short nTalkSceneType; /* 0x00598c0a */
169struct Shape *pTalkHeadShape; /* 0x00598c0c */
170short nConvTextColorValue; /* 0x00598c10 */
171struct Shape *pCurrentBriefingAnimShape; /* 0x00598c14 */
172short *pFaceAnimationCmds; /* 0x00598c18 */
173struct Shape *pSceneBriefingBodyShape; /* 0x00598c1c */
174unsigned char *pMedalSceneData; /* 0x00598c20 */
175struct Shape *pSceneBriefingPortraitShape; /* 0x00598c24 */
176unsigned char *pDebriefingTxtInfo; /* 0x00598c28 */
177struct Shape *pBriefingCloseupShape; /* 0x00598c2c */
178struct Shape *pConvOverlayShapePtr; /* 0x00598c30 */
179unsigned char bFilteredKeyDelayStartedState; /* 0x00598c34 */
180
181/* Function start: 0x436D00 */
218
219/* Function start: 0x436E30 */
220unsigned int ViewMedals(void)
221{
222 InputEventState event;
223 unsigned char clicked;
224 unsigned char savedInputMode;
225
226 clicked = 0;
232 savedInputMode = bInputModeState;
233 bInputModeState = 1;
234 do {
236 if (PeekInputEvent(&event, 10) != 0 ||
237 PeekInputEvent(&event, 2) != 0 ||
238 PeekInputEvent(&event, 3) != 0)
239 clicked = 1;
240 DrawMedals();
246 "%X%Y%F%s%P", 0, 160,
249 DIBslam();
250 DIBslamReal();
251 if (clicked != 0) {
255 bInputModeState = savedInputMode;
257 return 0;
258 }
259 } while (1);
260}
261
262/* Function start: 0x436F50 */
263unsigned int AwardCampaignMedal(short medal)
264{
265 int medalIndex;
266 int *packet;
267
268 if (medal == 3 &&
269 (signed char)stCampaignState.medals[3] > 0)
270 return 0;
271
276
277 medalIndex = medal;
278 switch (medalIndex) {
279 case 0:
280 case 1:
281 spacetrack(0x27, 1, -1);
282 break;
283 case 2:
284 case 4:
285 spacetrack(0x28, 1, -1);
286 break;
287 case 3:
288 spacetrack(0x26, 1, -1);
289 break;
290 }
291
294 2, 0);
295 pMedalSceneData = (unsigned char *)packet + packet[0];
296 pRoomMedalTextData = (unsigned char *)packet + packet[1];
302 FetchDiskPacketRetrying(4, 10, 0);
304 stCampaignState.medals[medalIndex]++;
310 ReleasePacketHandle(packet);
318 return 0;
319}
320
321/* Function start: 0x4370D0 */
322unsigned int DrawMedalChest(char *text, short duration)
323{
324 short escaped;
325 short offset;
326
327 AddPCName(text);
330 FormatTextBufferFromStart("%X%Y%F%s%P",
331 0, 160,
334 offset = 0;
335 do {
337 pMedalSceneShape, 41);
338 DrawSpriteDefault(&stSceneBuffer, (short)(92 - offset), 64,
339 pMedalSceneShape, 43);
340 DrawSpriteDefault(&stSceneBuffer, (short)(228 + offset), 64,
341 pMedalSceneShape, 44);
343 pMedalSceneShape, 42);
346 0, 256, 16);
348 escaped = CheckEscaped();
349 if (escaped != 0) {
350 duration = -1;
351 break;
352 }
353 offset = (short)(offset + 2);
354 DIBslam();
355 DIBslamReal();
356 } while (offset < 162);
357 WaitForSceneAdvance(duration, 0);
359 case 0:
360 case 1:
361 spacetrack(39, 1, -1);
362 break;
363 case 2:
364 case 4:
365 spacetrack(40, 1, -1);
366 break;
367 case 3:
368 spacetrack(38, 1, -1);
369 break;
370 }
371 return 0;
372}
373
374/* Function start: 0x437250 */
375unsigned int DrawMedalLongShot(short *animation, char *text,
376 short duration)
377{
378 short *start;
379 short countdown;
380 short escaped;
381 short frame;
382
383 countdown = 0;
384 AddPCName(text);
387 FormatTextBufferFromStart("%X%Y%F%s%P",
388 0, 160,
391 start = animation;
392 while (*animation != -1) {
393 if (countdown-- == 0) {
394 if (*animation != -1)
395 animation += 2;
396 switch (*animation) {
397 case -2:
398 animation = start;
399 /* fall through */
400 default:
401 frame = *animation;
402 countdown = (short)(animation[1] * 2);
403 break;
404 case -1:
405 frame = -1;
406 break;
407 }
408 }
413 if (frame > -1)
416 (short)(frame + 1));
418 escaped = CheckEscaped();
419 if (escaped != 0) {
420 duration = -1;
421 break;
422 }
423 DIBslam();
424 DIBslamReal();
425 }
431 DIBslam();
432 DIBslamReal();
433 WaitForSceneAdvance(duration, 0);
434 return 0;
435}
436
437/* Function start: 0x4373E0 */
438unsigned int MedalEstablish(char *text, short duration)
439{
440 int distance;
441 short escaped;
442 short frame;
443 short scale;
444 int x;
445 int y;
446
447 distance = 200;
448 AddPCName(text);
451 FormatTextBufferFromStart("%X%Y%F%s%P",
452 0, 160,
456 y = 87;
457 for (frame = 0; frame < 32; frame++) {
458 DrawMedals();
459 scale = (short)(0xc800L / distance);
460 DrawSpriteScaled(&stSceneBuffer, (short)x, (short)y,
462 0, scale, 0);
463 distance--;
464 x--;
465 y += 2;
467 escaped = CheckEscaped();
468 if (escaped != 0) {
469 duration = -1;
470 break;
471 }
472 DIBslam();
473 DIBslamReal();
474 }
475 WaitForSceneAdvance(duration, 0);
476 return 0;
477}
478
479/* Function start: 0x4374B0 */
480unsigned int PinMedal(char *text, short duration)
481{
482 short escaped;
483 short frame;
484
485 frame = 0;
486 AddPCName(text);
489 FormatTextBufferFromStart("%X%Y%F%s%P",
490 0, 160,
495 escaped = IsFrameTickElapsed();
496 while (escaped == 0) {
497 frame++;
504 (short)(frame % 3 + 38));
506 escaped = CheckEscaped();
507 if (escaped != 0) {
508 duration = -1;
509 break;
510 }
511 DIBslam();
512 DIBslamReal();
513 escaped = IsFrameTickElapsed();
514 }
515 WaitForSceneAdvance(duration, 0);
516 return 0;
517}
518
519/* Function start: 0x4375C0 */
520unsigned int DrawMedals(void)
521{
522 short badge;
523 short medal;
524 unsigned short medalRowY;
525 short medalCount;
526 short rowY;
527 short x;
528 short stack;
529
530 rowY = 78;
531 x = 188;
535 pMedalSceneShape, 11);
539 33));
543 33),
544 0, 255, 16);
545 for (badge = 0; badge < 12; badge++) {
546 if (stCampaignState.badges[badge] != 0) {
547 if (x >= 232) {
548 rowY = (short)(rowY + 3);
549 x = 188;
550 }
553 (short)(badge + 13));
554 x = (short)(x + 11);
555 }
556 }
557 rowY = (short)(rowY + 5);
558 medalRowY = rowY;
559 for (medal = 0; medal < 5; medal++) {
560 if (stCampaignState.medals[medal] != 0) {
561 x = asMedalDisplayX[medal];
562 stack = medalRowY;
563 if (medal < 3) {
564 for (medalCount = 0;
565 medalCount < (signed char)stCampaignState.medals[medal];
566 medalCount++) {
569 (short)(medal + 25));
570 stack = (short)(stack + 2);
571 }
572 }
575 (short)(medal + 28));
576 }
577 }
578 DIBslam();
579 DIBslamReal();
580 return 0;
581}
582
583/* Function start: 0x437770 */
584unsigned int EstablishingShot(char *text, short duration)
585{
586 int frameIndex;
587 short character;
588 short escaped;
589 short frame;
590
597 AddPCName(text);
600 FormatTextBufferFromStart("%X%Y%F%s%P",
601 0, 160,
604 frame = 0;
606 do {
613 frameIndex = frame;
614 for (character = 0; character < 8; character++) {
616 character, 0,
617 aBriefingCharacters[character]
618 .animation[frameIndex],
619 0, 0);
620 }
622 escaped = CheckEscaped();
623 if (escaped != 0) {
624 frame = 21;
625 duration = -1;
626 }
627 frame++;
628 DIBslam();
629 DIBslamReal();
630 } while (frame < 22);
631 WaitForSceneAdvance(duration, 0);
632 spacetrack(25, 1, -1);
633 return 0;
634}
635
636/* Function start: 0x4378D0 */
637unsigned int DrawBriefingLongShot(void)
638{
639 short character;
640
653 for (character = 0; character < 8; character++) {
654 DrawBriefingCharacter(character, 0, 0, 0, 0);
655 }
657 return 0;
658}
659
660/* Function start: 0x437980 */
661unsigned int ReturnToBriefingLongShot(char *text, short duration)
662{
663 char active[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
664 signed char *phase;
665 char *characterActive;
666 short character;
667 short escaped;
668 short frame;
669
670 spacetrack(26, 1, -1);
677 AddPCName(text);
680 FormatTextBufferFromStart("%X%Y%F%s%P",
681 0, 160,
684 for (character = 0; character < 8; character++) {
685 aBriefingCharacters[character].animationPhase = 0;
686 }
687 frame = 0;
688 for (;;) {
695 for (character = 0; character < 8; character++) {
696 characterActive = &active[character];
697 if (*characterActive == 0 &&
698 RandomBelowOrEqual(5) == 0)
699 *characterActive = 1;
700 phase = &aBriefingCharacters[character].animationPhase;
702 character, *phase, 0,
703 (const signed char *)aBriefingPortraitOffsetX +
704 *phase * 12,
705 (const signed char *)aBriefingPortraitOffsetY +
706 *phase * 12);
707 if (*characterActive == 1 && *phase < 11)
708 (*phase)++;
709 }
711 escaped = CheckEscaped();
712 if (escaped != 0) {
713 duration = 0;
715 break;
716 }
717 frame++;
718 DIBslam();
719 DIBslamReal();
720 if (frame >= 40)
721 break;
722 }
723 WaitForSceneAdvance(duration, 0);
726 return 0;
727}
728
729/* Function start: 0x437B80 */
730unsigned int Dismissed(char *text, short duration)
731{
732 short frame;
733 short leftDelta;
734 short podiumFrame;
735 short leftX;
736 short podiumDelta;
737 short podiumX;
738 short rightDelta;
739 short rightX;
740
741 podiumFrame = 0;
742 leftX = -96;
743 podiumX = 240;
744 rightX = 252;
745 if (pTalkHeadShape != 0)
751 AddPCName(text);
754 FormatTextBufferFromStart("%X%Y%F%s%P",
755 0, 160,
761 frame = 0;
762 do {
763 if (CheckEscaped() != 0) {
764 rightX = 348;
765 leftX = 0;
766 frame = 31;
767 podiumFrame = 34;
768 podiumX = 336;
769 }
771 if (nFrameSkipCounter < 1) {
775 DrawSpriteDefault(&stSceneBuffer, (short)(leftX + 320), 0,
777 DrawSpriteDefault(&stSceneBuffer, podiumX, 127,
780 podiumFrame]);
781 DrawSpriteDefault(&stSceneBuffer, rightX, 127,
784 }
785 if (podiumFrame < 34)
786 podiumFrame++;
787 if (frame < 12) {
788 leftDelta =
789 (short)aiBriefingLeftPanelVelocity[frame];
790 podiumDelta =
791 (short)aiBriefingPodiumVelocity[frame];
792 rightDelta =
793 (short)aiBriefingRightPanelVelocity[frame];
794 }
795 if (frame > 24)
796 leftDelta = (short)aiBriefingLeftPanelVelocity[
797 11 - (frame - 24)];
798 podiumX = (short)(podiumX + podiumDelta);
799 rightX = (short)(rightX + rightDelta);
800 frame++;
801 leftX = (short)(leftX + leftDelta);
802 DIBslam();
803 DIBslamReal();
804 } while (frame < 32);
805 WaitForSceneAdvance(duration, 0);
808 return 0;
809}
810
811/* Function start: 0x437DC0 */
848
849/* Function start: 0x437F20 */
850unsigned int DebriefingEstablishingShot(char *text, short duration)
851{
852 const signed char *delta;
853 short escaped;
854 short frame;
855 short skip;
856
858 nDebriefingRightX = 278;
859 frame = 0;
862 nDebriefingPodiumX = 344;
863 AddPCName(text);
866 FormatTextBufferFromStart("%X%Y%F%s%P",
867 0, 160,
871 for (;;) {
872 delta = &abDebriefingEstablishDeltas[frame];
874 (short)(nDebriefingLeftX -
875 MaxShort((short)delta[0], 0));
877 (short)(nDebriefingPilotX -
878 MaxShort((short)(delta[0] + 1), 0));
880 (short)(nDebriefingPodiumX -
881 MaxShort((short)(delta[0] + 2), 0));
883 (short)(nDebriefingOfficerX -
884 MaxShort((short)(delta[0] + 3), 0));
886 (short)(nDebriefingRightX -
887 MaxShort((short)(delta[0] + 3), 0));
888 skip = nFrameSkipCounter;
889 if (frame == 47)
890 skip = 1;
891 skip--;
892 nFrameSkipCounter = skip;
893 if (skip < 1) {
897 DIBslam();
898 DIBslamReal();
899 }
900 escaped = CheckEscaped();
901 if (escaped != 0) {
902 duration = -1;
903 break;
904 }
905 frame++;
906 if (frame >= 48)
907 break;
908 }
909 WaitForSceneAdvance(duration, 0);
910 return 0;
911}
912
913/* Function start: 0x438090 */
915{
916 short objective;
917
918 for (objective = 0; objective < cMissionObjectiveCountValue; objective++) {
919 if (achieved(objective) != 0)
920 break;
921 }
922 return objective >= cMissionObjectiveCountValue;
923}
924
925/* Function start: 0x4380D0 */
926short wing_status(short personality)
927{
928 int deathMission;
929 int currentMission;
930
931 deathMission =
933 if (deathMission == 0)
934 return 3;
935 currentMission = stCampaignState.currentMission +
937 if (currentMission == deathMission)
938 return 1;
939 if (currentMission > deathMission)
940 return 2;
941}
942
943/* Function start: 0x438110 */
944short int_value(char **text)
945{
946 char number[8];
947 char *destination;
948 short character;
949
950 destination = number;
951 character = (short)**text;
952 while (character != ',' && character != ')') {
953 (*text)++;
954 *destination = character;
955 destination++;
956 character = **text;
957 }
958 *destination = '\0';
959 (*text)++;
960 return (short)atoi(number);
961}
962
963/* Function start: 0x438160 */
965 ConversationSceneRecord *sceneData,
966 unsigned char *textData)
967{
968 char *test;
969 short first;
970 short second;
971 short testCode;
972
973 test = (char *)textData + record->testsOffset;
974 while ((testCode = (short)*test++) != 0) {
975 switch (testCode) {
976 case 1:
977 return sceneData + int_value(&test);
978 case 2:
979 first = int_value(&test);
980 second = int_value(&test);
981 if (stCampaignState.missionScore < first)
982 return sceneData + second;
983 break;
984 case 3:
985 first = int_value(&test);
986 second = int_value(&test);
987 if (first <= stCampaignState.missionScore)
988 return sceneData + second;
989 break;
990 case 4:
991 first = int_value(&test);
992 second = int_value(&test);
993 if (wing_status(first) != 3)
994 return sceneData + second;
995 break;
996 case 5:
997 first = int_value(&test);
998 second = int_value(&test);
999 if (wing_status(first) == 3)
1000 return sceneData + second;
1001 break;
1002 case 6:
1003 first = int_value(&test);
1004 if (nPlayerKillTotal == 0)
1005 return sceneData + first;
1006 break;
1007 case 7:
1008 first = int_value(&test);
1009 if (nPlayerKillTotal != 0)
1010 return sceneData + first;
1011 break;
1012 case 8:
1013 first = int_value(&test);
1014 if (nWingmanKillCount == 0)
1015 return sceneData + first;
1016 break;
1017 case 9:
1018 first = int_value(&test);
1019 if (nWingmanKillCount != 0)
1020 return sceneData + first;
1021 break;
1022 case 10:
1023 first = int_value(&test);
1024 if (bOfficeVisitPending == 0)
1025 return sceneData + first;
1026 break;
1027 case 11:
1028 first = int_value(&test);
1029 second = int_value(&test);
1030 if (achieved(first) == 0)
1031 return sceneData + second;
1032 break;
1033 case 12:
1034 first = int_value(&test);
1035 second = int_value(&test);
1036 if (achieved(first) != 0)
1037 return sceneData + second;
1038 break;
1039 case 27:
1040 first = int_value(&test);
1041 second = int_value(&test);
1042 if (sighted(first) != 0)
1043 return sceneData + second;
1044 break;
1045 case 29:
1046 first = int_value(&test);
1047 second = int_value(&test);
1048 if (wing_status(first) == 2)
1049 return sceneData + second;
1050 break;
1051 case 30:
1052 first = int_value(&test);
1053 second = int_value(&test);
1054 if (wing_status(first) == 1)
1055 return sceneData + second;
1056 break;
1057 case 31:
1058 first = int_value(&test);
1059 second = int_value(&test);
1060 if (ace_status(first, 1) == 0)
1061 return sceneData + second;
1062 break;
1063 case 32:
1064 first = int_value(&test);
1065 second = int_value(&test);
1066 if (ace_status(first, 1) != 0)
1067 return sceneData + second;
1068 break;
1069 case 33:
1070 first = int_value(&test);
1071 second = int_value(&test);
1072 if (ace_status(first, 2) == 0 &&
1073 ace_status(first, 1) == 0)
1074 return sceneData + second;
1075 break;
1076 case 34:
1077 first = int_value(&test);
1078 second = int_value(&test);
1079 if (ace_status(first, 2) != 0)
1080 return sceneData + second;
1081 break;
1082 }
1083 switch (testCode) {
1084 case 13:
1085 first = int_value(&test);
1087 return sceneData + first;
1088 break;
1089 case 14:
1090 first = int_value(&test);
1092 return sceneData + first;
1093 break;
1094 case 15:
1095 first = int_value(&test);
1097 return sceneData + first;
1098 break;
1099 case 16:
1100 first = int_value(&test);
1101 if (bPromotionPending != 1)
1102 return sceneData + first;
1103 break;
1104 case 17:
1105 first = int_value(&test);
1107 return sceneData + first;
1108 break;
1109 case 18:
1110 first = int_value(&test);
1111 if (bPlayerEjectedThisMission == 1 &&
1113 return sceneData + first;
1114 break;
1115 case 19:
1116 first = int_value(&test);
1117 if (bPlayerShipTypeChanged != 1)
1118 return sceneData + first;
1119 break;
1120 case 20:
1121 first = int_value(&test);
1123 return sceneData + first;
1124 break;
1125 case 21:
1126 first = int_value(&test);
1128 return sceneData + first;
1129 break;
1130 case 22:
1131 first = int_value(&test);
1133 return sceneData + first;
1134 break;
1135 case 23:
1136 first = int_value(&test);
1138 return sceneData + first;
1139 break;
1140 case 24:
1141 first = int_value(&test);
1145 return sceneData + first;
1146 break;
1147 case 25:
1148 first = int_value(&test);
1152 return sceneData + first;
1153 break;
1154 case 26:
1155 first = int_value(&test);
1156 if (bPlayerEjectedThisMission == 1 &&
1158 return sceneData + first;
1159 break;
1160 case 28:
1161 first = int_value(&test);
1162 second = int_value(&test);
1163 if (sighted(first) == 0)
1164 return sceneData + second;
1165 break;
1166 case 35:
1167 first = int_value(&test);
1169 return sceneData + first;
1170 break;
1171 case 36:
1172 first = int_value(&test);
1174 return sceneData + first;
1175 break;
1176 case 37:
1177 first = int_value(&test);
1178 if (no_objectives_achieved() != 0)
1179 return sceneData + first;
1180 break;
1181 case 38:
1182 first = int_value(&test);
1183 if (no_objectives_achieved() == 0)
1184 return sceneData + first;
1185 break;
1186 }
1187 }
1188 return record;
1189}
1190
1191/* Function start: 0x438B90 */
1192unsigned int TalkerInit(void)
1193{
1195 AllocateTaggedMemory(0x140, 0);
1197 AllocateTaggedMemory(0x140, 0);
1198 return 0;
1199}
1200
1201/* Function start: 0x438BC0 */
1210
1211/* Function start: 0x438C00 */
1212unsigned int SceneDirector(short sceneType, unsigned char *sceneBytes,
1213 unsigned char *textData)
1214{
1216 ConversationSceneRecord *selected;
1217 short duration;
1218 short previousColour;
1219 short shot;
1220 short previousShot;
1221 char *text;
1222
1223 previousShot = -2;
1224 previousColour = -2;
1225 record = (ConversationSceneRecord *)sceneBytes;
1226 nTalkSceneType = sceneType;
1227 TalkerInit();
1228 bInputModeState = 1;
1233 while ((shot = (short)record->shot) != -2) {
1234 if (shot != -1) {
1235 if ((shot & 0x40) != 0) {
1237 shot &= 0x3f;
1238 } else {
1240 }
1241 }
1242 if (record->testsOffset != 0) {
1243 selected = record;
1244 record = ParseTests(record,
1245 (ConversationSceneRecord *)sceneBytes,
1246 textData);
1247 if (selected != record)
1248 continue;
1249 }
1250 if (record->talker != -2)
1252 duration = record->duration;
1253 switch (shot & 0x3f) {
1254 case 0:
1255 case 3:
1256 case 5:
1257 case 6:
1258 case 7:
1259 case 8:
1260 case 9:
1261 case 10:
1262 case 11:
1263 case 16:
1264 case 17:
1265 previousShot = shot;
1266 nTalkingHeadFace = -1;
1267 break;
1268 case 1:
1269 if (previousShot != 1) {
1270 previousShot = 1;
1272 nTalkingHeadFace = -1;
1273 }
1274 break;
1275 case 2:
1276 if (previousShot != 2) {
1277 previousShot = 2;
1279 nTalkingHeadFace = -1;
1280 }
1281 break;
1282 case 4:
1283 previousShot = 4;
1284 cCurrentObjective = (signed char)abs(nConversationCharacter);
1285 nTalkingHeadFace = -1;
1286 break;
1287 case 12:
1288 case 13:
1289 case 14:
1290 case 15:
1291 if (previousShot != shot) {
1295 &stConstellationViewport, -1, 16);
1297 nTalkingHeadFace = -1;
1298 previousShot = shot;
1299 }
1300 break;
1301 case 20:
1302 case 21:
1303 case 22:
1304 case 23:
1305 case 24:
1306 case 25:
1307 case 26:
1308 case 27:
1309 case 28:
1310 case 29:
1311 case 30:
1312 if (previousShot != shot) {
1313 LoadFace((short)(shot - 20));
1314 previousShot = shot;
1315 }
1316 break;
1317 case 50:
1318 case 51:
1319 case 52:
1320 case 53:
1321 case 54:
1322 case 55:
1323 case 56:
1324 case 57:
1325 case 58:
1326 case 59:
1327 previousShot = 50;
1328 nTalkingHeadFace = -1;
1329 break;
1330 }
1331 if (previousColour != (short)record->textColour &&
1332 record->textColour != -1) {
1333 previousColour = record->textColour;
1335 asConversationTextColours[previousColour];
1336 }
1337 pSceneMouthAnimCmds[0] = -1;
1338 if (textData[record->mouthAnimationOffset] != '\0')
1339 ParseMouthAnimation((char *)textData +
1340 record->mouthAnimationOffset,
1342 pFaceAnimationCmds[0] = -1;
1343 if (textData[record->faceAnimationOffset] != '\0')
1344 ParseFaceAnimation((char *)textData +
1345 record->faceAnimationOffset,
1348 text = (char *)textData + record->textOffset;
1349 if (*text != '\0') {
1350 switch (previousShot) {
1351 case 0:
1352 EstablishingShot(text, duration);
1353 break;
1354 case 1:
1355 case 2:
1356 case 11:
1358 previousShot,
1360 text, duration, 0);
1361 break;
1362 case 3:
1363 previousShot = 4;
1364 Dismissed(text, duration);
1365 break;
1366 case 4:
1367 UpdateMap(text, duration);
1368 break;
1369 case 5:
1370 previousShot = 1;
1371 ReturnToBriefingLongShot(text, duration);
1372 break;
1373 case 6:
1375 text, duration);
1376 break;
1377 case 7:
1378 MedalEstablish(text, duration);
1379 break;
1380 case 8:
1381 PinMedal(text, duration);
1382 break;
1383 case 9:
1384 case 12:
1385 case 13:
1386 case 14:
1387 case 15:
1388 DrawFuneralLongShot(previousShot, text, duration);
1389 break;
1390 case 10:
1391 DebriefingEstablishingShot(text, duration);
1392 break;
1393 case 16:
1394 DrawMedalChest(text, duration);
1395 break;
1396 case 17:
1397 funeral_wingman(text, duration);
1398 break;
1399 case 50:
1400 PlaySceneAnimation(text, (short)(shot - 50), duration);
1401 break;
1402 default:
1406 duration);
1407 break;
1408 }
1409 }
1410 record++;
1411 if (bEscapePressedFlag == 1)
1412 break;
1413 }
1415 cBlackColour);
1416 FreeTalker();
1418 if (bConversationConstellation == 1) {
1421 }
1422 return 0;
1423}
1424
1425/* Function start: 0x439070 */
1448
1449/* Function start: 0x439150 */
1450unsigned int DrawBriefingCharacter(short character, short pose,
1451 short animationFrame,
1452 const signed char *unusedXOffsets,
1453 const signed char *unusedYOffsets)
1454{
1455 short frame;
1456
1457 (void)unusedXOffsets;
1458 (void)unusedYOffsets;
1459 if (aBriefingCharacters[character].visible != 0) {
1460 frame = aBriefingCharacters[character].firstPortraitFrame;
1461 if (animationFrame <
1462 aBriefingCharacters[character].portraitFrameCount)
1463 frame = (short)(frame + animationFrame);
1466 (short)(aBriefingCharacters[character].portraitX +
1467 aBriefingPortraitOffsetX[character][pose]),
1468 (short)(aBriefingCharacters[character].portraitY +
1469 aBriefingPortraitOffsetY[character][pose]),
1471 aBriefingPortraitScale[character][pose],
1472 aBriefingCharacters[character].scale, 0);
1474 aBriefingCharacters[character].bodyX,
1475 (short)(aBriefingCharacters[character].bodyY +
1476 10),
1478 0, aBriefingCharacters[character].scale, 0);
1479 }
1480 return 0;
1481}
1482
1483/* Function start: 0x439220 */
1484unsigned int DrawFuneralLongShot(short shot, char *text, short duration)
1485{
1486 short escaped;
1487
1488 AddPCName(text);
1490 cBlackColour);
1491 FormatTextBufferFromStart("%X%Y%F%s%P",
1492 0, 160,
1495 if (shot == 9) {
1499 DIBslam();
1500 DIBslamReal();
1501 WaitForSceneAdvance(duration, 0);
1502 return 0;
1503 }
1504 SetFrameTimerPeriodDirect(duration);
1505 for (;;) {
1506 escaped = IsFrameTickElapsed();
1507 if (escaped != 0)
1508 break;
1515 (short)(shot - 8));
1519 DIBslam();
1520 DIBslamReal();
1521 escaped = CheckEscaped();
1522 if (escaped != 0)
1523 break;
1524 }
1525 return 0;
1526}
1527
1528/* Function start: 0x439350 */
1529/* Nothing in the shipped executable calls this. It shows the off-screen
1530 * buffer the DOS way: CGA, Hercules, Tandy and VGA copy it to the screen,
1531 * while EGA (mode 0Dh) swaps the two display pages. */
1533{
1534 unsigned short pixels;
1535 unsigned short *rowOffsets;
1536
1537 switch (nVideoMode) {
1538 case 4:
1539 case 7:
1540 case 9:
1541 case 0x13:
1544 break;
1545 case 0xd:
1546 pixels = (unsigned short)pFullScreenRecord->pixels;
1547 rowOffsets = pFullScreenRecord->rowOffsets;
1552 pAllocatedScreenViewport->pixels = (unsigned char *)pixels;
1555 break;
1556 }
1557}
1558
1559/* Function start: 0x439400 */
1560void __stdcall SetViewportRect(Viewport *viewport, unsigned short left,
1561 unsigned short top, unsigned short right,
1562 unsigned short bottom)
1563{
1564 viewport->left = (short)left;
1565 viewport->top = (short)top;
1566 viewport->right = (short)right;
1567 viewport->bottom = (short)bottom;
1568}
1569
1570/* Function start: 0x439430 */
1571void __stdcall PanToScreen(Viewport *source, Viewport *destination)
1572{
1573 short target[3];
1574 short *originalPalette;
1575 short *transitionPalette;
1576 unsigned int paletteBytes;
1577 short index;
1578 short activeCount;
1579 unsigned char *indices;
1580
1581 if (nVideoMode == 0x13) {
1582 indices = AllocateTaggedMemory(256, 0);
1583 if (indices == 0)
1584 return;
1585 memset(indices, 0, 256);
1586 activeCount = CollectActivePaletteIndices(source, indices, 256);
1587 paletteBytes = (unsigned int)(activeCount * 6);
1588 originalPalette =
1589 AllocateTaggedMemory(paletteBytes, 0);
1590 transitionPalette =
1591 AllocateTaggedMemory(paletteBytes, 0);
1592 if (originalPalette == 0 || transitionPalette == 0) {
1593 ReleasePacketHandle(indices);
1594 if (originalPalette != 0)
1595 ReleasePacketHandle(originalPalette);
1596 if (transitionPalette != 0)
1597 ReleasePacketHandle(transitionPalette);
1598 return;
1599 }
1600
1601 memset(originalPalette, 0, paletteBytes);
1602 memset(transitionPalette, 0, paletteBytes);
1604 (short)GetViewportPixel(destination,
1605 destination->left,
1606 destination->top),
1607 target);
1608 for (index = 0; index < activeCount; index++) {
1610 (short)indices[index],
1611 &originalPalette[index * 3]);
1612 CachePaletteEntryFromWords((short)indices[index], target);
1613 memcpy(&transitionPalette[index * 3], target, 6);
1614 }
1615
1617 DIBramPalette();
1618 CopyViewportContents(source, destination);
1619 DIBslam();
1620 DIBslamReal();
1621
1622 while (StepPaletteTransition(
1623 transitionPalette, originalPalette,
1624 (short)(activeCount * 3)) != 0) {
1625 for (index = 0; index < activeCount; index++) {
1627 (short)indices[index],
1628 &transitionPalette[index * 3]);
1629 }
1631 DIBramPalette();
1632 }
1633
1634 ReleasePacketHandle(transitionPalette);
1635 ReleasePacketHandle(originalPalette);
1636 ReleasePacketHandle(indices);
1637 } else {
1638 CopyViewportContents(source, destination);
1639 }
1640 DIBslam();
1641 DIBslamReal();
1642}
1643
1644/* Function start: 0x439660 (Mac symbol: death_sequence) */
1645unsigned int death_sequence(void)
1646{
1647 struct Shape *deathShape;
1648 struct Shape *cockpitBackground;
1649 signed char frame;
1650
1651 nCannedSceneMode = 1;
1653 free_cockpit();
1655 if (nMemoryConfig == 1)
1656 SceneLeaveHook(0x20);
1657
1658 spacetrack(0x20, 2, 1);
1659 frame = 0;
1660 deathShape = FetchDiskPacketRetrying(2, 0, 0);
1661 cockpitBackground = FetchDiskPacketRetrying(
1662 (short)cCockpitLogicalFile, 3, 0);
1663 PlaySfxWaveFileByNumber(4, -1, 0);
1664 new_view(9, 0);
1667 for (; frame < 8; frame++) {
1668 if (frame == 7) {
1671 } else {
1674 cockpitBackground, 0);
1675 }
1677 deathShape, (short)frame);
1679 DIBslam();
1680 DIBslamReal();
1681 if (bEscapePressedFlag == 1)
1682 break;
1683 }
1684
1686 FreePacketAndClear(&cockpitBackground, 0);
1687 FreePacketAndClear(&deathShape, 0);
1688 if (bEscapePressedFlag != 1) {
1689 frame = 0;
1691 new_view(4, 0);
1693 do {
1694 if (RefreshCockpitStatus() != 0)
1696 switch (frame) {
1697 case 2:
1698 Explosion(0);
1699 break;
1700 }
1701 if (bEscapePressedFlag == 1)
1702 break;
1703 frame++;
1704 DIBslam();
1705 DIBslamReal();
1706 } while (frame < 60);
1707 }
1708
1711 stScreenView.top = 0;
1712 stScreenView.bottom = 199;
1716 return 0;
1717}
1718
1719/* Function start: 0x439840 */
1720unsigned int ShowGetReadyScreen(void)
1721{
1722 short frame;
1723 short distance;
1724
1725 frame = 0;
1726 pIntroFont =
1727 FetchDiskPacketRetrying(9, 1, 0);
1728 nCannedSceneMode = 1;
1729 force_view(0, 0);
1730 distance = 400;
1733 do {
1734 if (RefreshCockpitStatus() != 0) {
1736 "Get Ready", nCurrentViewCenterPosX,
1738 (short)(0xc800 / (int)distance));
1740 }
1741 if (distance > 100)
1742 distance = (short)(distance - 10);
1743 if (bEscapePressedFlag == 1)
1744 break;
1745 frame++;
1746 DIBslam();
1747 DIBslamReal();
1748 } while (frame < 40);
1752 nCannedSceneMode = 0;
1754 return 0;
1755}
1756
1757/* Function start: 0x439910 */
1758unsigned int ShowVictoryScreen(void)
1759{
1760 short distance;
1761 short emptyCount;
1762 short frame;
1763 short index;
1764
1765 emptyCount = 0;
1768 FetchDiskPacketRetrying(9, 17, 0);
1769 pIntroFont =
1770 FetchDiskPacketRetrying(9, 1, 0);
1771 distance = 500;
1774 frame = 0;
1775 do {
1776 if (RandomBelowOrEqual(7) == 0 && emptyCount != 0) {
1777 for (index = 0; index < 30; index++) {
1778 if (aFireworksList[index].frame == -1) {
1779 aFireworksList[index].frame = 0;
1780 aFireworksList[index].x =
1782 aFireworksList[index].y =
1784 aFireworksList[index].variant =
1785 RandomInRange(0, 2);
1786 break;
1787 }
1788 }
1789 }
1790 if (RefreshCockpitStatus() != 0) {
1791 emptyCount = TheEndFireWorks(&stSpaceBufferViewport, 30);
1793 "Victory", nCurrentViewCenterPosX,
1795 (short)(0xc800 / (int)distance));
1797 }
1798 if (bEscapePressedFlag == 1)
1799 break;
1800 if (distance > 100)
1801 distance = (short)(distance - 10);
1802 frame++;
1803 DIBslam();
1804 DIBslamReal();
1805 } while (frame < 80);
1809 return 0;
1810}
1811
1812/* Function start: 0x439A80 */
1813unsigned int ShowGameOverScreen(void)
1814{
1815 FixedVector cameraOffset;
1816 short frame;
1817 short distance;
1818
1819 frame = 0;
1820 pIntroFont =
1821 FetchDiskPacketRetrying(9, 1, 0);
1822 cViewObject = (signed char)Explosion(0);
1823 nCameraViewMode = 4;
1827 -0x12c00, &cameraOffset);
1830 &cameraOffset, &aShipPositionsArray[EYE_OBJECT]);
1833 aShipFwdVec[EYE_OBJECT] = cameraOffset;
1837 distance = 700;
1839 spacetrack(22, 2, 1);
1842 do {
1843 if (RefreshCockpitStatus() != 0) {
1844 if (frame > 20)
1846 "Game Over", nCurrentViewCenterPosX,
1848 (short)(0xc800 / (int)distance));
1850 }
1851 if (bEscapePressedFlag == 1)
1852 break;
1853 if (distance > 100)
1854 distance = (short)(distance - 10);
1855 frame++;
1856 DIBslam();
1857 DIBslamReal();
1858 } while (frame < 80);
1862 return 0;
1863}
1864
1865/* Function start: 0x439C10 */
1866/* No inbound reference is known in the shipped executable; this routine is
1867 * believed unreachable. It is compiled C, CL's inline memset expansion, and
1868 * the padding after it brings the raster library to 0x439C40. */
1869void __stdcall FillRasterBytes(void *destination, unsigned int length,
1870 short value)
1871{
1872 memset(destination, value, length);
1873}
1874
1875/* The raster library (0x439C40-0x43F635) was hand-written assembly; the Win32
1876 * build assembles it from src/raster.asm. */
void(__cdecl *pIxFree)(void *)
unsigned char bEscapePressedFlag
Definition mathfp.c:24
short * pFaceAnimationCmds
Definition screens.c:172
short asCampaignBriefingFiles[3]
Definition barracks.c:57
int nCameraViewMode
Definition game.c:49
short nCampaignDataSet
Definition gameflow.c:30
int bPlayerShipTypeChanged
Definition gameflow.c:14
unsigned char * pCurrentBriefingTextData
Definition screens.c:160
int nMemoryConfig
Definition ship.c:58
Viewport stConstellationViewport
Definition launch.c:43
unsigned char cBlackColour
Definition init.c:12
short nVideoMode
Definition video.c:12
char szTxtWorkspaceBuffer[256]
Definition screens.c:164
signed char cMissionObjectiveCountValue
Definition game.c:554
struct Shape * pSceneBriefingBodyShape
Definition screens.c:173
short nConvTextColorValue
Definition screens.c:170
unsigned char * pDebriefingTxtInfo
Definition screens.c:176
short nConversationBackdropFrame
Definition screens.c:153
short nDebriefingPersonality
Definition mission.c:14
int bConversationOverlay
Definition screens.c:157
const char * apszMedalNames[5]
Definition screens.c:64
BriefingCharacterLayout aBriefingCharacters[10]
Definition screens.c:43
unsigned char cViewportClearColour
Definition init.c:13
Viewport * pFullScreenRecord
Definition damage.c:51
struct Shape * pBriefingCloseupShape
Definition screens.c:177
TextContext stCurrentConvTxtCtx
Definition targ.c:15
short nFrameSkipCounter
Definition main.c:23
struct Shape * pConvOverlayShapePtr
Definition screens.c:178
int bPlayerEjectedThisMission
Definition gameflow.c:13
unsigned char bInputModeState
Definition eventmgr.c:21
struct Shape * pSceneBriefingPortraitShape
Definition screens.c:175
short nFrameSkip
Definition main.c:24
short * pSceneMouthAnimCmds
Definition screens.c:161
struct Shape * pCurrentBriefingAnimShape
Definition screens.c:171
Viewport stCurrentConvTextViewport
Definition timer.c:17
CampaignDate stSavedCampaignDate
Definition screens.c:14
int bConversationConstellation
Definition screens.c:155
Viewport stSceneBuffer
Definition select.c:17
FixedVector aShipVelocity[SPACE_OBJECT_COUNT]
Definition smart.c:21
short asObjectCollisionRadius[64]
Definition ending.c:27
short nTalkSceneType
Definition screens.c:168
signed char cCockpitLogicalFile
Definition logic.c:107
short nCurrentViewCenterPosX
Definition eventmgr.c:25
struct Shape * pFireworkShape
Definition install.c:19
short nWingmanKillCount
Definition init.c:57
Viewport stScreenView
Definition launch.c:50
int bPromotionPending
Definition gameflow.c:12
Viewport stSpaceBufferViewport
Definition timer.c:13
unsigned char * pMedalSceneData
Definition screens.c:174
short nTalkingHeadFace
Definition screens.c:151
short nPreviousPlayerShipType
Definition gameflow.c:15
short nConversationCharacter
Definition screens.c:149
int nCannedSceneMode
Definition main.c:21
signed char cCurrentObjective
Definition game.c:37
unsigned char * pRoomMedalTextData
Definition screens.c:162
FixedVector aShipUpVector[64]
Definition smart.c:16
CampaignState stCampaignState
Definition dib.c:107
struct Shape * pCurrentConversationBackdropShapePtr
Definition screens.c:166
TalkingHeadOrigin aTalkingHeadOrigins[11]
Definition screens.c:16
Viewport * pAllocatedScreenViewport
Definition damage.c:50
short nPlayerKillTotal
Definition logic.c:112
FireworkState aFireworksList[30]
Definition install.c:18
short asConversationTextColours[12]
Definition init.c:31
short nDebriefingPodiumX
Definition screens.c:147
struct Shape * pTalkHeadShape
Definition screens.c:169
FixedVector aShipPositionsArray[SPACE_OBJECT_COUNT]
Definition game.c:556
int bOfficeVisitPending
Definition gameflow.c:11
FixedVector aShipFwdVec[64]
Definition smart.c:17
short nCurrentViewCenterPosY
Definition eventmgr.c:26
unsigned char bFilteredKeyDelayStartedState
Definition screens.c:179
signed char cViewObject
Definition game.c:13
struct Shape * pIntroFont
Definition eject.c:29
short nCurrentConversationMedalIndex
Definition screens.c:167
unsigned char * pDebriefingSceneDataPtr
Definition screens.c:163
unsigned char * pBriefingSceneInfo
Definition screens.c:165
static int aiBriefingPodiumVelocity[12]
Definition screens.c:114
static int aiBriefingRightPanelVelocity[12]
Definition screens.c:118
static const char * pszMedalsPilotSummary
Definition screens.c:74
static short asMedalDisplayX[5]
Definition screens.c:62
static signed char aBriefingPortraitOffsetX[8][12]
Definition screens.c:77
static signed char abBriefingSmallCharacterAnimation[24]
Definition screens.c:30
static signed char abBriefingLargeCharacterAnimation[24]
Definition screens.c:35
static short nDebriefingLeftX
Definition screens.c:139
static short nDebriefingPilotX
Definition screens.c:141
static int aiBriefingLeftPanelVelocity[12]
Definition screens.c:110
void ShowOffscreenBuffer(void)
Definition screens.c:1532
static signed char abDebriefingEstablishDeltas[50]
Definition screens.c:130
static short aBriefingPortraitScale[8][12]
Definition screens.c:99
static signed char abBriefingPodiumFrames[40]
Definition screens.c:122
static short nDebriefingOfficerX
Definition screens.c:145
static short nDebriefingRightX
Definition screens.c:143
static signed char aBriefingPortraitOffsetY[8][12]
Definition screens.c:88
static struct Shape * pMedalSceneShape
Definition screens.c:72
signed char animationPhase
Definition wcdata.h:637
signed char firstPortraitFrame
Definition wcdata.h:634
short year
Definition wcdata.h:608
PilotRecord * currentPilot
Definition wcdata.h:710
short missionScore
Definition wcdata.h:723
CampaignDate elapsedDate
Definition wcdata.h:721
unsigned char badges[12]
Definition wcdata.h:713
enum ObjectType playerShipType
Definition wcdata.h:711
signed char currentSeries
Definition wcdata.h:715
int personalityDeathMission[8]
Definition wcdata.h:718
unsigned char medals[5]
Definition wcdata.h:712
signed char currentMission
Definition wcdata.h:714
signed char textColour
Definition wcdata.h:615
signed char talker
Definition wcdata.h:616
short variant
Definition wcdata.h:341
short frame
Definition wcdata.h:338
short rank
Definition wcdata.h:600
unsigned char * pixels
Definition wc1base.h:74
short right
Definition wc1base.h:78
short bottom
Definition wc1base.h:79
unsigned short * rowOffsets
Definition wc1base.h:75
short left
Definition wc1base.h:76
short top
Definition wc1base.h:77
Umbrella header for the game core.
unsigned int RefreshMemoryStatusOverlay(void)
Definition main.c:467
unsigned int MedalEstablish(char *text, short duration)
Definition screens.c:438
void * AllocateTaggedMemory(int size, unsigned short flags)
Definition ending.c:31
unsigned int free_cockpit(void)
Definition logic.c:1876
unsigned int InitializeConversationText(void)
Definition main.c:448
unsigned int LongTalk(struct Shape *talker, char *text, short *mouthCommands, short *faceCommands, short duration)
Definition cmpgn.c:260
void FormatTextBufferFromStart(const char *format,...)
Definition cockpt.c:211
void SceneLeaveHook()
Definition music.c:151
void PollJoystickButtonEvents(void)
Definition input.c:76
unsigned int TalkerInit(void)
Definition screens.c:1192
void DIBslam(void)
Definition dib.c:513
short int_value(char **text)
Definition screens.c:944
void fix_objects_ijk(short obj)
Definition geom.c:596
unsigned int AwardCampaignMedal(short medal)
Definition screens.c:263
void __stdcall FillRasterBytes(void *destination, unsigned int length, short value)
Definition screens.c:1869
unsigned int EstablishingShot(char *text, short duration)
Definition screens.c:584
unsigned int generate_stars(void)
Definition spc.c:696
unsigned int InitializeFireworks(void)
Definition view.c:186
unsigned int force_view(int view, short obj)
Definition spc.c:464
unsigned int PinMedal(char *text, short duration)
Definition screens.c:480
unsigned int DrawMedals(void)
Definition screens.c:520
void __stdcall GetPaletteEntry(short index, short *rgb)
Definition gr.c:648
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
unsigned int ParseMouthAnimation(char *text, short *commands)
Definition cmpgn.c:65
short sighted(short objective)
Definition cockpt.c:1030
unsigned int DrawDebriefingLongShot(void)
Definition screens.c:812
unsigned int DrawMedalLongShot(short *animation, char *text, short duration)
Definition screens.c:375
unsigned int FreeTalker(void)
Definition screens.c:1202
void DIBramPalette(void)
Definition dib.c:772
void DrawSpriteScaled(Viewport *viewport, short x, short y, struct Shape *shape, short frame, short angle, short scale, short flip)
Definition gr.c:1176
void ClearInputKeyStatePreservingModifiers(void)
Definition eventmgr.c:787
unsigned int spacetrack(int track, int mode, short enabled)
Definition music.c:411
unsigned short __stdcall StepPaletteTransition(short *current, const short *target, short componentCount)
Definition fade.c:22
ConversationSceneRecord * ParseTests(ConversationSceneRecord *record, ConversationSceneRecord *sceneData, unsigned char *textData)
Definition screens.c:964
unsigned int DrawConstellationField(void)
Definition view.c:289
short no_objectives_achieved(void)
Definition screens.c:914
void DrawSpriteDefault(Viewport *viewport, short x, short y, struct Shape *shape, short frame)
Definition gr.c:660
int IsFrameTickElapsed(void)
Definition eventmgr.c:629
void RestoreGamePalette(void)
Definition winmain.c:76
unsigned int DrawBriefingCharacter(short character, short pose, short animationFrame, const signed char *unusedXOffsets, const signed char *unusedYOffsets)
Definition screens.c:1450
void StopMusicUnlessSuppressed(void)
Definition music.c:419
void FlushInputEvents(void)
Definition eventmgr.c:381
unsigned int ViewMedals(void)
Definition screens.c:220
void DIBslamReal(void)
Definition dib.c:519
unsigned int clear_view_buffer(void)
Definition main.c:414
short WaitForInputKey(void)
Definition disk.c:467
unsigned int PreloadMusicTrackHook(short track)
Definition logic.c:2044
unsigned int GetScreenUpdateFlag(void)
Definition main.c:361
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
int GetViewportPixel(Viewport *viewport, short x, short y)
Definition gr.c:986
void __stdcall SetEventManagerPump(void(*pump)(void))
Definition strdos.c:126
unsigned int DebriefingEstablishingShot(char *text, short duration)
Definition screens.c:850
void __stdcall SetTextContext(TextContext *context)
Definition mathfp.c:152
int free_all_slots(void)
Definition mission.c:397
void WaitForSceneAdvance(short duration, short unused)
Definition disk.c:509
unsigned int ParseFaceAnimation(char *text, short *commands)
Definition cmpgn.c:27
void ClearInputKeyState(void)
Definition eventmgr.c:800
unsigned int PumpWindowMessages(void)
Definition winmain.c:740
short achieved(short objective)
Definition cockpt.c:1042
unsigned int DrawFuneralLongShot(short shot, char *text, short duration)
Definition screens.c:1484
void WaitForVerticalBlankThunk(void)
Definition mathfp.c:158
void __stdcall SetFrameTimerPeriodDirect(short p)
Definition eventmgr.c:617
void ResetSoundState(void)
Definition music.c:669
void __stdcall FadeViewportPaletteToColour(Viewport *viewport, unsigned short colour, short enabled)
Definition main.c:2213
void ScaleFixedVector(const FixedVector *vector, int scale, FixedVector *result)
Definition geom.c:322
unsigned int ShowGetReadyScreen(void)
Definition screens.c:1720
unsigned int Dismissed(char *text, short duration)
Definition screens.c:730
short TheEndFireWorks(Viewport *viewport, short count)
Definition view.c:198
void zero_vector(FixedVector *vector)
Definition geom.c:280
unsigned int ReleaseMusicTrackHook(short track)
Definition logic.c:2051
unsigned int ResetScreenClipToFullHeight(void)
Definition main.c:439
void __stdcall PanToScreen(Viewport *source, Viewport *destination)
Definition screens.c:1571
unsigned int CloseLook(struct Shape *shape, short shot, short *animation, char *text, short duration, int unused)
Definition cmpgn.c:731
unsigned int UpdateMap(char *text, short duration)
Definition cmpgn.c:703
unsigned int ReturnToBriefingLongShot(char *text, short duration)
Definition screens.c:661
unsigned int free_constellation(void)
Definition logic.c:1697
short wing_status(short personality)
Definition screens.c:926
void CachePaletteEntryFromWords(short index, short *rgb)
Definition dib.c:760
void ClearViewport(Viewport *viewport, short colour)
Definition gr.c:963
unsigned int DrawMedalChest(char *text, short duration)
Definition screens.c:322
int DrawCenteredScaledIntroText(const char *text, short centreX, short baselineY, short scale)
Definition mono.c:122
int PlayersMissionScore(void)
Definition gameflow.c:122
unsigned int RefreshCockpitStatus(void)
Definition main.c:1948
unsigned int funeral_wingman(char *text, short duration)
Definition cutscene.c:1015
unsigned int DrawPodiumShot(void)
Definition screens.c:1426
short Explosion(short obj)
Definition ship.c:1200
void PlaySfxWaveFileByNumber()
unsigned int new_view(int view, short obj)
Definition spc.c:472
void PlaySceneAnimation(char *text, short animation, short duration)
Definition logic.c:2418
unsigned int death_sequence(void)
Definition screens.c:1645
unsigned int ShowVictoryScreen(void)
Definition screens.c:1758
short __stdcall CollectActivePaletteIndices(Viewport *viewport, unsigned char *indices, short capacity)
Definition geom.c:71
void ReleasePacketHandle(void *handle)
Definition ending.c:50
unsigned int DrawBriefingLongShot(void)
Definition screens.c:637
int FullMissionScore(void)
Definition gameflow.c:105
void __stdcall SetViewportRect(Viewport *viewport, unsigned short left, unsigned short top, unsigned short right, unsigned short bottom)
Definition screens.c:1560
unsigned int LoadBriefingRoom(void)
Definition screens.c:182
unsigned int set_eye_direction_and_position(void)
Definition spc.c:152
unsigned int LoadFace(short face)
Definition cmpgn.c:190
short MaxShort(short a, short b,...)
Definition mathutil.c:29
short CheckEscaped(void)
Definition disk.c:442
unsigned int ShowGameOverScreen(void)
Definition screens.c:1813
void FreePacketAndClear(void *slot, unsigned short releaseFlags)
Definition mathutil.c:37
unsigned int ReleaseTextFont(short fontIndex)
Definition disk.c:222
short __stdcall RandomInRange(short lo, short hi)
Definition mathfp.c:49
unsigned int InitializeConstellationField(Viewport *viewport, short direction, short density)
Definition view.c:238
int load_all_slots(void)
Definition mission.c:413
short ace_status(short ace, unsigned char bits)
Definition logic.c:115
short RandomBelowOrEqual(short n)
Definition mathfp.c:59
void CopyViewportContents(Viewport *source, Viewport *destination)
Definition gr.c:945
char * AddPCName(const char *text)
Definition cmpgn.c:102
unsigned int InitializeConversationViewport(void)
Definition main.c:422
unsigned int dump_buffer_to_screen(void)
Definition main.c:383
short __stdcall PeekInputEvent(InputEventState *event, short type)
Definition eventmgr.c:343
#define EYE_OBJECT
Definition wcdata.h:1006