Improve mission code readability.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@3723 4a71c877-e1ca-e34f-864e-861f7616d084
master
Per Inge Mathisen 2008-02-09 11:17:34 +00:00
parent 67d38b5298
commit ac65ebfdfc
3 changed files with 214 additions and 455 deletions

View File

@ -325,7 +325,6 @@ void initMission(void)
UDWORD inc; UDWORD inc;
debug( LOG_NEVER, "***Init Mission ***\n" ); debug( LOG_NEVER, "***Init Mission ***\n" );
//mission.type = MISSION_NONE;
mission.type = LDS_NONE; mission.type = LDS_NONE;
for (inc = 0; inc < MAX_PLAYERS; inc++) for (inc = 0; inc < MAX_PLAYERS; inc++)
{ {
@ -334,12 +333,11 @@ void initMission(void)
mission.apsFeatureLists[inc] = NULL; mission.apsFeatureLists[inc] = NULL;
//mission.apsProxDisp[inc] = NULL; //mission.apsProxDisp[inc] = NULL;
mission.apsFlagPosLists[inc] = NULL; mission.apsFlagPosLists[inc] = NULL;
apsLimboDroids[inc] = NULL; apsLimboDroids[inc] = NULL;
} }
offWorldKeepLists = FALSE; offWorldKeepLists = FALSE;
mission.time = -1; mission.time = -1;
// ffs ab setMissionCountDown();
setMissionCountDown();
mission.ETA = -1; mission.ETA = -1;
mission.startTime = 0; mission.startTime = 0;
@ -360,16 +358,13 @@ void initMission(void)
} }
// init the vtol return pos // init the vtol return pos
memset(asVTOLReturnPos, 0, sizeof(Vector2i)*MAX_PLAYERS); memset(asVTOLReturnPos, 0, sizeof(Vector2i) * MAX_PLAYERS);
bDroidsToSafety = FALSE; bDroidsToSafety = FALSE;
setPlayCountDown(TRUE);
//start as not cheating!
setPlayCountDown(TRUE); mission.cheatTime = 0;
//start as not cheating!
mission.cheatTime = 0;
} }
// reset the vtol landing pos // reset the vtol landing pos
@ -413,14 +408,14 @@ BOOL missionShutDown(void)
for (inc = 0; inc < MAX_PLAYERS; inc++) for (inc = 0; inc < MAX_PLAYERS; inc++)
{ {
apsDroidLists[inc] = mission.apsDroidLists[inc]; apsDroidLists[inc] = mission.apsDroidLists[inc];
mission.apsDroidLists[inc] = NULL; mission.apsDroidLists[inc] = NULL;
apsStructLists[inc] = mission.apsStructLists[inc]; apsStructLists[inc] = mission.apsStructLists[inc];
mission.apsStructLists[inc] = NULL; mission.apsStructLists[inc] = NULL;
apsFeatureLists[inc] = mission.apsFeatureLists[inc]; apsFeatureLists[inc] = mission.apsFeatureLists[inc];
mission.apsFeatureLists[inc] = NULL; mission.apsFeatureLists[inc] = NULL;
//apsProxDisp[inc] = mission.apsProxDisp[inc]; //apsProxDisp[inc] = mission.apsProxDisp[inc];
apsFlagPosLists[inc] = mission.apsFlagPosLists[inc]; apsFlagPosLists[inc] = mission.apsFlagPosLists[inc];
mission.apsFlagPosLists[inc] = NULL; mission.apsFlagPosLists[inc] = NULL;
} }
psMapTiles = mission.psMapTiles; psMapTiles = mission.psMapTiles;
@ -480,7 +475,6 @@ void setMissionCountDown(void)
} }
//BOOL startMission(MISSION_TYPE missionType, char *pGame)
BOOL startMission(LEVEL_TYPE missionType, char *pGame) BOOL startMission(LEVEL_TYPE missionType, char *pGame)
{ {
BOOL loaded = TRUE; BOOL loaded = TRUE;
@ -489,45 +483,12 @@ BOOL startMission(LEVEL_TYPE missionType, char *pGame)
setPlayerHasLost(FALSE); setPlayerHasLost(FALSE);
setPlayerHasWon(FALSE); setPlayerHasWon(FALSE);
/*and win/lose video is obvioulsy not playing*/ /* and win/lose video is obvioulsy not playing */
setScriptWinLoseVideo(PLAY_NONE); setScriptWinLoseVideo(PLAY_NONE);
//HACKY HACK HACK // this inits the flag so that 'reinforcements have arrived' message isn't played for the first transporter load
//this inits the flag so that 'reinforcements have arrived' message isn't played for the first transporter load initFirstTransporterFlag();
initFirstTransporterFlag();
// if (missionType == LDS_CAMSTART)
// {
//only load up one campaign start
// if (!DemoStart)
// {
// DBERROR(("Unable to load mission"));
// return FALSE;
// }
// DemoStart = FALSE;
// }
// else if (missionType == LDS_MKEEP)
// {
//only load up one other mission
// if (!DemoExpand)
// {
// DBERROR(("Unable to load mission"));
// return FALSE;
// }
// DemoExpand = FALSE;
// }
// else if(missionType == LDS_BETWEEN)
// {
// // do nothing.
// }
// else
// {
// //don't want to load up any other type of mission
// DBERROR(("Unable to load mission"));
// return FALSE;
// }
//if (mission.type != MISSION_NONE)
if (mission.type != LDS_NONE) if (mission.type != LDS_NONE)
{ {
/*mission type gets set to none when you have returned from a mission /*mission type gets set to none when you have returned from a mission
@ -541,7 +502,6 @@ BOOL startMission(LEVEL_TYPE missionType, char *pGame)
initEffectsSystem(); initEffectsSystem();
//load the game file for all types of mission except a Between Mission //load the game file for all types of mission except a Between Mission
//if (missionType != MISSION_BETWEEN)
if (missionType != LDS_BETWEEN) if (missionType != LDS_BETWEEN)
{ {
loadGameInit(pGame); loadGameInit(pGame);
@ -581,22 +541,6 @@ BOOL startMission(LEVEL_TYPE missionType, char *pGame)
} }
case LDS_CAMCHANGE: case LDS_CAMCHANGE:
{ {
/*if (getCampaignNumber() == 1)
{
//play the cam 2 video
seq_ClearSeqList();
seq_AddSeqToList("cam2/c002.rpl",NULL,"cam2/c002.txa",FALSE);
seq_StartNextFullScreenVideo();
}
else
{
//play the cam 3 video
seq_ClearSeqList();
seq_AddSeqToList("cam2/cam2out.rpl",NULL,NULL,FALSE);
seq_AddSeqToList("cam3/c003.rpl",NULL,"cam3/c003.txa",FALSE);
seq_StartNextFullScreenVideo();
}*/
if (!startMissionCampaignChange(pGame)) if (!startMissionCampaignChange(pGame))
{ {
loaded = FALSE; loaded = FALSE;
@ -645,11 +589,11 @@ BOOL startMission(LEVEL_TYPE missionType, char *pGame)
mission.type = missionType; mission.type = missionType;
if (missionIsOffworld()) if (missionIsOffworld())
{ {
//add what power have got from the home base //add what power have got from the home base
adjustMissionPower(); adjustMissionPower();
} }
if (missionCanReEnforce()) if (missionCanReEnforce())
{ {
@ -662,8 +606,8 @@ BOOL startMission(LEVEL_TYPE missionType, char *pGame)
scoreInitSystem(); scoreInitSystem();
//add proximity messages for all untapped VISIBLE oil resources // add proximity messages for all untapped VISIBLE oil resources
addOilResourceProximities(); addOilResourceProximities();
return TRUE; return TRUE;
} }
@ -700,10 +644,8 @@ adding the timer button*/
void addTransporterTimerInterface(void) void addTransporterTimerInterface(void)
{ {
DROID *psDroid, *psTransporter; DROID *psDroid, *psTransporter;
BOOL bAddInterface = FALSE; BOOL bAddInterface = FALSE;
W_CLICKFORM *psForm;
W_CLICKFORM *psForm;
//check if reinforcements are allowed //check if reinforcements are allowed
if (mission.ETA >= 0) if (mission.ETA >= 0)
@ -719,23 +661,9 @@ void addTransporterTimerInterface(void)
break; break;
} }
} }
if (psDroid) if (psDroid)
{ {
//don't bother checking for reinforcements - always add it if you've got a Transporter bAddInterface = TRUE;
//check the player has some reinforcements back at home
/*psDroid = NULL;
for (psDroid = mission.apsDroidLists[selectedPlayer]; psDroid !=
NULL; psDroid = psDroid->psNext)
{
if (psDroid->droidType != DROID_TRANSPORTER)
{
break;
}
}
//if reinforcements available
if (psDroid)*/
{
bAddInterface = TRUE;
//check timer is not already on the screen //check timer is not already on the screen
if (!widgGetFromID(psWScreen, IDTRANTIMER_BUTTON)) if (!widgGetFromID(psWScreen, IDTRANTIMER_BUTTON))
@ -743,27 +671,25 @@ void addTransporterTimerInterface(void)
intAddTransporterTimer(); intAddTransporterTimer();
} }
//set the data for the transporter timer //set the data for the transporter timer
widgSetUserData(psWScreen, IDTRANTIMER_DISPLAY, (void*)psTransporter); widgSetUserData(psWScreen, IDTRANTIMER_DISPLAY, (void*)psTransporter);
//lock the button if necessary // lock the button if necessary
if (transporterFlying(psTransporter)) if (transporterFlying(psTransporter))
{ {
//disable the form so can't add any more droids into the transporter // disable the form so can't add any more droids into the transporter
psForm = (W_CLICKFORM*)widgGetFromID(psWScreen,IDTRANTIMER_BUTTON); psForm = (W_CLICKFORM*)widgGetFromID(psWScreen,IDTRANTIMER_BUTTON);
if (psForm) if (psForm)
{ {
formSetClickState(psForm, WBUT_LOCK); formSetClickState(psForm, WBUT_LOCK);
} }
} }
}
} }
} // if criteria not met
} if (!bAddInterface)
//if criteria not met
if (!bAddInterface)
{ {
//make sure its not there! // make sure its not there!
intRemoveTransporterTimer(); intRemoveTransporterTimer();
} }
} }
@ -915,9 +841,9 @@ void saveMissionData(void)
apEquivZones = NULL; apEquivZones = NULL;
mission.aZoneReachable = aZoneReachable; mission.aZoneReachable = aZoneReachable;
aZoneReachable = NULL; aZoneReachable = NULL;
//save the selectedPlayer's LZ // save the selectedPlayer's LZ
mission.homeLZ_X = getLandingX(selectedPlayer); mission.homeLZ_X = getLandingX(selectedPlayer);
mission.homeLZ_Y = getLandingY(selectedPlayer); mission.homeLZ_Y = getLandingY(selectedPlayer);
bRepairExists = FALSE; bRepairExists = FALSE;
//set any structures currently being built to completed for the selected player //set any structures currently being built to completed for the selected player
@ -934,24 +860,23 @@ void saveMissionData(void)
{ {
if (psStructBeingBuilt == psStruct) if (psStructBeingBuilt == psStruct)
{ {
//check there is enough power to complete // check there is enough power to complete
//inc = psStruct->pStructureType->powerToBuild - psStruct->currentPowerAccrued; inc = structPowerToBuild(psStruct) - psStruct->currentPowerAccrued;
inc = structPowerToBuild(psStruct) - psStruct->currentPowerAccrued; if (inc > 0)
if (inc > 0) {
{ // not accrued enough power, so check if there is enough available
//not accrued enough power, so check if there is enough available if (checkPower(selectedPlayer, inc, FALSE))
if (checkPower(selectedPlayer, inc, FALSE)) {
{ // enough - so use it and set to complete
//enough - so use it and set to complete usePower(selectedPlayer, inc);
usePower(selectedPlayer, inc); buildingComplete(psStruct);
buildingComplete(psStruct); }
} }
} else
else {
{ // enough power or more than enough! - either way, set to complete
//enough power or more than enough! - either way, set to complete buildingComplete(psStruct);
buildingComplete(psStruct); }
}
//don't bother looking for any other droids working on it //don't bother looking for any other droids working on it
break; break;
} }
@ -996,12 +921,6 @@ void saveMissionData(void)
} }
} }
//THIS HAPPENS AT THE END OF THE CAMCHANGE MISSION NOW - AB 22/12/98
//before copy the pointers over check selectedPlayer's mission.droids since
//there might be some from the previous camapign
//processPreviousCampDroids();
for (inc = 0; inc < MAX_PLAYERS; inc++) for (inc = 0; inc < MAX_PLAYERS; inc++)
{ {
mission.apsStructLists[inc] = apsStructLists[inc]; mission.apsStructLists[inc] = apsStructLists[inc];
@ -1027,8 +946,6 @@ void saveMissionData(void)
initEffectsSystem(); initEffectsSystem();
resetRadarRedraw(); resetRadarRedraw();
} }
/* /*
@ -1094,7 +1011,6 @@ void restoreMissionData(void)
} }
//swap mission data over //swap mission data over
psMapTiles = mission.psMapTiles; psMapTiles = mission.psMapTiles;
aMapLinePoints = mission.aMapLinePoints; aMapLinePoints = mission.aMapLinePoints;
@ -1143,10 +1059,8 @@ void restoreMissionData(void)
resetRadarRedraw(); resetRadarRedraw();
// reset the environ map back to the homebase settings
//reset the environ map back to the homebase settings environReset();
environReset();
//intSetMapPos(mission.playerX, mission.playerY); //intSetMapPos(mission.playerX, mission.playerY);
} }
@ -1154,97 +1068,53 @@ void restoreMissionData(void)
/*Saves the necessary data when moving from one mission to a limbo expand Mission*/ /*Saves the necessary data when moving from one mission to a limbo expand Mission*/
void saveMissionLimboData(void) void saveMissionLimboData(void)
{ {
DROID *psDroid, *psNext; DROID *psDroid, *psNext;
//UDWORD droidX, droidY; //UDWORD droidX, droidY;
//PICKTILE pickRes; //PICKTILE pickRes;
STRUCTURE *psStruct; STRUCTURE *psStruct;
//clear out the audio //clear out the audio
audio_StopAll(); audio_StopAll();
//before copy the pointers over check selectedPlayer's mission.droids since // before copy the pointers over check selectedPlayer's mission.droids since
//there might be some from the previous camapign // there might be some from the previous camapign
processPreviousCampDroids(); processPreviousCampDroids();
//only need to keep the selectedPlayer's droid's separate // move droids properly - does all the clean up code
//mission.apsDroidLists[selectedPlayer] = apsDroidLists[selectedPlayer]; for (psDroid = apsDroidLists[selectedPlayer]; psDroid != NULL; psDroid = psNext)
//apsDroidLists[selectedPlayer] = NULL; {
//move droids properly - does all the clean up code psNext = psDroid->psNext;
for (psDroid = apsDroidLists[selectedPlayer]; psDroid != NULL; psDroid = psNext) if (droidRemove(psDroid, apsDroidLists))
{
psNext = psDroid->psNext;
if (droidRemove(psDroid, apsDroidLists))
{
addDroid(psDroid, mission.apsDroidLists);
}
}
apsDroidLists[selectedPlayer] = NULL;
//this is happening in a separate function now so can be called once the mission has started
/*apsDroidLists[selectedPlayer] = apsLimboDroids[selectedPlayer];
apsLimboDroids[selectedPlayer] = NULL;
//set up location for each of the droids
for (psDroid = apsDroidLists[selectedPlayer]; psDroid != NULL; psDroid =
psDroid->psNext)
{
droidX = map_coord(getLandingX(LIMBO_LANDING));
droidY = map_coord(getLandingY(LIMBO_LANDING));
pickRes = pickHalfATile(&droidX, &droidY,LOOK_FOR_EMPTY_TILE);
if (pickRes == NO_FREE_TILE )
{ {
ASSERT( FALSE, "saveMissionLimboData: Unable to find a free location" ); addDroid(psDroid, mission.apsDroidLists);
} }
psDroid->pos.x = (UWORD)world_coord(droidX); }
psDroid->pos.y = (UWORD)world_coord(droidY); apsDroidLists[selectedPlayer] = NULL;
if (pickRes == HALF_FREE_TILE )
// any selectedPlayer's factories/research need to be put on holdProduction/holdresearch
for (psStruct = apsStructLists[selectedPlayer]; psStruct != NULL; psStruct = psStruct->psNext)
{
if (StructIsFactory(psStruct))
{ {
psDroid->pos.x += TILE_UNITS; holdProduction(psStruct);
psDroid->pos.y += TILE_UNITS;
} }
psDroid->pos.z = map_Height(psDroid->pos.x, psDroid->pos.y); else if (psStruct->pStructureType->type == REF_RESEARCH)
updateDroidOrientation(psDroid); {
//psDroid->lastTile = mapTile(map_coord(psDroid->pos.x), holdResearch(psStruct);
// map_coord(psDroid->pos.y)); }
psDroid->selected = FALSE; }
//this is mainly for VTOLs
psDroid->psBaseStruct = NULL;
psDroid->cluster = 0;
//initialise the movement data
initDroidMovement(psDroid);
//make sure the died flag is not set
psDroid->died = FALSE;
}*/
//any selectedPlayer's factories/research need to be put on holdProduction/holdresearch
for (psStruct = apsStructLists[selectedPlayer]; psStruct != NULL; psStruct =
psStruct->psNext)
{
if (StructIsFactory(psStruct))
{
holdProduction(psStruct);
}
else if (psStruct->pStructureType->type == REF_RESEARCH)
{
holdResearch(psStruct);
}
}
} }
//this is called via a script function to place the Limbo droids once the mission has started //this is called via a script function to place the Limbo droids once the mission has started
void placeLimboDroids(void) void placeLimboDroids(void)
{ {
DROID *psDroid, *psNext; DROID *psDroid, *psNext;
UDWORD droidX, droidY; UDWORD droidX, droidY;
PICKTILE pickRes; PICKTILE pickRes;
//copy the droids across for the selected Player // Copy the droids across for the selected Player
for (psDroid = apsLimboDroids[selectedPlayer]; psDroid != NULL; for (psDroid = apsLimboDroids[selectedPlayer]; psDroid != NULL; psDroid = psNext)
psDroid = psNext) {
{
psNext = psDroid->psNext; psNext = psDroid->psNext;
if (droidRemove(psDroid, apsLimboDroids)) if (droidRemove(psDroid, apsLimboDroids))
{ {
@ -1288,7 +1158,7 @@ void placeLimboDroids(void)
{ {
ASSERT( FALSE, "placeLimboUnits: Unable to remove unit from Limbo list" ); ASSERT( FALSE, "placeLimboUnits: Unable to remove unit from Limbo list" );
} }
} }
} }
/*restores the necessary data on completion of a Limbo Expand mission*/ /*restores the necessary data on completion of a Limbo Expand mission*/
@ -1324,84 +1194,54 @@ void saveCampaignData(void)
UBYTE inc; UBYTE inc;
DROID *psDroid, *psNext, *psSafeDroid, *psNextSafe, *psCurr, *psCurrNext; DROID *psDroid, *psNext, *psSafeDroid, *psNextSafe, *psCurr, *psCurrNext;
//if the droids have been moved to safety then get any Transporters that exist // If the droids have been moved to safety then get any Transporters that exist
if (getDroidsToSafetyFlag()) if (getDroidsToSafetyFlag())
{ {
//move any Transporters into the mission list // Move any Transporters into the mission list
psDroid = apsDroidLists[selectedPlayer]; psDroid = apsDroidLists[selectedPlayer];
while(psDroid != NULL) while(psDroid != NULL)
{ {
psNext = psDroid->psNext; psNext = psDroid->psNext;
if (psDroid->droidType == DROID_TRANSPORTER) if (psDroid->droidType == DROID_TRANSPORTER)
{ {
/*Now - we want to empty the transporter and make it turn up // Empty the transporter into the mission list
with the first ten out of the previous mission*/ ASSERT(psDroid->psGroup != NULL, "saveCampaignData: Transporter does not have a group");
//we want to make sure they are full for (psCurr = psDroid->psGroup->psList; psCurr != NULL && psCurr != psDroid; psCurr = psCurrNext)
/*if (calcRemainingCapacity(psDroid)) {
//before we move the droid into the mission list - check to see if it's empty psCurrNext = psCurr->psGrpNext;
//if (psDroid->psGroup && psDroid->psGroup->refCount == 1) // Remove it from the transporter group
{ grpLeave( psDroid->psGroup, psCurr);
//fill it with droids from the mission list // Cam change add droid
for (psSafeDroid = mission.apsDroidLists[selectedPlayer];
psSafeDroid != NULL; psSafeDroid = psNextSafe)
{
psNextSafe = psSafeDroid->psNext;
//add to the Transporter, checking for when full
if (checkTransporterSpace(psDroid, psSafeDroid))
{
if (droidRemove(psSafeDroid, mission.apsDroidLists))
{
grpJoin(psDroid->psGroup, psSafeDroid);
}
}
else
{
//setting this will cause the loop to end
psNextSafe = NULL;
}
}
}*/
//empty the transporter into the mission list
ASSERT( psDroid->psGroup != NULL,
"saveCampaignData: Transporter does not have a group" );
for (psCurr = psDroid->psGroup->psList; psCurr != NULL && psCurr !=
psDroid; psCurr = psCurrNext)
{
psCurrNext = psCurr->psGrpNext;
//remove it from the transporter group
grpLeave( psDroid->psGroup, psCurr);
//cam change add droid
psCurr->pos.x = INVALID_XY; psCurr->pos.x = INVALID_XY;
psCurr->pos.y = INVALID_XY; psCurr->pos.y = INVALID_XY;
//add it back into current droid lists // Add it back into current droid lists
addDroid(psCurr, mission.apsDroidLists); addDroid(psCurr, mission.apsDroidLists);
} }
//remove the transporter from the current list // Remove the transporter from the current list
if (droidRemove(psDroid, apsDroidLists)) if (droidRemove(psDroid, apsDroidLists))
{ {
//cam change add droid //cam change add droid
psDroid->pos.x = INVALID_XY; psDroid->pos.x = INVALID_XY;
psDroid->pos.y = INVALID_XY; psDroid->pos.y = INVALID_XY;
addDroid(psDroid, mission.apsDroidLists); addDroid(psDroid, mission.apsDroidLists);
} }
} }
psDroid = psNext; psDroid = psNext;
} }
} }
else else
{ {
//reserve the droids for selected player for start of next campaign // Reserve the droids for selected player for start of next campaign
mission.apsDroidLists[selectedPlayer] = apsDroidLists[selectedPlayer]; mission.apsDroidLists[selectedPlayer] = apsDroidLists[selectedPlayer];
apsDroidLists[selectedPlayer] = NULL; apsDroidLists[selectedPlayer] = NULL;
psDroid = mission.apsDroidLists[selectedPlayer]; psDroid = mission.apsDroidLists[selectedPlayer];
while(psDroid != NULL) while(psDroid != NULL)
{ {
//cam change add droid //cam change add droid
psDroid->pos.x = INVALID_XY; psDroid->pos.x = INVALID_XY;
psDroid->pos.y = INVALID_XY; psDroid->pos.y = INVALID_XY;
psDroid = psDroid->psNext; psDroid = psDroid->psNext;
} }
} }
@ -1487,9 +1327,9 @@ BOOL startMissionOffClear(char *pGame)
//this gets set when the timer is added in scriptFuncs //this gets set when the timer is added in scriptFuncs
//mission.startTime = gameTime; //mission.startTime = gameTime;
// ffs ab
//the message should have been played at the between stage // The message should have been played at the between stage
missionCountDown &= ~NOT_PLAYED_ACTIVATED; missionCountDown &= ~NOT_PLAYED_ACTIVATED;
return TRUE; return TRUE;
} }
@ -1513,30 +1353,27 @@ BOOL startMissionOffKeep(char *pGame)
//this gets set when the timer is added in scriptFuncs //this gets set when the timer is added in scriptFuncs
//mission.startTime = gameTime; //mission.startTime = gameTime;
// ffs ab
//the message should have been played at the between stage
missionCountDown &= ~NOT_PLAYED_ACTIVATED;
return TRUE; // The message should have been played at the between stage
missionCountDown &= ~NOT_PLAYED_ACTIVATED;
return TRUE;
} }
BOOL startMissionCampaignStart(char *pGame) BOOL startMissionCampaignStart(char *pGame)
{ {
//clear out all intelligence screen messages // Clear out all intelligence screen messages
freeMessages(); freeMessages();
//check no units left with any settings that are invalid // Check no units left with any settings that are invalid
clearCampaignUnits(); clearCampaignUnits();
//load in the new game details // Load in the new game details
if (!loadGame(pGame, !KEEPOBJECTS, FREEMEM, FALSE)) if (!loadGame(pGame, !KEEPOBJECTS, FREEMEM, FALSE))
{ {
return FALSE; return FALSE;
} }
//call after everything has been loaded up - done on stageThreeInit
//gridReset();
offWorldKeepLists = FALSE; offWorldKeepLists = FALSE;
return TRUE; return TRUE;
@ -1544,16 +1381,16 @@ BOOL startMissionCampaignStart(char *pGame)
BOOL startMissionCampaignChange(char *pGame) BOOL startMissionCampaignChange(char *pGame)
{ {
//clear out all intelligence screen messages // Clear out all intelligence screen messages
freeMessages(); freeMessages();
//check no units left with any settings that are invalid // Check no units left with any settings that are invalid
clearCampaignUnits(); clearCampaignUnits();
//clear out the production run between campaigns // Clear out the production run between campaigns
changeProductionPlayer((UBYTE)selectedPlayer); changeProductionPlayer((UBYTE)selectedPlayer);
saveCampaignData(); saveCampaignData();
//load in the new game details //load in the new game details
if (!loadGame(pGame, !KEEPOBJECTS, !FREEMEM, FALSE)) if (!loadGame(pGame, !KEEPOBJECTS, !FREEMEM, FALSE))
@ -1562,7 +1399,7 @@ BOOL startMissionCampaignChange(char *pGame)
} }
offWorldKeepLists = FALSE; offWorldKeepLists = FALSE;
intResetPreviousObj(); intResetPreviousObj();
return TRUE; return TRUE;
} }
@ -1584,7 +1421,7 @@ BOOL startMissionCampaignExpand(char *pGame)
BOOL startMissionCampaignExpandLimbo(char *pGame) BOOL startMissionCampaignExpandLimbo(char *pGame)
{ {
saveMissionLimboData(); saveMissionLimboData();
//load in the new game details //load in the new game details
if (!loadGame(pGame, KEEPOBJECTS, !FREEMEM, FALSE)) if (!loadGame(pGame, KEEPOBJECTS, !FREEMEM, FALSE))
@ -1610,14 +1447,13 @@ BOOL startMissionBetween(void)
//check no units left with any settings that are invalid //check no units left with any settings that are invalid
void clearCampaignUnits(void) void clearCampaignUnits(void)
{ {
DROID *psDroid; DROID *psDroid;
for (psDroid = apsDroidLists[selectedPlayer]; psDroid != NULL; psDroid = for (psDroid = apsDroidLists[selectedPlayer]; psDroid != NULL; psDroid = psDroid->psNext)
psDroid->psNext) {
{ orderDroid(psDroid, DORDER_STOP);
orderDroid(psDroid, DORDER_STOP);
setDroidBase(psDroid, NULL); setDroidBase(psDroid, NULL);
} }
} }
/*This deals with droids at the end of an offworld mission*/ /*This deals with droids at the end of an offworld mission*/
@ -1637,60 +1473,40 @@ static void processMission(void)
//remove out of stored list and add to current Droid list //remove out of stored list and add to current Droid list
if (droidRemove(psDroid, apsDroidLists)) if (droidRemove(psDroid, apsDroidLists))
{ {
addDroid(psDroid, mission.apsDroidLists); addDroid(psDroid, mission.apsDroidLists);
// just remove the droid from the grid cos droidX = getHomeLandingX();
// there is only one grid which gets reset when we go back to the droidY = getHomeLandingY();
// campaign map // Swap the droid and map pointers
//gridRemoveObject((BASE_OBJECT *)psDroid); - happens in droidRemove() swapMissionPointers();
//set the x/y for now
//psDroid->pos.x = getHomeLandingX() + 256;
//psDroid->pos.y = getHomeLandingY() + 256;
//droidX = map_coord(getLandingX(psDroid->player)); //map_coord(getHomeLandingX());
//droidY = map_coord(getLandingY(psDroid->player)); //map_coord(getHomeLandingY());
droidX = getHomeLandingX();
droidY = getHomeLandingY();
//swap the droid and map pointers
swapMissionPointers();
pickRes = pickHalfATile(&droidX, &droidY,LOOK_FOR_EMPTY_TILE); pickRes = pickHalfATile(&droidX, &droidY,LOOK_FOR_EMPTY_TILE);
if (pickRes == NO_FREE_TILE ) ASSERT(pickRes != NO_FREE_TILE, "processMission: Unable to find a free location" );
{ psDroid->pos.x = (UWORD)world_coord(droidX);
ASSERT( FALSE, "processMission: Unable to find a free location" ); psDroid->pos.y = (UWORD)world_coord(droidY);
} if (pickRes == HALF_FREE_TILE )
psDroid->pos.x = (UWORD)world_coord(droidX); {
psDroid->pos.y = (UWORD)world_coord(droidY); psDroid->pos.x += TILE_UNITS;
if (pickRes == HALF_FREE_TILE ) psDroid->pos.y += TILE_UNITS;
{ }
psDroid->pos.x += TILE_UNITS; ASSERT(worldOnMap(psDroid->pos.x,psDroid->pos.y), "the droid is not on the map");
psDroid->pos.y += TILE_UNITS; psDroid->pos.z = map_Height(psDroid->pos.x, psDroid->pos.y);
} updateDroidOrientation(psDroid);
ASSERT(worldOnMap(psDroid->pos.x,psDroid->pos.y), "the droid is not on the map"); // Swap the droid and map pointers back again
psDroid->pos.z = map_Height(psDroid->pos.x, psDroid->pos.y); swapMissionPointers();
updateDroidOrientation(psDroid); psDroid->selected = FALSE;
/* psDroid->lastTile = mapTile(map_coord(psDroid->pos.x), // This is mainly for VTOLs
map_coord(psDroid->pos.y));
*/
//swap the droid and map pointers back again
swapMissionPointers();
psDroid->selected = FALSE;
//this is mainly for VTOLs
setDroidBase(psDroid, NULL); setDroidBase(psDroid, NULL);
psDroid->cluster = 0; psDroid->cluster = 0;
//initialise the movement data // Initialise the movement data
initDroidMovement(psDroid); initDroidMovement(psDroid);
}
//orderSelectedLoc(psDroid->player, psDroid->pos.x + 3 * TILE_UNITS,
// psDroid->pos.y + 3 * TILE_UNITS);
}
} }
} }
#define MAXLIMBODROIDS (999) #define MAXLIMBODROIDS (999)
/*This deals with droids at the end of an offworld Limbo mission*/ /*This deals with droids at the end of an offworld Limbo mission*/
void processMissionLimbo(void) void processMissionLimbo(void)
{ {
@ -1706,35 +1522,29 @@ void processMissionLimbo(void)
{ {
vanishDroid(psDroid); vanishDroid(psDroid);
} }
else else
{ {
if (numDroidsAddedToLimboList >= MAXLIMBODROIDS) // any room in limbo list if (numDroidsAddedToLimboList >= MAXLIMBODROIDS) // any room in limbo list
{ {
vanishDroid(psDroid); vanishDroid(psDroid);
} }
else else
{ {
// Remove out of stored list and add to current Droid list
if (droidRemove(psDroid, apsDroidLists))
//remove out of stored list and add to current Droid list {
if (droidRemove(psDroid, apsDroidLists)) // Limbo list invalidate XY
{ psDroid->pos.x = INVALID_XY;
//limbo list invalidate XY psDroid->pos.y = INVALID_XY;
psDroid->pos.x = INVALID_XY; addDroid(psDroid, apsLimboDroids);
psDroid->pos.y = INVALID_XY; // This is mainly for VTOLs
addDroid(psDroid, apsLimboDroids);
//this is mainly for VTOLs
setDroidBase(psDroid, NULL); setDroidBase(psDroid, NULL);
psDroid->cluster = 0; psDroid->cluster = 0;
orderDroid(psDroid, DORDER_STOP); orderDroid(psDroid, DORDER_STOP);
numDroidsAddedToLimboList++; numDroidsAddedToLimboList++;
}
}
} }
} }
} }
} }
@ -1746,11 +1556,11 @@ void swapMissionPointers(void)
void **ppVoid; void **ppVoid;
UDWORD udwTemp, inc; UDWORD udwTemp, inc;
//swap psMapTiles // Swap psMapTiles
pVoid = (void*)psMapTiles; pVoid = (void*)psMapTiles;
psMapTiles = mission.psMapTiles; psMapTiles = mission.psMapTiles;
mission.psMapTiles = (MAPTILE *)pVoid; mission.psMapTiles = (MAPTILE *)pVoid;
//swap map sizes // Swap map sizes
udwTemp = mapWidth; udwTemp = mapWidth;
mapWidth = mission.mapWidth; mapWidth = mission.mapWidth;
mission.mapWidth = udwTemp; mission.mapWidth = udwTemp;
@ -1776,7 +1586,7 @@ void swapMissionPointers(void)
pVoid = (void*)aZoneReachable; pVoid = (void*)aZoneReachable;
aZoneReachable = mission.aZoneReachable; aZoneReachable = mission.aZoneReachable;
mission.aZoneReachable = (UBYTE *)pVoid; mission.aZoneReachable = (UBYTE *)pVoid;
//swap scroll limits // Swap scroll limits
udwTemp = scrollMinX; udwTemp = scrollMinX;
scrollMinX = mission.scrollMinX; scrollMinX = mission.scrollMinX;
mission.scrollMinX = udwTemp; mission.scrollMinX = udwTemp;
@ -1804,44 +1614,6 @@ void swapMissionPointers(void)
apsFlagPosLists[inc] = mission.apsFlagPosLists[inc]; apsFlagPosLists[inc] = mission.apsFlagPosLists[inc];
mission.apsFlagPosLists[inc] = (FLAG_POSITION *)pVoid; mission.apsFlagPosLists[inc] = (FLAG_POSITION *)pVoid;
} }
/*
for (inc = 0; inc < MAX_PLAYERS; inc++)
{
udwTemp = iTranspEntryTileX[inc];
iTranspEntryTileX[inc] = mission.iTranspEntryTileX[inc];
mission.iTranspEntryTileX[inc] = udwTemp;
udwTemp = iTranspEntryTileY[inc];
iTranspEntryTileY[inc] = mission.iTranspEntryTileY[inc];
mission.iTranspEntryTileY[inc] = udwTemp;
udwTemp = iTranspExitTileX[inc];
iTranspExitTileX[inc] = mission.iTranspExitTileX[inc];
mission.iTranspExitTileX[inc] = udwTemp;
udwTemp = iTranspExitTileY[inc];
iTranspExitTileY[inc] = mission.iTranspExitTileY[inc];
mission.iTranspExitTileY[inc] = udwTemp;
}
*/
// NOTE: none of the gateway pointers are swapped at the moment
// which isn't a problem for the current usage - might need to be
// added later
/* stuff to add
UDWORD type; //defines which start and end functions to use - see levels_type in levels.h
//struct _proximity_display *apsProxDisp[MAX_PLAYERS];
FLAG_POSITION *apsFlagPosLists[MAX_PLAYERS];
PLAYER_POWER asPower[MAX_PLAYERS];
//stuff for save game
UDWORD startTime; //time the mission started
SDWORD time; //how long the mission can last
// < 0 = no limit
SDWORD ETA; //time taken for reinforcements to arrive
// < 0 = none allowed
UWORD homeLZ_X; //selectedPlayer's LZ x and y
UWORD homeLZ_Y;
SDWORD playerX; //original view position
SDWORD playerY;
*/
} }
void endMission(void) void endMission(void)
@ -3424,8 +3196,6 @@ BOOL intAddMissionResult(BOOL result, BOOL bPlaySuccess)
} }
void intRemoveMissionResultNoAnim(void) void intRemoveMissionResultNoAnim(void)
{ {
widgDelete(psWScreen, IDMISSIONRES_TITLE); widgDelete(psWScreen, IDMISSIONRES_TITLE);
@ -3632,7 +3402,6 @@ void intCDCancel( void )
//sets up the game to start a new mission //sets up the game to start a new mission
//BOOL setUpMission(MISSION_TYPE type)
BOOL setUpMission(UDWORD type) BOOL setUpMission(UDWORD type)
{ {
//close the interface //close the interface
@ -3753,20 +3522,14 @@ void adjustMissionPower(void)
game needs to be paused*/ game needs to be paused*/
void setMissionPauseState(void) void setMissionPauseState(void)
{ {
if (!bMultiPlayer) if (!bMultiPlayer)
{ {
gameTimeStop(); gameTimeStop();
setGameUpdatePause(TRUE); setGameUpdatePause(TRUE);
setAudioPause(TRUE); setAudioPause(TRUE);
setScriptPause(TRUE); setScriptPause(TRUE);
setConsolePause(TRUE); setConsolePause(TRUE);
} }
} }
/*resets the pause states */ /*resets the pause states */

View File

@ -452,13 +452,13 @@ void removeDroid(DROID *psDroidToRemove, DROID *pList[MAX_PLAYERS])
"removeUnit: invalid player for unit" ); "removeUnit: invalid player for unit" );
removeObjectFromList((BASE_OBJECT**)pList, (BASE_OBJECT*)psDroidToRemove); removeObjectFromList((BASE_OBJECT**)pList, (BASE_OBJECT*)psDroidToRemove);
/*whenever a droid is removed from the current list its died /* Whenever a droid is removed from the current list its died
flag is set to NOT_CURRENT_LIST so that anything targetting * flag is set to NOT_CURRENT_LIST so that anything targetting
it will cancel itself - HACK?!*/ * it will cancel itself, and we know it is not really on the map. */
if (pList[psDroidToRemove->player] == apsDroidLists[psDroidToRemove->player]) if (pList[psDroidToRemove->player] == apsDroidLists[psDroidToRemove->player])
{ {
psDroidToRemove->died = NOT_CURRENT_LIST; psDroidToRemove->died = NOT_CURRENT_LIST;
} }
} }
/*Removes all droids that may be stored in the mission lists*/ /*Removes all droids that may be stored in the mission lists*/

View File

@ -969,27 +969,23 @@ BOOL scrAddDroidToTransporter(void)
return FALSE; return FALSE;
} }
if (psTransporter == NULL || psDroid == NULL) if (psTransporter == NULL || psDroid == NULL)
{ {
//ignore! ASSERT(FALSE, "scrAddUnitToTransporter: null unit passed");
ASSERT( FALSE, "scrAddUnitToTransporter: null unit passed" ); return TRUE; // allow to continue
return TRUE; }
}
ASSERT( psTransporter != NULL, ASSERT(psTransporter != NULL, "scrAddUnitToTransporter: invalid transporter pointer");
"scrAddUnitToTransporter: invalid transporter pointer" ); ASSERT(psDroid != NULL, "scrAddUnitToTransporter: invalid unit pointer");
ASSERT( psDroid != NULL, ASSERT(psTransporter->droidType == DROID_TRANSPORTER, "scrAddUnitToTransporter: invalid transporter type");
"scrAddUnitToTransporter: invalid unit pointer" );
ASSERT( psTransporter->droidType == DROID_TRANSPORTER,
"scrAddUnitToTransporter: invalid transporter type" );
/* check for space */ /* check for space */
if (checkTransporterSpace(psTransporter, psDroid)) if (checkTransporterSpace(psTransporter, psDroid))
{ {
if (droidRemove(psDroid, mission.apsDroidLists)) if (droidRemove(psDroid, mission.apsDroidLists))
{ {
grpJoin(psTransporter->psGroup, psDroid); grpJoin(psTransporter->psGroup, psDroid);
} }
} }
return TRUE; return TRUE;