diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm
index e4fb3edd4..8c5147821 100644
--- a/code/datums/elements/cleaning.dm
+++ b/code/datums/elements/cleaning.dm
@@ -43,6 +43,7 @@
cleaned_human.update_inv_shoes()
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
cleaned_human.clean_blood()
+ cleaned_human.wash_cum()
cleaned_human.wash_cream()
cleaned_human.regenerate_icons()
to_chat(cleaned_human, "[src] cleans your face!")
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index b9fe56887..9be3c1f41 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -44,6 +44,7 @@
var/rad_insulation = RAD_NO_INSULATION
var/icon/blood_splatter_icon
+ var/icon/cum_splatter_icon
var/list/fingerprints
var/list/fingerprintshidden
var/list/blood_DNA
@@ -514,9 +515,6 @@
/atom/proc/wash_cream()
return TRUE
-/atom/proc/wash_cum()
- return TRUE
-
/atom/proc/isinspace()
if(isspaceturf(get_turf(src)))
return TRUE
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index 5d3cdaa61..c37781571 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -90,6 +90,7 @@
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
target.wash_cream()
+ target.wash_cum()
return
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 5bac92a1c..1d5b7eef1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -378,6 +378,7 @@
/obj/machinery/shower/proc/wash_obj(obj/O)
. = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
. = O.clean_blood()
+ . = O.wash_cum()
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
if(isitem(O))
var/obj/item/I = O
@@ -581,6 +582,7 @@
H.lip_style = null //Washes off lipstick
H.lip_color = initial(H.lip_color)
H.wash_cream()
+ H.wash_cum()
H.regenerate_icons()
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
else
@@ -652,6 +654,7 @@
busy = FALSE
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
O.clean_blood()
+ O.wash_cum()
O.acid_level = 0
create_reagents(5)
reagents.add_reagent(dispensedreagent, 5)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ad8960dba..d7e93a924 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -719,9 +719,6 @@
cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large"))
creamed = FALSE
-/mob/living/carbon/human/wash_cum()
- cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal"))
- cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large"))
//Turns a mob black, flashes a skeleton overlay
//Just like a cartoon!
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 7a6ea95e7..62ba828a5 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -59,7 +59,9 @@
var/custom_body_size = 100
var/breedable = 0
var/impregchance = 0
-
+//h13 noncon settings
+ var/Noncon = 0
+ var/ERP = 0
var/list/mob_biotypes = list(MOB_ORGANIC)
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
@@ -109,7 +111,7 @@
var/last_words //used for database logging
var/list/obj/effect/proc_holder/abilities = list()
-
+
var/can_be_held = FALSE
var/radiation = 0 //If the mob is irradiated.
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 58edb11e8..243df5c65 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -380,7 +380,7 @@
M.IgniteMob()
else
M.adjustToxLoss(1, 0)
- M.adjustFireLoss(1, 0)
+ M.adjustFireLoss(1, 0)
if(data >= 60) // 30 units, 135 seconds
if(iscultist(M, FALSE, TRUE) || is_servant_of_ratvar(M, FALSE, TRUE))
if(iscultist(M))
@@ -1206,12 +1206,14 @@
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
O.clean_blood()
+ O.wash_cum()
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
T.clean_blood()
+ T.wash_cum()
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
@@ -1254,6 +1256,7 @@
if(H.shoes.clean_blood())
H.update_inv_shoes()
H.wash_cream()
+ H.wash_cum()
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
M.clean_blood()
@@ -2243,7 +2246,7 @@
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/insect
mutationtext = "The pain subsides. You feel... oddly attracted to light."
-
+
/datum/reagent/mutationtoxin/ipc
name = "IPC Mutation Toxin"
description = "A robotic toxin." //NANOMACHINES SON.
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
index 88a134eea..15026312c 100644
--- a/code/modules/reagents/reagent_containers/rags.dm
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -79,6 +79,7 @@
reagents.add_reagent(r_id, amount * 0.3)
M.adjust_fire_stacks(minus_plus * amount)
M.wash_cream()
+ M.wash_cum()
return TRUE
return ..()
diff --git a/hyperstation/code/datums/mood_events/events.dm b/hyperstation/code/datums/mood_events/events.dm
index 057c8fe5d..ae5b08a9a 100644
--- a/hyperstation/code/datums/mood_events/events.dm
+++ b/hyperstation/code/datums/mood_events/events.dm
@@ -6,4 +6,9 @@
/datum/mood_event/heat
description = "I have satisfied my heat, and I'm filled with happiness!\n"
mood_change = 3
- timeout = 5 MINUTES
\ No newline at end of file
+ timeout = 5 MINUTES
+
+/datum/mood_event/kiss
+ description = "Someone kissed me, I feel happy!\n"
+ mood_change = 2
+ timeout = 3 MINUTES
\ No newline at end of file
diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm
new file mode 100644
index 000000000..50b3c9c97
--- /dev/null
+++ b/hyperstation/code/modules/arousal/arousalhud.dm
@@ -0,0 +1,416 @@
+//Hyperstation Arousal hud
+//This needs alot of attention, im a bad coder. a shitty attempt at making a more user friendly/modern hud
+//if you wanna use this on your own server go ahead, but alittle credit would always be nice! -quotefox
+//This still uses alot of cits arousal system!
+
+/obj/screen/arousal/ui_interact(mob/user)
+ . = ..()
+ var/dat = {"Genitals
"}
+
+ //List genitals
+ var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
+ if (P) //they have a pp
+ dat += "[P.mode == "hidden" ? "Penis (Hidden)" : (P.mode == "clothes" ? "Penis (Hidden by Clothes)" : (P.mode == "visable" ? "Penis (Visable)" : "Penis (Visable)"))]
"
+
+ var/obj/item/organ/genital/testicles/T = user.getorganslot("testicles")
+ if (T) //they have teabags
+ if(!T.internal)
+ dat += "[T.mode == "hidden" ? "Testicles (Hidden)" : (T.mode == "clothes" ? "Testicles (Hidden by Clothes)" : (T.mode == "visable" ? "Testicles (Visable)" : "Testicles (Visable)"))]
"
+ else //internal balls
+ dat += "Internal Testicles
"
+ var/obj/item/organ/genital/vagina/V = user.getorganslot("vagina")
+ if (V) //they have a vjay
+ dat += "[V.mode == "hidden" ? "Vagina (Hidden)" : (V.mode == "clothes" ? "Vagina (Hidden by Clothes)" : (V.mode == "visable" ? "Vagina (Visable)" : "Vagina (Visable)"))]
"
+
+ var/obj/item/organ/genital/breasts/B = user.getorganslot("breasts")
+ if (B) //they have a boobiedoo
+ dat += "[B.mode == "hidden" ? "Breasts (Hidden)" : (B.mode == "clothes" ? "Breasts (Hidden by Clothes)" : (B.mode == "visable" ? "Breasts (Visable)" : "Breasts (Visable)"))]
"
+
+ dat += {"
Contexual Options
"}
+ //Options
+ dat += "Masturbate"
+ dat += "(Stimulate a sexual organ with your hands.)
"
+
+ dat += "Climax"
+ dat += "(Orgasm from a sexual organ.)
"
+
+ dat += "Fill container"
+ dat += "(Use a container in your hand to collect your seminal fluid.)
"
+
+ if(user.pulling)
+ dat += "Kiss [user.pulling]"
+ dat += "(Kiss a partner, or object.)
"
+
+ dat += "Climax over [user.pulling]" //you can cum on objects if you really want...
+ dat += "(Orgasm over a person or object.)
"
+
+ if(isliving(user.pulling))
+ if(iscarbon(user.pulling))
+ dat += "Climax with [user.pulling]"
+ dat += {"(Orgasm with another person.)
"}
+
+ var/mob/living/carbon/human/H = user.pulling
+ if(H.breedable && P && H)
+ dat += "Impregnate [user.pulling]"
+ dat += "(Climax inside another person, knocking them up.)
"
+
+
+
+ if(P.condom == 1)
+ dat += "Remove Condom
"
+ if(P.sounding == 1)
+ dat += "Remove Sounding Rod
"
+ dat += {"
"}//Newline for the objects
+ //bottom options
+ dat += "Refresh"
+ dat += "Old Menu"
+ dat += "Toggle Undergarments "
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "arousal", "Arousal Panel")
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(icon, icon_state), 500,600)
+
+ popup.open()
+
+
+/obj/screen/arousal/Topic(href, href_list)
+ . = ..() //Sanity checks.
+ if(..())
+ return
+
+ var/mob/living/carbon/human/H = usr
+ if (!H)
+ return
+ if(usr.stat==1) //No sleep-masturbation, you're unconscious.
+ to_chat(usr, "You must be conscious to do that!")
+ usr << browse(null, "window=arousal") //closes the window
+ return
+ if(usr.stat==3)
+ to_chat(usr, "You must be alive to do that!")
+ usr << browse(null, "window=arousal") //closes the window
+ return
+
+ if(href_list["hidepenis"])
+ var/obj/item/organ/genital/penis/P = usr.getorganslot("penis")
+ var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
+ P.toggle_visibility(picked_visibility)
+
+ if(href_list["hidevagina"])
+ var/obj/item/organ/genital/vagina/V = usr.getorganslot("vagina")
+ var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
+ V.toggle_visibility(picked_visibility)
+
+ if(href_list["hidebreasts"])
+ var/obj/item/organ/genital/breasts/B = usr.getorganslot("breasts")
+ var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
+ B.toggle_visibility(picked_visibility)
+
+ if(href_list["hidetesticles"])
+ var/obj/item/organ/genital/testicles/T = usr.getorganslot("testicles")
+ var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
+ T.toggle_visibility(picked_visibility)
+
+ if(href_list["masturbate"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.solomasturbate()
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["container"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.cumcontainer()
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["climax"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.climaxalone(FALSE)
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["climaxover"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.climaxover(usr.pulling)
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["climaxwith"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.climaxwith(usr.pulling)
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["impreg"])
+ if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
+ H.impregwith(usr.pulling)
+ return
+ else
+ to_chat(usr, "You aren't aroused enough for that! ")
+ return
+
+ if(href_list["kiss"])
+ if(usr.pulling)
+ kiss()
+ else
+ to_chat(usr, "You cannot do this alone!")
+ return
+
+ if(href_list["removecondom"])
+ H.menuremovecondom()
+
+ if(href_list["removesound"])
+ H.menuremovesounding()
+
+ if(href_list["omenu"])
+ usr << browse(null, "window=arousal") //closes the window
+ H.mob_climax()
+ return
+
+ if(href_list["underwear"])
+ H.underwear_toggle()
+ return
+
+ src.ui_interact(usr)
+
+
+obj/screen/arousal/proc/kiss()
+ if(usr.restrained(TRUE))
+ to_chat(usr, "You can't do that while restrained!")
+ return
+ var/mob/living/carbon/human/H = usr
+ if (H)
+ H.kisstarget(H.pulling)
+
+
+/mob/living/carbon/human/proc/menuremovecondom()
+
+ if(restrained(TRUE))
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ var/obj/item/organ/genital/penis/P = getorganslot("penis")
+ if(!P.condom)
+ to_chat(src, "You don't have a condom on!")
+ return
+ if(P.condom)
+ to_chat(src, "You tug the condom off the end of your penis!")
+ removecondom()
+ src.ui_interact(usr) //reopen dialog
+ return
+ return
+
+/mob/living/carbon/human/proc/menuremovesounding()
+
+ if(restrained(TRUE))
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ var/obj/item/organ/genital/penis/P = getorganslot("penis")
+ if(!P.sounding)
+ to_chat(src, "You don't have a rod inside!")
+ return
+ if(P.sounding)
+ to_chat(src, "You pull the rod off from the tip of your penis!")
+ removesounding()
+ src.ui_interact(usr) //reopen dialog
+ return
+ return
+
+/mob/living/carbon/human/proc/solomasturbate()
+ if(restrained(TRUE))
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ for(var/helditem in held_items)
+ if(isobj(helditem))
+ free_hands--
+ if(free_hands <= 0)
+ to_chat(src, "You're holding too many things.")
+ return
+ //We got hands, let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_masturbate_genitals()
+ if(picked_organ)
+ src << browse(null, "window=arousal") //closes the window
+ mob_masturbate(picked_organ)
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
+
+
+//Kissing target proc
+/mob/living/carbon/human/proc/kisstarget(mob/living/L)
+
+ src << browse(null, "window=arousal") //closes the arousal window, if its open, mainly to stop spam
+ if(isliving(L)) //is your target living? Living people can resist your advances if they want to via moving.
+ if(iscarbon(L))
+ src.visible_message("[src] is about to kiss [L]!", \
+ "You're attempting to kiss [L]!", \
+ "You're attempting to kiss with something!")
+ if(!do_mob(src, L, 2 SECONDS)) //I think two seconds is enough time to pull away if its unwanted.
+ return
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice.
+ //Well done you kissed it/them!
+ src.visible_message("[src] kisses [L]!", \
+ "You kiss [L]!", \
+ "You kiss something!")
+
+/mob/living/carbon/human/proc/climaxalone()
+ //we dont need hands to climax alone, its hands free!
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals()
+ if(picked_organ)
+ src << browse(null, "window=arousal") //closes the window
+ mob_climax_outside(picked_organ)
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
+
+
+/mob/living/carbon/human/proc/climaxwith(mob/living/T)
+
+ var/mob/living/carbon/human/L = pick_partner()
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals()
+ if(picked_organ)
+ var/mob/living/partner = L
+ if(partner)
+ src << browse(null, "window=arousal") //alls fine, we can close the window now.
+ var/obj/item/organ/genital/penis/P = picked_organ
+ var/spillage = "No" //default to no, just incase player has items on to prevent climax
+ if(!P.condom == 1&&!P.sounding == 1) //you cant climax with a condom on or sounding in.
+ spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
+ if(spillage == "Yes")
+ mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE)
+ else
+ mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE)
+ else
+ to_chat(src, "You cannot do this alone.")
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
+
+/mob/living/carbon/human/proc/climaxover(mob/living/T)
+
+ var/mob/living/carbon/human/L = T
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals()
+ if(picked_organ)
+ src << browse(null, "window=arousal") //alls fine, we can close the window now.
+ var/mob/living/partner = L
+ if(partner)
+ var/obj/item/organ/genital/penis/P = picked_organ
+ if(P.condom == 1)
+ to_chat(src, "You cannot do this action with a condom on.")
+ return
+ if(P.sounding == 1)
+ to_chat(src, "You cannot do this action with a sounding in.")
+ return
+ mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE)
+ else
+ to_chat(src, "You cannot do this alone.")
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
+
+/mob/living/carbon/human/proc/impregwith(mob/living/T)
+
+ var/mob/living/carbon/human/L = pick_partner()
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = src.getorganslot("penis") //Impregnation must be done with a penis.
+ if(picked_organ)
+ var/mob/living/partner = L
+ if(partner)
+ if(!partner.breedable)//check if impregable.
+ to_chat(src, "Your partner cannot be impregnated.")//some fuckary happening, you shouldnt even get to this point tbh.
+ return
+ var/obj/item/organ/genital/penis/P = picked_organ
+ //you cant impreg with a condom on or sounding in.
+ if(P.condom == 1)
+ to_chat(src, "You cannot do this action with a condom on.")
+ return
+ if(P.sounding == 1)
+ to_chat(src, "You cannot do this action with a sounding in.")
+ return
+ src << browse(null, "window=arousal") //alls fine, we can close the window now.
+ //Keeping this for messy fun
+ var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
+ if(spillage == "Yes")
+ mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE)
+ else
+ mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE)
+ else
+ to_chat(src, "You cannot do this alone.")
+ return
+ else //no penis :(
+ to_chat(src, "You cannot impregnate without a penis.")
+ return
+
+/mob/living/carbon/human/proc/cumcontainer(mob/living/T)
+ //We'll need hands and no restraints.
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ for(var/helditem in held_items)//how many hands are free
+ if(isobj(helditem))
+ free_hands--
+ if(free_hands <= 0)
+ to_chat(src, "You're holding too many things.")
+ return
+ //We got hands, let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ src << browse(null, "window=arousal")
+ picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
+ if(picked_organ)
+ //Good, got an organ, time to pick a container
+ var/obj/item/reagent_containers/fluid_container = pick_climax_container()
+ if(fluid_container)
+ mob_fill_container(picked_organ, fluid_container)
+ return
+ else
+ to_chat(src, "You cannot do this without anything to fill.")
+ return
+ else //They either lack organs that can climax, or they didn't pick one.
+ to_chat(src, "You cannot fill anything without choosing genitals.")
+ return
+
+/atom/proc/add_cum_overlay() //This can go in a better spot, for now its here.
+ cum_splatter_icon = icon(initial(icon), initial(icon_state), , 1)
+ cum_splatter_icon.Blend("#fff", ICON_ADD)
+ cum_splatter_icon.Blend(icon('hyperstation/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY)
+ add_overlay(cum_splatter_icon)
+
+/atom/proc/wash_cum()
+ cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal"))
+ cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large"))
+ if(cum_splatter_icon)
+ cut_overlay(cum_splatter_icon)
+ return TRUE
\ No newline at end of file
diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm
index d6058a9be..c69f3c0c0 100644
--- a/hyperstation/code/obj/condom.dm
+++ b/hyperstation/code/obj/condom.dm
@@ -98,7 +98,7 @@
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom)
new /obj/item/condom/filled(usr.loc)
- to_chat(src, "The condom bubbles outwards and fills with your cum.")
+ to_chat(src, "The condom around your penis, bubbles outwards and fills with your cum.")
P.condom = 0
P.colourtint = ""
src.update_genitals()
diff --git a/hyperstation/icons/effects/cumoverlay.dmi b/hyperstation/icons/effects/cumoverlay.dmi
index 542ce503a..ebed804d2 100644
Binary files a/hyperstation/icons/effects/cumoverlay.dmi and b/hyperstation/icons/effects/cumoverlay.dmi differ
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index bc9896d91..b5a01bcf0 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -208,14 +208,11 @@
/obj/screen/arousal/Click()
if(!isliving(usr))
return FALSE
+ if(isobserver(usr))
+ return
var/mob/living/M = usr
if(M.canbearoused)
- M.mob_climax()
- return TRUE
- else
- to_chat(M, "Arousal is disabled. Feature is unavailable.")
-
-
+ src.ui_interact(usr)
/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
@@ -340,30 +337,36 @@
if(mb_time) //Skip warning if this is an instant climax.
src.visible_message("[src] is about to climax with [L]!", \
"You're about to climax with [L]!", \
- "You're preparing to climax with someone!")
+ "You're preparing to climax with something!")
if(cover)//covering the partner in cum, this overrides other options.
if(do_after(src, mb_time, target = src) && in_range(src, L))
fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
total_fluids -= total_fluids*G.fluid_transfer_factor
if(total_fluids > 80) // now thats a big cum!
- var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi')
- cumoverlaylarge.icon_state = "cum_large"
- L.add_overlay(cumoverlaylarge)
+ if(isliving(L))
+ var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi')
+ cumoverlaylarge.icon_state = "cum_large"
+ L.add_overlay(cumoverlaylarge)
+
if(total_fluids > 5)
fluid_source.reaction(L.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] climaxes over [L][cover ? ", coating them":""], using [p_their()] [G.name]!", \
- "You orgasm over [L][cover ? ", drenching them":""], using your [G.name].", \
- "You have climaxed over someone[cover ? ", coating them":""], using your [G.name].")
+ src.visible_message("[src] climaxes over [L], using [p_their()] [G.name]!", \
+ "You orgasm over [L], using your [G.name].", \
+ "You have climaxed over something, using your [G.name].")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
- var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi')
- cumoverlay.icon_state = "cum_normal"
- L.add_overlay(cumoverlay)
- var/mob/living/carbon/human/H = L
- H.creamed = 1
- if(G.can_climax)
- setArousalLoss(min_arousal)
+
+ if(isliving(L))
+ var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi')
+ cumoverlay.icon_state = "cum_normal"
+ L.add_overlay(cumoverlay)
+ else
+ L.add_cum_overlay()
+
+ setArousalLoss(min_arousal)
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
if(spillage && !cover)
if(do_after(src, mb_time, target = src) && in_range(src, L))
@@ -384,7 +387,11 @@
else //knots and other non-spilling orgasms
if(!cover)
if(do_after(src, mb_time, target = src) && in_range(src, L))
- fluid_source.trans_to(L, total_fluids)
+ var/obj/item/organ/genital/penis/P = G
+ if (P.condom)//condomed.
+ src.condomclimax()
+ else
+ fluid_source.trans_to(L, total_fluids)
total_fluids = 0
src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \
"You ejaculate with [L], your [G.name] spilling nothing.", \
@@ -441,9 +448,9 @@
fluid_source = G.linked_organ.reagents
total_fluids = fluid_source.total_volume
- //if(!container) //Something weird happened
- // to_chat(src, "You need a container to do this!")
- // return
+ if(!container) //Something weird happened
+ to_chat(src, "You need a container to do this!")
+ return
src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \
"You start to [G.masturbation_verb] your [G.name] over [container].", \
@@ -763,3 +770,4 @@
return
else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled
return //Just end it in that case.
+
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 4ac28ea04..35d3675ba 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -22,6 +22,7 @@
var/internal = FALSE
var/hidden = FALSE
var/colourtint = ""
+ var/mode = "clothes"
/obj/item/organ/genital/Initialize()
. = ..()
@@ -70,16 +71,19 @@
if("Always visible")
through_clothes = TRUE
hidden = FALSE
+ mode = "visible"
if(!(src in owner.exposed_genitals))
owner.exposed_genitals += src
if("Hidden by clothes")
through_clothes = FALSE
hidden = TRUE
+ mode = "clothes"
if(src in owner.exposed_genitals)
owner.exposed_genitals -= src
if("Always hidden")
through_clothes = FALSE
hidden = TRUE
+ mode = "hidden"
if(src in owner.exposed_genitals)
owner.exposed_genitals -= src
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index 66c43f2b8..6918308dd 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -270,6 +270,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
target.wash_cream()
+ target.wash_cum()
return
//Dogfood
diff --git a/tgstation.dme b/tgstation.dme
index 54126afee..0c4aed70b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3021,6 +3021,7 @@
#include "hyperstation\code\mobs\werewolf.dm"
#include "hyperstation\code\modules\traits.dm"
#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm"
+#include "hyperstation\code\modules\arousal\arousalhud.dm"
#include "hyperstation\code\modules\client\loadout\glasses.dm"
#include "hyperstation\code\modules\client\loadout\tablet.dm"
#include "hyperstation\code\modules\clothing\head.dm"