Change: replaced all <usPrisonRoomNumberXX>-tags with <usPrisonRoomNumber>, now 65535 prison rooms are supported

Requires GameDir >= r2234

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7826 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2015-04-21 20:34:06 +00:00
parent cc7d52c901
commit b8d8e9b4a8
3 changed files with 34 additions and 121 deletions
+24 -102
View File
@@ -43,6 +43,8 @@ typedef struct
UINT32 maxReadDepth; UINT32 maxReadDepth;
} SectorNameParseData; } SectorNameParseData;
// for compliation reasons, this may not be a part of SectorNameParseData
std::vector<UINT16> prisonroomvector;
BOOLEAN SectorName_TextOnly; BOOLEAN SectorName_TextOnly;
@@ -90,22 +92,7 @@ SectorNameStartElementHandle(void *userData, const XML_Char *name, const char **
strcmp(name, "usNaturalDirt") == 0 || strcmp(name, "usNaturalDirt") == 0 ||
strcmp(name, "usCurfewValue") == 0 || strcmp(name, "usCurfewValue") == 0 ||
strcmp(name, "sRadioScanModifier") == 0 || strcmp(name, "sRadioScanModifier") == 0 ||
strcmp(name, "usPrisonRoomNumber00") == 0 || strcmp(name, "usPrisonRoomNumber" ) == 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, "usCivilianPopulation") == 0 )) strcmp(name, "usCivilianPopulation") == 0 ))
{ {
pData->curElement = ELEMENT_PROPERTY; pData->curElement = ELEMENT_PROPERTY;
@@ -198,22 +185,28 @@ SectorNameEndElementHandle(void *userData, const XML_Char *name)
INT8 radioscanmod = max( -3, pData->sectordata.sRadioScanModifier ); INT8 radioscanmod = max( -3, pData->sectordata.sRadioScanModifier );
radioscanmod = min( 3, pData->sectordata.sRadioScanModifier ); radioscanmod = min( 3, pData->sectordata.sRadioScanModifier );
SectorExternalData[ubSectorId][0].sRadioScanModifier = pData->sectordata.sRadioScanModifier; SectorExternalData[ubSectorId][0].sRadioScanModifier = radioscanmod;
SectorExternalData[ubSectorId][1].sRadioScanModifier = pData->sectordata.sRadioScanModifier; SectorExternalData[ubSectorId][1].sRadioScanModifier = radioscanmod;
SectorExternalData[ubSectorId][2].sRadioScanModifier = pData->sectordata.sRadioScanModifier; SectorExternalData[ubSectorId][2].sRadioScanModifier = radioscanmod;
SectorExternalData[ubSectorId][3].sRadioScanModifier = pData->sectordata.sRadioScanModifier; SectorExternalData[ubSectorId][3].sRadioScanModifier = radioscanmod;
SectorExternalData[ubSectorId][0].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][0].usCivilianPopulation = pData->sectordata.usCivilianPopulation;
SectorExternalData[ubSectorId][1].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][1].usCivilianPopulation = pData->sectordata.usCivilianPopulation;
SectorExternalData[ubSectorId][2].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][2].usCivilianPopulation = pData->sectordata.usCivilianPopulation;
SectorExternalData[ubSectorId][3].usCivilianPopulation = pData->sectordata.usCivilianPopulation; SectorExternalData[ubSectorId][3].usCivilianPopulation = pData->sectordata.usCivilianPopulation;
for(UINT8 i = 0; i <MAX_PRISON_ROOMS; ++i) if ( !prisonroomvector.empty( ) )
{ {
SectorExternalData[ubSectorId][0].usPrisonRoomNumber[i] = pData->sectordata.usPrisonRoomNumber[i]; std::vector<UINT16>::iterator itend = prisonroomvector.end( );
pData->sectordata.usPrisonRoomNumber[i] = 0; std::vector<UINT16>::iterator it = prisonroomvector.begin( );
for ( ; it != itend; ++it )
{
SectorExternalData[ubSectorId][0].prisonroomvector.push_back( (*it) );
}
} }
prisonroomvector.clear( );
// clean up values afterwards // clean up values afterwards
pData->sectordata.usWaterType = 0; pData->sectordata.usWaterType = 0;
pData->sectordata.usNaturalDirt = 100; pData->sectordata.usNaturalDirt = 100;
@@ -300,86 +293,15 @@ SectorNameEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->sectordata.sRadioScanModifier = (INT8)atoi( pData->szCharData ); pData->sectordata.sRadioScanModifier = (INT8)atoi( pData->szCharData );
} }
else if(strcmp(name, "usPrisonRoomNumber00") == 0) else if ( strcmp( name, "usPrisonRoomNumber" ) == 0 )
{ {
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->sectordata.usPrisonRoomNumber[0] = (UINT8)atoi( pData->szCharData );
} UINT16 room = (UINT16)atoi( pData->szCharData );
else if(strcmp(name, "usPrisonRoomNumber01") == 0)
{ if ( room )
pData->curElement = ELEMENT; prisonroomvector.push_back( room );
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 );
}
else if(strcmp(name, "usCivilianPopulation") == 0) else if(strcmp(name, "usCivilianPopulation") == 0)
{ {
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
+2 -2
View File
@@ -494,7 +494,6 @@ OBJECTTYPE* GetExternalFeedingObject(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject
BOOLEAN DeductBulletViaExternalFeeding(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject); BOOLEAN DeductBulletViaExternalFeeding(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject);
#define MAX_PRISON_ROOMS 16
// Flugente: additional xml data for sectors // Flugente: additional xml data for sectors
typedef struct typedef struct
{ {
@@ -502,7 +501,8 @@ typedef struct
UINT16 usNaturalDirt; // extra dirt percentage when firing in this sector 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) 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 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<UINT16> 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 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
+8 -17
View File
@@ -3465,8 +3465,6 @@ void CreateAssassin(UINT8 disguisetype)
extern UINT16* gusWorldRoomInfo; extern UINT16* gusWorldRoomInfo;
extern SECTOR_EXT_DATA SectorExternalData[256][4]; extern SECTOR_EXT_DATA SectorExternalData[256][4];
static UINT8 roomcnt = 0;
// For now, this is only used for prison cells // For now, this is only used for prison cells
INT32 GetSittableGridNoInRoom(UINT16 usRoom, BOOLEAN fEnoughSpace) INT32 GetSittableGridNoInRoom(UINT16 usRoom, BOOLEAN fEnoughSpace)
{ {
@@ -3502,6 +3500,8 @@ INT32 GetSittableGridNoInRoom(UINT16 usRoom, BOOLEAN fEnoughSpace)
return NOWHERE; return NOWHERE;
} }
static UINT16 roomcnt = 0;
void CreatePrisonerOfWar() void CreatePrisonerOfWar()
{ {
INT32 insertiongridno = NOWHERE; INT32 insertiongridno = NOWHERE;
@@ -3510,25 +3510,16 @@ void CreatePrisonerOfWar()
UINT8 ubSectorId = SECTOR(gWorldSectorX, gWorldSectorY); UINT8 ubSectorId = SECTOR(gWorldSectorX, gWorldSectorY);
if ( ubSectorId >= 0 && ubSectorId < 256 ) if ( ubSectorId >= 0 && ubSectorId < 256 )
{ {
// We need to 'condense' the room numbers, as some might be empty in the xml if ( SectorExternalData[ubSectorId][0].prisonroomvector.empty( ) )
UINT16 realrooms[MAX_PRISON_ROOMS]; return;
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];
}
}
++roomcnt; ++roomcnt;
if ( roomcnt >= numrooms ) if ( roomcnt >= SectorExternalData[ubSectorId][0].prisonroomvector.size() )
roomcnt = 0; roomcnt = 0;
UINT16 room = realrooms[roomcnt]; UINT16 room = SectorExternalData[ubSectorId][0].prisonroomvector[roomcnt];
insertiongridno = GetSittableGridNoInRoom(room, TRUE); insertiongridno = GetSittableGridNoInRoom( room, TRUE );
// invalid gridno? Get out of here // invalid gridno? Get out of here
if ( TileIsOutOfBounds(insertiongridno) ) if ( TileIsOutOfBounds(insertiongridno) )