diff --git a/code/_globalvars/lists/reagents_lists.dm b/code/_globalvars/lists/reagents_lists.dm
index 869f865580a..eb4c2c84ff0 100644
--- a/code/_globalvars/lists/reagents_lists.dm
+++ b/code/_globalvars/lists/reagents_lists.dm
@@ -22,7 +22,7 @@ GLOBAL_LIST_INIT(rare_chemicals, list("minttoxin","syndicate_nanites", "xenomicr
GLOBAL_LIST_INIT(standard_medicines, list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs",
"mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
"salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol",
- "potass_iodide","pen_acid","mannitol","oculine","styptic_powder",
+ "potass_iodide","pen_acid","mannitol","oculine","styptic_powder","happiness",
"methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia",
"diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin",
"frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin"))
diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm
index 010248f84c9..ad6d886cd37 100644
--- a/code/game/objects/items/contraband.dm
+++ b/code/game/objects/items/contraband.dm
@@ -3,12 +3,13 @@
//Illicit drugs~
/obj/item/storage/pill_bottle/happy
name = "Happy pills"
- desc = "Highly illegal drug. When you want to see the rainbow."
+ desc = "Real fun drugs, for when you want to see the rainbow. Happy happy joy joy!"
wrapper_color = COLOR_PINK
/obj/item/storage/pill_bottle/happy/populate_contents()
- for(var/i in 1 to 7)
+ for(var/i in 1 to 5)
new /obj/item/reagent_containers/food/pill/happy(src)
+ new /obj/item/reagent_containers/food/pill/happy/happiness(src)
/obj/item/storage/pill_bottle/zoom
name = "Zoom pills"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical_lockers.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical_lockers.dm
index 414055b2043..594548188a0 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical_lockers.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical_lockers.dm
@@ -104,6 +104,9 @@
new /obj/item/reagent_containers/food/pill/methamphetamine(src)
new /obj/item/reagent_containers/food/pill/methamphetamine(src)
new /obj/item/reagent_containers/food/pill/methamphetamine(src)
+ new /obj/item/reagent_containers/food/pill/happy_psych(src)
+ new /obj/item/reagent_containers/food/pill/happy_psych(src)
+ new /obj/item/reagent_containers/food/pill/happy_psych(src)
new /obj/item/reagent_containers/food/pill/patch/nicotine(src)
new /obj/item/reagent_containers/food/pill/patch/nicotine(src)
new /obj/item/reagent_containers/food/pill/patch/nicotine(src)
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index 8f8fdfa2478..9dedaa18d83 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -27,7 +27,7 @@
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow
mutatelist = list(/obj/item/seeds/cannabis/death,
/obj/item/seeds/cannabis/ultimate)
- reagents_add = list("lsd" = 0.15, "thc" = 0.15, "cbd" = 0.15)
+ reagents_add = list("lsd" = 0.15, "thc" = 0.15, "cbd" = 0.15, "happiness" = 0.15)
rarity = 40
/obj/item/seeds/cannabis/death
diff --git a/code/modules/mob/living/carbon/human/human_life.dm b/code/modules/mob/living/carbon/human/human_life.dm
index c04a8278623..6ccdbb7ab2f 100644
--- a/code/modules/mob/living/carbon/human/human_life.dm
+++ b/code/modules/mob/living/carbon/human/human_life.dm
@@ -787,7 +787,7 @@
break
for(var/datum/reagent/R in reagents.reagent_list)//handles different chems' influence on pulse
- if(R.heart_rate_increase)
+ if(R.has_heart_rate_increase())
if(temp <= PULSE_FAST && temp >= PULSE_NONE)
temp++
break
diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm
index f804a1ffe95..8860b98ea23 100644
--- a/code/modules/reagents/chemistry/reagents/drugs.dm
+++ b/code/modules/reagents/chemistry/reagents/drugs.dm
@@ -590,6 +590,68 @@
H.LoseBreath(10 SECONDS) // procs 5 times, mostly a visual thing. damage could stack to cause a slowdown.
H.Confused(10 SECONDS)
+/datum/reagent/happiness
+ name = "Happiness"
+ id = "happiness"
+ description = "Fills you with ecstasic numbness and causes minor brain damage. If overdosed, causes sudden mood swings and spikes in heart rate."
+ reagent_state = LIQUID
+ color = "#f2ff00"
+ overdose_threshold = 20
+ taste_description = "paint thinner"
+ shock_reduction = 20
+ allowed_overdose_process = TRUE
+ addiction_chance = 2 // fairly rare, but funny
+ addiction_chance_additional = 20
+ addiction_threshold = 20
+ minor_addiction = TRUE
+
+/datum/reagent/happiness/on_mob_life(mob/living/M)
+ var/update_flags = STATUS_UPDATE_NONE
+ if(prob(15))
+ M.emote(pick("laugh", "giggle", "smile", "grin"))
+ else if(prob(10))
+ to_chat(M, "You feel [pick("great", "good", "amazing", "really nice", "magical")]!")
+ else if(prob(1))
+ M.say("hehehe") // you WILL hehehe
+
+ if(prob(50))
+ M.AdjustConfused(-10 SECONDS) // same as degreaser
+ M.AdjustJitter(-10 SECONDS)
+ update_flags |= M.adjustBrainLoss(0.2, FALSE)
+ return ..() | update_flags
+
+/datum/reagent/happiness/overdose_process(mob/living/M, severity)
+ var/list/overdose_info = ..()
+ var/effect = overdose_info[REAGENT_OVERDOSE_EFFECT]
+ var/update_flags = overdose_info[REAGENT_OVERDOSE_FLAGS]
+
+ if(prob(15))
+ M.emote(pick("cry", "frown", "sulk", "gurgle"))
+ else if(prob(10))
+ to_chat(M, "You feel [pick("like shit", "terrible", "weak", "like a rhumba beat", "hollow")]!")
+ update_flags |= M.adjustBrainLoss(0.2, FALSE)
+ if(!prob(10 * (severity ** 2))) // 1 - 10, 2 - 40
+ return list(effect, update_flags)
+
+ var/static/list/good_messages = list("YES! YES!! YES!!", "I AM UNSTOPPABLE", "THIS IS GREAT", "THERE WILL NEVER BE ANYONE BETTER",
+ "GLORY IS MINE", "WE'RE SO BACK", "I AM FUCKING INVINCIBLE", "I'M HANGING IN THERE")
+ var/static/list/bad_messages = list("NO! NO!! NO!!", "OH MY GOD", "THEY'RE LOOKING AT ME", "KILLLL MEEE, KILLLLL ME",
+ "I CAN'T FUCKING TAKE IT ANYMORE", "ARRGH, IT'S OVER")
+
+ var/message = pick(good_messages)
+ var/class = "greenannounce" // theres not many good green classes
+ if(prob(50))
+ message = pick(bad_messages)
+ class = "danger"
+
+ M.Dizzy(50 SECONDS) // shaking with glee or fear, whichever you prefer
+ to_chat(M, "[message][pick("!", "!!", "!!!")]")
+ return list(effect, update_flags)
+
+/datum/reagent/happiness/has_heart_rate_increase()
+ return overdosed
+
+
/datum/reagent/thc
name = "Tetrahydrocannabinol"
id = "thc"
diff --git a/code/modules/reagents/chemistry/reagents_datum.dm b/code/modules/reagents/chemistry/reagents_datum.dm
index cc61576ee8b..edc0466fe9b 100644
--- a/code/modules/reagents/chemistry/reagents_datum.dm
+++ b/code/modules/reagents/chemistry/reagents_datum.dm
@@ -287,3 +287,6 @@
if(M.healthdoll)
M.healthdoll.cached_healthdoll_overlays.Cut()
M.updatehealth("fakedeath reagent end")
+
+/datum/reagent/proc/has_heart_rate_increase()
+ return heart_rate_increase
diff --git a/code/modules/reagents/chemistry/recipes/drugs_reactions.dm b/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
index 11db37ca83c..d9d928ff7ec 100644
--- a/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs_reactions.dm
@@ -91,6 +91,14 @@
required_reagents = list("epinephrine" = 1, "atropine" = 1, "insulin" = 1)
result_amount = 3
+/datum/chemical_reaction/happiness
+ name = "Happiness"
+ id = "happiness"
+ result = "happiness"
+ required_reagents = list("space_drugs" = 1, "nitrogen" = 1, "oxygen" = 1, "sacid" = 2)
+ required_catalysts = list("plasma" = 5)
+ result_amount = 5
+
/datum/chemical_reaction/fliptonium
name = "fliptonium"
id = "fliptonium"
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index b5fc7ce019a..2130bad9328 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -87,12 +87,23 @@
icon_state = "pill8"
list_reagents = list("haloperidol" = 15)
+/obj/item/reagent_containers/food/pill/happy_psych
+ name = "mood stabilizer pill"
+ desc = "Used to temporarily alleviate anxiety and depression. Take only as prescribed."
+ icon_state = "pill_happy"
+ list_reagents = list("happiness" = 15, "mannitol" = 5)
+
/obj/item/reagent_containers/food/pill/happy
name = "happy pill"
- desc = "Happy happy joy joy!"
- icon_state = "pill18"
+ desc = "They have little happy faces on them and smell like marker pens."
+ icon_state = "pill_happy"
list_reagents = list("space_drugs" = 15, "sugar" = 15)
+/obj/item/reagent_containers/food/pill/happy/happiness
+ name = "fun pill"
+ desc = "Makes you feel real good!"
+ list_reagents = list("happiness" = 15)
+
/obj/item/reagent_containers/food/pill/zoom
name = "zoom pill"
desc = "Zoooom!"
diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm
index dfd0c849afe..43e2f710ca7 100644
--- a/code/modules/surgery/surgery_helpers.dm
+++ b/code/modules/surgery/surgery_helpers.dm
@@ -22,6 +22,8 @@
return 0.85
if(drunk >= 15)//a little drunk
return 0.85
+ if(target.reagents.has_reagent("happiness")) // fuck yeah
+ return 0.81
return 0.8 //20% failure chance
/proc/get_location_modifier(mob/target)
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 0da54f95f80..838676795c2 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/strings/chemistry_tools.json b/strings/chemistry_tools.json
index c6a67824153..9c4352d997b 100644
--- a/strings/chemistry_tools.json
+++ b/strings/chemistry_tools.json
@@ -405,7 +405,8 @@
"prions",
"nanomachines",
"chlorine",
- "fluorine"
+ "fluorine",
+ "happiness"
],
"CYBERPUNK_drug_adulterants_safe": [
"mercury",