Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 28 additions & 24 deletions code/datums/elements/bloody_feet.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
steps_to_take = steps
color = bcolor

var/mob/living/carbon/human/H = target
H.bloody_footsteps = steps_to_take
var/mob/living/carbon/human/target_human = target
target_human.bloody_footsteps = steps_to_take
LAZYADD(entered_bloody_turf, target)

RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE)
Expand All @@ -32,7 +32,7 @@
RegisterSignal(shoes, COMSIG_ITEM_DROPPED, PROC_REF(on_shoes_removed), override = TRUE)

if(dry_time)
addtimer(CALLBACK(src, PROC_REF(clear_blood), target), dry_time)
addtimer(CALLBACK(src, PROC_REF(clear_blood), WEAKREF(target)), dry_time)

/datum/element/bloody_feet/Detach(datum/target, force)
UnregisterSignal(target, list(
Expand All @@ -45,17 +45,18 @@
UnregisterSignal(target_shoes[target], COMSIG_ITEM_DROPPED)
LAZYREMOVE(target_shoes, target)

var/mob/living/carbon/human/H = target
if(ishuman(H))
H.bloody_footsteps = 0
var/mob/living/carbon/human/target_human = target
if(ishuman(target_human))
target_human.bloody_footsteps = 0

return ..()

/datum/element/bloody_feet/proc/on_moved(mob/living/carbon/human/target, oldLoc, direction)
/datum/element/bloody_feet/proc/on_moved(mob/living/carbon/human/target, turf/old_loc, direction)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(add_tracks), target, oldLoc, direction)
if(target.stat == CONSCIOUS)
INVOKE_ASYNC(src, PROC_REF(add_tracks), target, old_loc, direction)

/datum/element/bloody_feet/proc/add_tracks(mob/living/carbon/human/target, oldLoc, direction)
/datum/element/bloody_feet/proc/add_tracks(mob/living/carbon/human/target, turf/old_loc, direction)
if(GLOB.perf_flags & PERF_TOGGLE_NOBLOODPRINTS)
Detach(target)
return
Expand All @@ -66,27 +67,27 @@
return

var/turf/T_in = target.loc
var/turf/T_out = oldLoc
var/turf/T_out = old_loc

if(istype(T_in))
var/obj/effect/decal/cleanable/blood/tracks/footprints/FP = LAZYACCESS(T_in.cleanables, CLEANABLE_TRACKS)
if(FP)
var/image/I = LAZYACCESS(FP.steps_in, "[direction]")
if(!I)
FP.add_tracks(direction, color, FALSE)
var/obj/effect/decal/cleanable/blood/tracks/footprints/print = LAZYACCESS(T_in.cleanables, CLEANABLE_TRACKS)
if(print)
var/image/steps_image = LAZYACCESS(print.steps_in, "[direction]")
if(!steps_image)
print.add_tracks(direction, color, FALSE)
else
FP = new(T_in)
FP.add_tracks(direction, color, FALSE)
print = new(T_in)
print.add_tracks(direction, color, FALSE)

if(istype(T_out))
var/obj/effect/decal/cleanable/blood/tracks/footprints/FP = LAZYACCESS(T_out.cleanables, CLEANABLE_TRACKS)
if(FP)
var/image/I = LAZYACCESS(FP.steps_out, "[direction]")
if(!I)
FP.add_tracks(direction, color, TRUE)
var/obj/effect/decal/cleanable/blood/tracks/footprints/print = LAZYACCESS(T_out.cleanables, CLEANABLE_TRACKS)
if(print)
var/image/steps_image = LAZYACCESS(print.steps_out, "[direction]")
if(!steps_image)
print.add_tracks(direction, color, TRUE)
else
FP = new(T_out)
FP.add_tracks(direction, color, TRUE)
print = new(T_out)
print.add_tracks(direction, color, TRUE)

if(--target.bloody_footsteps <= 0)
Detach(target)
Expand All @@ -102,4 +103,7 @@

/datum/element/bloody_feet/proc/clear_blood(datum/target)
SIGNAL_HANDLER
if(isweakref(target))
var/datum/weakref/target_ref = target
target = target_ref.resolve()
Detach(target)
30 changes: 18 additions & 12 deletions code/game/objects/effects/decals/cleanable/blood/blood.dm
Original file line number Diff line number Diff line change
Expand Up @@ -43,34 +43,40 @@
dry_start_time = world.time
addtimer(CALLBACK(src, PROC_REF(dry)), drying_time * (amount+1))

/obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM)
/obj/effect/decal/cleanable/blood/Crossed(atom/movable/crossed_by)
..()

if (!apply_bloody_feet)
if(!apply_bloody_feet)
return

// Check if the blood is dry and only humans
// can make footprints
if(!amount || !ishuman(AM) || QDELETED(AM))
if(!amount)
return
if(QDELETED(crossed_by))
return

if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/blood_optimization))
return
if(!ishuman(crossed_by))
return

var/mob/living/carbon/human/H = AM
H.add_blood(color, BLOOD_FEET)
var/mob/living/carbon/human/crossing_human = crossed_by
if(crossing_human.stat != CONSCIOUS)
return

var/dry_time_left = 0
if(drying_time)
dry_time_left = max(0, drying_time - (world.time - dry_start_time))
crossing_human.add_blood(color, BLOOD_FEET)

if(GLOB.perf_flags & PERF_TOGGLE_NOBLOODPRINTS)
return

if(!H.bloody_footsteps)
H.AddElement(/datum/element/bloody_feet, dry_time_left, H.shoes, amount, color)
var/dry_time_left = 0
if(drying_time)
dry_time_left = max(0, drying_time - (world.time - dry_start_time))

if(!crossing_human.bloody_footsteps)
crossing_human.AddElement(/datum/element/bloody_feet, dry_time_left, crossing_human.shoes, amount, color)
else
SEND_SIGNAL(H, COMSIG_HUMAN_BLOOD_CROSSED, amount, color, dry_time_left)
SEND_SIGNAL(crossing_human, COMSIG_HUMAN_BLOOD_CROSSED, amount, color, dry_time_left)

/obj/effect/decal/cleanable/blood/proc/dry()
amount = 0
Expand Down