//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! /atom/movable/screen/arousal/ui_interact(mob/user) . = ..() var/dat = {"Genitals

"} var/mob/living/carbon/U = user for(var/obj/item/organ/genital/G in U.internal_organs) if(!G.nochange) if(!G.dontlist) // GS13: Fix spelling dat += "[G.mode == GEN_VISIBLE_NEVER ? "[G.name] (Hidden)" : (G.mode == GEN_VISIBLE_NO_UNDIES ? "[G.name] (Hidden by Undies)" : (G.mode == GEN_VISIBLE_NO_CLOTHES ? "[G.name] (Hidden by Clothes)" : (G.mode == GEN_VISIBLE_ALWAYS ? "[G.name] (Visible)" : "[G.name] (Visible)")))]
" 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.)
" var/mob/living/carbon/human/C = usr if(C && C.w_uniform || C.wear_suit) //if they are wearing cloths dat += "Explode out of clothes" dat += "(Flex your body to cause your clothes to burst apart.)
" if(user.pulling) dat += "Kiss [user.pulling]" dat += "(Kiss a partner, or object.)
" dat += "Feed [user.pulling]" dat += "(Feed a partner.)
" dat += "Feed from [user.pulling]" dat += "(Feed a partner.)
" else dat += "Kiss" dat += "(Requires a partner)
" dat += "Feed others" dat += "(Requires a partner)
" dat += "Feed from others" dat += "(Requires a partner)
" dat += "Feed yourself" dat += "(Feed yourself with your own genitals)
" var/obj/item/organ/genital/belly/Belly = user.getorganslot("belly") if(Belly) if(Belly.inflatable) // GS13: Fix description dat += "Decrease belly size" dat += "(Shrink your belly down a size)
" dat += "Increase belly size" dat += "(Bloat your belly up a size)
" if(user.pulling) 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.)
"} else dat += "Climax over" dat += "(Requires a partner)
" dat += "Climax with" dat += "(Requires a partner)
" for(var/obj/item/organ/genital/G in U.internal_organs) if(G.equipment) //they have equipment dat += "Remove [G.equipment.name] ([G.name])
" dat += {"
"}//Newline for the objects //bottom options dat += "Toggle others' giant sprites" //GS13 Edit dat += "Refresh" dat += "Old Menu" dat += "Toggle Undergarments " dat += "
" var/datum/browser/popup = new(user, "arousal", "Arousal Panel") popup.set_content(dat) popup.open() /atom/movable/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 Undies", "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 Undies", "Hidden by clothes", "Always hidden") V.toggle_visibility(picked_visibility) if(href_list["hidebreasts"]) var/obj/item/organ/genital/breasts/B = usr.getorganslot(ORGAN_SLOT_BREASTS) var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by Undies", "Hidden by clothes", "Always hidden") B.toggle_visibility(picked_visibility) if(href_list["hidebelly"]) var/obj/item/organ/genital/belly/E = usr.getorganslot("belly") var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by Undies", "Hidden by clothes", "Always hidden") E.toggle_visibility(picked_visibility) if(href_list["hidebutt"]) var/obj/item/organ/genital/butt/A = usr.getorganslot(ORGAN_SLOT_BUTT) var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by Undies", "Hidden by clothes", "Always hidden") A.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 Undies", "Hidden by clothes", "Always hidden") T.toggle_visibility(picked_visibility) if(href_list["masturbate"]) if (H.arousal >= (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.arousal >= (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["clothesplosion"]) if (H.arousal >= (H.max_arousal / 100) * 33) //Requires 33% arousal. H.clothesplosion() return else to_chat(usr, "You aren't aroused enough for that! ") return if(href_list["climax"]) if (H.arousal >= (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.arousal >= (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.arousal >= (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.arousal >= (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["feed"]) if(usr.pulling) feed() else to_chat(usr, "You cannot do this alone!") return if(href_list["feedfrom"]) if(usr.pulling) feedfrom() else to_chat(usr, "You cannot do this alone!") return if(href_list["feedyourself"]) feedyourself() return if(href_list["shrink_belly"]) var/obj/item/organ/genital/belly/E = usr.getorganslot("belly") if(E.size > 0) to_chat(usr, "You feel your belly diminish.") E.size -= 1 H.update_genitals() else to_chat(usr, "Your belly is already at the minimum size! ") if(href_list["inflate_belly"]) var/obj/item/organ/genital/belly/E = usr.getorganslot("belly") if(E.size < 11) to_chat(usr, "You feel your belly bloat out..") E.size += 1 H.update_genitals() else to_chat(usr, "Your belly is already at the maximum size! ") if(href_list["removeequipmentpenis"]) var/obj/item/organ/genital/penis/O = usr.getorganslot("penis") var/obj/item/I = O.equipment usr.put_in_hands(I) O.equipment = null if(href_list["removeequipmentbreasts"]) var/obj/item/organ/genital/breasts/O = usr.getorganslot(ORGAN_SLOT_BREASTS) var/obj/item/I = O.equipment usr.put_in_hands(I) O.equipment = null if(href_list["removeequipmentvagina"]) var/obj/item/organ/genital/vagina/O = usr.getorganslot("vagina") var/obj/item/I = O.equipment usr.put_in_hands(I) if(istype(I, /obj/item/portalpanties)) var/obj/item/portalpanties/P = I P.remove() O.equipment = null if(href_list["removeequipmentbelly"]) var/obj/item/organ/genital/belly/O = usr.getorganslot("belly") var/obj/item/I = O.equipment usr.put_in_hands(I) O.equipment = null if(href_list["removeequipmentanus"]) var/obj/item/organ/genital/butt/O = usr.getorganslot(ORGAN_SLOT_BUTT) var/obj/item/I = O.equipment usr.put_in_hands(I) O.equipment = null if(href_list["omenu"]) usr << browse(null, "window=arousal") //closes the window H.mob_climax() return if(href_list["underwear"]) H.underwear_toggle() return if(href_list["toggle_giant"]) if(H && H.client) H.client.toggle_others_giant() return src.ui_interact(usr) /atom/movable/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) /atom/movable/screen/arousal/proc/feed() 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.genitalfeed(H.pulling) /atom/movable/screen/arousal/proc/feedfrom() 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.genitalfeedfrom(H.pulling) /atom/movable/screen/arousal/proc/feedyourself() 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.genitalfeedyourself() /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!") 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/spillage = "No" //default to no, just incase player has items on to prevent climax 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) 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/clothesplosion() if(usr.restrained(TRUE)) to_chat(usr, "You can't do that while restrained!") return var/mob/living/carbon/human/H = src var/items = H.get_contents() for(var/obj/item/W in items) if(W == H.w_uniform || W == H.wear_suit) H.dropItemToGround(W, TRUE) playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1) H.visible_message("[H] explodes out of their clothes!'") /mob/living/carbon/human/proc/impregwith(mob/living/T) /*GS13 Port - Do we even do breeding in legacy? 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 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 */ 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 /mob/living/carbon/human/proc/genitalfeed(mob/living/L, mb_time = 30) if(isliving(L)) //is your target living? Living people can resist your advances if they want to via moving. if(iscarbon(L)) var/obj/item/organ/genital/picked_organ var/total_fluids = 0 var/datum/reagents/fluid_source = null 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 if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else if(!picked_organ.linked_organ) to_chat(src, "Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.") return fluid_source = picked_organ.linked_organ.reagents total_fluids = fluid_source.total_volume src.visible_message("[src] starts to feed [L.name] with their [picked_organ.name].", \ "You feed [L.name] with your [picked_organ.name].") if(do_after(src, mb_time, target = src) && in_range(src, L)) fluid_source.trans_to(L, total_fluids) src.visible_message("[src] uses [p_their()] [picked_organ.name] to feed [L.name]!", \ "You used your [picked_organ.name] to feed [L.name] a total of [total_fluids]u's.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) if(picked_organ.can_climax) setArousal(min_arousal) else //They either lack organs that can climax, or they didn't pick one. to_chat(src, "You cannot fill anything without choosing exposed genitals.") return /mob/living/carbon/human/proc/genitalfeedfrom(mob/living/target, mb_time = 30) var/mob/living/carbon/human/L = target var/obj/item/organ/genital/picked_organ var/total_fluids = 0 var/datum/reagents/fluid_source = null src << browse(null, "window=arousal") var/list/genitals_list = list() var/list/worn_stuff = L.get_equipped_items() for(var/obj/item/organ/genital/G in L.internal_organs) if(G.can_climax) //filter out what you can't masturbate with if(G.is_exposed(worn_stuff)) //Nude or through_clothing if(!G.dontlist) genitals_list += G if(genitals_list.len) picked_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list else return if(picked_organ) //Good, got an organ, time to pick a container if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else if(!picked_organ.linked_organ) to_chat(src, "The [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.") return fluid_source = picked_organ.linked_organ.reagents total_fluids = fluid_source.total_volume src.visible_message("[src] starts to feed from [L.name]'s [picked_organ.name].", \ "You feed from [L.name]'s '[picked_organ.name].") if(do_after(src, mb_time, target = src) && in_range(src, L)) fluid_source.trans_to(src, total_fluids) src.visible_message("[src] feeds from [L.name]'s [picked_organ.name]!", \ "You used [L.name]'s [picked_organ.name] to feed with a total of [total_fluids]u's.") SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) if(picked_organ.can_climax) L.setArousal(min_arousal) else //They either lack organs that can climax, or they didn't pick one. to_chat(src, "You cannot fill anything without choosing exposed genitals.") return /mob/living/carbon/human/proc/genitalfeedyourself(mb_time = 30) var/obj/item/organ/genital/picked_organ var/total_fluids = 0 var/datum/reagents/fluid_source = null 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 if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else if(!picked_organ.linked_organ) to_chat(src, "Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.") return fluid_source = picked_organ.linked_organ.reagents total_fluids = fluid_source.total_volume src.visible_message("[src] starts to feed themselves with their [picked_organ.name].", \ "You feed yourself with your [picked_organ.name].") if(do_after(src, mb_time)) fluid_source.trans_to(src, total_fluids) src.visible_message("[src] uses [p_their()] [picked_organ.name] to feed themselves!", \ "You used your [picked_organ.name] to feed yourself a total of [total_fluids]u's.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) if(picked_organ.can_climax) setArousal(min_arousal) else //They either lack organs that can climax, or they didn't pick one. to_chat(src, "You cannot fill anything without choosing exposed genitals.") return