From d2130494da7df8c9e58b91ab187aa1b9e71ce3a5 Mon Sep 17 00:00:00 2001 From: Wanne Date: Sat, 1 Mar 2014 09:50:40 +0000 Subject: [PATCH] New Feature: Additional Tile Properties (by anv) - Feature can be completely disabled in .ini as COVER_SYSTEM_ADDITIONAL_TILE_PROPERTIES under Tactical Cover System Settings. - With Additional Tile Properties it's possible to supply all tiles with additional data, just like with .jsd files, except in XML. Files need to have same name as tile's .sti and .jsd files, and be put in \tilesets\AdditionalProperties\, or in specific \tilesets\xx\. - With additional properties it's possible to specify which camo type, and how effectively will work on any tile. Only snow camo will work on snow covered roofs, red carpet in palace won't perfectly cooperate with urban camo anymore, thick grass in the middle of the forest will provide better camouflage than sparse grass near the road. - It's now possible to specify footstep volume and stealth difficulty modifier of any tile. Carpets will absorb noise, tile floors amplify it, twigs laying on the tile will make sneaking harder. Choose your path carefully, taffer. - More infos: http://www.bears-pit.com/board/ubbthreads.php/topics/330942.html#Post330942 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7001 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 3 + GameSettings.h | 3 + Tactical/DisplayCover.cpp | 99 +++++++++- Tactical/LOS.cpp | 150 ++++++++++++++- Tactical/LOS.h | 3 + Tactical/Soldier Control.cpp | 1 + Tactical/Structure Wrap.cpp | 16 +- Tactical/Tactical_VS2005.vcproj | 4 + Tactical/Tactical_VS2008.vcproj | 4 + Tactical/Tactical_VS2010.vcxproj | 1 + Tactical/Tactical_VS2010.vcxproj.filters | 3 + Tactical/Tactical_VS2013.vcxproj | 1 + Tactical/Tactical_VS2013.vcxproj.filters | 3 + Tactical/XML.h | 4 + Tactical/XML_AdditionalTileProperties.cpp | 218 ++++++++++++++++++++++ Tactical/opplist.cpp | 24 ++- TileEngine/Structure Internals.h | 2 + TileEngine/Tile Surface.cpp | 51 +++++ TileEngine/TileDat.cpp | 23 ++- TileEngine/tiledef.cpp | 17 +- TileEngine/tiledef.h | 47 ++++- TileEngine/worlddef.cpp | 2 +- Utils/_Ja25ChineseText.cpp | 9 +- Utils/_Ja25DutchText.cpp | 9 +- Utils/_Ja25DutchText.h | 6 + Utils/_Ja25EnglishText.cpp | 9 +- Utils/_Ja25EnglishText.h | 5 + Utils/_Ja25FrenchText.cpp | 9 +- Utils/_Ja25FrenchText.h | 6 + Utils/_Ja25GermanText.cpp | 9 +- Utils/_Ja25GermanText.h | 6 + Utils/_Ja25ItalianText.cpp | 9 +- Utils/_Ja25ItalianText.h | 6 + Utils/_Ja25PolishText.cpp | 29 +-- Utils/_Ja25PolishText.h | 6 + Utils/_Ja25RussianText.cpp | 9 +- Utils/_Ja25RussianText.h | 6 + Utils/_Ja25TaiwaneseText.cpp | 10 +- Utils/_Ja25TaiwaneseText.h | 6 + 39 files changed, 780 insertions(+), 48 deletions(-) create mode 100644 Tactical/XML_AdditionalTileProperties.cpp 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[];