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"