diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm
index 40c239180e..6ed33b0f00 100644
--- a/code/datums/mood_events/drug_events.dm
+++ b/code/datums/mood_events/drug_events.dm
@@ -37,3 +37,19 @@
/datum/mood_event/withdrawal_critical/add_effects(drug_name)
description = "[drug_name]! [drug_name]! [drug_name]!\n"
+
+/datum/mood_event/happiness_drug
+ description = "I can't feel anything and I never want this to end.\n"
+ mood_change = 50
+
+/datum/mood_event/happiness_drug_good_od
+ description = "YES! YES!! YES!!!\n"
+ mood_change = 100
+ timeout = 300
+ special_screen_obj = "mood_happiness_good"
+
+/datum/mood_event/happiness_drug_bad_od
+ description = "NO! NO!! NO!!!\n"
+ mood_change = -100
+ timeout = 300
+ special_screen_obj = "mood_happiness_bad"
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index d77756a649..cd439b1899 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -359,6 +359,83 @@
..()
. = 1
+/datum/reagent/drug/happiness
+ name = "Happiness"
+ id = "happiness"
+ description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings."
+ reagent_state = LIQUID
+ color = "#FFF378"
+ addiction_threshold = 10
+ overdose_threshold = 20
+
+/datum/reagent/drug/happiness/on_mob_add(mob/living/L)
+ ..()
+ L.add_trait(TRAIT_FEARLESS, id)
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug)
+
+/datum/reagent/drug/happiness/on_mob_delete(mob/living/L)
+ L.remove_trait(TRAIT_FEARLESS, id)
+ SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug")
+ ..()
+
+/datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/M)
+ M.jitteriness = 0
+ M.confused = 0
+ M.disgust = 0
+ M.adjustBrainLoss(0.2)
+ ..()
+ . = 1
+
+/datum/reagent/drug/happiness/overdose_process(mob/living/M)
+ if(prob(30))
+ var/reaction = rand(1,3)
+ switch(reaction)
+ if(1)
+ M.emote("laugh")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_good_od)
+ if(2)
+ M.emote("sway")
+ M.Dizzy(25)
+ if(3)
+ M.emote("frown")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_bad_od)
+ M.adjustBrainLoss(0.5)
+ ..()
+ . = 1
+
+/datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ mood.setSanity(min(mood.sanity, SANITY_DISTURBED))
+ M.Jitter(5)
+ if(prob(20))
+ M.emote(pick("twitch","laugh","frown"))
+ ..()
+
+/datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ mood.setSanity(min(mood.sanity, SANITY_UNSTABLE))
+ M.Jitter(10)
+ if(prob(30))
+ M.emote(pick("twitch","laugh","frown"))
+ ..()
+
+/datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ mood.setSanity(min(mood.sanity, SANITY_CRAZY))
+ M.Jitter(15)
+ if(prob(40))
+ M.emote(pick("twitch","laugh","frown"))
+ ..()
+
+/datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ mood.setSanity(SANITY_INSANE)
+ M.Jitter(20)
+ if(prob(50))
+ M.emote(pick("twitch","laugh","frown"))
+ ..()
+ . = 1
+
/datum/reagent/drug/skooma
name = "Skooma"
id = "skooma"
@@ -429,4 +506,3 @@
if(prob(40))
M.emote(pick("twitch","drool","moan"))
..()
-
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 58926d0c69..34643085e7 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -62,7 +62,7 @@
M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC)
if(M.blood_volume < BLOOD_VOLUME_NORMAL)
M.blood_volume = BLOOD_VOLUME_NORMAL
-
+
for(var/thing in M.diseases)
var/datum/disease/D = thing
if(D.severity == DISEASE_SEVERITY_POSITIVE)
@@ -1286,3 +1286,37 @@
M.adjustStaminaLoss(1.5*REM, 0)
..()
return TRUE
+
+/datum/reagent/medicine/psicodine
+ name = "Psicodine"
+ id = "psicodine"
+ description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage."
+ reagent_state = LIQUID
+ color = "#07E79E"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/psicodine/on_mob_add(mob/living/L)
+ ..()
+ L.add_trait(TRAIT_FEARLESS, id)
+
+/datum/reagent/medicine/psicodine/on_mob_delete(mob/living/L)
+ L.remove_trait(TRAIT_FEARLESS, id)
+ ..()
+
+/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M)
+ M.jitteriness = max(0, M.jitteriness-6)
+ M.dizziness = max(0, M.dizziness-6)
+ M.confused = max(0, M.confused-6)
+ M.disgust = max(0, M.disgust-6)
+ GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then...
+ mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral
+ ..()
+ . = 1
+
+/datum/reagent/medicine/psicodine/overdose_process(mob/living/M)
+ M.hallucination = min(max(0, M.hallucination + 5), 60)
+ M.adjustToxLoss(1, 0)
+ ..()
+ . = 1
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index d91e2af7e9..27b1fe12ee 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -41,6 +41,13 @@
results = list("aranesp" = 3)
required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1)
+/datum/chemical_reaction/happiness
+ name = "Happiness"
+ id = "happiness"
+ results = list("happiness" = 4)
+ required_reagents = list("nitrous_oxide" = 2, "epinephrine" = 1, "ethanol" = 1)
+ required_catalysts = list("plasma" = 5)
+
/datum/chemical_reaction/skooma
name = "skooma"
id = "skooma"
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index dc7c32d925..4cecf4216c 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -172,6 +172,12 @@
results = list("mutadone" = 3)
required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
+/datum/chemical_reaction/neurine
+ name = "Neurine"
+ id = "neurine"
+ results = list("neurine" = 3)
+ required_reagents = list("mannitol" = 1, "acetone" = 1, "oxygen" = 1)
+
/datum/chemical_reaction/antihol
name = "antihol"
id = "antihol"
@@ -252,3 +258,9 @@
results = list("modafinil" = 5)
required_reagents = list("diethylamine" = 1, "ammonia" = 1, "phenol" = 1, "acetone" = 1, "sacid" = 1)
required_catalysts = list("bromine" = 1) // as close to the real world synthesis as possible
+
+/datum/chemical_reaction/psicodine
+ name = "Psicodine"
+ id = "psicodine"
+ results = list("psicodine" = 5)
+ required_reagents = list( "mannitol" = 2, "water" = 2, "impedrezene" = 1)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index c6c40de31a..60734aafc6 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -762,19 +762,19 @@
specific_listeners += L //focus on those with the specified name
//Cut out the name so it doesn't trigger commands
found_string = L.real_name
- power_multiplier *= 2
+ power_multiplier += 0.5
else if(dd_hasprefix(message, L.first_name()))
specific_listeners += L //focus on those with the specified name
//Cut out the name so it doesn't trigger commands
found_string = L.first_name()
- power_multiplier *= 2
+ power_multiplier += 0.5
else if(L.mind && L.mind.assigned_role && dd_hasprefix(message, L.mind.assigned_role))
specific_listeners += L //focus on those with the specified job
//Cut out the job so it doesn't trigger commands
found_string = L.mind.assigned_role
- power_multiplier *= 2
+ power_multiplier += 0.25
if(specific_listeners.len)
listeners = specific_listeners
@@ -782,7 +782,7 @@
message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)
//phase 1
- var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile")
+ var/static/regex/enthral_words = regex("relax|obey|give in|love|serve|docile|so easy")
var/static/regex/reward_words = regex("good boy|good girl|good pet")
var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush")
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
@@ -838,16 +838,81 @@
var/static/regex/snap_words = regex("snap") //CITADEL CHANGE
//var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE
+ var/distancelist = list(1.5,1.5,1.3,1.2,1.1,1,0.8,0.6,0.5,0.25)
+ var/static/regex/reward_words = regex("good boy|good girl|good pet")
+ var/static/regex/silence_words = regex("silence|be silent|ssh|quiet|hush")
+ var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
+ var/static/regex/punish_words = regex("bad boy|bad girl|bad pet")
+ var/static/regex/resist_words = regex("resist|snap out of it|come to your senses")//useful if two enthrallers are fighting
+ var/static/regex/forget_words = regex("forget|muddled|")
//enthral_words, reward_words, silence_words attract_words punish_words desire_words resist_words forget_words
//ENTHRAL
if(findtext(message, enthral_words))
- cooldown = COOLDOWN_VTHRAL
for(var/V in listeners)
var/mob/living/L = V
var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
- E.enthralTally += power_multiplier
+ power_multiplier *= distancelist[get_dist(user, V)+1]
+ //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values
+ if(message.len > 50)
+ E.enthralTally += (power_multiplier*((message.len/200) + 1) //encourage players to say more than one word.
+ else
+ E.enthralTally += power_multiplier*1.25
+ cooldown = COOLDOWN_VTHRAL
+
+ //REWARD
+ if(findtext(message, reward_words))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
+ power_multiplier *= distancelist[get_dist(user, V)+1]
+ //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values
+ if (L.canbearoused)
+ //E.resistanceTally -= 1
+ L.adjustArousalLoss(1*power_multiplier)
+ else
+ E.resistanceTally /= 2*power_multiplier
+ cooldown = COOLDOWN_VTHRAL
+
+ //PUNISH
+ if(findtext(message, punish_words))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
+ power_multiplier *= distancelist[get_dist(user, V)+1]
+ //power_multiplier += (get_dist(V, user)**-2)*2 //2, 2, 0.5, 0.2, 0.125, 0.05, 0.04, 0.03, alternatively make a list and use the return as index values
+ if (L.canbearoused)
+ E.resistanceTally /= 1*power_multiplier
+ L.adjustArousalLoss(-2*power_multiplier)
+ else
+ E.resistanceTally /= 3*power_multiplier //asexuals are masochists apparently (not seriously)
+ cooldown = COOLDOWN_VTHRAL
+
+ //SILENCE
+ else if((findtext(message, silence_words)))
+ cooldown = COOLDOWN_VSTUN
+ for(var/mob/living/carbon/C in listeners)
+ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
+ if L.phase == 3 //If target is fully enthralled,
+ C.add_trait(TRAIT_MUTE, TRAUMA_TRAIT)
+ else
+ C.silent += ((10 * power_multiplier) * E.phase
+
+ //RESIST
+ else if((findtext(message, silence_words)))
+ cooldown = COOLDOWN_VSTUN
+ for(var/mob/living/carbon/C in listeners)
+ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
+ E.deltaResist += (power_multiplier)
+
+ //FORGET
+ else if((findtext(message, silence_words)))
+ cooldown = COOLDOWN_VSTUN
+ for(var/mob/living/carbon/C in listeners)
+ var/datum/status_effect/chem/enthral/E = L.has_status_effect(/datum/status_effect/chem/enthral)
+ E.deltaResist += (power_multiplier)
+
var/i = 0
//STUN
@@ -877,13 +942,6 @@
for(var/mob/living/carbon/C in listeners)
C.vomit(10 * power_multiplier, distance = power_multiplier)
- //SILENCE
- else if((findtext(message, silence_words)))
- cooldown = COOLDOWN_STUN
- for(var/mob/living/carbon/C in listeners)
- if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime"))
- power_multiplier *= 3
- C.silent += (10 * power_multiplier)
//HALLUCINATE
else if((findtext(message, hallucinate_words)))
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 801938d721..724ab291f2 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -150,21 +150,24 @@
///////////////////////////////////////////
*/
-/datum/status_effect/chem/enthral
- id = "enthral"
+/datum/status_effect/chem/enthrall
+ id = "enthrall"
var/mob/living/E //E for enchanter
//var/mob/living/V = list() //V for victims
- var/enthralTally = 10
+ var/enthrallTally = 10
var/resistanceTally = 0
- var/phase = 0
+ var/deltaResist
+ var/deltaEnthrall
+ var/phase = 1 //1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled
+ var/command
var/enthralID
-/datum/status_effect/chem/enthra/on_apply(mob/living/carbon/M)
+/datum/status_effect/chem/enthrall/on_apply(mob/living/carbon/M)
if(M.ID == )
-/datum/status_effect/chem/enthral/tick(mob/living/carbon/M)
- redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist))))
+/datum/status_effect/chem/enthrall/tick(mob/living/carbon/M)
+ redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed
switch(phase)
if(0)
return
@@ -173,7 +176,7 @@
-/datum/status_effect/chem/enthral/proc/owner_resist(mob/living/carbon/M)
+/datum/status_effect/chem/enthrall/proc/owner_resist(mob/living/carbon/M)
to_chat(owner, "You attempt to shake the mental cobwebs from your mind!")
if (M.canbearoused)
resistance *= ((100 - M.arousalloss/100)/100)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index 5855574d76..c89a88af0b 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -39,10 +39,10 @@
addiction_stage4_end = 43 //Incase it's too long
var/location_created
var/turf/open/location_return = null
- var/addictCyc1 = 1
- var/addictCyc2 = 1
- var/addictCyc3 = 1
- var/addictCyc4 = 1
+ var/addictCyc1 = 0
+ var/addictCyc2 = 0
+ var/addictCyc3 = 0
+ var/addictCyc4 = 0
var/mob/living/fermi_Tclone = null
var/teleBool = FALSE
mob/living/carbon/purgeBody
@@ -152,7 +152,7 @@
/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery.
switch(src.addictCyc4)
- if(1)
+ if(0)
do_sparks(5,FALSE,M)
do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one!
do_sparks(5,FALSE,M)
@@ -172,7 +172,7 @@
src.addictCyc4++
..()
- //. = 1
+ . = 1
///datum/reagent/fermi/eigenstate/overheat_explode(mob/living/M)
// return