mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
adds a pulse demon demon heart (#22810)
* adds a pulse demon demon heart * fixes + shock HARDER
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user