diff --git a/Strategic/XML_SectorNames.cpp b/Strategic/XML_SectorNames.cpp index e092cd96..1f42b76f 100644 --- a/Strategic/XML_SectorNames.cpp +++ b/Strategic/XML_SectorNames.cpp @@ -43,6 +43,8 @@ typedef struct UINT32 maxReadDepth; } SectorNameParseData; +// for compliation reasons, this may not be a part of SectorNameParseData +std::vector prisonroomvector; BOOLEAN SectorName_TextOnly; @@ -90,22 +92,7 @@ SectorNameStartElementHandle(void *userData, const XML_Char *name, const char ** strcmp(name, "usNaturalDirt") == 0 || strcmp(name, "usCurfewValue") == 0 || strcmp(name, "sRadioScanModifier") == 0 || - strcmp(name, "usPrisonRoomNumber00") == 0 || - strcmp(name, "usPrisonRoomNumber01") == 0 || - strcmp(name, "usPrisonRoomNumber02") == 0 || - strcmp(name, "usPrisonRoomNumber03") == 0 || - strcmp(name, "usPrisonRoomNumber04") == 0 || - strcmp(name, "usPrisonRoomNumber05") == 0 || - strcmp(name, "usPrisonRoomNumber06") == 0 || - strcmp(name, "usPrisonRoomNumber07") == 0 || - strcmp(name, "usPrisonRoomNumber08") == 0 || - strcmp(name, "usPrisonRoomNumber09") == 0 || - strcmp(name, "usPrisonRoomNumber10") == 0 || - strcmp(name, "usPrisonRoomNumber11") == 0 || - strcmp(name, "usPrisonRoomNumber12") == 0 || - strcmp(name, "usPrisonRoomNumber13") == 0 || - strcmp(name, "usPrisonRoomNumber14") == 0 || - strcmp(name, "usPrisonRoomNumber15") == 0 || + strcmp(name, "usPrisonRoomNumber" ) == 0 || strcmp(name, "usCivilianPopulation") == 0 )) { pData->curElement = ELEMENT_PROPERTY; @@ -198,22 +185,28 @@ SectorNameEndElementHandle(void *userData, const XML_Char *name) INT8 radioscanmod = max( -3, pData->sectordata.sRadioScanModifier ); radioscanmod = min( 3, pData->sectordata.sRadioScanModifier ); - SectorExternalData[ubSectorId][0].sRadioScanModifier = pData->sectordata.sRadioScanModifier; - SectorExternalData[ubSectorId][1].sRadioScanModifier = pData->sectordata.sRadioScanModifier; - SectorExternalData[ubSectorId][2].sRadioScanModifier = pData->sectordata.sRadioScanModifier; - SectorExternalData[ubSectorId][3].sRadioScanModifier = pData->sectordata.sRadioScanModifier; + SectorExternalData[ubSectorId][0].sRadioScanModifier = radioscanmod; + SectorExternalData[ubSectorId][1].sRadioScanModifier = radioscanmod; + SectorExternalData[ubSectorId][2].sRadioScanModifier = radioscanmod; + SectorExternalData[ubSectorId][3].sRadioScanModifier = radioscanmod; SectorExternalData[ubSectorId][0].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][1].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][2].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][3].usCivilianPopulation = pData->sectordata.usCivilianPopulation; - - for(UINT8 i = 0; i sectordata.usPrisonRoomNumber[i]; - pData->sectordata.usPrisonRoomNumber[i] = 0; + std::vector::iterator itend = prisonroomvector.end( ); + std::vector::iterator it = prisonroomvector.begin( ); + for ( ; it != itend; ++it ) + { + SectorExternalData[ubSectorId][0].prisonroomvector.push_back( (*it) ); + } } + prisonroomvector.clear( ); + // clean up values afterwards pData->sectordata.usWaterType = 0; pData->sectordata.usNaturalDirt = 100; @@ -300,86 +293,15 @@ SectorNameEndElementHandle(void *userData, const XML_Char *name) pData->curElement = ELEMENT; pData->sectordata.sRadioScanModifier = (INT8)atoi( pData->szCharData ); } - else if(strcmp(name, "usPrisonRoomNumber00") == 0) + else if ( strcmp( name, "usPrisonRoomNumber" ) == 0 ) { pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[0] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber01") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[1] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber02") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[2] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber03") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[3] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber04") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[4] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber05") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[5] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber06") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[6] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber07") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[7] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber08") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[8] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber09") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[9] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber10") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[10] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber11") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[11] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber12") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[12] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber13") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[13] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber14") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[14] = (UINT8)atoi( pData->szCharData ); - } - else if(strcmp(name, "usPrisonRoomNumber15") == 0) - { - pData->curElement = ELEMENT; - pData->sectordata.usPrisonRoomNumber[15] = (UINT8)atoi( pData->szCharData ); - } + + UINT16 room = (UINT16)atoi( pData->szCharData ); + + if ( room ) + prisonroomvector.push_back( room ); + } else if(strcmp(name, "usCivilianPopulation") == 0) { pData->curElement = ELEMENT; diff --git a/Tactical/Items.h b/Tactical/Items.h index ac90bc0c..95de03d8 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -494,7 +494,6 @@ OBJECTTYPE* GetExternalFeedingObject(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject BOOLEAN DeductBulletViaExternalFeeding(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject); -#define MAX_PRISON_ROOMS 16 // Flugente: additional xml data for sectors typedef struct { @@ -502,7 +501,8 @@ typedef struct UINT16 usNaturalDirt; // extra dirt percentage when firing in this sector UINT8 usCurfewValue; // determines wether mercs disguising as civilian are automatically discovered (certain sectors are 'restricted' to civilians) INT8 sRadioScanModifier; // modifies the scan range of the radio scan assignment in this sector - UINT16 usPrisonRoomNumber[MAX_PRISON_ROOMS]; // room numbers of prisons + + std::vector prisonroomvector; // room numbers of prisons UINT16 usCivilianPopulation; // total amount of civilians that are supposed to be in this sector. This does not have to be the number of civilians in tactical diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index 1640cffd..14ac82ba 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -3465,8 +3465,6 @@ void CreateAssassin(UINT8 disguisetype) extern UINT16* gusWorldRoomInfo; extern SECTOR_EXT_DATA SectorExternalData[256][4]; -static UINT8 roomcnt = 0; - // For now, this is only used for prison cells INT32 GetSittableGridNoInRoom(UINT16 usRoom, BOOLEAN fEnoughSpace) { @@ -3502,6 +3500,8 @@ INT32 GetSittableGridNoInRoom(UINT16 usRoom, BOOLEAN fEnoughSpace) return NOWHERE; } +static UINT16 roomcnt = 0; + void CreatePrisonerOfWar() { INT32 insertiongridno = NOWHERE; @@ -3510,25 +3510,16 @@ void CreatePrisonerOfWar() UINT8 ubSectorId = SECTOR(gWorldSectorX, gWorldSectorY); if ( ubSectorId >= 0 && ubSectorId < 256 ) { - // We need to 'condense' the room numbers, as some might be empty in the xml - UINT16 realrooms[MAX_PRISON_ROOMS]; - - UINT8 numrooms = 0; - for(UINT8 i = 0; i < MAX_PRISON_ROOMS; ++i) - { - if ( SectorExternalData[ubSectorId][0].usPrisonRoomNumber[i] > 0) - { - realrooms[numrooms++] = SectorExternalData[ubSectorId][0].usPrisonRoomNumber[i]; - } - } + if ( SectorExternalData[ubSectorId][0].prisonroomvector.empty( ) ) + return; ++roomcnt; - if ( roomcnt >= numrooms ) + if ( roomcnt >= SectorExternalData[ubSectorId][0].prisonroomvector.size() ) roomcnt = 0; - UINT16 room = realrooms[roomcnt]; - - insertiongridno = GetSittableGridNoInRoom(room, TRUE); + UINT16 room = SectorExternalData[ubSectorId][0].prisonroomvector[roomcnt]; + + insertiongridno = GetSittableGridNoInRoom( room, TRUE ); // invalid gridno? Get out of here if ( TileIsOutOfBounds(insertiongridno) )