74755a5a3a
imo; the ss13 audio-scape is quite barren, you can only hear most things if you can see them, which in my opinion doesn't make much sense. This changes that so you can hear further away, but falloff is much higher, so in reality you will only hear things relatively quietly when they're out of sight. This PR increases the hearing distance of most sound by 9, excluding sounds such as antag items that are meant to be used stealthily This PR also replaces Byond's inbuilt falloff system with something I made, (And thanks to potato for helping me throw together a formula for it). This fall-off system makes sound fall off more naturally, with sounds being full volume within a certain range, and then softly falling off until they are completely quiet. This makes for a smoother transition between "This sound is full volume" and "I dont hear this sound". Co-authored-by: ff <ff>
118 lines
4.1 KiB
Plaintext
118 lines
4.1 KiB
Plaintext
///Footstep component. Plays footsteps at parents location when it is appropriate.
|
|
/datum/component/footstep
|
|
///How many steps the parent has taken since the last time a footstep was played.
|
|
var/steps = 0
|
|
///volume determines the extra volume of the footstep. This is multiplied by the base volume, should there be one.
|
|
var/volume
|
|
///e_range stands for extra range - aka how far the sound can be heard. This is added to the base value and ignored if there isn't a base value.
|
|
var/e_range
|
|
///footstep_type is a define which determines what kind of sounds should get chosen.
|
|
var/footstep_type
|
|
///This can be a list OR a soundfile OR null. Determines whatever sound gets played.
|
|
var/footstep_sounds
|
|
|
|
/datum/component/footstep/Initialize(footstep_type_ = FOOTSTEP_MOB_BAREFOOT, volume_ = 0.5, e_range_ = -8)
|
|
if(!isliving(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
volume = volume_
|
|
e_range = e_range_
|
|
footstep_type = footstep_type_
|
|
switch(footstep_type)
|
|
if(FOOTSTEP_MOB_HUMAN)
|
|
if(!ishuman(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_humanstep)
|
|
return
|
|
if(FOOTSTEP_MOB_CLAW)
|
|
footstep_sounds = GLOB.clawfootstep
|
|
if(FOOTSTEP_MOB_BAREFOOT)
|
|
footstep_sounds = GLOB.barefootstep
|
|
if(FOOTSTEP_MOB_HEAVY)
|
|
footstep_sounds = GLOB.heavyfootstep
|
|
if(FOOTSTEP_MOB_SHOE)
|
|
footstep_sounds = GLOB.footstep
|
|
if(FOOTSTEP_MOB_SLIME)
|
|
footstep_sounds = 'sound/effects/footstep/slime1.ogg'
|
|
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep) //Note that this doesn't get called for humans.
|
|
|
|
///Prepares a footstep. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open
|
|
/datum/component/footstep/proc/prepare_step()
|
|
var/turf/open/T = get_turf(parent)
|
|
if(!istype(T))
|
|
return
|
|
|
|
var/mob/living/LM = parent
|
|
|
|
if(!T.footstep || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(LM, TRAIT_IMMOBILIZED))
|
|
return
|
|
|
|
if(LM.body_position == LYING_DOWN) //play crawling sound if we're lying
|
|
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1)
|
|
return
|
|
|
|
if(iscarbon(LM))
|
|
var/mob/living/carbon/C = LM
|
|
if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG))
|
|
return
|
|
if(C.m_intent == MOVE_INTENT_WALK)
|
|
return// stealth
|
|
steps++
|
|
|
|
if(steps >= 6)
|
|
steps = 0
|
|
|
|
if(steps % 2)
|
|
return
|
|
|
|
if(steps != 0 && !LM.has_gravity(T)) // don't need to step as often when you hop around
|
|
return
|
|
return T
|
|
|
|
/datum/component/footstep/proc/play_simplestep()
|
|
SIGNAL_HANDLER
|
|
|
|
var/turf/open/T = prepare_step()
|
|
if(!T)
|
|
return
|
|
if(isfile(footstep_sounds) || istext(footstep_sounds))
|
|
playsound(T, footstep_sounds, volume, falloff_distance = 1)
|
|
return
|
|
var/turf_footstep
|
|
switch(footstep_type)
|
|
if(FOOTSTEP_MOB_CLAW)
|
|
turf_footstep = T.clawfootstep
|
|
if(FOOTSTEP_MOB_BAREFOOT)
|
|
turf_footstep = T.barefootstep
|
|
if(FOOTSTEP_MOB_HEAVY)
|
|
turf_footstep = T.heavyfootstep
|
|
if(FOOTSTEP_MOB_SHOE)
|
|
turf_footstep = T.footstep
|
|
if(!turf_footstep)
|
|
return
|
|
playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1)
|
|
|
|
/datum/component/footstep/proc/play_humanstep()
|
|
SIGNAL_HANDLER
|
|
|
|
if(HAS_TRAIT(parent, TRAIT_SILENT_FOOTSTEPS))
|
|
return
|
|
var/turf/open/T = prepare_step()
|
|
if(!T)
|
|
return
|
|
var/mob/living/carbon/human/H = parent
|
|
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
|
|
|
|
if(H.shoes || feetCover) //are we wearing shoes
|
|
playsound(T, pick(GLOB.footstep[T.footstep][1]),
|
|
GLOB.footstep[T.footstep][2] * volume,
|
|
TRUE,
|
|
GLOB.footstep[T.footstep][3] + e_range, falloff_distance = 1)
|
|
else
|
|
if(H.dna.species.special_step_sounds)
|
|
playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1)
|
|
else
|
|
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
|
|
GLOB.barefootstep[T.barefootstep][2] * volume,
|
|
TRUE,
|
|
GLOB.barefootstep[T.barefootstep][3] + e_range, falloff_distance = 1)
|