diff --git a/code/defines/mob/living/carbon/carbon.dm b/code/defines/mob/living/carbon/carbon.dm
index 7715ce30bfb..504be351276 100644
--- a/code/defines/mob/living/carbon/carbon.dm
+++ b/code/defines/mob/living/carbon/carbon.dm
@@ -12,5 +12,8 @@
var/list/datum/disease2/disease/resistances2 = list()
var/antibodies = 0
+ var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
+ // life should decrease this by 1 every tick
+
mob
var/list/disease_symptoms = 0 // a list of disease-incurred symptoms
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 60acabcabaf..2f1a091aba8 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -270,6 +270,8 @@
if(reagents.has_reagent("nuka_cola")) return -1
+ if(analgesic) return -1
+
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
var/health_deficiency = traumatic_shock
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d68b0c714d5..a0cc50e1d58 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -133,6 +133,9 @@
proc
handle_health_updates()
+ // the analgesic effect wears off slowly
+ analgesic = max(0, analgesic - 1)
+
// if the mob has enough health, she should slowly heal
if(stat == 1)
if(health >= 0)
@@ -151,6 +154,8 @@
lying = 1 //Seriously, stay down :x
update_clothing()
+
+
clamp_values()
SetStunned(min(stunned, 20))
@@ -1446,6 +1451,8 @@
handle_shock()
..()
+ if(analgesic) return // analgesic avoids all traumatic shock temporarily
+
if(health < 0)
// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index f53ca6f66f0..e1b9d6c90c5 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -14,6 +14,8 @@
src.traumatic_shock -= 200 // make synaptizine function as good painkiller
if(src.slurring)
src.traumatic_shock -= 20
+ if(src.analgesic)
+ src.traumatic_shock = 0
// broken or ripped off organs will add quite a bit of pain
if(istype(src,/mob/living/carbon/human))
diff --git a/code/modules/mob/living/parasite/meme.dm b/code/modules/mob/living/parasite/meme.dm
index c20f3341bc6..d36d08859ae 100644
--- a/code/modules/mob/living/parasite/meme.dm
+++ b/code/modules/mob/living/parasite/meme.dm
@@ -215,6 +215,7 @@ mob/living/parasite/meme/verb/Hallucinate()
usr << "You make [target] hallucinate."
+// Jump to a closeby target through a whisper
mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob in world)
set category = "Meme"
@@ -245,6 +246,7 @@ mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob i
usr << "You successfully jumped to [target]."
+// Jump to a distant target through a shout
mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob in world)
set category = "Meme"
@@ -275,6 +277,59 @@ mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob
usr << "You successfully jumped to [target]."
+// ATTUNE a mob, adding it to the indoctrinated list
+mob/living/parasite/meme/verb/Attune()
+ set category = "Meme"
+
+ if(host in src.indoctrinated)
+ usr << "You have already attuned this host."
+ return
+
+ if(!host) return
+ if(!use_points(400)) return
+
+ src.indoctrinated.Add(host)
+
+ usr << "You successfully indoctrinated [host]."
+
+// Enables the mob to take a lot more damage
+mob/living/parasite/meme/verb/Analgesic()
+ set category = "Meme"
+
+ if(!host) return
+ if(!use_points(500)) return
+
+ usr << "You inject drugs into [host]."
+ host << "\red You feel your body strengthen and your pain subside.."
+ host.analgesic = 60
+ while(host.analgesic > 0)
+ sleep(10)
+ host << "\red The dizziness wears off, and you can feel pain again.."
+
+
+// Take control of the mob
+mob/living/parasite/meme/verb/Possession()
+ set category = "Meme"
+
+ if(!host) return
+ if(!use_points(500)) return
+
+ usr << "You take control of [host]!"
+ host << "\red Everything goes black.."
+
+ spawn
+ var/client/host_client = host.client
+ var/client/meme_client = src.client
+
+ if(host_client) host_client.mob = null
+ meme_client.mob = host
+
+ sleep(300)
+
+ if(host_client) host_client.mob = host
+ if(meme_client) meme_client.mob = src
+ src << "\red You lose control.."
+
diff --git a/code/modules/mob/organ/pain.dm b/code/modules/mob/organ/pain.dm
index fb0715138c3..21825ce8eaa 100644
--- a/code/modules/mob/organ/pain.dm
+++ b/code/modules/mob/organ/pain.dm
@@ -38,6 +38,8 @@ mob/living/carbon/human/proc/handle_pain()
return
if(reagents.has_reagent("oxycodone"))
return
+ if(analgesic)
+ return
var/maxdam = 0
var/datum/organ/external/damaged_organ = null
for(var/name in organs)