diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
index 468c09da197..364241407e6 100644
--- a/code/datums/spells/bloodcrawl.dm
+++ b/code/datums/spells/bloodcrawl.dm
@@ -87,20 +87,21 @@
C.regenerate_icons()
return TRUE
+/obj/effect/temp_visual/dir_setting/bloodcrawl
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "blank" // Flicks are used instead
+ duration = 0.6 SECONDS
+ layer = MOB_LAYER + 0.1
+
+/obj/effect/temp_visual/dir_setting/bloodcrawl/Initialize(mapload, set_dir, animation_state)
+ . = ..()
+ flick(animation_state, src) // Setting the icon_state to the animation has timing issues and can cause frame skips
+
/obj/effect/proc_holder/spell/bloodcrawl/proc/sink_animation(atom/A, mob/living/L)
var/turf/mob_loc = get_turf(L)
visible_message("[L] sinks into [A].")
playsound(mob_loc, 'sound/misc/enter_blood.ogg', 100, 1, -1)
- var/atom/movable/overlay/animation = new(mob_loc)
- animation.name = "odd blood"
- animation.density = FALSE
- animation.anchored = TRUE
- animation.icon = 'icons/mob/mob.dmi'
- animation.icon_state = "jaunt"
- animation.layer = 5
- animation.master = mob_loc
- animation.dir = L.dir
- QDEL_IN(animation, 0.6 SECONDS)
+ new /obj/effect/temp_visual/dir_setting/bloodcrawl(mob_loc, L.dir, "jaunt")
/obj/effect/proc_holder/spell/bloodcrawl/proc/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder)
if(!HAS_TRAIT(L, TRAIT_BLOODCRAWL_EAT))
@@ -188,21 +189,12 @@
post_phase_in(L, holder)
/obj/effect/proc_holder/spell/bloodcrawl/proc/rise_animation(turf/tele_loc, mob/living/L, atom/A)
- var/atom/movable/overlay/animation = new(tele_loc)
- animation.name = "odd blood"
- animation.density = FALSE
- animation.anchored = TRUE
- animation.icon = 'icons/mob/mob.dmi'
- animation.icon_state = "jauntup" //Paradise Port:I reversed the jaunt animation so it looks like its rising up
- animation.layer = 5
- animation.master = tele_loc
- animation.dir = L.dir
+ new /obj/effect/temp_visual/dir_setting/bloodcrawl(tele_loc, L.dir, "jauntup")
if(prob(25) && isdemon(L))
var/list/voice = list('sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/i_see_you1.ogg')
playsound(tele_loc, pick(voice),50, 1, -1)
A.visible_message("[L] rises out of [A]!")
playsound(get_turf(tele_loc), 'sound/misc/exit_blood.ogg', 100, 1, -1)
- QDEL_IN(animation, 0.6 SECONDS)
/obj/effect/proc_holder/spell/bloodcrawl/proc/unblock_hands(mob/living/carbon/C)
if(!istype(C))
@@ -260,13 +252,14 @@
return
/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/rise_animation(turf/tele_loc, mob/living/L, atom/A)
- return
+ new /obj/effect/temp_visual/dir_setting/bloodcrawl(get_turf(L), L.dir, "shadowwalk_appear")
/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder)
return
/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/sink_animation(atom/A, mob/living/L)
A.visible_message("[L] sinks into the shadows...")
+ new /obj/effect/temp_visual/dir_setting/bloodcrawl(get_turf(L), L.dir, "shadowwalk_disappear")
/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder)
..()
@@ -274,4 +267,3 @@
return
var/mob/living/simple_animal/demon/shadow/S = L
S.RegisterSignal(holder, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/mob/living/simple_animal/demon/shadow, check_darkness))
-
diff --git a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
index 34869d46d84..ba308b0677e 100644
--- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
+++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
@@ -32,10 +32,13 @@
AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple)
var/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/S = new
AddSpell(S)
+ whisper_action.button_icon_state = "shadow_whisper"
+ whisper_action.background_icon_state = "shadow_demon_bg"
if(istype(loc, /obj/effect/dummy/slaughter))
S.phased = TRUE
RegisterSignal(loc, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/mob/living/simple_animal/demon/shadow, check_darkness))
RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(check_darkness))
+ add_overlay(emissive_appearance(icon, "shadow_demon_eye_glow_overlay"))
/mob/living/simple_animal/demon/shadow/proc/check_darkness()
var/turf/T = get_turf(src)
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 4a939231c99..8e034e98b84 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 90c30c0c3d8..498c3203785 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ