diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index e244633c51a..3d6d07e24ab 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -281,6 +281,8 @@
#define TRAIT_AUTOBREW "autobrewery-syndrome"
#define TRAIT_ZOOMIES "zoomies"
#define TRAIT_SUPER_ZOOMIES "super zoomies"
+#define TRAIT_ENDLESS_RUNNER "endless_runner"
+#define TRAIT_PANICKED_ATTACKER "panicked_attacker"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 603db233968..0192c50fc8a 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -139,6 +139,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_CANNIBAL" = TRAIT_LONGPORKLOVER,
"TRAIT_ZOOMIES" = TRAIT_ZOOMIES,
"TRAIT_SUPER_ZOOMIES" = TRAIT_SUPER_ZOOMIES,
+ "TRAIT_ENDLESS_RUNNER" = TRAIT_ENDLESS_RUNNER,
+ "TRAIT_PANICKED_ATTACKER" = TRAIT_PANICKED_ATTACKER,
"TRAIT_EXPLOSIVE_CRAFTING" = TRAIT_EXPLOSIVE_CRAFTING,
"TRAIT_ADVANCED_EXPLOSIVE_CRAFTING" = TRAIT_ADVANCED_EXPLOSIVE_CRAFTING,
"TRAIT_HEAL_TONGUE" = TRAIT_HEAL_TONGUE,
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 34589a24056..00d3fc8a858 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -110,29 +110,24 @@
var/force_modifier = 0
if(force >= 5)
- if(HAS_TRAIT(user, TRAIT_BIG_LEAGUES))
- force_modifier += 10
-
- if(HAS_TRAIT(user, TRAIT_LITTLE_LEAGUES))
- force_modifier += 5
-
- if(HAS_TRAIT(user, TRAIT_GENTLE))
- force_modifier += -5
-
- if(HAS_TRAIT(user, TRAIT_WIMPY))
- force_modifier += -10
-
- if(HAS_TRAIT(user, TRAIT_BUFFOUT_BUFF))
- force_modifier += (force * 0.25)
-
- if(HAS_TRAIT(user, TRAIT_FEV))
- force_modifier += (force * 0.35)
-
- if(HAS_TRAIT(user, TRAIT_SMUTANT))
- force_modifier += (force * 0.25)
-
- if(HAS_TRAIT(user, TRAIT_GHOULMELEE)) //negative trait
- force_modifier += (-force * 0.25)
+ if(HAS_TRAIT(user, TRAIT_PANICKED_ATTACKER) || HAS_TRAIT(user, TRAIT_GHOULMELEE))
+ force_modifier = (-force * 0.8) // You do 20% damage cus ur scared
+ else
+ if(HAS_TRAIT(user, TRAIT_BIG_LEAGUES))
+ force_modifier += 5
+ if(HAS_TRAIT(user, TRAIT_LITTLE_LEAGUES))
+ force_modifier += 3
+ if(HAS_TRAIT(user, TRAIT_GENTLE))
+ force_modifier += -5
+ if(HAS_TRAIT(user, TRAIT_WIMPY))
+ force_modifier += -10
+ if(HAS_TRAIT(user, TRAIT_BUFFOUT_BUFF))
+ force_modifier += (force * 0.25) // maxes out your damage
+ if(HAS_TRAIT(user, TRAIT_FEV))
+ force_modifier += (force * 0.1)
+ if(HAS_TRAIT(user, TRAIT_SMUTANT))
+ force_modifier += (force * 0.1)
+ force_modifier = clamp(force_modifier, -force, force * 0.25)
var/force_out = force + force_modifier
if(force_out <= 0)
diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm
index 2721630ee43..25f682e50eb 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -58,6 +58,8 @@
if(!isliving(defender))
return
var/armormult = clamp(defender.getarmor(zone, armor_type), 0, 1)
+ if(HAS_TRAIT(attacker, TRAIT_PANICKED_ATTACKER))
+ damage *= 0.2
defender.apply_damage(damage, damage_type, BODY_ZONE_CHEST, blocked = armormult, wound_bonus = woundbonus)
log_combat(attacker, defender, "martial art ([src])")
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index aa6b9e1e9ff..75ae5ab3c77 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -55,7 +55,7 @@
/obj/item/instrument/violin/golden
name = "golden violin"
desc = "A golden musical instrument with four strings and a bow."
- force_wielded = 45
+ force_wielded = 45
icon_state = "golden_violin"
item_state = "golden_violin"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm
index cc2ae3631e9..cae699981ca 100644
--- a/code/game/objects/items/implants/implant.dm
+++ b/code/game/objects/items/implants/implant.dm
@@ -35,7 +35,11 @@
/mob/living/simple_animal/can_be_implanted()
return healable //Applies to robots and most non-organics, exceptions can override.
+/obj/item/implant/proc/post_implant(mob/living/target, mob/living/user, silent = FALSE)
+ return
+/obj/item/implant/proc/post_removed(mob/living/source, silent = FALSE, special = 0)
+ return
//What does the implant do upon injection?
//return 1 if the implant injects
@@ -85,7 +89,7 @@
if(user)
log_combat(user, target, "implanted", "\a [name]")
-
+ post_implant(target, user, silent)
return TRUE
/obj/item/implant/proc/removed(mob/living/source, silent = FALSE, special = 0)
@@ -98,7 +102,7 @@
if(ishuman(source))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
-
+ post_removed(source, silent, special)
return 1
/obj/item/implant/Destroy()
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index e73578b0c45..fee0d39653d 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -14,28 +14,60 @@
/obj/item/implant/adrenalin
- name = "adrenal implant"
- desc = "Removes all stuns."
+ name = "FighterFlight adrenal implant"
+ desc = "An implantable device that delivers a potent mix of rescue drugs when it detects critical injuries. May cause weakness, muscle spasms, and the complete inability to shoot straight. \
+
WARNING: This implant is not intended for use by the elderly, the infirm, or the pregnant. Multiple implants may have unintended effects. No refunds."
icon_state = "adrenal"
uses = 1
+ actions_types = list()
+ var/juicing
+
/obj/item/implant/adrenalin/get_data()
var/dat = {"Implant Specifications:
- Name: Cybersun Industries Adrenaline Implant
- Life: Five days.
- Important Notes: Illegal
+ Name: Nash Salvage and Research Endogenous Rescue Implant
+ Life: 48 hours.
- Implant Details: Subjects injected with implant can activate an injection of medical cocktails.
+ Implant Details: Delivers a dose of rescue drugs to the host upon critial injury.
+ Contents: Epinephrine, Coagulant, Water, Adrenaline.
Function: Removes stuns, increases speed, and has a mild healing effect.
- Integrity: Implant can only be used three times before reserves are depleted."}
+ Integrity: Implant is destroyed on use."}
return dat
-/obj/item/implant/adrenalin/activate()
- . = ..()
- uses--
- imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list(/datum/reagent/medicine/inaprovaline = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/medicine/regen_jelly = 1, /datum/reagent/medicine/stimulants = 1, /datum/reagent/drug/jet = 3), span_boldnotice("You feel a sudden surge of energy!"))
- to_chat(imp_in, span_notice("You feel a sudden surge of energy!"))
- if(!uses)
+/obj/item/implant/adrenalin/post_implant(mob/living/target, mob/living/user, silent = FALSE)
+ RegisterSignal(target, COMSIG_MOB_STATCHANGE, .proc/prejuice)
+ return
+
+/obj/item/implant/adrenalin/post_removed(mob/living/source, silent = FALSE, special = 0)
+ UnregisterSignal(source, COMSIG_MOB_STATCHANGE)
+ return
+
+/obj/item/implant/adrenalin/proc/prejuice(datum/source, newstat)
+ if(juicing)
+ return
+ if(newstat == CONSCIOUS)
+ return
+ playsound(imp_in, 'sound/effects/autoinjector_beeps.ogg', 75, TRUE)
+ addtimer(CALLBACK(src, .proc/juice), 2 SECONDS)
+
+
+/obj/item/implant/adrenalin/proc/juice()
+ playsound(imp_in, 'sound/effects/bamf.ogg', 75, TRUE)
+ imp_in.do_adrenaline(
+ stamina_boost = 75,
+ put_on_feet = TRUE,
+ clamp_unconscious_to = 0,
+ clamp_immobility_to = 0,
+ reset_misc = TRUE,
+ healing_chems = list(
+ /datum/reagent/medicine/epinephrine = 10,
+ /datum/reagent/medicine/coagulant = 19,
+ /datum/reagent/water = 100,
+ /datum/reagent/medicine/adrenaline = 100
+ )
+ )
+ to_chat(imp_in, span_userdanger("You feel your adrenal implant burst!"))
+ if(uses-- <= 0)
qdel(src)
/obj/item/implant/warp
diff --git a/code/modules/fallout/reagents/drugs.dm b/code/modules/fallout/reagents/drugs.dm
index 7361528d286..a8e096c6c2b 100644
--- a/code/modules/fallout/reagents/drugs.dm
+++ b/code/modules/fallout/reagents/drugs.dm
@@ -206,7 +206,6 @@
M.AdjustStun(-25, 0)
M.AdjustKnockdown(-25, 0)
M.AdjustUnconscious(-25, 0)
- M.adjustStaminaLoss(-5, 0)
M.Jitter(2)
if(M.mind)
var/datum/job/job = SSjob.GetJob(M.mind.assigned_role)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 58f94995439..1607f4f3e49 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -227,7 +227,7 @@
thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force, random_turn)
/mob/living/carbon/restrained(ignore_grab)
- . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
+ . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_NECK))
/mob/living/carbon/proc/canBeHandcuffed()
return 0
diff --git a/code/modules/mob/living/carbon/carbon_sprint.dm b/code/modules/mob/living/carbon/carbon_sprint.dm
index fa8ed0fbcfe..269089d56be 100644
--- a/code/modules/mob/living/carbon/carbon_sprint.dm
+++ b/code/modules/mob/living/carbon/carbon_sprint.dm
@@ -1,14 +1,13 @@
/// Sprint buffer ///
/mob/living/carbon/doSprintLossTiles(tiles)
doSprintBufferRegen(FALSE) //first regen.
- if(sprint_buffer)
+ if(sprint_buffer && !HAS_TRAIT(src, TRAIT_ENDLESS_RUNNER))
var/use = min(tiles, sprint_buffer)
if(HAS_TRAIT(src, TRAIT_ZOOMIES))
- sprint_buffer -= use * 1.3
- if(HAS_TRAIT(src, TRAIT_SUPER_ZOOMIES))
- sprint_buffer -= use * 2
- else
- sprint_buffer -= use
+ use *= 0.65
+ else if(HAS_TRAIT(src, TRAIT_SUPER_ZOOMIES))
+ use *= 0.35
+ sprint_buffer -= use
tiles -= use
update_hud_sprint_bar()
if(!tiles) //we had enough, we're done!
@@ -18,11 +17,12 @@
if(!client || !((client in sprint_bind.is_down) || (client in sprint_hold_bind.is_down))) // there are two keybinds, apparently
disable_intentional_sprint_mode()
return // if you're not holding it, you stop sprinting when you run out
- if(HAS_TRAIT(src, TRAIT_ZOOMIES))
- adjustStaminaLoss(tiles * sprint_stamina_cost * -0.7)
- if(HAS_TRAIT(src, TRAIT_SUPER_ZOOMIES))
- adjustStaminaLoss(tiles * sprint_stamina_cost * -0.5)
- return
+ if(HAS_TRAIT(src, TRAIT_ENDLESS_RUNNER))
+ return // you don't stop sprinting if you have this trait
+ else if(HAS_TRAIT(src, TRAIT_ZOOMIES))
+ adjustStaminaLoss(tiles * sprint_stamina_cost * 0.7)
+ else if(HAS_TRAIT(src, TRAIT_SUPER_ZOOMIES))
+ adjustStaminaLoss(tiles * sprint_stamina_cost * 0.5)
else
adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm
index 2406a85e1b8..17ba8cfc0d3 100644
--- a/code/modules/mob/living/carbon/human/human_mobility.dm
+++ b/code/modules/mob/living/carbon/human/human_mobility.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE)
+/mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE, silent = FALSE)
if(!resting || stat || (combat_flags & COMBAT_FLAG_RESISTING_REST))
return FALSE
if(ignoretimer)
@@ -8,12 +8,12 @@
set_resting(FALSE, FALSE)
return TRUE
else if(!CHECK_MOBILITY(src, MOBILITY_RESIST))
- if(!automatic)
+ if(!automatic && !silent)
to_chat(src, span_warning("You are unable to stand up right now."))
return FALSE
else
var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
- if(IS_STAMCRIT(src))
+ if(IS_STAMCRIT(src) && !silent)
to_chat(src, "You're too exhausted to get up!")
return FALSE
combat_flags |= COMBAT_FLAG_RESISTING_REST
@@ -21,20 +21,23 @@
if(!has_gravity())
health_deficiency = health_deficiency*0.2
totaldelay += health_deficiency
- var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
- switch(health_deficiency)
- if(-INFINITY to 10)
- standupwarning = "[src] stands right up!"
- if(10 to 35)
- standupwarning = "[src] tries to stand up."
- if(35 to 60)
- standupwarning = "[src] slowly pushes [p_them()]self upright."
- if(60 to 80)
- standupwarning = "[src] weakly attempts to stand up."
- if(80 to INFINITY)
- standupwarning = "[src] struggles to stand up."
- var/usernotice = automatic ? span_notice("You are now getting up. (Auto)") : span_notice("You are now getting up.")
- visible_message(span_notice("[standupwarning]"), usernotice, vision_distance = 5)
+ if(!silent)
+ var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
+ switch(health_deficiency)
+ if(-INFINITY to 10)
+ standupwarning = "[src] stands right up!"
+ if(10 to 35)
+ standupwarning = "[src] tries to stand up."
+ if(35 to 60)
+ standupwarning = "[src] slowly pushes [p_them()]self upright."
+ if(60 to 80)
+ standupwarning = "[src] weakly attempts to stand up."
+ if(80 to INFINITY)
+ standupwarning = "[src] struggles to stand up."
+ var/usernotice = automatic ? span_notice("You are now getting up. (Auto)") : span_notice("You are now getting up.")
+ visible_message(span_notice("[standupwarning]"), usernotice, vision_distance = 5)
+ if(HAS_TRAIT(src, TRAIT_ENDLESS_RUNNER))
+ totaldelay = 0.1 SECONDS // =3
if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST))
set_resting(FALSE, TRUE)
@@ -43,7 +46,8 @@
else
combat_flags &= ~COMBAT_FLAG_RESISTING_REST
if(resting) //we didn't shove ourselves up or something
- visible_message(span_notice("[src] falls right back down."), span_notice("You fall right back down."))
+ if(!silent)
+ visible_message(span_notice("[src] falls right back down."), span_notice("You fall right back down."))
if(has_gravity())
playsound(src, "bodyfall", 20, 1)
return FALSE
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a71092e2a03..d6de1c454ab 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1491,6 +1491,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
if(HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) // unit test no-miss trait
damage = user.dna.species.punchdamagehigh
+ if(HAS_TRAIT(user, TRAIT_PANICKED_ATTACKER))
+ damage *= 0.2 // too scared!
var/punchedstam = target.getStaminaLoss()
var/punchedbrute = target.getBruteLoss()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index e772b5f6588..ccb32d1a052 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1378,6 +1378,7 @@
update_stamina()
update_mobility()
if(healing_chems)
+ reagents.remove_all(999)
reagents.add_reagent_list(healing_chems)
/mob/living/canface()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 948782b7ba7..fb1da3a8e1f 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -255,7 +255,7 @@
if(user.grab_state) //only the first upgrade is instantaneous
var/old_grab_state = user.grab_state
- var/grab_upgrade_time = instant ? 0 : 30
+ var/grab_upgrade_time = instant ? 0 : 3 SECONDS
visible_message(span_danger("[user] starts to tighten [user.p_their()] grip on [src]!"), \
span_userdanger("[user] starts to tighten [user.p_their()] grip on you!"), target = user,
target_message = span_danger("You start to tighten your grip on [src]!"))
@@ -264,7 +264,7 @@
log_combat(user, src, "attempted to neck grab", addition="neck grab")
if(GRAB_NECK)
log_combat(user, src, "attempted to strangle", addition="kill grab")
- if(!do_mob(user, src, grab_upgrade_time))
+ if(!do_mob(user, src, grab_upgrade_time, allow_movement = TRUE, public_progbar = TRUE))
return 0
if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB)
return 0
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index a40312d0b12..354e6bd9b6a 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -58,7 +58,7 @@
else
resist_a_rest()
-/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
+/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE, silent = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
set_resting(FALSE, TRUE)
return TRUE
@@ -81,7 +81,7 @@
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
var/restrained = restrained()
- var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
+ var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_NECK // Cit change - adds pinning for aggressive-grabbing people on the ground
var/has_limbs = has_arms || ignore_legs || has_legs
var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm
index 5ee3ea8ee64..bbbf13425f6 100644
--- a/code/modules/projectiles/ammunition/_firing.dm
+++ b/code/modules/projectiles/ammunition/_firing.dm
@@ -39,7 +39,9 @@
gun_bullet_spread += distro || 0 // gun's inaccuracy
gun_bullet_spread += variance || 0 // cartridge's inaccuracy
var/player_spread = spread // spread is the player's recoil
- if(HAS_TRAIT(user,TRAIT_INSANE_AIM))
+ if(HAS_TRAIT(user,TRAIT_PANICKED_ATTACKER))
+ player_spread = 100 // lol
+ else if(HAS_TRAIT(user,TRAIT_INSANE_AIM))
player_spread = 0 // nice shot
else
if(HAS_TRAIT(user,TRAIT_FEV)) //You really shouldn't try this at home.
@@ -66,6 +68,8 @@
BB.def_zone = user.zone_selected
BB.suppressed = quiet
BB.damage_threshold_penetration = damage_threshold_penetration
+ if(HAS_TRAIT(user,TRAIT_PANICKED_ATTACKER))
+ BB.damage *= 0.2 // lol
if(isgun(fired_from))
var/obj/item/gun/G = fired_from
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 95a1dea3031..00410445394 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1803,3 +1803,105 @@
for(var/i in user.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.blood_flow = max(0, iter_wound.blood_flow - bleed_reduction_rate)
+
+//used for changeling's adrenaline power
+/datum/reagent/medicine/adrenaline
+ name = "Synthetic Adrenaline"
+ description = "A synthetic cocktail of drugs designed to set a person's fight or flight to FLIGHT."
+ color = "#918e53"
+ value = REAGENT_VALUE_VERY_RARE
+ overdose_threshold = 100
+ metabolization_rate = 20 * REAGENTS_METABOLISM
+ ghoulfriendly = TRUE
+
+/datum/reagent/medicine/adrenaline/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_PANICKED_ATTACKER, type)
+ ADD_TRAIT(L, TRAIT_ENDLESS_RUNNER, type)
+ ADD_TRAIT(L, TRAIT_NOSOFTCRIT, type)
+ L.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
+ ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, "[type]")
+ to_chat(L, span_danger("Your body surges with panicked energy! You feel like you could run forever, but your shaking \
+ hands make it next to impossible to fight!"))
+ L.resist_a_rest(automatic = TRUE, ignoretimer = TRUE, silent = TRUE)
+
+/datum/reagent/medicine/adrenaline/on_mob_end_metabolize(mob/living/L)
+ to_chat(L, span_danger("Your body's panicked energy fades away. The shakes are gone, but you feel exhausted."))
+ REMOVE_TRAIT(L, TRAIT_PANICKED_ATTACKER, type)
+ REMOVE_TRAIT(L, TRAIT_ENDLESS_RUNNER, type)
+ REMOVE_TRAIT(L, TRAIT_NOSOFTCRIT, type)
+ L.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod))
+ REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, "[type]")
+ L.adjustStaminaLoss(200)
+ ..()
+
+/datum/reagent/medicine/adrenaline/on_mob_life(mob/living/carbon/M as mob)
+ M.AdjustUnconscious(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
+ M.AdjustSleeping(-20, 0)
+ M.jitteriness = 20
+ switch(rand(1,100))
+ if(1 to 10)
+ M.emote("scream")
+ if(10 to 15)
+ M.emote("twitch")
+ var/obj/item/mainhand = M.get_active_held_item()
+ if(mainhand)
+ M.drop_all_held_items()
+ to_chat(M, span_userdanger("Your hands flinch and fumble your [mainhand] to the ground!!"))
+ else
+ if(prob(50))
+ var/emote_to_do = pick(
+ "twitch",
+ "shake",
+ "shiver",
+ "tremble",
+ "twitch_s",
+ "sway",
+ "whimper",
+ "drool",
+ "scrungy",
+ )
+ M.emote(emote_to_do)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/adrenaline/overdose_process(mob/living/carbon/M)
+ . = ..()
+ if(!iscarbon(M))
+ return
+ if(prob(50))
+ return
+ switch(rand(1,10))
+ if(1)
+ to_chat(M, span_danger("Your legs wont stop shaking!"))
+ M.confused = clamp(M.confused + 2, 1, 200)
+ if(2)
+ to_chat(M, span_danger("Your eyes ache!"))
+ M.blur_eyes(5)
+ if(3)
+ M.emote("gasp")
+ M.losebreath = clamp(M.losebreath + 3, 1, 10)
+ if(4)
+ to_chat(M, span_danger("You feel your veins burn!"))
+ M.adjustToxLoss(2)
+ if(5)
+ to_chat(M, span_danger("Your insides feel like they're on fire!"))
+ M.adjustOrganLoss(ORGAN_SLOT_EYES, 3)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1, 40)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 1, 40)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, BRAIN_DAMAGE_MILD)
+ if(6)
+ to_chat(M, span_danger("You feel sick to your stomach!"))
+ M.disgust = max(0, M.disgust+50)
+ if(7)
+ to_chat(M, span_danger("Your heart is beating so fast you can feel it in your throat!"))
+ M.adjustStaminaLoss(10*REAGENTS_EFFECT_MULTIPLIER)
+ if(8)
+ M.Jitter(20)
+ if(9)
+ M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
+ if(10)
+ to_chat(M, span_danger("You throw up everything you've eaten in the past week and some blood to boot. You're pretty sure your heart just stopped for a second, too."))
+ M.vomit(30, 1, 1, 5, 0, 0, 0, 60)
+
diff --git a/sound/effects/autoinjector_beeps.ogg b/sound/effects/autoinjector_beeps.ogg
new file mode 100644
index 00000000000..cc8eeb8bc2a
Binary files /dev/null and b/sound/effects/autoinjector_beeps.ogg differ