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[];