diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 5a96b6e954f..97cea621dae 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -124,6 +124,9 @@
#define islarva(A) (istype((A), /mob/living/carbon/alien/larva))
#define isslime(A) (istype((A), /mob/living/carbon/slime))
+//Human sub-species
+#define isabductor(A) (is_species(A, "Abductor"))
+
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 2c989753bf9..0abf2ac1af3 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -363,6 +363,13 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul
if(progress)
qdel(progbar)
+/proc/is_species(A, species_name)
+ . = FALSE
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.get_species() == species_name)
+ . = TRUE
+
/proc/admin_mob_info(mob/M, mob/user = usr)
if(!ismob(M))
to_chat(user, "This can only be used on instances of type /mob")
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 13a9e4ec814..0d04c3ee615 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -252,7 +252,7 @@
V.flags |= NODROP
agent.equip_to_slot_or_del(V, slot_wear_suit)
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_in_backpack)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt)
@@ -376,9 +376,23 @@
explanation_text = "Steal all"
/datum/objective/abductee/steal/New()
- var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap"))
+ var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
explanation_text+=" [target]."
+/datum/objective/abductee/paint
+ explanation_text = "The station is hideous. You must color it all"
+
+/datum/objective/abductee/paint/New()
+ var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
+ explanation_text+= " [color]!"
+
+/datum/objective/abductee/speech
+ explanation_text = "Your brain is broken... you can only communicate in"
+
+/datum/objective/abductee/speech/New()
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ explanation_text+= " [style]."
+
/datum/objective/abductee/capture
explanation_text = "Capture"
@@ -418,16 +432,16 @@
explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
/datum/objective/abductee/floors
- explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass."
+ explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
/datum/objective/abductee/POWERUNLIMITED
explanation_text = "Flood the station's powernet with as much electricity as you can."
/datum/objective/abductee/pristine
- explanation_text = "Ensure the station is in absolutely pristine condition."
+ explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
-/datum/objective/abductee/window
- explanation_text = "Replace all normal windows with reinforced windows."
+/datum/objective/abductee/nowalls
+ explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
/datum/objective/abductee/nations
explanation_text = "Ensure your department prospers over all else."
@@ -435,17 +449,11 @@
/datum/objective/abductee/abductception
explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
-/datum/objective/abductee/ghosts
- explanation_text = "Conduct a seance with the spirits of the afterlife."
-
/datum/objective/abductee/summon
- explanation_text = "Conduct a ritual to summon an elder god."
+ explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
/datum/objective/abductee/machine
- explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power."
-
-/datum/objective/abductee/prevent
- explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened."
+ explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
/datum/objective/abductee/calling
explanation_text = "Call forth a spirit from the other side."
@@ -453,7 +461,7 @@
/datum/objective/abductee/calling/New()
var/mob/dead/D = pick(dead_mob_list)
if(D)
- explanation_text = "You know that [D] has perished. Call them from the spirit realm."
+ explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
/datum/objective/abductee/social_experiment
explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
@@ -465,7 +473,7 @@
explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
/datum/objective/abductee/defect
- explanation_text = "Defect from your employer."
+ explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
/datum/objective/abductee/promote
explanation_text = "Climb the corporate ladder all the way to the top!"
@@ -478,3 +486,33 @@
/datum/objective/abductee/pragnant
explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
+
+/datum/objective/abductee/engine
+ explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
+
+/datum/objective/abductee/music
+ explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
+
+/datum/objective/abductee/clown
+ explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
+
+/datum/objective/abductee/party
+ explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
+
+/datum/objective/abductee/pets
+ explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
+
+/datum/objective/abductee/conspiracy
+ explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
+
+/datum/objective/abductee/stalker
+ explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
+
+/datum/objective/abductee/narrator
+ explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
+
+/datum/objective/abductee/lurve
+ explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
+
+/datum/objective/abductee/sixthsense
+ explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 8f026650b7c..2a72c4a9b9b 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -11,7 +11,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
- origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3"
+ 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)
var/mode = VEST_STEALTH
@@ -34,7 +34,6 @@
mode = VEST_STEALTH
armor = stealth_armor
icon_state = "vest_stealth"
-
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_wear_suit()
@@ -64,7 +63,6 @@
M.overlays = disguise.overlays
M.update_inv_r_hand()
M.update_inv_l_hand()
- return
/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth()
if(!stealth_active)
@@ -77,7 +75,6 @@
M.name_override = null
M.overlays.Cut()
M.regenerate_icons()
- return
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction()
DeactivateStealth()
@@ -115,19 +112,11 @@
if(combat_cooldown==initial(combat_cooldown))
processing_objects.Remove(src)
-/obj/item/device/abductor/proc/IsAbductor(user)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
- return 0
-
/obj/item/device/abductor/proc/AbductorCheck(user)
- if(IsAbductor(user))
- return 1
+ if(isabductor(user))
+ return TRUE
to_chat(user, "You can't figure how this works!")
- return 0
+ return FALSE
/obj/item/device/abductor/proc/ScientistCheck(user)
var/mob/living/carbon/human/H = user
@@ -140,7 +129,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "gizmo"
- origin_tech = "materials=5;magnets=5;bluespace=6;abductor=4"
+ 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
@@ -187,7 +176,7 @@
mark(target, user)
/obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user)
- if(istype(target,/mob/living/carbon/human))
+ if(ishuman(target))
if(console!=null)
console.AddSnapshot(target)
to_chat(user, "You scan [target] and add them to the database.")
@@ -196,8 +185,8 @@
if(marked == target)
to_chat(user, "This specimen is already marked!")
return
- if(istype(target,/mob/living/carbon/human))
- if(IsAbductor(target))
+ if(ishuman(target))
+ if(isabductor(target))
marked = target
to_chat(user, "You mark [target] for future retrieval.")
else
@@ -221,7 +210,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "silencer"
- origin_tech = "materials=5;magnets=5;abductor=3"
+ origin_tech = "materials=4;programming=7;abductor=3"
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
if(!AbductorCheck(user))
@@ -258,61 +247,15 @@
if(!istype(I,/obj/item/device/radio/headset))
r.broadcasting = 0 //goddamned headset hacks
-
-/obj/item/weapon/implant/abductor
- name = "recall implant"
- desc = "Returns you to the mothership."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "implant"
- activated = 1
- origin_tech = "materials=2;biotech=3;magnets=4;bluespace=5;abductor=5"
- var/obj/machinery/abductor/pad/home
- var/cooldown = 30
-
-/obj/item/weapon/implant/abductor/activate()
- if(cooldown == initial(cooldown))
- home.Retrieve(imp_in,1)
- cooldown = 0
- processing_objects.Add(src)
- else
- to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!")
- return
-
-/obj/item/weapon/implant/abductor/process()
- if(cooldown < initial(cooldown))
- cooldown++
- if(cooldown == initial(cooldown))
- processing_objects.Remove(src)
-
-/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user)
- if(..())
- var/obj/machinery/abductor/console/console
- if(ishuman(source))
- var/mob/living/carbon/human/H = source
- if(H.get_species() == "Abductor")
- console = get_team_console(H.mind.abductor.team)
- home = console.pad
-
- if(!home)
- console = get_team_console(pick(1, 2, 3, 4))
- home = console.pad
- return 1
-
-/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
- var/obj/machinery/abductor/console/console
- for(var/obj/machinery/abductor/console/c in abductor_equipment)
- if(c.team == team)
- console = c
- break
- return console
-
-/obj/item/weapon/gun/energy/decloner/alien
+/obj/item/weapon/gun/energy/alien
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
+ restricted_species = list("Abductor")
icon_state = "alienpistol"
item_state = "alienpistol"
- origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3"
- restricted_species = list("Abductor")
+ origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/weapon/paper/abductor
name = "Dissection Guide"
@@ -321,25 +264,29 @@
1.Acquire fresh specimen.
- 2.Put the specimen on operating table
- 3.Apply scalpel to the chest, preparing for dissection
- 4.Apply scalpel to specimen torso
- 5.Clamp bleeders on the specimen's torso
- 6.Retract skin from specimen's torso
- 7.Saw through the specimen's torso
- 8.Retract skin from specimen's torso again
- 9.Search through the specimen's torso with your hands to remove their heart
- 10.Insert replacement gland (Retrieve one from gland storage)
- 11.Cauterize the patient's torso
- 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 and follow displayed instructions
+ 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 xenobiology research!"}
+Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/weapon/paper/abductor/update_icon()
return
+/obj/item/weapon/paper/abductor/AltClick()
+ return
+
#define BATON_STUN 0
#define BATON_SLEEP 1
#define BATON_CUFF 2
@@ -354,9 +301,9 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodStun"
item_state = "wonderprod"
slot_flags = SLOT_BELT
- origin_tech = "materials=6;combat=5;biotech=7;abductor=4"
+ origin_tech = "materials=4;combat=4;biotech=7;abductor=4"
force = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr)
@@ -393,16 +340,8 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodProbe"
item_state = "wonderprodProbe"
-/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user)
- if(!ishuman(user))
- return 0
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
-
/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user)
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
if(isrobot(target))
@@ -434,7 +373,7 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
toggle(user)
- if(istype(user,/mob/living/carbon/human))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
@@ -456,10 +395,9 @@ Congratulations! You are now trained for xenobiology research!"}
H.forcesay(hit_appends)
add_logs(user, L, "stunned")
- return
/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
- if(L.stunned)
+ if(L.stunned || L.sleeping)
L.visible_message("[user] has induced sleep in [L] with [src]!", \
"You suddenly feel very drowsy!")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
@@ -470,7 +408,6 @@ Congratulations! You are now trained for xenobiology research!"}
to_chat(user, "Sleep inducement works fully only on stunned specimens! ")
L.visible_message("[user] tried to induce sleep in [L] with [src]!", \
"You suddenly feel drowsy!")
- return
/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
if(!iscarbon(L))
@@ -488,7 +425,6 @@ Congratulations! You are now trained for xenobiology research!"}
add_logs(user, C, "handcuffed")
else
to_chat(user, "You fail to handcuff [C].")
- return
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
L.visible_message("[user] probes [L] with [src]!", \
@@ -502,7 +438,7 @@ Congratulations! You are now trained for xenobiology research!"}
species = "[H.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
- var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
if(temp)
helptext = "Experimental gland detected!"
else
@@ -517,7 +453,7 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "cuff_white" // Needs sprite
breakouttime = 450
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
- origin_tech = "materials=2;magnets=5;abductor=2"
+ origin_tech = "materials=4;magnets=5;abductor=2"
/obj/item/weapon/restraints/handcuffs/energy/used
desc = "energy discharge"
@@ -545,36 +481,42 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/scalpel/alien
name = "alien scalpel"
+ desc = "It's a gleaming sharp knife made out of silvery-green metal."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/hemostat/alien
name = "alien hemostat"
+ desc = "You've never seen this before."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/retractor/alien
name = "alien retractor"
+ desc = "You're not sure if you want the veil pulled back."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/circular_saw/alien
name = "alien saw"
+ desc = "Do the aliens also lose this, and need to find an alien hatchet?"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/surgicaldrill/alien
name = "alien drill"
+ desc = "Maybe alien surgeons have finally found a use for the drill."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/cautery/alien
name = "alien cautery"
+ desc = "Why would bloodless aliens have a tool to stop bleeding? Unless..."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
@@ -585,17 +527,12 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "alienhelmet"
item_state = "alienhelmet"
blockTracking = 1
- origin_tech = "materials=6;magnets=5;abductor=3"
+ origin_tech = "materials=7;magnets=4;abductor=3"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
// Operating Table / Beds / Lockers
-/obj/machinery/optable/abductor
- icon = 'icons/obj/abductor.dmi'
- icon_state = "bed"
- no_icon_updates = 1 //no icon updates for this; it's static.
-
/obj/structure/stool/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
@@ -628,6 +565,16 @@ Congratulations! You are now trained for xenobiology research!"}
new /obj/structure/table/abductor(src.loc)
qdel(src)
return
+ if(istype(I, /obj/item/stack/sheet/mineral/silver))
+ var/obj/item/stack/sheet/P = I
+ if(P.get_amount() < 1)
+ to_chat(user, "You need one sheet of silver to do this!")
+ return
+ to_chat(user, "You start adding [P] to [src]...")
+ if(do_after(user, 50, target = src))
+ P.use(1)
+ new /obj/machinery/optable/abductor(loc)
+ qdel(src)
/obj/structure/table/abductor
name = "alien table"
@@ -637,10 +584,15 @@ Congratulations! You are now trained for xenobiology research!"}
canSmoothWith = null
parts = /obj/item/stack/sheet/mineral/abductor
+/obj/machinery/optable/abductor
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "bed"
+ no_icon_updates = 1 //no icon updates for this; it's static.
+
/obj/structure/closet/abductor
name = "alien locker"
desc = "Contains secrets of the universe."
icon_state = "abductor"
icon_closed = "abductor"
icon_opened = "abductoropen"
- material_drop = /obj/item/stack/sheet/mineral/abductor
+ material_drop = /obj/item/stack/sheet/mineral/abductor
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index 6021140b79f..18d073d6077 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -15,9 +15,9 @@
return 0
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if(!(H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
- return 0
- return 1
+ if((H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
+ return 1
+ return 0
/datum/surgery_step/internal/extract_organ
@@ -47,11 +47,11 @@
return 1
else
to_chat(user, "You don't find anything in [target]'s [target_zone]!")
- return 0
+ return 1
/datum/surgery_step/internal/gland_insert
name = "insert gland"
- allowed_tools = list(/obj/item/organ/internal/gland = 100)
+ allowed_tools = list(/obj/item/organ/internal/heart/gland = 100)
time = 32
/datum/surgery_step/internal/gland_insert/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -61,6 +61,6 @@
/datum/surgery_step/internal/gland_insert/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].")
user.drop_item()
- var/obj/item/organ/internal/gland/gland = tool
+ var/obj/item/organ/internal/heart/gland/gland = tool
gland.insert(target, 2)
return 1
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index d3e60b2fb98..1c481e7c333 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -1,12 +1,11 @@
-/obj/item/organ/internal/gland
+/obj/item/organ/internal/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/abductor.dmi'
- parent_organ = "chest"
- slot = "gland"
icon_state = "gland"
status = ORGAN_ROBOT
- origin_tech = "materials=4;biotech=5;abductor=3"
+ origin_tech = "materials=4;biotech=7;abductor=3"
+ beating = TRUE
var/cooldown_low = 300
var/cooldown_high = 300
var/next_activation = 0
@@ -16,30 +15,33 @@
tough = 1 //not easily broken by combat damage
sterile = 1 //not very germy
-/obj/item/organ/internal/gland/proc/ownerCheck()
+/obj/item/organ/internal/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return 1
if(!human_only && iscarbon(owner))
return 1
return 0
-/obj/item/organ/internal/gland/proc/Start()
+/obj/item/organ/internal/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
-/obj/item/organ/internal/gland/remove(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
- ..()
+ . = ..()
-/obj/item/organ/internal/gland/insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
-/obj/item/organ/internal/gland/on_life()
+/obj/item/organ/internal/heart/gland/on_life()
+ if(!beating)
+ // alien glands are immune to stopping.
+ beating = TRUE
if(!active)
return
if(!ownerCheck())
@@ -52,30 +54,28 @@
if(!uses)
active = 0
-/obj/item/organ/internal/gland/proc/activate()
+/obj/item/organ/internal/heart/gland/proc/activate()
return
-/obj/item/organ/internal/gland/heals
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/heals
cooldown_low = 200
cooldown_high = 400
uses = -1
icon_state = "health"
-/obj/item/organ/internal/gland/heals/activate()
+/obj/item/organ/internal/heart/gland/heals/activate()
to_chat(owner, "You feel curiously revitalized.")
owner.adjustBruteLoss(-20)
owner.adjustOxyLoss(-20)
owner.adjustFireLoss(-20)
-/obj/item/organ/internal/gland/slime
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/slime
cooldown_low = 600
cooldown_high = 1200
uses = -1
icon_state = "slime"
-/obj/item/organ/internal/gland/slime/activate()
+/obj/item/organ/internal/heart/gland/slime/activate()
to_chat(owner, "You feel nauseous!")
owner.vomit(20)
@@ -83,14 +83,14 @@
Slime.Friends = list(owner)
Slime.Leader = owner
-/obj/item/organ/internal/gland/mindshock
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/obj/item/organ/internal/heart/gland/mindshock
+ origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 300
cooldown_high = 300
uses = -1
icon_state = "mindshock"
-/obj/item/organ/internal/gland/mindshock/activate()
+/obj/item/organ/internal/heart/gland/mindshock/activate()
to_chat(owner, "You get a headache.")
var/turf/T = get_turf(owner)
@@ -100,40 +100,37 @@
to_chat(H, "You hear a buzz in your head.")
H.AdjustConfused(20)
-/obj/item/organ/internal/gland/pop
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/pop
cooldown_low = 900
cooldown_high = 1800
- uses = 6
+ uses = -1
human_only = 1
icon_state = "species"
-/obj/item/organ/internal/gland/pop/activate()
+/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona")
owner.set_species(species)
-/obj/item/organ/internal/gland/ventcrawling
+/obj/item/organ/internal/heart/gland/ventcrawling
origin_tech = "materials=4;biotech=5;bluespace=3;abductor=3"
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "vent"
-/obj/item/organ/internal/gland/ventcrawling/activate()
+/obj/item/organ/internal/heart/gland/ventcrawling/activate()
to_chat(owner, "You feel very stretchy.")
owner.ventcrawler = 2
- return
-/obj/item/organ/internal/gland/viral
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/viral
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "viral"
-/obj/item/organ/internal/gland/viral/activate()
+/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()
@@ -144,51 +141,49 @@
owner.med_hud_set_status()
-/obj/item/organ/internal/gland/emp //TODO : Replace with something more interesting
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/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
uses = 10
icon_state = "emp"
-/obj/item/organ/internal/gland/emp/activate()
+/obj/item/organ/internal/heart/gland/emp/activate()
to_chat(owner, "You feel a spike of pain in your head.")
empulse(get_turf(owner), 2, 5, 1)
-/obj/item/organ/internal/gland/spiderman
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/spiderman
cooldown_low = 450
cooldown_high = 900
uses = 10
icon_state = "spider"
-/obj/item/organ/internal/gland/spiderman/activate()
+/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)
-/obj/item/organ/internal/gland/egg
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/egg
cooldown_low = 300
cooldown_high = 400
uses = -1
icon_state = "egg"
-/obj/item/organ/internal/gland/egg/activate()
+/obj/item/organ/internal/heart/gland/egg/activate()
to_chat(owner, "You lay an egg!")
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
egg.reagents.add_reagent("sacid",20)
egg.desc += " It smells bad."
-/obj/item/organ/internal/gland/bloody
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/bloody
cooldown_low = 200
cooldown_high = 400
uses = -1
-/obj/item/organ/internal/gland/bloody/activate()
- owner.adjustBruteLoss(15)
-
+/obj/item/organ/internal/heart/gland/bloody/activate()
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ H.drip(200)
owner.visible_message("[owner]'s skin erupts with blood!",\
"Blood pours from your skin!")
@@ -202,22 +197,22 @@
H.w_uniform.add_blood(owner)
H.update_inv_w_uniform(0)
-/obj/item/organ/internal/gland/bodysnatch
- origin_tech = "materials=4;biotech=7;abductor=3"
+/obj/item/organ/internal/heart/gland/bodysnatch
cooldown_low = 600
cooldown_high = 600
human_only = 1
uses = 1
-/obj/item/organ/internal/gland/bodysnatch/activate()
+/obj/item/organ/internal/heart/gland/bodysnatch/activate()
to_chat(owner, "You feel something moving around inside you...")
//spawn cocoon with clone greytide snpc inside
if(ishuman(owner))
var/obj/effect/cocoon/abductor/C = new (get_turf(owner))
C.Copy(owner)
C.Start()
- owner.gib()
- return
+ owner.adjustBruteLoss(40)
+ var/turf/T = get_turf(owner)
+ T.add_blood_floor(src)
/obj/effect/cocoon/abductor
name = "slimy cocoon"
@@ -232,11 +227,18 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
- clone.body_accessory = H.body_accessory
clone.dna = owner_dna.Clone()
clone.set_species(H.species.name)
+ clone.body_accessory = H.body_accessory
domutcheck(clone)
+ for(var/obj/item/I in clone)
+ if(istype(I, /obj/item/weapon/implant))
+ continue
+ if(istype(I, /obj/item/organ))
+ continue
+ qdel(I)
+
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\
@@ -245,7 +247,7 @@
for(var/slot in slots)
var/obj/item/I = H.get_item_by_slot(slot)
if(I)
- clone.equip_to_slot_if_possible(I,slot)
+ clone.equip_to_slot_or_del(new I.type(clone), slot)
/obj/effect/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
@@ -259,22 +261,25 @@
M.forceMove(get_turf(src))
qdel(src)
-/obj/item/organ/internal/gland/plasma
- cooldown_low = 2400
- cooldown_high = 3000
- origin_tech = "materials=4;biotech=5;plasmatech=3;abductor=3"
- uses = 1
-/obj/item/organ/internal/gland/plasma/activate()
- to_chat(owner, "You feel bloated.")
- sleep(150)
- if(!owner) return
- to_chat(owner, "A massive stomachache overcomes you.")
- sleep(50)
- if(!owner) return
- owner.visible_message("[owner] explodes in a cloud of plasma!")
- var/turf/simulated/T = get_turf(owner)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300)
- owner.gib()
- return
+/obj/item/organ/internal/heart/gland/plasma
+ cooldown_low = 1200
+ cooldown_high = 1800
+ origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3"
+ uses = -1
+
+/obj/item/organ/internal/heart/gland/plasma/activate()
+ spawn(0)
+ to_chat(owner, "You feel bloated.")
+ sleep(150)
+ if(!owner)
+ return
+ to_chat(owner, "A massive stomachache overcomes you.")
+ sleep(50)
+ if(!owner)
+ return
+ owner.visible_message("[owner] vomits a cloud of plasma!")
+ var/turf/simulated/T = get_turf(owner)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,50)
+ owner.vomit()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 24b02aea489..219ae4b6e54 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -49,15 +49,12 @@
set_droppoint_action.target = console
set_droppoint_action.Grant(user)
-/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
if(H.mind && H.mind.abductor)
return H.mind.abductor.scientist
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
- if(!iscarbon(user) || !IsAbductor(user))
+ if(!isabductor(user))
return
return ..()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index 3922b80a9e5..3a93f8abc75 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -11,21 +11,6 @@
abductor_equipment.Remove(src)
return ..()
-/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
-/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.agent
- return 0
-
-/obj/machinery/abductor/proc/IsScientist(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
- return 0
-
//Console
/obj/machinery/abductor/console
@@ -33,8 +18,8 @@
desc = "Ship command center."
icon = 'icons/obj/abductor.dmi'
icon_state = "console"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
var/obj/item/device/abductor/gizmo/gizmo
var/obj/item/clothing/suit/armor/abductor/vest/vest
var/obj/machinery/abductor/experiment/experiment
@@ -49,7 +34,7 @@
/obj/machinery/abductor/console/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
to_chat(user, "You start mashing alien buttons at random!")
if(do_after(user, 100, target = src))
TeleporterSend()
@@ -60,10 +45,13 @@
if(experiment != null)
var/points = experiment.points
+ var/credits = experiment.credits
dat += "Collected Samples : [points]
"
+ dat += "Gear Credits: [credits]
"
dat += "Transfer data in exchange for supplies:
"
dat += "Advanced Baton
"
dat += "Agent Helmet
"
+ dat += "Agent Vest
"
dat += "Radio Silencer
"
dat += "Science Tool
"
else
@@ -92,13 +80,13 @@
dat+="
"
dat += "Select Agent Vest Disguise
"
+ dat += "[vest.flags & NODROP ? "Unlock" : "Lock"] Vest
"
else
dat += "NO AGENT VEST DETECTED"
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
- return
/obj/machinery/abductor/console/Topic(href, href_list)
if(..())
@@ -111,6 +99,8 @@
TeleporterRetrieve()
else if(href_list["flip_vest"])
FlipVest()
+ else if(href_list["toggle_vest"])
+ toggle_vest()
else if(href_list["select_disguise"])
SelectDisguise()
else if(href_list["dispense"])
@@ -123,37 +113,28 @@
Dispense(/obj/item/device/abductor/silencer)
if("tool")
Dispense(/obj/item/device/abductor/gizmo)
- src.updateUsrDialog()
+ if("vest")
+ Dispense(/obj/item/clothing/suit/armor/abductor/vest)
+ updateUsrDialog()
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
if(gizmo!=null && pad!=null && gizmo.marked)
pad.Retrieve(gizmo.marked)
- return
/obj/machinery/abductor/console/proc/TeleporterSend()
if(pad!=null)
pad.Send()
- return
/obj/machinery/abductor/console/proc/FlipVest()
if(vest!=null)
vest.flip_mode()
- return
-/obj/machinery/abductor/console/proc/SelectDisguise(remote=0)
- var/list/entries = list()
- var/tempname
- var/datum/icon_snapshot/temp
- for(var/i = 1; i <= disguises.len; i++)
- temp = disguises[i]
- tempname = temp.name
- entries["[tempname]"] = disguises[i]
- var/entry_name = input( "Choose Disguise", "Disguise") in entries
- var/datum/icon_snapshot/chosen = entries[entry_name]
+/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
+ var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
+ var/datum/icon_snapshot/chosen = disguises[entry_name]
if(chosen && (remote || in_range(usr,src)))
vest.SetDisguise(chosen)
- return
/obj/machinery/abductor/console/proc/SetDroppoint(turf/location,user)
if(!istype(location))
@@ -188,13 +169,11 @@
entry.icon = target.icon
entry.icon_state = target.icon_state
entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER))
- for(var/i=1,i<=disguises.len,i++)
- var/datum/icon_snapshot/temp = disguises[i]
- if(temp.name == entry.name)
- disguises[i] = entry
- return
- disguises.Add(entry)
- return
+ //Update old disguise instead of adding new one
+ if(disguises[entry.name])
+ disguises[entry.name] = entry
+ return
+ disguises[entry.name] = entry
/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/device/abductor/gizmo))
@@ -205,13 +184,16 @@
else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest))
var/obj/item/clothing/suit/armor/abductor/vest/V = O
to_chat(user, "You link the vest to the console.")
+ if(istype(vest))
+ if(vest.flags & NODROP)
+ toggle_vest()
vest = V
else
..()
/obj/machinery/abductor/console/proc/Dispense(item,cost=1)
- if(experiment && experiment.points >= cost)
- experiment.points-=cost
+ if(experiment && experiment.credits >= cost)
+ experiment.credits -=cost
atom_say("Incoming supply!")
if(pad)
flick("alien-pad", pad)
@@ -220,4 +202,9 @@
new item(src.loc)
else
atom_say("Insufficent data!")
- return
+
+/obj/machinery/abductor/console/proc/toggle_vest()
+ vest.flags ^= NODROP
+ var/mob/M = vest.loc
+ if(istype(M))
+ to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].")
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
index 4ead0232a2f..2b6103632f5 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
@@ -14,7 +14,8 @@
return rgb(rand(0,255),rand(0,255),rand(0,255))
/obj/machinery/abductor/gland_dispenser/New()
- gland_types = subtypesof(/obj/item/organ/internal/gland)
+ ..()
+ gland_types = subtypesof(/obj/item/organ/internal/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
amounts = new/list(gland_types.len)
@@ -25,7 +26,7 @@
/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
user.set_machine(src)
var/box_css = {"
@@ -59,13 +60,15 @@
return
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W, /obj/item/organ/internal/gland))
+ if(istype(W, /obj/item/organ/internal/heart/gland))
if(!user.drop_item())
return
W.forceMove(src)
for(var/i=1,i<=gland_colors.len,i++)
if(gland_types[i] == W.type)
amounts[i]++
+ else
+ ..()
/obj/machinery/abductor/gland_dispenser/Topic(href, href_list)
if(..())
@@ -74,7 +77,7 @@
if(href_list["dispense"])
Dispense(text2num(href_list["dispense"]))
- src.updateUsrDialog()
+ updateUsrDialog()
/obj/machinery/abductor/gland_dispenser/proc/Dispense(count)
if(amounts[count]>0)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 755bd21e2e5..44b2a431c7b 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -6,6 +6,7 @@
anchored = 1
density = 1
var/points = 0
+ var/credits = 0
var/list/history = list()
var/list/abductee_minds = list()
var/flash = " - || - "
@@ -19,10 +20,10 @@
/obj/machinery/abductor/experiment/MouseDrop_T(mob/living/carbon/human/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
return
- if(IsAbductor(target))
+ if(isabductor(target))
return
if(occupant)
- to_chat(user, "\The [src] is already occupied.")
+ to_chat(user, "[src] is already occupied.")
return //occupied
if(target.buckled)
return
@@ -118,7 +119,7 @@
if(H.stat == DEAD)
atom_say("Specimen deceased - please provide fresh sample.")
return "Specimen deceased."
- var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/GlandTest = locate() in H.internal_organs
if(!GlandTest)
atom_say("Experimental dissection not detected!")
return "No glands detected!"
@@ -147,7 +148,7 @@
obj_count++
ticker.mode.update_abductor_icons_added(H.mind)
- for(var/obj/item/organ/internal/gland/G in H.internal_organs)
+ for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs)
G.Start()
point_reward++
if(point_reward > 0)
@@ -155,6 +156,7 @@
SendBack(H)
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
points += point_reward
+ credits += point_reward
return "Experiment successful! [point_reward] new data-points collected."
else
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
@@ -183,7 +185,7 @@
var/obj/item/weapon/grab/grabbed = G
if(!ishuman(grabbed.affecting))
return
- if(IsAbductor(grabbed.affecting))
+ if(isabductor(grabbed.affecting))
return
if(occupant)
to_chat(user, "The [src] is already occupied!")
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 285b097d06a..f0ceac0d6ce 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -17,6 +17,8 @@
target.forceMove(teleport_target)
spawn(0)
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
+ to_chat(target, "The instability of the warp leaves you disoriented!")
+ target.Stun(3)
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
flick("alien-pad", src)
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
new file mode 100644
index 00000000000..4985576e66c
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -0,0 +1,46 @@
+/obj/item/weapon/implant/abductor
+ name = "recall implant"
+ desc = "Returns you to the mothership."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "implant"
+ activated = 1
+ origin_tech = "materials=2;biotech=7;magnets=4;bluespace=4;abductor=5"
+ var/obj/machinery/abductor/pad/home
+ var/cooldown = 30
+ var/total_cooldown = 30
+
+/obj/item/weapon/implant/abductor/activate()
+ if(cooldown == total_cooldown)
+ home.Retrieve(imp_in,1)
+ cooldown = 0
+ processing_objects.Add(src)
+ else
+ to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!")
+
+/obj/item/weapon/implant/abductor/process()
+ if(cooldown < total_cooldown)
+ cooldown++
+ if(cooldown == total_cooldown)
+ processing_objects.Remove(src)
+
+/obj/item/weapon/implant/abductor/implant(mob/source, mob/user)
+ if(..())
+ var/obj/machinery/abductor/console/console
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ if(H.get_species() == "Abductor")
+ console = get_team_console(H.mind.abductor.team)
+ home = console.pad
+
+ if(!home)
+ console = get_team_console(pick(1, 2, 3, 4))
+ home = console.pad
+ return 1
+
+/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
+ var/obj/machinery/abductor/console/console
+ for(var/obj/machinery/abductor/console/c in abductor_equipment)
+ if(c.team == team)
+ console = c
+ break
+ return console
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 10376b48ba8..33100a474a0 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -761,7 +761,7 @@
..()
/obj/item/clothing/under/contortionist/dropped(mob/living/carbon/human/user)
- if(!user.get_int_organ(/obj/item/organ/internal/gland/ventcrawling))
+ if(!user.get_int_organ(/obj/item/organ/internal/heart/gland/ventcrawling))
user.ventcrawler = 0
..()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 624b4a9ca84..c7018183da3 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1181,7 +1181,8 @@
else
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
- adjustBruteLoss(1)
+ Paralyse(4)
+ adjustBruteLoss(2)
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 4690529524f..8e9c61992aa 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -18,7 +18,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
- flags = HAS_LIPS | NO_BLOOD | NO_BREATHE
+ flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS
oxy_mod = 0
@@ -27,11 +27,14 @@
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
blood_color = "#FF5AFF"
+ female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
+ female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
+ female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
-/datum/species/abductor/can_understand(var/mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
+/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
return 1
-/datum/species/abductor/handle_post_spawn(var/mob/living/carbon/human/H)
+/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
if(H.mind)
H.mind.abductor = new /datum/abductor
diff --git a/paradise.dme b/paradise.dme
index 40e281a0d9d..431b0f954ed 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -847,6 +847,7 @@
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
+#include "code\game\objects\items\weapons\implants\implant_abductor.dm"
#include "code\game\objects\items\weapons\implants\implant_chem.dm"
#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm"
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"