mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
82 lines
3.2 KiB
Plaintext
82 lines
3.2 KiB
Plaintext
///When attached, the footstep sound played by the footstep element will be replaced by this one's
|
|
/datum/element/footstep_override
|
|
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY
|
|
argument_hash_start_idx = 2
|
|
///The sound played for movables with claw step sound type.
|
|
var/clawfootstep
|
|
///The sound played for movables with barefoot step sound type.
|
|
var/barefootstep
|
|
///The sound played for movables with heavy step sound type.
|
|
var/heavyfootstep
|
|
///The sound played for movables with shoed step sound type.
|
|
var/footstep
|
|
///The priority this element has in relation to other elements of the same type attached to other movables on the same turf.
|
|
var/priority
|
|
/**
|
|
* A list of turfs occupied by the movables this element is attached to.
|
|
* Needed so it stops listening the turf's signals ONLY when it has no movable with the element.
|
|
*/
|
|
var/list/occupied_turfs = list()
|
|
|
|
/datum/element/footstep_override/Attach(atom/movable/target, clawfootstep = FOOTSTEP_HARD_CLAW, barefootstep = FOOTSTEP_HARD_BAREFOOT, heavyfootstep = FOOTSTEP_GENERIC_HEAVY, footstep = FOOTSTEP_FLOOR, priority = STEP_SOUND_NO_PRIORITY)
|
|
. = ..()
|
|
if(!ismovable(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
src.clawfootstep = clawfootstep
|
|
src.barefootstep = barefootstep
|
|
src.heavyfootstep = heavyfootstep
|
|
src.footstep = footstep
|
|
src.priority = priority
|
|
|
|
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
|
|
if(isturf(target.loc))
|
|
occupy_turf(target, target.loc)
|
|
|
|
/datum/element/footstep_override/Detach(atom/movable/source)
|
|
if(isturf(source.loc))
|
|
vacate_turf(source, source.loc)
|
|
return ..()
|
|
|
|
/datum/element/footstep_override/proc/on_moved(atom/movable/source, atom/oldloc)
|
|
SIGNAL_HANDLER
|
|
if(isturf(oldloc))
|
|
vacate_turf(source, oldloc)
|
|
if(isturf(source.loc))
|
|
occupy_turf(source, source.loc)
|
|
|
|
/**
|
|
* Adds the movable to the list of movables with the element occupying the turf.
|
|
* If the turf was not on the list of occupied turfs before, a signal will be registered
|
|
* to it.
|
|
*/
|
|
/datum/element/footstep_override/proc/occupy_turf(atom/movable/movable, turf/location)
|
|
if(occupied_turfs[location])
|
|
occupied_turfs[location] |= movable
|
|
return
|
|
occupied_turfs[location] = list(movable)
|
|
RegisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND, PROC_REF(prepare_steps))
|
|
|
|
/**
|
|
* Removes the movable from the list of movables with the element occupying the turf.
|
|
* If the turf is no longer occupied, it'll be removed from the list, and the signal
|
|
* unregistered from it
|
|
*/
|
|
/datum/element/footstep_override/proc/vacate_turf(atom/movable/movable, turf/location)
|
|
LAZYREMOVE(occupied_turfs[location], movable)
|
|
if(!occupied_turfs[location])
|
|
occupied_turfs -= location
|
|
UnregisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND)
|
|
|
|
///Changes the sound types to be played if the element priority is higher than the one in the steps list.
|
|
/datum/element/footstep_override/proc/prepare_steps(turf/source, list/steps)
|
|
SIGNAL_HANDLER
|
|
if(steps[STEP_SOUND_PRIORITY] > priority)
|
|
return
|
|
steps[FOOTSTEP_MOB_SHOE] = footstep
|
|
steps[FOOTSTEP_MOB_BAREFOOT] = barefootstep
|
|
steps[FOOTSTEP_MOB_HEAVY] = heavyfootstep
|
|
steps[FOOTSTEP_MOB_CLAW] = clawfootstep
|
|
steps[STEP_SOUND_PRIORITY] = priority
|
|
return FOOTSTEP_OVERRIDEN
|