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 475b432df01..3d40dc6dac0 100644 --- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm +++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm @@ -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) diff --git a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm index a4db39248fd..73f0e1de498 100644 --- a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm +++ b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm @@ -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") diff --git a/code/game/gamemodes/miniantags/pulsedemon/cross_shock_component.dm b/code/game/gamemodes/miniantags/pulsedemon/cross_shock_component.dm new file mode 100644 index 00000000000..0934f127f5c --- /dev/null +++ b/code/game/gamemodes/miniantags/pulsedemon/cross_shock_component.dm @@ -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) diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm index cc368b1ba1a..b2bcc1e5b37 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm @@ -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!" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 31fbaf7149a..3cb1233bfea 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -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 diff --git a/paradise.dme b/paradise.dme index c06d751792c..d0d830cc2c0 100644 --- a/paradise.dme +++ b/paradise.dme @@ -686,6 +686,7 @@ #include "code\game\gamemodes\miniantags\morph\spells\open_vent.dm" #include "code\game\gamemodes\miniantags\morph\spells\pass_airlock.dm" #include "code\game\gamemodes\miniantags\morph\spells\reproduce.dm" +#include "code\game\gamemodes\miniantags\pulsedemon\cross_shock_component.dm" #include "code\game\gamemodes\miniantags\pulsedemon\pulsedemon.dm" #include "code\game\gamemodes\miniantags\pulsedemon\pulsedemon_abilities.dm" #include "code\game\gamemodes\miniantags\pulsedemon\pulsedemon_event.dm"