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
This commit is contained in:
Wanne
2014-03-01 09:50:40 +00:00
parent 3ae95a6c20
commit d2130494da
39 changed files with 780 additions and 48 deletions
+2
View File
@@ -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
+51
View File
@@ -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;
+21 -2
View File
@@ -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 )
{
+15 -2
View File
@@ -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++;
+45 -2
View File
@@ -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 );
+1 -1
View File
@@ -3696,7 +3696,7 @@ giOldTilesetUsed = giCurrentTilesetID;
// RESET TILE DATABASE
DeallocateTileDatabase( );
CreateTileDatabase( );
CreateTileDatabase( iTilesetID );
// SET GLOBAL ID FOR TILESET ( FOR SAVING! )
giCurrentTilesetID = iTilesetID;