From bb5b5e21d619f99b34e9a8887ff8dea238057584 Mon Sep 17 00:00:00 2001 From: Wanne Date: Fri, 15 Nov 2013 19:33:10 +0000 Subject: [PATCH] Externalized heli refuel sites (by Buggler) - Map\HeliSites.xml git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6605 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Init.cpp | 17 +- SaveLoadGame.cpp | 8 +- Strategic/Map Screen Helicopter.cpp | 383 ++++++++++++++++++++++++++-- Strategic/Map Screen Helicopter.h | 23 +- Tactical/XML.h | 5 + 5 files changed, 388 insertions(+), 48 deletions(-) diff --git a/Init.cpp b/Init.cpp index b372050a..407e6f32 100644 --- a/Init.cpp +++ b/Init.cpp @@ -732,6 +732,11 @@ BOOLEAN LoadExternalGameplayData(STR directoryName) strcat(fileName, SAMSITESFILENAME); SGP_THROW_IFFALSE(ReadInSAMInfo(fileName),SAMSITESFILENAME); + // Buggler: load helisites + strcpy(fileName, directoryName); + strcat(fileName, HELISITESFILENAME); + SGP_THROW_IFFALSE(ReadInHeliInfo(fileName),HELISITESFILENAME); + #ifdef JA2UB if ( gGameUBOptions.EnemyXML == TRUE ) { @@ -1271,7 +1276,7 @@ if ( ReadXMLEmail == TRUE ) } #endif - BackupBRandEncyclopedia ( gBriefingRoomData, gBriefingRoomDataBackup, 0); +BackupBRandEncyclopedia ( gBriefingRoomData, gBriefingRoomDataBackup, 0); #endif //ENABLE_BRIEFINGROOM @@ -1291,11 +1296,11 @@ if ( ReadXMLEmail == TRUE ) #endif // Old AIM Archive - UINT8 p; - for(p=0; pcurrentDepth <= pData->maxReadDepth) //are we reading this element? + { + + if(strcmp(name, "HELI_INFO") == 0 && pData->curElement == HELISITE_ELEMENT_NONE) + { + pData->curElement = HELISITE_ELEMENT_HELIINFO; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "REFUELLIST") == 0 && pData->curElement == HELISITE_ELEMENT_HELIINFO) + { + pData->curElement = HELISITE_ELEMENT_REFUELLIST; + + memset( sRefuelSectorX, 0, sizeof(sRefuelSectorX) ); + memset( sRefuelSectorY, 0, sizeof(sRefuelSectorY) ); + memset( fRefuelingSiteHidden, 0, sizeof(fRefuelingSiteHidden) ); + memset( iRefuelHeliGridNo, 0, sizeof(iRefuelHeliGridNo) ); + memset( iRefuelSkyriderGridNo, 0, sizeof(iRefuelSkyriderGridNo) ); + + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "REFUEL") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELLIST) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + + memset( &pData->curHeliInfo, 0, sizeof(heliInfo) ); + + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "refuelIndex") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_INDEX; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "refuelSector") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_REFUELSECTOR; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "x") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELSECTOR) + { + pData->curElement = HELISITE_ELEMENT_REFUELSECTOR_X; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "y") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELSECTOR) + { + pData->curElement = HELISITE_ELEMENT_REFUELSECTOR_Y; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "refuelHidden") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_REFUEL_HIDDEN; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "refuelHeliGridNo") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_REFUEL_HELI_GRIDNO; + pData->maxReadDepth++; //we are not skipping this element + } + else if(strcmp(name, "refuelSkyriderGridNo") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_REFUEL_SKYRIDER_GRIDNO; + pData->maxReadDepth++; //we are not skipping this element + } + pData->szCharData[0] = '\0'; + } + + pData->currentDepth++; + +} + +static void XMLCALL +helisiteCharacterDataHandle(void *userData, const XML_Char *str, int len) +{ + helisiteParseData * pData = (helisiteParseData *) userData; + + if(pData->currentDepth <= pData->maxReadDepth && strlen(pData->szCharData) < MAX_CHAR_DATA_LENGTH) + strncat(pData->szCharData,str,__min((unsigned int)len,MAX_CHAR_DATA_LENGTH-strlen(pData->szCharData))); +} + + +static void XMLCALL +helisiteEndElementHandle(void *userData, const XML_Char *name) +{ + helisiteParseData * pData = (helisiteParseData *) userData; + + if(pData->currentDepth <= pData->maxReadDepth) //we're at the end of an element that we've been reading + { + if(strcmp(name, "HELI_INFO") == 0 && pData->curElement == HELISITE_ELEMENT_HELIINFO) + { + pData->curElement = HELISITE_ELEMENT_NONE; + } + else if(strcmp(name, "REFUELLIST") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELLIST) + { + pData->curElement = HELISITE_ELEMENT_HELIINFO; + + NUMBER_OF_REFUEL_SITES = pData->uiHighestIndex; + } + else if(strcmp(name, "REFUEL") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL) + { + pData->curElement = HELISITE_ELEMENT_REFUELLIST; + + if ( pData->curHeliInfo.uiIndex != INVALID_REFUELSITE_INDEX ) + { + pData->curHeliInfo.uiIndex--; + sRefuelSectorX [ pData->curHeliInfo.uiIndex ] = pData->curHeliInfo.refuelSectorX; + sRefuelSectorY [ pData->curHeliInfo.uiIndex ] = pData->curHeliInfo.refuelSectorY; + fRefuelingSiteHidden [ pData->curHeliInfo.uiIndex ] = pData->curHeliInfo.refuelHidden; + iRefuelHeliGridNo [ pData->curHeliInfo.uiIndex ] = pData->curHeliInfo.refuelHeliGridNo; + iRefuelSkyriderGridNo [ pData->curHeliInfo.uiIndex ] = pData->curHeliInfo.refuelSkyriderGridNo; + } + } + else if(strcmp(name, "refuelIndex") == 0 && pData->curElement == HELISITE_ELEMENT_INDEX) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + + pData->curHeliInfo.uiIndex = atol(pData->szCharData); + if ( !pData->curHeliInfo.uiIndex || pData->curHeliInfo.uiIndex > MAX_NUMBER_OF_REFUEL_SITES ) + { + pData->curHeliInfo.uiIndex = INVALID_REFUELSITE_INDEX; + } + else if ( pData->curHeliInfo.uiIndex > pData->uiHighestIndex ) + { + pData->uiHighestIndex = pData->curHeliInfo.uiIndex; + } + } + else if(strcmp(name, "refuelSector") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELSECTOR) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + } + else if(strcmp(name, "x") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELSECTOR_X) + { + pData->curElement = HELISITE_ELEMENT_REFUELSECTOR; + + pData->curHeliInfo.refuelSectorX = (INT16) atol(pData->szCharData); + } + else if(strcmp(name, "y") == 0 && pData->curElement == HELISITE_ELEMENT_REFUELSECTOR_Y) + { + pData->curElement = HELISITE_ELEMENT_REFUELSECTOR; + + pData->curHeliInfo.refuelSectorY = (INT16) atol(pData->szCharData); + } + else if(strcmp(name, "refuelHidden") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL_HIDDEN ) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + + pData->curHeliInfo.refuelHidden = (BOOLEAN)atol(pData->szCharData); + } + else if(strcmp(name, "refuelHeliGridNo") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL_HELI_GRIDNO ) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + + pData->curHeliInfo.refuelHeliGridNo = atol(pData->szCharData); + if ( pData->curHeliInfo.refuelHeliGridNo >= WORLD_MAX ) + { + pData->curHeliInfo.refuelHeliGridNo = 0; + } + } + else if(strcmp(name, "refuelSkyriderGridNo") == 0 && pData->curElement == HELISITE_ELEMENT_REFUEL_SKYRIDER_GRIDNO ) + { + pData->curElement = HELISITE_ELEMENT_REFUEL; + + pData->curHeliInfo.refuelSkyriderGridNo = atol(pData->szCharData); + if ( pData->curHeliInfo.refuelSkyriderGridNo >= WORLD_MAX ) + { + pData->curHeliInfo.refuelSkyriderGridNo = 0; + } + } + pData->maxReadDepth--; + } + + pData->currentDepth--; +} + +BOOLEAN ReadInHeliInfo(STR fileName) +{ + HWFILE hFile; + UINT32 uiBytesRead; + UINT32 uiFSize; + CHAR8 * lpcBuffer; + XML_Parser parser = XML_ParserCreate(NULL); + + helisiteParseData pData; + + // Open file + hFile = FileOpen( fileName, FILE_ACCESS_READ, FALSE ); + if ( !hFile ) + return( FALSE ); + + uiFSize = FileGetSize(hFile); + lpcBuffer = (CHAR8 *) MemAlloc(uiFSize+1); + + //Read in block + if ( !FileRead( hFile, lpcBuffer, uiFSize, &uiBytesRead ) ) + { + MemFree(lpcBuffer); + return( FALSE ); + } + + lpcBuffer[uiFSize] = 0; //add a null terminator + + FileClose( hFile ); + + + XML_SetElementHandler(parser, helisiteStartElementHandle, helisiteEndElementHandle); + XML_SetCharacterDataHandler(parser, helisiteCharacterDataHandle); + + + memset(&pData,0,sizeof(pData)); + NUMBER_OF_REFUEL_SITES = 0; + XML_SetUserData(parser, &pData); + + + if(!XML_Parse(parser, lpcBuffer, uiFSize, TRUE)) + { + CHAR8 errorBuf[511]; + + sprintf(errorBuf, "XML Parser Error in HeliSites.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); + LiveMessage(errorBuf); + + MemFree(lpcBuffer); + return FALSE; + } + + MemFree(lpcBuffer); + + XML_ParserFree(parser); + + return TRUE; +} + +BOOLEAN WriteInInfo(STR fileName) +{ + HWFILE hFile; + + hFile = FileOpen( fileName, FILE_ACCESS_WRITE | FILE_CREATE_ALWAYS, FALSE ); + if ( !hFile ) + return( FALSE ); + + { + INT8 cnt; + + + FilePrintf(hFile,"\r\n"); + FilePrintf(hFile,"\t\r\n"); + for(cnt = 0; cnt < NUMBER_OF_REFUEL_SITES; cnt++) + { + FilePrintf(hFile,"\t\t\r\n"); + + FilePrintf(hFile,"\t\t\t%d\r\n",cnt+1); + + FilePrintf(hFile,"\t\t\t\r\n"); + FilePrintf(hFile,"\t\t\t\t%d\r\n",sRefuelSectorX[cnt]); + FilePrintf(hFile,"\t\t\t\t%d\r\n",sRefuelSectorY[cnt]); + FilePrintf(hFile,"\t\t\t\r\n"); + + FilePrintf(hFile,"\t\t\t%d\r\n", fRefuelingSiteHidden[cnt] ); + + FilePrintf(hFile,"\t\t\t%d\r\n", iRefuelHeliGridNo[cnt] ); + + FilePrintf(hFile,"\t\t\t%d\r\n", iRefuelSkyriderGridNo[cnt] ); + + FilePrintf(hFile,"\t\t\r\n"); + } + FilePrintf(hFile,"\t\r\n"); + FilePrintf(hFile,"\r\n"); + } + FileClose( hFile ); + + return TRUE; +} void InitializeHelicopter( void ) { @@ -467,7 +798,7 @@ INT32 FindLocationOfClosestRefuelSite( BOOLEAN fMustBeAvailable ) if( ( fRefuelingSiteAvailable[ iCounter ] ) || ( fMustBeAvailable == FALSE ) ) { // find if sector is under control, find distance from heli to it - iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( pVehicleList[ iHelicopterVehicleId ].sSectorX , pVehicleList[ iHelicopterVehicleId ].sSectorY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( ubRefuelList[ iCounter ][ 0 ], ubRefuelList[ iCounter ][ 1 ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); + iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( pVehicleList[ iHelicopterVehicleId ].sSectorX , pVehicleList[ iHelicopterVehicleId ].sSectorY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); if( iDistance < iShortestDistance ) { @@ -491,7 +822,7 @@ INT32 DistanceToNearestRefuelPoint( INT16 sX, INT16 sY ) // don't notify player during these checks! iClosestLocation = LocationOfNearestRefuelPoint( FALSE ); - iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( sX, sY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( ubRefuelList[ iClosestLocation ][ 0 ], ubRefuelList[ iClosestLocation ][ 1 ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); + iDistance = ( INT32 )FindStratPath( ( INT16 )( CALCULATE_STRATEGIC_INDEX( sX, sY ) ), ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iClosestLocation ], sRefuelSectorY[ iClosestLocation ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE ); return( iDistance ); } @@ -908,7 +1239,7 @@ BOOLEAN IsRefuelSiteInSector( INT16 sMapX, INT16 sMapY ) for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ ) { - if ( ( ubRefuelList[ iCounter ][ 0 ] == sMapX ) && ( ubRefuelList[ iCounter ][ 1 ] == sMapY ) ) + if ( ( sRefuelSectorX[ iCounter ] == sMapX ) && ( sRefuelSectorY[ iCounter ] == sMapY ) ) { return(TRUE); } @@ -928,8 +1259,8 @@ void UpdateRefuelSiteAvailability( void ) for( iCounter = 0; iCounter < NUMBER_OF_REFUEL_SITES; iCounter++ ) { // if enemy controlled sector (ground OR air, don't want to fly into enemy air territory) - if( ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( ubRefuelList[ iCounter ][ 0 ], ubRefuelList[ iCounter ][ 1 ] ) ].fEnemyControlled == TRUE ) || - ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( ubRefuelList[ iCounter ][ 0 ], ubRefuelList[ iCounter ][ 1 ] ) ].fEnemyAirControlled == TRUE ) || + if( ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyControlled == TRUE ) || + ( StrategicMap[ CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iCounter ], sRefuelSectorY[ iCounter ] ) ].fEnemyAirControlled == TRUE ) || ( ( iCounter == ESTONI_REFUELING_SITE ) && ( CheckFact( FACT_ESTONI_REFUELLING_POSSIBLE, 0 ) == FALSE ) ) ) { // mark refueling site as unavailable @@ -943,8 +1274,8 @@ void UpdateRefuelSiteAvailability( void ) // reactivate a grounded helicopter, if here if ( !fHelicopterAvailable && !fHelicopterDestroyed && fSkyRiderAvailable && ( iHelicopterVehicleId != -1 ) ) { - if( ( pVehicleList[ iHelicopterVehicleId ].sSectorX == ubRefuelList[ iCounter ][ 0 ]) && - ( pVehicleList[ iHelicopterVehicleId ].sSectorY == ubRefuelList[ iCounter ][ 1 ]) ) + if( ( pVehicleList[ iHelicopterVehicleId ].sSectorX == sRefuelSectorX[ iCounter ]) && + ( pVehicleList[ iHelicopterVehicleId ].sSectorY == sRefuelSectorY[ iCounter ]) ) { // no longer grounded DoScreenIndependantMessageBox( pSkyriderText[ 5 ], MSG_BOX_FLAG_OK, NULL ); @@ -1328,7 +1659,7 @@ void HandleAnimationOfSectors( void ) if( fShowEstoniRefuelHighLight ) { fOldShowEstoniRefuelHighLight = TRUE; - HandleBlitOfSectorLocatorIcon( ubRefuelList[ ESTONI_REFUELING_SITE ][ 0 ], ubRefuelList[ ESTONI_REFUELING_SITE ][ 1 ], 0, LOCATOR_COLOR_RED ); + HandleBlitOfSectorLocatorIcon( sRefuelSectorX[ ESTONI_REFUELING_SITE ], sRefuelSectorY[ ESTONI_REFUELING_SITE ], 0, LOCATOR_COLOR_RED ); fSkipSpeakersLocator = TRUE; } else if( fOldShowEstoniRefuelHighLight ) @@ -1580,7 +1911,7 @@ void HandleHelicopterOnGroundGraphic( void ) for( ubSite = 0; ubSite < NUMBER_OF_REFUEL_SITES; ubSite++ ) { // is this refueling site sector the loaded sector ? - if ( ( ubRefuelList[ ubSite ][ 0 ] == gWorldSectorX ) && ( ubRefuelList[ ubSite ][ 1 ] == gWorldSectorY ) ) + if ( ( sRefuelSectorX[ ubSite ] == gWorldSectorX ) && ( sRefuelSectorY[ ubSite ] == gWorldSectorY ) ) { // YES, so find out if the chopper is landed here if ( IsHelicopterOnGroundAtRefuelingSite( ubSite ) ) @@ -1594,7 +1925,7 @@ void HandleHelicopterOnGroundGraphic( void ) gMercProfiles[ SKYRIDER ].sSectorX = gWorldSectorX; gMercProfiles[ SKYRIDER ].sSectorY = gWorldSectorY; gMercProfiles[ SKYRIDER ].ubStrategicInsertionCode = INSERTION_CODE_GRIDNO; - gMercProfiles[ SKYRIDER ].usStrategicInsertionData = sRefuelStartGridNo[ubSite] - 639; // Stand near the heli + gMercProfiles[ SKYRIDER ].usStrategicInsertionData = iRefuelSkyriderGridNo[ubSite]; // iRefuelHeliGridNo[ubSite] - 639, Stand near the heli gMercProfiles[ SKYRIDER ].fUseProfileInsertionInfo = TRUE; } } @@ -1642,7 +1973,7 @@ void HandleHelicopterOnGroundSkyriderProfile( void ) for( ubSite = 0; ubSite < NUMBER_OF_REFUEL_SITES; ubSite++ ) { // is this refueling site sector the loaded sector ? - if ( ( ubRefuelList[ ubSite ][ 0 ] == gWorldSectorX ) && ( ubRefuelList[ ubSite ][ 1 ] == gWorldSectorY ) ) + if ( ( sRefuelSectorX[ ubSite ] == gWorldSectorX ) && ( sRefuelSectorY[ ubSite ] == gWorldSectorY ) ) { // YES, so find out if the chopper is landed here if ( IsHelicopterOnGroundAtRefuelingSite( ubSite ) ) @@ -1711,8 +2042,8 @@ BOOLEAN IsHelicopterOnGroundAtRefuelingSite( UINT8 ubRefuelingSite ) Assert( iHelicopterVehicleId != -1 ); // on the ground, but is it at this site or at another one? - if ( ( ubRefuelList[ ubRefuelingSite ][ 0 ] == pVehicleList[ iHelicopterVehicleId ].sSectorX ) && - ( ubRefuelList[ ubRefuelingSite ][ 1 ] == pVehicleList[ iHelicopterVehicleId ].sSectorY ) ) + if ( ( sRefuelSectorX[ ubRefuelingSite ] == pVehicleList[ iHelicopterVehicleId ].sSectorX ) && + ( sRefuelSectorY[ ubRefuelingSite ] == pVehicleList[ iHelicopterVehicleId ].sSectorY ) ) { return(TRUE); } @@ -1947,7 +2278,7 @@ void AddHeliPeice( INT32 sGridNo, UINT16 sOStruct ) void AddHelicopterToMaps( BOOLEAN fAdd, UINT8 ubSite ) { - INT32 sGridNo = sRefuelStartGridNo[ ubSite ]; + INT32 sGridNo = iRefuelHeliGridNo[ ubSite ]; INT16 sOStruct = 0; INT16 sGridX, sGridY; INT16 sCentreGridX, sCentreGridY; @@ -1994,12 +2325,12 @@ void AddHelicopterToMaps( BOOLEAN fAdd, UINT8 ubSite ) else { // remove from the world - RemoveStruct( sRefuelStartGridNo[ ubSite ], ( UINT16 )(sOStruct )); - RemoveStruct( sRefuelStartGridNo[ ubSite ], ( UINT16 )(sOStruct + 1 )); - RemoveStruct( sRefuelStartGridNo[ ubSite ] - 800, ( UINT16 )(sOStruct + 2)); - RemoveStruct( sRefuelStartGridNo[ ubSite ], ( UINT16 )(sOStruct + 3)); - RemoveStruct( sRefuelStartGridNo[ ubSite ], ( UINT16 )(sOStruct + 4)); - RemoveStruct( sRefuelStartGridNo[ ubSite ] - 800, ( UINT16 )(sOStruct +5)); + RemoveStruct( iRefuelHeliGridNo[ ubSite ], ( UINT16 )(sOStruct )); + RemoveStruct( iRefuelHeliGridNo[ ubSite ], ( UINT16 )(sOStruct + 1 )); + RemoveStruct( iRefuelHeliGridNo[ ubSite ] - 800, ( UINT16 )(sOStruct + 2)); + RemoveStruct( iRefuelHeliGridNo[ ubSite ], ( UINT16 )(sOStruct + 3)); + RemoveStruct( iRefuelHeliGridNo[ ubSite ], ( UINT16 )(sOStruct + 4)); + RemoveStruct( iRefuelHeliGridNo[ ubSite ] - 800, ( UINT16 )(sOStruct +5)); InvalidateWorldRedundency(); SetRenderFlags( RENDER_FLAG_FULL ); @@ -2302,7 +2633,7 @@ void MakeHeliReturnToBase( void ) pVehicleList[ iHelicopterVehicleId ].pMercPath = ClearStrategicPathList( pVehicleList[ iHelicopterVehicleId ].pMercPath, pVehicleList[ iHelicopterVehicleId ].ubMovementGroup ); // plot path to that sector - pVehicleList[ iHelicopterVehicleId ].pMercPath = AppendStrategicPath( MoveToBeginningOfPathList( BuildAStrategicPath( NULL, GetLastSectorIdInVehiclePath( iHelicopterVehicleId ) , ( INT16 )( CALCULATE_STRATEGIC_INDEX( ubRefuelList[ iLocation ][ 0 ], ubRefuelList[ iLocation ][ 1 ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE /*, FALSE */ ) ), pVehicleList[ iHelicopterVehicleId ].pMercPath ); + pVehicleList[ iHelicopterVehicleId ].pMercPath = AppendStrategicPath( MoveToBeginningOfPathList( BuildAStrategicPath( NULL, GetLastSectorIdInVehiclePath( iHelicopterVehicleId ) , ( INT16 )( CALCULATE_STRATEGIC_INDEX( sRefuelSectorX[ iLocation ], sRefuelSectorY[ iLocation ] ) ) , pVehicleList[ iHelicopterVehicleId ].ubMovementGroup, FALSE /*, FALSE */ ) ), pVehicleList[ iHelicopterVehicleId ].pMercPath ); pVehicleList[ iHelicopterVehicleId ].pMercPath = MoveToBeginningOfPathList( pVehicleList[ iHelicopterVehicleId ].pMercPath ); // rebuild the movement waypoints diff --git a/Strategic/Map Screen Helicopter.h b/Strategic/Map Screen Helicopter.h index d6d5414a..cc0b22bf 100644 --- a/Strategic/Map Screen Helicopter.h +++ b/Strategic/Map Screen Helicopter.h @@ -51,6 +51,10 @@ #define AIRPORT2_X gModSettings.ubAirport2X //3 #define AIRPORT2_Y gModSettings.ubAirport2Y //14 +// refueling sites definitions +#define MAX_NUMBER_OF_REFUEL_SITES 2 //30 + + // enums for skyrider monologue enum{ SKYRIDER_MONOLOGUE_EVENT_DRASSEN_SAM_SITE = 0, @@ -59,13 +63,6 @@ enum{ SKYRIDER_MONOLOGUE_EVENT_CAMBRIA_HOSPITAL, }; -enum -{ - DRASSEN_REFUELING_SITE = 0, - ESTONI_REFUELING_SITE, - NUMBER_OF_REFUEL_SITES, -}; - // the sam site enums enum{ SAM_SITE_ONE = 0, // near Chitzena @@ -75,9 +72,12 @@ enum{ NUMBER_OF_SAM_SITES, }; -// list of refueling site's sector locations -extern UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 2 ]; - +enum +{ + DRASSEN_REFUELING_SITE = 0, + ESTONI_REFUELING_SITE, + NUMBER_OF_REFUELING_SITES, +}; // is the helicopter available to player? extern BOOLEAN fHelicopterAvailable; @@ -128,7 +128,8 @@ extern BOOLEAN fShowCambriaHospitalHighLight; extern INT32 iTotalAccumulatedCostByPlayer; extern UINT32 guiTimeOfLastSkyriderMonologue; extern BOOLEAN fSkyRiderSetUp; -extern BOOLEAN fRefuelingSiteAvailable[ NUMBER_OF_REFUEL_SITES ]; +extern BOOLEAN fRefuelingSiteAvailable[ MAX_NUMBER_OF_REFUEL_SITES ]; +extern BOOLEAN fRefuelingSiteHidden[ MAX_NUMBER_OF_REFUEL_SITES ]; extern UINT8 gubHelicopterHitsTaken; extern BOOLEAN gfSkyriderSaidCongratsOnTakingSAM; diff --git a/Tactical/XML.h b/Tactical/XML.h index dd944eb0..94976516 100644 --- a/Tactical/XML.h +++ b/Tactical/XML.h @@ -159,6 +159,7 @@ typedef PARSE_STAGE; #define MOVEMENTCOSTFILENAME "Map\\MovementCosts.xml" #define ALTSECTORSFILENAME "Map\\AltSectors.xml" #define SAMSITESFILENAME "Map\\SamSites.xml" +#define HELISITESFILENAME "Map\\HeliSites.xml" #define ROAMINGMILITIAFILENAME "Map\\RestrictedRoamingMilitia.xml" #define EXTRAITEMSFILENAME "Map\\A9_0_ExtraItems" // ".xml" will be added @runtime #define EXTRAITEMSFILENAME2 "Map\\A11_0_ExtraItems" // ".xml" will be added @runtime @@ -382,6 +383,10 @@ extern BOOLEAN WriteInAltSectors(STR fileName); extern BOOLEAN ReadInSAMInfo(STR fileName); extern BOOLEAN WriteInSAMInfo(STR fileName); +// Buggler: helisite externalization +extern BOOLEAN ReadInHeliInfo(STR fileName); +extern BOOLEAN WriteInHeliInfo(STR fileName); + // Lesh: army externalization extern BOOLEAN ReadInGarrisonInfo(STR fileName); extern BOOLEAN WriteInGarrisonInfo(STR fileName);