As a first step toward debugging bugs in message saving, clean up the message saving code. Apart

from dropping support for versions < 36 (unchanged since release 2.1), this change is cosmetic only.


git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@10385 4a71c877-e1ca-e34f-864e-861f7616d084
master
Per Inge Mathisen 2010-03-21 13:40:24 +00:00 committed by Git SVN Gateway
parent 2b84b0317c
commit acb1328e56
1 changed files with 70 additions and 192 deletions

View File

@ -2208,7 +2208,6 @@ static BOOL loadSaveResearchV(char *pFileData, UDWORD filesize, UDWORD numRecord
static BOOL writeResearchFile(char *pFileName); static BOOL writeResearchFile(char *pFileName);
static BOOL loadSaveMessage(char *pFileData, UDWORD filesize, SWORD levelType); static BOOL loadSaveMessage(char *pFileData, UDWORD filesize, SWORD levelType);
static BOOL loadSaveMessageV(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType);
static BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType); static BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType);
static BOOL writeMessageFile(char *pFileName); static BOOL writeMessageFile(char *pFileName);
@ -10186,11 +10185,9 @@ BOOL loadSaveMessage(char *pFileData, UDWORD filesize, SWORD levelType)
/* Check the file version */ /* Check the file version */
if(psHeader->version <= VERSION_35) if(psHeader->version <= VERSION_35)
{ {
if (!loadSaveMessageV(pFileData, filesize, psHeader->quantity, psHeader->version, levelType)) debug(LOG_ERROR, "Unsupported message save format %d", (int)psHeader->version);
{
return false; return false;
} }
}
else else
{ {
if (!loadSaveMessage36(pFileData, filesize, psHeader->quantity, psHeader->version, levelType)) if (!loadSaveMessage36(pFileData, filesize, psHeader->quantity, psHeader->version, levelType))
@ -10201,119 +10198,6 @@ BOOL loadSaveMessage(char *pFileData, UDWORD filesize, SWORD levelType)
return true; return true;
} }
// -----------------------------------------------------------------------------------------
BOOL loadSaveMessageV(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType)
{
SAVE_MESSAGE *psSaveMessage;
MESSAGE *psMessage;
VIEWDATA *psViewData = NULL;
UDWORD i, height;
//clear any messages put in during level loads
//freeMessages();
//only clear the messages if its a mid save game
if (gameType == GTYPE_SAVE_MIDMISSION)
{
freeMessages();
}
else if (gameType == GTYPE_SAVE_START)
{
//if we're loading in a CamStart or a CamChange then we're not interested in any saved messages
if (levelType == LDS_CAMSTART || levelType == LDS_CAMCHANGE)
{
return true;
}
}
//check file
if ((sizeof(SAVE_MESSAGE) * numMessages + MESSAGE_HEADER_SIZE) >
filesize)
{
debug( LOG_ERROR, "loadSaveMessage: unexpected end of file" );
return false;
}
// Load the data
for (i = 0; i < numMessages; i++, pFileData += sizeof(SAVE_MESSAGE))
{
psSaveMessage = (SAVE_MESSAGE *) pFileData;
/* SAVE_MESSAGE */
endian_sdword((SDWORD*)&psSaveMessage->type); /* FIXME: enum may not be this type! */
endian_udword(&psSaveMessage->objId);
endian_udword(&psSaveMessage->player);
if (psSaveMessage->type == MSG_PROXIMITY)
{
//only load proximity if a mid-mission save game
if (gameType == GTYPE_SAVE_MIDMISSION)
{
if (psSaveMessage->bObj)
{
//proximity object so create get the obj from saved idy
psMessage = addMessage(psSaveMessage->type, true, psSaveMessage->player);
if (psMessage)
{
psMessage->pViewData = (MSG_VIEWDATA *)getBaseObjFromId(psSaveMessage->objId);
}
}
else
{
//proximity position so get viewdata pointer from the name
psMessage = addMessage(psSaveMessage->type, false, psSaveMessage->player);
if (psMessage)
{
psViewData = (VIEWDATA *)getViewData(psSaveMessage->name);
if (psViewData == NULL)
{
//skip this message
continue;
}
psMessage->pViewData = (MSG_VIEWDATA *)psViewData;
}
//check the z value is at least the height of the terrain
height = map_Height(((VIEW_PROXIMITY *)psViewData->pData)->x,
((VIEW_PROXIMITY *)psViewData->pData)->y);
if (((VIEW_PROXIMITY *)psViewData->pData)->z < height)
{
((VIEW_PROXIMITY *)psViewData->pData)->z = height;
}
}
}
}
else
{
//only load Campaign/Mission if a mid-mission save game
if (psSaveMessage->type == MSG_CAMPAIGN || psSaveMessage->type == MSG_MISSION)
{
if (gameType == GTYPE_SAVE_MIDMISSION)
{
// Research message // Campaign message // Mission Report messages
psMessage = addMessage(psSaveMessage->type, false, psSaveMessage->player);
if (psMessage)
{
psMessage->pViewData = (MSG_VIEWDATA *)getViewData(psSaveMessage->name);
}
}
}
else
{
// Research message
psMessage = addMessage(psSaveMessage->type, false, psSaveMessage->player);
if (psMessage)
{
psMessage->pViewData = (MSG_VIEWDATA *)getViewData(psSaveMessage->name);
}
}
}
}
return true;
}
BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType) BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDWORD version, SWORD levelType)
{ {
SAVE_MESSAGE_36 *psSaveMessage; SAVE_MESSAGE_36 *psSaveMessage;
@ -10321,17 +10205,14 @@ BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDW
VIEWDATA *psViewData = NULL; VIEWDATA *psViewData = NULL;
UDWORD i, height; UDWORD i, height;
//clear any messages put in during level loads // Only clear the messages if its a mid save game
//freeMessages();
//only clear the messages if its a mid save game
if (gameType == GTYPE_SAVE_MIDMISSION) if (gameType == GTYPE_SAVE_MIDMISSION)
{ {
freeMessages(); freeMessages();
} }
else if (gameType == GTYPE_SAVE_START) else if (gameType == GTYPE_SAVE_START)
{ {
//if we're loading in a CamStart or a CamChange then we're not interested in any saved messages // If we are loading in a CamStart or a CamChange then we are not interested in any saved messages
if (levelType == LDS_CAMSTART || levelType == LDS_CAMCHANGE) if (levelType == LDS_CAMSTART || levelType == LDS_CAMCHANGE)
{ {
return true; return true;
@ -10340,11 +10221,9 @@ BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDW
} }
//check file //check file
if ((sizeof(SAVE_MESSAGE_36) * numMessages + MESSAGE_HEADER_SIZE) > if ((sizeof(SAVE_MESSAGE_36) * numMessages + MESSAGE_HEADER_SIZE) > filesize)
filesize)
{ {
debug(LOG_ERROR, "loadSaveMessage: unexpected end of file"); debug(LOG_ERROR, "loadSaveMessage: unexpected end of file");
return false; return false;
} }
@ -10366,7 +10245,7 @@ BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDW
{ {
if (psSaveMessage->bObj) if (psSaveMessage->bObj)
{ {
//proximity object so create get the obj from saved idy // Proximity object so create get the obj from saved idy
psMessage = addMessage(psSaveMessage->type, true, psSaveMessage->player); psMessage = addMessage(psSaveMessage->type, true, psSaveMessage->player);
if (psMessage) if (psMessage)
{ {
@ -10401,14 +10280,13 @@ BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDW
if (psViewData == NULL) if (psViewData == NULL)
{ {
//skip this message // Skip this message
continue; continue;
} }
psMessage->pViewData = (MSG_VIEWDATA *)psViewData; psMessage->pViewData = (MSG_VIEWDATA *)psViewData;
} }
//check the z value is at least the height of the terrain // Check the z value is at least the height of the terrain
height = map_Height(((VIEW_PROXIMITY *)psViewData->pData)->x, height = map_Height(((VIEW_PROXIMITY *)psViewData->pData)->x, ((VIEW_PROXIMITY *)psViewData->pData)->y);
((VIEW_PROXIMITY *)psViewData->pData)->y);
if (((VIEW_PROXIMITY *)psViewData->pData)->z < height) if (((VIEW_PROXIMITY *)psViewData->pData)->z < height)
{ {
((VIEW_PROXIMITY *)psViewData->pData)->z = height; ((VIEW_PROXIMITY *)psViewData->pData)->z = height;
@ -10418,7 +10296,7 @@ BOOL loadSaveMessage36(char *pFileData, UDWORD filesize, UDWORD numMessages, UDW
} }
else else
{ {
//only load Campaign/Mission if a mid-mission save game // Only load Campaign/Mission if a mid-mission save game
if (psSaveMessage->type == MSG_CAMPAIGN || psSaveMessage->type == MSG_MISSION) if (psSaveMessage->type == MSG_CAMPAIGN || psSaveMessage->type == MSG_MISSION)
{ {
if (gameType == GTYPE_SAVE_MIDMISSION) if (gameType == GTYPE_SAVE_MIDMISSION)