mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
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:
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user