A crude attempt at doing footsteps per surface. This particular try is keyed on sector tags. It would be better probably to key on floor flat name.
The main difficulty I found was to change the frequency of the stepping as the player speed changed.
I added suitable sound lumps and a corresponding SNDINFO:
FS_METAL FS_METAL FS_WOOD FS_WOOD FS_CONCR FS_CONCR FS_MUD FS_MUD FS_WTR FS_WTR
And a fairly crude script that maps sector tags with a sound to play. The stub of the frequency routine is there too, but needs expanding to account for different player speeds, and possibly a starting and stopping pattern.
#include "zcommon.acs" int footstepTypesCount = 6; int footstepTypesDef[6][2] = {{0,""},{1,"FS_WTR"},{2,"FS_MUD"},{3,"FS_CONCR"},{4,"FS_WOOD"},{5,"FS_METAL"}}; script 1 ENTER{ Thing_ChangeTID(0, 1000 + PlayerNumber()); ACS_Execute(2,0,0,0,0); } /* detect footsteps: also, see https://zdoom.org/wiki/GetActorVelY */ script 2 (void){ int _delay = 15; while(TRUE){ int x = GetActorVelX(0); int y = GetActorVelY(0); int z = GetActorVelZ(0); int speed = FixedSqrt(FixedMul(x, x) + FixedMul(y, y) + FixedMul(z, z)); str _footstep = ""; _footstep = isInFootstepSector(); if(_footstep){ if(speed > 3){ PlaySound(1000,_footstep); } } delay(_delay); } } /* return whether player is in marked sector */ function str isInFootstepSector(void){ if(getActorVelX(0) || getActorVelY(0) || getActorVelZ(0)){ for(int a=0; a < footstepTypesCount; a++){ if(ThingCountSector (T_NONE, 1000, footstepTypesDef[a][0])){ return(footstepTypesDef[a][1]); } } } return(FALSE); }