diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index f680b67faab..4628c23ba2c 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -185,6 +185,10 @@
#define COMSIG_ATOM_HITBY "atom_hitby"
/// Called when an atom is sharpened or dulled.
#define COMSIG_ATOM_UPDATE_SHARPNESS "atom_update_sharpness"
+///from base of atom/atom_prehit(obj/item/projectile/P):
+#define COMSIG_ATOM_PREHIT "atom_prehit"
+ #define ATOM_PREHIT_SUCCESS (1<<0)
+ #define ATOM_PREHIT_FAILURE (1<<1)
// Attack signals. These should share the returned flags, to standardize the attack chain.
// The chain currently works like:
@@ -774,6 +778,9 @@
#define COMSIG_HUMAN_CHECK_SHIELDS "human_check_shields"
#define SHIELD_BLOCK (1<<0)
+///from /mob/living/carbon/human/create_mob_hud()
+#define COMSIG_HUMAN_CREATE_MOB_HUD "human_create_mob_hud"
+
// /datum/species signals
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
diff --git a/code/__DEFINES/directions.dm b/code/__DEFINES/directions.dm
index dfe3b2ecc78..7e4dd3c9769 100644
--- a/code/__DEFINES/directions.dm
+++ b/code/__DEFINES/directions.dm
@@ -28,3 +28,6 @@
#define IS_DIR_DIAGONAL(dir) (dir & (dir - 1))
/// returns TRUE if direction is cardinal and false if not
#define IS_DIR_CARDINAL(dir) (!IS_DIR_DIAGONAL(dir))
+
+/// Inverse direction, taking into account UP|DOWN if necessary.
+#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) )
diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm
index a5e9e129d50..4dd81e1afd3 100644
--- a/code/__DEFINES/misc_defines.dm
+++ b/code/__DEFINES/misc_defines.dm
@@ -171,8 +171,8 @@
#define MUTANTRACE_LAYER 39
#define TAIL_UNDERLIMBS_LAYER 38 //Tail split-rendering.
#define LIMBS_LAYER 37
-#define INTORGAN_LAYER 36
-#define MARKINGS_LAYER 35
+#define MARKINGS_LAYER 36
+#define INTORGAN_LAYER 35
#define UNDERWEAR_LAYER 34
#define MUTATIONS_LAYER 33
#define H_DAMAGE_LAYER 32
diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm
index b9a89f4d33a..9550f4c9bfc 100644
--- a/code/__HELPERS/filters.dm
+++ b/code/__HELPERS/filters.dm
@@ -22,15 +22,13 @@ GLOBAL_LIST_INIT(master_filter_info, list(
"size" = 1
)
),
- /* Not supported because making a proper matrix editor on the frontend would be a huge dick pain.
- Uncomment if you ever implement it
+ // According to TG, this is not implimented. Anyway, let's use this!
"color" = list(
"defaults" = list(
"color" = matrix(),
"space" = FILTER_COLOR_RGB
)
),
- */
"displace" = list(
"defaults" = list(
"x" = 0,
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index e3feed27c70..d8cd8a104c5 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -223,6 +223,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CAN_VIEW_HEALTH "can_view_health" // Also used for /Stat
#define TRAIT_MAGPULSE "magnetificent" // Used for anything that is magboot related
#define TRAIT_NOSLIP "noslip"
+#define TRAIT_MEPHEDRONE_ADAPTED "mephedrone_adapted" // Trait that changes the ending effects of twitch leaving your system
+#define TRAIT_NOKNOCKDOWNSLOWDOWN "noknockdownslowdown" //If this person has this trait, they are not slowed via knockdown, but they can be hit by bullets like a self knockdown
//***** MIND TRAITS *****/
#define TRAIT_HOLY "is_holy" // The mob is holy in regards to religion
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 036e141d9ed..0d3ded12c71 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -87,7 +87,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BADASS" = TRAIT_BADASS,
"TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING,
"TRAIT_NOSLIP" = TRAIT_NOSLIP,
- "TRAIT_MAGPULSE" = TRAIT_MAGPULSE
+ "TRAIT_MAGPULSE" = TRAIT_MAGPULSE,
+ "TRAIT_MEPHEDRONE_ADAPTED" = TRAIT_MEPHEDRONE_ADAPTED,
+ "TRAIT_NOKNOCKDOWNSLOWDOWN" = TRAIT_NOKNOCKDOWNSLOWDOWN
),
/datum/mind = list(
diff --git a/code/_onclick/hud/human_hud.dm b/code/_onclick/hud/human_hud.dm
index 67c9e2e6621..c69e78f6404 100644
--- a/code/_onclick/hud/human_hud.dm
+++ b/code/_onclick/hud/human_hud.dm
@@ -52,6 +52,7 @@
/mob/living/carbon/human/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style), client.prefs.UI_style_color, client.prefs.UI_style_alpha)
+ SEND_SIGNAL(src, COMSIG_HUMAN_CREATE_MOB_HUD)
/datum/hud/human
var/hud_alpha = 255
diff --git a/code/datums/elements/shatters_when_thrown.dm b/code/datums/elements/shatters_when_thrown.dm
new file mode 100644
index 00000000000..441d365e58c
--- /dev/null
+++ b/code/datums/elements/shatters_when_thrown.dm
@@ -0,0 +1,56 @@
+/**
+ * When attached to something, will make that thing shatter into shards on throw impact or z level falling
+ */
+/datum/element/shatters_when_thrown
+ element_flags = ELEMENT_BESPOKE
+
+ /// What type of item is spawned as a 'shard' once the shattering happens
+ var/obj/item/shard_type
+ /// How many shards total are made when the thing we're attached to shatters
+ var/number_of_shards
+ /// What sound plays when the thing we're attached to shatters
+ var/shattering_sound
+
+/datum/element/shatters_when_thrown/Attach(datum/target, shard_type = /obj/item/shard, number_of_shards = 5, shattering_sound = "shatter")
+ . = ..()
+
+ if(!ismovable(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.shard_type = shard_type
+ src.number_of_shards = number_of_shards
+ src.shattering_sound = shattering_sound
+
+ RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact))
+
+/datum/element/shatters_when_thrown/Detach(datum/target)
+ . = ..()
+
+ UnregisterSignal(target,COMSIG_MOVABLE_IMPACT)
+
+/// Tells the parent to shatter if we are thrown and impact something
+/datum/element/shatters_when_thrown/proc/on_throw_impact(datum/source, atom/hit_atom)
+ SIGNAL_HANDLER
+ INVOKE_ASYNC(src, PROC_REF(shatter), source, hit_atom)
+
+/// Handles the actual shattering part, throwing shards of whatever is defined on the component everywhere
+/datum/element/shatters_when_thrown/proc/shatter(atom/movable/source, atom/hit_atom)
+ var/generator/scatter_gen = generator("circle", 0, 48, NORMAL_RAND)
+ var/scatter_turf = get_turf(hit_atom)
+
+ for(var/obj/item/scattered_item as anything in source.contents)
+ scattered_item.forceMove(scatter_turf)
+ var/list/scatter_vector = scatter_gen.Rand()
+ scattered_item.pixel_x = scatter_vector[1]
+ scattered_item.pixel_y = scatter_vector[2]
+
+ for(var/iteration in 1 to number_of_shards)
+ var/obj/item/shard = new shard_type(scatter_turf)
+ shard.pixel_x = rand(-6, 6)
+ shard.pixel_y = rand(-6, 6)
+ playsound(scatter_turf, shattering_sound, 60, TRUE)
+ if(isobj(source))
+ var/obj/obj_source = source
+ obj_source.deconstruct(FALSE)
+ return
+ qdel(source)
diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm
index 43713e9bdd0..9e9ae2b023d 100644
--- a/code/datums/uplink_items/uplink_general.dm
+++ b/code/datums/uplink_items/uplink_general.dm
@@ -827,7 +827,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Binyat Wireless Hacking System Autoimplanter"
desc = "This implant will allow you to wirelessly emag from a distance. However, it will slightly burn you \
on use, and will be quite visual as you are emaging the object. \
- Will not show on unupgraded body scanners."
+ Will not show on unupgraded body scanners. Incompatible with the Qani-Laaca Sensory Computer."
reference = "HKR"
item = /obj/item/autosurgeon/organ/syndicate/hackerman_deck
cost = 30 // Probably slightly less useful than an emag with heat / cooldown, but I am not going to make it cheaper or everyone picks it over emag
diff --git a/code/datums/uplink_items/uplink_traitor.dm b/code/datums/uplink_items/uplink_traitor.dm
index e13bdf4b7b8..db79ccb1a6c 100644
--- a/code/datums/uplink_items/uplink_traitor.dm
+++ b/code/datums/uplink_items/uplink_traitor.dm
@@ -529,6 +529,18 @@
surplus = 0
cant_discount = TRUE
+/datum/uplink_item/cyber_implants/sensory_enhancer
+ name = "Qani-Laaca Sensory Computer Autoimplanter"
+ desc = "Epilepsy Warning: Drug has vibrant visual effects! \
+ This spinal implant will inject mephedrone into your system, a powerful stimulant that causes slight heart damage.\
+ This stimulant will provide faster movement speed, slight pain resistance, immunity to crawling slowdown, and faster attack speed, though no antistun.\
+ Overdosing will cause massive heart damage, but will allow the user to dodge bullets for a minute and attack even faster.\
+ Two minute normal uptime, 5 minute cooldown, unlimited uses. Incompatible with the Binyat Wireless Hacking System."
+ reference = "QLSC"
+ item = /obj/item/autosurgeon/organ/syndicate/sensory_enhancer
+ cost = 40
+ excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST) //No, nukies do not get to dodge bullets.
+
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 69c272f8464..7d8b6506423 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1291,3 +1291,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
if(caller && (caller.pass_flags & pass_flags_self))
return TRUE
. = !density
+
+/atom/proc/atom_prehit(obj/item/projectile/P)
+ return SEND_SIGNAL(src, COMSIG_ATOM_PREHIT, P)
diff --git a/code/game/objects/effects/temporary_visuals/misc_visuals.dm b/code/game/objects/effects/temporary_visuals/misc_visuals.dm
index 334c9bfe64f..aec954ae085 100644
--- a/code/game/objects/effects/temporary_visuals/misc_visuals.dm
+++ b/code/game/objects/effects/temporary_visuals/misc_visuals.dm
@@ -130,17 +130,19 @@
desc = "It's a decoy!"
duration = 15
-/obj/effect/temp_visual/decoy/New(loc, atom/mimiced_atom)
- ..()
+/obj/effect/temp_visual/decoy/Initialize(mapload, atom/mimiced_atom)
+ . = ..()
alpha = initial(alpha)
if(mimiced_atom)
name = mimiced_atom.name
appearance = mimiced_atom.appearance
+ invisibility = mimiced_atom.invisibility
+ alpha = mimiced_atom.alpha
setDir(mimiced_atom.dir)
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-/obj/effect/temp_visual/decoy/fading/New(loc, atom/mimiced_atom)
- ..()
+/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom)
+ . = ..()
animate(src, alpha = 0, time = duration)
/obj/effect/temp_visual/decoy/fading/threesecond
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 5e76d2e44f9..eec8b373fca 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -523,6 +523,8 @@
return
if(!isliving(target)) //no buff from attacking inanimate objects
return
+ if(user.reagents.get_reagent_amount("mephedrone") > 15) // No patrick, you do not get to be chainsaw stun immune and bullet immune at once
+ return
if(target.stat != DEAD) //no buff from attacking dead targets
user.apply_status_effect(STATUS_EFFECT_CHAINSAW_SLAYING)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 766fb4ec678..823e2978952 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -800,5 +800,5 @@ emp_act
return TRUE
/mob/living/carbon/human/projectile_hit_check(obj/item/projectile/P)
- return HAS_TRAIT(src, TRAIT_FLOORED) && !density // hit mobs that are intentionally lying down to prevent combat crawling.
+ return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density // hit mobs that are intentionally lying down to prevent combat crawling.
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index ff78b9ddd8e..c3dee83a812 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -284,7 +284,7 @@
if(!has_gravity(H))
return
- if(!IS_HORIZONTAL(H))
+ if(!IS_HORIZONTAL(H) || (HAS_TRAIT(H, TRAIT_NOKNOCKDOWNSLOWDOWN) && !H.resting)) //You are slowed if crawling without noknockdownslowdown. However, if you are self crawling, you don't ignore it, so no self crawling to not drop items
if(HAS_TRAIT(H, TRAIT_GOTTAGOFAST))
. -= 1
else if(HAS_TRAIT(H, TRAIT_GOTTAGONOTSOFAST))
diff --git a/code/modules/projectiles/projectile_base.dm b/code/modules/projectiles/projectile_base.dm
index 178f037096d..a975f1e8029 100644
--- a/code/modules/projectiles/projectile_base.dm
+++ b/code/modules/projectiles/projectile_base.dm
@@ -279,7 +279,10 @@
var/turf/target_turf = get_turf(A)
prehit(A)
- var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null
+ var/pre_permutation = A.atom_prehit(src)
+ var/permutation = -1
+ if(pre_permutation != ATOM_PREHIT_FAILURE)
+ permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null
if(permutation == -1 || forcedodge)// the bullet passes through a dense object!
if(forcedodge)
forcedodge -= 1
diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm
index da1e5407c06..4f5eaba5b80 100644
--- a/code/modules/reagents/chemistry/reagents/drugs.dm
+++ b/code/modules/reagents/chemistry/reagents/drugs.dm
@@ -802,6 +802,306 @@
animate(pm_controller.controlled_planes[key], transform = matrix(), time = 5, easing = QUAD_EASING)
..()
+// Mephedrone.
+
+#define CONSTANT_DOSE_SAFE_LIMIT 60
+#define CONSTANT_DOSE_DEATH_LIMIT 600
+
+#define MEPHEDRONE_SCREEN_FILTER "mephedrone_screen_filter"
+#define MEPHEDRONE_SCREEN_BLUR "mephedrone_screen_blur"
+
+#define MEPHEDRONE_BLUR_EFFECT "mephedrone_dodge_blur"
+#define MEPHEDRONE_OVERDOSE_BLUR_EFFECT "mephedrone_overdose_blur"
+
+// Mephedrone drug, makes the takers of it faster and able to dodge bullets while in their system, to potentially bad side effects
+/datum/reagent/mephedrone
+ name = "Mephedrone"
+ id = "mephedrone"
+ description = "A drug originally developed by and for plutonians to assist them during raids. \
+ Does not see wide use due to the whole reality-disassociation and heart disease thing afterwards. \
+ Can be intentionally overdosed to increase the drug's effects."
+ reagent_state = LIQUID
+ color = "#c22a44"
+ taste_description = "television static"
+ metabolization_rate = 0.375 * REAGENTS_METABOLISM
+ overdose_threshold = 15
+ addiction_chance = 3
+ addiction_threshold = 15
+ shock_reduction = 40 // Slight shock reduction to assist with damage / disablers
+ allowed_overdose_process = TRUE
+ process_flags = ORGANIC | SYNTHETIC
+ /// How much time has the drug been in them?
+ var/constant_dose_time = 0
+ /// Keeps track of how many chemicals we are delaying the changeling by.
+ var/changeling_chemical_tracker = 0
+
+
+/datum/reagent/mephedrone/on_mob_add(mob/living/carbon/L)
+ ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ ADD_TRAIT(L, TRAIT_NOKNOCKDOWNSLOWDOWN, id)
+ L.next_move_modifier -= 0.3 // For the duration of this you move and attack faster
+
+ L.sound_environment_override = SOUND_ENVIRONMENT_DIZZY
+
+ RegisterSignal(L, COMSIG_MOVABLE_MOVED, PROC_REF(on_movement))
+ RegisterSignal(L, COMSIG_HUMAN_CREATE_MOB_HUD, PROC_REF(no_hud_cheese))
+
+ if(!L.hud_used)
+ return
+
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME]
+
+ var/static/list/col_filter_green = list(0.5,0,0,0, 0,1,0,0, 0,0,0.5,0, 0,0,0,1)
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_FILTER, 10, color_matrix_filter(col_filter_green, FILTER_COLOR_RGB))
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.1))
+
+ if(!ischangeling(L) || HAS_TRAIT(L, TRAIT_MEPHEDRONE_ADAPTED))
+ return
+ var/datum/antagonist/changeling/cling = L.mind.has_antag_datum(/datum/antagonist/changeling)
+ cling.chem_recharge_slowdown += 1
+ changeling_chemical_tracker += 1
+
+/datum/reagent/mephedrone/on_mob_delete(mob/living/carbon/L)
+ REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ REMOVE_TRAIT(L, TRAIT_NOKNOCKDOWNSLOWDOWN, id)
+ var/overdosed = (id in L.reagents.overdose_list())
+ L.next_move_modifier += (overdosed ? 0.5 : 0.3)
+
+ L.sound_environment_override = NONE
+
+ UnregisterSignal(L, COMSIG_MOVABLE_MOVED)
+ if(overdosed)
+ UnregisterSignal(L, COMSIG_ATOM_PREHIT)
+
+ if(ischangeling(L))
+ var/datum/antagonist/changeling/cling = L.mind.has_antag_datum(/datum/antagonist/changeling)
+ cling.chem_recharge_slowdown -= changeling_chemical_tracker
+ changeling_chemical_tracker = 0
+
+ if(constant_dose_time < CONSTANT_DOSE_SAFE_LIMIT) // Anything less than this and you'll come out fiiiine, aside from a big hit of stamina damage
+ L.visible_message(
+ "[L] suddenly slows from their inhuman speeds, coming back with a wicked nosebleed!",
+ "You suddenly slow back to normal, a stream of blood gushing from your nose!")
+ L.adjustStaminaLoss(constant_dose_time)
+ else // Much longer than that however, and you're not gonna have a good day
+ L.visible_message(
+ "[L] suddenly snaps back from their inhumans speeds, coughing up a spray of blood!",
+ "As you snap back to normal speed you cough up a worrying amount of blood. You feel like you've just been run over by a power loader.")
+ L.custom_emote(EMOTE_VISIBLE, "coughs up blood!")
+ L.bleed(25)
+ L.apply_damage(max(constant_dose_time / 3, 60), STAMINA)
+ L.KnockDown((constant_dose_time / 15) SECONDS) // a minute is a 4 second knockdown, 2 is 8, etc
+ if(!HAS_TRAIT(L, TRAIT_MEPHEDRONE_ADAPTED) || constant_dose_time >= CONSTANT_DOSE_DEATH_LIMIT) //If you are going infinite with mito and you run out, you deserve this even with an implant
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/datum/organ/heart/datum_heart = H.get_int_organ_datum(ORGAN_DATUM_HEART)
+ if(datum_heart)
+ var/obj/item/organ/internal/our_heart = datum_heart.linked_organ
+ our_heart.receive_damage(0.15 * constant_dose_time, TRUE) // Basically you might die. Especially if you are a slime.
+ else
+ handle_heartless(L, 0.15 * constant_dose_time)
+
+
+ if(!L.hud_used)
+ return
+
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME]
+
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_FILTER)
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_BLUR)
+
+
+/// Leaves an afterimage behind the mob when they move
+/datum/reagent/mephedrone/proc/on_movement(mob/living/carbon/L, atom/old_loc)
+ SIGNAL_HANDLER
+ if(HAS_TRAIT(L, TRAIT_IMMOBILIZED)) //No, dead people floating through space do not need afterimages
+ return NONE
+ var/overdosed = (id in L.reagents.overdose_list())
+ new /obj/effect/temp_visual/decoy/mephedrone_afterimage(old_loc, L, overdosed ? 1.25 SECONDS : 0.75 SECONDS)
+
+/// Tries to dodge incoming bullets if we aren't disabled for any reasons
+/datum/reagent/mephedrone/proc/dodge_bullets(mob/living/carbon/human/source, obj/item/projectile/hitting_projectile)
+ SIGNAL_HANDLER
+
+ if(HAS_TRAIT(source, TRAIT_IMMOBILIZED))
+ return NONE
+ source.visible_message(
+ "[source] effortlessly dodges [hitting_projectile]!",
+ "You effortlessly evade [hitting_projectile]!",
+ )
+ playsound(source, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE)
+ source.add_filter(MEPHEDRONE_BLUR_EFFECT, 2, gauss_blur_filter(5))
+ addtimer(CALLBACK(source, TYPE_PROC_REF(/atom, remove_filter), MEPHEDRONE_BLUR_EFFECT), 0.5 SECONDS)
+ return ATOM_PREHIT_FAILURE
+
+
+/// So. If a person changes up their hud settings (Changing their ui theme), the visual effects for this reagent will break, and they will be able to see easily. This 3 part proc waits for the plane controlers to be setup, and over 2 other procs, rengages the visuals
+/datum/reagent/mephedrone/proc/no_hud_cheese(mob/living/carbon/L)
+ SIGNAL_HANDLER
+ addtimer(CALLBACK(src, PROC_REF(no_hud_cheese_2), L), 2 SECONDS) //Calling it instantly will not work, need to give it a moment
+
+/// This part of the anticheese sets up the basic visual effects normally setup when the reagent gets into your system.
+/datum/reagent/mephedrone/proc/no_hud_cheese_2(mob/living/carbon/L) //Basically if you change the UI you would remove the visuals. This fixes that.
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME]
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_FILTER)
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_BLUR)
+
+ var/static/list/col_filter_green = list(0.5,0,0,0, 0,1,0,0, 0,0,0.5,0, 0,0,0,1)
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_FILTER, 10, color_matrix_filter(col_filter_green, FILTER_COLOR_RGB))
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.1))
+
+ var/overdosed = (id in L.reagents.overdose_list())
+ if(overdosed)
+ addtimer(CALLBACK(src, PROC_REF(no_hud_cheese_3), L), 1 SECONDS) //still needs a moment
+
+///This part sets up the OD visual effects.
+/datum/reagent/mephedrone/proc/no_hud_cheese_3(mob/living/carbon/L)
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L?.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
+ var/list/col_filter_ourple = list(1,0,0,0, 0,0.5,0,0, 0,0,1,0, 0,0,0,1)
+
+ for(var/filter in game_plane_master_controller.get_filters(MEPHEDRONE_SCREEN_FILTER))
+ animate(filter, loop = -1, color = col_filter_ourple, time = 4 SECONDS, easing = BOUNCE_EASING)
+
+/datum/reagent/mephedrone/on_mob_life(mob/living/carbon/L)
+ . = ..()
+
+ constant_dose_time += 2
+
+ if(ishuman(L))
+ var/heart_damage = 0.1
+ if(L.reagents.has_reagent("methamphetamine")) //We want people to use something other than meth, since meths downside is knockdowns / be orginal
+ heart_damage = 1.1
+ var/mob/living/carbon/human/H = L
+ var/datum/organ/heart/datum_heart = H.get_int_organ_datum(ORGAN_DATUM_HEART)
+ if(datum_heart)
+ var/obj/item/organ/internal/our_heart = datum_heart.linked_organ
+ our_heart.receive_damage(heart_damage, TRUE)
+ else
+ handle_heartless(L, heart_damage)
+
+/datum/reagent/mephedrone/overdose_start(mob/living/L)
+
+ RegisterSignal(L, COMSIG_ATOM_PREHIT, PROC_REF(dodge_bullets))
+
+ L.next_move_modifier -= 0.2 // Overdosing makes you a liiitle faster but you know has some really bad consequences
+ if(ischangeling(L))
+ var/datum/antagonist/changeling/cling = L.mind.has_antag_datum(/datum/antagonist/changeling)
+ cling.chem_recharge_slowdown += 1
+ changeling_chemical_tracker += 1
+
+ if(!L.hud_used)
+ return
+
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L?.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
+
+ var/list/col_filter_ourple = list(1,0,0,0, 0,0.5,0,0, 0,0,1,0, 0,0,0,1)
+
+ for(var/filter in game_plane_master_controller.get_filters(MEPHEDRONE_SCREEN_FILTER))
+ animate(filter, loop = -1, color = col_filter_ourple, time = 4 SECONDS, easing = BOUNCE_EASING)
+ ..()
+
+
+/datum/reagent/mephedrone/overdose_end(mob/living/L)
+ UnregisterSignal(L, COMSIG_ATOM_PREHIT)
+
+ L.next_move_modifier += 0.2
+
+ if(ischangeling(L))
+ var/datum/antagonist/changeling/cling = L.mind.has_antag_datum(/datum/antagonist/changeling)
+ if(changeling_chemical_tracker > 0) //Just in case this gets called somehow after on_remove is done
+ cling.chem_recharge_slowdown -= 1
+ changeling_chemical_tracker -= 1
+
+ if(!L.hud_used)
+ return
+
+ var/atom/movable/plane_master_controller/game_plane_master_controller = L.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME] //Restart the base filters.
+
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_FILTER)
+
+ game_plane_master_controller.remove_filter(MEPHEDRONE_SCREEN_BLUR)
+
+ var/static/list/col_filter_green = list(0.5,0,0,0, 0,1,0,0, 0,0,0.5,0, 0,0,0,1)
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_FILTER, 10, color_matrix_filter(col_filter_green, FILTER_COLOR_RGB))
+
+ game_plane_master_controller.add_filter(MEPHEDRONE_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.1))
+
+
+/datum/reagent/mephedrone/overdose_process(mob/living/carbon/L)
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/datum/organ/heart/datum_heart = H.get_int_organ_datum(ORGAN_DATUM_HEART)
+ if(datum_heart)
+ var/obj/item/organ/internal/our_heart = datum_heart.linked_organ
+ our_heart.receive_damage(0.9, TRUE)
+ else
+ handle_heartless(L, 0.9)
+
+
+ if(prob(5))
+ L.custom_emote(EMOTE_VISIBLE, "coughs up blood!")
+ L.bleed(5)
+
+ if(prob(10))
+ L.add_filter(MEPHEDRONE_OVERDOSE_BLUR_EFFECT, 2, phase_filter(8))
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom, remove_filter), MEPHEDRONE_OVERDOSE_BLUR_EFFECT), 0.5 SECONDS)
+
+ var/update_flags = STATUS_UPDATE_NONE
+ L.Jitter(2.2 SECONDS) // Slowly will build up over time due to low process rate
+ update_flags |= L.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ return ..() | update_flags
+
+//This proc is for IPCS, skeletons, golems, and people with corazone. IPCS are treated lightly, power loss and brain damage.
+//IPC brain damage gets an increase with liquid solder, so it matters
+//Otherwise, the user hallucinates a bunch, and as well takes stamina damage. This will block passive stamina regen, and most likely require antistun drugs to use as well
+
+/datum/reagent/mephedrone/proc/handle_heartless(mob/living/carbon/L, damage_input)
+ if(ismachineperson(L))
+ L.adjust_nutrition(-damage_input * 7.5)
+ if(damage_input == 0.9) //This is the input from the OD
+ L.adjustBrainLoss(1.75)
+ if(L.reagents.has_reagent("liquid_solder"))
+ L.adjustBrainLoss(2.75)
+ else //Corazone or skeletons. We go hard on them.
+ L.Hallucinate(damage_input * 50 SECONDS)
+ L.apply_damage(damage_input * 3, STAMINA)
+
+/// This filter proc makes a visual effect where the object is split into fragments, with vertical lines cut out of them. It will appear as 2 seperate things are made of the one object that was cut out
+/proc/phase_filter(size)
+ . = list("type" = "wave")
+ .["x"] = 1
+ if(!isnull(size))
+ .["size"] = size
+
+
+// Temp visual that changes color for that bootleg sandevistan effect
+/obj/effect/temp_visual/decoy/mephedrone_afterimage
+ duration = 0.75 SECONDS
+ /// The color matrix it should be at spawn
+ var/list/matrix_start = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0.1,0.4,0)
+ /// The color matrix it should be by the time it despawns
+ var/list/matrix_end = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0.5,0,0)
+
+/obj/effect/temp_visual/decoy/mephedrone_afterimage/Initialize(mapload, atom/mimiced_atom, our_duration = 0.75 SECONDS)
+ duration = our_duration
+ . = ..()
+ color = matrix_start
+ animate(src, color = matrix_end, time = duration, easing = EASE_OUT)
+ animate(src, alpha = 0, time = duration, easing = EASE_OUT)
+
+#undef MEPHEDRONE_SCREEN_FILTER
+#undef MEPHEDRONE_SCREEN_BLUR
+
+#undef MEPHEDRONE_BLUR_EFFECT
+#undef MEPHEDRONE_OVERDOSE_BLUR_EFFECT
+
+
//////////////////////////////
// Synth-Drugs //
//////////////////////////////
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 7057b02f99b..9ba2163d191 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -101,10 +101,13 @@
/datum/reagent/medicine/mitocholide/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
+ var/heal_modifier = 0.4
+ if(M.reagents.has_reagent("mephedrone"))
+ heal_modifier -= 0.3 //This lowers the healing to 0.1. As such, you need time off the drug to heal heart damage, but can be on the drug endlessly when not oding IF you keep your supply going.
//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
for(var/obj/item/organ/internal/I in H.internal_organs)
- I.heal_internal_damage(0.4)
+ I.heal_internal_damage(heal_modifier)
return ..()
/datum/reagent/medicine/mitocholide/reaction_obj(obj/O, volume)
@@ -1213,7 +1216,7 @@
color = "#FFDCFF"
taste_description = "stability"
harmless = FALSE
- var/list/drug_list = list("crank", "methamphetamine", "space_drugs", "synaptizine", "psilocybin", "ephedrine", "epinephrine", "stimulants", "stimulative_agent", "bath_salts", "lsd", "thc")
+ var/list/drug_list = list("crank", "methamphetamine", "space_drugs", "synaptizine", "psilocybin", "ephedrine", "epinephrine", "stimulants", "stimulative_agent", "bath_salts", "lsd", "thc", "mephedrone")
/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1467,7 +1470,7 @@
metabolization_rate = 0.5
harmless = FALSE
taste_description = "2 minutes of suffering"
- var/list/stimulant_list = list("methamphetamine", "crank", "bath_salts", "stimulative_agent", "stimulants")
+ var/list/stimulant_list = list("methamphetamine", "crank", "bath_salts", "stimulative_agent", "stimulants", "mephedrone")
/datum/reagent/medicine/nanocalcium/on_mob_life(mob/living/carbon/human/M)
var/update_flags = STATUS_UPDATE_NONE
diff --git a/code/modules/reagents/chemistry/reagents_datum.dm b/code/modules/reagents/chemistry/reagents_datum.dm
index fa5aa62e884..90cb9a79e57 100644
--- a/code/modules/reagents/chemistry/reagents_datum.dm
+++ b/code/modules/reagents/chemistry/reagents_datum.dm
@@ -205,6 +205,9 @@
/datum/reagent/proc/overdose_start(mob/living/M)
return
+/datum/reagent/proc/overdose_end(mob/living/M)
+ return
+
/datum/reagent/proc/addiction_act_stage1(mob/living/M)
return STATUS_UPDATE_NONE
diff --git a/code/modules/reagents/chemistry/reagents_holder.dm b/code/modules/reagents/chemistry/reagents_holder.dm
index 9be2cdc7df8..3a08aa5fd75 100644
--- a/code/modules/reagents/chemistry/reagents_holder.dm
+++ b/code/modules/reagents/chemistry/reagents_holder.dm
@@ -352,6 +352,7 @@
update_flags |= R.on_mob_overdose_life(M) //We want to drain reagents but not do the entire mob life.
if(R.volume < R.overdose_threshold && R.overdosed)
R.overdosed = FALSE
+ R.overdose_end(M)
if(R.overdosed)
var/list/overdose_results = R.overdose_process(M, R.volume >= R.overdose_threshold * 2 ? 2 : 1)
if(overdose_results) // to protect against poorly-coded overdose procs
diff --git a/code/modules/reagents/chemistry/recipes/drugs_reactions.dm b/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
index d9d928ff7ec..78c9fd9e922 100644
--- a/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
@@ -68,6 +68,21 @@
mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh."
mix_sound = 'sound/goonstation/misc/fuse.ogg'
+/datum/chemical_reaction/mephedrone
+ name = "Mephedrone"
+ id = "mephedrone"
+ result = "mephedrone"
+ required_reagents = list("bath_salts" = 5, "carpotoxin" = 5, "teslium" = 5)
+ result_amount = 10
+ min_temp = T0C + 100
+ mix_message = "The mixture fizzes into a vibrant red solution that doesn't stay still."
+ mix_sound = 'sound/goonstation/misc/fuse.ogg'
+
+/datum/chemical_reaction/mephedrone/on_reaction(datum/reagents/holder) //Will make it harder for botany, need a chem heater or will suffer, and mixing in plants wont work
+ var/turf/T = get_turf(holder.my_atom)
+ fireflash(holder.my_atom, 3, 500)
+ explosion(T, 0, 0, 2, 2, flame_range = 2)
+
/datum/chemical_reaction/jenkem
name = "Jenkem"
id = "jenkem"
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 7e981736a9d..4f9c1c4d4ba 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -399,6 +399,21 @@
build_path = /obj/item/organ/internal/cyberimp/arm/razorwire
category = list("Medical")
+/datum/design/cyberimp_sensory_enhancer
+ name = "Qani-Laaca Sensory Computer Implant"
+ desc = "An experimental implant replacing the spine of organics. When activated, it can give a temporary boost to mental processing speed, \
+ which many users perceive as a slowing of time and quickening of their ability to act. Due to its nature, it is incompatible with \
+ systems that heavily influence the user's nervous system, like the central nervous system rebooter. \
+ As a bonus effect, you are immune to the burst of heart damage that comes at the end of mephedrone usage, as the computer is able to regulate \
+ your heart's rhythm back to normal after its use."
+ id = "ci-sensory-enhancer"
+ req_tech = list("combat" = 7, "biotech" = 7, "syndicate" = 5)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 2000, MAT_PLASMA = 10000, MAT_DIAMOND = 4000, MAT_BLUESPACE = 4000)
+ construction_time = 10 SECONDS
+ build_path = /obj/item/organ/internal/cyberimp/brain/sensory_enhancer/rnd
+ category = list("Medical")
+
/datum/design/cyberimp_toolset_abductor
name = "Abductor Toolset Implant"
desc = "An alien toolset, designed to be installed on subject's arm."
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index e0733411b13..c348540cc8b 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -304,6 +304,134 @@
origin_tech = "materials=6;programming=6;biotech=6"
emp_proof = TRUE
+// An implant that injects you with mephedrone on demand, acting like a bootleg sandevistan
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer
+ name = "\improper Qani-Laaca sensory computer"
+ desc = "An experimental implant replacing the spine of organics. When activated, it can give a temporary boost to mental processing speed, \
+ which many users perceive as a slowing of time and quickening of their ability to act. Due to its nature, it is incompatible with \
+ systems that heavily influence the user's nervous system, like the central nervous system rebooter. \
+ As a bonus effect, you are immune to the burst of heart damage that comes at the end of mephedrone usage, as the computer is able to regulate \
+ your heart's rhythm back to normal after its use."
+ icon_state = "sandy"
+ implant_overlay = null
+ implant_color = null
+ slot = "brain_antistun"
+ emp_proof = TRUE
+ actions_types = list(/datum/action/item_action/organ_action/toggle/sensory_enhancer)
+ origin_tech = "combat=6;biotech=6;syndicate=4"
+ ///The icon state used for the on mob sprite. Default is sandy. Drask and vox have their own unique sprites
+ var/custom_mob_sprite = "sandy"
+ COOLDOWN_DECLARE(sensory_enhancer_cooldown)
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/rnd
+ emp_proof = FALSE
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/examine(mob/user)
+ . = ..()
+ . += "Epilepsy Warning: Drug has vibrant visual effects!"
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/examine_more(mob/user)
+ . = ..()
+ . += "Developed by Biotech Solutions this revolutionary full spinal cord replacement implant uses an integrated chemical synthesizer designed to administer Mephedrone: \
+ a potent stimulant and hyper-movement drug. This implant dramatically enhances the user's reflexes, with many reporting an almost time-slowing effect during its operation."
+ . += "Biotech's experimentation with stimulant drug research has long been a cornerstone of their competitive edge, especially against their rival: \
+ Interydyne Pharmaceuticals, whose efforts yielded a drug capable of enhancing reflexes, although they were never mitigate the adverse effects of said product. \
+ A premature leak of the prototype implant pressured the company into accelerating its development, leaving the drug's side effects unresolved. \
+ They completed the spinal implant, which is uniquely equipped with built-in vials for Mephedrone delivery. \
+ Its material is solid plastitanium, and while strong in material, it surprisingly feels light, considering its spinal integration."
+ . += "The implant is highly sought after because of its extreme capabilities in combat. Many military groups pay a handsome fee simply for the licensing of the item. \
+ In spite of this, recent Biotech shipments have come under fire from piracy, with the company quick to blame Interdyne for said attacks. Said allegations remain unverified."
+
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/insert(mob/living/carbon/M, special = 0)
+ . = ..()
+ ADD_TRAIT(M, TRAIT_MEPHEDRONE_ADAPTED, "[UID()]")
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/remove(mob/living/carbon/M, special = 0)
+ . = ..()
+ REMOVE_TRAIT(M, TRAIT_MEPHEDRONE_ADAPTED, "[UID()]")
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/render()
+ if(isvox(owner))
+ custom_mob_sprite = "vox_sandy"
+ else if(isdrask(owner))
+ custom_mob_sprite = "drask_sandy"
+ else
+ custom_mob_sprite = "sandy"
+ var/mutable_appearance/our_MA = mutable_appearance('icons/mob/human_races/robotic.dmi', icon_state, layer = -INTORGAN_LAYER)
+ return our_MA
+
+/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/emp_act(severity)
+ if(COOLDOWN_FINISHED(src, sensory_enhancer_cooldown)) //Not on cooldown? Drug them up. Heavily. We don't want people self emping to bypass cooldown.
+ if(prob(100 / severity) && owner)
+ for(var/datum/action/item_action/organ_action/toggle/sensory_enhancer/SE in owner.actions)
+ SE.Trigger(FALSE, TRUE, TRUE)
+ . = ..()
+
+/datum/action/item_action/organ_action/toggle/sensory_enhancer
+ name = "Activate Qani-Laaca System"
+ desc = "Activates your Qani-Laaca computer and grants you its powers. LMB: Short, safer activation. ALT/MIDDLE: Longer, more powerful, more dangerous activation."
+ button_icon = 'icons/obj/surgery.dmi'
+ button_icon_state = "sandy"
+ check_flags = AB_CHECK_CONSCIOUS
+ /// Keeps track of how much mephedrone we inject into people on activation
+ var/injection_amount = 10
+
+
+/datum/action/item_action/organ_action/toggle/sensory_enhancer/AltTrigger()
+ Trigger(FALSE, TRUE)
+
+/datum/action/item_action/organ_action/toggle/sensory_enhancer/Trigger(left_click, attack_self, emp_triggered = FALSE)
+ . = ..()
+ if(istype(target, /obj/item/organ/internal/cyberimp/brain/sensory_enhancer))
+ var/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/ourtarget = target
+ if(!COOLDOWN_FINISHED(ourtarget, sensory_enhancer_cooldown))
+ to_chat(owner, "[ourtarget] is still on cooldown for another [round(COOLDOWN_TIMELEFT(ourtarget, sensory_enhancer_cooldown), 1 SECONDS) / 10] seconds!")
+ return
+
+ COOLDOWN_START(ourtarget, sensory_enhancer_cooldown, 5 MINUTES)
+
+ injection_amount = 10
+
+ if(!left_click)
+ injection_amount = 20
+ if(emp_triggered)
+ injection_amount = 40 //Time for a quick medical visit
+ Activate()
+
+
+/datum/action/item_action/organ_action/toggle/sensory_enhancer/proc/Activate(atom/target)
+
+ var/mob/living/carbon/human/human_owner = owner
+
+ human_owner.reagents.add_reagent("mephedrone", injection_amount)
+
+ owner.visible_message("[owner.name] jolts suddenly as two small glass vials are fired from ports in the implant on [owner.p_their()] spine, shattering as they land.", \
+ "You jolt suddenly as your Qani-Laaca system ejects two empty glass vials rearward, shattering as they land.")
+ playsound(human_owner, 'sound/goonstation/items/hypo.ogg', 80, TRUE)
+
+ var/obj/item/telegraph_vial = new /obj/item/qani_laaca_telegraph(get_turf(owner))
+ var/turf/turf_we_throw_at = get_edge_target_turf(owner, REVERSE_DIR(owner.dir))
+ telegraph_vial.throw_at(turf_we_throw_at, 5, 1)
+
+ // Safety net in case the injection amount doesn't get reset. Apparently it happened to someone in a round.
+ injection_amount = initial(injection_amount)
+
+/obj/item/qani_laaca_telegraph
+ name = "spent Qani-Laaca cartridge"
+ desc = "A small glass vial, usually kept in a large stack inside a Qani-Laaca implant, that is broken open and ejected \
+ each time the implant is used. If you're looking at one long enough to think about it this long, you either have fast eyes \
+ or were lucky enough to catch one before it broke."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "blastoff_ampoule_empty"
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/qani_laaca_telegraph/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/shatters_when_thrown, /obj/effect/decal/cleanable/glass, 1, "shatter")
+ transform = transform.Scale(0.75, 0.75)
+
/obj/item/organ/internal/cyberimp/brain/hackerman_deck
name = "\improper Binyat wireless hacking system"
desc = "A rare-to-find neural chip that allows its user to interface with nearby machinery from a distance \
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index f64f973273b..881f797ad94 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -121,6 +121,20 @@
. += "As of modern times, the BWHS is heavily vetted under Cybersun Inc. due to its dangerous nature and rather difficult detection. \
However, this hasn't stopped the flow of these implants from reaching the black market, whether by inside or outside influences."
+/obj/item/autosurgeon/organ/syndicate/sensory_enhancer
+ desc = "A single use autosurgeon that contains a Qani-Laaca sensory computer. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/internal/cyberimp/brain/sensory_enhancer
+
+/obj/item/autosurgeon/organ/syndicate/sensory_enhancer/examine(mob/user)
+ . = ..()
+ . += "Epilepsy Warning: Drug has vibrant visual effects!"
+
+/obj/item/autosurgeon/organ/syndicate/sensory_enhancer/examine_more(mob/user)
+ . = ..()
+ if(storedorgan)
+ return storedorgan.examine_more()
+
/obj/item/autosurgeon/organ/syndicate/thermal_eyes
starting_organ = /obj/item/organ/internal/eyes/cybernetic/thermals/hardened
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 2087f6208e4..9f624bc55c5 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -59,6 +59,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
parent = H.get_organ(check_zone(parent_organ))
+ H.update_int_organs()
if(!istype(parent))
stack_trace("[src] attempted to insert into a [parent_organ], but [parent_organ] wasn't an organ! [atom_loc_line(M)]")
else
diff --git a/icons/mob/human_races/robotic.dmi b/icons/mob/human_races/robotic.dmi
index f956c6a6f20..2d73cf8ff74 100644
Binary files a/icons/mob/human_races/robotic.dmi and b/icons/mob/human_races/robotic.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 7153ac1b94c..bfd47a9ec13 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 10fded4cabf..08f9fac990d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -469,6 +469,7 @@
#include "code\datums\elements\bombable_turf.dm"
#include "code\datums\elements\earhealing.dm"
#include "code\datums\elements\rad_insulation.dm"
+#include "code\datums\elements\shatters_when_thrown.dm"
#include "code\datums\elements\waddling.dm"
#include "code\datums\helper_datums\async_input.dm"
#include "code\datums\helper_datums\construction_datum.dm"