diff --git a/STALKER 12/code/modules/food&drinks/drinks/drinks.dm b/STALKER 12/code/modules/food&drinks/drinks/drinks.dm
index b00ac3c..fb497fd 100644
--- a/STALKER 12/code/modules/food&drinks/drinks/drinks.dm
+++ b/STALKER 12/code/modules/food&drinks/drinks/drinks.dm
@@ -46,6 +46,7 @@
var/fraction = min(gulp_size/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
reagents.trans_to(M, gulp_size)
+ M.bladder += reagents.total_volume * 2 //For pissing
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
diff --git a/STALKER 12/code/modules/mob/living/carbon/human/emote.dm b/STALKER 12/code/modules/mob/living/carbon/human/emote.dm
index 118e3f6..685f24f 100644
--- a/STALKER 12/code/modules/mob/living/carbon/human/emote.dm
+++ b/STALKER 12/code/modules/mob/living/carbon/human/emote.dm
@@ -317,6 +317,14 @@
message = "[src] yawns."
m_type = 2
+ if ("shit","shits")
+ handle_shit()
+ m_type = 1
+
+ if ("piss","pisses")
+ handle_piss()
+ m_type = 1
+
if("wag","wags")
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || ((dna.features["tail_human"] != "None") && !("waggingtail_human" in dna.species.mutant_bodyparts))))
message = "[src] wags \his tail."
diff --git a/STALKER 12/code/modules/mob/living/carbon/human/species.dm b/STALKER 12/code/modules/mob/living/carbon/human/species.dm
index eb66d53..b1e2111 100644
--- a/STALKER 12/code/modules/mob/living/carbon/human/species.dm
+++ b/STALKER 12/code/modules/mob/living/carbon/human/species.dm
@@ -643,6 +643,7 @@
H.Jitter(5)
hunger_rate = 3 * HUNGER_FACTOR
H.nutrition = max (0, H.nutrition - hunger_rate)
+ H.bowels += H.nutrition * 0.003 //For pooping
if (H.nutrition > NUTRITION_LEVEL_FULL)
if(H.overeatduration < 600) //capped so people don't take forever to unfat
diff --git a/STALKER 12/code/modules/mob/shit_piss.dm b/STALKER 12/code/modules/mob/shit_piss.dm
new file mode 100644
index 0000000..82981a9
--- /dev/null
+++ b/STALKER 12/code/modules/mob/shit_piss.dm
@@ -0,0 +1,403 @@
+/*#####SHIT AND PISS#####
+##Ok there's a lot of stupid shit here. Literally, but let me explain a bit why I put this here.
+##I feel like poo and pee add a degree of autistic realism that you wouldn't otherwise get. And I'm autistic about that kind of thing.
+##This file contains all the reagents, decals, objects and life procs. These procs are used in human/life.dm and human/emote.dm
+##Have some shitty fun. - Matt
+*/
+
+//Counters for the end of the round.
+var/global/times_came = 0
+var/global/shit_left = 0
+var/global/piss_left = 0
+var/global/deaths_in_space = 0
+var/global/total_deaths = 0
+var/global/teeth_lost = 0
+
+//####DEFINES####
+
+/mob
+ var/bladder = 0
+ var/bowels = 0
+
+//#####DECALS#####
+/obj/effect/decal/cleanable/poo
+ name = "poo stain"
+ desc = "Well that stinks."
+ density = 0
+ anchored = 1
+ layer = 2
+ icon = 'icons/effects/pooeffect.dmi'
+ icon_state = "floor1"
+ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7", "floor8")
+ var/dried = 0
+
+
+/obj/effect/decal/cleanable/poo/New()
+ icon = 'icons/effects/pooeffect.dmi'
+ icon_state = pick(src.random_icon_states)
+ for(var/obj/effect/decal/cleanable/poo/shit in src.loc)
+ if(shit != src)
+ qdel(shit)
+ spawn(6000)
+ dried = 1
+ name = "dried poo stain"
+ desc = "It's a dried poo stain..."
+
+
+/obj/effect/decal/cleanable/poo/tracks
+ icon_state = "tracks"
+ random_icon_states = null
+
+/obj/effect/decal/cleanable/poo/drip
+ name = "drips of poo"
+ desc = "It's brown."
+ density = 0
+ anchored = 1
+ layer = 2
+ icon = 'icons/effects/pooeffect.dmi'
+ icon_state = "drip1"
+ random_icon_states = list("drip1", "drip2", "drip3", "drip4", "drip5")
+
+//This proc is really deprecated.
+/*/obj/effect/decal/cleanable/poo/proc/streak(var/list/directions)
+ spawn (0)
+ var/direction = pick(directions)
+ for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
+ sleep(3)
+ if (i > 0)
+ new /obj/effect/decal/cleanable/poo(src.loc)
+ if (step_to(src, get_step(src, direction), 0))
+ break
+*/
+
+/obj/effect/decal/cleanable/poo/Crossed(AM as mob|obj, var/forceslip = 0)
+ if (istype(AM, /mob/living/carbon) && src.dried == 0)
+ var/mob/living/carbon/M = AM
+ if (M.m_intent == "walk")
+ return
+
+ if(prob(5))
+ M.slip("poo")
+
+//These aren't needed for now.
+///obj/effect/decal/cleanable/poo/tracks/Crossed(AM as mob|obj)
+// return
+
+//obj/effect/decal/cleanable/poo/drip/Crossed(AM as mob|obj)
+// return
+
+/obj/effect/decal/cleanable/urine
+ name = "urine stain"
+ desc = "Someone couldn't hold it.."
+ density = 0
+ anchored = 1
+ layer = 2
+ icon = 'icons/effects/pooeffect.dmi'
+ icon_state = "pee1"
+ random_icon_states = list("pee1", "pee2", "pee3")
+ var/dried = 0
+
+/obj/effect/decal/cleanable/urine/Crossed(AM as mob|obj)
+ if (istype(AM, /mob/living/carbon))
+ var/mob/living/carbon/M = AM
+ if ((ishuman(M) && istype(M:shoes, /obj/item/clothing/shoes/galoshes)) || M.m_intent == "walk")
+ return
+
+ if((!dried) && prob(5))
+ M.slip("urine")
+
+/obj/effect/decal/cleanable/urine/New()
+ ..()
+ icon_state = pick(random_icon_states)
+ //spawn(10) src.reagents.add_reagent("urine",5)
+ for(var/obj/effect/decal/cleanable/urine/piss in src.loc)
+ if(piss != src)
+ qdel(piss)
+
+ spawn(800)
+ dried = 1
+ name = "dried urine stain"
+ desc = "That's a dried crusty urine stain. Fucking janitors."
+
+
+
+/obj/effect/decal/cleanable/cum
+ name = "cum"
+ desc = "It's pie cream from a cream pie. Or not..."
+ density = 0
+ layer = 2
+ icon = 'icons/obj/cum.dmi'
+ blood_DNA = list()
+ anchored = 1
+ random_icon_states = list("cum1", "cum3", "cum4", "cum5", "cum6", "cum7", "cum8", "cum9", "cum10", "cum11", "cum12")
+
+
+/obj/effect/decal/cleanable/cum/New()
+ ..()
+ icon_state = pick(random_icon_states)
+ for(var/obj/effect/decal/cleanable/cum/jizz in src.loc)
+ if(jizz != src)
+ qdel(jizz)
+
+
+//#####REAGENTS#####
+
+//SHIT
+/datum/reagent/poo
+ name = "poo"
+ id = "poo"
+ description = "It's poo."
+ reagent_state = LIQUID
+ color = "#643200"
+
+
+/datum/reagent/poo/on_mob_life(var/mob/living/M)
+ if(!M)
+ M = holder.my_atom
+
+ M.adjustToxLoss(1)
+ holder.remove_reagent(src.id, 0.2)
+ ..()
+ return
+
+//TO MAKE add_poo() PROC
+/* reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ src = null
+ if(istype(M, /mob/living/carbon/human) && method==TOUCH)
+ if(M:wear_suit) M:wear_suit.add_poo()
+ if(M:w_uniform) M:w_uniform.add_poo()
+ if(M:shoes) M:shoes.add_poo()
+ if(M:gloves) M:gloves.add_poo()
+ if(M:head) M:head.add_poo()
+ //if(method==INGEST)
+ // if(prob(20))
+ // M.contract_disease(new /datum/disease/gastric_ejections)
+ // holder.add_reagent("gastricejections", 1)
+ // M:toxloss += 0.1
+ // holder.remove_reagent(src.id, 0.2)
+*/
+
+/datum/reagent/poo/reaction_turf(var/turf/T)
+ src = null
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/poo(T)
+
+//URINE
+/datum/reagent/urine
+ name = "urine"
+ id = "urine"
+ description = "It's pee."
+ reagent_state = LIQUID
+ color = COLOR_YELLOW
+
+/datum/reagent/urine/reaction_turf(var/turf/T)
+ src = null
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/urine(T)
+
+//SEMEN
+/datum/reagent/semen
+ name = "semen"
+ id = "semen"
+ description = "It's semen."
+ reagent_state = LIQUID
+ color = COLOR_WHITE
+
+/datum/reagents/proc/reaction_turf(var/turf/target)
+ if(!target || !istype(target))
+ return
+
+/datum/reagent/semen/reaction_turf(var/turf/T)
+ src = null
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/cum(T)
+
+/obj/item/weapon/reagent_containers/food/snacks/poo
+ name = "poo"
+ desc = "A chocolately surprise!"
+ icon = 'icons/obj/poop.dmi'
+ icon_state = "poop2"
+ item_state = "poop"
+
+/obj/item/weapon/reagent_containers/food/snacks/poo/New()
+ ..()
+ icon_state = pick("poop1", "poop2", "poop3", "poop4", "poop5", "poop6", "poop7")
+ reagents.add_reagent("poo", 10)
+ bitesize = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/poo/throw_impact(atom/hit_atom)
+ //if(prob(50)) //this is so we actually have a chance of recovering some from disposal.
+ // return
+ playsound(src.loc, "sound/effects/squishy.ogg", 40, 1)
+ var/turf/T = src.loc
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/poo(T)
+ //qdel(src) THIS IS BAD AND YOU SHOULD FEEL BAD.
+ ..()
+
+//#####BOTTLES#####
+
+//PISS
+/obj/item/weapon/reagent_containers/glass/bottle/urine
+ name = "urine bottle"
+ desc = "A small bottle. Contains urine."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle15"
+
+ New()
+ ..()
+ reagents.add_reagent("urine", 30)
+
+
+//#####LIFE PROCS#####
+
+//poo and pee counters. This is called in human/handle_stomach.
+/mob/living/carbon/human/proc/handle_excrement()
+ if(bowels <= 0)
+ bowels = 0
+ if(bladder <= 0)
+ bladder = 0
+
+ if(bowels >= 250)
+ switch(bowels)
+ if(250 to 400)
+ if(prob(5))
+ src << "You need to use the bathroom."
+ bowels += 15
+ if(400 to 450)
+ if(prob(5))
+ src << "You really need to use the restroom!"
+ bowels += 15
+ if(450 to 500)
+ if(prob(2))
+ handle_shit()
+ else if(prob(10))
+ src << "You're about to shit yourself!"
+ bowels += 25
+ if(500 to 550)
+ if(prob(15))
+ handle_shit()
+ else if(prob(30))
+ src << "OH MY GOD YOU HAVE TO SHIT!"
+ bowels += 35
+ if(550 to INFINITY)
+ handle_shit()
+
+ if(bladder >= 100)//Your bladder is smaller than your colon
+ switch(bladder)
+ if(100 to 250)
+ if(prob(5))
+ src << "You need to use the bathroom."
+ bladder += 15
+ if(250 to 400)
+ if(prob(5))
+ src << "You really need to use the restroom!"
+ bladder += 15
+ if(400 to 500)
+ if(prob(2))
+ handle_piss()
+ else if(prob(10))
+ src << "You're about to piss yourself!"
+ bladder += 25
+ if(500 to 550)
+ if(prob(15))
+ handle_piss()
+ else if(prob(30))
+ src << "OH MY GOD YOU HAVE TO PEE!"
+ bladder += 35
+ if(550 to INFINITY)
+ handle_piss()
+
+//Shitting
+/mob/living/carbon/human/proc/handle_shit()
+ var/message = null
+ if (src.bowels >= 30)
+
+ //Poo in the loo. // yeah i actually don't want to look for toilet objects so for now i'll just comment that section, if anyone wants - go ahead and add some shitters
+ //var/obj/item/trash/konserva/T = locate() in src.loc
+ //var/obj/item/trash/konserva/shproti/T2 = locate() in src.loc
+ var/mob/living/M = locate() in src.loc
+ //if(T)
+ // message = "[src] defecates into \the [T]."
+
+ //else if (T2)
+ // message = "[src] defecates into \the [T2]."
+ // var/obj/item/weapon/reagent_containers/food/snacks/poo/V = new/obj/item/weapon/reagent_containers/food/snacks/poo(src.loc)
+ // if(reagents)
+ // reagents.trans_to(V, rand(1,5))
+
+ // if(T2.CanInsertItem(src)) //attempt to insert the shit into the toilet.
+ // V.forceMove(T2)
+ // else
+ // shit_left++
+
+ if(w_uniform)
+ message = "[src] shits \his pants."
+ reagents.add_reagent("poo", 10)
+
+ //Poo on the face.
+ else if(M != src && M.lying)//Can only shit on them if they're lying down.
+ message = "[src] shits right on [M]'s face!"
+ M.reagents.add_reagent("poo", 10)
+
+ //Poo on the floor.
+ else
+ message = "[src] [pick("shits", "craps", "poops")]."
+ var/obj/item/weapon/reagent_containers/food/snacks/poo/V = new/obj/item/weapon/reagent_containers/food/snacks/poo(src.loc)
+ if(reagents)
+ reagents.trans_to(V, rand(1,5))
+
+ shit_left++//Global var for round end, not how much piss is left.
+
+ playsound(src.loc, 'sound/effects/poo2.ogg', 60, 1)
+ bowels -= rand(60,80)
+
+ else
+ src << "You don't have to."
+ return
+
+ visible_message("[message]")
+
+//Peeing
+/mob/living/carbon/human/proc/handle_piss()
+ var/message = null
+ if (bladder < 30)
+ src << "You don't have to."
+ return
+
+// var/obj/structure/urinal/U = locate() in src.loc
+// var/obj/machinery/disposal/toilet/T = locate() in src.loc
+// var/obj/machinery/disposal/toilet/T2 = locate() in src.loc
+// var/obj/structure/sink/S = locate() in src.loc
+// var/obj/item/weapon/reagent_containers/RC = locate() in src.loc
+// if((U || S) && gender != FEMALE)//In the urinal or sink.
+// message = "[src] urinates into [U ? U : S]."
+// reagents.remove_any(rand(1,8))
+
+// else if( (T && T.open) || (T2 && T2.open) )//In the toilet.
+// message = "[src] urinates into [T]."
+// reagents.remove_any(rand(1,8))
+
+// else if(RC && (istype(RC,/obj/item/weapon/reagent_containers/food/drinks || istype(RC,/obj/item/weapon/reagent_containers/glass))))
+// if(RC.is_open_container())
+// //Inside a beaker, glass, drink, etc.
+// message = "[src] urinates into [RC]."
+// var/amount = rand(1,8)
+// RC.reagents.add_reagent("urine", amount)
+// if(reagents)
+// reagents.trans_to(RC, amount)
+
+ if(w_uniform)//In your pants.
+ message = "[src] pisses \his pants."
+
+ else//On the floor.
+ var/turf/TT = src.loc
+ var/obj/effect/decal/cleanable/urine/D = new/obj/effect/decal/cleanable/urine(src.loc)
+ if(reagents)
+ reagents.trans_to(D, rand(1,8))
+ message = "[src] pisses on the [TT.name]."
+ piss_left++//Global var for round end, not how much piss is left.
+
+ bladder -= 50
+ visible_message("[message]")
+
diff --git a/STALKER 12/icons/effects/pooeffect.dmi b/STALKER 12/icons/effects/pooeffect.dmi
new file mode 100644
index 0000000..7eb0004
Binary files /dev/null and b/STALKER 12/icons/effects/pooeffect.dmi differ
diff --git a/STALKER 12/icons/obj/cum.dmi b/STALKER 12/icons/obj/cum.dmi
new file mode 100644
index 0000000..bd174ed
Binary files /dev/null and b/STALKER 12/icons/obj/cum.dmi differ
diff --git a/STALKER 12/icons/obj/poop.dmi b/STALKER 12/icons/obj/poop.dmi
new file mode 100644
index 0000000..1433cd9
Binary files /dev/null and b/STALKER 12/icons/obj/poop.dmi differ
diff --git a/STALKER 12/sound/effects/poo2.ogg b/STALKER 12/sound/effects/poo2.ogg
new file mode 100644
index 0000000..aa72cb8
Binary files /dev/null and b/STALKER 12/sound/effects/poo2.ogg differ
diff --git a/STALKER 12/ss13_stalker.dme b/STALKER 12/ss13_stalker.dme
index dc93184..dcf6ace 100644
--- a/STALKER 12/ss13_stalker.dme
+++ b/STALKER 12/ss13_stalker.dme
@@ -1189,6 +1189,7 @@
#include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
+#include "code\modules\mob\shit_piss.dm"
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\update_icons.dm"
#include "code\modules\mob\camera\camera.dm"