Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
comm.c
Go to the documentation of this file.
1/*
2 * Communications menu and transmissions.
3 *
4 * Retail object 0x447300-0x44856F (link order; see docs/ORDER.md).
5 */
6#define COMM_C
7#include "game.h"
8
9short g_nEnemyTauntCommandBase = 20; /* 0x0049b76c */
10short g_nCommMenuChoiceCount = -1; /* 0x0049b770 */
11short g_nCommMenuReuseMode = 0; /* 0x0049b774 */
12signed char g_cMessageSpeed = 2; /* 0x0049b778 */
13signed char g_cPendingCommMenuAction = 1; /* 0x0049b77c */
14signed char g_bRadioSilence = 0; /* 0x0049b780 */
15signed char g_bVideoImagesSuppressed = 0; /* 0x0049b784 */
16unsigned char *g_pCommPortraitResource = 0; /* 0x0049b788 */
17unsigned char *g_pCommVduFrameResource = 0; /* 0x0049b78c */
18signed char g_cCommMenuRecipient = -1; /* 0x0049b790 */
19short g_nCommSpeakerObject = 0; /* 0x0049b794 */
20short g_nCommSpeakerRating = 0; /* 0x0049b798 */
21short g_nCommPortraitIndex = -1; /* 0x0049b79c */
22short g_bCommSpeechPlaying = 0; /* 0x0049b7a0 */
23
24/* Function start: 0x447300 */
25void LoadCommPortraitResources(short portrait)
26{
28 return;
31 FetchDiskPacketRetrying("vdu.v00", portrait, 4);
32 if (g_pCommVduFrameResource == 0) {
34 FetchDiskPacketRetrying("vdu.v00", 0x1c, 4);
35 }
36}
37
38/* Function start: 0x447369 */
39void ResetCommMenuChoices(short reuse)
40{
41 short choice;
42
43 if (reuse == 0) {
44 for (choice = 0; choice < 7; choice++) {
46 g_abCommMenuChoiceCommand[choice] = -1;
47 }
48 }
51}
52
53/* Function start: 0x4473D1 */
54short IsCommMenuIdle(void)
55{
56 return g_nCommMenuChoiceCount == 0;
57}
58
59/* Function start: 0x4473FC */
74
75/* Function start: 0x447479 */
83
84/* Function start: 0x4474CA */
85void OpenCommMenuForTarget(const char *heading, const char *message)
86{
87 CockpitMessage(message, g_cYellowColour, -1);
88 g_pszCommScreenHeading = heading;
89}
90
91/* Function start: 0x4474F4 */
93{
94 return get_mode(1) == 4;
95}
96
97/* Function start: 0x447526 */
99{
100 push_mode(1, 4);
102}
103
104/* Function start: 0x447544 */
106{
107 if (get_mode(1) == 4)
108 pop_mode(1);
109}
110
111/* Function start: 0x44756F */
112short wingman_dead(void)
113{
114 return g_nYourWingman == -1;
115}
116
117/* Function start: 0x44759B */
118short have_target(void)
119{
120 return unactive(g_acShipTarget[0]) == 0;
121}
122
123/* Function start: 0x4475D3 */
125{
126 return have_target() || !wingman_dead();
127}
128
129/* Function start: 0x44760F */
130void SelectCommRecipient(short recipient)
131{
132 g_cCommMenuRecipient = recipient;
134}
135
136/* Function start: 0x447629 */
138{
139 short target;
140
142 OpenCommMenuForTarget("VID-COM SYSTEM\n\nSend message to?\n\n",
143 "SELECT");
144 if (wingman_dead() != 0) {
146 return;
147 }
148 if (have_target() == 0 ||
151 return;
152 }
155 1);
156 target = g_acShipTarget[0];
157 if (target != -1) {
158 if (g_asShipSide[target] == SIDE_KILRATHI &&
160 if (g_asShipIdentified[target] != 0)
161 AppendCommMenuChoice("ENEMY TARGET", 2);
162 else
164 "UNIDENTIFIED", 2);
165 } else if (g_asShipSide[target] == SIDE_IMPERIAL) {
166 if (g_aeObjectClass[target] >= OBJECT_CLASS_SHIP &&
167 g_asShipMissionType[target] ==
170 g_acShipTarget[0]]->name,
171 3);
172 if ((g_aeObjectClass[target] == OBJECT_CLASS_SHIP &&
173 any_enemy(0, 14000) != 0) ||
174 g_asShipMissionIndex[target] ==
176 if (g_asShipIdentified[target] != 0)
178 g_acShipTarget[0]]->name,
179 3);
180 else
182 "UNIDENTIFIED", 3);
183 } else if (g_ucPendingEjectionTransition != 0xff &&
185 g_asObjectType[target] >=
189 g_acShipTarget[0]]->name,
190 3);
191 }
192 }
193 }
195}
196
197#pragma function(strcat, strcpy)
198/* Function start: 0x447890 */
200{
201 short object;
202
203 if (g_nEnemyCommPilotIndex != -1 &&
211 } else {
213 (g_nEnemyTauntCommandBase & 1) | 20;
214 }
218 } else {
223 SIDE_IMPERIAL)) {
227 any_enemy(0, 14000) != 0)
229 if (have_target() != 0 &&
233 for (object = 1; object < 10; object++) {
234 if (g_aeObjectClass[object] ==
236 g_acShipTarget[object] == 0) {
238 if (g_nFacingToTarget < -70 &&
239 g_nTargetFacing > 90 &&
240 g_nTargetRange < 4000) {
242 break;
243 }
244 }
245 }
248 if (g_nAutoEngageTimer != -1)
250 else if (g_aeShipObjective[
254 }
255 if (g_bRadioSilence != 0)
257 else
260 }
269 } else {
282 .collisionRadius < 500)
284 else
286 }
292 }
293 }
299 }
300 }
301 if (IsCommMenuIdle() != 0) {
303 } else if (g_nCommMenuChoiceCount < 5) {
305 }
306 if (IsCommChoiceMenuOpen() != 0) {
307 if (g_nCommMenuChoiceCount >= 5)
309 "VID-COM SYSTEM\nTo: ");
310 else
312 "VID-COM SYSTEM\n\nTo: ");
316 "UNIDENTIFIED");
317 else
320 g_cCommMenuRecipient]->name);
322 "\n");
324 "CHOOSE");
325 }
326}
327
328/* Function start: 0x447D85 */
340
341/* Function start: 0x447DE3 */
353
354/* Function start: 0x447E47 */
356{
357 signed char choice;
358
359 if (IsCommChoiceMenuOpen() == 0)
361 if (IsCommChoiceMenuOpen() != 0) {
362 set_new_vdu(1);
367 for (choice = 0; choice < g_nCommMenuChoiceCount;
368 choice++) {
369 DrawFormattedText("\n%d.%s",
370 (int)choice + 1,
372 }
374 }
375}
376
377/* Function start: 0x447EF5 */
379{
380 PlaySfxWaveFileByNumber(0x19, -1, 0);
381 switch (g_cPendingCommMenuAction) {
382 case 0:
384 break;
385 case 1:
386 if (g_abCommMenuChoiceCommand[choice] == 0) {
388 } else {
389 if (g_abCommMenuChoiceCommand[choice] == 1)
391 else
394 }
395 break;
396 case 2:
399 (short)g_abCommMenuChoiceCommand[choice]);
400 if (g_abCommMenuChoiceCommand[choice] >=
403 (short)(g_nEnemyTauntCommandBase & 0xfe);
404 }
405 break;
406 }
407}
408
409short get_mode(short i);
410void pop_mode(short i);
411
412/* Function start: 0x448008 */
413void IssueQuickCommCommand(short recipient, short command)
414{
415 request(0, recipient, command);
416 if (g_nEnemyTauntCommandBase <= command)
418 (short)(g_nEnemyTauntCommandBase & 0xfe);
419}
420
421/* Function start: 0x44804A */
428
429/* Function start: 0x448070 */
431{
434 23, 1);
436 if (get_mode(1) == 6)
437 pop_mode(1);
438}
439
440/* Function start: 0x4480C6 */
449
450/* Function start: 0x448100 */
457
458/* Function start: 0x448136 */
459char *ExpandCommMessageTokens(const char *text)
460{
461 char *dest;
462 const char *marker;
463 const char *tag;
464 short scratchLength;
465
466 g_16_szTextBufferBuffer[0] = '\0';
467 while ((marker = DosStrchr(text, '$')) != 0) {
469 while (marker != text)
470 *dest++ = *text++;
471 *dest = '\0';
472 marker++;
473 tag = marker++;
474 switch (*tag) {
475 case 'C':
478 break;
479 case 'R':
484 DosStrlen(g_16_szTextBufferBuffer) - 1] == '.' &&
485 *marker == '.') {
486 scratchLength = DosStrlen(g_16_szTextBufferBuffer);
487 g_16_szTextBufferBuffer[scratchLength - 1] = '\0';
488 }
489 break;
490 case 'N':
491 case 'P':
494 break;
495 }
496 text = marker;
497 }
500}
501
502long GetNamedPacketSize(const char *filename, short section);
503void LoadAndPlaySpeechPacket(char *fileName, short section);
504void *LoadPacketIntoBuffer(char *fileName, short section, void *destination,
505 int registerHandle);
506void malf_noise(short vdu, int effect, unsigned short colour, short sound,
507 short refresh);
508
509/* Function start: 0x4482CA */
510void real_vid_transmit(short obj, short message)
511{
512 int size;
513 char callsign[20];
514 char packetFile[16];
515 char text[84];
516 char *expanded;
517 char indexText[8];
518
523 if (g_nCommPortraitIndex == -1)
524 return;
527 if (g_bVideoImagesSuppressed == 0) {
533 }
534 if (g_pCommPortraitResource != 0) {
535 push_mode(1, 6);
537 0x17, 1);
547 }
548 }
549 strcpy(packetFile, "communic.s");
550 if (g_nCommPortraitIndex < 10)
551 strcat(packetFile, "0");
552 itoa((int)g_nCommPortraitIndex, indexText, 10);
553 strcat(packetFile, indexText);
554 size = GetNamedPacketSize(packetFile, message);
555 g_nCommMessageIndex = message;
556 if (g_bSpeechEnabledFlag != 0 && size > 0 &&
557 size < g_nDigiSampleBytes) {
559 LoadAndPlaySpeechPacket(packetFile, message);
561 return;
562 }
563 /* The sampled line and its subtitle share a packet number: "communic.s"
564 * carries the speech, "communic.t" the text. */
565 packetFile[9] = 't';
566 if (GetNamedPacketSize(packetFile, message) > 0) {
567 LoadPacketIntoBuffer(packetFile, message,
569 if (g_asShipIdentified[obj] != 0)
570 sprintf(callsign, g_apShipMissionRecord[obj]->name);
571 else
572 sprintf(callsign, "UNKNOWN");
573 sprintf(text, "%s: %Fs", callsign,
575 expanded = ExpandCommMessageTokens(text);
576 ShowCentredPrompt(expanded, MeasureMessageWidth(text));
577 }
578}
579
580/* Linker commons defined here. LINK lays a unit's commons out by the
581 * identifiers' hash keys, so these spellings follow the original addresses. */
582char *g_48_apCommunicationTextPacketsTable[50]; /* 0x005d17c0 */
583char g_szOnScreenMessageBuffer[52]; /* 0x005d1890 */
584int g_11_nUnusedCommWordWord[5]; /* 0x005d18d0 */ /* never referenced */
585char g_szCommMessageTextText[0x58]; /* 0x005d18f0 */
586signed char g_abCommMenuChoiceCommand[7]; /* 0x005d1948 */
587const char *g_pszCommScreenHeading; /* 0x005d1950 */
588char g_4_szCommMenuHeadingStore[0x40]; /* 0x005d1960 */
589const char *g_1_apszCommMenuChoiceTextTable[7]; /* 0x005d19a0 */
int g_11_nUnusedCommWordWord[5]
Definition comm.c:584
void show_communications_disp(void)
Definition comm.c:355
short get_mode(short i)
Definition cockpt.c:630
void LoadCommPortraitResources(short portrait)
Definition comm.c:25
void * LoadPacketAllocated(char *fileName, short section)
Definition disk.c:157
short have_target(void)
Definition comm.c:118
void SendCommMenuChoice(short i)
Definition comm.c:76
void malf_noise(short vdu, int effect, unsigned short colour, short sound, short refresh)
Definition cockpt.c:2764
void ResetCommMenuChoices(short reuse)
Definition comm.c:39
void BuildCommunicationCommandMenu(void)
Definition comm.c:199
short IsCommMenuIdle(void)
Definition comm.c:54
short DosStrlen(const char *s)
Definition eventmgr.c:479
void EndCommMenu(void)
Definition comm.c:441
void IssueQuickCommCommand(short recipient, short command)
Definition comm.c:413
short unactive(short ship)
Definition logic.c:186
long GetNamedPacketSize(const char *filename, short section)
Definition eventmgr.c:2164
void DrawSpriteDefault(Viewport *viewport, short x, short y, unsigned char *shape, short frame)
Definition gr.c:682
short any_enemy(short obj, short range)
Definition logic.c:610
short IsCommChoiceMenuOpen(void)
Definition comm.c:92
void InvalidateVduMode(short i)
Definition cockpt.c:714
void RefreshCommunicationMenu(void)
Definition comm.c:329
void CockpitMessage(const char *text, unsigned short colour, int flashCount)
Definition cockpt.c:373
void real_vid_transmit(short obj, short message)
Definition comm.c:510
void OpenCommRecipientMenu(void)
Definition comm.c:98
void CloseCommChoiceMenu(void)
Definition comm.c:105
void EndCommSessionWithWingman(void)
Definition comm.c:430
void ShowCentredPrompt(char *text, unsigned short arg)
Definition comm.c:451
char * ExpandCommMessageTokens(const char *text)
Definition comm.c:459
void clear_message_time(void)
Definition cockpt.c:720
void AppendCommMenuChoice(const char *text, short command)
Definition comm.c:60
void HandleCommunicationMenuRequest(void)
Definition comm.c:342
void * FetchDiskPacketRetrying(char *fileName, short section, short flags)
Definition disk.c:187
short CanOpenCommMenu(void)
Definition comm.c:124
void Chosen_communicate_option(short choice)
Definition comm.c:378
void LoadAndPlaySpeechPacket(char *fileName, short section)
Definition speech.c:103
void pop_mode(short i)
Definition cockpt.c:673
void OpenCommMenuForTarget(const char *heading, const char *message)
Definition comm.c:85
char * DosStrcpy(char *dst, const char *src)
Definition eventmgr.c:465
short MeasureMessageWidth(const char *text)
Definition main.c:895
void SelectCommRecipient(short recipient)
Definition comm.c:130
void * LoadPacketIntoBuffer(char *fileName, short section, void *destination, int registerHandle)
Definition disk.c:141
short wingman_dead(void)
Definition comm.c:112
void SetHudMessageText(char *text, unsigned short colour, unsigned short duration)
Definition cockpt.c:2742
void get_facing_range_from_object(short obj, short other)
Definition geom.c:578
void push_mode(short i, int state)
Definition cockpt.c:664
void set_new_vdu(short vdu)
Definition cockpt.c:680
void PlaySfxWaveFileByNumber(int soundNumber, int sourceObject, int looping)
Definition music.c:490
char * DosStrchr(const char *s, short c)
Definition eventmgr.c:459
void DismissHudMessageIfShowing(void)
Definition cockpt.c:2756
void RestoreHudMessageBackground(void)
Definition cockpt.c:2143
void request(short requester, short ship, short command)
Definition orders.c:182
void FreePacketAndClear(void *slot, unsigned short releaseFlags)
Definition disk.c:45
void FreeCommDisplayResources(void)
Definition comm.c:422
void DrawFormattedText(const char *format,...)
Definition textfmt.c:103
void BuildCommunicationRecipientMenu(void)
Definition comm.c:137
void DrawTextAt(TextContext *context, int x, int y, const char *text, unsigned char alignment)
short message_showing(void)
Definition cockpt.c:726
char * DosStrcat(char *destination, const char *source)
Definition fstrcat.c:9
Shared Win32 declarations, types and library interfaces.
@ MISSION_TYPE_CANNED_SEQUENCE
Definition game_data.h:132
@ OBJECT_TYPE_DEBRIS_GLASS
Definition game_data.h:112
@ SIDE_IMPERIAL
Definition game_data.h:175
@ SIDE_KILRATHI
Definition game_data.h:176
@ OBJECTIVE_HOLD_FORMATION
Definition game_data.h:147
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
MissionShipRecord * g_apShipMissionRecord[10]
Definition viewrect.c:161
short g_nCommMessageIndex
Definition cockpt.c:11
short g_bCommSpeechPlaying
Definition comm.c:22
short g_nEnemyTauntCommandBase
Definition comm.c:9
short g_nYourWingman
Definition viewrect.c:75
short g_nCommSpeakerRating
Definition comm.c:20
signed char g_bVideoImagesSuppressed
Definition comm.c:15
short g_nFacingToTarget
Definition viewrect.c:45
short g_bSpeechEnabledFlag
Definition startup.c:598
const int g_nDigiSampleBytes
Definition speech.c:9
signed char g_cCommMenuRecipient
Definition comm.c:18
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
short g_asShipIdentified[12]
Definition viewrect.c:182
char * g_pszPendingHudMessage
Definition cockpt.c:32
signed char g_acShipTarget[16]
Definition viewrect.c:167
short g_asObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:124
unsigned char g_cYellowColour
Definition startup.c:547
char g_4_szCommMenuHeadingStore[0x40]
Definition comm.c:588
ObjectTypeData g_aObjectTypeData[OBJECT_DATA_COUNT]
Definition campglob.c:310
signed char g_bRadioSilence
Definition comm.c:14
short g_nCommMenuReuseMode
Definition comm.c:11
const char * g_pszCommScreenHeading
Definition comm.c:587
signed char g_cPendingCommMenuAction
Definition comm.c:13
signed char g_abCommMenuChoiceCommand[7]
Definition comm.c:586
unsigned char * g_pCommVduFrameResource
Definition comm.c:17
signed char g_acShipPortrait[12]
Definition viewrect.c:159
short g_nCommDeathSequenceFrame
Definition cockpt.c:10
short g_bEjectionAwaitingCommCommand
Definition mission.c:13
short g_19_nCommPortraitAnimationTickWord
Definition cockpt.c:3801
unsigned char g_ucPendingEjectionTransition
Definition mission.c:11
short g_nEnemyCommPilotIndex
Definition mission.c:1464
short g_6_nHomeOperationShipIndexValue
Definition cockpt.c:3806
signed char g_bLandingCommRequestPending
Definition spc.c:9
short g_nTargetFacing
Definition viewrect.c:46
char g_szCommMessageTextText[0x58]
Definition comm.c:585
char g_szOnScreenMessageBuffer[52]
Definition comm.c:583
short g_nAutoEngageTimer
Definition viewrect.c:191
Viewport g_4_stRightVduView
Definition cockpt.c:3842
unsigned char g_bPrimaryViewBufferColour
Definition startup.c:545
char g_16_szTextBufferBuffer[256]
Definition cockpt.c:3793
signed char g_cMessageSpeed
Definition comm.c:12
const char * g_1_apszCommMenuChoiceTextTable[7]
Definition comm.c:589
short g_19_bStoredHighMemoryEnabled
Definition eventmgr.c:2505
short g_nCommPortraitIndex
Definition comm.c:21
unsigned char g_cDarkGreenColour
Definition startup.c:549
short g_asShipMissionIndex[12]
Definition viewrect.c:153
short g_nCommMenuChoiceCount
Definition comm.c:10
TextContext g_1_stRightVduTextContextBlock
Definition message.c:237
short g_nCommSpeakerObject
Definition comm.c:19
short g_aeShipObjective[12]
Definition viewrect.c:166
short g_nLoadedCommPortraitPilot
Definition viewrect.c:55
short g_nTargetRange
Definition viewrect.c:47
unsigned char * g_pCommPortraitResource
Definition comm.c:16
const char * g_apszPilotRankNames[5]
Definition personnel.c:11
PilotProfile g_stCurrentPilotProfile
Definition viewrect.c:73
short g_asShipMissionType[12]
Definition viewrect.c:163
short g_asShipSide[12]
Definition viewrect.c:139
signed char g_acObjectType[SPACE_OBJECT_COUNT]
Definition viewrect.c:101
short g_1_nEnemyCommCommandBase
Definition mission.c:1463
MissionHeader g_13_stMissionHeaderBlock
Definition hotspot.c:253
char * g_48_apCommunicationTextPacketsTable[50]
Definition comm.c:582
short wingmanMissionShip
Definition game_data.h:1344
char callsign[13]
Definition game_data.h:1115
char lastName[25]
Definition game_data.h:1114
short left
Definition game.h:152
short top
Definition game.h:153