Adds The Qani-Laaca Sensory Computer and mephedrone. Ready for review into merge (#23926)

* Surely this will not have any critical balance implications

* Apply suggestions from code review

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* oops

* marm fixes

* fixes signal

* how on earth did I do that

* adds twitch to nanocalcium

* respect armor, lowers throw

* IPC can use, fuck up heartless people

* no crawl slowdown / meth

* *slightly* turns down the drug effect

* renames it will deal with pr desc soon

* finishes it

* rnd version empable

* Apply suggestions from code review

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Nerfs twitches visuals, due to a reported novastation bug where the visuals would endlessly stack

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>

* C-C-C-Changes

* Epilepsy Warning: Drug has vibrant visual effects!

* safety

* Apply suggestions from code review

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>

* removes twitch name, make mix explode

* oops

---------

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2024-03-06 08:25:38 -05:00
committed by GitHub
parent e43fb1ce34
commit d7c7cacc52
28 changed files with 589 additions and 17 deletions
@@ -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.
@@ -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))
+4 -1
View File
@@ -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
@@ -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(
"<span class='danger'>[L] suddenly slows from their inhuman speeds, coming back with a wicked nosebleed!</span>",
"<span class='danger'>You suddenly slow back to normal, a stream of blood gushing from your nose!</span>")
L.adjustStaminaLoss(constant_dose_time)
else // Much longer than that however, and you're not gonna have a good day
L.visible_message(
"<span class='danger'>[L] suddenly snaps back from their inhumans speeds, coughing up a spray of blood!</span>",
"<span class='danger'>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.</span>")
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(
"<span class='danger'>[source] effortlessly dodges [hitting_projectile]!</span>",
"<span class='userdanger'>You effortlessly evade [hitting_projectile]!</span>",
)
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 //
//////////////////////////////
@@ -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
@@ -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
@@ -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
@@ -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"
@@ -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."
@@ -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)
. = ..()
. += "<span class='userdanger'>Epilepsy Warning: Drug has vibrant visual effects!</span>"
/obj/item/organ/internal/cyberimp/brain/sensory_enhancer/examine_more(mob/user)
. = ..()
. += "<i>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.</i>"
. += "<i>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.</i>"
. += "<i>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.</i>"
/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, "<span class='warning'>[ourtarget] is still on cooldown for another [round(COOLDOWN_TIMELEFT(ourtarget, sensory_enhancer_cooldown), 1 SECONDS) / 10] seconds!</span>")
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("<span class='danger'>[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.</span>", \
"<span class='userdanger'>You jolt suddenly as your Qani-Laaca system ejects two empty glass vials rearward, shattering as they land.</span>")
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 \
@@ -121,6 +121,20 @@
. += "<i>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.</i>"
/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)
. = ..()
. += "<span class='userdanger'>Epilepsy Warning: Drug has vibrant visual effects!</span>"
/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
@@ -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