From 8f78bfeb269981ec5ae28915fab9cc812f19a0ca Mon Sep 17 00:00:00 2001 From: Linzolle Date: Wed, 23 Oct 2019 21:36:47 -0500 Subject: [PATCH] oops --- code/datums/components/shrink.dm | 42 +++++ .../abductor/equipment/glands/access.dm | 19 ++ .../abductor/equipment/glands/blood.dm | 18 ++ .../abductor/equipment/glands/chem.dm | 20 ++ .../abductor/equipment/glands/egg.dm | 15 ++ .../abductor/equipment/glands/electric.dm | 26 +++ .../abductor/equipment/glands/heal.dm | 178 ++++++++++++++++++ .../abductor/equipment/glands/mindshock.dm | 64 +++++++ .../abductor/equipment/glands/plasma.dm | 22 +++ .../abductor/equipment/glands/quantum.dm | 47 +++++ .../abductor/equipment/glands/slime.dm | 21 +++ .../abductor/equipment/glands/spider.dm | 14 ++ .../abductor/equipment/glands/transform.dm | 15 ++ .../abductor/equipment/glands/trauma.dm | 18 ++ .../abductor/equipment/glands/ventcrawl.dm | 12 ++ .../abductor/equipment/glands/viral.dm | 34 ++++ code/modules/clothing/head/misc_special.dm | 59 +++++- sound/weapons/shrink_hit.ogg | Bin 0 -> 12438 bytes 18 files changed, 614 insertions(+), 10 deletions(-) create mode 100644 code/datums/components/shrink.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/access.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/blood.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/chem.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/egg.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/electric.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/heal.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/mindshock.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/plasma.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/quantum.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/slime.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/spider.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/transform.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/trauma.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm create mode 100644 code/modules/antagonists/abductor/equipment/glands/viral.dm create mode 100644 sound/weapons/shrink_hit.ogg diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm new file mode 100644 index 0000000000..f070d9b22f --- /dev/null +++ b/code/datums/components/shrink.dm @@ -0,0 +1,42 @@ +/datum/component/shrink + var/olddens + var/oldopac + dupe_mode = COMPONENT_DUPE_HIGHLANDER + +/datum/component/shrink/Initialize(shrink_time) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + var/atom/parent_atom = parent + parent_atom.transform = parent_atom.transform.Scale(0.5,0.5) + olddens = parent_atom.density + oldopac = parent_atom.opacity + parent_atom.density = 0 + parent_atom.opacity = 0 + if(isliving(parent_atom)) + var/mob/living/L = parent_atom + L.add_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY, update=TRUE, priority=100, multiplicative_slowdown=4) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.unequip_everything() + C.visible_message("[C]'s belongings fall off of [C.p_them()] as they shrink down!", + "Your belongings fall away as everything grows bigger!") + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.physiology.damage_resistance -= 100//carbons take double damage while shrunk + parent_atom.visible_message("[parent_atom] shrinks down to a tiny size!", + "Everything grows bigger!") + QDEL_IN(src, shrink_time) + + +/datum/component/shrink/Destroy() + var/atom/parent_atom = parent + parent_atom.transform = parent_atom.transform.Scale(2,2) + parent_atom.density = olddens + parent_atom.opacity = oldopac + if(isliving(parent_atom)) + var/mob/living/L = parent_atom + L.remove_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.physiology.damage_resistance += 100 + ..() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm new file mode 100644 index 0000000000..548650d4e3 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/access.dm @@ -0,0 +1,19 @@ +/obj/item/organ/heart/gland/access + true_name = "anagraphic electro-scrambler" + cooldown_low = 600 + cooldown_high = 1200 + uses = 1 + icon_state = "mindshock" + mind_control_uses = 3 + mind_control_duration = 900 + +/obj/item/organ/heart/gland/access/activate() + to_chat(owner, "You feel like a VIP for some reason.") + RegisterSignal(owner, COMSIG_MOB_ALLOWED, .proc/free_access) + +/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O) + return TRUE + +/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0) + UnregisterSignal(owner, COMSIG_MOB_ALLOWED) + ..() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm new file mode 100644 index 0000000000..06b8249484 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/blood.dm @@ -0,0 +1,18 @@ +/obj/item/organ/heart/gland/blood + true_name = "pseudonuclear hemo-destabilizer" + cooldown_low = 1200 + cooldown_high = 1800 + uses = -1 + icon_state = "egg" + lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' + mind_control_uses = 3 + mind_control_duration = 1500 + +/obj/item/organ/heart/gland/blood/activate() + if(!ishuman(owner) || !owner.dna.species) + return + var/mob/living/carbon/human/H = owner + var/datum/species/species = H.dna.species + to_chat(H, "You feel your blood heat up for a moment.") + species.exotic_blood = get_random_reagent_id() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm new file mode 100644 index 0000000000..e7b6fda85f --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -0,0 +1,20 @@ +/obj/item/organ/heart/gland/chem + true_name = "intrinsic pharma-provider" + cooldown_low = 50 + cooldown_high = 50 + uses = -1 + icon_state = "viral" + mind_control_uses = 3 + mind_control_duration = 1200 + var/list/possible_reagents = list() + +/obj/item/organ/heart/gland/chem/Initialize() + . = ..() + for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) + possible_reagents += R + +/obj/item/organ/heart/gland/chem/activate() + var/chem_to_add = pick(possible_reagents) + owner.reagents.add_reagent(chem_to_add, 2) + owner.adjustToxLoss(-5, TRUE, TRUE) + ..() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm new file mode 100644 index 0000000000..429a24b19c --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/egg.dm @@ -0,0 +1,15 @@ +/obj/item/organ/heart/gland/egg + true_name = "roe/enzymatic synthesizer" + cooldown_low = 300 + cooldown_high = 400 + uses = -1 + icon_state = "egg" + lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' + mind_control_uses = 2 + mind_control_duration = 1800 + +/obj/item/organ/heart/gland/egg/activate() + owner.visible_message("[owner] [pick(EGG_LAYING_MESSAGES)]") + var/turf/T = owner.drop_location() + new /obj/item/reagent_containers/food/snacks/egg/gland(T) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm new file mode 100644 index 0000000000..c5c14bb179 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -0,0 +1,26 @@ +/obj/item/organ/heart/gland/electric + true_name = "electron accumulator/discharger" + cooldown_low = 800 + cooldown_high = 1200 + icon_state = "species" + uses = -1 + mind_control_uses = 2 + mind_control_duration = 900 + +/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) + ..() + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") + +/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") + ..() + +/obj/item/organ/heart/gland/electric/activate() + owner.visible_message("[owner]'s skin starts emitting electric arcs!",\ + "You feel electric energy building up inside you!") + playsound(get_turf(owner), "sparks", 100, TRUE, -1) + addtimer(CALLBACK(src, .proc/zap), rand(30, 100)) + +/obj/item/organ/heart/gland/electric/proc/zap() + tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN) + playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm new file mode 100644 index 0000000000..bf9a00e13c --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -0,0 +1,178 @@ +/obj/item/organ/heart/gland/heal + true_name = "organic replicator" + cooldown_low = 200 + cooldown_high = 400 + uses = -1 + human_only = TRUE + icon_state = "health" + mind_control_uses = 3 + mind_control_duration = 3000 + +/obj/item/organ/heart/gland/heal/activate() + if(!(owner.mob_biotypes & MOB_ORGANIC)) + return + + for(var/organ in owner.internal_organs) + if(istype(organ, /obj/item/organ/cyberimp)) + reject_implant(organ) + return + + var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) + if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic))))) + replace_liver(liver) + return + + var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) + if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic)))) + replace_lungs(lungs) + return + + var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic))))) + replace_eyes(eyes) + return + + var/obj/item/bodypart/limb + var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + for(var/zone in limb_list) + limb = owner.get_bodypart(zone) + if(!limb) + replace_limb(zone) + return + if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC)) + replace_limb(zone, limb) + return + + if(owner.getToxLoss() > 40) + replace_blood() + return + var/tox_amount = 0 + for(var/datum/reagent/toxin/T in owner.reagents.reagent_list) + tox_amount += owner.reagents.get_reagent_amount(T.type) + if(tox_amount > 10) + replace_blood() + return + if(owner.blood_volume < BLOOD_VOLUME_OKAY) + owner.blood_volume = BLOOD_VOLUME_NORMAL + to_chat(owner, "You feel your blood pulsing within you.") + return + + var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST) + if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC)) + replace_chest(chest) + return + +/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant) + owner.visible_message("[owner] vomits up his [implant.name]!", "You suddenly vomit up your [implant.name]!") + owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + implant.Remove(owner) + implant.forceMove(owner.drop_location()) + +/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver) + if(liver) + owner.visible_message("[owner] vomits up his [liver.name]!", "You suddenly vomit up your [liver.name]!") + owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + liver.Remove(owner) + liver.forceMove(owner.drop_location()) + else + to_chat(owner, "You feel a weird rumble in your bowels...") + + var/liver_type = /obj/item/organ/liver + if(owner?.dna?.species?.mutantliver) + liver_type = owner.dna.species.mutantliver + var/obj/item/organ/liver/new_liver = new liver_type() + new_liver.Insert(owner) + +/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs) + if(lungs) + owner.visible_message("[owner] vomits up his [lungs.name]!", "You suddenly vomit up your [lungs.name]!") + owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) + lungs.Remove(owner) + lungs.forceMove(owner.drop_location()) + else + to_chat(owner, "You feel a weird rumble inside your chest...") + + var/lung_type = /obj/item/organ/lungs + if(owner.dna.species && owner.dna.species.mutantlungs) + lung_type = owner.dna.species.mutantlungs + var/obj/item/organ/lungs/new_lungs = new lung_type() + new_lungs.Insert(owner) + +/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes) + if(eyes) + owner.visible_message("[owner]'s [eyes.name] fall out of their sockets!", "Your [eyes.name] fall out of their sockets!") + playsound(owner, 'sound/effects/splat.ogg', 50, TRUE) + eyes.Remove(owner) + eyes.forceMove(owner.drop_location()) + else + to_chat(owner, "You feel a weird rumble behind your eye sockets...") + + addtimer(CALLBACK(src, .proc/finish_replace_eyes), rand(100, 200)) + +/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() + var/eye_type = /obj/item/organ/eyes + if(owner.dna.species && owner.dna.species.mutanteyes) + eye_type = owner.dna.species.mutanteyes + var/obj/item/organ/eyes/new_eyes = new eye_type() + new_eyes.Insert(owner) + owner.visible_message("A pair of new eyes suddenly inflates into [owner]'s eye sockets!", "A pair of new eyes suddenly inflates into your eye sockets!") + +/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) + if(limb) + owner.visible_message("[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!", "Your [limb.name] suddenly detaches from your body!") + playsound(owner, "desceration", 50, TRUE, -1) + limb.drop_limb() + else + to_chat(owner, "You feel a weird tingle in your [parse_zone(body_zone)]... even if you don't have one.") + + addtimer(CALLBACK(src, .proc/finish_replace_limb, body_zone), rand(150, 300)) + +/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone) + owner.visible_message("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!", + "With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!", + "Your hear a loud snap.") + playsound(owner, 'sound/magic/demon_consume.ogg', 50, TRUE) + owner.regenerate_limb(body_zone) + +/obj/item/organ/heart/gland/heal/proc/replace_blood() + owner.visible_message("[owner] starts vomiting huge amounts of blood!", "You suddenly start vomiting huge amounts of blood!") + keep_replacing_blood() + +/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood() + var/keep_going = FALSE + owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE) + owner.Stun(15) + owner.adjustToxLoss(-15, TRUE, TRUE) + + owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + keep_going = TRUE + + if(owner.getToxLoss()) + keep_going = TRUE + for(var/datum/reagent/toxin/R in owner.reagents.reagent_list) + owner.reagents.remove_reagent(R.type, 4) + if(owner.reagents.has_reagent(R.type)) + keep_going = TRUE + if(keep_going) + addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30) + +/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) + if(chest.status == BODYPART_ROBOTIC) + owner.visible_message("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!", "Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!") + playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE) + var/list/dirs = GLOB.alldirs.Copy() + for(var/i in 1 to 3) + var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner)) + debris.streak(dirs) + else + owner.visible_message("[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!", "Your [chest.name] sheds off its damaged flesh, rapidly replacing it!") + playsound(owner, 'sound/effects/splat.ogg', 50, TRUE) + var/list/dirs = GLOB.alldirs.Copy() + for(var/i in 1 to 3) + var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner)) + gibs.streak(dirs) + + var/obj/item/bodypart/chest/new_chest = new(null) + new_chest.replace_limb(owner, TRUE) + qdel(chest) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm new file mode 100644 index 0000000000..f8b91343f2 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -0,0 +1,64 @@ +/obj/item/organ/heart/gland/mindshock + true_name = "neural crosstalk uninhibitor" + cooldown_low = 400 + cooldown_high = 700 + uses = -1 + icon_state = "mindshock" + mind_control_uses = 1 + mind_control_duration = 6000 + var/list/mob/living/carbon/human/broadcasted_mobs = list() + +/obj/item/organ/heart/gland/mindshock/activate() + to_chat(owner, "You get a headache.") + + var/turf/T = get_turf(owner) + for(var/mob/living/carbon/H in orange(4,T)) + if(H == owner) + continue + switch(pick(1,3)) + if(1) + to_chat(H, "You hear a loud buzz in your head, silencing your thoughts!") + H.Stun(50) + if(2) + to_chat(H, "You hear an annoying buzz in your head.") + H.confused += 15 + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) + if(3) + H.hallucination += 60 + +/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) + if(!ownerCheck() || !mind_control_uses || active_mind_control) + return FALSE + mind_control_uses-- + for(var/mob/M in oview(7, owner)) + if(!ishuman(M)) + continue + var/mob/living/carbon/human/H = M + if(H.stat) + continue + + broadcasted_mobs += H + to_chat(H, "You suddenly feel an irresistible compulsion to follow an order...") + to_chat(H, "[command]") + + message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") + + var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control) + mind_alert.command = command + + if(LAZYLEN(broadcasted_mobs)) + active_mind_control = TRUE + addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) + + update_gland_hud() + return TRUE + +/obj/item/organ/heart/gland/mindshock/clear_mind_control() + if(!active_mind_control || !LAZYLEN(broadcasted_mobs)) + return FALSE + for(var/M in broadcasted_mobs) + var/mob/living/carbon/human/H = M + to_chat(H, "You feel the compulsion fade, and you completely forget about your previous orders.") + H.clear_alert("mind_control") + active_mind_control = FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm new file mode 100644 index 0000000000..4a30d99d44 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -0,0 +1,22 @@ +/obj/item/organ/heart/gland/plasma + true_name = "effluvium sanguine-synonym emitter" + cooldown_low = 1200 + cooldown_high = 1800 + icon_state = "slime" + uses = -1 + mind_control_uses = 1 + mind_control_duration = 800 + +/obj/item/organ/heart/gland/plasma/activate() + to_chat(owner, "You feel bloated.") + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "A massive stomachache overcomes you."), 150) + addtimer(CALLBACK(src, .proc/vomit_plasma), 200) + +/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() + if(!owner) + return + owner.visible_message("[owner] vomits a cloud of plasma!") + var/turf/open/T = get_turf(owner) + if(istype(T)) + T.atmos_spawn_air("plasma=50;TEMP=[T20C]") + owner.vomit() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm new file mode 100644 index 0000000000..a5b8815437 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -0,0 +1,47 @@ +/obj/item/organ/heart/gland/quantum + true_name = "quantic de-observation matrix" + cooldown_low = 150 + cooldown_high = 150 + uses = -1 + icon_state = "emp" + mind_control_uses = 2 + mind_control_duration = 1200 + var/mob/living/carbon/entangled_mob + +/obj/item/organ/heart/gland/quantum/activate() + if(entangled_mob) + return + for(var/mob/M in oview(owner, 7)) + if(!iscarbon(M)) + continue + entangled_mob = M + addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400)) + return + +/obj/item/organ/heart/gland/quantum/proc/quantum_swap() + if(QDELETED(entangled_mob)) + entangled_mob = null + return + var/turf/T = get_turf(owner) + do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) + do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) + to_chat(owner, "You suddenly find yourself somewhere else!") + to_chat(entangled_mob, "You suddenly find yourself somewhere else!") + if(!active_mind_control) //Do not reset entangled mob while mind control is active + entangled_mob = null + +/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user) + if(..()) + if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) + to_chat(entangled_mob, "You suddenly feel an irresistible compulsion to follow an order...") + to_chat(entangled_mob, "[command]") + var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control) + mind_alert.command = command + message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") + update_gland_hud() + +/obj/item/organ/heart/gland/quantum/clear_mind_control() + if(active_mind_control) + to_chat(entangled_mob, "You feel the compulsion fade, and you completely forget about your previous orders.") + entangled_mob.clear_alert("mind_control") + ..() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm new file mode 100644 index 0000000000..ff3f5aa0a4 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -0,0 +1,21 @@ +/obj/item/organ/heart/gland/slime + true_name = "gastric animation galvanizer" + cooldown_low = 600 + cooldown_high = 1200 + uses = -1 + icon_state = "slime" + mind_control_uses = 1 + mind_control_duration = 2400 + +/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) + ..() + owner.faction |= "slime" + owner.grant_language(/datum/language/slime) + +/obj/item/organ/heart/gland/slime/activate() + to_chat(owner, "You feel nauseated!") + owner.vomit(20) + + var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") + Slime.Friends = list(owner) + Slime.Leader = owner \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm new file mode 100644 index 0000000000..f0421b23b2 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -0,0 +1,14 @@ +/obj/item/organ/heart/gland/spiderman + true_name = "araneae cloister accelerator" + cooldown_low = 450 + cooldown_high = 900 + uses = -1 + icon_state = "spider" + mind_control_uses = 2 + mind_control_duration = 2400 + +/obj/item/organ/heart/gland/spiderman/activate() + to_chat(owner, "You feel something crawling in your skin.") + owner.faction |= "spiders" + var/obj/structure/spider/spiderling/S = new(owner.drop_location()) + S.directive = "Protect your nest inside [owner.real_name]." \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm new file mode 100644 index 0000000000..05c4760d37 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/transform.dm @@ -0,0 +1,15 @@ +/obj/item/organ/heart/gland/transform + true_name = "anthropmorphic transmorphosizer" + cooldown_low = 900 + cooldown_high = 1800 + uses = -1 + human_only = TRUE + icon_state = "species" + mind_control_uses = 7 + mind_control_duration = 300 + +/obj/item/organ/heart/gland/transform/activate() + to_chat(owner, "You feel unlike yourself.") + randomize_human(owner) + var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly)) + owner.set_species(species) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm new file mode 100644 index 0000000000..b6280ec017 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/trauma.dm @@ -0,0 +1,18 @@ +/obj/item/organ/heart/gland/trauma + true_name = "white matter randomiser" + cooldown_low = 800 + cooldown_high = 1200 + uses = 5 + icon_state = "emp" + mind_control_uses = 3 + mind_control_duration = 1800 + +/obj/item/organ/heart/gland/trauma/activate() + to_chat(owner, "You feel a spike of pain in your head.") + if(prob(33)) + owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) + else + if(prob(20)) + owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) + else + owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm new file mode 100644 index 0000000000..d1ea135497 --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm @@ -0,0 +1,12 @@ +/obj/item/organ/heart/gland/ventcrawling + true_name = "pliant cartilage enabler" + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "vent" + mind_control_uses = 4 + mind_control_duration = 1800 + +/obj/item/organ/heart/gland/ventcrawling/activate() + to_chat(owner, "You feel very stretchy.") + owner.ventcrawler = VENTCRAWLER_ALWAYS \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm new file mode 100644 index 0000000000..4d4f865a7c --- /dev/null +++ b/code/modules/antagonists/abductor/equipment/glands/viral.dm @@ -0,0 +1,34 @@ +/obj/item/organ/heart/gland/viral + true_name = "contamination incubator" + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "viral" + mind_control_uses = 1 + mind_control_duration = 1800 + +/obj/item/organ/heart/gland/viral/activate() + to_chat(owner, "You feel sick.") + var/datum/disease/advance/A = random_virus(pick(2,6),6) + A.carrier = TRUE + owner.ForceContractDisease(A, FALSE, TRUE) + +/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + A.symptoms += S + A.Refresh() //just in case someone already made and named the same disease + return A \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 3f96796a00..6eebd7b63e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -238,25 +238,64 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) equip_delay_other = 140 var/datum/brain_trauma/mild/phobia/paranoia + var/warped = FALSE + +/obj/item/clothing/head/foilhat/Initialize(mapload) + . = ..() + if(!warped) + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up)) + else + warp_up() /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) - ..() - if(slot == SLOT_HEAD) - if(paranoia) - QDEL_NULL(paranoia) - paranoia = new() - user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies") - to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") + . = ..() + if(slot != SLOT_HEAD || warped) + return + if(paranoia) + QDEL_NULL(paranoia) + paranoia = new() + paranoia.clonable = FALSE + + user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) + to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") + + +/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) + //God Im sorry + if(!warped && iscarbon(usr)) + var/mob/living/carbon/C = usr + if(src == C.head) + to_chat(C, "Why would you want to take this off? Do you want them to get into your mind?!") + return + return ..() /obj/item/clothing/head/foilhat/dropped(mob/user) - ..() + . = ..() if(paranoia) QDEL_NULL(paranoia) +/obj/item/clothing/head/foilhat/proc/warp_up() + name = "scorched tinfoil hat" + desc = "A badly warped up hat. Quite unprobable this will still work against any of fictional and contemporary dangers it used to." + warped = TRUE + if(!isliving(loc) || !paranoia) + return + var/mob/living/target = loc + if(target.get_item_by_slot(SLOT_HEAD) != src) + return + QDEL_NULL(paranoia) + if(!target.IsUnconscious()) + to_chat(target, "Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.") + /obj/item/clothing/head/foilhat/attack_hand(mob/user) - if(iscarbon(user)) + if(!warped && iscarbon(user)) var/mob/living/carbon/C = user if(src == C.head) to_chat(user, "Why would you want to take this off? Do you want them to get into your mind?!") return - ..() + return ..() + +/obj/item/clothing/head/foilhat/microwave_act(obj/machinery/microwave/M) + . = ..() + if(!warped) + warp_up() diff --git a/sound/weapons/shrink_hit.ogg b/sound/weapons/shrink_hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c39c2d52694cde78776542eb5ebd8de15cf84efa GIT binary patch literal 12438 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 E2ETNnv;Y7A literal 0 HcmV?d00001