Wing Commander
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
gameflow.c
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup campaign
4 * @brief Campaign flow and mission scoring.
5 *
6 * Address range 40efe0-40fa2f. The viewport-disposal helper at its end,
7 * free_viewport, stays here provisionally.
8 */
9#include "wc1.h"
10
11int bOfficeVisitPending = 0; /* 0x004688cc */
12int bPromotionPending = 0; /* 0x004688d0 */
13int bPlayerEjectedThisMission = 0; /* 0x004688d4 */
14int bPlayerShipTypeChanged = 0; /* 0x004688d8 */
15short nPreviousPlayerShipType = 0; /* 0x004688dc */
16int bCampaignStartupMode = 0; /* 0x004688e0 */
17static
18short nPendingMedalIndex = -1; /* 0x004688e4 */
19static
20short nPostSeriesSequence = -1; /* 0x004688e8 */
21static unsigned short bSeriesFailed = 1; /* 0x004688ec */
22int bCampaignActive = 0; /* 0x004688f0 */
23
24/* Linker commons defined here; LINK orders them by identifier hash. */
25int nViewAllocTotal; /* 0x005a7f0c */
26unsigned char *apViewportAllocations[128]; /* 0x005a7f10 */
27int nFreeViewCallsValue; /* 0x005a8110 */
28short nQueuedCampaignIndex; /* 0x005a8114 */
29short nMissionMedalScoreValue; /* 0x005a8116 */
30short nCampaignDataSet; /* 0x005a8118 */
31
32/* Function start: 0x40EFE0 */
33void add_statistics(short pilot, short missions, short kills)
34{
35 apWingmanPilotsList[pilot]->missions += missions;
36 apWingmanPilotsList[pilot]->kills += kills;
37}
38
39/* Function start: 0x40F010 */
40void PostMission(void)
41{
42 short oldKills;
43 short pilot;
44 short missions;
45
47 if (oldKills < 5 && oldKills + nPlayerKillTotal >= 5)
50 else if (oldKills < 25 &&
51 oldKills + nPlayerKillTotal >= 25)
54
61
62 oldKills /= 5;
65 case 1:
68 /* The retail switch deliberately falls through. */
69 case 5:
72 break;
73 case 10:
76 break;
77 case 15:
80 break;
81 }
82
85 if (oldKills <
88
89 for (pilot = 0; pilot < 8; pilot++) {
90 if (nYourWingman != -1 &&
91 acShipRating[nYourWingman] == pilot) {
94 pilot] == 0) {
95 missions = RandomInRange(0, 2);
96 add_statistics(pilot, missions,
97 missions == 0 ? 0 :
98 (unsigned short)RandomInRange(
100 }
101 }
102}
103
104/* Function start: 0x40F190 */
106{
107 short objective;
108 signed char *scores;
109 short score;
110
111 score = 0;
112 scores = (signed char *)(pMissionCampaignInfo +
113 (int)stCampaignState.currentMission * 0x14 +
114 (int)stCampaignState.currentSeries * 0x5a - 0x50);
115 for (objective = 0; objective < 16; objective++) {
116 score = (short)(score + scores[objective + 4]);
117 }
118 return score;
119}
120
121/* Function start: 0x40F1E0 */
123{
124 short objective;
125 signed char *scores;
126 short score;
127
128 score = 0;
129 scores = (signed char *)(pMissionCampaignInfo +
130 (int)stCampaignState.currentSeries * 0x5a +
131 (int)stCampaignState.currentMission * 0x14 - 0x50);
132 for (objective = 0; objective < 16; objective++) {
133 if (achieved(objective) != 0)
134 score = (short)(score + scores[objective + 4]);
135 }
136 return score;
137}
138
139/* Function start: 0x40F240 */
140unsigned int UpdateSeries(void)
141{
142 unsigned char *seriesData;
143 short *medalData;
144 short playerScore;
145
147 seriesData = pMissionCampaignInfo +
148 (int)stCampaignState.currentSeries * 0x5a - 0x5a;
149 medalData = (short *)(pMissionCampaignInfo +
150 (int)stCampaignState.currentSeries * 0x5a +
151 (int)stCampaignState.currentMission * 0x14 - 0x50);
152
153 playerScore = (short)PlayersMissionScore();
154 if ((short)FullMissionScore() == playerScore)
157 stCampaignState.seriesScore + playerScore);
159
161 (signed char)seriesData[2]) {
165 (short)(signed char)seriesData[5];
171 *(short *)(seriesData + 3)) {
173 (signed char)seriesData[6];
175 (enum ObjectType)(signed char)seriesData[7];
176 bSeriesFailed = 0;
177 } else {
179 (signed char)seriesData[8];
181 (enum ObjectType)(signed char)seriesData[9];
182 bSeriesFailed = 1;
183 }
188 }
191 if ((signed char)pMissionCampaignInfo[
193 0x5a + 5] ==
195 nPostSeriesSequence < 0x40)
197 }
198
201 MaxShort(0, (short)(
203 if (medalData[1] <= nMissionMedalScoreValue &&
204 nPendingMedalIndex == -1) {
207 nPendingMedalIndex = medalData[0];
208 }
209 return 0;
210}
211
212/* Function start: 0x40F3F0 */
213unsigned int MoveNewCampaign(void)
214{
217 else
219 if (pCurrentCampaignDate->day >= 366) {
222 }
223 return 0;
224}
225
226/* Function start: 0x40F440 */
227unsigned int StartNewCampaign(short campaign)
228{
229 bCampaignActive = 1;
232 RunTrainSim();
234 nCampaignDataSet = campaign;
240 return 0;
241}
242
243/* Function start: 0x40F4B0 */
244short GameFlow(void)
245{
246 short roomSelection;
247 int barracksSelection;
248 short launchMission;
249 short flownSeries;
250 short flownMission;
251 short nextSeries;
252 short nextMission;
253 int flightResult;
254
255 launchMission = 0;
257 if (nQueuedCampaignIndex != -1) {
260 }
261
263 do {
264 roomSelection = 0;
271 if (bCampaignStartupMode == 0)
272 roomSelection = RecRoom();
274 if (roomSelection == 5) {
275 RunTrainSim();
276 } else {
277 barracksSelection = BarracksScreen();
279 if (barracksSelection == 6)
280 return 0;
281 if (barracksSelection == 7)
282 launchMission++;
283 }
285 } while (launchMission == 0);
286
288 nDebriefingPersonality = *(short *)(
290 (short)stCampaignState.currentSeries * 0x5a - 0x5a);
297 scramble();
298 flownSeries = (short)stCampaignState.currentSeries;
299 flownMission = (short)stCampaignState.currentMission;
300 init_mission(flownSeries, flownMission);
302 flightResult = RunSpaceFlight(-1);
303
304 switch (flightResult) {
305 case 1:
306 free_cockpit();
308 (signed char)nPlayerCollisionObject);
309 nArcadeState = 0;
311 free_3Space();
312 flightResult = calculate_damage_level();
313 landing((signed char)flightResult);
314 break;
315 case 2:
318 if (nArcadeState == 3)
320 free_3Space();
321 if (nArcadeState == 3)
322 return 0;
323 nArcadeState = 0;
326 0, (short)(stCampaignState.promotionScore - 1));
331 break;
332 case 3:
334 free_3Space();
335 return 0;
336 case 4:
338 free_3Space();
340 bCampaignActive = 0;
341 return 0;
342 default:
343 free_cockpit();
345 free_3Space();
346 return 0;
347 }
348
349 PostMission();
350 UpdateSeries();
351 nextSeries = (short)stCampaignState.currentSeries;
352 nextMission = (short)stCampaignState.currentMission;
353 stCampaignState.currentSeries = (signed char)flownSeries;
354 stCampaignState.currentMission = (signed char)flownMission;
355
356 if (bPlayerEjectedThisMission == 0) {
357 if ((unsigned short)RandomInRange(0, 5) +
361 (nCampaignDataSet == 0 &&
363 (nCampaignDataSet > 0 &&
366 bOfficeVisitPending != 0 ||
368 }
369 DeBriefing(flownSeries, flownMission);
370 if (bPromotionPending != 0)
372 }
373
374 if (nextSeries == -1) {
375 if (nPendingMedalIndex != -1)
377
378 switch (nPostSeriesSequence) {
379 case -1:
381 break;
382 case 0x40:
385 break;
386 case 0x41:
389 break;
390 default:
392 (short)bSeriesFailed);
394 break;
395 }
396 bCampaignActive = 0;
397 return 0;
398 }
399
402 if (bOfficeVisitPending == 1)
403 Office();
404 if (nPendingMedalIndex != -1) {
407 }
408 if (nPostSeriesSequence != -1)
410 (short)bSeriesFailed);
411 stCampaignState.currentSeries = (signed char)nextSeries;
412 stCampaignState.currentMission = (signed char)nextMission;
416 return 1;
417}
418
419/* Function start: 0x40F940 */
420void __stdcall free_viewport(Viewport *viewport)
421{
422 int i;
423 unsigned char *allocation;
424
426 allocation = viewport->allocation;
427 if (allocation != 0) {
428 for (i = 0; i < nViewAllocTotal; i++) {
429 if (apViewportAllocations[i] == viewport->allocation) {
432 break;
433 }
434 }
435 if (viewport->rowOffsets != 0) {
437 viewport->rowOffsets = 0;
438 }
439 if (nVideoMode != 0x13)
440 printf("free_viewport not mcga\n");
441 ReleasePacketHandle(allocation);
442 viewport->pixels = 0;
443 viewport->allocation = 0;
444 if (stScreenView.pixels == allocation)
446 if (stScreenView.allocation == allocation)
448 if (stSceneBuffer.pixels == allocation)
450 if (stSceneBuffer.allocation == allocation)
452 }
453}
static unsigned short bSeriesFailed
Definition gameflow.c:21
static short nPostSeriesSequence
Definition gameflow.c:20
static short nPendingMedalIndex
Definition gameflow.c:18
signed char acShipRating[16]
Definition joycal.c:25
MissionHeaderDisk stCurrentMissionHeader
Definition mission.c:57
short nMissionMedalScoreValue
Definition gameflow.c:29
short nCampaignDataSet
Definition gameflow.c:30
int bPlayerShipTypeChanged
Definition gameflow.c:14
short nVideoMode
Definition video.c:12
short nDebriefingPersonality
Definition mission.c:14
unsigned int bKeyEventQueueEnabled
Definition winmain.c:31
int bPlayerEjectedThisMission
Definition gameflow.c:13
short nYourWingman
Definition game.c:61
short nPlayerCollisionObject
Definition game.c:64
int nViewAllocTotal
Definition gameflow.c:25
CampaignDate stSavedCampaignDate
Definition screens.c:14
Viewport stSceneBuffer
Definition select.c:17
int nArcadeState
Definition main.c:22
short nWingmanKillCount
Definition init.c:57
Viewport stScreenView
Definition launch.c:50
int bPromotionPending
Definition gameflow.c:12
short nQueuedCampaignIndex
Definition gameflow.c:28
short nPreviousPlayerShipType
Definition gameflow.c:15
PilotRecord * apWingmanPilotsList[8]
Definition gr.c:1533
CampaignState stCampaignState
Definition dib.c:107
int bCampaignActive
Definition gameflow.c:22
int nFreeViewCallsValue
Definition gameflow.c:27
int bPanRoomTransition
Definition killbrd.c:172
int bCampaignStartupMode
Definition gameflow.c:16
unsigned char * apViewportAllocations[128]
Definition gameflow.c:26
short nPlayerKillTotal
Definition logic.c:112
MissionShipRecord aMissionShips[MISSION_SHIP_STORAGE_COUNT]
Definition game.c:230
int bOfficeVisitPending
Definition gameflow.c:11
unsigned char * pMissionCampaignInfo
Definition gr.c:1529
int nCurrentWingmanKilledThisMission
Definition init.c:56
short asCampaignPilotFiles[3]
Definition barracks.c:56
CampaignDate * pCurrentCampaignDate
Definition mission.c:58
short day
Definition wcdata.h:607
short year
Definition wcdata.h:608
signed char seriesHistory[8]
Definition wcdata.h:717
PilotRecord * currentPilot
Definition wcdata.h:710
signed char seriesHistoryCount
Definition wcdata.h:716
short missionScore
Definition wcdata.h:723
CampaignDate elapsedDate
Definition wcdata.h:721
short seriesScore
Definition wcdata.h:724
unsigned char badges[12]
Definition wcdata.h:713
short campaignIndex
Definition wcdata.h:725
short promotionScore
Definition wcdata.h:722
enum ObjectType playerShipType
Definition wcdata.h:711
signed char currentSeries
Definition wcdata.h:715
int personalityDeathMission[8]
Definition wcdata.h:718
signed char currentMission
Definition wcdata.h:714
short playerMissionShip
Definition wcdata.h:565
enum ObjectType type
Definition wcdata.h:880
short kills
Definition wcdata.h:602
short missions
Definition wcdata.h:601
short rank
Definition wcdata.h:600
unsigned char * pixels
Definition wc1base.h:74
unsigned char * allocation
Definition wc1base.h:80
unsigned short * rowOffsets
Definition wc1base.h:75
Umbrella header for the game core.
unsigned int free_cockpit(void)
Definition logic.c:1876
unsigned int Briefing(short series, short mission)
Definition cmpgn.c:413
short RecRoom(void)
Definition killbrd.c:331
void AddRandomTrainSimHighScores(void)
Definition trainsim.c:236
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
void add_statistics(short pilot, short missions, short kills)
Definition gameflow.c:33
void RunTrainSim(void)
Definition trainsim.c:847
int RunSpaceFlight(short entryNavPoint)
Definition main.c:1994
unsigned int landing(signed char damageLevel)
Definition cutscene.c:761
void * LoadPacketIntoBuffer(short logicalFile, short section, void *destination)
Definition disk.c:80
void stranded_sequence(void)
Definition eject.c:202
int free_all_slots(void)
Definition mission.c:397
unsigned int PumpWindowMessages(void)
Definition winmain.c:740
unsigned int funeral_sequence(int playerFuneral)
Definition cutscene.c:1049
short BarracksScreen(void)
Definition barracks.c:975
short achieved(short objective)
Definition cockpt.c:1042
void PostMission(void)
Definition gameflow.c:40
short GameFlow(void)
Definition gameflow.c:244
unsigned int ShowTigerClawEscapeScene(void)
Definition ending.c:368
unsigned int ShowCarrierLaunchSequence(signed char sceneObject)
Definition launch.c:145
unsigned int scramble(void)
Definition cutscene.c:596
void check_stranded(void)
Definition cockpt.c:2757
unsigned int UpdateSeries(void)
Definition gameflow.c:140
unsigned int PlayScrambleHangarScene(void)
Definition cutscene.c:279
unsigned int StartNewCampaign(short campaign)
Definition gameflow.c:227
int PlayersMissionScore(void)
Definition gameflow.c:122
unsigned int DeBriefing(short series, short mission)
Definition cmpgn.c:434
int calculate_damage_level(void)
Definition main.c:2123
unsigned int death_sequence(void)
Definition screens.c:1645
unsigned int ShowTheEndScreen(short enableFireworks)
Definition ending.c:495
unsigned int MoveNewCampaign(void)
Definition gameflow.c:213
void __stdcall free_viewport(Viewport *viewport)
Definition gameflow.c:420
void ReleasePacketHandle(void *handle)
Definition ending.c:50
unsigned int ejection_sequence(void)
Definition eject.c:32
unsigned int init_mission(short series, short mission)
Definition mission.c:99
int FullMissionScore(void)
Definition gameflow.c:105
void FrameStartHook(int mode)
Definition screen.c:444
short MaxShort(short a, short b,...)
Definition mathutil.c:29
unsigned int Office(void)
Definition cmpgn.c:478
void ResetCampaignData(void)
Definition killbrd.c:881
short __stdcall RandomInRange(short lo, short hi)
Definition mathfp.c:49
unsigned int ShowCampaignVictorySequence(void)
Definition ending.c:132
@ CAMPAIGN_BADGE_FIFTEEN_MISSIONS
Definition wcdata.h:702
@ CAMPAIGN_BADGE_FIVE_KILLS
Definition wcdata.h:698
@ CAMPAIGN_BADGE_TEN_MISSIONS
Definition wcdata.h:701
@ CAMPAIGN_BADGE_TWENTY_FIVE_KILLS
Definition wcdata.h:699
@ CAMPAIGN_BADGE_FIVE_MISSIONS
Definition wcdata.h:700
@ CAMPAIGN_BADGE_SHIP_TYPE_BASE
Definition wcdata.h:697
@ CAMPAIGN_BADGE_FIRST_MISSION
Definition wcdata.h:696
ObjectType
Definition wcdata.h:54