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"