adds a pulse demon demon heart (#22810)

* adds a pulse demon demon heart

* fixes + shock HARDER
This commit is contained in:
GDN
2023-11-01 20:13:12 +00:00
committed by GitHub
parent d8bb2c028b
commit 65cab6910f
6 changed files with 95 additions and 2 deletions
@@ -235,6 +235,6 @@
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple)
/obj/item/organ/internal/heart/demon/shadow/remove(mob/living/carbon/M, special = 0)
..()
. = ..()
if(M.mind)
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/fireball/shadow_grapple)
@@ -261,7 +261,7 @@
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
/obj/item/organ/internal/heart/demon/slaughter/remove(mob/living/carbon/M, special = 0)
..()
. = ..()
if(M.mind)
REMOVE_TRAIT(M, TRAIT_BLOODCRAWL, "bloodcrawl")
REMOVE_TRAIT(M, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
@@ -0,0 +1,53 @@
/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))
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_CROSSED_MOVABLE), PROC_REF(do_shock))
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/do_shock(datum/source, mob/living/thing_were_gonna_shock)
SIGNAL_HANDLER
if(!COOLDOWN_FINISHED(src, last_shock))
return
if(!istype(thing_were_gonna_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)
thing_were_gonna_shock.electrocute_act(shock_damage, src)
to_deduct_from.powernet.use_active_power(energy_cost)
playsound(get_turf(parent), 'sound/effects/eleczap.ogg', 30, TRUE)
else
thing_were_gonna_shock.electrocute_act(shock_damage, src)
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)
@@ -51,6 +51,7 @@
has_unlimited_silicon_privilege = TRUE
// this makes the demon able to speak through holopads, due to the overriden say, PD cannot speak normally regardless
universal_speak = TRUE
loot = list(/obj/item/organ/internal/heart/demon/pulse)
/// List of sounds that is picked from when the demon speaks.
var/list/speech_sounds = list("sound/voice/pdvoice1.ogg", "sound/voice/pdvoice2.ogg", "sound/voice/pdvoice3.ogg")
@@ -803,6 +804,43 @@
/mob/living/simple_animal/demon/pulse_demon/mob_has_gravity()
return TRUE
/obj/item/organ/internal/heart/demon/pulse
name = "perpetual pacemaker"
desc = "It still beats furiously, thousands of bright lights shine within it."
color = COLOR_YELLOW
/obj/item/organ/internal/heart/demon/pulse/Initialize(mapload)
. = ..()
set_light(13, 2, "#bbbb00")
/obj/item/organ/internal/heart/demon/pulse/attack_self(mob/living/user)
. = ..()
user.drop_item()
insert(user)
/obj/item/organ/internal/heart/demon/pulse/insert(mob/living/carbon/M, special, dont_remove_slot)
. = ..()
M.AddComponent(/datum/component/cross_shock, 30, 500, 2 SECONDS)
ADD_TRAIT(M, TRAIT_SHOCKIMMUNE, UNIQUE_TRAIT_SOURCE(src))
M.set_light(3, 2, "#bbbb00")
/obj/item/organ/internal/heart/demon/pulse/remove(mob/living/carbon/M, special)
. = ..()
REMOVE_TRAIT(M, TRAIT_SHOCKIMMUNE, UNIQUE_TRAIT_SOURCE(src))
M.remove_light()
/obj/item/organ/internal/heart/demon/pulse/on_life()
if(!owner)
return
for(var/obj/item/stock_parts/cell/cell_to_charge in owner.GetAllContents())
var/newcharge = min(0.05 * cell_to_charge.maxcharge + cell_to_charge.charge, cell_to_charge.maxcharge)
if(cell_to_charge.charge < newcharge)
cell_to_charge.charge = newcharge
if(isobj(cell_to_charge.loc))
var/obj/cell_location = cell_to_charge.loc
cell_location.update_icon() //update power meters and such
cell_to_charge.update_icon()
/obj/screen/alert/pulse_nopower
name = "No Power"
desc = "You are not connected to a cable or machine and are losing health!"
@@ -50,6 +50,7 @@
/obj/item/organ/internal/remove(mob/living/carbon/M, special = 0)
if(!owner)
stack_trace("\'remove\' called on [src] without an owner! Mob: [M], [atom_loc_line(M)]")
SEND_SIGNAL(owner, COMSIG_CARBON_LOSE_ORGAN)
owner = null
if(M)
M.internal_organs -= src