Refactors slaughter, shadow, and pulse demons to basic mobs (#30660)

* Refactors slaughter, shadow, and pulse demons to basic mobs

* Linters

* Fix

* Projectile changes

* Ensures demons speak common

* Update code/modules/mob/living/basic/hostile/demons/demon_powers.dm

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
PollardTheDragon
2025-11-25 14:47:12 -05:00
committed by GitHub
parent 989ff989d6
commit 0cfe0594be
25 changed files with 741 additions and 752 deletions
@@ -0,0 +1,65 @@
/datum/component/cross_shock
var/shock_damage
var/energy_cost
var/delay_between_shocks
var/requires_cable
COOLDOWN_DECLARE(last_shock)
/datum/component/cross_shock/Initialize(_shock_damage, _energy_cost, _delay_between_shocks, _requires_cable = TRUE)
if(ismovable(parent))
var/static/list/crossed_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(do_shock),
)
AddComponent(/datum/component/connect_loc_behalf, parent, crossed_connections)
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_movable_moved))
if(ismob(parent))
RegisterSignal(parent, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_removal))
else if(isarea(parent))
RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(do_shock))
else if(isturf(parent))
RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(do_shock))
else
return COMPONENT_INCOMPATIBLE
shock_damage = _shock_damage
energy_cost = _energy_cost
delay_between_shocks = _delay_between_shocks
requires_cable = _requires_cable
/datum/component/cross_shock/proc/on_movable_moved(atom/source, old_location, direction, forced)
SIGNAL_HANDLER // COMSIG_MOVABLE_MOVED
if(isturf(source.loc))
for(var/mob/living/mob in source.loc)
do_shock(src, mob)
/datum/component/cross_shock/proc/do_shock(atom/source, atom/movable/to_shock)
SIGNAL_HANDLER // COMSIG_ATOM_ENTERED
if(!COOLDOWN_FINISHED(src, last_shock))
return
var/mob/living/living_to_shock = to_shock
if(!istype(living_to_shock))
return
if(isliving(parent))
var/mob/living/M = parent
if(M.stat == DEAD || !IS_HORIZONTAL(M))
return
if(requires_cable)
var/turf/our_turf = get_turf(parent)
if(our_turf.transparent_floor || our_turf.intact || HAS_TRAIT(our_turf, TRAIT_TURF_COVERED))
return
var/obj/structure/cable/our_cable = locate(/obj/structure/cable) in our_turf
if(!our_cable || !our_cable.powernet || !our_cable.powernet.available_power)
return
var/area/to_deduct_from = get_area(our_cable)
living_to_shock.electrocute_act(shock_damage, parent)
to_deduct_from.powernet.use_active_power(energy_cost)
playsound(get_turf(parent), 'sound/effects/eleczap.ogg', 30, TRUE)
else
living_to_shock.electrocute_act(shock_damage, parent)
playsound(get_turf(parent), 'sound/effects/eleczap.ogg', 30, TRUE)
COOLDOWN_START(src, last_shock, delay_between_shocks)
/datum/component/cross_shock/proc/on_organ_removal(datum/source)
SIGNAL_HANDLER
qdel(src)
+8 -8
View File
@@ -81,7 +81,7 @@
GM.set_nitrogen(MOLES_N2STANDARD)
GM.set_temperature(T20C)
return GM
/datum/spell/bloodcrawl/proc/block_hands(mob/living/carbon/C)
if(C.l_hand || C.r_hand)
to_chat(C, "<span class='warning'>You may not hold items while blood crawling!</span>")
@@ -141,7 +141,7 @@
)
var/sound
if(isslaughterdemon(L))
var/mob/living/simple_animal/demon/slaughter/SD = L
var/mob/living/basic/demon/slaughter/SD = L
sound = SD.feast_sound
else
sound = 'sound/misc/demon_consume.ogg'
@@ -171,7 +171,7 @@
L.adjustFireLoss(-25)
if(isslaughterdemon(L))
var/mob/living/simple_animal/demon/slaughter/demon = L
var/mob/living/basic/demon/slaughter/demon = L
demon.devoured++
to_chat(victim, "<span class='userdanger'>You feel teeth sink into your flesh, and the--</span>")
var/obj/item/organ/internal/regenerative_core/legion/core = victim.get_int_organ(/obj/item/organ/internal/regenerative_core/legion)
@@ -236,7 +236,7 @@
/datum/spell/bloodcrawl/proc/post_phase_out(atom/A, mob/living/L)
if(isslaughterdemon(L))
var/mob/living/simple_animal/demon/slaughter/S = L
var/mob/living/basic/demon/slaughter/S = L
S.speed = 0
S.boost = world.time + 6 SECONDS
var/old_color = L.color
@@ -275,7 +275,7 @@
action_icon_state = "shadow_crawl"
/datum/spell/bloodcrawl/shadow_crawl/can_cast(mob/user, charge_check, show_message)
var/mob/living/simple_animal/demon/shadow/current_demon = user
var/mob/living/basic/demon/shadow/current_demon = user
if(!istype(current_demon))
return ..()
@@ -303,10 +303,10 @@
/datum/spell/bloodcrawl/shadow_crawl/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder)
..()
if(!istype(L, /mob/living/simple_animal/demon/shadow))
if(!istype(L, /mob/living/basic/demon/shadow))
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))
var/mob/living/basic/demon/shadow/S = L
S.RegisterSignal(holder, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/mob/living/basic/demon/shadow, check_darkness))
#undef BLOODCRAWL
#undef BLOODCRAWL_EAT