diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index 21d26a44f02..6949d75e90f 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -490,6 +490,11 @@
icon_state = "green"
},
/area/holodeck/source_emptycourt)
+"cb" = (
+/obj/structure/closet/abductor,
+/obj/item/storage/belt/janitor/abductor/full,
+/turf/simulated/floor/plating/abductor,
+/area/abductor_ship)
"cc" = (
/obj/structure/window/reinforced{
dir = 1
@@ -46742,7 +46747,7 @@ aN
aN
lz
lz
-nr
+cb
bK
nr
lz
@@ -46756,7 +46761,7 @@ aN
aN
lz
lz
-nr
+cb
bK
nr
lz
@@ -50340,7 +50345,7 @@ aN
aN
lz
lz
-nr
+cb
bK
nr
lz
@@ -50354,7 +50359,7 @@ aN
aN
lz
lz
-nr
+cb
bK
nr
lz
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 9d85e02c738..6e7eefce904 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -3,7 +3,62 @@
#define MIND_DEVICE_MESSAGE 1
#define MIND_DEVICE_CONTROL 2
-//AGENT VEST
+#define BATON_STUN 0
+#define BATON_SLEEP 1
+#define BATON_CUFF 2
+#define BATON_PROBE 3
+#define BATON_MODES 4
+
+/*
+CONTENTS:
+1. AGENT GEAR
+2. SCIENTIST GEAR
+3. ENGINEERING TOOLS
+4. MEDICAL TOOLS
+5. JANITORIAL TOOLS
+6. STRUCTURES
+*/
+
+// Setting up abductor exclusivity.
+/obj/item/abductor
+ name = "generic abductor item"
+ icon = 'icons/obj/abductor.dmi'
+ desc = "You are not supposed to be able to see this. If you can see this, please make an issue report on GitHub."
+
+/obj/item/abductor/proc/AbductorCheck(user)
+ if(isabductor(user))
+ return TRUE
+ to_chat(user, "You can't figure how this works!")
+ 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
+ if(S.scientist)
+ return TRUE
+ to_chat(user, "You're not trained to use this!")
+ return FALSE
+
+/////////////////////////////////////////
+/////////////// AGENT GEAR //////////////
+/////////////////////////////////////////
+/obj/item/clothing/head/helmet/abductor
+ name = "agent headgear"
+ desc = "Abduct with style - spiky style. Prevents digital tracking."
+ icon_state = "alienhelmet"
+ item_state = "alienhelmet"
+ blockTracking = 1
+ origin_tech = "materials=7;magnets=4;abductor=3"
+ flags = BLOCKHAIR
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/clothing/species/vox/head.dmi'
+ )
+
/obj/item/clothing/suit/armor/abductor/vest
name = "agent vest"
desc = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth."
@@ -129,113 +184,6 @@
break
return ..()
-/obj/item/abductor
- icon = 'icons/obj/abductor.dmi'
-
-/obj/item/abductor/proc/AbductorCheck(user)
- if(isabductor(user))
- return TRUE
- to_chat(user, "You can't figure how this works!")
- 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
- 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_state = "gizmo_scan"
- item_state = "gizmo"
- origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
- var/mode = GIZMO_SCAN
- var/mob/living/marked = null
- var/obj/machinery/abductor/console/console
-
-/obj/item/abductor/gizmo/attack_self(mob/user)
- if(!ScientistCheck(user))
- 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"
- else
- mode = GIZMO_SCAN
- icon_state = "gizmo_scan"
- 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(!ScientistCheck(user))
- return
- if(!console)
- to_chat(user, "The device is not linked to console!")
- return
-
- switch(mode)
- if(GIZMO_SCAN)
- scan(M, user)
- if(GIZMO_MARK)
- mark(M, user)
-
-
-/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params)
- if(flag)
- return
- if(!ScientistCheck(user))
- return
- if(!console)
- to_chat(user, "The device is not linked to console!")
- return
-
- switch(mode)
- if(GIZMO_SCAN)
- scan(target, user)
- if(GIZMO_MARK)
- mark(target, user)
-
-/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user)
- if(ishuman(target))
- 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)
- to_chat(user, "This specimen is already marked!")
- return
- if(ishuman(target))
- if(isabductor(target))
- marked = target
- to_chat(user, "You mark [target] for future retrieval.")
- else
- prepare(target,user)
- else
- prepare(target,user)
-
-/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user)
- if(get_dist(target,user)>1)
- to_chat(user, "You need to be next to the specimen to prepare it for transport!")
- return
- to_chat(user, "You begin preparing [target] for transport...")
- if(do_after(user, 100, target = target))
- 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."
@@ -277,75 +225,6 @@
R.listening = FALSE // Prevents the radio from buzzing due to the EMP, preserving possible stealthiness.
R.emp_act(1)
-/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 = tgui_input_text(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 = tgui_input_text(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."
@@ -357,41 +236,6 @@
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
can_holster = TRUE
-/obj/item/paper/abductor
- name = "Dissection Guide"
- icon_state = "alienpaper_words"
- info = {"Dissection for Dummies
-
- 1.Acquire fresh specimen.
- 2.Put the specimen on operating table.
- 3.Apply scalpel to the chest, preparing for experimental dissection.
- 4.Apply scalpel to specimen's torso.
- 5.Clamp bleeders on specimen's torso with a hemostat.
- 6.Retract skin of specimen's torso with a retractor.
- 7.Saw through the specimen's torso with a saw.
- 8.Apply retractor again to specimen's torso.
- 9.Search through the specimen's torso with your hands to remove any superfluous organs.
- 10.Insert replacement gland (Retrieve one from gland storage).
- 11.Cauterize the patient's torso with a cautery.
- 12.Consider dressing the specimen back to not disturb the habitat.
- 13.Put the specimen in the experiment machinery.
- 14.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
- 15.You will receive one supply credit, and the subject will be counted towards your quota.
-
-Congratulations! You are now trained for invasive xenobiology research!"}
-
-/obj/item/paper/abductor/update_icon_state()
- return
-
-/obj/item/paper/abductor/AltClick()
- return
-
-#define BATON_STUN 0
-#define BATON_SLEEP 1
-#define BATON_CUFF 2
-#define BATON_PROBE 3
-#define BATON_MODES 4
-
/obj/item/abductor_baton
name = "advanced baton"
desc = "A quad-mode baton used for incapacitation and restraining of specimens."
@@ -590,6 +434,281 @@ Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/radio/headset/abductor/screwdriver_act()
return// Stops humans from disassembling abductor headsets.
+/////////////////////////////////////////
+///////////// SCIENTIST GEAR ////////////
+/////////////////////////////////////////
+/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_state = "gizmo_scan"
+ item_state = "gizmo"
+ origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
+ var/mode = GIZMO_SCAN
+ var/mob/living/marked = null
+ var/obj/machinery/abductor/console/console
+
+/obj/item/abductor/gizmo/attack_self(mob/user)
+ if(!ScientistCheck(user))
+ 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"
+ else
+ mode = GIZMO_SCAN
+ icon_state = "gizmo_scan"
+ 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(!ScientistCheck(user))
+ return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
+ switch(mode)
+ if(GIZMO_SCAN)
+ scan(M, user)
+ if(GIZMO_MARK)
+ mark(M, user)
+
+/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params)
+ if(flag)
+ return
+ if(!ScientistCheck(user))
+ return
+ if(!console)
+ to_chat(user, "The device is not linked to console!")
+ return
+
+ switch(mode)
+ if(GIZMO_SCAN)
+ scan(target, user)
+ if(GIZMO_MARK)
+ mark(target, user)
+
+/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user)
+ if(ishuman(target))
+ 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)
+ to_chat(user, "This specimen is already marked!")
+ return
+ if(ishuman(target))
+ if(isabductor(target))
+ marked = target
+ to_chat(user, "You mark [target] for future retrieval.")
+ else
+ prepare(target,user)
+ else
+ prepare(target,user)
+
+/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user)
+ if(get_dist(target,user)>1)
+ to_chat(user, "You need to be next to the specimen to prepare it for transport!")
+ return
+ to_chat(user, "You begin preparing [target] for transport...")
+ if(do_after(user, 100, target = target))
+ 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/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 = tgui_input_text(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 = tgui_input_text(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/paper/abductor
+ name = "Dissection Guide"
+ icon_state = "alienpaper_words"
+ info = {"Dissection for Dummies
+
+ 1.Acquire fresh specimen.
+ 2.Put the specimen on operating table.
+ 3.Apply scalpel to the chest, preparing for experimental dissection.
+ 4.Apply scalpel to specimen's torso.
+ 5.Clamp bleeders on specimen's torso with a hemostat.
+ 6.Retract skin of specimen's torso with a retractor.
+ 7.Saw through the specimen's torso with a saw.
+ 8.Apply retractor again to specimen's torso.
+ 9.Search through the specimen's torso with your hands to remove any superfluous organs.
+ 10.Insert replacement gland (Retrieve one from gland storage).
+ 11.Cauterize the patient's torso with a cautery.
+ 12.Consider dressing the specimen back to not disturb the habitat.
+ 13.Put the specimen in the experiment machinery.
+ 14.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
+ 15.You will receive one supply credit, and the subject will be counted towards your quota.
+
+Congratulations! You are now trained for invasive xenobiology research!"}
+
+/obj/item/paper/abductor/update_icon_state()
+ return
+
+/obj/item/paper/abductor/AltClick()
+ return
+
+/////////////////////////////////////////
+/////////// ENGINEERING TOOLS ///////////
+/////////////////////////////////////////
+/obj/item/screwdriver/abductor
+ name = "alien screwdriver"
+ desc = "An ultrasonic screwdriver."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "screwdriver"
+ usesound = 'sound/items/pshoom.ogg'
+ toolspeed = 0.1
+ random_color = FALSE
+
+/obj/item/wrench/abductor
+ name = "alien wrench"
+ desc = "A polarized wrench. It causes anything placed between the jaws to turn."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/empulse.ogg'
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=5;abductor=3"
+
+/obj/item/weldingtool/abductor
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ w_class = WEIGHT_CLASS_SMALL
+ light_intensity = 0
+ origin_tech = "plasmatech=5;engineering=5;abductor=3"
+ requires_fuel = FALSE
+ refills_over_time = TRUE
+ low_fuel_changes_icon = FALSE
+
+/obj/item/crowbar/abductor
+ name = "alien crowbar"
+ desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "crowbar"
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ toolspeed = 0.1
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "combat=4;engineering=4;abductor=3"
+
+/obj/item/wirecutters/abductor
+ name = "alien wirecutters"
+ desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=4;abductor=3"
+ random_color = FALSE
+
+/obj/item/wirecutters/abductor/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
+
+/obj/item/multitool/abductor
+ name = "alien multitool"
+ desc = "An omni-technological interface."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "multitool"
+ toolspeed = 0.1
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "magnets=5;engineering=5;abductor=3"
+
+/obj/item/multitool/abductor/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
+
+/obj/item/storage/belt/military/abductor
+ name = "agent belt"
+ desc = "A belt used by abductor agents."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "belt"
+ item_state = "security"
+
+/obj/item/storage/belt/military/abductor/full/populate_contents()
+ new /obj/item/screwdriver/abductor(src)
+ new /obj/item/wrench/abductor(src)
+ new /obj/item/weldingtool/abductor(src)
+ new /obj/item/crowbar/abductor(src)
+ new /obj/item/wirecutters/abductor(src)
+ new /obj/item/multitool/abductor(src)
+ new /obj/item/stack/cable_coil(src, 30, COLOR_WHITE)
+
+/////////////////////////////////////////
+/////////// MEDICAL TOOLS ///////////////
+/////////////////////////////////////////
/obj/item/scalpel/alien
name = "alien scalpel"
desc = "It's a gleaming sharp knife made out of silvery-green metal."
@@ -641,7 +760,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/FixOVein/alien
name = "alien FixOVein"
- desc = "Bloodless aliens would totally know how to stop internal bleeding...right?"
+ 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
@@ -653,21 +772,89 @@ Congratulations! You are now trained for invasive xenobiology research!"}
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."
- icon_state = "alienhelmet"
- item_state = "alienhelmet"
- blockTracking = 1
- origin_tech = "materials=7;magnets=4;abductor=3"
- flags = BLOCKHAIR
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+/////////////////////////////////////////
+//////////// JANITORIAL TOOLS ///////////
+/////////////////////////////////////////
+/obj/item/mop/advanced/abductor
+ name = "alien mop"
+ desc = "A collapsible mop clearly used by aliens to clean up any evidence of a close encounter. The head produces a constant supply of water when run over a surface, seemingly out of nowhere."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "mop_abductor"
+ mopcap = 100
+ origin_tech = "materials=3;engineering=3;abductor=3"
+ refill_rate = 50
+ refill_reagent = "water"
+ mopspeed = 10
- sprite_sheets = list(
- "Vox" = 'icons/mob/clothing/species/vox/head.dmi'
+/obj/item/soap/syndie/abductor
+ name = "alien soap"
+ desc = "Even bloodless aliens need to wash the grime off. Smells like gunpowder."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "soap_abductor"
+
+/obj/item/lightreplacer/bluespace/abductor
+ name = "alien light replacer"
+ desc = "It's important to keep all the mysterious lights on a UFO functional when flying over backwater country."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "lightreplacer_abductor"
+ origin_tech = "magnets=3;engineering=4;abductor=3"
+ max_uses = 40
+ uses = 20
+
+/obj/item/melee/flyswatter/abductor
+ name = "alien flyswatter"
+ desc = "For killing alien insects, obviously."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "flyswatter_abductor"
+ item_state = "flyswatter_abductor"
+ origin_tech = "abductor=1"
+ force = 2 // Twice as powerful thanks to alien technology!
+ throwforce = 2
+
+/obj/item/reagent_containers/spray/cleaner/safety/abductor // Essentially an Advanced Space Cleaner, but abductor-themed. For the implant.
+ name = "alien space cleaner"
+ desc = "An alien spray bottle contaning alien-brand non-foaming space cleaner! It only accepts space cleaner."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cleaner_abductor"
+ item_state = "cleaner_abductor"
+ volume = 500
+ spray_maxrange = 3
+ spray_currentrange = 3
+ list_reagents = list("cleaner" = 500)
+
+/obj/item/storage/belt/janitor/abductor
+ name = "alien janibelt"
+ desc = "A belt used to hold out-of-this-world cleaning supplies! Used by abductors to keep their ships clean."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "janibelt_abductor"
+ item_state = "security"
+ storage_slots = 7
+ can_hold = list(
+ /obj/item/grenade/chem_grenade/cleaner,
+ /obj/item/lightreplacer,
+ /obj/item/flashlight,
+ /obj/item/reagent_containers/spray,
+ /obj/item/soap,
+ /obj/item/holosign_creator/janitor,
+ /obj/item/melee/flyswatter,
+ /obj/item/storage/bag/trash,
+ /obj/item/push_broom,
+ /obj/item/door_remote/janikeyring,
+ /obj/item/mop/advanced/abductor
)
-// Operating Table / Beds / Lockers
+/obj/item/storage/belt/janitor/abductor/full/populate_contents()
+ new /obj/item/mop/advanced/abductor(src)
+ new /obj/item/soap/syndie/abductor(src)
+ new /obj/item/lightreplacer/bluespace/abductor(src)
+ new /obj/item/storage/bag/trash/bluespace(src)
+ new /obj/item/melee/flyswatter/abductor(src)
+ new /obj/item/reagent_containers/spray/cleaner/safety/abductor(src)
+ new /obj/item/holosign_creator/janitor(src)
+
+/////////////////////////////////////////
+/////////////// STRUCTURES //////////////
+/////////////////////////////////////////
/obj/structure/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
index 15cf5eeacde..82a903afa37 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
@@ -50,7 +50,6 @@
/datum/outfit/abductor/scientist
name = "Abductor Scientist"
-
backpack_contents = list(
/obj/item/abductor/gizmo = 1
)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 28cad65e92f..245656352e4 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -486,3 +486,24 @@
return
for(var/obj/item/reagent_containers/borghypo/F in R.module.modules)
F.emag_act()
+
+/obj/item/borg/upgrade/abductor_jani
+ name = "janitorial cyborg abductor upgrade"
+ desc = "An experimental upgrade that replaces a janitorial cyborg's tools with the abductor versions."
+ icon_state = "abductor_mod"
+ origin_tech = "biotech=6;materials=6;abductor=3"
+ require_module = TRUE
+ module_type = /obj/item/robot_module/janitor
+ items_to_replace = list(
+ /obj/item/mop/advanced/cyborg = /obj/item/mop/advanced/abductor,
+ /obj/item/soap = /obj/item/soap/syndie/abductor,
+ /obj/item/lightreplacer/cyborg = /obj/item/lightreplacer/bluespace/abductor,
+ /obj/item/melee/flyswatter = /obj/item/melee/flyswatter/abductor
+ )
+ items_to_add = list(
+ /obj/item/reagent_containers/spray/cleaner/safety/abductor
+ )
+ special_rechargables = list(
+ /obj/item/reagent_containers/spray/cleaner/safety/abductor,
+ /obj/item/lightreplacer/bluespace/abductor
+ )
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 4d58d09d211..c53a55e217a 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -35,16 +35,6 @@
toolspeed = 0.5
resistance_flags = FIRE_PROOF | ACID_PROOF
-/obj/item/crowbar/abductor
- name = "alien crowbar"
- desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
- icon = 'icons/obj/abductor.dmi'
- usesound = 'sound/weapons/sonic_jackhammer.ogg'
- icon_state = "crowbar"
- toolspeed = 0.1
- w_class = WEIGHT_CLASS_SMALL
- origin_tech = "combat=4;engineering=4;abductor=3"
-
/obj/item/crowbar/small
name = "miniature titanium crowbar"
desc = "A tiny, lightweight titanium crowbar. It fits handily in your pocket."
diff --git a/code/game/objects/items/tools/multitool.dm b/code/game/objects/items/tools/multitool.dm
index a44742ade66..080d58d57dc 100644
--- a/code/game/objects/items/tools/multitool.dm
+++ b/code/game/objects/items/tools/multitool.dm
@@ -171,19 +171,6 @@
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT) // Drones are linked to the station
-/obj/item/multitool/abductor
- name = "alien multitool"
- desc = "An omni-technological interface."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "multitool"
- toolspeed = 0.1
- w_class = WEIGHT_CLASS_SMALL
- origin_tech = "magnets=5;engineering=5;abductor=3"
-
-/obj/item/multitool/abductor/Initialize(mapload)
- . = ..()
- ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
-
#undef PROXIMITY_NONE
#undef PROXIMITY_ON_SCREEN
#undef PROXIMITY_NEAR
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 6f0587188fa..b9a79fbcfdd 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -90,15 +90,6 @@
return BRUTELOSS
-/obj/item/screwdriver/abductor
- name = "alien screwdriver"
- desc = "An ultrasonic screwdriver."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "screwdriver"
- usesound = 'sound/items/pshoom.ogg'
- toolspeed = 0.1
- random_color = FALSE
-
/obj/item/screwdriver/power
name = "hand drill"
desc = "A simple hand drill with a screwdriver bit attached."
diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm
index f4a03f9a632..239d13fd9a7 100644
--- a/code/game/objects/items/tools/welder.dm
+++ b/code/game/objects/items/tools/welder.dm
@@ -275,19 +275,6 @@
materials = list(MAT_METAL = 200, MAT_GLASS = 50)
low_fuel_changes_icon = FALSE
-/obj/item/weldingtool/abductor
- name = "alien welding tool"
- desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "welder"
- toolspeed = 0.1
- w_class = WEIGHT_CLASS_SMALL
- light_intensity = 0
- origin_tech = "plasmatech=5;engineering=5;abductor=3"
- requires_fuel = FALSE
- refills_over_time = TRUE
- low_fuel_changes_icon = FALSE
-
/obj/item/weldingtool/hugetank
name = "upgraded welding tool"
desc = "An upgraded welder based off the industrial welder."
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index f0b6f20aacc..7a2d0f8db30 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -98,19 +98,6 @@
random_color = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
-/obj/item/wirecutters/abductor
- name = "alien wirecutters"
- desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "cutters"
- toolspeed = 0.1
- origin_tech = "materials=5;engineering=4;abductor=3"
- random_color = FALSE
-
-/obj/item/wirecutters/abductor/Initialize(mapload)
- . = ..()
- ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
-
/obj/item/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires."
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 06188fd2244..64e9b3fe599 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -54,15 +54,6 @@
toolspeed = 0.5
resistance_flags = FIRE_PROOF | ACID_PROOF
-/obj/item/wrench/abductor
- name = "alien wrench"
- desc = "A polarized wrench. It causes anything placed between the jaws to turn."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "wrench"
- usesound = 'sound/effects/empulse.ogg'
- toolspeed = 0.1
- origin_tech = "materials=5;engineering=5;abductor=3"
-
/obj/item/wrench/power
name = "hand drill"
desc = "A simple powered drill with a bolt bit."
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9d11690e376..0750631f1ba 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -457,22 +457,6 @@
new /obj/item/grenade/empgrenade(src) // Two of each
new /obj/item/grenade/syndieminibomb(src) // One minibomb
-/obj/item/storage/belt/military/abductor
- name = "agent belt"
- desc = "A belt used by abductor agents."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "belt"
- item_state = "security"
-
-/obj/item/storage/belt/military/abductor/full/populate_contents()
- new /obj/item/screwdriver/abductor(src)
- new /obj/item/wrench/abductor(src)
- new /obj/item/weldingtool/abductor(src)
- new /obj/item/crowbar/abductor(src)
- new /obj/item/wirecutters/abductor(src)
- new /obj/item/multitool/abductor(src)
- new /obj/item/stack/cable_coil(src, 30, COLOR_WHITE)
-
/obj/item/storage/belt/military/assault
name = "assault belt"
desc = "A tactical assault belt."
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index dc855f327fc..d094f279d63 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -90,7 +90,7 @@
else if(mybag)
mybag.attackby(I, user, params)
else
- to_chat(usr, "You cannot interface your modules [src]!")
+ to_chat(usr, "You cannot interface your modules with [src]!")
/obj/structure/janitorialcart/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 5317afba5e9..1a5d501f77a 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -24,6 +24,9 @@
return ..()
/obj/structure/mopbucket/attackby(obj/item/W as obj, mob/user as mob, params)
+ if(W.is_robot_module())
+ to_chat(user, "You cannot interface your modules with [src]!")
+ return
if(istype(W, /obj/item/mop))
var/obj/item/mop/M = W
if(M.reagents.total_volume < M.reagents.maximum_volume)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 58345615762..e1aa7437c8b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -513,7 +513,8 @@
/obj/item/mop/advanced/cyborg,
/obj/item/lightreplacer/cyborg,
/obj/item/holosign_creator/janitor,
- /obj/item/extinguisher/mini
+ /obj/item/extinguisher/mini,
+ /obj/item/melee/flyswatter
)
emag_override_modules = list(/obj/item/reagent_containers/spray/cyborg_lube)
emag_modules = list(/obj/item/reagent_containers/spray/cyborg_facid, /obj/item/malfbroom)
diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm
index 4743fb63a17..f744f2d02b3 100644
--- a/code/modules/research/designs/janitorial_designs.dm
+++ b/code/modules/research/designs/janitorial_designs.dm
@@ -50,3 +50,33 @@
materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 6000, MAT_BLUESPACE = 300)
build_path = /obj/item/lightreplacer/bluespace
category = list("Janitorial")
+
+/datum/design/abductor_mop
+ name = "Alien Mop"
+ desc = "An advanced mop obtained through Abductor technology."
+ id = "alien_mop"
+ req_tech = list("materials" = 5, "engineering" = 5, "abductor" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500, MAT_DIAMOND = 1000)
+ build_path = /obj/item/mop/advanced/abductor
+ category = list("Janitorial")
+
+/datum/design/abductor_light_replacer
+ name = "Alien Light Replacer"
+ desc = "An advanced light replacer obtained through Abductor technology."
+ id = "alien_light_replacer"
+ req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 5, "abductor" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500, MAT_DIAMOND = 1000)
+ build_path = /obj/item/lightreplacer/bluespace/abductor
+ category = list("Janitorial")
+
+/datum/design/abductor_flyswatter
+ name = "Alien Flyswatter"
+ desc = "An advanced flyswatter obtained through Abductor technology."
+ id = "alien_flyswatter"
+ req_tech = list("combat" = 5, "abductor" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500, MAT_DIAMOND = 1000)
+ build_path = /obj/item/melee/flyswatter/abductor
+ category = list("Janitorial")
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 1de90e4c64d..e99af455881 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -1080,6 +1080,16 @@
construction_time = 12 SECONDS
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_abductor_jani
+ name = "Cyborg Upgrade (Abductor Janitorial Equipment)"
+ id = "borg_upgade_abductor_jani"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/abductor_jani
+ req_tech = list("biotech" = 7, "materials" = 7, "abductor" = 3)
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 7500, MAT_PLASMA = 2500, MAT_TITANIUM = 7500, MAT_DIAMOND = 5000) //Base abductor jani tools *5
+ construction_time = 12 SECONDS
+ category = list("Cyborg Upgrade Modules")
+
/datum/design/borg_upgrade_lavaproof
name = "Cyborg Upgrade (Lavaproof Chassis)"
id = "borg_upgrade_lavaproof"
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index ff3c7b741b4..b929547aa27 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -416,7 +416,7 @@
/datum/design/cyberimp_toolset_abductor
name = "Abductor Toolset Implant"
- desc = "An alien toolset, designed to be installed on subject's arm."
+ desc = "An alien toolset, designed to be installed on the subject's arm."
id = "ci-hacking"
req_tech = list("materials" = 6, "engineering" = 6, "plasmatech" = 6, "abductor" = 4)
build_type = PROTOLATHE | MECHFAB
@@ -425,6 +425,17 @@
build_path = /obj/item/organ/internal/cyberimp/arm/toolset_abductor
category = list("Medical")
+/datum/design/cyberimp_janitorial_abductor
+ name = "Abductor Janitorial Toolset Implant"
+ desc = "An alien janitorial toolset, designed to be installed on the subject's arm."
+ id = "ci-jani-abductor"
+ req_tech = list("materials" = 6, "engineering" = 6, "biotech" = 6, "abductor" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 20000, MAT_SILVER = 10000, MAT_PLASMA = 9000, MAT_TITANIUM = 8000, MAT_DIAMOND = 8000)
+ construction_time = 20 SECONDS
+ build_path = /obj/item/organ/internal/cyberimp/arm/janitorial_abductor
+ category = list("Medical")
+
/datum/design/cyberimp_jani_hud
name = "Janitor HUD Implant"
desc = "These cybernetic eye implants will display a filth HUD over everything you see. Wiggle eyes to control."
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 2c7806b9dce..f28c4636559 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -250,6 +250,17 @@
/obj/item/organ/internal/cyberimp/arm/toolset_abductor/l
parent_organ = "l_arm"
+/obj/item/organ/internal/cyberimp/arm/janitorial_abductor
+ name = "alien janitorial toolset implant"
+ desc = "A set of alien janitorial tools, designed to be installed on subject's arm."
+ origin_tech = "materials=5;engineering=5;biotech=5;powerstorage=4;abductor=3"
+ contents = newlist(/obj/item/mop/advanced/abductor, /obj/item/soap/syndie/abductor, /obj/item/lightreplacer/bluespace/abductor, /obj/item/holosign_creator/janitor, /obj/item/melee/flyswatter/abductor, /obj/item/reagent_containers/spray/cleaner/safety/abductor)
+ action_icon = list(/datum/action/item_action/organ_action/toggle = 'icons/obj/abductor.dmi')
+ action_icon_state = list(/datum/action/item_action/organ_action/toggle = "janibelt_abductor")
+
+/obj/item/organ/internal/cyberimp/arm/janitorial_abductor/l
+ parent_organ = "l_arm"
+
/obj/item/organ/internal/cyberimp/arm/esword
name = "arm-mounted energy blade"
desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy."
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
index 884b23465cb..c4f2e189a21 100644
Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
index 8ddb7703cf6..4db565e94ba 100644
Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons_lefthand.dmi b/icons/mob/inhands/weapons_lefthand.dmi
index a5c22c4cef8..6815485c27b 100644
Binary files a/icons/mob/inhands/weapons_lefthand.dmi and b/icons/mob/inhands/weapons_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons_righthand.dmi b/icons/mob/inhands/weapons_righthand.dmi
index afcbe22ddcc..612365aed42 100644
Binary files a/icons/mob/inhands/weapons_righthand.dmi and b/icons/mob/inhands/weapons_righthand.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index ba5ee59349d..48de9bc1858 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ