diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 4c9573b8e7e..e7bd86f366e 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -919,6 +919,7 @@
"rI" = (/obj/machinery/computer/security/telescreen{name = "Special Ops. Monitor"; desc = "Used for watching the Special Ops."; network = list("ERT")},/obj/structure/table/wood,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops)
"rJ" = (/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/obj/structure/table/wood,/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"rK" = (/turf/unsimulated/wall/splashscreen,/area/start)
+"rL" = (/obj/structure/table/abductor,/obj/item/bonegel/alien,/obj/item/bonesetter/alien,/obj/item/FixOVein/alien,/obj/item/surgicaldrill/alien,/obj/item/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship)
"sq" = (/turf/unsimulated/wall,/area/centcom/control)
"sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
@@ -1731,7 +1732,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVrLljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1739,7 +1740,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVrLljlmllaNkUlikVrLljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 29392997893..60252fc11ba 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -27,6 +27,7 @@
#define PLANT_WEED_HUD "22"// Weed level
#define DIAG_TRACK_HUD "23"// Mech tracking beacon
#define DIAG_PATH_HUD "24"//Bot path indicators
+#define GLAND_HUD "25"//Gland indicators for abductors
//by default everything in the hud_list of an atom is an image
//a value in hud_list with one of these will change that behavior
@@ -54,6 +55,7 @@
#define ANTAG_HUD_CHANGELING 16
#define ANTAG_HUD_VAMPIRE 17
#define ANTAG_HUD_ABDUCTOR 18
+#define DATA_HUD_ABDUCTOR 19
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 21bcd079d8b..67a187c45db 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -370,4 +370,4 @@
// used for alternate_option
#define GET_RANDOM_JOB 0
#define BE_ASSISTANT 1
-#define RETURN_TO_LOBBY 2
+#define RETURN_TO_LOBBY 2
\ No newline at end of file
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index 148488a6ddf..65bffa7515a 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -31,4 +31,6 @@ var/list/round_end_sounds = list( // Maps available round end sounds to their du
'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS
)
-GLOBAL_LIST(station_level_space_turfs)
\ No newline at end of file
+GLOBAL_LIST(station_level_space_turfs)
+
+#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.")
\ No newline at end of file
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 571a0d7aa7b..9414a079e80 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -1,4 +1,6 @@
+#define VIRUS_SYMPTOM_LIMIT 6
+
//Visibility Flags
#define HIDDEN_SCANNER 1
#define HIDDEN_PANDEMIC 2
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 04ebcc68ed5..84c45299ece 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -20,7 +20,8 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\
- ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden()\
+ ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
+ DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor()\
)
/datum/atom_hud
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index a4faafcf91f..db2fb3c64df 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -52,6 +52,9 @@
/datum/atom_hud/data/bot_path
hud_icons = list(DIAG_PATH_HUD)
+/datum/atom_hud/abductor
+ hud_icons = list(GLAND_HUD)
+
/datum/atom_hud/data/hydroponic
hud_icons = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 40d48f7fd59..c8539b568db 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -2,6 +2,8 @@
#define VEST_COMBAT 2
#define GIZMO_SCAN 1
#define GIZMO_MARK 2
+#define MIND_DEVICE_MESSAGE 1
+#define MIND_DEVICE_CONTROL 2
//AGENT VEST
/obj/item/clothing/suit/armor/abductor/vest
@@ -14,6 +16,7 @@
origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
actions_types = list(/datum/action/item_action/hands_free/activate)
+ allowed = list(/obj/item/abductor, /obj/item/abductor_baton, /obj/item/melee/baton, /obj/item/gun/energy, /obj/item/restraints/handcuffs)
var/mode = VEST_STEALTH
var/stealth_active = 0
var/combat_cooldown = 10
@@ -23,6 +26,11 @@
species_fit = null
sprite_sheets = null
+/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
+ flags ^= NODROP
+ if(ismob(loc))
+ to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].")
+
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
switch(mode)
if(VEST_STEALTH)
@@ -53,7 +61,7 @@
return
stealth_active = 1
if(ishuman(loc))
- var/mob/living/carbon/human/M = src.loc
+ var/mob/living/carbon/human/M = loc
new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir)
M.name_override = disguise.name
M.icon = disguise.icon
@@ -67,7 +75,7 @@
return
stealth_active = 0
if(ishuman(loc))
- var/mob/living/carbon/human/M = src.loc
+ var/mob/living/carbon/human/M = loc
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir)
M.name_override = null
M.overlays.Cut()
@@ -94,9 +102,9 @@
/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline()
if(ishuman(loc))
if(combat_cooldown != initial(combat_cooldown))
- to_chat(src.loc, "Combat injection is still recharging.")
+ to_chat(loc, "Combat injection is still recharging.")
return
- var/mob/living/carbon/human/M = src.loc
+ var/mob/living/carbon/human/M = loc
M.adjustStaminaLoss(-75)
M.SetParalysis(0)
M.SetStunned(0)
@@ -109,6 +117,17 @@
if(combat_cooldown==initial(combat_cooldown))
processing_objects.Remove(src)
+/obj/item/clothing/suit/armor/abductor/Destroy()
+ processing_objects.Remove(src)
+ for(var/obj/machinery/abductor/console/C in machines)
+ if(C.vest == src)
+ C.vest = null
+ break
+ return ..()
+
+/obj/item/abductor
+ icon = 'icons/obj/abductor.dmi'
+
/obj/item/abductor/proc/AbductorCheck(user)
if(isabductor(user))
return TRUE
@@ -116,14 +135,19 @@
return FALSE
/obj/item/abductor/proc/ScientistCheck(user)
+ if(!AbductorCheck(user))
+ return FALSE
+
var/mob/living/carbon/human/H = user
var/datum/species/abductor/S = H.dna.species
- return S.scientist
+ if(S.scientist)
+ return TRUE
+ to_chat(user, "You're not trained to use this!")
+ return FALSE
/obj/item/abductor/gizmo
name = "science tool"
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
- icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "gizmo"
origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
@@ -132,11 +156,12 @@
var/obj/machinery/abductor/console/console
/obj/item/abductor/gizmo/attack_self(mob/user)
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this!")
return
+ if(!console)
+ to_chat(user, "The device is not linked to a console!")
+ return
+
if(mode == GIZMO_SCAN)
mode = GIZMO_MARK
icon_state = "gizmo_mark"
@@ -146,11 +171,12 @@
to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE")
/obj/item/abductor/gizmo/attack(mob/living/M, mob/user)
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this")
return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
switch(mode)
if(GIZMO_SCAN)
scan(M, user)
@@ -161,11 +187,12 @@
/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params)
if(flag)
return
- if(!AbductorCheck(user))
- return
if(!ScientistCheck(user))
- to_chat(user, "You're not trained to use this")
return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
switch(mode)
if(GIZMO_SCAN)
scan(target, user)
@@ -174,9 +201,8 @@
/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user)
if(ishuman(target))
- if(console!=null)
- console.AddSnapshot(target)
- to_chat(user, "You scan [target] and add [target.p_them()] to the database.")
+ console.AddSnapshot(target)
+ to_chat(user, "You scan [target] and add [target.p_them()] to the database.")
/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user)
if(marked == target)
@@ -200,11 +226,15 @@
marked = target
to_chat(user, "You finish preparing [target] for transport.")
+/obj/item/abductor/gizmo/Destroy()
+ if(console)
+ console.gizmo = null
+ return ..()
+
/obj/item/abductor/silencer
name = "abductor silencer"
desc = "A compact device used to shut down communications equipment."
- icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "silencer"
origin_tech = "materials=4;programming=7;abductor=3"
@@ -222,7 +252,7 @@
radio_off(target, user)
/obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user)
- if(!(user in (viewers(7,target))))
+ if(!(user in (viewers(7, target))))
return
var/turf/targloc = get_turf(target)
@@ -238,12 +268,85 @@
var/list/all_items = M.GetAllContents()
for(var/obj/I in all_items)
- if(istype(I,/obj/item/radio/))
+ if(istype(I, /obj/item/radio))
var/obj/item/radio/r = I
r.listening = 0
- if(!istype(I,/obj/item/radio/headset))
+ if(!istype(I, /obj/item/radio/headset))
r.broadcasting = 0 //goddamned headset hacks
+/obj/item/abductor/mind_device
+ name = "mental interface device"
+ desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, or to send a command to a test subject with a charged gland."
+ icon_state = "mind_device_message"
+ item_state = "silencer"
+ var/mode = MIND_DEVICE_MESSAGE
+
+/obj/item/abductor/mind_device/attack_self(mob/user)
+ if(!ScientistCheck(user))
+ return
+
+ if(mode == MIND_DEVICE_MESSAGE)
+ mode = MIND_DEVICE_CONTROL
+ icon_state = "mind_device_control"
+ else
+ mode = MIND_DEVICE_MESSAGE
+ icon_state = "mind_device_message"
+ to_chat(user, "You switch the device to [mode == MIND_DEVICE_MESSAGE ? "TRANSMISSION" : "COMMAND"] MODE")
+
+/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params)
+ if(!ScientistCheck(user))
+ return
+
+ switch(mode)
+ if(MIND_DEVICE_CONTROL)
+ mind_control(target, user)
+ if(MIND_DEVICE_MESSAGE)
+ mind_message(target, user)
+
+/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user)
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ var/obj/item/organ/internal/heart/gland/G = C.get_organ_slot("heart")
+ if(!istype(G))
+ to_chat(user, "Your target does not have an experimental gland!")
+ return
+ if(!G.mind_control_uses)
+ to_chat(user, "Your target's gland is spent!")
+ return
+ if(G.active_mind_control)
+ to_chat(user, "Your target is already under a mind-controlling influence!")
+ return
+
+ var/command = stripped_input(user, "Enter the command for your target to follow. Uses Left: [G.mind_control_uses], Duration: [DisplayTimeText(G.mind_control_duration)]", "Enter command")
+
+ if(!command)
+ return
+
+ if(QDELETED(user) || user.get_active_hand() != src || loc != user)
+ return
+
+ if(QDELETED(G))
+ return
+
+ G.mind_control(command, user)
+ to_chat(user, "You send the command to your target.")
+
+/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat == DEAD)
+ to_chat(user, "Your target is dead!")
+ return
+ var/message = stripped_input(user, "Write a message to send to your target's brain.", "Enter message")
+ if(!message)
+ return
+ if(QDELETED(L) || L.stat == DEAD)
+ return
+
+ to_chat(L, "You hear a voice in your head saying: [message]")
+ to_chat(user, "You send the message to your target.")
+ log_say("[key_name(user)] sent an abductor mind message to [key_name(L)]: '[message]'", user)
+
/obj/item/gun/energy/alien
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
@@ -302,7 +405,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
-/obj/item/abductor_baton/proc/toggle(mob/living/user=usr)
+/obj/item/abductor_baton/proc/toggle(mob/living/user = usr)
mode = (mode+1)%BATON_MODES
var/txt
switch(mode)
@@ -475,7 +578,6 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(BATON_PROBE)
to_chat(user, "The baton is in probing mode.")
-
/obj/item/radio/headset/abductor
name = "alien headset"
desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows."
@@ -537,6 +639,27 @@ Congratulations! You are now trained for invasive xenobiology research!"}
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
+/obj/item/bonegel/alien
+ name = "alien bone gel"
+ desc = "It smells like duct tape."
+ icon = 'icons/obj/abductor.dmi'
+ origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
+
+/obj/item/FixOVein/alien
+ name = "alien FixOVein"
+ desc = "Bloodless aliens would totally know how to stop internal bleeding...right?"
+ icon = 'icons/obj/abductor.dmi'
+ origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
+
+/obj/item/bonesetter/alien
+ name = "alien bone setter"
+ desc = "You're not sure you want to know whether or not aliens have bones."
+ icon = 'icons/obj/abductor.dmi'
+ origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
+
/obj/item/clothing/head/helmet/abductor
name = "agent headgear"
desc = "Abduct with style - spiky style. Prevents digital tracking."
@@ -553,6 +676,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
icon = 'icons/obj/abductor.dmi'
+ buildstacktype = /obj/item/stack/sheet/mineral/abductor
icon_state = "bed"
/obj/structure/table_frame/abductor
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index ebc14225cd7..8f058a872e6 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -14,28 +14,69 @@
var/active = 0
tough = TRUE //not easily broken by combat damage
+ var/mind_control_uses = 1
+ var/mind_control_duration = 1800
+ var/active_mind_control = FALSE
+
/obj/item/organ/internal/heart/gland/proc/ownerCheck()
if(ishuman(owner))
- return 1
+ return TRUE
if(!human_only && iscarbon(owner))
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/organ/internal/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
+/obj/item/organ/internal/heart/gland/proc/update_gland_hud()
+ if(!owner)
+ return
+ var/image/holder = owner.hud_list[GLAND_HUD]
+ var/icon/I = icon(owner.icon, owner.icon_state, owner.dir)
+ holder.pixel_y = I.Height() - world.icon_size
+ if(active_mind_control)
+ holder.icon_state = "hudgland_active"
+ else if(mind_control_uses)
+ holder.icon_state = "hudgland_ready"
+ else
+ holder.icon_state = "hudgland_spent"
+
+/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user)
+ if(!ownerCheck() || !mind_control_uses || active_mind_control)
+ return
+ mind_control_uses--
+ to_chat(owner, "You suddenly feel an irresistible compulsion to follow an order...")
+ to_chat(owner, "[command]")
+ active_mind_control = TRUE
+ log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
+ update_gland_hud()
+
+ addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
+
+/obj/item/organ/internal/heart/gland/proc/clear_mind_control()
+ if(!ownerCheck() || !active_mind_control)
+ return
+ to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.")
+ active_mind_control = FALSE
+ update_gland_hud()
/obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
+ var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR]
+ hud.remove_from_hud(owner)
+ clear_mind_control()
. = ..()
/obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
+ var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR]
+ hud.add_to_hud(owner)
+ update_gland_hud()
/obj/item/organ/internal/heart/gland/on_life()
if(!beating)
@@ -61,9 +102,12 @@
cooldown_high = 400
uses = -1
icon_state = "health"
+ mind_control_uses = 3
+ mind_control_duration = 3000
/obj/item/organ/internal/heart/gland/heals/activate()
to_chat(owner, "You feel curiously revitalized.")
+ owner.adjustToxLoss(-20)
owner.adjustBruteLoss(-20)
owner.adjustOxyLoss(-20)
owner.adjustFireLoss(-20)
@@ -73,6 +117,13 @@
cooldown_high = 1200
uses = -1
icon_state = "slime"
+ mind_control_uses = 1
+ mind_control_duration = 2400
+
+/obj/item/organ/internal/heart/gland/slime/insert(mob/living/carbon/M, special = 0)
+ ..()
+ owner.faction |= "slime"
+ owner.add_language("Bubblish")
/obj/item/organ/internal/heart/gland/slime/activate()
to_chat(owner, "You feel nauseous!")
@@ -84,10 +135,12 @@
/obj/item/organ/internal/heart/gland/mindshock
origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
- cooldown_low = 300
- cooldown_high = 300
+ cooldown_low = 400
+ cooldown_high = 700
uses = -1
icon_state = "mindshock"
+ mind_control_uses = 1
+ mind_control_duration = 6000
/obj/item/organ/internal/heart/gland/mindshock/activate()
to_chat(owner, "You get a headache.")
@@ -96,15 +149,25 @@
for(var/mob/living/carbon/H in orange(4,T))
if(H == owner)
continue
- to_chat(H, "You hear a buzz in your head.")
- H.AdjustConfused(20)
+ switch(pick(1,3))
+ if(1)
+ to_chat(H, "You hear a loud buzz in your head, silencing your thoughts!")
+ H.Stun(3)
+ if(2)
+ to_chat(H, "You hear an annoying buzz in your head.")
+ H.AdjustConfused(15)
+ H.adjustBrainLoss(5, 15)
+ if(3)
+ H.hallucination += 60
/obj/item/organ/internal/heart/gland/pop
cooldown_low = 900
cooldown_high = 1800
uses = -1
- human_only = 1
+ human_only = TRUE
icon_state = "species"
+ mind_control_uses = 5
+ mind_control_duration = 3000
/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
@@ -117,6 +180,8 @@
cooldown_high = 2400
uses = 1
icon_state = "vent"
+ mind_control_uses = 4
+ mind_control_duration = 1800
/obj/item/organ/internal/heart/gland/ventcrawling/activate()
to_chat(owner, "You feel very stretchy.")
@@ -128,23 +193,44 @@
cooldown_high = 2400
uses = 1
icon_state = "viral"
+ mind_control_uses = 1
+ mind_control_duration = 1800
/obj/item/organ/internal/heart/gland/viral/activate()
to_chat(owner, "You feel sick.")
- var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
- var/datum/disease/D = new virus_type()
- D.carrier = TRUE
- owner.viruses += D
- D.affected_mob = owner
- owner.med_hud_set_status()
+ var/datum/disease/advance/A = random_virus(pick(2, 6), 6)
+ A.carrier = TRUE
+ owner.ForceContractDisease(A)
+
+/obj/item/organ/internal/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
/obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting
origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
- cooldown_low = 900
- cooldown_high = 1600
+ cooldown_low = 800
+ cooldown_high = 1200
uses = 10
icon_state = "emp"
+ mind_control_uses = 3
+ mind_control_duration = 1800
/obj/item/organ/internal/heart/gland/emp/activate()
to_chat(owner, "You feel a spike of pain in your head.")
@@ -153,25 +239,71 @@
/obj/item/organ/internal/heart/gland/spiderman
cooldown_low = 450
cooldown_high = 900
- uses = 10
+ uses = -1
icon_state = "spider"
+ mind_control_uses = 2
+ mind_control_duration = 2400
/obj/item/organ/internal/heart/gland/spiderman/activate()
to_chat(owner, "You feel something crawling in your skin.")
owner.faction |= "spiders"
- new /obj/structure/spider/spiderling(owner.loc)
+ var/obj/structure/spider/spiderling/S = new(owner.loc)
+ S.master_commander = owner
/obj/item/organ/internal/heart/gland/egg
cooldown_low = 300
cooldown_high = 400
uses = -1
icon_state = "egg"
+ mind_control_uses = 2
+ mind_control_duration = 1800
/obj/item/organ/internal/heart/gland/egg/activate()
- to_chat(owner, "You lay an egg!")
- var/obj/item/reagent_containers/food/snacks/egg/egg = new(owner.loc)
- egg.reagents.add_reagent("sacid",20)
- egg.desc += " It smells bad."
+ owner.visible_message("[owner] [pick(EGG_LAYING_MESSAGES)]")
+ new /obj/item/reagent_containers/food/snacks/egg/gland(get_turf(owner))
+
+/obj/item/organ/internal/heart/gland/electric
+ cooldown_low = 800
+ cooldown_high = 1200
+ uses = -1
+ mind_control_uses = 2
+ mind_control_duration = 900
+
+/obj/item/organ/internal/heart/gland/electric/insert(mob/living/carbon/M, special = 0)
+ ..()
+ if(ishuman(owner))
+ owner.gene_stability += GENE_INSTABILITY_MODERATE // give them this gene for free
+ owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, TRUE)
+ genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED)
+
+/obj/item/organ/internal/heart/gland/electric/remove(mob/living/carbon/M, special = 0)
+ if(ishuman(owner))
+ owner.gene_stability -= GENE_INSTABILITY_MODERATE // but return it to normal once it's removed
+ owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, FALSE)
+ genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED)
+ return ..()
+
+/obj/item/organ/internal/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, 1, -1)
+ addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
+
+/obj/item/organ/internal/heart/gland/electric/proc/zap()
+ tesla_zap(owner, 4, 8000)
+ playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1)
+
+/obj/item/organ/internal/heart/gland/chem
+ cooldown_low = 50
+ cooldown_high = 50
+ uses = -1
+ mind_control_uses = 3
+ mind_control_duration = 1200
+
+/obj/item/organ/internal/heart/gland/chem/activate()
+ owner.reagents.add_reagent(get_random_reagent_id(), 2)
+ owner.adjustToxLoss(-2)
+ ..()
/obj/item/organ/internal/heart/gland/bloody
cooldown_low = 200
@@ -257,6 +389,8 @@
cooldown_high = 1800
origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3"
uses = -1
+ mind_control_uses = 1
+ mind_control_duration = 800
/obj/item/organ/internal/heart/gland/plasma/activate()
spawn(0)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index 10cd5473279..0e8c4d3c409 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -54,21 +54,22 @@
dat += "Agent Vest
"
dat += "Radio Silencer
"
dat += "Science Tool
"
+ dat += "Mental Interface Device
"
else
dat += "NO EXPERIMENT MACHINE DETECTED
"
- if(pad!=null)
+ if(pad)
dat += "Emergency Teleporter System."
dat += "Consider using primary observation console first."
dat += "Activate Teleporter
"
- if(gizmo!=null && gizmo.marked!=null)
+ if(gizmo && gizmo.marked)
dat += "Retrieve Mark
"
else
dat += "Retrieve Mark
"
else
dat += "NO TELEPAD DETECTED"
- if(vest!=null)
+ if(vest)
dat += "