From 333f410476a82f35b5d76a008c09f1d373913a9c Mon Sep 17 00:00:00 2001 From: QuoteFox <49098813+quotefox@users.noreply.github.com> Date: Sat, 2 Jan 2021 13:39:17 +0000 Subject: [PATCH 1/4] New Arousal Hud New Arousal Hud, much more user accessable with contextal options. --- code/datums/elements/cleaning.dm | 1 + code/game/atoms.dm | 4 +- code/game/objects/items/clown_items.dm | 1 + code/game/objects/structures/watercloset.dm | 3 + code/modules/mob/living/carbon/human/human.dm | 3 - code/modules/mob/living/living_defines.dm | 6 +- .../chemistry/reagents/other_reagents.dm | 7 +- .../reagents/reagent_containers/rags.dm | 1 + .../code/datums/mood_events/events.dm | 7 +- .../code/modules/arousal/arousalhud.dm | 409 ++++++++++++++++++ hyperstation/code/obj/condom.dm | 2 +- hyperstation/icons/effects/cumoverlay.dmi | Bin 5880 -> 7099 bytes .../code/modules/arousal/arousal.dm | 56 ++- .../code/modules/arousal/organs/genitals.dm | 4 + .../living/silicon/robot/dogborg_equipment.dm | 1 + tgstation.dme | 1 + 16 files changed, 470 insertions(+), 36 deletions(-) create mode 100644 hyperstation/code/modules/arousal/arousalhud.dm 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 9036d8dc7..7f2308574 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..99afef1f1 --- /dev/null +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -0,0 +1,409 @@ +//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

"} //for noncon toggling and erp toggling on the fly. + + //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]" //you can cum "with" living people. + dat += {"(Orgasm with another person.)
"} + + var/mob/living/carbon/human/H = user.pulling + if(H.breedable && P && H) + dat += "Impregnate [user.pulling]" //you can cum "with" living people. + dat += "(Climax inside another person, knocking them up.)
" + + + dat += {"
"}//Newline for the objects + if(P.condom == 1) + dat += "Remove Condom
" + if(P.sounding == 1) + dat += "Remove Sounding Rod
" + + dat += "Refresh" + dat += "Old Menu
" + + 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"]) + H.mob_climax() + usr << browse(null, "window=arousal") //closes the window + 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 542ce503a2167d69445b6c5e7bf9f7ccca13c334..ebed804d219a0774cd267448ae14a0d3f042c634 100644 GIT binary patch literal 7099 zcmV;s8${%ZP)V=-0C=2@%CQcDFcbyQx$i4(U^jxST}+AT0KZ_WJZTN3$!o>mcW^Lljwd-a z&i%!XFoUIyC5N;^qdOc)y~9*IG)^rk&tdlEi(Fh`XjJ!Cysk;2TPjjhkPMBE)I(h4 z42@=A7bi3SHPh|+d(H0E=tl!HSo#1rVl)Ui!F`Va02=Q}L_t(|ob8=^bR2h;=Rdcq zTivaPWm%T|kmX0z<(JepF)##hT!d!^2nh@)utPRvfgLzAIV_Le&0&^smh7-+hlD_e z1$Ht4GRXu8kex6j5DqXWR6PKsC=;FeRzwq%??7kG8Kwk{X|H{)~wUqSW10WsheK#J*^ zDSQ#6p%Gj)FMcvEeU}iYOd{vVM}j%6(V=3a*JS6B3z3Q)4(56)o-F&c4H(q zhjT1oCvgezH4pNbmmQcq?eF2w#spaQ_klg-iYS9U!1pmG0PwQ8GjzBa=P}THsFkOI zzFImLOWpw7OHe$B9q&-pXSVhajJoSqSt>Gyu@07N^TOW%Rc065n zALN1o@cMJp!0kxvN*dx#ZpK-D_BrnAZXr+$bjI7A({e@3mC&}%5UAy@?v`_OWSr$R z#G8=VmB8(h_8KDhfqb56z%NaC+1yqDH@(zS4TdVQIJahKQS-o)z>UD0&iT8Yw6N?; z5mW!+2r-AT>`SqevuS@5p~fd8%{66fe{Kx;F!6?)h&8mII_?b&o2~tOMk=v6rvP|Q z4=Bh4@MGX7=bRAZa^Pd$Q$uy{g+@L;7Wq7zp8!7wnFux4fubG-eE|3-fSXCL1#s6p zF*lQbf4S!7@)8EX%RW;C{^0he5kW`8Bhm-##^xGSZU+9b9D7pDoUohevBCO2@E$LlD^_f% zBHvB}a6g!Ld)dLdkAOZOTQbfEP+cz~^A&UB*6d(ePl2k&O`;3`?F)VLL*Kb#==(*Dn_!TZ!Wuk&QGg05-W9XFljXUUp!--j3Zq=S?d5*w*a83{dgl zUs(YF`JX^5@D~8y&ixAfyi(`Y;$?F`2XHe^4#)v_g8T{aZ|m+{*eviiw=ex^Ro!;s zf0&(eA3^^B44^t14g>$+ftSr4Ms*YzAk_E*px*|0or=6;YyZG)m0GD}O7c$;>8#XY z-3T@PDKEg3BmjYVMwQ%!%6tjyZ$Pfa1c$0|S{F=k2+O_}bl`<>Colnw zsB*j-J7opH%MKKP9o0Cj7v7E`!wacR%~8bqkO=##F;mr0#7k7qOX=wsnU?}^k$F)E z!0m2pcDv_av}=)esiVmAn@m;9i<94;Y zyiz+a$^f`s^Ik)KaumPt_rw#u1jVb|o~19?wYWV?ErQ}z#1p;vg}*01IqG)Jdrc*_ zY9hK;x$<+tUDbI5#}7Tt^kkl~quYtavm~3oM1HL7yv&Npk8L2?^d(~PEMrHvGd-E- z_@SrWRh>7KYpUu1xV=uZh_%hlI7_OvbwOW=$#*h52S5or5M83il&ZBg2NIyk=;CeEK)5F05QXWw zCj>l4=<5(L6=|?TO_~ff&YkKXL1JxIm2nZN`?RE2X!#CsDXNzO^MMAYPYw|T_feV& zyh2OehseD`%VA100YPvd(~|N)t>xG&I{*T&-jZ?t{Io;2h*%l1>N7dNC9@{(ZdkLyZSfc2m+qjsZ5(6vAu>QB z^(*XH50;gYWaE{RY+Sy%Jyy55ip}k@4oNmHmt^CWSXKr*)nhZ@OkPQkKdkVuBAMvfJB#EWon9gPMC0`Lf%y=rR_q=+RVj zhb9_djYyK_wm16|$2TVyEnc*V@tXCHH!*G}7A;=nPaNM&bK9E{Nou0;)tYMVV9|;m zw`b91hh+7H@rMv zoY}1KWqO=l^YN2AKGrs^Q)1t(M-gex|gpM zi}i(*lSh*AhKW2noQTH;{3H8EjL4x_B9RgJt5RV0$ngHHc3a0%eE$km9%ujV96bML zp`w0(YB1!c!?71Ho7;+CnqnG2J|E`L*9KFVI;kc|D$;GuYcp!cHc6`Ky{Zh0U%D?Q z@=Gfg`-xhyLn^jyjOMq;+HV~j8aj?`_ZlTxwFV`LZTF514ISSeYroYP&8yh9TCqb` zEcTO_$S=h&-KWa1q?+EVc5IV1ugxgZttLpC!qj;iClv)?YyX}RZ(#V3*#NPIcH#{; z0UwTX=xc&eHJIRGg)U7rOY+7W`mw;0FZ&zfjnoYHfXUERmd4u|o|oCFob})`h)RWAl48(KM~lg$W)u zs^`s`sH7wIes{eSi+)}k9sVZh17Yrb4KWs0X=+#k|MAku@D0Wfrp(E)2h`{cRxByD zt;AvpX=u1f<}KXf7mEYyrba#WtqsbS3dZ*c`LVYwNbXf1%8S_C($ zSR-NXeC@CoFYPqO^!ekX+X^#N-zZH@{cw7E#w!_Zl4R;Kp#}=r&_apS^hLd6U@6?+J_P1FqcCm%dG-1=?OVcm3AvGhnGd}t@6PQot zX9|OjEiIl2f+N9+6U~9|+kQS@(3bY|_Rh-=z}D>Gj4C&Z$fT&byW%UG1Hah4=ZV76 zqg|!r$GW%2+lK?+_pt1}sivlV1wR1W?kNR^RC9B?TCsVm#B(i+zEC`{-_IX-cH1sV zeWqFsyCn6Q{DEh;6%Xw9b1jR$ph{e=*t}G8b9*T;VB0+fKOoiAv=7VP8~DDrJ>EWC zI)1FXaP(-`FLv*F;(YeYZiWJE?a$4)8K)=8jjt=eqvhMDem2T*p%es-jj6X!9Y68* z89VkXCdZd0I+sq*lu9jX$Kn9bG|c-#Ej8?x)Te0(i?XO4OU(FwDVb`TEQ|~km70VhuGCDdEPo`d$Xl<)!oeBUFt!-866!F%NiZqxkD#MMjt+M zZ2ZAgW8$HfWy@Y!j=hQlpsL&4zI3y||3Ij^ZqA$#`7ZMpZ?coAHz>3Yv@E)P?C{ag z8L=d8N=y8yeBI{*{HgrmxG60$V#(Oyqn{gSS#-NXtDQ`}f%%I!A@bdF>{T3qt^EVH zsmMD(UKi%d*Pjyy4tp_tut1`nt0s49H1~c zIejueH7tJVq49lt_LgI>ssM_Jw7ph zXJExA17qqwFC7?D46OL%_{8{~c0mnARgMdcM7i>H zW!bTVm$r0vEL1!GhxzRt%ZwoflxC);ADY+RIojOXiYhD|-e2|j&-1Zxc>hvWXl`v~ zUVG>0%+&NlK*<U?sU81AOJ~QzWycQAxiwZ%Kj0KmZv2N(Q`<41v*;Q<_}1lb zdh2m4=^V>Xjqf{fU}ZuzhU(#yCnlaaymw#ws#U9!&Y!&}4#ari{>IUz%WL{RSU9}D z(fPCY#DMtZ@7ZTp(%n7Y`m$Gcwi<2FpZ@5r2N!l-u&i@c z0r0XpANXxGHs*pcS{!=hVNo=pN=t)k!YFt{BmP3)FQjt23WsyM5{Ds9xK^xYBeJIv z%RO*^2cZv5K_P&GH#FieG%5`PPbUr!K7$CpAc!!h$Kgv0G%hkP%H-Vtm#A+40B6~y z?&|J~R=?j}-QD6k%j!P-;AWh=-Sz3zxyRE^wYDoO*0FYF!d<)a3hdbTu1~dY11m1<}#VFhz z68e5uq@`9V@~;QE;;dsnBI^O%zVsg_oiw-^__3RDelb_$QDv9sCTS`PfVX?^31aqt z_jd1n%6ocW-MjzKtK;c?Q{L{qPeod)-bBKES+4-=fwSw){R{9HTQW}j>BYgl{-L83 zr~Vee?MuIIj&3@DYflxGt+Zay62$t2+v}V$_~ou!wb5O-s(!Vj*R5LYu3L3RF;=(N zX+o@D)MR}^Q0xXA;Oz07-vLQceZEd!10uh5`<$i=R_hgg95@dAdpG0ET6yros1|{x zh&&x;+am;;AOW z8Wo!n`hZ*AjPvi@4e41^61}GeN~pOX_?nl^%~bdfkPq+1Tz_sYP z8G>%c+2CfJOT7NUz{}=NK&9`1{@etr_oDg>Zd+mfaoaMk@an=f&%H9Ee&LyZ`PndHz3H)#1Er|4<|37O$=;JMs&q=^W z^?J9@Id2l|9N0)$Yv_!66K=+N2;|*v##unj{)C%x-r;7P4!1Ae>}7L`VT*akcXBmp-nrREXd zbli-y0{9T{`*SX*Y_S<<8R4>|BdFR~(u`&Q9?Mz;e7#(I74UT|Yf@na{6*Z(#f( zEXzh%gYpI7gTU7#jb#y)!T%!Y_nte}KQIXF2iXkVgZf2;W=`#&5ElzOZbkbi>~k~e zCg5`5{>a21fFr;s319Aad9#$ZEN?hkcq8yn1f{*i8tw<$y=-pOUAM{xCJ4%}pI&? zs$~_=o(*?{b81tf3?gH|e}#tYNhao>Rx$XG=Q~R+jM$)g@9CUzGfpeY#|eAYhk>^~ zpRc)ZW3@gVBaG-r5cwCvdEix%jd@;nsG|D$l@R%w7x`WVOhlSK0(>;mS~<$8RW<5m zbJNT)2K+1VUx0I~#M_NFmi-3A47nL64g6=qCh{ABzX3|oOZ^z%lpaju`cy~=Pi&h_qkCr-F`nE_dkZ9j`;-2`k7HEP58ty~B_HTItb z@NzkW%2D89!v4pZ#O0m92T^+?@E?K4K<|v&{3F0*^in^Ex$hsab8yP-?Rg7u2xJoU zC~8WGbpX{zvAG(!8MtTe7g`ZFV>3mdk0SCq)Re$F3NiwG4S3MoS#6rUyxYwHplA)JgqP_+vU?nUf_2#iaz1?T++@ZP~k>}lCtok`&HU9uipxo$XhibfO z&bfHmp=p#GL!YKDb)vogp(%>_9|6VZdv-_Xm4H27|G+fBIX535EMl?_&Um>$N5uhf z*Z0Ii5rYBHGg~L4UPQinBHzzxsVNczcy_jDx0`X+xEbfv9yaIw(0SS1G@$PK9t-81 z%_b@vjO*=rIYPhN*K=yqgu3sdIt$GJZeLFqLciPFQ*qt4S&1i>0WEIEd9L1rn@M-N z8Ru_+cL1I4nxz(V+dm`fUb@- zRh=Xj-f&f*hj8cE4q!O^t9*rUIQioM-qXVdIB$s>x35P~zK!rI;A3va@lo--{$~tS z{s<}%HUl>yaQXm#cZp8IrCt8u7q!lCJ%giXlN(>iAJ zfY)Hj>T->G{e#BK=DtWcSFq8|q;04;0D1rjfJ->Fne)X#BMm{MsTMo{Jc(c0N7$!1 z;$?HE`W1bIV>@e~@1N&@54;Sd9V!lh>;>*d#D?nX=U2&sNWxg%aSH-l{} z%2&N??(~++Mvtb2IQtsIGo~l^h3#v8p(me{|g!SbP60NDIy!{;2&qt)H`uSBMvJcg|uTMCImmSDMRa@ki l2Ts8Oxdo~3qb6MOHK)QoCt6<@n(V$}+2w004D)~GGS z-n+IMzx4OV^W4{cpZ9s+=Xt%(z2}}2sjaC(bBpyB005wQrK+e)94-Dm6y(JB;%CHj z;t=8wGxSlk^|tnM^zdvn07%UARyS-<>->Bq0BOyH9m)y^*$&K=Cj;CZy)z(~Ij7I4+#vaZ1X#|&c zzt$1GE0AUslt8U~Xkt(neVHL%Kioz75-en6QQngj>>^9l<{{E}U5^$?}b3$a-jLq9=C zdaDP&)^qC<`|!Vnj|uW_BMC`1YW7~BrxuSpRAbR4keeu5lN8%h{f6JWm_zB)I4Pdy zPo-D3OX|`grLp>hrvU@G-UM&L>DxK3LFvB`caQUO!J1GwVp9#3@jy+iw>x<|`@!Z* z(&d^NpUpW|>pXwH=|3i^>dg!=Gyq}q_)j#)=u6Vev(?UN^FoJfqxFSj!Z&&> zQ9+ZNzHWkDvkHJ*0;dXhNZ}X|HV(de_c4PiN?R29wOwp7wV-+00%Iagqd>5S+i_yw z!kKFkh9EB_$34s`V?OLv#u^fG0sa1M>iP8PR~<>~1C`QAUsh+@@K_K9KinP4l%f{;s0>bN$XJs_fEiNX~Z zw<)emDkJZ}#S#}T6GD!Bel!VF{Q8y8sD0YVy<~G5Rr-W#lJ3z=JdBQyJpw=tti?YY z3sN&5ZR=xIh(M`@LlZWEjJWF|YrTU`-qp~*O3Qj>e^MSy>${fNX84X2`MCsh7}5k% z`w-arz8rOmP@zb&rg!u8G@L)p`Z$SW*BG-1hITDPBM4oFv=V>TyqCY#{0tsp)>b4Z zJc7gV*YJC(S5>4W10>L_AnEWw8Ws#=FH=@(Cra)hkc|NL1p_>4XDq$&-A*>SY&i6% z`Hb^8Rmw_MdKq#l1GgqWs38YoQ7jSLKljG_<>@u^?vFcJn~4G4B*$nj#j!V39w-S? zPnOhMXPm0){Jp#TTa7sJe|paHG}?Y#0;Ol15J6@Xa{U)&*6sTq3oO269 zPFTwi&mkaJsX19v%nmqJ*9FK!;RiF5As@}!6i6cijgkkccm!KZDPqa5zhZ-#$FT0o zUu*-rNHDydz@}BXrnMN2W%Gl-z4q25kiRClY$pv^%YXAGcbNc4>okLNkCCFi&{cl( zx4^rOUuzBj(9Scw`|Y`{T7zwRE-C$V$?aY_%!byQz3ka)#~@%O0LPxhtQI`X*0(LQ zck1#~79(;vmTvegdGcI)%a^Elm2}BzOIFKuL=c9F->O%!N}{ji{KF1#zxj{LVHkfZ zKQ{RAjs{8sV+7h&`I6xn`J--Q^kO2oYj#u!`@o@s<8v zbo@hcntsi0{(2~YG+srn3CB5~N<|EW+c0wX4%!iMxnUv!2K2aP(c9kEKA^S=zOqw>38K*(#O72mU ze_ulC2t4-DM3ajeC2?X!d6ou!dE2wb%r$$JXWnn#--5ayjAbrk_l6p3)ozSVpw>{~ z3|n)Q@AL>wk*VoLC9$1242w^GrIIp=bTSZ-+z{Ga#)BCZ<=M^$yOuYR1x~W{B{|W; z68*4bNb3HO!%o^~jo_oy3V!s(U95?c%?GR9`|MD|u{T-Yf)hQuZVq)hE~EVNVZ%*< zU=G>Qmk`buZ?Mv5+SVj9KG;Exf{$$+cbp=JAF{~Hv=IXv@q(Io+Rz9;m&6nmU77f? z0p|0=6CTz8y>XU^Eq`FA6N4MQb#{0%j#dI~47?C`cj3glSRx+zCPoFj`?y$97S zVL_-%j)#<&bb!6{+*_9_rHjXlF}ByFIE?}kS#l)(vIOde;NxjofD4$3&z8{{o4s=r zcBr?*y}pN{gxT}W;+k2B0hCxc0APZ>G$%RYkaL5@pT@;%&6qeR8Gn2f0*=QRlVvD( zjO=+(etZO^=#R!;CiRj!{eoqnfLU}7NC|h+_54NGc`LXJ$jPV}95aeO=J?*Yjqr*ri`km9pI2j6#N8yv==iC32`tA}DI$Lo#zc z;8zpUVT%XXgnU>zL5#l%^XcHh?WmhZZ%#Z;m0osRuNJDi{^*wBwV_ZL{EKKXasI+D z0(66S;k(!D_M=18A4$H}_RoaYo+RugSt6?UJm@{O&3tm}^0gQ}bL++m1vwW1n(Nu0 zo&xm}F>Jqr%F~g)yt0(_3}(5VNn0^h)Hzud9&4_nvbLHy%BW}!A&N6H=29lv|BfsS zUOJX6dY+GlP%=6fU~QDXZnPzsKRuwafMW5X%(7I`REeOL+@w^Jvd<3wcj^pYfBE|J zHa#e=vR3$&?Z@7zp^=lJrOKk<1cI~Ed>iZe-?sGg{3T{4c!3CqCEHL(>zDE$Bck%e01lN>JWi#TT4yUx1m1m^-?~pCho1%JQ(-dz-cujxQ^NhZTAnI`gOlw* z{Z*orXo!OD+)vR3cZce5G-XH|&8wjAJ(#pEA#R2#)jYaQN5tXB++DT0f^_5?UfKE5 zhTlbV0Uh~+(T0u{>7vh@`Gb7hXZ?kyKe=ebPYtuC(FQG*8! zJASYF0i>gx*^H%jB@h#ae6pz15pbT$awo8Dvd-Et;>VHo>!bk!#LW5PGkUW?rmEG% z$>8!gq*~N+TV4N%I+E!el5(um=QnNv9XZQ0 zaxXI5&?>d?!)AUH5Ar#&d&;BsH7{f>c41DM`p-+k>je9SCL?aJnR)+oZoq!s(fZ!8T z8}8PxA0R&`J7W^RH8t~r<#^@xh4Sjs8s*%YM1}p)STP6?YXw#=qw+dL|HDBo%}HTd zdi59AQOVAHdGVdg{DgO9@I4!)G1CHJlIgeElW$@pLTmQOmh!`+2-gbaS-MgSmRc5uyv3l9H~9 zn$L$FjORmANWE3_V`Hb$v(5)sHMxK8tI*lZr``yS9^KDkeO<4R+;qnsA{qr3ET?z~ zFB~0`AlHLH3Ms9kj!f9m%C7d|?Re>&-lVe?74~=z!`Q=5#sieh_-D$80qAc5t315+ z6+4!>?VBfA?d3ZQbv->(jhYiuoet(5)ni_o|M*;gNDunrup-;|a5kz|H>X9gS(P;!Q=?NK-J{K@kG~OkVW*8rm0OdLfx9HspVs$n7VT_lt;x(Y5 zx{$a<=3??@`yErv%3{wl^vcRpNOm6Fk;75)ti0NduDp63TudtSnB=Tuk$@CA*W_jG zE1G1c)22Ui-(JRA7FS(y5%pl}Z6K|CV^sPYqkkTrfOp4}n1TuS-LCo8my)N?$*mwI zUY2SkH+6rGMt3^tZrNGxdWzS-UukczX6}kqQ|~kTUE!1p=hJX`^7_Vd=sS6zpRS>w zhE!5nYvr8XlqTQ0QCmvu5ywT|@Ap0>)7%0Ah=u1m6|Nm#R!%-WkbWt*%PegSrrwO? z=0&mT=T_4*`iUWmzS+t5-oWLVN457l(!Y%kNYDlxPd~8kkH|z%nVIsvgbChmYOJkY zPL8R51-UjGsdDSt+=XVBKM7czbXBehBUJrpU;OfGrBcpflkXmog5>)j7r|85$PP;X z39H-Cf2>;>CA&>b`OdQm?Td2)Y_2Azrhj@rwAMtce+a+a?sp?D*66=O7Cng#VPp{{ znfd8#vu;kq>kwd_hF9(~|H3wlDA!&J#=!Z9t6B!vqC@xaEmPljcqlZhco@xti;zR0 z)wu3~pW)m6gsHk24qm81=cnIAdR+olF1*8p-Kd?C!iliSfhfg*hT@c+^-<5h$LOAc zMXka7YrI?}3ZPqnAvef_LBT@uYJ#SAk81k>9AK(FSPLa7CCpcIFA^ z3!OucUjfzBO(F9`n8l5epp_}ns{k%Dz0kb?!;=N12|hlD1LaDWLaOkyu~A*1Kp|O` zXE*@9F{vXHvYj{km;1Wl*nd*!K;{=mfFt4`oVebol^kKLsX}xpzJIrTrzMAj-rX7c z&X$8Va1PJ5kewjqT~Vxj!$OrATeclosr@*(?Xe!kVM3*93fpMiPnw0j=Jmm==%WM?PI7~T9NecNSKk{O_wh{khOoMmYK>VF+=`>S87 zS<8DwR0}Pc7{p0n4HEe$gN-!sCV~0ZKt)Cc_nR3u%_Z!OA}*Qu_4mrH4-k(Z@iI1^ z4x(RPttmqyKmTEE{-65=5(V$h{6w5^rS$)^FhvsnGAH;!u4(m42%+6FZ1?u@2n>%z0t~tr))TvPTabmA5GM4~~xrB9(obYGT@b zC!d(N)1pK#;(O4O2@2!<42XCT}&v8G5nI#j{ z+er@}9&6MjdNNAQ7XMS)Zm3AdkPa}6cg}^Tcb)(nKQ^T;?U{#+G}u>swHJhUKX~Ei zVhtOUJ6>*`I+x<5Tz9-#;-OK5doJa<^LzYNyjI=(jSbR$1 z$qZJz9fM79(1~FsbN8Btul(&m+Jzk0*o7QDQY`Feb~cRL=JybZlNr}gQdrWa&RW;d z{9F7Z>8Twh3TSHyqS3~{N>8U>A`PfIpx#ru4OzCp2sSn2(%UPZ_-`(@6p*95v zrmhN^UCwG3%XhR*4~;OZ#JHl8LLuF}v!w>;2C8#F@^MDU@4L=xE4cK&1YX2 z!8i^&MN@5p<#UTlY3{x<`>^Q>bK3R7-H;JJbnkz-sRY8r2+U5a0JbswO#CQWv_;69 zq6!+}31C>n%g{=Ov&Wq9&dT&=!vx!VicQpkw{5vNwE$t+1^ltBd`r4pg|F2mKVW0H zcMMNLER7m*2CVJ}zJX+Yo23qFQ0z00Tk%@NGQD0sYfc**5Z6!GG{#$3I z%O{yvD=TEFi?-4-BoA885)D&gJj8p0a9yEg?;n)i#X?En&yin;W(D5G`%_n3PqFp& zXMu1p<&L-33^bIiA8_w?iik!W4^EC-gI3ybGXL)s6pt5{D<`X%qe>^k_=SUI!flU3 zSsK@h;WEv}e5}Upl@~J$ErURj!F7Xt_}nWBpiaNU=L7DAQ74`${P2cf86{& zIYTlt`zW()+0DgG?szJy`Uz=)f)<>F!0g}1S?D&_9t4IPIR&v1JA<=yrc{sqs|Bfd zg7CO&&T2H-?&%3T1al~FD|~HuC?ytq(e-}pl06yU3T>?DA#WC2J4RY3Mn6XAi~Zs@ z=BxG;eYDnLW-f&Ii0VbGf5Q8jTG_F zD_SC@$SE>Kc|OK=S8kbw4{WZWWpKZWXWle(@U}k--qVrNaakz@ZLLl8^bWPP{X?fa-=DHWER7I)FRr$XWtuhZLZ3jk z+}!6{;00I;iZ#$osHz#!K}o4$gScCJ*j6@D>qK^MfO;ANVXX+$3}P!A@JdNj@teHG GyZ-}-d5TH^ 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" From 91e749d7e31e16265d5bb1d8d3726adb675a1387 Mon Sep 17 00:00:00 2001 From: QuoteFox <49098813+quotefox@users.noreply.github.com> Date: Sat, 2 Jan 2021 13:53:34 +0000 Subject: [PATCH 2/4] comments comments clean up. --- hyperstation/code/modules/arousal/arousalhud.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 99afef1f1..cb0c61041 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -5,7 +5,7 @@ /obj/screen/arousal/ui_interact(mob/user) . = ..() - var/dat = {"Genitals

"} //for noncon toggling and erp toggling on the fly. + var/dat = {"Genitals

"} //List genitals var/obj/item/organ/genital/penis/P = user.getorganslot("penis") @@ -46,12 +46,12 @@ if(isliving(user.pulling)) if(iscarbon(user.pulling)) - dat += "Climax with [user.pulling]" //you can cum "with" living people. + 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]" //you can cum "with" living people. + dat += "Impregnate [user.pulling]" dat += "(Climax inside another person, knocking them up.)
" From dc3d5c32d51c75a9abb9543b782958138b3d4b2e Mon Sep 17 00:00:00 2001 From: QuoteFox <49098813+quotefox@users.noreply.github.com> Date: Sat, 2 Jan 2021 14:06:45 +0000 Subject: [PATCH 3/4] Toggle Undergarments button Toggle Undergarments button, forgot to put it in! --- hyperstation/code/modules/arousal/arousalhud.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index cb0c61041..90d057a4e 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -61,8 +61,11 @@ if(P.sounding == 1) dat += "Remove Sounding Rod
" + //bottom options dat += "Refresh" - dat += "Old Menu
" + dat += "Old Menu" + dat += "Toggle Undergarments " + dat += "
" var/datum/browser/popup = new(user, "arousal", "Arousal Panel") popup.set_content(dat) @@ -170,8 +173,12 @@ H.menuremovesounding() if(href_list["omenu"]) - H.mob_climax() usr << browse(null, "window=arousal") //closes the window + H.mob_climax() + return + + if(href_list["underwear"]) + H.underwear_toggle() return src.ui_interact(usr) From eabc280da421202d38e06761fe514f6d89dd437c Mon Sep 17 00:00:00 2001 From: QuoteFox <49098813+quotefox@users.noreply.github.com> Date: Sat, 2 Jan 2021 14:19:02 +0000 Subject: [PATCH 4/4] Moved items into contextal Moved items into contextal --- hyperstation/code/modules/arousal/arousalhud.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 90d057a4e..50b3c9c97 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -55,12 +55,12 @@ dat += "(Climax inside another person, knocking them up.)
" - dat += {"
"}//Newline for the objects + 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"