//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