diff --git a/GameSettings.cpp b/GameSettings.cpp
index 4b9232de..72905067 100644
--- a/GameSettings.cpp
+++ b/GameSettings.cpp
@@ -1484,6 +1484,9 @@ void LoadGameExternalOptions()
gGameExternalOptions.ubTreeCoverEffectiveness = iniReader.ReadInteger("Tactical Cover System Settings", "COVER_SYSTEM_TREE_EFFECTIVENESS", 20, 0, 100);
gGameExternalOptions.ubCoverDisplayUpdateWait = iniReader.ReadInteger("Tactical Cover System Settings", "COVER_SYSTEM_UPDATE_DELAY", 500, -1, 10000);
+ // anv: detailed tileset terrain types
+ gGameExternalOptions.fAdditionalTileProperties = iniReader.ReadBoolean("Tactical Cover System Settings", "COVER_SYSTEM_ADDITIONAL_TILE_PROPERTIES", TRUE );
+
//################# Tactical Suppression Fire Settings ##################
// These settings control the behavior of Suppression Fire, its severity, and its side-effects.
diff --git a/GameSettings.h b/GameSettings.h
index 6b030855..3cad69b5 100644
--- a/GameSettings.h
+++ b/GameSettings.h
@@ -843,6 +843,9 @@ typedef struct
UINT8 ubLBEEffectiveness;
UINT8 ubMovementEffectiveness;
UINT16 ubCoverDisplayUpdateWait;//Moa: changed to UINT16 to allow values 500ms to 10000ms, see ini file and DisplayCover( BOOLEAN ), DisplayMines( BOOLEAN )
+
+ // anv: additional tile properties
+ BOOLEAN fAdditionalTileProperties;
// HEADROCK HAM B1: Global modifier for mine income (0 is automatically turned to 1 to avoid divide-by-zero.)
INT16 usMineIncomePercentage;
diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp
index 38a049ff..97541e5d 100644
--- a/Tactical/DisplayCover.cpp
+++ b/Tactical/DisplayCover.cpp
@@ -121,6 +121,9 @@ TRAIT_DRAW_MODE gubDrawModeTrait = TRAIT_DRAW_OFF; // Flugente: mines display
CHAR16* GetTerrainName( const UINT8& ubTerrainType );
+// anv: additional tile properties
+CHAR16* GetDetailedTerrainName( ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties );
+
TileDefines GetTileCoverIndex( const INT8& bCover );
void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof );
@@ -235,6 +238,72 @@ CHAR16* GetTerrainName( const UINT8& ubTerrainType )
}
}
+CHAR16* GetDetailedTerrainName( ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties )
+{
+ if(zGivenTileProperties.bWoodCamoAffinity >= 50)
+ {
+ if(zGivenTileProperties.bDesertCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__WOOD_AND_DESERT];
+ }
+ else
+ {
+ if(zGivenTileProperties.bUrbanCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__WOOD_AND_URBAN];
+ }
+ else
+ {
+ if(zGivenTileProperties.bSnowCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__WOOD_AND_SNOW];
+ }
+ else
+ {
+ return gzDisplayCoverText[DC_TTI__WOOD];
+ }
+ }
+ }
+ }
+ else if(zGivenTileProperties.bDesertCamoAffinity >= 50)
+ {
+ if(zGivenTileProperties.bUrbanCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__DESERT_AND_URBAN];
+ }
+ else
+ {
+ if(zGivenTileProperties.bSnowCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__DESERT_AND_SNOW];
+ }
+ else
+ {
+ return gzDisplayCoverText[DC_TTI__DESERT];
+ }
+ }
+ }
+ else if(zGivenTileProperties.bUrbanCamoAffinity >= 50)
+ {
+ if(zGivenTileProperties.bSnowCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__URBAN_AND_SNOW];
+ }
+ else
+ {
+ return gzDisplayCoverText[DC_TTI__URBAN];
+ }
+ }
+ else if(zGivenTileProperties.bSnowCamoAffinity >= 50)
+ {
+ return gzDisplayCoverText[DC_TTI__SNOW];
+ }
+ else
+ {
+ return gzDisplayCoverText[DC_TTI__UNKNOWN];
+ }
+}
+
TileDefines GetTileCoverIndex( const INT8& bCover )
{
switch(bCover) {
@@ -616,7 +685,20 @@ void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
{
UINT8 ubLightLevel = LightTrueLevel(sTargetGridNo, gsInterfaceLevel);
UINT8 ubBrightness = 100 - 100 * (ubLightLevel-SHADE_MAX)/(SHADE_MIN-SHADE_MAX); // percentage
- INT8 ubTerrainType = GetTerrainTypeForGrid(sTargetGridNo, gsInterfaceLevel);
+
+ UINT8 ubTerrainType = NO_TERRAIN;
+
+ // anv: additional tile properties
+ ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties;
+ memset(&zGivenTileProperties,0,sizeof(zGivenTileProperties));
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid(sTargetGridNo, gsInterfaceLevel);
+ }
+ else
+ {
+ ubTerrainType = GetTerrainTypeForGrid(sTargetGridNo, gsInterfaceLevel);
+ }
INT8 ubCover = - GetSightAdjustment(pSoldier, sTargetGridNo, gsInterfaceLevel);
@@ -626,9 +708,18 @@ void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
//Display the msg
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString );
- ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE,
- gzDisplayCoverText[DC_MSG__COVER_INFORMATION],
- ubCover, GetTerrainName(ubTerrainType), ubBrightness );
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE,
+ gzDisplayCoverText[DC_MSG__COVER_INFORMATION],
+ ubCover, GetDetailedTerrainName(zGivenTileProperties), ubBrightness );
+ }
+ else
+ {
+ ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE,
+ gzDisplayCoverText[DC_MSG__COVER_INFORMATION],
+ ubCover, GetTerrainName(ubTerrainType), ubBrightness );
+ }
}
//Get the range to the target location
diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp
index bb79349f..66ed84d1 100644
--- a/Tactical/LOS.cpp
+++ b/Tactical/LOS.cpp
@@ -437,7 +437,16 @@ inline INT8 GetUrbanCamouflage( SOLDIERTYPE* pSoldier )
return MINMAX100N(pSoldier->urbanCamo + pSoldier->wornUrbanCamo);
}
-
+// anv: added this
+inline INT8 GetSnowCamouflage( SOLDIERTYPE* pSoldier )
+{
+ // SANDRO - the Camouflage trait has been solved differently
+ //if (HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_URBAN )) {
+ // return 100;
+ //}
+
+ return MINMAX100N(pSoldier->snowCamo + pSoldier->wornSnowCamo);
+}
// should be in lightning, 0-100 definition of brightness
inline UINT8 GetBrightness(const UINT8& ubLightLevel)
{
@@ -500,6 +509,95 @@ INT8 GetTerrainTypeForGrid( const INT32& sGridNo, const INT16& bLevel )
return gTileDatabase[ pNode->usIndex ].ubTerrainID;
}
+ADDITIONAL_TILE_PROPERTIES_VALUES GetAllAdditonalTilePropertiesForGrid( const INT32& sGridNo, const INT16& bLevel )
+{
+ LEVELNODE* pNode;
+ ADDITIONAL_TILE_PROPERTIES_VALUES ubAllTileProperties;
+ INT16 iWoodCamoAffinity = 0;
+ INT16 iDesertCamoAffinity = 0;
+ INT16 iUrbanCamoAffinity = 0;
+ INT16 iSnowCamoAffinity = 0;
+ INT16 iCamoStanceModifer = 0;
+ INT16 iSoundModifier = 0;
+ INT16 iStealthDifficultyModifer = 0;
+ UINT8 ubTerrainID = 0;
+ BOOLEAN fFoundBottom = FALSE;
+
+ memset(&ubAllTileProperties,0,sizeof(ubAllTileProperties));
+ for(UINT8 ubCnt=0; ubCnt<5 && !fFoundBottom; ubCnt++)
+ {
+ if (bLevel == I_ROOF_LEVEL)
+ {
+ switch(ubCnt)
+ {
+ case 0:
+ pNode = gpWorldLevelData[ sGridNo ].pTopmostHead;
+ break;
+ case 1:
+ pNode = gpWorldLevelData[ sGridNo ].pOnRoofHead;
+ break;
+ case 2:
+ pNode = gpWorldLevelData[ sGridNo ].pRoofHead;
+ break;
+ default:
+ pNode = NULL;
+ break;
+ }
+ }
+ else
+ {
+ switch(ubCnt)
+ {
+ case 0:
+ pNode = gpWorldLevelData[ sGridNo ].pShadowHead;
+ break;
+ case 1:
+ pNode = gpWorldLevelData[ sGridNo ].pStructHead;
+ break;
+ case 2:
+ pNode = gpWorldLevelData[ sGridNo ].pObjectHead;
+ break;
+ case 3:
+ pNode = gpWorldLevelData[ sGridNo ].pLandHead;
+ break;
+ case 4:
+ pNode = gpWorldLevelData[ sGridNo ].pLandStart;
+ break;
+ }
+ }
+ if( pNode!= NULL )
+ {
+ iWoodCamoAffinity += gTileDatabase[ pNode->usIndex ].bWoodCamoAffinity;
+ iDesertCamoAffinity += gTileDatabase[ pNode->usIndex ].bDesertCamoAffinity;
+ iUrbanCamoAffinity += gTileDatabase[ pNode->usIndex ].bUrbanCamoAffinity;
+ iSnowCamoAffinity += gTileDatabase[ pNode->usIndex ].bSnowCamoAffinity;
+
+ iCamoStanceModifer += gTileDatabase[ pNode->usIndex ].bCamoStanceModifer;
+ iSoundModifier += gTileDatabase[ pNode->usIndex ].bSoundModifier;
+ iStealthDifficultyModifer += gTileDatabase[ pNode->usIndex ].bStealthDifficultyModifer;
+
+ ubTerrainID = gTileDatabase[ pNode->usIndex ].ubTerrainID;
+ // going from the top, if any tile has terrain type, we're ignoring all tiles below it
+ if(ubTerrainID != NO_TERRAIN)
+ {
+ fFoundBottom = TRUE;
+ }
+ }
+
+ }
+
+ ubAllTileProperties.bWoodCamoAffinity = (INT8)iWoodCamoAffinity;
+ ubAllTileProperties.bDesertCamoAffinity = (INT8)iDesertCamoAffinity;
+ ubAllTileProperties.bUrbanCamoAffinity = (INT8)iUrbanCamoAffinity;
+ ubAllTileProperties.bSnowCamoAffinity = (INT8)iSnowCamoAffinity;
+
+ ubAllTileProperties.bCamoStanceModifer = (INT8)iCamoStanceModifer;
+ ubAllTileProperties.bSoundModifier = (INT8)iSoundModifier;
+ ubAllTileProperties.bStealthDifficultyModifer = (INT8)iStealthDifficultyModifer;
+
+ return ubAllTileProperties;
+}
+
// the following functions should return percentage values which can be easily added/substracted from
// the sight reduction variable inside the Soldier-sight-test.
// This means we specify here how much each test counts towards the total.
@@ -547,6 +645,32 @@ INT8 GetSightAdjustmentCamouflageOnTerrain( SOLDIERTYPE* pSoldier, const UINT8&
}
}
+INT8 GetDetailedSightAdjustmentCamouflageOnTerrain( SOLDIERTYPE* pSoldier, const UINT8& ubStance, ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties )
+{
+ if (gGameExternalOptions.ubCamouflageEffectiveness == 0) {
+ return 0;
+ }
+
+ INT16 iResult = 0;
+
+ INT8 bStanceModifier = zGivenTileProperties.bCamoStanceModifer;
+
+ INT8 scaler = -(ANIM_STAND+1 - max(ANIM_PRONE, ubStance - bStanceModifier)); // stand = 7-6 => 10%, crouch = 7-3 => 66%, prone = 7-1 => 100%;
+
+ UINT8 effectiveness = gGameExternalOptions.ubCamouflageEffectiveness;
+
+ effectiveness += (UINT8)(pSoldier->GetBackgroundValue(BG_PERC_CAMO));
+
+ scaler = effectiveness * scaler / 6;
+
+ iResult += GetJungleCamouflage(pSoldier) * scaler / 100 * zGivenTileProperties.bWoodCamoAffinity / 100;
+ iResult += GetDesertCamouflage(pSoldier) * scaler / 100 * zGivenTileProperties.bDesertCamoAffinity / 100;
+ iResult += GetUrbanCamouflage(pSoldier) * scaler / 100 * zGivenTileProperties.bUrbanCamoAffinity / 100;
+ iResult += GetSnowCamouflage(pSoldier) * scaler / 100 * zGivenTileProperties.bSnowCamoAffinity / 100;
+
+ return (INT8)min(100, max(0, iResult));
+}
+
/**
* Calculates a percentage value to be added (or substracted) from sight. it's based on the movement of a soldier and the brightness level.
* - this will be used to calculate the penalty (sight addition) which occurs on the soldier who is been spot-tested
@@ -722,7 +846,19 @@ INT16 GetSightAdjustment( SOLDIERTYPE* pSoldier, INT32 sGridNo, INT16 bLevel, IN
bStance = GetCurrentHeightOfSoldier( pSoldier );
}
- UINT8 ubTerrainType = GetTerrainTypeForGrid( sGridNo, bLevel );
+ UINT8 ubTerrainType = NO_TERRAIN;
+ // anv: additional tile properties
+ ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties;
+ memset(&zGivenTileProperties,0,sizeof(zGivenTileProperties));
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid(sGridNo, bLevel);
+ }
+ else
+ {
+ ubTerrainType = GetTerrainTypeForGrid( sGridNo, bLevel );
+ }
+
UINT8 ubLightLevel = LightTrueLevel( sGridNo, bLevel );
INT16 iSightAdjustment = 0;
@@ -736,7 +872,15 @@ INT16 GetSightAdjustment( SOLDIERTYPE* pSoldier, INT32 sGridNo, INT16 bLevel, IN
// context sensitive stuff with 2nd parameter (needs soldier for attributes but can be given a second parameter)
iSightAdjustment += GetSightAdjustmentThroughMovement( pSoldier, pSoldier->bTilesMoved, ubLightLevel );
iSightAdjustment += GetSightAdjustmentStealthAtLightLevel( pSoldier, ubLightLevel );
- iSightAdjustment += GetSightAdjustmentCamouflageOnTerrain( pSoldier, bStance, ubTerrainType );
+
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ iSightAdjustment += GetDetailedSightAdjustmentCamouflageOnTerrain( pSoldier, bStance, zGivenTileProperties );
+ }
+ else
+ {
+ iSightAdjustment += GetSightAdjustmentCamouflageOnTerrain( pSoldier, bStance, ubTerrainType );
+ }
return MINMAX100N(iSightAdjustment);
}
diff --git a/Tactical/LOS.h b/Tactical/LOS.h
index dec20820..d78006ff 100644
--- a/Tactical/LOS.h
+++ b/Tactical/LOS.h
@@ -185,6 +185,9 @@ void MoveBullet( INT32 iBullet );
INT8 GetTerrainTypeForGrid( const INT32& uGridNo, const INT16& bLevel );
+// anv: additional tile properties
+ADDITIONAL_TILE_PROPERTIES_VALUES GetAllAdditonalTilePropertiesForGrid( const INT32& sGridNo, const INT16& bLevel );
+
// check the flat distance adjustment based on your stance
// use this to test your view on your surroundings based on your stance
INT8 GetSightAdjustmentThroughStance( const UINT8& ubStance );
diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp
index 5c0cc23d..af04fe5f 100644
--- a/Tactical/Soldier Control.cpp
+++ b/Tactical/Soldier Control.cpp
@@ -1635,6 +1635,7 @@ UINT8 bHealthStrRanges[] =
INT16 gsTerrainTypeSpeedModifiers[] =
{
+ 5, // NO_TERRAIN // anv: that one was missing
5, // Flat ground
5, // Floor
5, // Paved road
diff --git a/Tactical/Structure Wrap.cpp b/Tactical/Structure Wrap.cpp
index d7deb642..4ce71659 100644
--- a/Tactical/Structure Wrap.cpp
+++ b/Tactical/Structure Wrap.cpp
@@ -25,9 +25,21 @@ BOOLEAN IsJumpableWindowPresentAtGridNo( INT32 sGridNo, INT8 direction2, BOOLEAN
STRUCTURE * pStructure;
pStructure = FindStructure( sGridNo, STRUCTURE_WALLNWINDOW );
-
+
if ( pStructure )
{
+ // anv: additional tile properties hook
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ LEVELNODE *pNode = FindLevelNodeBasedOnStructure( sGridNo, pStructure );
+ if(pNode != NULL)
+ {
+ if( gTileDatabase[ pNode->usIndex ].uiAdditionalFlags & ADDITIONAL_TILE_FLAG_BLOCKED_WINDOW )
+ // special tag disables jumping through specific windows (e.g. barred windows in Tixa)
+ return( FALSE );
+ }
+ }
+
if ( ( direction2 == SOUTH || direction2 == NORTH ) && (pStructure->ubWallOrientation == OUTSIDE_TOP_LEFT || pStructure->ubWallOrientation == INSIDE_TOP_LEFT ) && pStructure->fFlags & STRUCTURE_WALLNWINDOW && !(pStructure->fFlags & STRUCTURE_SPECIAL) )
{
if ( fIntactWindowsAlso || ( pStructure->fFlags & STRUCTURE_OPEN ) )
@@ -663,4 +675,4 @@ BOOLEAN SetOpenableStructureToClosed( INT32 sGridNo, UINT8 ubLevel )
}
// else leave it as is!
return( TRUE );
-}
+}
diff --git a/Tactical/Tactical_VS2005.vcproj b/Tactical/Tactical_VS2005.vcproj
index 85893eff..2f6b710a 100644
--- a/Tactical/Tactical_VS2005.vcproj
+++ b/Tactical/Tactical_VS2005.vcproj
@@ -1000,6 +1000,10 @@
RelativePath=".\World Items.cpp"
>
+
+
diff --git a/Tactical/Tactical_VS2008.vcproj b/Tactical/Tactical_VS2008.vcproj
index ca10aa90..ee73d0c7 100644
--- a/Tactical/Tactical_VS2008.vcproj
+++ b/Tactical/Tactical_VS2008.vcproj
@@ -1002,6 +1002,10 @@
RelativePath="World Items.cpp"
>
+
+
diff --git a/Tactical/Tactical_VS2010.vcxproj b/Tactical/Tactical_VS2010.vcxproj
index 1d6faac2..75a38467 100644
--- a/Tactical/Tactical_VS2010.vcxproj
+++ b/Tactical/Tactical_VS2010.vcxproj
@@ -239,6 +239,7 @@
+
diff --git a/Tactical/Tactical_VS2010.vcxproj.filters b/Tactical/Tactical_VS2010.vcxproj.filters
index fec1b39a..b0b79ddd 100644
--- a/Tactical/Tactical_VS2010.vcxproj.filters
+++ b/Tactical/Tactical_VS2010.vcxproj.filters
@@ -659,5 +659,8 @@
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/Tactical/Tactical_VS2013.vcxproj b/Tactical/Tactical_VS2013.vcxproj
index 96ab145b..f6c92dc5 100644
--- a/Tactical/Tactical_VS2013.vcxproj
+++ b/Tactical/Tactical_VS2013.vcxproj
@@ -239,6 +239,7 @@
+
diff --git a/Tactical/Tactical_VS2013.vcxproj.filters b/Tactical/Tactical_VS2013.vcxproj.filters
index fec1b39a..cce9e9ae 100644
--- a/Tactical/Tactical_VS2013.vcxproj.filters
+++ b/Tactical/Tactical_VS2013.vcxproj.filters
@@ -658,6 +658,9 @@
Source Files
+
+
+ Source Files
\ No newline at end of file
diff --git a/Tactical/XML.h b/Tactical/XML.h
index f5213f41..9ebae47b 100644
--- a/Tactical/XML.h
+++ b/Tactical/XML.h
@@ -491,6 +491,10 @@ extern BOOLEAN WriteCampaignStatsEvents( STR fileName);
extern BOOLEAN ReadInTaunts(STR fileName, BOOLEAN localizedVersion );
extern BOOLEAN WriteTaunts( STR fileName );
+// anv: detailed tileset terrain types
+extern BOOLEAN ReadInAdditionalTileProperties(STR fileName );
+extern BOOLEAN WriteAdditionalTileProperties( STR fileName );
+
//Enabled\Disabled profile sound by Jazz
extern BOOLEAN ReadInSoundProfile( STR fileName );
extern BOOLEAN WriteSoundProfile( STR fileName );
diff --git a/Tactical/XML_AdditionalTileProperties.cpp b/Tactical/XML_AdditionalTileProperties.cpp
new file mode 100644
index 00000000..bf007aa4
--- /dev/null
+++ b/Tactical/XML_AdditionalTileProperties.cpp
@@ -0,0 +1,218 @@
+#ifdef PRECOMPILEDHEADERS
+ #include "Tactical All.h"
+#else
+ #include "sgp.h"
+ #include "Debug Control.h"
+ #include "expat.h"
+ #include "XML.h"
+ #include "Interface.h"
+#endif
+
+#include "tiledef.h"
+
+struct
+{
+ PARSE_STAGE curElement;
+
+ CHAR8 szCharData[MAX_CHAR_DATA_LENGTH+1];
+
+ UINT32 currentDepth;
+ UINT32 maxReadDepth;
+}
+typedef additionalTilePropertyParseData;
+
+static void XMLCALL
+additionalTilePropertyStartElementHandle(void *userData, const XML_Char *name, const XML_Char **atts)
+{
+ additionalTilePropertyParseData * pData = (additionalTilePropertyParseData *)userData;
+
+ if(pData->currentDepth <= pData->maxReadDepth) //are we reading this element?
+ {
+ if(strcmp(name, "ADDITIONALTILEPROPERTIES") == 0 && pData->curElement == ELEMENT_NONE)
+ {
+ pData->curElement = ELEMENT;
+
+ memset(&zAdditionalTileProperties,0,sizeof(ADDITIONAL_TILE_PROPERTIES_VALUES));
+
+ pData->maxReadDepth++; //we are not skipping this element
+ }
+ else if(pData->curElement == ELEMENT &&
+ (strcmp(name, "ubTerrainID") == 0 ||
+ strcmp(name, "bWoodCamoAffinity") == 0 ||
+ strcmp(name, "bDesertCamoAffinity") == 0 ||
+ strcmp(name, "bUrbanCamoAffinity") == 0 ||
+ strcmp(name, "bSnowCamoAffinity") == 0 ||
+ strcmp(name, "bCamoStanceModifer") == 0 ||
+ strcmp(name, "bSoundModifier") == 0 ||
+ strcmp(name, "bStealthDifficultyModifer") == 0 ||
+ strcmp(name, "fBlockedWindow") == 0
+ ))
+ {
+ pData->curElement = ELEMENT_PROPERTY;
+
+ pData->maxReadDepth++; //we are not skipping this element
+ }
+
+ pData->szCharData[0] = '\0';
+ }
+
+ pData->currentDepth++;
+}
+
+static void XMLCALL
+additionalTilePropertyCharacterDataHandle(void *userData, const XML_Char *str, int len)
+{
+ additionalTilePropertyParseData * pData = (additionalTilePropertyParseData *)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
+additionalTilePropertyEndElementHandle(void *userData, const XML_Char *name)
+{
+ additionalTilePropertyParseData * pData = (additionalTilePropertyParseData *)userData;
+
+ if(pData->currentDepth <= pData->maxReadDepth)
+ {
+ if(strcmp(name, "ADDITIONALTILEPROPERTIES") == 0)
+ {
+ pData->curElement = ELEMENT;
+ }
+ else if(strcmp(name, "ubTerrainID") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.ubTerrainID = (UINT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bWoodCamoAffinity") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bWoodCamoAffinity = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bDesertCamoAffinity") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bDesertCamoAffinity = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bUrbanCamoAffinity") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bUrbanCamoAffinity = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bSnowCamoAffinity") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bSnowCamoAffinity = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bCamoStanceModifer") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bCamoStanceModifer = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bSoundModifier") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bSoundModifier = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "bStealthDifficultyModifer") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.bStealthDifficultyModifer = (INT8) atol(pData->szCharData);
+ }
+ else if(strcmp(name, "fBlockedWindow") == 0)
+ {
+ pData->curElement = ELEMENT;
+ zAdditionalTileProperties.uiAdditionalFlags |= (UINT16) atol(pData->szCharData) ? ADDITIONAL_TILE_FLAG_BLOCKED_WINDOW: 0;
+ }
+
+ pData->maxReadDepth--;
+ }
+ pData->currentDepth--;
+}
+
+BOOLEAN ReadInAdditionalTileProperties(STR fileName)
+{
+ HWFILE hFile;
+ UINT32 uiBytesRead;
+ UINT32 uiFSize;
+ CHAR8 * lpcBuffer;
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ additionalTilePropertyParseData pData;
+
+ DebugMsg(TOPIC_JA2, DBG_LEVEL_3, "Loading AdditionalTilePropertys.xml" );
+
+ // 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, additionalTilePropertyStartElementHandle, additionalTilePropertyEndElementHandle);
+ XML_SetCharacterDataHandler(parser, additionalTilePropertyCharacterDataHandle);
+
+ memset(&pData,0,sizeof(pData));
+
+ XML_SetUserData(parser, &pData);
+ if(!XML_Parse(parser, lpcBuffer, uiFSize, TRUE))
+ {
+ CHAR8 errorBuf[511];
+
+ sprintf(errorBuf, "XML Parser Error in additionalTileProperty.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 WriteAdditionalTileProperties( STR fileName)
+{
+ HWFILE hFile;
+
+ //Debug code; make sure that what we got from the file is the same as what's there
+ // Open a new file
+ hFile = FileOpen( fileName, FILE_ACCESS_WRITE | FILE_CREATE_ALWAYS, FALSE );
+ if ( !hFile )
+ return( FALSE );
+
+ {
+ UINT32 cnt;
+
+ FilePrintf(hFile,"\r\n");
+ for(cnt = 0; cnt < NUM_TAUNT; ++cnt)
+ {
+ FilePrintf(hFile,"\t\r\n");
+ FilePrintf(hFile,"\t\t%d\r\n", cnt);
+
+ FilePrintf(hFile,"\t\r\n");
+ }
+ FilePrintf(hFile,"\r\n");
+ }
+ FileClose( hFile );
+
+ return( TRUE );
+}
diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp
index 2cada884..a53ce76c 100644
--- a/Tactical/opplist.cpp
+++ b/Tactical/opplist.cpp
@@ -5298,9 +5298,22 @@ UINT8 MovementNoise( SOLDIERTYPE *pSoldier )
UINT8 ubMaxVolume, ubVolume, ubBandaged, ubEffLife;
INT8 bInWater = FALSE;
+ // anv: additional tile properties
+ // modify amount of noise and stealth difficulty depending on surface type
+
+ INT8 bGroundVolumeModifier = 0;
+ INT8 bGroundStealthDifficultyModifier = 0;
+ ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties;
+ memset(&zGivenTileProperties,0,sizeof(zGivenTileProperties));
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid( pSoldier->sGridNo, pSoldier->pathing.bLevel );
+ bGroundVolumeModifier = zGivenTileProperties.bSoundModifier;
+ bGroundStealthDifficultyModifier = zGivenTileProperties.bStealthDifficultyModifer;
+ }
if ( pSoldier->bTeam == ENEMY_TEAM )
{
- return( (UINT8) (MAX_MOVEMENT_NOISE - PreRandom( 2 )) );
+ return( (UINT8) (MAX_MOVEMENT_NOISE - PreRandom( 2 )) + bGroundVolumeModifier );
}
// CHANGED BY SANDRO - LET'S MAKE THE STEALTH BASED ON AGILITY LIKE IT SHOULD BE
@@ -5376,7 +5389,8 @@ UINT8 MovementNoise( SOLDIERTYPE *pSoldier )
if (!pSoldier->bStealthMode) // REGULAR movement
{
- ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16); // 9 - (0 to 6) => 3 to 9
+ //ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16); // 9 - (0 to 6) => 3 to 9
+ ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16) + bGroundVolumeModifier; // 9 - (0 to 6) => 3 to 9
if (bInWater)
{
@@ -5406,11 +5420,13 @@ UINT8 MovementNoise( SOLDIERTYPE *pSoldier )
}
else // in STEALTH mode
{
- iRoll = (INT32) PreRandom(100); // roll them bones!
+ //iRoll = (INT32) PreRandom(100); // roll them bones!
+ iRoll = (INT32) PreRandom(100) + bGroundStealthDifficultyModifier; // roll them bones!
if (iRoll >= iStealthSkill) // v1.13 modification: give a second chance!
{
- iRoll = (INT32) PreRandom(100);
+ //iRoll = (INT32) PreRandom(100);
+ iRoll = (INT32) PreRandom(100) + bGroundStealthDifficultyModifier;
}
if (iRoll < iStealthSkill)
diff --git a/TileEngine/Structure Internals.h b/TileEngine/Structure Internals.h
index d3980a9a..8584676a 100644
--- a/TileEngine/Structure Internals.h
+++ b/TileEngine/Structure Internals.h
@@ -239,6 +239,8 @@ typedef struct TAG_STRUCTURE_FILE_HEADER
#define STRUCTURE_SCRIPT_FILE_EXTENSION "JSS"
#define STRUCTURE_FILE_EXTENSION "JSD"
+#define ADDITIONAL_TILE_PROPERTIES_EXTENSION "XML"
+
#define STRUCTURE_FILE_CONTAINS_AUXIMAGEDATA 0x01
#define STRUCTURE_FILE_CONTAINS_STRUCTUREDATA 0x02
diff --git a/TileEngine/Tile Surface.cpp b/TileEngine/Tile Surface.cpp
index e9630e3c..638f68f8 100644
--- a/TileEngine/Tile Surface.cpp
+++ b/TileEngine/Tile Surface.cpp
@@ -16,6 +16,7 @@
#include "Fileman.h"
#endif
+#include "XML.h"
TILE_IMAGERY *gTileSurfaceArray[ NUMBEROFTILETYPES ];
UINT8 gbDefaultSurfaceUsed[ NUMBEROFTILETYPES ];
@@ -29,6 +30,8 @@ TILE_IMAGERY *LoadTileSurface( STR8 cFilename )
HVOBJECT hVObject;
HIMAGE hImage;
SGPFILENAME cStructureFilename;
+ SGPFILENAME cAdditionalPropertiesFilename;
+ SGPFILENAME cCommonAdditionalPropertiesFilename;
STR cEndOfName;
STRUCTURE_FILE_REF * pStructureFileRef;
BOOLEAN fOk;
@@ -98,6 +101,41 @@ TILE_IMAGERY *LoadTileSurface( STR8 cFilename )
pStructureFileRef = NULL;
}
+ // anv: load additional tile properties, if any.
+ memset(&zAdditionalTileProperties,0,sizeof(zAdditionalTileProperties));
+
+ // Start by hacking the image filename into that for the structure data
+ strcpy( cAdditionalPropertiesFilename, cFilename );
+ cEndOfName = strchr( cAdditionalPropertiesFilename, '.' );
+ if (cEndOfName != NULL)
+ {
+ cEndOfName++;
+ *cEndOfName = '\0';
+ }
+ else
+ {
+ strcat( cAdditionalPropertiesFilename, "." );
+ }
+ strcat( cAdditionalPropertiesFilename, ADDITIONAL_TILE_PROPERTIES_EXTENSION );
+ // first in /Tilesets/XX/
+ if (FileExists( cAdditionalPropertiesFilename ))
+ {
+ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName));
+ SGP_THROW_IFFALSE(ReadInAdditionalTileProperties(cAdditionalPropertiesFilename), cAdditionalPropertiesFilename);
+ }
+ else
+ {
+ // and if not found, then in /Tilesets/
+ cEndOfName = strrchr( cAdditionalPropertiesFilename, '\\' );
+ sprintf( cCommonAdditionalPropertiesFilename, "TILESETS\\ADDITIONALPROPERTIES%s", cEndOfName );
+ if (FileExists( cCommonAdditionalPropertiesFilename ))
+ {
+ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName));
+ SGP_THROW_IFFALSE(ReadInAdditionalTileProperties(cCommonAdditionalPropertiesFilename), cCommonAdditionalPropertiesFilename);
+ }
+ }
+
+
pTileSurf = (PTILE_IMAGERY) MemAlloc( sizeof( TILE_IMAGERY ) );
// Set all values to zero
@@ -106,6 +144,19 @@ TILE_IMAGERY *LoadTileSurface( STR8 cFilename )
pTileSurf->vo = hVObject;
pTileSurf->pStructureFileRef = pStructureFileRef;
+ pTileSurf->ubTerrainID = zAdditionalTileProperties.ubTerrainID;
+
+ pTileSurf->bWoodCamoAffinity = zAdditionalTileProperties.bWoodCamoAffinity;
+ pTileSurf->bDesertCamoAffinity = zAdditionalTileProperties.bDesertCamoAffinity;
+ pTileSurf->bUrbanCamoAffinity = zAdditionalTileProperties.bUrbanCamoAffinity;
+ pTileSurf->bSnowCamoAffinity = zAdditionalTileProperties.bSnowCamoAffinity;
+
+ pTileSurf->bSoundModifier = zAdditionalTileProperties.bSoundModifier;
+ pTileSurf->bCamoStanceModifer = zAdditionalTileProperties.bCamoStanceModifer;
+ pTileSurf->bStealthDifficultyModifer = zAdditionalTileProperties.bStealthDifficultyModifer;
+
+ pTileSurf->uiAdditionalFlags = zAdditionalTileProperties.uiAdditionalFlags;
+
if (pStructureFileRef && pStructureFileRef->pAuxData != NULL)
{
pTileSurf->pAuxData = pStructureFileRef->pAuxData;
diff --git a/TileEngine/TileDat.cpp b/TileEngine/TileDat.cpp
index 6b06d99e..c61d9c2d 100644
--- a/TileEngine/TileDat.cpp
+++ b/TileEngine/TileDat.cpp
@@ -618,7 +618,7 @@ UINT8 gTileTypeLogicalHeight[ NUMBEROFTILETYPES ] =
};
-void SetSpecificDatabaseValues( UINT16 usType, UINT16 uiDatabaseElem, TILE_ELEMENT *TileElement, BOOLEAN fUseRaisedObjectType )
+void SetSpecificDatabaseValues( UINT16 usType, UINT16 uiDatabaseElem, TILE_ELEMENT *TileElement, BOOLEAN fUseRaisedObjectType, INT32 iTilesetID )
{
UINT8 ubLoop;
INT16 sIndexDiff;
@@ -939,11 +939,30 @@ void SetSpecificDatabaseValues( UINT16 usType, UINT16 uiDatabaseElem, TILE_ELEME
//TileElement->sOffsetHeight = WALL_HEIGHT;
}
- if ( uiDatabaseElem >= REGWATERTEXTURE18 && uiDatabaseElem <= REGWATERTEXTURE50 || uiDatabaseElem == REGWATERTEXTURE ||
+ // anv: ok, as far as I understand here, specific elements of water surface are set to FLAT_GROUND instead of LOW_WATER (edges technically are part of water surface, but mercs can walk on them)
+ // E50 || uiDatabaseElem == REGWATERTEXTURE || seems to a bug, REGWATERTEXTURE is a tile type, not tile element and would overwrite part of first surface instead
+ //
+
+ if ( uiDatabaseElem >= REGWATERTEXTURE18 && uiDatabaseElem <= REGWATERTEXTURE50 ||
uiDatabaseElem == REGWATERTEXTURE12 || uiDatabaseElem == REGWATERTEXTURE14 || uiDatabaseElem == REGWATERTEXTURE16 )
{
TileElement->ubTerrainID = FLAT_GROUND;
}
+ else if( uiDatabaseElem >= REGWATERTEXTURE1 && uiDatabaseElem <= REGWATERTEXTURE18 )
+ {
+ // we set properties for water edges, but need to disable them for proper water tiles
+ if(gGameExternalOptions.fAdditionalTileProperties)
+ {
+ TileElement->bWoodCamoAffinity = 0;
+ TileElement->bDesertCamoAffinity = 0;
+ TileElement->bUrbanCamoAffinity = 0;
+ TileElement->bSnowCamoAffinity = 0;
+ TileElement->bSoundModifier = 0;
+ TileElement->bCamoStanceModifer= 0;
+ TileElement->bStealthDifficultyModifer = 0;
+ TileElement->uiAdditionalFlags = 0;
+ }
+ }
if ( ( usType >= FIRSTROOF && usType <= SECONDSLANTROOF ) || usType == FIRSTHIGHROOF || usType == SECONDHIGHROOF )
{
diff --git a/TileEngine/tiledef.cpp b/TileEngine/tiledef.cpp
index c1a5c976..ad33ba3b 100644
--- a/TileEngine/tiledef.cpp
+++ b/TileEngine/tiledef.cpp
@@ -638,8 +638,9 @@ UINT8 gTileTypeMovementCost[ NUM_TERRAIN_TYPES ] =
};
#endif
+ADDITIONAL_TILE_PROPERTIES_VALUES zAdditionalTileProperties;
-void CreateTileDatabase( )
+void CreateTileDatabase( INT32 iTilesetID )
{
UINT32 cnt1, cnt2;
UINT8 ubLoop;
@@ -683,6 +684,18 @@ void CreateTileDatabase( )
TileElement.hTileSurface = TileSurf->vo;
TileElement.sBuddyNum = -1;
+ // anv: additional tile properties
+ TileElement.bWoodCamoAffinity = TileSurf->bWoodCamoAffinity;
+ TileElement.bDesertCamoAffinity = TileSurf->bDesertCamoAffinity;
+ TileElement.bUrbanCamoAffinity = TileSurf->bUrbanCamoAffinity;
+ TileElement.bSnowCamoAffinity = TileSurf->bSnowCamoAffinity;
+
+ TileElement.bCamoStanceModifer = TileSurf->bCamoStanceModifer;
+ TileElement.bSoundModifier = TileSurf->bSoundModifier;
+ TileElement.bStealthDifficultyModifer = TileSurf->bStealthDifficultyModifer;
+
+ TileElement.uiAdditionalFlags = TileSurf->uiAdditionalFlags;
+
// Check for multi-z stuff
if ( TileSurf->vo->ppZStripInfo != NULL )
{
@@ -761,7 +774,7 @@ void CreateTileDatabase( )
}
}
- SetSpecificDatabaseValues( (UINT16)cnt1, gTileDatabaseSize, &TileElement, TileSurf->bRaisedObjectType );
+ SetSpecificDatabaseValues( (UINT16)cnt1, gTileDatabaseSize, &TileElement, TileSurf->bRaisedObjectType, iTilesetID );
gTileDatabase[ gTileDatabaseSize ] = TileElement;
gTileDatabaseSize++;
diff --git a/TileEngine/tiledef.h b/TileEngine/tiledef.h
index e3f6bf63..765a9f55 100644
--- a/TileEngine/tiledef.h
+++ b/TileEngine/tiledef.h
@@ -34,6 +34,9 @@
#define MAX_ANIMATED_TILES 200
#define WALL_HEIGHT 50
+// anv: additional tile properties flags
+#define ADDITIONAL_TILE_FLAG_BLOCKED_WINDOW 0x0000000000000001
+
//Kris: Added the last two bottom corner orientation values. This won't effect
//current code, but there is new code that makes use of this. A function called
@@ -80,6 +83,19 @@ typedef struct
// Reserved for added room and 32-byte boundaries
BYTE bReserved[ 2 ];
+ INT8 bWoodCamoAffinity;
+ INT8 bDesertCamoAffinity;
+ INT8 bUrbanCamoAffinity;
+ INT8 bSnowCamoAffinity;
+
+ INT8 bCamoStanceModifer;
+ INT8 bSoundModifier;
+ INT8 bStealthDifficultyModifer;
+
+ UINT32 uiAdditionalFlags;
+
+
+
} TILE_IMAGERY, *PTILE_IMAGERY;
typedef struct
@@ -126,6 +142,17 @@ typedef struct
// Reserved for added room and 32-byte boundaries
BYTE bReserved[ 3 ];
+ INT8 bWoodCamoAffinity;
+ INT8 bDesertCamoAffinity;
+ INT8 bUrbanCamoAffinity;
+ INT8 bSnowCamoAffinity;
+
+ INT8 bCamoStanceModifer;
+ INT8 bSoundModifier;
+ INT8 bStealthDifficultyModifer;
+
+ UINT32 uiAdditionalFlags;
+
} TILE_ELEMENT, *PTILE_ELEMENT;
@@ -157,9 +184,25 @@ extern UINT16 gusNumAnimatedTiles;
extern UINT16 gusAnimatedTiles[ MAX_ANIMATED_TILES ];
extern UINT8 gTileTypeMovementCost[ NUM_TERRAIN_TYPES ];
-void CreateTileDatabase( );
+typedef struct
+{
+ UINT8 ubTerrainID;
+ INT8 bWoodCamoAffinity;
+ INT8 bDesertCamoAffinity;
+ INT8 bUrbanCamoAffinity;
+ INT8 bSnowCamoAffinity;
+ INT8 bCamoStanceModifer;
+ INT8 bSoundModifier;
+ INT8 bStealthDifficultyModifer;
+ UINT32 uiAdditionalFlags;
+
+} ADDITIONAL_TILE_PROPERTIES_VALUES;
+
+extern ADDITIONAL_TILE_PROPERTIES_VALUES zAdditionalTileProperties;
+
+void CreateTileDatabase( INT32 iTilesetID );
// Land level manipulation functions
BOOLEAN GetLandHeadType( INT32 iMapIndex, UINT32 *puiType );
@@ -191,7 +234,7 @@ BOOLEAN GetWallOrientation( UINT16 usIndex, UINT16 *pusWallOrientation );
BOOLEAN ContainsWallOrientation( INT32 iMapIndex, UINT32 uiType, UINT16 usWallOrientation, UINT8 *pubLevel );
UINT8 CalculateWallOrientationsAtGridNo( INT32 iMapIndex );
-void SetSpecificDatabaseValues( UINT16 usType, UINT16 uiDatabaseElem, TILE_ELEMENT *TileElement, BOOLEAN fUseRaisedObjectType );
+void SetSpecificDatabaseValues( UINT16 usType, UINT16 uiDatabaseElem, TILE_ELEMENT *TileElement, BOOLEAN fUseRaisedObjectType, INT32 iTilesetID );
BOOLEAN AllocateAnimTileData( TILE_ELEMENT *pTileElem, UINT8 ubNumFrames );
void FreeAnimTileData( TILE_ELEMENT *pTileElem );
diff --git a/TileEngine/worlddef.cpp b/TileEngine/worlddef.cpp
index d12fefad..1e12d6bd 100644
--- a/TileEngine/worlddef.cpp
+++ b/TileEngine/worlddef.cpp
@@ -3696,7 +3696,7 @@ giOldTilesetUsed = giCurrentTilesetID;
// RESET TILE DATABASE
DeallocateTileDatabase( );
- CreateTileDatabase( );
+ CreateTileDatabase( iTilesetID );
// SET GLOBAL ID FOR TILESET ( FOR SAVING! )
giCurrentTilesetID = iTilesetID;
diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp
index c8849d6d..b45db69a 100644
--- a/Utils/_Ja25ChineseText.cpp
+++ b/Utils/_Ja25ChineseText.cpp
@@ -493,9 +493,14 @@ STR16 gzDisplayCoverText[]=
L"丛林", //wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"城市",
L"沙漠",
- L"雪地", // NOT USED!!!
+ L"雪地",
L"树林和沙漠",
- L"" // yes empty for now
+ L"树林和城市",
+ L"树林和雪地",
+ L"沙漠和城市",
+ L"沙漠和雪地",
+ L"城市和雪地",
+ L"-" // yes empty for now
};
#endif
diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp
index 8ab9c98e..87a23724 100644
--- a/Utils/_Ja25DutchText.cpp
+++ b/Utils/_Ja25DutchText.cpp
@@ -492,9 +492,14 @@ STR16 gzDisplayCoverText[]=
L"Wood", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Urban",
L"Desert",
- L"Snow", // NOT USED!!!
+ L"Snow",
L"Wood and Desert",
- L"" // yes empty for now
+ L"Wood and Urban",
+ L"Wood and Snow",
+ L"Desert and Urban",
+ L"Desert and Snow",
+ L"Urban and Snow",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25DutchText.h b/Utils/_Ja25DutchText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25DutchText.h
+++ b/Utils/_Ja25DutchText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp
index 26614a21..aaac99d3 100644
--- a/Utils/_Ja25EnglishText.cpp
+++ b/Utils/_Ja25EnglishText.cpp
@@ -491,9 +491,14 @@ STR16 gzDisplayCoverText[]=
L"Wood", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Urban",
L"Desert",
- L"Snow", // NOT USED!!!
+ L"Snow",
L"Wood and Desert",
- L"" // yes empty for now
+ L"Wood and Urban",
+ L"Wood and Snow",
+ L"Desert and Urban",
+ L"Desert and Snow",
+ L"Urban and Snow",
+ L"-" // yes empty for now
};
#endif
diff --git a/Utils/_Ja25EnglishText.h b/Utils/_Ja25EnglishText.h
index 03b96410..125d17bf 100644
--- a/Utils/_Ja25EnglishText.h
+++ b/Utils/_Ja25EnglishText.h
@@ -66,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp
index 4a46498b..bceb3956 100644
--- a/Utils/_Ja25FrenchText.cpp
+++ b/Utils/_Ja25FrenchText.cpp
@@ -491,9 +491,14 @@ STR16 gzDisplayCoverText[]=
L"Bois", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Urbain",
L"Désert",
- L"Neige", // NOT USED!!!
+ L"Neige",
L"Bois et désert",
- L"" // yes empty for now
+ L"Bois et urbain",
+ L"Bois et neige",
+ L"Désert et urbain",
+ L"Désert et neige",
+ L"Urbain et neige",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25FrenchText.h b/Utils/_Ja25FrenchText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25FrenchText.h
+++ b/Utils/_Ja25FrenchText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp
index 27930bdc..9476120e 100644
--- a/Utils/_Ja25GermanText.cpp
+++ b/Utils/_Ja25GermanText.cpp
@@ -489,9 +489,14 @@ STR16 gzDisplayCoverText[]=
L"Wald", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Stadt",
L"Wüste",
- L"Schnee", // NOT USED!!!
+ L"Schnee",
L"Wald und Wüste",
- L"" // yes empty for now
+ L"Wald und Stadt",
+ L"Wald und Schnee",
+ L"Wüste und Stadt",
+ L"Wüste und Schnee",
+ L"Stadt und Schnee",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25GermanText.h b/Utils/_Ja25GermanText.h
index 775b0081..7d52b710 100644
--- a/Utils/_Ja25GermanText.h
+++ b/Utils/_Ja25GermanText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp
index 94fec4ed..45b89938 100644
--- a/Utils/_Ja25ItalianText.cpp
+++ b/Utils/_Ja25ItalianText.cpp
@@ -489,9 +489,14 @@ STR16 gzDisplayCoverText[]=
L"Bosco", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Urbano",
L"Deserto",
- L"Neve", // NOT USED!!!
+ L"Neve",
L"Bosco e deserto",
- L"" // yes empty for now
+ L"Bosco e urbano",
+ L"Bosco e neve",
+ L"Deserto e urbano",
+ L"Deserto e neve",
+ L"Urbano e neve",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25ItalianText.h b/Utils/_Ja25ItalianText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25ItalianText.h
+++ b/Utils/_Ja25ItalianText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp
index 3257f182..935cfc7a 100644
--- a/Utils/_Ja25PolishText.cpp
+++ b/Utils/_Ja25PolishText.cpp
@@ -483,18 +483,23 @@ STR16 gzIronManModeWarningText[]=
STR16 gzDisplayCoverText[]=
{
- L"Cover: %d/100 %s, Brightness: %d/100",
- L"Gun Range: %d/%d tiles, Chance to hit: %d/100",
- L"Gun Range: %d/%d tiles, Muzzle Stability: %d/100",
- L"Disabling cover display",
- L"Showing mercenary view",
- L"Showing danger zones for mercenary",
- L"Wood", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
- L"Urban",
- L"Desert",
- L"Snow", // NOT USED!!!
- L"Wood and Desert",
- L"" // yes empty for now
+ L"Osłona: %d/100 %s, Oświetlenie: %d/100",
+ L"Zasięg broni: %d/%d pól, Szansa trafienia: %d/100",
+ L"Zasięg broni: %d/%d pól, Stabilność broni: %d/100",
+ L"Ukryj wyświetlani informacji o osłonie",
+ L"Pokaż zasięg wzroku postaci",
+ L"Pokaż stefy zagrożenia postaci",
+ L"Las", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
+ L"Miasto",
+ L"Pustynia",
+ L"Śnieg",
+ L"Las i pustynia",
+ L"Las i miasto",
+ L"Las i śnieg",
+ L"Pustynia i miasto",
+ L"Pustynia i śnieg",
+ L"Miasto i śnieg",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25PolishText.h b/Utils/_Ja25PolishText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25PolishText.h
+++ b/Utils/_Ja25PolishText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp
index 9f555a98..b6850293 100644
--- a/Utils/_Ja25RussianText.cpp
+++ b/Utils/_Ja25RussianText.cpp
@@ -490,9 +490,14 @@ STR16 gzDisplayCoverText[]=
L"Джунгли", //Wood //wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Город",
L"Пустыня",
- L"Снег", //NOT USED!!!
+ L"Снег",
L"Лес и пустыня",
- L"" // yes empty for now
+ L"Лес и город",
+ L"Лес и снег",
+ L"Пустыня и город",
+ L"Пустыня и снег",
+ L"Город и снег",
+ L"-" // yes empty for now
};
#endif
diff --git a/Utils/_Ja25RussianText.h b/Utils/_Ja25RussianText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25RussianText.h
+++ b/Utils/_Ja25RussianText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];
diff --git a/Utils/_Ja25TaiwaneseText.cpp b/Utils/_Ja25TaiwaneseText.cpp
index 925410ca..a72d1a8b 100644
--- a/Utils/_Ja25TaiwaneseText.cpp
+++ b/Utils/_Ja25TaiwaneseText.cpp
@@ -492,9 +492,15 @@ STR16 gzDisplayCoverText[]=
L"Wood", // wanted to use jungle , but wood is shorter in german too (dschungel vs wald)
L"Urban",
L"Desert",
- L"Snow", // NOT USED!!!
+ L"Snow",
L"Wood and Desert",
- L"" // yes empty for now
+ L"Wood and Desert",
+ L"Wood and Urban",
+ L"Wood and Snow",
+ L"Desert and Urban",
+ L"Desert and Snow",
+ L"Urban and Snow",
+ L"-" // yes empty for now
};
diff --git a/Utils/_Ja25TaiwaneseText.h b/Utils/_Ja25TaiwaneseText.h
index 84889539..125d17bf 100644
--- a/Utils/_Ja25TaiwaneseText.h
+++ b/Utils/_Ja25TaiwaneseText.h
@@ -57,6 +57,7 @@ enum
{
DC_MSG__COVER_INFORMATION,
DC_MSG__GUN_RANGE_INFORMATION,
+ DC_MSG__NCTH_GUN_RANGE_INFORMATION,
DC_MSG__COVER_DRAW_OFF,
DC_MSG__COVER_DRAW_MERC_VIEW,
DC_MSG__COVER_DRAW_ENEMY_VIEW,
@@ -65,6 +66,11 @@ enum
DC_TTI__DESERT,
DC_TTI__SNOW,
DC_TTI__WOOD_AND_DESERT,
+ DC_TTI__WOOD_AND_URBAN,
+ DC_TTI__WOOD_AND_SNOW,
+ DC_TTI__DESERT_AND_URBAN,
+ DC_TTI__DESERT_AND_SNOW,
+ DC_TTI__URBAN_AND_SNOW,
DC_TTI__UNKNOWN
};
extern STR16 gzDisplayCoverText[];