Merge pull request #804 from quotefox/sexhud

New HTML arousal hud, with contextal options, plus new lewd features.
This commit is contained in:
QuoteFox
2021-01-02 14:34:31 +00:00
committed by GitHub
16 changed files with 477 additions and 36 deletions
+1
View File
@@ -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, "<span class='danger'>[src] cleans your face!</span>")
+1 -3
View File
@@ -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
+1
View File
@@ -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
@@ -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)
@@ -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!
+4 -2
View File
@@ -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.
@@ -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 = "<span class='danger'>The pain subsides. You feel... oddly attracted to light.</span>"
/datum/reagent/mutationtoxin/ipc
name = "IPC Mutation Toxin"
description = "A robotic toxin." //NANOMACHINES SON.
@@ -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 ..()
@@ -6,4 +6,9 @@
/datum/mood_event/heat
description = "<span class='userlove'>I have satisfied my heat, and I'm filled with happiness!</span>\n"
mood_change = 3
timeout = 5 MINUTES
timeout = 5 MINUTES
/datum/mood_event/kiss
description = "<span class='nicegreen'>Someone kissed me, I feel happy!</span>\n"
mood_change = 2
timeout = 3 MINUTES
@@ -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 = {"<B>Genitals</B><BR><HR>"}
//List genitals
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
if (P) //they have a pp
dat += "<a href='byond://?src=[REF(src)];hidepenis=1'>[P.mode == "hidden" ? "Penis <font color='red'>(Hidden)</font>" : (P.mode == "clothes" ? "Penis <font color='yellow'>(Hidden by Clothes)</font>" : (P.mode == "visable" ? "Penis <font color='green'>(Visable)</font>" : "Penis <font color='green'>(Visable)</font>"))]</a><BR>"
var/obj/item/organ/genital/testicles/T = user.getorganslot("testicles")
if (T) //they have teabags
if(!T.internal)
dat += "<a href='byond://?src=[REF(src)];hidetesticles=1'>[T.mode == "hidden" ? "Testicles <font color='red'>(Hidden)</font>" : (T.mode == "clothes" ? "Testicles <font color='yellow'>(Hidden by Clothes)</font>" : (T.mode == "visable" ? "Testicles <font color='green'>(Visable)</font>" : "Testicles <font color='green'>(Visable)</font>"))]</a><BR>"
else //internal balls
dat += "<a href='byond://?src=[REF(src)];na=1'>Internal Testicles</A><BR>"
var/obj/item/organ/genital/vagina/V = user.getorganslot("vagina")
if (V) //they have a vjay
dat += "<a href='byond://?src=[REF(src)];hidevagina=1'>[V.mode == "hidden" ? "Vagina <font color='red'>(Hidden)</font>" : (V.mode == "clothes" ? "Vagina <font color='yellow'>(Hidden by Clothes)</font>" : (V.mode == "visable" ? "Vagina <font color='green'>(Visable)</font>" : "Vagina <font color='green'>(Visable)</font>"))]</a><BR>"
var/obj/item/organ/genital/breasts/B = user.getorganslot("breasts")
if (B) //they have a boobiedoo
dat += "<a href='byond://?src=[REF(src)];hidebreasts=1'>[B.mode == "hidden" ? "Breasts <font color='red'>(Hidden)</font>" : (B.mode == "clothes" ? "Breasts <font color='yellow'>(Hidden by Clothes)</font>" : (B.mode == "visable" ? "Breasts <font color='green'>(Visable)</font>" : "Breasts <font color='green'>(Visable)</font>"))]</a><BR>"
dat += {"<BR><B>Contexual Options</B><BR><HR>"}
//Options
dat += "<a href='byond://?src=[REF(src)];masturbate=1'>Masturbate</A>"
dat += "(Stimulate a sexual organ with your hands.)<BR>"
dat += "<a href='byond://?src=[REF(src)];climax=1'>Climax</A>"
dat += "(Orgasm from a sexual organ.)<BR>"
dat += "<a href='byond://?src=[REF(src)];container=1'>Fill container</A>"
dat += "(Use a container in your hand to collect your seminal fluid.)<BR>"
if(user.pulling)
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
dat += "(Kiss a partner, or object.)<BR>"
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
dat += "(Orgasm over a person or object.)<BR>"
if(isliving(user.pulling))
if(iscarbon(user.pulling))
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
dat += {"(Orgasm with another person.)<BR>"}
var/mob/living/carbon/human/H = user.pulling
if(H.breedable && P && H)
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [user.pulling]</A>"
dat += "(Climax inside another person, knocking them up.)<BR>"
if(P.condom == 1)
dat += "<a href='byond://?src=[REF(src)];removecondom=1'>Remove Condom</A><BR>"
if(P.sounding == 1)
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove Sounding Rod</A><BR>"
dat += {"<HR>"}//Newline for the objects
//bottom options
dat += "<a href='byond://?src=[REF(src)];refresh=1'>Refresh</A>"
dat += "<a href='byond://?src=[REF(src)];omenu=1'>Old Menu</A>"
dat += "<a href='byond://?src=[REF(src)];underwear=1'>Toggle Undergarments </A>"
dat += "<BR>"
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, "<span class='warning'>You must be conscious to do that!</span>")
usr << browse(null, "window=arousal") //closes the window
return
if(usr.stat==3)
to_chat(usr, "<span class='warning'>You must be alive to do that!</span>")
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, "<span class='warning'>You aren't aroused enough for that! </span>")
return
if(href_list["container"])
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
H.cumcontainer()
return
else
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
return
if(href_list["climax"])
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
H.climaxalone(FALSE)
return
else
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
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, "<span class='warning'>You aren't aroused enough for that! </span>")
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, "<span class='warning'>You aren't aroused enough for that! </span>")
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, "<span class='warning'>You aren't aroused enough for that! </span>")
return
if(href_list["kiss"])
if(usr.pulling)
kiss()
else
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
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, "<span class='warning'>You can't do that while restrained!</span>")
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, "<span class='warning'>You can't do that while restrained!</span>")
return
var/free_hands = get_num_arms()
if(!free_hands)
to_chat(src, "<span class='warning'>You need at least one free arm.</span>")
return
var/obj/item/organ/genital/penis/P = getorganslot("penis")
if(!P.condom)
to_chat(src, "<span class='warning'>You don't have a condom on!</span>")
return
if(P.condom)
to_chat(src, "<span class='warning'>You tug the condom off the end of your penis!</span>")
removecondom()
src.ui_interact(usr) //reopen dialog
return
return
/mob/living/carbon/human/proc/menuremovesounding()
if(restrained(TRUE))
to_chat(src, "<span class='warning'>You can't do that while restrained!</span>")
return
var/free_hands = get_num_arms()
if(!free_hands)
to_chat(src, "<span class='warning'>You need at least one free arm.</span>")
return
var/obj/item/organ/genital/penis/P = getorganslot("penis")
if(!P.sounding)
to_chat(src, "<span class='warning'>You don't have a rod inside!</span>")
return
if(P.sounding)
to_chat(src, "<span class='warning'>You pull the rod off from the tip of your penis!</span>")
removesounding()
src.ui_interact(usr) //reopen dialog
return
return
/mob/living/carbon/human/proc/solomasturbate()
if(restrained(TRUE))
to_chat(src, "<span class='warning'>You can't do that while restrained!</span>")
return
var/free_hands = get_num_arms()
if(!free_hands)
to_chat(src, "<span class='warning'>You need at least one free arm.</span>")
return
for(var/helditem in held_items)
if(isobj(helditem))
free_hands--
if(free_hands <= 0)
to_chat(src, "<span class='warning'>You're holding too many things.</span>")
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, "<span class='warning'>You cannot climax without choosing genitals.</span>")
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("<span class='notice'>[src] is about to kiss [L]!</span>", \
"<span class='notice'>You're attempting to kiss [L]!</span>", \
"<span class='notice'>You're attempting to kiss with something!</span>")
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("<span class='notice'>[src] kisses [L]!</span>", \
"<span class='notice'>You kiss [L]!</span>", \
"<span class='notice'>You kiss something!</span>")
/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, "<span class='warning'>You cannot climax without choosing genitals.</span>")
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, "<span class='warning'>You cannot do this alone.</span>")
return
else //They either lack organs that can masturbate, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
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, "<span class='warning'>You cannot do this action with a condom on.</span>")
return
if(P.sounding == 1)
to_chat(src, "<span class='warning'>You cannot do this action with a sounding in.</span>")
return
mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE)
else
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
return
else //They either lack organs that can masturbate, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
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, "<span class='warning'>Your partner cannot be impregnated.</span>")//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, "<span class='warning'>You cannot do this action with a condom on.</span>")
return
if(P.sounding == 1)
to_chat(src, "<span class='warning'>You cannot do this action with a sounding in.</span>")
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, "<span class='warning'>You cannot do this alone.</span>")
return
else //no penis :(
to_chat(src, "<span class='warning'>You cannot impregnate without a penis.</span>")
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, "<span class='warning'>You can't do that while restrained!</span>")
return
var/free_hands = get_num_arms()
if(!free_hands)
to_chat(src, "<span class='warning'>You need at least one free arm.</span>")
return
for(var/helditem in held_items)//how many hands are free
if(isobj(helditem))
free_hands--
if(free_hands <= 0)
to_chat(src, "<span class='warning'>You're holding too many things.</span>")
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, "<span class='warning'>You cannot do this without anything to fill.</span>")
return
else //They either lack organs that can climax, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot fill anything without choosing genitals.</span>")
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
+1 -1
View File
@@ -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, "<span class='userlove'>The condom around your penis, bubbles outwards and fills with your cum.</span>")
P.condom = 0
P.colourtint = ""
src.update_genitals()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

+32 -24
View File
@@ -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, "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>")
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("<span class='love'>[src] is about to climax with [L]!</span>", \
"<span class='userlove'>You're about to climax with [L]!</span>", \
"<span class='userlove'>You're preparing to climax with someone!</span>")
"<span class='userlove'>You're preparing to climax with something!</span>")
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("<span class='love'>[src] climaxes over [L][cover ? ", coating them":""], using [p_their()] [G.name]!</span>", \
"<span class='userlove'>You orgasm over [L][cover ? ", drenching them":""], using your [G.name].</span>", \
"<span class='userlove'>You have climaxed over someone[cover ? ", coating them":""], using your [G.name].</span>")
src.visible_message("<span class='love'>[src] climaxes over [L], using [p_their()] [G.name]!</span>", \
"<span class='userlove'>You orgasm over [L], using your [G.name].</span>", \
"<span class='userlove'>You have climaxed over something, using your [G.name].</span>")
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("<span class='love'>[src] climaxes with [L], [p_their()] [G.name] spilling nothing!</span>", \
"<span class='userlove'>You ejaculate with [L], your [G.name] spilling nothing.</span>", \
@@ -441,9 +448,9 @@
fluid_source = G.linked_organ.reagents
total_fluids = fluid_source.total_volume
//if(!container) //Something weird happened
// to_chat(src, "<span class='warning'>You need a container to do this!</span>")
// return
if(!container) //Something weird happened
to_chat(src, "<span class='warning'>You need a container to do this!</span>")
return
src.visible_message("<span class='love'>[src] starts to [G.masturbation_verb] their [G.name] over [container].</span>", \
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name] over [container].</span>", \
@@ -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.
@@ -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
@@ -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
+1
View File
@@ -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"