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