|
|
|
@@ -1,13 +1,13 @@
|
|
|
|
|
//Mob vars
|
|
|
|
|
/mob/living
|
|
|
|
|
var/arousalloss = 0 //How aroused the mob is.
|
|
|
|
|
var/min_arousal = 0 //The lowest this mobs arousal will get. default = 0
|
|
|
|
|
var/max_arousal = 100 //The highest this mobs arousal will get. default = 100
|
|
|
|
|
var/arousal_rate = 1 //The base rate that arousal will increase in this mob.
|
|
|
|
|
var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob.
|
|
|
|
|
var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types.
|
|
|
|
|
var/mb_cd_length = 100 //5 second cooldown for masturbating because fuck spam.
|
|
|
|
|
var/mb_cd_timer = 0 //The timer itself
|
|
|
|
|
var/arousalloss = 0 //How aroused the mob is.
|
|
|
|
|
var/min_arousal = AROUSAL_MINIMUM_DEFAULT //The lowest this mobs arousal will get. default = 0
|
|
|
|
|
var/max_arousal = AROUSAL_MAXIMUM_DEFAULT //The highest this mobs arousal will get. default = 100
|
|
|
|
|
var/arousal_rate = AROUSAL_START_VALUE //The base rate that arousal will increase in this mob.
|
|
|
|
|
var/arousal_loss_rate = AROUSAL_START_VALUE //How easily arousal can be relieved for this mob.
|
|
|
|
|
var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types.
|
|
|
|
|
var/mb_cd_length = 5 SECONDS //5 second cooldown for masturbating because fuck spam.
|
|
|
|
|
var/mb_cd_timer = 0 //The timer itself
|
|
|
|
|
|
|
|
|
|
/mob/living/carbon/human
|
|
|
|
|
canbearoused = TRUE
|
|
|
|
@@ -22,8 +22,8 @@
|
|
|
|
|
|
|
|
|
|
//Species vars
|
|
|
|
|
/datum/species
|
|
|
|
|
var/arousal_gain_rate = 1 //Rate at which this species becomes aroused
|
|
|
|
|
var/arousal_lose_rate = 1 //Multiplier for how easily arousal can be relieved
|
|
|
|
|
var/arousal_gain_rate = AROUSAL_START_VALUE //Rate at which this species becomes aroused
|
|
|
|
|
var/arousal_lose_rate = AROUSAL_START_VALUE //Multiplier for how easily arousal can be relieved
|
|
|
|
|
var/list/cum_fluids = list("semen")
|
|
|
|
|
var/list/milk_fluids = list("milk")
|
|
|
|
|
var/list/femcum_fluids = list("femcum")
|
|
|
|
@@ -77,7 +77,8 @@
|
|
|
|
|
updatearousal()
|
|
|
|
|
|
|
|
|
|
/mob/living/proc/getPercentAroused()
|
|
|
|
|
return ((100 / max_arousal) * arousalloss)
|
|
|
|
|
var/percentage = ((100 / max_arousal) * arousalloss)
|
|
|
|
|
return percentage
|
|
|
|
|
|
|
|
|
|
/mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage.
|
|
|
|
|
if(!isnum(percentage) || percentage > 100 || percentage < 0)
|
|
|
|
@@ -104,6 +105,8 @@
|
|
|
|
|
S = GLOB.breasts_shapes_list[G.shape]
|
|
|
|
|
if(S?.alt_aroused)
|
|
|
|
|
G.aroused_state = isPercentAroused(G.aroused_amount)
|
|
|
|
|
if(getArousalLoss() >= ((max_arousal / 100) * 33))
|
|
|
|
|
G.aroused_state = TRUE
|
|
|
|
|
else
|
|
|
|
|
G.aroused_state = FALSE
|
|
|
|
|
G.update_appearance()
|
|
|
|
@@ -219,17 +222,17 @@
|
|
|
|
|
fluid_source = G.linked_organ.reagents
|
|
|
|
|
total_fluids = fluid_source.total_volume
|
|
|
|
|
if(mb_time)
|
|
|
|
|
src.visible_message("<span class='danger'>[src] starts to [G.masturbation_verb] [p_their()] [G.name].</span>", \
|
|
|
|
|
"<span class='green'>You start to [G.masturbation_verb] your [G.name].</span>", \
|
|
|
|
|
"<span class='green'>You start to [G.masturbation_verb] your [G.name].</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] starts to [G.masturbation_verb] [p_their()] [G.name].</span>", \
|
|
|
|
|
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name].</span>", \
|
|
|
|
|
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name].</span>")
|
|
|
|
|
|
|
|
|
|
if(do_after(src, mb_time, target = src))
|
|
|
|
|
if(total_fluids > 5)
|
|
|
|
|
fluid_source.reaction(src.loc, TOUCH, 1, 0)
|
|
|
|
|
fluid_source.clear_reagents()
|
|
|
|
|
src.visible_message("<span class='danger'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
|
|
|
|
|
"<span class='green'>You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].</span>", \
|
|
|
|
|
"<span class='green'>You have relieved yourself.</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
|
|
|
|
|
"<span class='userlove'>You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].</span>", \
|
|
|
|
|
"<span class='userlove'>You have relieved yourself.</span>")
|
|
|
|
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
if(G.can_climax)
|
|
|
|
|
setArousalLoss(min_arousal)
|
|
|
|
@@ -257,16 +260,16 @@
|
|
|
|
|
else
|
|
|
|
|
total_fluids = fluid_source.total_volume
|
|
|
|
|
if(mb_time) //as long as it's not instant, give a warning
|
|
|
|
|
src.visible_message("<span class='danger'>[src] looks like they're about to cum.</span>", \
|
|
|
|
|
"<span class='green'>You feel yourself about to orgasm.</span>", \
|
|
|
|
|
"<span class='green'>You feel yourself about to orgasm.</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] looks like they're about to cum.</span>", \
|
|
|
|
|
"<span class='userlove'>You feel yourself about to orgasm.</span>", \
|
|
|
|
|
"<span class='userlove'>You feel yourself about to orgasm.</span>")
|
|
|
|
|
if(do_after(src, mb_time, target = src))
|
|
|
|
|
if(total_fluids > 5)
|
|
|
|
|
fluid_source.reaction(src.loc, TOUCH, 1, 0)
|
|
|
|
|
fluid_source.clear_reagents()
|
|
|
|
|
src.visible_message("<span class='danger'>[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!</span>", \
|
|
|
|
|
"<span class='green'>You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].</span>", \
|
|
|
|
|
"<span class='green'>You climax using your [G.name].</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!</span>", \
|
|
|
|
|
"<span class='userlove'>You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].</span>", \
|
|
|
|
|
"<span class='userlove'>You climax using your [G.name].</span>")
|
|
|
|
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
if(G.can_climax)
|
|
|
|
|
setArousalLoss(min_arousal)
|
|
|
|
@@ -285,9 +288,9 @@
|
|
|
|
|
fluid_source = G.linked_organ.reagents
|
|
|
|
|
total_fluids = fluid_source.total_volume
|
|
|
|
|
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]!", \
|
|
|
|
|
"<span class='danger'>You're preparing to climax with someone!</span>")
|
|
|
|
|
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>")
|
|
|
|
|
if(spillage)
|
|
|
|
|
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
|
|
|
|
fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
|
|
|
|
@@ -295,9 +298,9 @@
|
|
|
|
|
if(total_fluids > 5)
|
|
|
|
|
fluid_source.reaction(L.loc, TOUCH, 1, 0)
|
|
|
|
|
fluid_source.clear_reagents()
|
|
|
|
|
src.visible_message("<span class='danger'>[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!</span>", \
|
|
|
|
|
"<span class='green'>You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].</span>", \
|
|
|
|
|
"<span class='green'>You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!</span>", \
|
|
|
|
|
"<span class='userlove'>You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].</span>", \
|
|
|
|
|
"<span class='userlove'>You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].</span>")
|
|
|
|
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
if(G.can_climax)
|
|
|
|
@@ -306,9 +309,9 @@
|
|
|
|
|
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
|
|
|
|
fluid_source.trans_to(L, total_fluids)
|
|
|
|
|
total_fluids = 0
|
|
|
|
|
src.visible_message("<span class='danger'>[src] climaxes with [L], [p_their()] [G.name] spilling nothing!</span>", \
|
|
|
|
|
"<span class='green'>You ejaculate with [L], your [G.name] spilling nothing.</span>", \
|
|
|
|
|
"<span class='green'>You have climaxed inside someone, your [G.name] spilling nothing.</span>")
|
|
|
|
|
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>", \
|
|
|
|
|
"<span class='userlove'>You have climaxed inside someone, your [G.name] spilling nothing.</span>")
|
|
|
|
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
if(G.can_climax)
|
|
|
|
@@ -332,14 +335,14 @@
|
|
|
|
|
// to_chat(src, "<span class='warning'>You need a container to do this!</span>")
|
|
|
|
|
// return
|
|
|
|
|
|
|
|
|
|
src.visible_message("<span class='danger'>[src] starts to [G.masturbation_verb] their [G.name] over [container].</span>", \
|
|
|
|
|
"<span class='userdanger'>You start to [G.masturbation_verb] your [G.name] over [container].</span>", \
|
|
|
|
|
"<span class='userdanger'>You start to [G.masturbation_verb] your [G.name] over something.</span>")
|
|
|
|
|
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>", \
|
|
|
|
|
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name] over something.</span>")
|
|
|
|
|
if(do_after(src, mb_time, target = src) && in_range(src, container))
|
|
|
|
|
fluid_source.trans_to(container, total_fluids)
|
|
|
|
|
src.visible_message("<span class='danger'>[src] uses [p_their()] [G.name] to fill [container]!</span>", \
|
|
|
|
|
"<span class='green'>You used your [G.name] to fill [container].</span>", \
|
|
|
|
|
"<span class='green'>You have relieved some pressure.</span>")
|
|
|
|
|
src.visible_message("<span class='love'>[src] uses [p_their()] [G.name] to fill [container]!</span>", \
|
|
|
|
|
"<span class='userlove'>You used your [G.name] to fill [container].</span>", \
|
|
|
|
|
"<span class='userlove'>You have relieved some pressure.</span>")
|
|
|
|
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
|
|
|
|
if(G.can_climax)
|
|
|
|
|
setArousalLoss(min_arousal)
|
|
|
|
|