Surfaces – DayZ

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
m (Text replacement - "Category:DayZ:Terrain_Editing" to "{{GameCategory|dayz|Terrain Editing}}")
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:DayZ:Editing|Terrain]]
{{GameCategory|dayz|Terrain Editing}}
[[Category:DayZ:Terrain_Editing|Terrain]]


==Overview==
== Overview ==
Surfaces in DayZ can be divided into '''two types''':
Surfaces in DayZ can be divided into '''two types''':
* '''Terrain surfaces''' - used on terrain.
* '''Terrain surfaces''' - used on terrain.
Line 17: Line 16:
Whenever facing the problem of creating a new surface, consider what default surfaces have to offer as adding a new surface can bring its own challenges.
Whenever facing the problem of creating a new surface, consider what default surfaces have to offer as adding a new surface can bring its own challenges.


==Adding a new surface type==
== Adding a new surface type ==
Both types (terrain and roadway) are based on a texture located somewhere in data. This texture is mapped either on the terrain (through rvmats in layers folder of your terrain) or in a roadway LOD of a model. Once such texture is present and used in data, you can proceed to the game config definition.
Both types (terrain and roadway) are based on a texture located somewhere in data. This texture is mapped either on the terrain (through rvmats in layers folder of your terrain) or in a roadway LOD of a model. Once such texture is present and used in data, you can proceed to the game config definition.


Line 58: Line 57:
     footDamage = 0.117;
     footDamage = 0.117;
     audibility = 1.0;
     audibility = 1.0;
isDigable = 1;
isFertile = 1;


     impact = "Hit_Concrete";
     impact = "Hit_Concrete";
Line 96: Line 97:
* '''footDamage''' - Defines a chance for a character to get a bleeding wound when walking on this surface without shoes.
* '''footDamage''' - Defines a chance for a character to get a bleeding wound when walking on this surface without shoes.
* '''audibility''' - Multiplies a noise created by the player characters or bullet impacts on this surface.
* '''audibility''' - Multiplies a noise created by the player characters or bullet impacts on this surface.
* '''isDigable''' - 1 for allowing to dig in surface (hidden stash, base building objects,..), 0 to disallow digging (hard surfaces).
* '''isFertile''' - 1 for allowing to dig worms and digging farming plots. 0 to disallow.
* '''impact''' - Defines a particle effect created when a bullet hits the surface. Available values are:
* '''impact''' - Defines a particle effect created when a bullet hits the surface. Available values are:
  * "Hit_Plastic"
  * "Hit_Plastic"
Line 119: Line 122:




==Foot steps sounds==
== Foot steps sounds ==


While vehicle sounds definition is handled by the ''soundEnviron'' parameter and as long as you define existing sound controller into ''soundEnviron'', correct sounds of wheels on a surface will be played.
While vehicle sounds definition is handled by the ''soundEnviron'' parameter and as long as you define existing sound controller into ''soundEnviron'', correct sounds of wheels on a surface will be played.
Line 139: Line 142:
##animaltype####movementtype##_##surfacesound##_SoundSet\
##animaltype####movementtype##_##surfacesound##_SoundSet\
};\
};\
}
};
#define ANIMAL_STEP_SOUNDTABLE(animaltype,movementtype)\
#define ANIMAL_STEP_SOUNDTABLE(animaltype,movementtype)\
class ##animaltype####movementtype##_LookupTable\
class ##animaltype####movementtype##_LookupTable\
Line 248: Line 251:
##shadername##_##surfacesound##_Zmb_SoundSet\
##shadername##_##surfacesound##_Zmb_SoundSet\
};\
};\
}
};
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
class ##shadername##_Zmb_LookupTable\
class ##shadername##_Zmb_LookupTable\
Line 288: Line 291:
##movementtype##_##surfacesound##_bare_Zmb_Soundset\
##movementtype##_##surfacesound##_bare_Zmb_Soundset\
};\
};\
}
};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
class ##movementtype##_Bare_Zmb_LookupTable\
class ##movementtype##_Bare_Zmb_LookupTable\
Line 368: Line 371:
##movementtype##_##surfacesound##_boots_Zmb_Soundset\
##movementtype##_##surfacesound##_boots_Zmb_Soundset\
};\
};\
}
};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
class ##movementtype##_Boots_Zmb_LookupTable\
class ##movementtype##_Boots_Zmb_LookupTable\
Line 448: Line 451:
##movementtype##_##surfacesound##_sneakers_Zmb_Soundset\
##movementtype##_##surfacesound##_sneakers_Zmb_Soundset\
};\
};\
}
};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
class ##movementtype##_Sneakers_Zmb_LookupTable\
class ##movementtype##_Sneakers_Zmb_LookupTable\
Line 528: Line 531:
##movementtype##_##surfacesound##_Zmb_Soundset\
##movementtype##_##surfacesound##_Zmb_Soundset\
};\
};\
}
};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
class ##movementtype##_Zmb_LookupTable\
class ##movementtype##_Zmb_LookupTable\
Line 573: Line 576:
##movementtype##_##surfacesound##_Char_Soundset\
##movementtype##_##surfacesound##_Char_Soundset\
};\
};\
}
};
#define CHAR_STEP_LOOKUPTABLE(movementtype)\
#define CHAR_STEP_LOOKUPTABLE(movementtype)\
class ##movementtype##_Char_LookupTable\
class ##movementtype##_Char_LookupTable\
Line 626: Line 629:
##movementtype##_##surfacesound##_Char_Soundset\
##movementtype##_##surfacesound##_Char_Soundset\
};\
};\
}
};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
class ##movementtype##_Char_LookupTable\
class ##movementtype##_Char_LookupTable\
Line 670: Line 673:
##movementtype##_noHS_##surfacesound##_Char_Soundset\
##movementtype##_noHS_##surfacesound##_Char_Soundset\
};\
};\
}
};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
class ##movementtype##_noHS_Char_LookupTable\
class ##movementtype##_noHS_Char_LookupTable\
Line 704: Line 707:
Handstep_##surfacesound##_Char_SoundSet\
Handstep_##surfacesound##_Char_SoundSet\
};\
};\
}
};
#define CHAR_HANDSTEP_LOOKUPTABLE\
#define CHAR_HANDSTEP_LOOKUPTABLE\
class handstepSound_Char_LookupTable\
class handstepSound_Char_LookupTable\
Line 749: Line 752:
Handstep_Hard_##surfacesound##_Char_SoundSet\
Handstep_Hard_##surfacesound##_Char_SoundSet\
};\
};\
}
};
#define CHAR_HANDSTEP_LOOKUPTABLE\
#define CHAR_HANDSTEP_LOOKUPTABLE\
class handstepSound_Hard_Char_LookupTable\
class handstepSound_Hard_Char_LookupTable\
Line 794: Line 797:
Handsstep_##surfacesound##_Char_SoundSet\
Handsstep_##surfacesound##_Char_SoundSet\
};\
};\
}
};
#define CHAR_HANDSTEP_LOOKUPTABLE\
#define CHAR_HANDSTEP_LOOKUPTABLE\
class handsstepSound_Char_LookupTable\
class handsstepSound_Char_LookupTable\
Line 839: Line 842:
##shadername##_##surfacesound##_Char_SoundSet\
##shadername##_##surfacesound##_Char_SoundSet\
};\
};\
}
};
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
class ##shadername##Sound_Char_LookupTable\
class ##shadername##Sound_Char_LookupTable\
Line 881: Line 884:
step_ladder_Char_Soundset\
step_ladder_Char_Soundset\
};\
};\
}
};
#define CHAR_HANDSTEP_LOOKUPTABLE\
#define CHAR_HANDSTEP_LOOKUPTABLE\
class step_ladder_Char_LookupTable\
class step_ladder_Char_LookupTable\
Line 926: Line 929:
step_ladder_run_Char_Soundset\
step_ladder_run_Char_Soundset\
};\
};\
}
};
#define CHAR_HANDSTEP_LOOKUPTABLE\
#define CHAR_HANDSTEP_LOOKUPTABLE\
class step_ladder_run_Char_LookupTable\
class step_ladder_run_Char_LookupTable\
Line 982: Line 985:




==Vehicle surfaces==
== Vehicle surfaces ==
As mentioned in the beginning, surface information for vehicles can be linked using vpSurface parameter in CfgSurfaces entry. By default, we have "Asphalt", "Dirt", "Grass", "Forest" and "Gravel". Available surfaces are listed from the best to the worst in terms of driving quality.
As mentioned in the beginning, surface information for vehicles can be linked using vpSurface parameter in CfgSurfaces entry. By default, we have "Asphalt", "Dirt", "Grass", "Forest" and "Gravel". Available surfaces are listed from the best to the worst in terms of driving quality.


TBD
TBD


==Tips and tricks==
== Tips and tricks ==
* Roadway faces normally flatten the grass-clutter. In some specific cases you may want to have a grass-clutter generated. This can be done by adding ''DZ\data\data\surfaces\clutter.rvmat'' material to selected roadway faces.
* Roadway faces normally flatten the grass-clutter. In some specific cases you may want to have a grass-clutter generated. This can be done by adding ''DZ\data\data\surfaces\clutter.rvmat'' material to selected roadway faces.


==Sample==
== Sample ==
You can take a look at [[DayZ:Terrain sample]] to see an example of the implementation of brand new terrain surface (''utes_concrete'').
You can take a look at [[DayZ:Terrain sample]] to see an example of the implementation of brand new terrain surface (''utes_concrete'').

Latest revision as of 00:18, 25 April 2023


Overview

Surfaces in DayZ can be divided into two types:

  • Terrain surfaces - used on terrain.
  • Roadway surfaces - used in roadway LOD of individual models.

Surface definitions are used for a number of things within the game such as:

  • Physics (vehicle simulation params)
  • Sounds (bullet impacts, foot steps, interior gun echoes, car wheels,..)
  • Visuals (bullet impacts, grass-clutter definition)
  • Gameplay (medical system, definition of exterior/interior, water flag and definition of liquid type)

Default surfaces in the game are located at dz\surfaces (addons\surfaces.pbo). This folder contains game configuration (definitions) along with actual texture data used by the terrain or roadway faces.

Whenever facing the problem of creating a new surface, consider what default surfaces have to offer as adding a new surface can bring its own challenges.

Adding a new surface type

Both types (terrain and roadway) are based on a texture located somewhere in data. This texture is mapped either on the terrain (through rvmats in layers folder of your terrain) or in a roadway LOD of a model. Once such texture is present and used in data, you can proceed to the game config definition.

To make things a bit easier in the game config, I recommend you to set a dependency on already mentioned DZ_Surfaces addon in CfgPatches and use DZ_SurfacesInt / DZ_SurfacesExt base classes. Please keep in mind that interior and exterior does not mean roadway and terrain, both surface types can be interior or exterior, all depends on how you define it in the game config.

It is also recommended to look at the values of the default surfaces in DZ_Surfaces addon to get an idea how your custom surface values should look like.

class CfgPatches
{
  class yourcustomsurfaces
  {
    units[] = {};
    weapons[] = {};
    requiredVersion = 0.1;
    requiredAddons[] = {"DZ_Surfaces"};
    author = "yourname";
    name = "addonname";
    url = "websitelink";
  };
};
class CfgSurfaces
{
  class DZ_SurfacesInt; // for interior surface
  class DZ_SurfacesExt; // for exterior surface

  class yoursurfacename: DZ_SurfacesExt
  {
    files = "actualtexturename*";

    friction = 0.98;
    restitution = 0.55;
    vpSurface = "Asphalt";

    soundEnviron = "road";
    soundHit = "hard_ground";

    character = "cp_concrete_grass";

    footDamage = 0.117;
    audibility = 1.0;
	isDigable = 1;
	isFertile = 1;

    impact = "Hit_Concrete";
    deflection = 0.1;
  };
};

And as usual, an explanation of all relevant parameters:

  • files - Actual link between this surface definition and texture filename. Supports * and thus name does not have to be complete (in case of handling multiple textures by one surface definition). If linked texture is used on the terrain, its considered as a terrain surface, otherwise its roadway surface.
  • friction - Coefficient of friction.
  • restitution - Coefficient of restitution is related to the amount of the original kinetic energy that is "restored" to the object(s) after collision (see https://www.youtube.com/watch?v=fn_xanuLJiE for more info).
  • vpSurface - Defines parameters for vehicle simulation. Available values are:
* "Asphalt"
* "Dirt"
* "Grass"
* "Forest"
* "Gravel"
* Take a look into Vehicle surfaces section of this page to get more info on how to configure new types of vehicle surfaces.
  • soundEnviron - Defines a sound controller that is going to be used on this surface type (only applies to vehicles in DayZ). Available values are:
* "road"
* "rock"
* "dirt" 
* "grass"
  • soundHit - Defines a sound effect played when bullet hits the surface.
* "hard_ground"
* "soft_ground"
* "metal"
* "metal_plate"
* "glass"
* "glass_armored"
* "wood"
* "plastic"
* "concrete"
* "tyre"
* "water"
  • character - Defines a CfgSurfaceCharacters class for a grass-clutter definition (only works on terrain surfaces).
  • footDamage - Defines a chance for a character to get a bleeding wound when walking on this surface without shoes.
  • audibility - Multiplies a noise created by the player characters or bullet impacts on this surface.
  • isDigable - 1 for allowing to dig in surface (hidden stash, base building objects,..), 0 to disallow digging (hard surfaces).
  • isFertile - 1 for allowing to dig worms and digging farming plots. 0 to disallow.
  • impact - Defines a particle effect created when a bullet hits the surface. Available values are:
* "Hit_Plastic"
* "Hit_Sand"
* "Hit_Textile"
* "Hit_Concrete"
* "Hit_Gravel"
* "Hit_Dirt"
* "Hit_Foliage"
* "Hit_Grass"
* "Hit_Wood"
* "Hit_Metal"
* "Hit_Glass"
* "Hit_Water"
* "Hit_Rubber"
* "Hit_Plaster"
* "Hit_MeatBones"
* Look into Scripts\3_Game\ImpactEffects.c to get an idea how impact effects are defined.
  • deflection - Multiplier of a bullet deflecting value.

Additionally, CfgSurfaces entry can also contain following:

  • isLiquid - Defines if this surface should be considered as water by the game (1) or not (0).
  • liquidType - If isLiquid is set to 1, then this parameter is required. Contains type value from the cfgLiquidDefinitions config class. Take a look into dz\data\config.cpp to get an idea of all available liquid types in the game (use the number from type).


Foot steps sounds

While vehicle sounds definition is handled by the soundEnviron parameter and as long as you define existing sound controller into soundEnviron, correct sounds of wheels on a surface will be played.

Character and ai surface-related sounds have to be handled differently though. Any new surface types has to be mentioned within the game config class CfgSoundTables > CfgStepSoundTables. Due to the complexity of this config, it is recommended to use config macros, which will be executed during binarization and will generate all the necessary entries for your newly added surface.

Take a look on the following example to get an idea how to create a sound table for animal, character and infected. There are 3 individual code-blocks (animals, infected and character) that ideally should be put into separate include files (hpp extension) and then 1 code-block, which contains the part of the config that should be used within your config.cpp (note the paths for include have to be correct otherwise binarization wont be able to process your config).


animals.hpp

//  macros for generating sound lookup tables
#define ANIMAL_STEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##animaltype####movementtype##stepSound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								 ##animaltype####movementtype##_##surfacesound##_SoundSet\
							};\
						};
#define ANIMAL_STEP_SOUNDTABLE(animaltype,movementtype)\
			class ##animaltype####movementtype##_LookupTable\
			{\
				ANIMAL_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
  * Road
  * Forest
  * Concrete
  * Dirt
  * Grass
  * Grass_dry
  * Sand
  * Gravel
  * Metal
  * Wood
  * Water
*/

// create lookup tables from macros above
ANIMAL_STEP_SOUNDTABLE(Bird,Walk)
ANIMAL_STEP_SOUNDTABLE(Bird,Grazing)
ANIMAL_STEP_SOUNDTABLE(Bird,Bodyfall)

ANIMAL_STEP_SOUNDTABLE(HoofMedium,Walk)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Run)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Grazing)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Bodyfall)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Settle)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Rest2standA)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Rest2standB)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Stand2restA)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Stand2restB)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Stand2restC)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Rub1)
ANIMAL_STEP_SOUNDTABLE(HoofMedium,Rub2)

ANIMAL_STEP_SOUNDTABLE(HoofSmall,Walk)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Run)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Grazing)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,GrazingHard)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,GrazingLeave)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Bodyfall)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Settle)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Rest2standA)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Rest2standB)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Stand2restA)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Stand2restB)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Stand2restC)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Rub1)
ANIMAL_STEP_SOUNDTABLE(HoofSmall,Rub2)

ANIMAL_STEP_SOUNDTABLE(PawBig,Walk)
ANIMAL_STEP_SOUNDTABLE(PawBig,Run)
ANIMAL_STEP_SOUNDTABLE(PawBig,Grazing)
ANIMAL_STEP_SOUNDTABLE(PawBig,Bodyfall)
ANIMAL_STEP_SOUNDTABLE(PawBig,Settle)
ANIMAL_STEP_SOUNDTABLE(PawBig,Rest2standA)
ANIMAL_STEP_SOUNDTABLE(PawBig,Rest2standB)
ANIMAL_STEP_SOUNDTABLE(PawBig,Stand2restA)
ANIMAL_STEP_SOUNDTABLE(PawBig,Stand2restB)
ANIMAL_STEP_SOUNDTABLE(PawBig,Stand2restC)
ANIMAL_STEP_SOUNDTABLE(PawBig,Jump)
ANIMAL_STEP_SOUNDTABLE(PawBig,Impact)

ANIMAL_STEP_SOUNDTABLE(PawMedium,Walk)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Run)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Grazing)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Bodyfall)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Settle)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Rest2standA)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Rest2standB)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Stand2restA)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Stand2restB)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Stand2restC)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Jump)
ANIMAL_STEP_SOUNDTABLE(PawMedium,Impact)

ANIMAL_STEP_SOUNDTABLE(PawSmall,Walk)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Run)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Grazing)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Bodyfall)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Settle)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Rest2standA)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Rest2standB)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Stand2restA)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Stand2restB)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Stand2restC)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Jump)
ANIMAL_STEP_SOUNDTABLE(PawSmall,Impact)


infected.hpp

//  macros for generating sound lookup tables
#define CHAR_BODYFALL_ZMB_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##shadername##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##shadername##_##surfacesound##_Zmb_SoundSet\
							};\
						};
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
			class ##shadername##_Zmb_LookupTable\
			{\
				CHAR_BODYFALL_ZMB_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * forestBroadleaf
 * grass
 * dirt_ext, dirt_int
 * gravelSmall_ext, gravelSmall_int
 * gravelLarge_ext, gravelLarge_int
 * linoleum_ext, linoleum_int
 * metal_ext, metal_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * asphalt_ext, asphalt_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
*/

// create lookup tables from macros above
CHAR_BODYFALL_LOOKUPTABLE(bodyfall)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_hand)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_slide)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_bare_Zmb_Soundset\
							};\
						};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Bare_Zmb_LookupTable\
			{\
        ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc)
ZMB_STEP_LOOKUPTABLE(runErc)
ZMB_STEP_LOOKUPTABLE(sprintErc)
ZMB_STEP_LOOKUPTABLE(landFeetErc)
ZMB_STEP_LOOKUPTABLE(scuffErc)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOKUPTABLE(movementtype,targetmovement)\
			class ##targetmovement##_Bare_Zmb_LookupTable\
			{\
				ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc,walkRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,runRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,landFootErc)
ZMB_STEP_LOOKUPTABLE(walkErc,walkCro)
ZMB_STEP_LOOKUPTABLE(runErc,runCro)
ZMB_STEP_LOOKUPTABLE(runErc,jumpErc)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_boots_Zmb_Soundset\
							};\
						};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Boots_Zmb_LookupTable\
			{\
				ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc)
ZMB_STEP_LOOKUPTABLE(runErc)
ZMB_STEP_LOOKUPTABLE(sprintErc)
ZMB_STEP_LOOKUPTABLE(landFeetErc)
ZMB_STEP_LOOKUPTABLE(scuffErc)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOKUPTABLE(movementtype,targetmovement)\
			class ##targetmovement##_Boots_Zmb_LookupTable\
			{\
				ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc,walkRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,runRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,landFootErc)
ZMB_STEP_LOOKUPTABLE(walkErc,walkCro)
ZMB_STEP_LOOKUPTABLE(runErc,runCro)
ZMB_STEP_LOOKUPTABLE(runErc,jumpErc)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_sneakers_Zmb_Soundset\
							};\
						};
#define ZMB_STEP_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Sneakers_Zmb_LookupTable\
			{\
				ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc)
ZMB_STEP_LOOKUPTABLE(runErc)
ZMB_STEP_LOOKUPTABLE(sprintErc)
ZMB_STEP_LOOKUPTABLE(landFeetErc)
ZMB_STEP_LOOKUPTABLE(scuffErc)

//  macros for generating sound lookup tables
#define ZMB_STEP_LOOKUPTABLE(movementtype,targetmovement)\
			class ##targetmovement##_Sneakers_Zmb_LookupTable\
			{\
				ZMB_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
ZMB_STEP_LOOKUPTABLE(walkErc,walkRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,runRasErc)
ZMB_STEP_LOOKUPTABLE(runErc,landFootErc)
ZMB_STEP_LOOKUPTABLE(walkErc,walkCro)
ZMB_STEP_LOOKUPTABLE(runErc,runCro)
ZMB_STEP_LOOKUPTABLE(runErc,jumpErc)

//  macros for generating sound lookup tables
#define CHAR_STEP_PRONE_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_Zmb_Soundset\
							};\
						};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Zmb_LookupTable\
			{\
				CHAR_STEP_PRONE_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
*/

// create lookup tables from macros above
CHAR_STEP_PRONE_LOOKUPTABLE(walkProne)
CHAR_STEP_PRONE_LOOKUPTABLE(runProne)


character.hpp

//  macros for generating sound lookup tables
#define CHAR_STEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_Char_Soundset\
							};\
						};
#define CHAR_STEP_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Char_LookupTable\
			{\
				CHAR_STEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_ext, metal_thin_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * gravel_small_ext, gravel_small_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
 * water
*/

// create lookup tables from macros above
CHAR_STEP_LOOKUPTABLE(walkErc)
CHAR_STEP_LOOKUPTABLE(walkRasErc)
CHAR_STEP_LOOKUPTABLE(runErc)
CHAR_STEP_LOOKUPTABLE(runRasErc)
CHAR_STEP_LOOKUPTABLE(sprintErc)
CHAR_STEP_LOOKUPTABLE(landFootErc)
CHAR_STEP_LOOKUPTABLE(landFeetErc)
CHAR_STEP_LOOKUPTABLE(scuffErc)
CHAR_STEP_LOOKUPTABLE(walkCro)
CHAR_STEP_LOOKUPTABLE(runCro)
CHAR_STEP_LOOKUPTABLE(jumpErc)

//  macros for generating sound lookup tables
#define CHAR_STEP_PRONE_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_##surfacesound##_Char_Soundset\
							};\
						};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
			class ##movementtype##_Char_LookupTable\
			{\
				CHAR_STEP_PRONE_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_felt_ext, asphalt_felt_int
 * cp_broadleaf_dense1
 * cp_grass_tall
 * concrete_ext, concrete_int
 * ceramic_tiles_ext, ceramic_tiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext, grass_dry_int
 * gravel_small_ext, gravel_small_int
 * metal_thick_ext, metal_thick_int
 * metal_thin_ext, metal_thin_int
 * metal_thin_mesh_ext, metal_thin_mesh_int
 * gravel_small_ext, gravel_small_int
 * sand_ext, sand_int
 * textile_carpet_ext, textile_carpet_int
 * wood_parquet_ext, wood_parquet_int
 * wood_planks_ext, wood_planks_int
 * water
*/

// create lookup tables from macros above
CHAR_STEP_PRONE_LOOKUPTABLE(walkProne)
CHAR_STEP_PRONE_LOOKUPTABLE(runProne)

//  macros for generating sound lookup tables
#define CHAR_STEP_PRONE_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##movementtype##_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##movementtype##_noHS_##surfacesound##_Char_Soundset\
							};\
						};
#define CHAR_STEP_PRONE_LOOKUPTABLE(movementtype)\
			class ##movementtype##_noHS_Char_LookupTable\
			{\
				CHAR_STEP_PRONE_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext
 * cp_broadleaf_dense1
 * dirt_ext
 * grass_dry_ext
 * gravel_small_ext
 * gravel_large_ext
 * wood_planks_ext
 * water
*/

// create lookup tables from macros above
CHAR_STEP_PRONE_LOOKUPTABLE(walkProne)
CHAR_STEP_PRONE_LOOKUPTABLE(walkProneLong)

//  macros for generating sound lookup tables
#define CHAR_HANDSTEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class handstepSound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								Handstep_##surfacesound##_Char_SoundSet\
							};\
						};
#define CHAR_HANDSTEP_LOOKUPTABLE\
			class handstepSound_Char_LookupTable\
			{\
				CHAR_HANDSTEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_destroyed_ext, asphalt_destroyed_int
 * cp_broadleaf_dense1
 * forestConifer
 * grass_dry_ext
 * grassTall
 * ceramicTiles_ext, ceramicTiles_int
 * dirt_ext, dirt_int
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metalThick_ext
 * metal_ext, metal_int
 * metalThin_ext, metalThin_int
 * metalThinMesh_ext, metalThinMesh_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * carpet_ext, carpet_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
 * water
*/

// create lookup tables from macros above
CHAR_HANDSTEP_LOOKUPTABLE

//  macros for generating sound lookup tables
#define CHAR_HANDSTEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class handstepSound_Hard_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								Handstep_Hard_##surfacesound##_Char_SoundSet\
							};\
						};
#define CHAR_HANDSTEP_LOOKUPTABLE\
			class handstepSound_Hard_Char_LookupTable\
			{\
				CHAR_HANDSTEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_destroyed_ext, asphalt_destroyed_int
 * cp_broadleaf_dense1
 * forestConifer
 * grass_dry_ext
 * grassTall
 * ceramicTiles_ext, ceramicTiles_int
 * dirt_ext, dirt_int
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metalThick_ext
 * metal_ext, metal_int
 * metalThin_ext, metalThin_int
 * metalThinMesh_ext, metalThinMesh_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * carpet_ext, carpet_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
 * water
*/

// create lookup tables from macros above
CHAR_HANDSTEP_LOOKUPTABLE

//  macros for generating sound lookup tables
#define CHAR_HANDSTEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class handsstepSound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								Handsstep_##surfacesound##_Char_SoundSet\
							};\
						};
#define CHAR_HANDSTEP_LOOKUPTABLE\
			class handsstepSound_Char_LookupTable\
			{\
				CHAR_HANDSTEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_destroyed_ext, asphalt_destroyed_int
 * cp_broadleaf_dense1
 * forestConifer
 * grass_dry_ext
 * grassTall
 * ceramicTiles_ext, ceramicTiles_int
 * dirt_ext, dirt_int
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metalThick_ext
 * metal_ext, metal_int
 * metalThin_ext, metalThin_int
 * metalThinMesh_ext, metalThinMesh_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * carpet_ext, carpet_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
 * water
*/

// create lookup tables from macros above
CHAR_HANDSTEP_LOOKUPTABLE

//  macros for generating sound lookup tables
#define CHAR_BODYFALL_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class ##shadername##Sound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								##shadername##_##surfacesound##_Char_SoundSet\
							};\
						};
#define CHAR_BODYFALL_LOOKUPTABLE(shadername)\
			class ##shadername##Sound_Char_LookupTable\
			{\
				CHAR_BODYFALL_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * forestBroadleaf
 * dirt_ext, dirt_int
 * grass
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metal_ext, metal_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
*/

// create lookup tables from macros above
CHAR_BODYFALL_LOOKUPTABLE(bodyfall)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_hand)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_roll)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_rollHard)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_slide)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_slide_light)
CHAR_BODYFALL_LOOKUPTABLE(bodyfall_hand_light)

//  macros for generating sound lookup tables
#define CHAR_HANDSTEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class handstepSound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								step_ladder_Char_Soundset\
							};\
						};
#define CHAR_HANDSTEP_LOOKUPTABLE\
			class step_ladder_Char_LookupTable\
			{\
				CHAR_HANDSTEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_destroyed_ext, asphalt_destroyed_int
 * cp_broadleaf_dense1
 * forestConifer
 * ceramicTiles_ext, ceramicTiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext
 * grassTall
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metalThick_ext
 * metal_ext, metal_int
 * metalThin_ext, metalThin_int
 * metalThinMesh_ext, metalThinMesh_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * carpet_ext, carpet_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
 * water
*/

// create lookup tables from macros above
CHAR_HANDSTEP_LOOKUPTABLE

//  macros for generating sound lookup tables
#define CHAR_HANDSTEP_LOOUPTABLE_CLASS(roadwayname,surfacesound)\
						class handstepSound_##roadwayname##\
						{\
							surface = ##roadwayname##;\
					        soundSets[] =\
							{\
								step_ladder_run_Char_Soundset\
							};\
						};
#define CHAR_HANDSTEP_LOOKUPTABLE\
			class step_ladder_run_Char_LookupTable\
			{\
				CHAR_HANDSTEP_LOOUPTABLE_CLASS(yoursurfacename, surfacetype)\
			};

/*
for macro above, do following:
 change yoursurfacename so it is the same as CfgSurfaces class name
 change surfacetype to one of the surface types listed below
 * asphalt_ext, asphalt_int
 * asphalt_destroyed_ext, asphalt_destroyed_int
 * cp_broadleaf_dense1
 * forestConifer
 * ceramicTiles_ext, ceramicTiles_int
 * dirt_ext, dirt_int
 * grass_dry_ext
 * grassTall
 * gravelSmall_ext, gravelSmall_int
 * linoleum_ext, linoleum_int
 * metalThick_ext
 * metal_ext, metal_int
 * metalThin_ext, metalThin_int
 * metalThinMesh_ext, metalThinMesh_int
 * rubbleLarge_ext, rubbleLarge_int
 * sand_ext, sand_int
 * carpet_ext, carpet_int
 * woodParquet_ext, woodParquet_int
 * woodPlanks_ext, woodPlanks_int
 * water
*/

// create lookup tables from macros above
CHAR_HANDSTEP_LOOKUPTABLE


config.cpp

/* can be part of the same config.cpp file as CfgSurfaces */

class CfgSoundTables
{
	class CfgStepSoundTables
	{
		#include "path\to\animals.hpp"
		#include "path\to\infected.hpp"
		#include "path\to\character.hpp"
	};
};

Please keep in mind that in order to get sounds of steps working correctly on your surface for all the cases, all the hpp needs to be modified (animals, infected and character). You can of course add any number of new surfaces, but keep in mind that each line in macro with yoursurfacename represents one surface and more needs to be added into the macro in case of more than one surface being added.


Vehicle surfaces

As mentioned in the beginning, surface information for vehicles can be linked using vpSurface parameter in CfgSurfaces entry. By default, we have "Asphalt", "Dirt", "Grass", "Forest" and "Gravel". Available surfaces are listed from the best to the worst in terms of driving quality.

TBD

Tips and tricks

  • Roadway faces normally flatten the grass-clutter. In some specific cases you may want to have a grass-clutter generated. This can be done by adding DZ\data\data\surfaces\clutter.rvmat material to selected roadway faces.

Sample

You can take a look at DayZ:Terrain sample to see an example of the implementation of brand new terrain surface (utes_concrete).