Skip to content

Commit

Permalink
Footsteps element + Sprinting
Browse files Browse the repository at this point in the history
  • Loading branch information
thgvr committed Sep 6, 2024
1 parent 7416728 commit 0a5dfd1
Show file tree
Hide file tree
Showing 19 changed files with 283 additions and 149 deletions.
3 changes: 3 additions & 0 deletions code/__DEFINES/footsteps.dm
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
#define FOOTSTEP_MOB_SHOE 4
#define FOOTSTEP_MOB_HUMAN 5 //Warning: Only works on /mob/living/carbon/human
#define FOOTSTEP_MOB_SLIME 6
#define FOOTSTEP_MOB_SLIME 6
#define FOOTSTEP_OBJ_MACHINE 7
#define FOOTSTEP_OBJ_ROBOT 8

/*
Expand Down
125 changes: 0 additions & 125 deletions code/datums/components/footstep.dm

This file was deleted.

156 changes: 156 additions & 0 deletions code/datums/elements/footstep.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
///Footstep element. Plays footsteps at parents location when it is appropriate.
/datum/element/footstep
element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
id_arg_index = 2
///A list containing living mobs and the number of steps they have taken since the last time their footsteps were played.
var/list/steps_for_living = list()
///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
///Whether or not to add variation to the sounds played
var/sound_vary = FALSE

/datum/element/footstep/Attach(datum/target, footstep_type = FOOTSTEP_MOB_BAREFOOT, volume = 0.5, e_range = -8, sound_vary = FALSE)
. = ..()
if(!ismovable(target))
return ELEMENT_INCOMPATIBLE
src.volume = volume
src.e_range = e_range
src.footstep_type = footstep_type
src.sound_vary = sound_vary
switch(footstep_type)
if(FOOTSTEP_MOB_HUMAN)
if(!ishuman(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_humanstep))
steps_for_living[target] = 0
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'
if(FOOTSTEP_OBJ_MACHINE)
footstep_sounds = 'sound/effects/bang.ogg'
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_simplestep_machine))
return
if(FOOTSTEP_OBJ_ROBOT)
footstep_sounds = 'sound/effects/tank_treads.ogg'
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_simplestep_machine))
return
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_simplestep))
steps_for_living[target] = 0

/datum/element/footstep/Detach(atom/movable/source)
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
steps_for_living -= source
return ..()

///Prepares a footstep for living mobs. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open
/datum/element/footstep/proc/prepare_step(mob/living/source)
var/turf/open/turf = get_turf(source)
if(!istype(turf))
return

if(!turf.footstep || source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING))
return

if(!(source.mobility_flags & MOBILITY_STAND)) //play crawling sound if we're lying
playsound(source, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1, vary = sound_vary)
return

if(iscarbon(source))
var/mob/living/carbon/carbon_source = source
if(!carbon_source.get_bodypart(BODY_ZONE_L_LEG) && !carbon_source.get_bodypart(BODY_ZONE_R_LEG))
return

/* todo: stealth mode?
if(carbon_source.m_intent == MOVE_INTENT_WALK)
return// stealth
*/

steps_for_living[source] += 1
var/steps = steps_for_living[source]

if(steps >= 6)
steps_for_living[source] = 0
steps = 0

if(steps % 2)
return

if(steps != 0 && !source.has_gravity(turf)) // don't need to step as often when you hop around
return
return turf

/datum/element/footstep/proc/play_simplestep(mob/living/source)
SIGNAL_HANDLER

var/turf/open/source_loc = prepare_step(source)
if(!source_loc)
return
if(isfile(footstep_sounds) || istext(footstep_sounds))
playsound(source, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary)
return
var/turf_footstep
switch(footstep_type)
if(FOOTSTEP_MOB_CLAW)
turf_footstep = source_loc.clawfootstep
if(FOOTSTEP_MOB_BAREFOOT)
turf_footstep = source_loc.barefootstep
if(FOOTSTEP_MOB_HEAVY)
turf_footstep = source_loc.heavyfootstep
if(FOOTSTEP_MOB_SHOE)
turf_footstep = source_loc.footstep
if(!turf_footstep)
return
playsound(source, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary)

/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source)
SIGNAL_HANDLER

var/volume_multiplier = 1
var/range_adjustment = 0

if(HAS_TRAIT(source, TRAIT_LIGHT_STEP))
volume_multiplier = 0.6
range_adjustment = -2

var/turf/open/source_loc = prepare_step(source)
if(!source_loc)
return

if ((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET)
// we are wearing shoes
playsound(source, pick(GLOB.footstep[source_loc.footstep][1]),
GLOB.footstep[source_loc.footstep][2] * volume * volume_multiplier,
TRUE,
GLOB.footstep[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary)
else
if(source.dna.species.special_step_sounds)
playsound(source, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary)
else
playsound(source, pick(GLOB.barefootstep[source_loc.barefootstep][1]),
GLOB.barefootstep[source_loc.barefootstep][2] * volume * volume_multiplier,
TRUE,
GLOB.barefootstep[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary)


///Prepares a footstep for machine walking
/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source)
SIGNAL_HANDLER

var/turf/open/source_loc = get_turf(source)
if(!istype(source_loc))
return
playsound(source, footstep_sounds, 50, falloff_distance = 1, vary = sound_vary)
4 changes: 2 additions & 2 deletions code/datums/keybinding/mob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@
/datum/keybinding/mob/toggle_move_intent
hotkey_keys = list("Alt")
name = "toggle_move_intent"
full_name = "Hold to toggle move intent"
description = "Held down to cycle to the other move intent, release to cycle back"
full_name = "Hold to toggle sprint"
description = "Hold down to enable sprinting. Releasing will return you to walk."
keybind_signal = COMSIG_KB_MOB_TOGGLEMOVEINTENT_DOWN

/datum/keybinding/mob/toggle_move_intent/down(client/user)
Expand Down
6 changes: 0 additions & 6 deletions code/datums/traits/good.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,6 @@
lose_text = "<span class='danger'>You start tromping around like a barbarian.</span>"
medical_record_text = "Patient's dexterity belies a strong capacity for stealth."

/datum/quirk/light_step/on_spawn()
var/datum/component/footstep/C = quirk_holder.GetComponent(/datum/component/footstep)
if(C)
C.volume *= 0.6
C.e_range -= 2

/datum/quirk/musician
name = "Musician"
desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul."
Expand Down
3 changes: 1 addition & 2 deletions code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@

/mob/living/carbon/alien/humanoid/Initialize()
. = ..()
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)

AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)

/mob/living/carbon/alien/humanoid/show_inv(mob/user)
user.set_machine(src)
Expand Down
11 changes: 4 additions & 7 deletions code/modules/mob/living/carbon/carbon_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,6 @@

return embeds


/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
if(!eyes) //can't flash what can't see!
Expand Down Expand Up @@ -574,7 +573,6 @@
if(prob(20))
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")


/mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15)
var/list/reflist = list(intensity) // Need to wrap this in a list so we can pass a reference
SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist)
Expand Down Expand Up @@ -603,7 +601,6 @@
SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250))
return effect_amount //how soundbanged we are


/mob/living/carbon/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
if(damage_type != BRUTE && damage_type != BURN)
return
Expand All @@ -625,7 +622,6 @@
if(istype(ears) && !ears.deaf)
. = TRUE


/mob/living/carbon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(isnull(.))
Expand All @@ -636,7 +632,6 @@
else if(getOxyLoss() <= 50)
REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT)


/mob/living/carbon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(isnull(.))
Expand All @@ -648,18 +643,20 @@
REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT)

/mob/living/carbon/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE)
var/mob/living/carbon/human/current_user = src //is this a good idea? who can say?
var/armor = run_armor_check(def_zone, P.flag, P.armour_penetration, silent = TRUE)
var/on_hit_state = P.on_hit(src, armor, piercing_hit)

if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK && !QDELETED(src)) //QDELETED literally just for the instagib rifle. Yeah.
apply_damage(P.damage, P.damage_type, def_zone, armor, sharpness = TRUE)

if(P.damage-armor >= 15 && P.damage_type == BRUTE && (!armor || prob(40) || P.damage-armor >= 25))
spray_blood(get_dir(P.starting,src), (P.damage-armor)/5)
var/obj/item/bodypart/targeted_bodypart = null
bleed((P.damage-armor)/2)

recoil_camera(src, clamp((P.damage-armor)/4,0.5,10), clamp((P.damage-armor)/4,0.5,10), P.damage/8, P.Angle)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)

if(P.dismemberment)
check_projectile_dismemberment(P, def_zone)

return on_hit_state ? BULLET_ACT_HIT : BULLET_ACT_BLOCK
Loading

0 comments on commit 0a5dfd1

Please sign in to comment.