From 854a0cf4b4f5397cec683e95c91fd4d9a43df61e Mon Sep 17 00:00:00 2001 From: AlManiak Date: Sun, 13 Oct 2024 22:48:31 +0200 Subject: [PATCH 1/9] Initial commit of a working state --- GainStation13/code/mechanics/fatrousal.dm | 2 +- code/__DEFINES/citadel_defines.dm | 5 + code/__DEFINES/hud.dm | 1 + code/__HELPERS/_cit_helpers.dm | 11 + code/_onclick/hud/hud.dm | 4 + code/_onclick/hud/human.dm | 6 + code/datums/mind.dm | 2 + code/game/atoms.dm | 1 + code/game/objects/items.dm | 3 + code/modules/arousal/arousal.dm | 878 ++++++++++++++---- code/modules/arousal/genitals.dm | 14 +- code/modules/arousal/organs/breasts.dm | 2 + code/modules/arousal/organs/penis.dm | 2 + code/modules/arousal/organs/testicles.dm | 1 + code/modules/arousal/organs/vagina.dm | 1 + .../mob/living/carbon/human/human_defines.dm | 3 + .../mob/living/carbon/human/species.dm | 7 + .../code/modules/arousal/arousalhud.dm | 135 +-- hyperstation/code/modules/resize/resizing.dm | 8 +- hyperstation/code/obj/condom.dm | 2 +- hyperstation/code/obj/fleshlight.dm | 30 +- hyperstation/code/obj/vibrator.dm | 4 +- .../modules/mob/living/carbon/human/life.dm | 6 + sound/lewd/champ_fingering.ogg | Bin 0 -> 25107 bytes sound/lewd/latex.ogg | Bin 0 -> 12617 bytes sound/lewd/slaps.ogg | Bin 0 -> 20304 bytes sound/lewd/vibrate.ogg | Bin 0 -> 24136 bytes tgstation.dme | 4 + 28 files changed, 821 insertions(+), 311 deletions(-) create mode 100644 modular_citadel/code/modules/mob/living/carbon/human/life.dm create mode 100644 sound/lewd/champ_fingering.ogg create mode 100644 sound/lewd/latex.ogg create mode 100644 sound/lewd/slaps.ogg create mode 100644 sound/lewd/vibrate.ogg diff --git a/GainStation13/code/mechanics/fatrousal.dm b/GainStation13/code/mechanics/fatrousal.dm index c31b6054af..b2523ace24 100644 --- a/GainStation13/code/mechanics/fatrousal.dm +++ b/GainStation13/code/mechanics/fatrousal.dm @@ -20,7 +20,7 @@ /datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user) if(iscarbon(quirk_holder)) var/mob/living/carbon/C = quirk_holder - return C.getArousalLoss()*35 + return C.getArousal()*35 return FALSE */ diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index b3b5ece36d..bd9cb34827 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -70,6 +70,11 @@ #define BELLY_SIZE_DEF 0 #define BELLY_SIZE_MAX 10 +//GS13 Port - Add back Arousal +#define AROUSAL_MINIMUM_DEFAULT 0 +#define AROUSAL_MAXIMUM_DEFAULT 100 +#define AROUSAL_START_VALUE 1 + //visibility toggles defines to avoid errors typos code errors. #define GEN_VISIBLE_ALWAYS "Always visible" #define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes" diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 14a3b7dc49..4842a38716 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -98,6 +98,7 @@ #define ui_health "EAST-1:28,CENTER-1:15" #define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter #define ui_mood "EAST-1:28,CENTER-3:10" +#define ui_arousal "EAST-1:28,CENTER-4:8" // #define ui_spacesuit "EAST-1:28,CENTER-4:10" //Pop-up inventory diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index de006de90e..c885a5b996 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -144,6 +144,17 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) if(I.body_parts_covered & GROIN) return FALSE return TRUE +//GS13 Port - Arousal +/mob/living/carbon/proc/is_butt_exposed(var/list/L) + if(!L) + L = get_equipped_items() + for(var/obj/item/I in L) + if(I.body_parts_covered & GROIN) + if(!I.do_not_cover_butt) + return FALSE + else + return TRUE + return TRUE /mob/living/carbon/proc/is_chest_exposed(list/L) if(!L) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 53d69fe01e..61d99e29f3 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -88,6 +88,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/healthdoll var/atom/movable/screen/internals + //GS13 Port - Add back Arousal + var/atom/movable/screen/arousal + var/atom/movable/screen/wanted/wanted_lvl // subtypes can override this to force a specific UI style var/ui_style @@ -144,6 +147,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healthdoll = null wanted_lvl = null internals = null + arousal = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 27989f3bb1..bea9e564f2 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -430,6 +430,12 @@ infodisplay += staminabuffer //END OF CIT CHANGES + //GS13 Port - adds arousal and stamina to hud + arousal = new /atom/movable/screen/arousal() + arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "") + arousal.hud = src + infodisplay += arousal + healthdoll = new /atom/movable/screen/healthdoll() healthdoll.hud = src infodisplay += healthdoll diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c05d04ede8..5c810bed2a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -169,6 +169,8 @@ var/mob/living/L = new_character if(L.client?.prefs && L.client.prefs.auto_ooc && L.client.prefs.chat_toggles & CHAT_OOC) L.client.prefs.chat_toggles &= ~(CHAT_OOC) + L.canbearoused = L.client?.prefs?.arousable //Technically this should make taking over a character mean the body gain the new minds setting... + L.update_arousal_hud() //Removes the old icon hide_ckey = current.client?.prefs?.hide_ckey diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0eaba60ba8..ae025b355a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -94,6 +94,7 @@ var/datum/wires/wires = null var/icon/blood_splatter_icon + var/icon/cum_splatter_icon var/list/fingerprints var/list/fingerprintshidden var/list/blood_DNA diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e437ac5c8b..9db3090d66 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -181,6 +181,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. var/throw_verb + //GS13 Port - Hyper, for clothes that reveal your behind! butt stuff, you know how it is. + var/do_not_cover_butt = FALSE + /obj/item/Initialize(mapload) if(attack_verb) diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 4e0f37d529..298d9168c1 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -1,15 +1,36 @@ +//GS13 Port - Oh boy this has changed /mob/living + var/arousal = 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 + var/saved_underwear = ""//saves their underwear so it can be toggled later var/saved_undershirt = "" var/saved_socks = "" var/hidden_underwear = FALSE var/hidden_undershirt = FALSE var/hidden_socks = FALSE - var/arousal_rate = 1 + +/mob/living/carbon/human/New() + ..() + saved_underwear = underwear + saved_undershirt = undershirt + +//Species vars +/datum/species + 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(/datum/reagent/consumable/semen) + var/list/milk_fluids = list(/datum/reagent/consumable/milk) + var/list/femcum_fluids = list(/datum/reagent/consumable/semen/femcum) //Mob procs /mob/living/carbon/human/verb/underwear_toggle() @@ -40,6 +61,162 @@ update_body(TRUE) +/mob/living/proc/handle_arousal() + + +/mob/living/carbon/handle_arousal() + if(canbearoused && dna) + var/datum/species/S + S = dna.species + if(S) + if(!(SSmobs.times_fired % 36)) + if(getArousal() < max_arousal) + //if(S && !(SSmobs.times_fired % 36) && getArousal() < max_arousal)//Totally stolen from breathing code. Do this every 36 ticks. + adjustArousal(arousal_rate * S.arousal_gain_rate) + if(dna.features["exhibitionist"] && client) + var/amt_nude = 0 + if(is_chest_exposed() && (getorganslot("breasts"))) + amt_nude++ + if(is_groin_exposed()) + if(getorganslot("penis")) + amt_nude++ + if(getorganslot("vagina")) + amt_nude++ + if(is_butt_exposed()) + if(getorganslot("anus")) + amt_nude++ + if(amt_nude) + var/watchers = 0 + for(var/mob/_M in view(world.view, src)) + var/mob/living/M = _M + if(!istype(M)) + continue + if(M.client && !M.stat && !M.eye_blind && (locate(src) in viewers(world.view,M))) + watchers++ + if(watchers) + adjustArousal((amt_nude * watchers) + S.arousal_gain_rate) + +/mob/living/proc/getArousal() + return arousal + +/mob/living/proc/adjustArousal(amount, updating_arousal=1) + if(status_flags & GODMODE || !canbearoused) + return FALSE + arousal = clamp(arousal + amount, min_arousal, max_arousal) + if(updating_arousal) + updatearousal() + +/mob/living/proc/setArousal(amount, updating_arousal=1) + if(status_flags & GODMODE || !canbearoused) + return FALSE + arousal = clamp(amount, min_arousal, max_arousal) + if(updating_arousal) + updatearousal() + +/mob/living/proc/getPercentAroused() + var/percentage = ((100 / max_arousal) * arousal) + 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) + CRASH("Provided percentage is invalid") + if(getPercentAroused() >= percentage) + return TRUE + return FALSE + +//H U D// +/mob/living/proc/updatearousal() + update_arousal_hud() + +/mob/living/carbon/updatearousal() + . = ..() + + for(var/obj/item/organ/genital/G in internal_organs) + if(istype(G)) + var/datum/sprite_accessory/S + switch(G.type) + if(/obj/item/organ/genital/penis) + S = GLOB.cock_shapes_list[G.shape] + if(/obj/item/organ/genital/testicles) + S = GLOB.balls_shapes_list[G.shape] + if(/obj/item/organ/genital/vagina) + S = GLOB.vagina_shapes_list[G.shape] + if(/obj/item/organ/genital/breasts) + S = GLOB.breasts_shapes_list[G.shape] + if(S?.alt_aroused) + G.aroused_state = isPercentAroused(G.aroused_amount) + if(getArousal() >= ((max_arousal / 100) * 33)) + G.aroused_state = TRUE + else + G.aroused_state = FALSE + G.update_appearance() +/mob/living/proc/update_arousal_hud() + return FALSE + +/datum/species/proc/update_arousal_hud(mob/living/carbon/human/H) + return FALSE + +/mob/living/carbon/human/update_arousal_hud() + if(!client || !hud_used) + return FALSE + if(dna.species.update_arousal_hud()) + return FALSE + if(!canbearoused) + hud_used.arousal.icon_state = "" + return FALSE + else + if(hud_used.arousal) + if(stat == DEAD) + hud_used.arousal.icon_state = "arousal0" + return TRUE + if(getArousal() == max_arousal) + hud_used.arousal.icon_state = "arousal100" + return TRUE + if(getArousal() >= (max_arousal / 100) * 90)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal90" + return TRUE + if(getArousal() >= (max_arousal / 100) * 80)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal80" + return TRUE + if(getArousal() >= (max_arousal / 100) * 70)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal70" + return TRUE + if(getArousal() >= (max_arousal / 100) * 60)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal60" + return TRUE + if(getArousal() >= (max_arousal / 100) * 50)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal50" + return TRUE + if(getArousal() >= (max_arousal / 100) * 40)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal40" + return TRUE + if(getArousal() >= (max_arousal / 100) * 30)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal30" + return TRUE + if(getArousal() >= (max_arousal / 100) * 20)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + if(getArousal() >= (max_arousal / 100) * 10)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return TRUE + else + hud_used.arousal.icon_state = "arousal0" + +//GS13 Port - Arousal menu +/atom/movable/screen/arousal + name = "arousal" + icon_state = "arousal0" + icon = 'icons/obj/genitals/hud.dmi' + screen_loc = ui_arousal + +/atom/movable/screen/arousal/Click() + if(!isliving(usr)) + return FALSE + if(isobserver(usr)) + return + var/mob/living/M = usr + if(M.canbearoused) + ui_interact(usr) /mob/living/carbon/human/proc/adjust_arousal(strength, cause = "manual toggle", aphro = FALSE,maso = FALSE) // returns all genitals that were adjust var/list/obj/item/organ/genital/genit_list = list() @@ -63,207 +240,564 @@ if(!. && !silent) to_chat(H, "Your [name] is unable to produce it's own fluids, it's missing the organs for it.") -/mob/living/carbon/human/proc/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/G, spill = TRUE) - if(!G) - return - if(!target || !R) - return - var/turfing = isturf(target) - G.generate_fluid(R) - log_message("Climaxed using [G] with [target]", LOG_EMOTE) - if(spill && R.total_volume >= 5) - R.reaction(turfing ? target : target.loc, TOUCH, 1, 0) - if(!turfing) - R.trans_to(target, R.total_volume * (spill ? G.fluid_transfer_factor : 1), log = TRUE) - G.last_orgasmed = world.time - R.clear_reagents() +//GS13 Port +/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" + set category = "IC" + if(canbearoused && !restrained() && !stat) + if(mb_cd_timer <= world.time) + //start the cooldown even if it fails + mb_cd_timer = world.time + mb_cd_length + if(getArousal() >= ((max_arousal / 100) * 33))//33% arousal or greater required + src.visible_message("[src] starts masturbating!", \ + "You start masturbating.") + if(do_after(src, 30, target = src)) + src.visible_message("[src] relieves [p_them()]self!", \ + "You have relieved yourself.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + setArousal(min_arousal) + else + to_chat(src, "You aren't aroused enough for that.") -/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes - var/datum/reagents/fluid_source = G.climaxable(src, TRUE) - if(!fluid_source) - to_chat(src,"Your [G.name] cannot cum.") - return - if(mb_time) //as long as it's not instant, give a warning - to_chat(src,"You feel yourself about to orgasm.") - if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE)) - return - to_chat(src,"You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].") - do_climax(fluid_source, loc, G) -/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30) //Used for climaxing with any living thing - var/datum/reagents/fluid_source = G.climaxable(src) - if(!fluid_source) - return - if(mb_time) //Skip warning if this is an instant climax. - to_chat(src,"You're about to climax with [L]!") - to_chat(L,"[src] is about to climax with you!") - if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE)) +//These are various procs that we'll use later, split up for readability instead of having one, huge proc. +//For all of these, we assume the arguments given are proper and have been checked beforehand. +/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral + var/total_fluids = 0 + var/datum/reagents/fluid_source = null + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") return - if(spillage) - to_chat(src,"You orgasm with [L], spilling out of them, using your [G.name].") - to_chat(L,"[src] climaxes with you, overflowing and spilling, using [p_their()] [G.name]!") - else //knots and other non-spilling orgasms - to_chat(src,"You climax with [L], your [G.name] spilling nothing.") - to_chat(L,"[src] climaxes with you, [p_their()] [G.name] spilling nothing!") - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - do_climax(fluid_source, spillage ? loc : L, G, spillage) + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + if(mb_time) + src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].", \ + "You start to [G.masturbation_verb] your [G.name].") + + 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("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ + "You have relieved yourself.") + + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) + setArousal(min_arousal) + + +/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30, spillage = TRUE) //This is used for forced orgasms and other hands-free climaxes + var/total_fluids = 0 + var/datum/reagents/fluid_source = null + var/unable_to_come = FALSE + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + total_fluids = fluid_source.total_volume + else + if(!G.linked_organ) + unable_to_come = TRUE + else + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + + if(unable_to_come) + src.visible_message("[src] shudders, their [G.name] unable to cum.", \ + "Your [G.name] cannot cum, giving no relief.", \ + "Your [G.name] cannot cum, giving no relief.") + else + total_fluids = fluid_source.total_volume + if(mb_time) //as long as it's not instant, give a warning + src.visible_message("[src] looks like they're about to cum.", \ + "You feel yourself about to orgasm.", \ + "You feel yourself about to orgasm.") + if(do_after(src, mb_time, target = src)) + if(spillage) + if(total_fluids > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + + fluid_source.clear_reagents() + src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], with [p_their()] [G.name]!", \ + "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \ + "You climax using your [G.name].") + else //Else from spillage check, also note subtle text change + src.visible_message("[src] orgasms with [p_their()] [G.name]!", \ + "You climax with your [G.name].", \ + "You climax using your [G.name].") + + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(G.can_climax) + setArousal(min_arousal) + + +/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE,remote = FALSE, mb_time = 30) //Used for climaxing with any living thing + var/total_fluids = 0 + var/datum/reagents/fluid_source = null + + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + fluid_source = G.linked_organ.reagents + total_fluids = fluid_source.total_volume + + if(mb_time && !remote) //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 something!") + if(remote) + src.visible_message("[src] is about to climax with someone!", \ + "You're about 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! + 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) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + 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) + + 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() + + setArousal(min_arousal) + if(G.can_climax) + setArousal(min_arousal) + + if(spillage && !cover) + if(do_after(src, mb_time, target = src)) + if(!in_range(src, L) && !remote) + return + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = L + if(H) + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \ + "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \ + "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].") + 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) + setArousal(min_arousal) + + else //knots, portal fleshlights, and other non-spilling orgasms + if(!cover) + if(!remote && !in_range(src, L)) + return + if(do_after(src, mb_time, target = src)) + + if(!spillage) //hyper inflation + var/obj/item/organ/genital/belly/B = L.getorganslot("belly") + if(B) + if(B.inflatable && total_fluids > 80) //requires a big cumshot to expand. + if(B.size < 3) + B.size += 1 + to_chat(L, "You feel your belly expand.") + else + to_chat(L, "You feel your belly strain.") + + var/obj/item/organ/genital/penis/P = G + fluid_source.trans_to(L, total_fluids) + total_fluids = 0 + if(!remote) + src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ + "You ejaculate with [L], your [G.name] spilling nothing.", \ + "You have climaxed inside someone, your [G.name] spilling nothing.") + else + src.visible_message("[src] climaxes with someone, using [p_their()] [G.name]!", \ + "You ejaculate with someone, using your [G.name].", \ + "You have climaxed inside someone, using your [G.name].") + to_chat(L, "You feel someone ejaculate inside you.") + + 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) + setArousal(min_arousal) + + //Hyper - antag code + /*if(src.mind.special_role == ROLE_LEWD_TRAITOR) + for(var/datum/objective/obj in src.mind.objectives) + if (L.mind == obj.target) + L.mind.sexed = TRUE //sexed + to_chat(src, "You feel deep satisfaction with yourself.") + */ + //Hyper - impreg + // if(impreg) + // //Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment. + // if(prob(L.impregchance)) + // var/obj/item/organ/genital/womb/W = L.getorganslot("womb") + // if(W) //check if they have a womb. + // if (L.breedable == 1 && W.pregnant == 0) //Dont get pregnant again, if you are pregnant. + // log_game("Debug: [L] has been impregnated by [src]") + // to_chat(L, "You feel your hormones change, and a motherly instinct take over.") //leting them know magic has happened. + // W.pregnant = 1 + // if (HAS_TRAIT(L, TRAIT_HEAT)) + // SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "heat", /datum/mood_event/heat) //well done you perv. + // REMOVE_TRAIT(L, TRAIT_HEAT, ROUNDSTART_TRAIT) //take the heat away, you satisfied it! + + // //Make breasts produce quicker. + // var/obj/item/organ/genital/breasts/B = L.getorganslot("breasts") + // if (B.fluid_mult < 0.5 && B) + // B.fluid_mult = 0.5 + /mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender - var/datum/reagents/fluid_source = G.climaxable(src) - if(!fluid_source) - return - if(mb_time) - to_chat(src,"You start to [G.masturbation_verb] your [G.name] over [container].") - if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE)) - return - to_chat(src,"You used your [G.name] to fill [container].") - message_admins("[ADMIN_LOOKUPFLW(src)] used their [G.name] to fill [container].") - log_consent("[key_name(src)] used their [G.name] to fill [container].") - do_climax(fluid_source, container, G, FALSE) + var/total_fluids = 0 + var/datum/reagents/fluid_source = null -/mob/living/carbon/human/proc/pick_climax_genitals(silent = FALSE) - var/list/genitals_list + if(G.producing) //Can it produce its own fluids, such as breasts? + fluid_source = G.reagents + else + if(!G.linked_organ) + to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") + return + 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 + + 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].", \ + "You start to [G.masturbation_verb] your [G.name] over something.") + if(do_after(src, mb_time, target = src) && in_range(src, container)) + fluid_source.trans_to(container, total_fluids) + src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \ + "You used your [G.name] and fill [container] with a total of [total_fluids]u's.", \ + "You have relieved some pressure.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + container.add_cum_overlay() //your aim is bad... + if(G.can_climax) + setArousal(min_arousal) + + +/mob/living/carbon/human/proc/pick_masturbate_genitals() + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() var/list/worn_stuff = get_equipped_items() for(var/obj/item/organ/genital/G in internal_organs) - if((G.genital_flags & CAN_CLIMAX_WITH) && G.is_exposed(worn_stuff)) //filter out what you can't masturbate with - LAZYADD(genitals_list, G) - if(LAZYLEN(genitals_list)) - var/obj/item/organ/genital/ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list + if(G.genital_flags & CAN_MASTURBATE_WITH) //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) + ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list return ret_organ - else if(!silent) - to_chat(src, "You cannot climax without available genitals.") + return null //error stuff -/mob/living/carbon/human/proc/pick_partner(silent = FALSE) +/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) //used for targeting others + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in T.internal_organs) + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G + if(genitals_list.len) + ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list + return ret_organ + return null //error stuff + +/mob/living/carbon/human/proc/pick_climax_genitals() + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in 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) + ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list + return ret_organ + return null //error stuff + +/mob/living/carbon/human/proc/pick_partner_overide() //used for cumming on people without genitals exposed var/list/partners = list() - if(pulling) - partners += pulling - if(pulledby) - partners += pulledby + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby //Now we got both of them, let's check if they're proper - for(var/mob/living/L in partners) - if(!L.client || !L.mind) // can't consent, not a partner - partners -= L - if(iscarbon(L)) - var/mob/living/carbon/C = L - if(!C.exposed_genitals.len && !C.is_groin_exposed() && !C.is_chest_exposed() && C.is_mouth_covered()) //Nothing through_clothing, no proper partner. - partners -= C + for(var/I in partners) + if(isliving(I)) + else + partners -= I //No fucking objects //NOW the list should only contain correct partners if(!partners.len) - if(!silent) - to_chat(src, "You cannot do this alone.") - return //No one left. - var/mob/living/target = input(src, "With whom?", "Sexual partner", null) as null|anything in partners //pick one, default to null - if(target && in_range(src, target)) - to_chat(src,"Waiting for consent...") - var/consenting = input(target, "Do you want [src] to climax with you?","Climax mechanics","No") in list("Yes","No") - if(consenting == "Yes") - return target - else - message_admins("[ADMIN_LOOKUPFLW(src)] tried to climax with [target], but [target] did not consent.") - log_consent("[key_name(src)] tried to climax with [target], but [target] did not consent.") + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null -/mob/living/carbon/human/proc/pick_climax_container(silent = FALSE) +/mob/living/carbon/human/proc/pick_partner() + var/list/partners = list() + if(src.pulling) + partners += src.pulling //Yes, even objects for now + if(src.pulledby) + partners += src.pulledby + //Now we got both of them, let's check if they're proper + for(var/I in partners) + if(isliving(I)) + if(iscarbon(I)) + var/mob/living/carbon/C = I + if(!C.exposed_genitals.len) //Nothing through_clothing + if(!C.is_groin_exposed()) //No pants undone + if(!C.is_chest_exposed()) //No chest exposed + partners -= I //Then not proper, remove them + else + partners -= I //No fucking objects + //NOW the list should only contain correct partners + if(!partners.len) + return null //No one left. + return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null + +/mob/living/carbon/human/proc/pick_climax_container() + var/obj/item/reagent_containers/SC = null var/list/containers_list = list() - for(var/obj/item/reagent_containers/C in held_items) - if(C.is_open_container() || istype(C, /obj/item/reagent_containers/food/snacks)) - containers_list += C - for(var/obj/item/reagent_containers/C in range(1, src)) - if((C.is_open_container() || istype(C, /obj/item/reagent_containers/food/snacks)) && CanReach(C)) - containers_list += C + for(var/obj/item/reagent_containers/container in held_items) + if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks)) + containers_list += container if(containers_list.len) - var/obj/item/reagent_containers/SC = input(src, "Into or onto what?(Cancel for nowhere)", null) as null|obj in containers_list - if(SC && CanReach(SC)) - return SC - else if(!silent) - to_chat(src, "You cannot do this without an appropriate container.") + SC = input(src, "Into or onto what?(Cancel for nowhere)", null) as null|obj in containers_list + if(SC) + if(in_range(src, SC)) + return SC + return null //If nothing correct, give null. -/mob/living/carbon/human/proc/available_rosie_palms(silent = FALSE, list/whitelist_typepaths = list(/obj/item/dildo)) - if(restrained(TRUE)) //TRUE ignores grabs - if(!silent) - to_chat(src, "You can't do that while restrained!") - return FALSE - if(!get_num_arms() || !get_empty_held_indexes()) - if(whitelist_typepaths) - if(!islist(whitelist_typepaths)) - whitelist_typepaths = list(whitelist_typepaths) - for(var/path in whitelist_typepaths) - if(is_holding_item_of_type(path)) - return TRUE - if(!silent) - to_chat(src, "You need at least one free arm.") - return FALSE - return TRUE //Here's the main proc itself -/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints - set waitfor = FALSE +/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") return + mb_cd_timer = (world.time + mb_cd_length) - if(!client?.prefs.arousable || !has_dna()) - return - if(stat == DEAD) - if(!forced_climax) + + if(canbearoused && has_dna()) + if(stat==2) to_chat(src, "You can't do that while dead!") - return - if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks - log_message("was forced to climax by [cause]",LOG_EMOTE) - for(var/obj/item/organ/genital/G in internal_organs) - if(!(G.genital_flags & CAN_CLIMAX_WITH)) //Skip things like wombs and testicles - continue - mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms - //Now all genitals that could climax, have. - //Since this was a forced climax, we do not need to continue with the other stuff - mb_cd_timer = world.time + mb_cd_length - return - //If we get here, then this is not a forced climax and we gotta check a few things. + return + if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + for(var/obj/item/organ/O in internal_organs) + if(istype(O, /obj/item/organ/genital)) + var/obj/item/organ/genital/G = O + if(!G.can_climax) //Skip things like wombs and testicles + continue + var/mob/living/partner + var/check_target + var/list/worn_stuff = get_equipped_items() - if(stat == UNCONSCIOUS) //No sleep-masturbation, you're unconscious. - to_chat(src, "You must be conscious to do that!") - return + if(G.is_exposed(worn_stuff)) + if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick + if(isliving(src.pulling)) //Don't fuck objects + check_target = src.pulling + if(src.pulledby && !check_target) //prioritise pulled over pulledby + if(isliving(src.pulledby)) + check_target = src.pulledby + //Now we should have a partner, or else we have to come alone + if(check_target) + if(iscarbon(check_target)) //carbons can have clothes + var/mob/living/carbon/C = check_target + if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough? + partner = C + else //A cat is fine too + partner = check_target + if(partner) //Did they pass the clothing checks? + mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced + continue //You've climaxed once with this organ, continue on + //not exposed OR if no partner was found while exposed, climax alone + mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms + //Now all genitals that could climax, have. + //Since this was a forced climax, we do not need to continue with the other stuff + return + //If we get here, then this is not a forced climax and we gotta check a few things. - //Ok, now we check what they want to do. - var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in list("Climax alone","Climax with partner", "Fill container") - if(!choice) - return + if(stat==1) //No sleep-masturbation, you're unconscious. + to_chat(src, "You must be conscious to do that!") + return + if(getArousal() < 33) //flat number instead of percentage + to_chat(src, "You aren't aroused enough for that!") + return - switch(choice) - if("Climax alone") - if(!available_rosie_palms()) - return - var/obj/item/organ/genital/picked_organ = pick_climax_genitals() - if(picked_organ && available_rosie_palms(TRUE)) - mob_climax_outside(picked_organ) - if("Climax with partner") - //We need no hands, we can be restrained and so on, so let's pick an organ - var/obj/item/organ/genital/picked_organ = pick_climax_genitals() - if(picked_organ) - var/mob/living/partner = pick_partner() //Get someone - if(partner) - var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as null|anything in list("Yes", "No") - if(spillage && in_range(src, partner)) - mob_climax_partner(picked_organ, partner, spillage == "Yes" ? TRUE : FALSE) - if("Fill container") - //We'll need hands and no restraints. - if(!available_rosie_palms(FALSE, /obj/item/reagent_containers)) - return - //We got hands, let's pick an organ - var/obj/item/organ/genital/picked_organ - 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 && available_rosie_palms(TRUE, /obj/item/reagent_containers)) - mob_fill_container(picked_organ, fluid_container) - mb_cd_timer = world.time + mb_cd_length + //Ok, now we check what they want to do. + var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container") + + switch(choice) + + if("Masturbate") + 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 + picked_organ = pick_masturbate_genitals() + if(picked_organ) + mob_masturbate(picked_organ) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot masturbate without choosing genitals.") + return + + if("Climax alone") + 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 + picked_organ = pick_climax_genitals() + if(picked_organ) + 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 + + if("Climax with partner") + //We need no hands, we can be restrained and so on, so let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner() //Get someone + if(partner) + var/obj/item/organ/genital/penis/P = picked_organ + /*GS13 Port - De we need breeding? + if(partner.breedable == 1 && picked_organ.name == "penis") + var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No") + if(impreg == "Yes") //If we are impregging + 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 + 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, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote + return + + else //If we arent impregging + 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, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + return + */ + 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, FALSE, FALSE) + else + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) + return + + 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 + if("Climax over partner") + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner_overide() //Get your partner, clothed or not. + if(partner) + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") + + if("Fill container") + //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 + 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 + else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled + return //Just end it in that case. -/mob/living/carbon/human/verb/climax_verb() - set category = "IC" - set name = "Climax" - set desc = "Lets you choose a couple ways to ejaculate." - mob_climax() diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index e4b9f4107c..bfd807d3b6 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -9,6 +9,7 @@ var/orgasm_verb = "cumming" //present continous var/arousal_verb = "You feel aroused" var/unarousal_verb = "You no longer feel aroused" + var/can_climax = FALSE var/fluid_transfer_factor = 0 //How much would a partner get in them if they climax using this? var/size = 2 //can vary between num or text, just used in icon_state strings var/datum/reagent/fluid_id = null @@ -16,11 +17,22 @@ var/fluid_efficiency = 1 var/fluid_rate = CUM_RATE var/fluid_mult = 1 + var/producing = FALSE var/last_orgasmed = 0 - var/aroused_state = FALSE //Boolean used in icon_state strings + var/aroused_state = FALSE //Boolean used in icon_state strings + var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons. var/obj/item/organ/genital/linked_organ var/linked_organ_slot //used for linking an apparatus' organ to its other half on update_link(). var/layer_index = GENITAL_LAYER_INDEX //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in. + var/through_clothes = FALSE + var/internal = FALSE + var/hidden = FALSE + var/colourtint = "" + var/mode = "clothes" + var/obj/item/equipment //for fun stuff that goes on the gentials/maybe rings down the line + var/dontlist = FALSE + var/nochange = FALSE //stops people changing visablity. + /obj/item/organ/genital/Initialize(mapload, do_update = TRUE) . = ..() diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index d7a8c67adb..69020da4f3 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -11,9 +11,11 @@ size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE + producing = TRUE shape = DEF_BREASTS_SHAPE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN masturbation_verb = "massage" + can_climax = TRUE arousal_verb = "Your breasts start feeling sensitive" unarousal_verb = "Your breasts no longer feel sensitive" orgasm_verb = "leaking" diff --git a/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index e1025094c3..6aee84de3c 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -6,11 +6,13 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_PENIS masturbation_verb = "stroke" + can_climax = TRUE arousal_verb = "You pop a boner" unarousal_verb = "Your boner goes down" genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN|GENITAL_CAN_TAUR linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 + producing = TRUE shape = DEF_COCK_SHAPE size = 2 //arbitrary value derived from length and diameter for sprites. layer_index = PENIS_LAYER_INDEX diff --git a/code/modules/arousal/organs/testicles.dm b/code/modules/arousal/organs/testicles.dm index bfb5c99a55..57f16be9b8 100644 --- a/code/modules/arousal/organs/testicles.dm +++ b/code/modules/arousal/organs/testicles.dm @@ -14,6 +14,7 @@ shape = DEF_BALLS_SHAPE fluid_id = /datum/reagent/consumable/semen masturbation_verb = "massage" + can_climax = TRUE layer_index = TESTICLES_LAYER_INDEX /obj/item/organ/genital/testicles/generate_fluid() diff --git a/code/modules/arousal/organs/vagina.dm b/code/modules/arousal/organs/vagina.dm index 5c8bbeea98..aaeb0fdf99 100644 --- a/code/modules/arousal/organs/vagina.dm +++ b/code/modules/arousal/organs/vagina.dm @@ -9,6 +9,7 @@ shape = DEF_VAGINA_SHAPE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|GENITAL_UNDIES_HIDDEN masturbation_verb = "finger" + can_climax = TRUE arousal_verb = "You feel wetness on your crotch" unarousal_verb = "You no longer feel wet" fluid_transfer_factor = 0.1 //Yes, some amount is exposed to you, go get your AIDS diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 6723d2d4a6..5a9d3971cb 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -66,6 +66,9 @@ var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + //GS13 Port - Arousal + var/cumdrip_rate = 0 //how long are we dripping jizz for? + var/name_override //For temporary visible name changes var/genital_override = FALSE //Force genitals on things incase of chems diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 9b8daf0384..a209aca017 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -546,6 +546,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) + //GS13 Port - Add back arousal + if(NOAROUSAL in species_traits) + C.canbearoused = FALSE + else + if(C.client) + C.canbearoused = C.client?.prefs?.arousable + /datum/species/proc/update_species_slowdown(mob/living/carbon/human/H) H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index c881d29cba..5f079e9213 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -3,7 +3,7 @@ //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) +/atom/movable/screen/arousal/ui_interact(mob/user) . = ..() var/dat = {"Genitals

"} @@ -65,22 +65,13 @@ 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 [U.pulling] ([clamp(U.impregchance,0,100)]%)" - dat += "(Climax inside another person, and attempt to knock them up.)
" else dat += "Climax over" dat += "(Requires a partner)
" dat += "Climax with" dat += "(Requires a partner)
" - //old code needs to be cleaned - if(P) - if(P.condom == 1) - dat += "Remove condom (penis)
" - if(P.sounding == 1) - dat += "Remove sounding rod (penis)
" + for(var/obj/item/organ/genital/G in U.internal_organs) if(G.equipment) //they have equipment dat += "Remove [G.equipment.name] ([G.name])
" @@ -94,7 +85,6 @@ 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() @@ -102,7 +92,7 @@ -/obj/screen/arousal/Topic(href, href_list) +/atom/movable/screen/arousal/Topic(href, href_list) . = ..() //Sanity checks. if(..()) return @@ -150,7 +140,7 @@ T.toggle_visibility(picked_visibility) if(href_list["masturbate"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.solomasturbate() return else @@ -158,7 +148,7 @@ return if(href_list["container"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.cumcontainer() return else @@ -166,7 +156,7 @@ return if(href_list["clothesplosion"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //Requires 33% arousal. H.clothesplosion() return else @@ -174,7 +164,7 @@ return if(href_list["climax"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxalone(FALSE) return else @@ -182,7 +172,7 @@ return if(href_list["climaxover"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxover(usr.pulling) return else @@ -190,7 +180,7 @@ return if(href_list["climaxwith"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxwith(usr.pulling) return else @@ -198,7 +188,7 @@ return if(href_list["impreg"]) - if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + if (H.arousal >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.impregwith(usr.pulling) return else @@ -248,13 +238,6 @@ else to_chat(usr, "Your belly is already at the maximum size! ") - - if(href_list["removecondom"]) - H.menuremovecondom() - - if(href_list["removesound"]) - H.menuremovesounding() - if(href_list["removeequipmentpenis"]) var/obj/item/organ/genital/penis/O = usr.getorganslot("penis") var/obj/item/I = O.equipment @@ -302,7 +285,7 @@ src.ui_interact(usr) -obj/screen/arousal/proc/kiss() +/atom/movable/screen/arousal/proc/kiss() if(usr.restrained(TRUE)) to_chat(usr, "You can't do that while restrained!") return @@ -310,7 +293,7 @@ obj/screen/arousal/proc/kiss() if (H) H.kisstarget(H.pulling) -obj/screen/arousal/proc/feed() +/atom/movable/screen/arousal/proc/feed() if(usr.restrained(TRUE)) to_chat(usr, "You can't do that while restrained!") return @@ -318,7 +301,7 @@ obj/screen/arousal/proc/feed() if (H) H.genitalfeed(H.pulling) -obj/screen/arousal/proc/feedfrom() +/atom/movable/screen/arousal/proc/feedfrom() if(usr.restrained(TRUE)) to_chat(usr, "You can't do that while restrained!") return @@ -326,7 +309,7 @@ obj/screen/arousal/proc/feedfrom() if (H) H.genitalfeedfrom(H.pulling) -obj/screen/arousal/proc/feedyourself() +/atom/movable/screen/arousal/proc/feedyourself() if(usr.restrained(TRUE)) to_chat(usr, "You can't do that while restrained!") return @@ -334,47 +317,6 @@ obj/screen/arousal/proc/feedyourself() if (H) H.genitalfeedyourself() - -/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!") @@ -439,8 +381,7 @@ obj/screen/arousal/proc/feedyourself() 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") + 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 @@ -464,12 +405,6 @@ obj/screen/arousal/proc/feedyourself() 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.") @@ -494,6 +429,7 @@ obj/screen/arousal/proc/feedyourself() /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. @@ -504,13 +440,6 @@ obj/screen/arousal/proc/feedyourself() 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") @@ -524,6 +453,8 @@ obj/screen/arousal/proc/feedyourself() 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. @@ -580,14 +511,6 @@ obj/screen/arousal/proc/feedyourself() 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.name == "penis")//if the select organ is a penis - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(P.condom) //if the penis is condomed - to_chat(src, "You cannot feed someone when there is a condom over your [picked_organ.name].") - return - if(P.sounding) //if the penis is sounded - to_chat(src, "You cannot feed someone when there is a rod inside your [picked_organ.name].") - return if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else @@ -605,7 +528,7 @@ obj/screen/arousal/proc/feedyourself() "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) - setArousalLoss(min_arousal) + 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.") @@ -633,14 +556,6 @@ obj/screen/arousal/proc/feedyourself() if(picked_organ) //Good, got an organ, time to pick a container - if(picked_organ.name == "penis")//if the select organ is a penis - var/obj/item/organ/genital/penis/P = L.getorganslot("penis") - if(P.condom) //if the penis is condomed - to_chat(src, "You cannot feed from [picked_organ.name] when there is a condom over it.") - return - if(P.sounding) //if the penis is sounded - to_chat(src, "You cannot feed from [picked_organ.name] when there is a rod inside it.") - return if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else @@ -658,7 +573,7 @@ obj/screen/arousal/proc/feedyourself() "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.setArousalLoss(min_arousal) + 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.") @@ -672,14 +587,6 @@ obj/screen/arousal/proc/feedyourself() 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.name == "penis")//if the select organ is a penis - var/obj/item/organ/genital/penis/P = src.getorganslot("penis") - if(P.condom) //if the penis is condomed - to_chat(src, "You cannot feed yourself when there is a condom over your [picked_organ.name].") - return - if(P.sounding) //if the penis is sounded - to_chat(src, "You cannot feed yourself when there is a rod inside your [picked_organ.name].") - return if(picked_organ.producing) //Can it produce its own fluids, such as breasts? fluid_source = picked_organ.reagents else @@ -697,7 +604,7 @@ obj/screen/arousal/proc/feedyourself() "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) - setArousalLoss(min_arousal) + 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.") diff --git a/hyperstation/code/modules/resize/resizing.dm b/hyperstation/code/modules/resize/resizing.dm index 3d6a7859aa..20c2d834d6 100644 --- a/hyperstation/code/modules/resize/resizing.dm +++ b/hyperstation/code/modules/resize/resizing.dm @@ -214,12 +214,12 @@ /* if(HAS_TRAIT(src, TRAIT_MICROPHILE)) src.adjust_arousal(8) - if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna()) + if (src.getArousal() >= 100 && ishuman(tmob) && tmob.has_dna()) src.mob_climax(forced_climax=TRUE) if(HAS_TRAIT(tmob, TRAIT_MACROPHILE)) tmob.adjust_arousal(10) - if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna()) + if (tmob.getArousal() >= 100 && ishuman(tmob) && tmob.has_dna()) tmob.mob_climax(forced_climax=TRUE) return TRUE @@ -244,12 +244,12 @@ /* if(HAS_TRAIT(src, TRAIT_MICROPHILE)) src.adjust_arousal((get_effective_size()/tmob.get_effective_size()*3)) - if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna()) + if (src.getArousal() >= 100 && ishuman(tmob) && tmob.has_dna()) src.mob_climax(forced_climax=TRUE) if(HAS_TRAIT(tmob, TRAIT_MACROPHILE)) tmob.adjust_arousal((get_effective_size()/tmob.get_effective_size()*3)) - if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna()) + if (tmob.getArousal() >= 100 && ishuman(tmob) && tmob.has_dna()) tmob.mob_climax(forced_climax=TRUE) commenting out for now */ diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm index 663f5beac5..cf30e23be2 100644 --- a/hyperstation/code/obj/condom.dm +++ b/hyperstation/code/obj/condom.dm @@ -125,4 +125,4 @@ obj/item/condom/update_icon() C.update_icon() to_chat(src, "The condom bubbles outwards and fills with your cum.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousalLoss(0) + setArousal(0) diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 413267713e..37e4574d58 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -11,7 +11,7 @@ item_state = "fleshlight" w_class = WEIGHT_CLASS_SMALL var/sleevecolor = "#ffcbd4" //pink - price = 8 + custom_price = PRICE_CHEAP var/mutable_appearance/sleeve var/inuse = 0 @@ -62,8 +62,8 @@ C.emote("moan") C.do_jitter_animation() - C.adjust_arousal(20) //make the target more aroused. - if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + C.adjustArousal(20) //make the target more aroused. + if (C.getArousal() >= 100 && ishuman(C) && C.has_dna()) C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge. return @@ -88,7 +88,7 @@ var/partnercolor = "#ffcbd4" var/partnerbase = "normal" var/partnerorgan = "portal_vag" - price = 20 + custom_price = PRICE_EXPENSIVE var/mutable_appearance/sleeve var/mutable_appearance/organ var/inuse = 0 @@ -161,26 +161,24 @@ C.emote("moan") if(prob(30)) //30% chance to make your partner moan. M.emote("moan") - C.adjust_arousal(20) - M.adjust_arousal(20) + C.adjustArousal(20) + M.adjustArousal(20) M.do_jitter_animation() //make your partner shake too! - if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ + if (M.getArousal() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill M.mob_climax_outside(G, spillage = TRUE) else M.mob_climax_outside(G, spillage = FALSE) - if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) + if (C.getArousal() >= 100 && ishuman(C) && C.has_dna()) var/mob/living/carbon/human/O = C - if( (P.condom == 1) || (P.sounding == 1)) //If coundomed and/or sounded, do not fire impreg chance + //Else, fire impreg chance + if(G.name == "vagina") //no more spontaneous impregnations through the butt! + O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) + else O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) - else //Else, fire impreg chance - if(G.name == "vagina") //no more spontaneous impregnations through the butt! - O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) - else - O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) if(option == "Lick") to_chat(M, "You feel a tongue lick you through the portal against your [G.name].") @@ -317,7 +315,7 @@ icon = 'hyperstation/icons/obj/fleshlight.dmi' desc = "A small silver box with Silver Love Co embossed." icon_state = "box" - price = 15 + custom_price = PRICE_NORMAL // portal fleshlight box /obj/item/storage/box/portallight/PopulateContents() @@ -372,7 +370,7 @@ // C.do_jitter_animation() // C.adjust_arousal(20) //make the target more aroused. -// if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) +// if (C.getArousal() >= 100 && ishuman(C) && C.has_dna()) // C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge. // return diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm index 91aeeb47e4..5f6b7d5fd5 100644 --- a/hyperstation/code/obj/vibrator.dm +++ b/hyperstation/code/obj/vibrator.dm @@ -132,13 +132,13 @@ Code: if(2) //med, can make you cum to_chat(U, "You feel intense pleasure surge through your [G.name]") U.do_jitter_animation() - if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + if (U.getArousal() >= 100 && ishuman(U) && U.has_dna()) U.mob_climax(forced_climax=TRUE) if(3) //high, makes you stun to_chat(U, "You feel overpowering pleasure surge through your [G.name]") U.Jitter(3) U.Stun(30) - if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + if (U.getArousal() >= 100 && ishuman(U) && U.has_dna()) U.mob_climax(forced_climax=TRUE) if(prob(50)) U.emote("moan") diff --git a/modular_citadel/code/modules/mob/living/carbon/human/life.dm b/modular_citadel/code/modules/mob/living/carbon/human/life.dm new file mode 100644 index 0000000000..ff7cc569a7 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/carbon/human/life.dm @@ -0,0 +1,6 @@ +//GS13 Port - arousal +/mob/living/carbon/human/Life() + //citadel code + if(stat != DEAD) + handle_arousal() + . = ..() diff --git a/sound/lewd/champ_fingering.ogg b/sound/lewd/champ_fingering.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7e540c970378dda4d8a91f7c70b6d3dc4d23e269 GIT binary patch literal 25107 zcmce;dsrLSoiIEj4PwAT83`c|7`u`XSYVNrxK&`%)s3qK5f>2|$E_r=4KmJx!PIG+ z_Z312-Hf@}m9gvvfn^Zjm26};anltbVSJ;;fI~?A6<-=(Vt1W3?Y^65yWe+kl5Tgu z=Xu}f`{z51&YUxI&Y3yC^Shtl@b-ZN6%YaXHoa@A5^WR*FV{E1+u+uJIIOL2-nc-J zO>CSX=+I#J>+>(*w>NtJHEr~SLG5Q3KIy0K{J;Nesvv$d(hkr-Ro__m=G%u4FdOQ% zRjbJOA-u*enENhcX4J+&5CZAB5naQd7wHzV58&Io z4i9G6mkQ4_!>wiO*%32;N~(F!J>@?5-a>LB8nrtNOdApvvO4JH8=2P3GT|WWj6Xcj zI`2FjnKC+Ph)kPjw#(C=jr5h~JR2SE%6ZP6x+B??I(4^LE?B9mx$rS*@6VbSvY$A= z%_3gUg9+Y6LW-@$BX8%c@9!>AoyatON42ut;Qt~%X0u9VVkC_8^2L5Fpnm zIZnS`!G?v{M_?_JZ=4DZp1L#8yii0QIQLEIecI{p$+5fOTI>@iWiD0&+ST732p{`Y z1^Vv3Gw}K7hjdV~^q=1D|FH6#@xDciu^&1Yrn4V_9+tJ!2S1G13rhc1>-_!gh>dIi z9eqS#-88HC+!+J&gD#Sm&T_N*wzV9m^bHE;lSj54>&h=4Ygd%VZa>#zcs+9_1R1f{ zSo~e~8kN7n;*nl!$_?(NTWL3W8`;F{Le3Z7Sxib604(NZ0xUk}|NLz8h3vwE=lu7o zcbw}lFHS!94Ml-PW!83!NwKeq#N;@9Bl$d_ioadBSDar{w=Vw8@#`<+%V>$xsYK!`XF_Q*xJg`wtm!|1o1RInJeX~%F4I?_Y?!} zu4I%fWdOjQfS_1_KcVm;dpWIdx%$Pl$|^w5k$xxWptqkiUUNupl$E+_B3ZxVpTC=J zviGcMBTuDCc7OR+tDV*P7Jf$ZltTh+4}r=ch*ZQb;#~hjuB+fH-mf27a;f^q?`Ir) zQgpW9k4LvbMPD7=R??T-^JFmt2osnBehkSFYX?CugdrQ}{cS~m$n6CkO6V->Nw;O& zucPzMCRt@m8AAgn-S4wObzr+yUY4mDIQ#Te(o&1kJ?43L_es{(v)c!fmMZsxYVA8G zSvLXM^WIJ`8Q5>lxSe5f)z4(4-UijAf$yqsl~r!^l~*V~yzs@$k+&8rm9GD+f_E!C zyMLo`{XjA;Z^>9+J#gTgYTfJVPux#E@+IXdm#2L1Cmmn>#5ML27|P=I99DuV5Vv>a zi$^T3aax{o-@t{)l@-|%s6KyP^=wkcC@We|xxYv&`Q)7E!lqASN>)yMTm9(5rguo- z?O!MT=)lEW8GCN_Vu6@v6|IHZT7Z-@X0VLcauYyg4xy}#`m zAdNrf0?Zxw{C&>#ivXOO-2+M1I~f3gbpuZ<>hzcQnsA;45 z?LW#EGfMg%7xuc}Kl=oL&y!NLfr7c9`%$Wo7h|3gzC--?n`I(M59Z+pjNua%4k~_%8|Y<#-|BdAN9ctdgM_j@Z0S z{~bc<1!h6Wp@}R`PRy{1lN0+llo4eQ}^cs710kzyJc;X!HPYL183uVP8wD#;L z+;hc(IY)DUInXR_Wfzb2+XbJ;1BSSvXaKGVRE{JF8V$e@GmzhNJ0jl@8MQkC8X-W! z_-g>pOJI(P*L*wxC;*h3O}v}00nxXw9zcBqjyLaatN{R```K#M>L|0>Z218XhUkovckX}Gy)siLixN$?RFk&MjQW#B1cq=QdO`cmD?59Tmj@?f{yAqZd8Fbwb2bIC4>zG-;$TL9gj%am?H*Q20q*03?`L$B9b-7 zY}uHF5(S_!g7-`XiXY1A2NPWcP0)>***qNzfIH{zRkx(JlouC``SIa?wh_GNq#r*6 zX4?z8f$7=LjVxE&1zAsOd7!b@?gK*k;3SyxC z1Cwyi_0zs>mk1sN)M(ImXruAahPVgN+sH8RATS>H^^J`IK$RwWePiQ68`W=~_PPWz zqXG>2-3@M{k+$)mjdrhZeDk2!uK^xD1lAMKr5;L1Nez~!U&tjC(9`6i4$}kz-39ze zIsu3ofE;8|<=>Si{rSn?Tzh?E?5|B;SO5Rdc5Q&*yV?JLEWxW`TPXU)=zLoFf!M0J zrbiJtyZbf5)Wd+f0m9%dSTUfmNETT6Qc22Wh*4wg2DrlAKuMe6C}jiMcgq_DbE@18 ztl2O;@g+j077nq-Aw3T1S&&hC5kLVjJ_xSz?zl9i8~(*u-!GrG2e!8a z_t(y!tGxACb|)coS(~^z6!V+)F!hGegVG=P zMjL_jGX&|iMk?05Yo5#J#z!v{osWV<7&~3Y)(Q&cqa>^K8KiD%V|@=w%gDO>=9_~z zq0KE#pR{2H%*bSfD?|iJ=`S8wzMuPmwEZdlL=G@!K|-OUK)1-!o9p&}F3idOfk-0D zFD#aqD#|N?5CjQ>egHweF--Qrsq8Mw@i)4$9%?VGFS?%&)HD&W);8LRAOZmp3`iSw z0^wUzo&5R|v|*}m++F_n4^J~bp4l+fe=+orLuZEkS7%22S3aDY@*Dm3jO)z6x2GxM z>VPS4Ipc~alpmz*T$ahlSB=rO66e|(p>JpAWS4t7CCjAs2}FkuDM_}xNgeLCFi&0- zK+1-!@NnC+<+1d<<@Z92Pj%1ulW}Q9{rXuAU#Op@GTC-%#L;*%Mh`1Bqw$t*{ICO} z@@2VaQ6imy8Q0bN^)f=Sh)O2Cp{7qWAshB6fD2@g3++pM{xfv6B~ERiU`>)DRmHk+ z@E-|dIwi>&BJ}lCCWtnFdP${D>(wDo*`JNS6Fa0}RgLH6-J)*6~WSR;hHnY=bh9XjA@9e4C?j?Dx-K+d#HI#UJ8YzJ|d$|e2v+l z%)@(Fg9sUlNGzFOZrrSv$^RlZ-zBDyZwKOGI31Z@t72(@k<9)Hu)y*kc6_uBw>Ks7$evoL4z<8H|)z(lnn}b^3nSZACaaJXWeaRCRS_I^&R#dKx#uDW<*r74gs8 z^L(Frv(1ju&=jtv1~EjroTd{50~b84r_JWoL%1&N^r&_ zB}$ucAjf46X|G{renW^qNni++)c9*D9<8cDJGzzFl)=yAjpEvOwj`{QH)+Mx+4uaO zHMo*j8f9bGs8Y4&`b(;)AhM*rv|gtk)KQlv991LIkrRKob2vm|w^9qrq6K-pW%~D`q0A&J~fev1(-sz zAq`o8yMnprNH zF5&3$*8-8VZRPZf6{QEEXY%z%n#fDlX#UZ4geliFDU)bJ1m za|%XlMA~>E_6P~YA{e9~8(B0T)&_LMW|K2PkUuYECOoz`OXe&>Rt+LUjLvSDzt96? zX>%5+hZT-c;?0lBkOGkpr3R3Gi0>3Ez%X9W6{KQj7F0m7H>-oOX%y56K|RfoDS!!? zd{SY2b|cBj+TP`)@+F*wHr9dQ#sh=hEJ8u89rQ*ZnJ8XQZG0HO4@2ugoE9#7?Cfru z!vz%4d~6zL0TL4DIHyFtcpcebt!t675u`nTwnc=TDQ2NL$J9*Hbq@6yvkk?}5KcHC z;+(iXvQ*FMFrg{pJkdFrsLvmQ_@hXh$ce#NEDb(WdhQPY#0|tydTwb9vFNRB5e}p` zUv00ar)cjKF`t=h%lTrlh$!1$$JtuZMj{(bTymsKYY57XqvW{0{KRKu*_}2MUz=8# z6UJ?c+^;CIN5svMX@y33=~+u}5Fv8u28-Z?1*#~D3o9gvrR1D5lI{#UM(h)%p-Eef zUCu2#_E#_DwmA}Z=BE)jEl0k3Dtafy%EZjd2w3Sgath0pL(?fLeUX=-EYt_c+Wm)T zN3RkLmvxJuej09E8JwEGLvDL>f^;s=v>$DG3AM(=R48ZOtDfvKRL4gZWQG`w^J>~xrBuuTa|5fuqe8>Oo`NYbbj4e9_%VW_6K8LAhG^C|QpI*^c_;%X~<7Q9& zKvn}I=0L?JRm0_~mJd{0Q}xU$!68!Jc&J&!Goczq?vr^lTodd`pA*vf3$Q_f%njkC zNFli!Clr(>;AY9tT|Ko)w1C$*Vfa{)luSD~a^Z(}hll^^fBXdD;N>am^2!t998U7j z9#Y;gF7_|?h}bi6`4!~_1Pgj_cf(5;V`*x1IGV?>^P|FT8tZV>?0d}_$0kRsmCJ1R z0CUXc(Oxp^^LheW^_t)%W87>=k2!6K!{3bb%INt5CzX~ULm*Lp0E=yk-xi8);*z8R zDZk5{P#TP7bwLV!+n4BkETA=JnjM*a7zc~Z7 z{H}Yjw~cMR5KpU2Q^*!6`VgPbT%OVjQdKXzNbbFxl;bJp=%8V5v25Ap4$EAYy4@?#e-e4S6i4MFa+ry|>i<`@kPmE;PZdrjl8 z*ZX{NCXIMvwLY$Xz;wSQ#XYIX3oT!)&WrL@mjuV^g_)ad$tropvi2SSc(Xz}LAv`r z+UDahj$jxW?sOr@^g{(y(}>Us+-=jC8p-FQj2Rk}P;7*uC-Je@v{d}K2(z}sjQm$- zeIXEVs{X=YG=U``h}0sdA(kE)=8*H4E%Yn9z8^N?*EefK`jhtv3mq_Ay;DD?^{-kd zOrcWgp~@2S&Sh`2?U)j1s;gQ@t1q)6)#P|Mn#3RyvzAkI)d3x|b>Q==%v7f5vJNt8 zW*fb#5YV)AO^nc#>nFG;Sw=EoP5f=0A&iNzT&R8e0gImRMSIL05XofG>(|Xe7!U92 z#CU;dGan9#_*SVJF*M5JsUb*zZHP-sWUF$!%v9PVnNja-BF$$rUFxL1uCbHEOwzA| zolx*&``z(%RBicb?74TQse!vzmw~tI`Eqc7CTGG_-=tI8Vq$DLzK)ctO!@5M=S)-F z^Gc_~?I`{FdP@}+)9{x!m!8D`BsNF2O&X?>r12zr#7Sim*feU|LQev5p^aK&r&5XQ z0ZX%dSWuWGW-Vadf|S0}G)G2`tE}EJn4YZXl5;u+iG6By3Y7B`)!%>c)#747FFWQf zgKE_3CcN+)!1mzk!LTR5r8yp*7g<~-mj+E2xO7Y8EI+8zUW(Elv?^1p#)sUxA%<5F zm|BJR9^!FFS%y4v*`B?Z6M|M5KVtb04cBkrJJ}9I_Y%@=-g!tNn49x3 zqHUf~6|d@sx1vE#9lxEV6&(6=S{QjeE+ysRU|b60>g_JTO|Ct9(WOC7ScCskz8tsfPC&uXhJAvd-^&; zMq}lH0AK&*e4DvxfmxI?=ioqsLK2a75BdGb&n(Ya%4juBFS!-`_lVtpxUv6H*mvhC zB3|WJkI(6^ zP}#73k?A3foPZpspoA@0wsA}@KZJ*9`9*X0N^Lteky@2Dxu%1xA=;VqOa0FZZw9a9w_hpv!m2DyJ z^!aVcRTX)XL*{DvRjnXzGT&U^G}Sg_vaH5uU1Y{r<1B zzv>iG8?;P=HN@Zh_pWd#9uBEdguHDRg6pNPxUe*Mn8{&F07J8C8=dB+In*Kye{5$F z*idv$(wX8klR1EIU97K6Y0uwYpCLN{(TD_y36aQkcsh1n&5uZO-9^dYx+XUNr)z=; zia#2mI~gAZ{J)&Ja%JY9uYBacddWX^^_L%B{nh-GpC7*0#pdK*`L6H}{@FQgLRRal z#^+N7*>9z#^xpNj&3j*XKb^z!cnsUIkVrW@X1;A{Zx4Ab_jOI$h|@xcR;#=k(owfF z&U`J{`q{Ov5-7Nzjgw7QhUmyYsR=JpR55&1R08?!rL$^fwYM##ApJw z6W?AMzzK)D%!N*2yNqst9SfW~P8fWKLXT5CMbP=|=i`x#oRQ;q3c9zwh1vZX^I7|< z=j^_dq)*-Qn+{)Sin?><-W;I9pzc$?d_1otdJB1ctM-B$zdRbYq+MHGOB)T7F1xJO z)X$i1bNxa8>QEIgUsX2Y4jEQ-(f)@{hpOZ>F6dOuuwaRv#kSG}N0Au~6HglC8l)Pq zI4pX*x(S8DSx9aGCbXf7T+)n0#->cqKr`zw!{o)|sc%FJ_-E&PsMMxfr&&mCq>#R5v7=FhdeyT3=vRgG_ngr}{ z32S)C&kL(4Y4*17op|`v39RPtM@4nEM~`bVD@(G+*WM*AE3U4}R@m;_6U=hXHq57j zyeOQnMhSd-=+P@67WE=N#m44SOpP++spwq#sf_%2xQ*Dvp0h~uDsxV>WgiBhC-OTM zklvY*K5}o7R2zt;B`{6)zhv{9&d;U$NFLYluxN9?e}ZcYUP;Uup4gWs;QT6eG4^A2 zdSuvgscm%iV!eM;GqG$)z_zwC$;NdmI<3LjPmDpKV7*Wz+Wr&?D@^(-5mjO> z{yOfzur~GSFEFBh_g1Zjc88+I-SyK|mq#b_lno7G6Rp(yn14J^nF{onxQiam4pVh% zmfBZ+Y|8O4SeDv4j=Lk`M&lTn4GzW&lO|^gzN*&QtAy1nLC81cQS{a3Yhfze1%(nY z2Ac*{7f=EO0`Bi zOPX{hpH<(Ivz<+#1Y(Kovr7+(-tYNi5XfqzpTe+`;*Qh36F&PqcoA$nyQ*eIWjvUTGtPV5EBmbsk9h^#!LADTlUn8eA#12h zGmv!hDVe%U|B6f5h zAA*WT-sAjvG7KtYA4%{XTXD}{#7^wvT2iyJOe}YOCe^=If8f)BBrRZ-bRLC5u~nDs z*`dWrRpZKCWLt=@C|FVm{0!1p)uzOf6;N<2n zpw#XJCeS_2_=(blr(^HYr7s#<|+KbQ#n6mf4p{!HvCE#GYrv@J z+&U8wGQ`*wprKgcu!O+YB4kSfzepZ-E0~c(ke_GDhkG1d&p5}#LmGQwQc*}Ack4sC zLZF5}e>ZXz_d*}98E&O*YF#yJ23%WAF%==5ZTrg=S!Ks6}{lwAQTmB1iAh=?U%hqX>~dVYL1v2^H8TWxpCTwC-L zyONA@3}`%r@pe!n>U0PB!fg z<-ZL4rji$FijjFUX981k*83^elBh2jm6ahN!Ads8X+zVMWr7!KPu@#cXn&;1>agFY z?=td_vJC_R8HGq_fQqV+&gmMjP!Hqmv#1y$lM)9pkw8V@km4;Y;zJN2lK)B;4^$%7 zQCt&`^B;@Ic#SONC_Z1F9OzCL)v8l0g(R(dFrl{=de{H68$n%5KzZ}Ld?G&_Y*bXQ zOgZq=T0uyw75Kz2*tWf7pVX^oX*6MdDt1rCnUu8?48Q77<#HfD^g$>;Arz|BSw}j2Ps>PvPxNh|1#$&(oR6vfq%z$ z6bZ3p>}}K03i`~W#-ju(8)MO#K;suf5}W`LOU;OEUJqPYz)@+!Gib0|fc1%oS&@7_ zYddG5kkps2Xv-Hnir9mY-N)gKGJkyM*th3H{!IDK$tvQOS+92AEH;~eXwr1%GTRj5 z^4#h;!|g@g=z|fy-0N9uvZ_Ou*oL9I-`ju2Vb!eh()PIjQ95_IE_D|O1!}nYD)5R6~Q@)Uv9jZz1|S=cJ$qbKTb=E|W>vAfiH;#zqX{yq26OB3mHof{ZAaWpq)00!?HJnva?Mn||p}+J9lu z+uHWYj$vNKZm+v&$$Z`?%Nme4^*c$hA3mV!)S=K&8qoG zuCX2E5~lek6c#aEe2J_HGO2S(Sd%bU5=dyI1mU*>YQT58U>2=_66}e70z9x!5EOEz ztK)n06uIF>Et_D13MD_Mb9s>QLt$R&Snp=y%)3tZ`O51ycuT9}vU}x%E2YZs^WCQ} zDX!}GdaFb9ox6hAj?0V}S$@y6ZpQetWpAu!bX0wbYl^J$a?ypw{r){7O7g6(tRkrJ zk0)1=FCBaYNq`ms)DR)w=|bTS^eB=?rFRA}hE1yAkwRh>TkA}qJ__g)80?39ZZYQ} zUq~p1FiAiIZQBQYLxG5tFt}YTCXp?0qbWW@5Rs7+C4jhOSvUSO-^6@96xe*z>Lfu8 zzNM-V#de0RnyeCB5l>oym2htgH#PV(eL(X{GKJYz-d$mPJgQ)zYGro=sa0A3r%tj> z?N4CXJkLhEff|s?h}oet>#v{K%0xPtY|4yQAS4$vUBKjL@eI>a{#nQiwI^Uyg!t%7 z6lOuWltCeG@BvlKhx9i;MxCQb(Otb*V+6i?!?v%NY|U%|Y{#O;xr5;Ez%As-%~z`Kd`J zWl%R-owee%s-l#(WYY@T)WV-Eop`=pr;0xWf=BngJrN-x=~?lnLSvJP-l?`A1i7pc zqW~_>1P&s6M)M_3-ZrSx&#GZ~W}Po&2i8#`^r#60Li36PY!+eroTV9(k)rD8DJKp; zEG>}Fw%Lh_uav6s(TTd=ZrP*&x|Qv#V~DSGgw8Z;7kP&FHrYPgk-lkPzW9(&y*UlFNOd#38h82R)BhMI$NJFg5j_&eb7~Y-x6+Gg1K8?FL zl07@I{lApIx*-vCaMhbLsatA@z9o7lc@K5ZmWs$FZ0AdFh+h(3a5Z{Q^$Ml*1w~hL zKIDx%>D_ZiXkB0S01-;xgR-j%#zV=B@rwA81Ac45=#d|P!eY#_%_jr23M#E^-3QIF zR1g(C%A<6KU^0`Y=@%h50XR}cP82ey%LoJ!Q!POCa5rRu1*P+CC=OF0<`X9nL~J!P zuA_*LGEIoR4DG$a9K*kL9dQ2Bb+8d4v9NRH`}C_<{&^#;LBEk1&Ybs$KAfFu@B@c< zq<)ei)tAA5J)N?;=CuQ)EbRqVsypOi%wACC9lPjT#ofmqF2iNE_O}`vy~A14&%qXl zuVXb-IUZFZzpC2m{E2$lv~uTH|MGo#*%nvUk~XBfwAO&P5~bw$;!@shM;_Y_}BZ*~2IZ}=+ ze?ArqUl1M^bvi)Lw{_bJ)>&yL(E&&d}sVdnoAhCS4z#i95b$5#+KgH zQYSuluSB{-+VB*Hl-IW6>B4o>*wvK_XZ0bva_1MZRSN3u`zLeK$4o=5o3wXxct=xo zxm}T+;kZ7}B1FP#USTKAiCXBSzLUvgY=qq8Mp986ziDn_iU_87xQrggFV<6GdR)8s z+9N9cjaPW2MWDU&luqb#ba9>OqApolVXykmScV;JR6?~r2V|{IJE@-63ShdwmN&ir z*;;+)nATTy!$98BI^Z_5+{b{5qw&3$DVJYWucqkKPg7JeO5e1{wco5tZQX9ZJ+1I1 zELd(+tp4A=Wz3T=VdEOL4=4QO{4R1}nroMiqNtu6>XRbzaN>FsLOv-9JOW0PeOle5 zLXQW4aNwhDD76eFVF3}I%i0Lv?@sRun)T7!0~rR(XbVX?heFwp?7)?6C>qAdLyIYK z9}Gd&jDry_KCJ$EsM^4lL#v-W^u*F*It^wuFk!1-de?A9Xl~ujzBJ0ac}tR?vWXhG zj}>|1RP2o#S1L-j2*|UQOH=&OaE3E$QKx@* z2&s@atmKn@o)~`_k8Mr0vW^cp3>u=z#WoFARitX!)_6EmHmS=D^A0|*`!PGqwl>*H z-R*vcWR{E%k5RI0mX#oBVzf;u&vZe26`V$`>9x4hcT(ix^zxmtiNe&b-@6oj^?v zoq?VCm*1~ZmiE1Rh}9_7oX(O{r>!2dws%(ZPFG~)!!}2x_!Xxg z*Gb3{TPSdpd=`R$poOMs-0QD0ILpDKS_%22iS%|?URi%62IiY)9O$+p?d=MO8RH94 zsi+Jk4k2W#OBhdLfdGkoK3`-x+7Hdj=+%;?3@>2)=M^0o+75v
    p=b>m;*xBMY)sE&!v-&chJ(!m5I;;d5g*CO z!nD#tbntak%7nyIGkfb>GD}Rfq!CQ@UDQ3%MHxBjL44S*^FBw3B9G=oD-$e7Q-Oc zlB140(^i+!dn2I7n@j=WMmR@#8xxI-Mw8r%WKKRuoaksFiO;Jew?d18txq%J`qb<= z3%rE(77uHJPztfmLCQ!uQCd@ui?m67P~0&}OU{YnglBpziV6eAxV;);o-VE|jz7O98DCi}=>FkT?~Si}JUfQoS$t>L*Pf3ic1gyE%ZkcW z+_*R^+tNWQiptx!Ukk(92za`Dg#+)uj?hxiOjcJ9prbS%N>0K;zuKGuon(9w(Y{pl zcltBm6+TGaAr;5E==%gjzu=`;dT5#dVk+jdD@$5OR@L}g++`2mI$)|kJP>5m;c>kwlW3wbx~U3o7> ztDW|s2fu!ili1n4_s>gfKNxUGC1j#s9j6^+R9sa?DPw#pFVpksk@Rwl{hrKdnOD4+ zm*%??_w1iBk9xM!qv2%Xos#^99hbk#Ui^p4Rdp{bH|-p8^y?D7y8nBUAWafBmRwiI zpQ873YLUkyM&lHh5dbFD!&iK&=@ky#^1$nEJ}P2LRL~IDa1GFW-j~AMZ8KVpp4Nm? z#A^ESyjL>9w&M@^m_ghmjMu}~4zT|=s6wP7?@`>geGpjl5U!)j)04stQ%n591ty!;sMvl~i=%!j4r>~ZP0n@xZIU|WA z-{*vB2gt(1gnXH^xmFgRefY7HdI0!)^5f0LLo|6#yQHSuJXldD3kYlMdLosU20|`~ zz|I4XBw>vxz9%}3ABH-2 zLnP`BFkyc55;Q80bfUcoG`%zIpHugrK6}E zPH!{BW)KpX$t`hbN)M#9mEOVHnGVN{3{8;jBk*He;`&AwBMjm@Pf^UZR7buw(n~kA zVU|K;TPf6c1CoVPAaXYQ0N4SjL(WLFfI-83l5^z_gpJCF(nsYznpNp)#+qU-1e z>zLV8*CO9X$TvsGQ@Z6z(@;RJ)<&|Qite;=+Dx&Wj#6Td>n;fLIwna(33VAc9UK8E zK+icgyTl<_0}-nsi_oIT}++o?+PWfXtB3@BJpYDbxGN7 zNZp-cj%Cs?-cVW}Qy*)XR*$NUg>@3BJ=cmm;JJP3%wK{QQoMlTZw!QCyl0_2<%kwDZWkfN!ab|i_I4ru^f$T_Yr zX1`7zc`7-+{I(_xVBC1YD^q^|$;tX^LCMnCeT8p4R_j}h=b7@zv!=ZG*+t#=Q$5zv>dDrE=)K+1N%_Ao zeLAmC7|I_l;|UBB6>l4eZ81agQraMvHD@Rb?>eq z-Db_3G*w((yWPm=m6ECc@%y^f_y$cnf9p$+ipMzJR)1-2vWidEV-c7=Ooa?`NylgJ z-c|J6fifW#YWh;ep^#x_JY2w;kujP1Mi5~M)T8$HCK=kv;?KoCA!oCw5LQs@OaLtH z5d=9CmH98o*mq;WsJzK_xP`#QyH;wSD*QgOHeK_hQg53`5Yyv_izv4615m+1G zj%=$0%C|sCUEsw&EM_vrvh!LHfU~Zat7yio1lhqEX zSL^*+AD*`ROipGh#Zu(&dL;_3L!y?~ zq(vBt2rZLXsPoJZr}Ys0vv;*h2W;QI(>1r|ov(WXG9%7s?ouHUk<}zOLCp!il zuB@!tY16PWx}s!h|2vhb%s5Zgc^5;lHK(}>LcV6<8!^YXhyOl>2d-NYuz?11@0rdKMxcn&XEkH_#QfkDWfK88q5L4878 zAA!>iLY>`ZZOyXB@n~;Abe{Q*A3-mGUZ;((Bfyvc(D|7|88MgsdG?nZK7MBx6?Z59`LkgE-g||w?~7I9yF_~tD3@UUe?u| z(e{+8J@Lh(e4AG5|0P-VeZs#_ocuZbMZW&Gm)Mc4T{|bVac<@1HDESI zjjN)hyw>}arF>uYWR`Z+Qs0;5|18ROTd~Y`w4Ss8r{d~bb;vU4&O7$9nvoerP9&c$ zk?(Mi=8>iGQ~eoSmLM}VF>_mzx)CVWOz`!Cy+acZx6?H7WHV|Y0-c3uR+&NcHLV~Q zkTbcFzfJrlDpQkD45~m$?r!>=um+MjF}#4Yjs&S^Ok5FvDrNlZ$fuC=!1eNI%q0&N`eMpF4eCTEyPTdaGs0mb&y}P-~SQL5U z2J@7NkDVzN^OPTaRW|kYL1p(3%fsIF=N5OzAL?KJ;dh10#MSyi(@Or8(X~}Jh%Dxr zpH}&-s~SIS1A7gx6bf7N_!q@q-_l$u9DW{<#Kb;xec5!2*V;bZzE}Re-l8*9oiyL@ zC0`DenL8!2W3F32fS5?h^YSy zV<)e5&0(kq?r<5;eQeEB@6v9*s?PjgL*;V*OYN{}t7)yi3|^}8+AQkD0vW&)5LsK1 zdRZG&AqrUQ6aL8^x2j3OSJ!}~FpmKrgM5#z{x{4WHwt6t(Nja+`>+!|*GN3;nu9^7 zzF4hXelNXI7dAdi4Y_pI6@@&=Pp#Tvvfh`;<8Kd>w6?r}H3XtI1$P%nPl*!1;Q#V0SF3NT%Yjffla@!ht!k}3ZtYkz@SK1<5!A|6I zOHh|Ssl`7ZH7A?yH!7C)`%kmiE6MzzVzz6a+%{;vAD9}ms6y8JY<7xHd7_C9cDKXj zc_FPbCS+BM;}_o>7<7*+skRmNrxAw_4#!YyuAi*Dx^(W$DgEe+hJ)w7xO7E!^VT7O zc|dR7t03=Lv}Qc$zSPq>@a_kft3ST*#$+<}^r=|e>h;1?l5Auc8bnYgj;==_>}}y< z6j&f&XF0%!cj>(jDk2=gQ8J+WZStKqZiEM*MX|%{{oyaT0%d5%BVab$y z-%kK*32NX30ltCCoHH`KtiC0sz4T5SOihq!?afH7 zaXyyCq_IKBli5y9+xRpwyMW>p$kz1%VF6QZBtsbZ=Ld&t13;SCiQ&MD0kL2<0b?ex zB_qtZqPx%{#s>ySU%EDseIN*7;IrVSd=WW2?QwwGEqF-o7E+0|_U45)_>mL*69d7z zEYO`m;6t^}=$b-%x@eA?4T3qkL2RfoUKlPxz>^Y0UCyRCz3?#7B|?JPhh;JjK`RS( zrxVy}dsC@7IZz8?>}2N_N6|hrMPEefD~3)KT?0N3D^54u7+h*AW*S8D!D!L2A|i*7 zBn}Tkku!9%Lwqh;ZU`VJN)ON+BWaG7TmMf_XCIZ;neY1zY;j|@bZ-x`L%jE)e?e*;E`TjniuYo06Ry|9=pAh7M zX;_J$2UnD4%DOOgy=#ollDo8UTA_)%U9i`eN8kh?ho^_QgcS-tGKEaWt z?&{_`JZBjjP#s<>)W^Fr3MPOLa}{G`WUlDSGnZRYstr0*dqo132;-23EWvuJ<_tdw z-)op#s-Eck$X6G6j=Yc5eZrl{X!szWLBK;9!|rN<3A=nJBd#%!3P~=;Qf2|UuJX%= zDM#X8{|?%l8~J^ACu_@3{oX5Zj2`8hif07Au_! zU9v}j;I-$f58xg+bwq8yCHn!nr2i%jk=F)~Khr7+4HrPFJU1SH)fnf#i z*jk;vSX;AQ@b3pv&9pE#8Z~;LN!v!y?+U+CWXrdWi0t7uwwW_!^9#WT73GJT^x2Vn zGr+w|#(_L4HecFEi>SX+FWK`XoEJ+dvF46x|Ls>p(~BXbQHqy}xy_|}__l_*cmEJ^ zJFG<0YP&2)T9I@XhSChNw`wA78+v7pRIh0I@lb;2Z!})C`R!(H=C!-mA9M7->U=uB5qvTAo1 zx>}dDi|*L9>FKw|-_*Tcs$3*W&+I%Y$^PK{{Ex+~oHkZTBk)@Nr!45HEM0mtKq6_`*HhTxWX|C@6{ETmSh_7j3cG?1Q9u~*IK(wdQx{vCa zvsuOQ%^8PIV2Q$fl`~)_t56;(b6065&Ke~6r$HEDK%MhjQRJ0^Een&1(LYo$5gym! zuprQfpKoIOHb?V$l$4w-iDw(&bSSs`J3u|CF)+HufW?-dWpK;|5b8_gz}v+OED|%L zr>7s@M{cGebQLftxZpUYNbpaKGq8$yS#brSiDMxBmEdp2xlA#=+v4a3s*(y4f}b=X za{Q6k_{Q6JJzWM`!V0td_IE9mHiVvJiJ9F}DaxFkJ3K;{7B zmxL*=)X~6^{}MP<-i3xrYU6~Q&sPuXG@~UdK`kmz=e8{1h>w!55l~0v6a}5&^i!bX zVKCUEnaU|RqdX+tObqdw9h@?L#u0LGnZ?kIWucLgS86a*?HrDd`E#O7%Bqd38% z(!gj_;HX`?Ai&7Qn_j}vu{G-GcntQ=?G^`a8SXFaD(I;gyI;naZYnswY)Qd@>I$zQ z<>eck@`#l zp605N23fpBHV%=q{1pboVqkSq`&nJXEfzh4BlJOgeQDCRVVbv_zkP0*>ks>L=c~B6K$X_xG4`pegjKq&Kf-=} zM@ic=;R9QtZsEHYjb;IY2%Mr>bWrkJG_V5P0)%vthWPR!=%^+^!kO4rUI2%4gp7i7 zb1=2ar?|@R1?=K|OgWY%;8$@km|$cj;Gn6XmLx_k#vD`3TM8<9sqU@1w?8?Uw>nd< zv;2IDz7?RKT6uRP56SjuHJt56&!O$m*AngVkpC~Srb&74dIG4$W!oFG_rIPgk|4BF zl9cp&oXe{Ok2(C2ZUO3NO1F@B8UG224|O~yl$3IVZn%P1hz4+Seu_|CF))dgfTd4x zX&G}CgQSP98ee`sZahhhz52};<#$1xPmsJx!C8{fA}$z16{O=NK$bMd4rc8JRB@p# z-);WF?iV>Hs9<5V(;^nUl#}UU2k7=!vmI6;{YXi3b49ZzrwS)<{7HO>00T8JpGkj2 zoOaAvXfWu_fcbz|Nq>wICkCsAUDB#F7l+xN1z9aiI<`-7Ww{VJBh%-{|q=UAoDk@=TV-K9;3WcE%lZ1T2UD{G3HDV0&n&(R(0$s=d7 z5;J~#aD6oVusv*z9ZW`ldC!jwN%Q+^@-QLJ%PhpKLmgxrf_9f|dVyN++MQ)}*f0fu zGY-iiY#4wV8E0z8SE|a-xbXoE3Td+Z%B(I(q)elpTUy(7^Ru5spM9oEZ^~bqWKQK_15!|d_D+B;QR4D*`w!qx*!siEzPjRX zkgyN#jWVG29G}iAPJ`Y~6V!bi{M7eJVm8ud?DDW(hoT@=1d>=TaH|g1AG0ghmf5Fv zTck$Mq1C@S)FhW1JUtKQWy(x=<%&JbCTjF&nr=9UX_=X>k@MvJ-Eo-go(GH94kfb} zQ3~mCp|cWGC`h*u5W{zqz@%!o>TyCUbXb@cf*>gB$M6E{s25M?KP8k}nG@hiewk>1 z%*Z;UubDtvTcQ6KQ@}6kA6|UDh$&taLH$ZA{4)2mKc4@m*!54rxi|Rx*-v9H!V1sK z^<%MC-o%?{>SWXucp$~cbpVwX|` zsl&z)^>zDUO17SR0WsZ=d;ybYqvG~IJT{Pyi+B9@J!K}v$9IRF)vqbg*tueT_I&R4 z;NadHJ!{YQhNhFYQoX0m;eN}OgQCXyE=j{ZgEViH&9t4Iw3|8eCNw8%Rht^r`io3J z<*b+_NvcbGtl;wF*~`5QA)E@=kkpk#{UA}+rVcZeE zHDzzeo`3q&?T6Bp&ZSpV-%mGI{L9_z#P4*|f9Jv{MDZ3>V5a{y`Btw_|2QU)qoep6YvumqJ5bJA(z>Gui6FgadEq zE)qDI-1(Tp;#CfMfzL1HE5NCNtfu!m5;*G-vM?mKmZt;*)wkT|FZf6Lv$VW{e|TSD zKCmN`ar3<^#6|cr6sI{EIL;x@3*i~iu)@jZZ5iM<6;dHNU8SI+EGWG;!Az$@ig=ltj{1Ov z;Q*YqbN41rQ2jvcp)0rr=i-7KX;?A#&JQaumph=hqu5_J(pLWe6`;pp%%DFsmi-eaf#v7m2nSx((B zM!#j1Xpl_|2HprD^d-F%h6yQqMZLezMgxaz>~Cfcgh30SivVYGxt%RuUT2_KdPX(2 z0#LVf9MX*6$8JNSffnv?qKo^~r11ax(XEXAU-ZB9nrtcZaibanAd#KlCjW<9_syiz zAsOdq*2p38-o0iN@FA1dGkZtPdC7KrH0Vmw$My9y&gq9Aachq~=e_h!EXbs@{hN&W zBWCfI#m&l10I;;Xr)?xxI&Z62gBKWaWvtIkvNKNe=@=Kq`2dF9fsAJFhFqUxGZ^<4 zsFX-5PVZ|5m?M{Z$qk18k`zs@)^N%2AOR^L4)ckZBB@0{@*UtO_OLCv3mMq?+dcCD}RM^Pm%{Wtg`%#CPyMHt3VBln^QTfqP2PUV$?EbKfdm&Eb7lY~n>e5qxEoHchJWy4K zXFoOB5;&wQ53L}g?B7mc<2_mJoBR8id1oDz*NYg1VZ+Moq}6|L+GU-yH$s!ANnC4mi2mZ}SufgQJi?ly+L|rz zO82-LGGjmtc#x{S*wrOTOeE*{xyrOieS~-F;@WoO%dVu&+>pfe%3ZLOabsT3`u9rl)_%Ep+m2QYG-t~kz;4d1rZ z`QsRILZui?&|jR%(epxqRV+?HR}%(bRvz!m>>nVoDr zKX%tSULV`g?y+v5#*2iU9m=O#|6pE~?5Ul(=nm5OjU8KzW01qCX5{Skgb)4p?xVKQS{UuYVi6MxIHFNqMP@yb?%vK&Xbk|xX7X;l;WnSN(n#L3d zKK@-(-u>m)?+?V5me-6`&zG&?y2?*XGA6kz$|U*7?9a?zNJq-NX_yEI*C(|z{s);- zMx^a(A*e{YCtbBgElq0@y|E^JrGPsaB8WA<6^{|)=Fz6rf44N`WAhUegSo~VBYX8H zf3m2Pn7H~rzWFx|lxRUnAI<~70Nk#p9lJ5?ETY8Fucd&a>M^_+J<-AJmF}=eHDo%U zE2)K{IK(0W6~|X%(ZmTCe#RN@;-<~M7xd7@?MK}UiJ_iqh1UxXOZ6-6q)mQucCx1@b}VUY+T&V#Zs`!Y#zV;&Pttx8L?UzU znu%$vF=92>>>S+Ed;w~!nr0@mInfJ^56d-K6YUI*Ff0PzORz0fE{(jteu zfqf&fIS>a}5D?FtN)C|!e2j$8%_jg&bqkL|eLOKgi}WPUZB>va>9g*^#+=Kyor3T$ zq0uOL_I~)JV}VtqC>m%=C%%6^ZZI5CuFXtNT#t;{K}*#1b$e9m%|ch4djK@ECPR;w z=G8>HJ6ccPl8ODN8m%W)Bd#^c%;T}E>VmY~5APekCJ+rH{cD<> z@6{TRR5pSPAqYbCR7OE7l>m^A%w}Djh17=y zuz9~AP1=3AzIU?vkS(V(w@3@EDak*+HN_yA(rN2o-uXnqVw@B9wwbll*KN(_?b*no z~IshGaHR;q~%0oNxuD^{8Jl$YS0_C-`Y1E;j!yZn{$osX;c0}Q-d2CrtJBR zraeHAB5Y0nHq#_YVmn+pb28JhB$kxrOr3w3l4v}xk=Ec8(n^IknY%JG^0{5uxN2Ls zn!$SjQ@~~(HFMVJjh;T^)mjsX!8V^3%; ze&j^g?BqmqxMteTYn<;-CT9K;pLLG_J+5gWI*}1-Gon%UU?^P9Yy>VJ8eu-1DPNxn z`uEN&O-By?njjwJ(ZBkid1!iNy>?HC8RB(`U2QL~V9|qX_EvBIvl~&N3v5O`RveGo zV#GsHi0K+B2H#312Khh<+qrdeGoxF7mgpxUW(q{j+usJ-;tMrCrg`;aynPt06& znf0aboF8pF9=Z0lA!_X-{QH)0(>5|`o(`U{G(|1~oZNK?E;Zggm)+J>eoR2v<~6wS zhW+pz))anity~iAOlcMgCO-rQ27t2AMl)>A{^}jgEAA2gDN1%}(sa+oVU01~tWqj< zx(by}v%hCoKnv3R+#Oa7K!~JD$jkuM1w5o;Mu>t|5p}Os4173i2ZmS1AI%8e-CVRA zX$Lg`$csU-#Zifqy(H)sPw0Xq5Em9x17-%OhuTL?&u&NPE*``alHTNkkgf+{wL98{ zaK5}3vPLm(07}QdlYl%p`_;8~;+vRe2G1@Aa5rl#gG5=43INc5LLT>c`H z)JcsaWu!{YrWcb-xt8|RgrkzjuXad;no+!Y^hAnF(8E&K}v5yycj+N+7f6qKtnH-kuZ$k4vM2Bs)|H^Sg%PN zuHcJEMC}+@(iD(xf!VpaK#~`4BD&FRoB~l{T`xnE6!ZYInVmPJz~GQXXMw5?V_o{@ zVG}j46=nCN023pGFAYBPFLG(lYKtPp;=L%Nd8D~gEScltzAn)%#ZkC7j>$V0nMVQb z6{z=jaY2T50cG>UXu&zqROPhT7KchwxQ_(n{MtI5s3!pI(dsdte!SixkPO^uDSpZj zU2;q26pZpCb&||wKR_W(<-ltX@Yva9JitFD5ayFnp5(FD;m9Xv<|h(e`f(_8*#V-= zex{ns2OD|N9fJ4F1@0qc+S9|+6{h-j%e+nzXqwDS8l4d{kH4!Nv$P;K~MV5%y|-2+RdVp|%n+Q6AmnX|n-l zDSP=~`BA(yvAopyW%a|FA1^aZXU%Ms1Y2OLTnwwBm#m1H(TyV@RA%f@pXQU)TspX+ zn9UAQ|CRr&E5UuLR{^*9Sr?aNMbU&n=m$+>DP*EcVG3BN=V}ids$6gU6j5RLm|OF00=j2=(N7)+Cv5+OFTT_pA1M^S2=S4p1^;;lUoI zMZvu#j9Ym7fVJZ*NntELpS+t)ZXuW}SQS5`xFznRJkgCJMi$&N_-vHfN$mw0`zY{p#KZyMqtbU literal 0 HcmV?d00001 diff --git a/sound/lewd/latex.ogg b/sound/lewd/latex.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9a602244e25b690483bac21e87849e96deee028 GIT binary patch literal 12617 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 z zY;57ZgWVw|ZhDZ!;}Yk{p6Y)r9&j9&!t{lIrmlSDa^KLzwkiKZ@{HKV7Z@OisFifJ*MffrQ8_)?+des293fT{ z)r)2JXS;k{Msy>_3^s+l)Ea^;jvZ{I-U7eGUv6eay7kqOKa&r%I{Z|YkmJSVwdAse!$@|A7oe;fWf81FtuK$aX{ZgzW zU~GMv`1SZkuVKKECKDMDSo-Ug=+DNJRofPgM@j?ou#lo#O#)dBlD_vm;-Q-olg?zKK6+9AruXeuo0Y`3dM`#)vglMDa= literal 0 HcmV?d00001 diff --git a/sound/lewd/slaps.ogg b/sound/lewd/slaps.ogg new file mode 100644 index 0000000000000000000000000000000000000000..78cf4ecaaea950bec2367841819ae7b3cd4abe8f GIT binary patch literal 20304 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 literal 0 HcmV?d00001 diff --git a/sound/lewd/vibrate.ogg b/sound/lewd/vibrate.ogg new file mode 100644 index 0000000000000000000000000000000000000000..87eb1a4a1d44f3a2c878d54f5998dfe97cf7caf9 GIT binary patch literal 24136 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 217a2b2daa..6b7e5de851 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4053,6 +4053,7 @@ #include "GainStation13\icons\obj\vairous_weapons.dm" #include "GainStation13\icons\obj\structure\beds.dm" #include "GainStation13\icons\obj\structure\flora.dm" +#include "hyperstation\code\datums\mood_events\events.dm" #include "hyperstation\code\game\objects\railings.dm" #include "hyperstation\code\game\objects\structures\bench.dm" #include "hyperstation\code\game\objects\structures\sauna_oven.dm" @@ -4066,9 +4067,11 @@ #include "hyperstation\code\modules\resize\sizechems.dm" #include "hyperstation\code\modules\resize\sizegun.dm" #include "hyperstation\code\modules\surgery\organs\augments_arms.dm" +#include "hyperstation\code\modules\arousal\arousalhud.dm" #include "hyperstation\code\obj\ashtray.dm" #include "hyperstation\code\obj\decal.dm" #include "hyperstation\code\obj\kinkyclothes.dm" +#include "hyperstation\code\obj\fleshlight.dm" #include "hyperstation\code\obj\sizeitems.dm" #include "hyperstation\code\obj\stargate_clothing.dm" #include "hyperstation\code\obj\ZaoCorp\hat.dm" @@ -4148,6 +4151,7 @@ #include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" #include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" #include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" #include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" From f7181a0aa8a10d2d73c41426585e7208e81dd46b Mon Sep 17 00:00:00 2001 From: AlManiak Date: Mon, 14 Oct 2024 13:58:41 +0200 Subject: [PATCH 2/9] Fixed genitals not producing reagents --- code/modules/arousal/arousal.dm | 2 +- code/modules/arousal/genitals.dm | 8 +++++++- code/modules/arousal/organs/penis.dm | 1 - code/modules/arousal/organs/testicles.dm | 1 + tgstation.dme | 4 ++-- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 298d9168c1..3e8d0b0e45 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -348,7 +348,7 @@ if(!G.linked_organ) to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") return - fluid_source = G.linked_organ.reagents + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume if(mb_time && !remote) //Skip warning if this is an instant climax. diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index bfd807d3b6..60fce42fd0 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -45,8 +45,14 @@ linked_organ = null . = ..() +//GS13 Port - Make gentials actually produce "reagents" /obj/item/organ/genital/on_life() - return + if(QDELETED(src)) + return + if(!reagents || !owner) + return + + generate_fluid(reagents) /obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) diff --git a/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index 6aee84de3c..7e0f31ed43 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -12,7 +12,6 @@ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN|GENITAL_CAN_TAUR linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 - producing = TRUE shape = DEF_COCK_SHAPE size = 2 //arbitrary value derived from length and diameter for sprites. layer_index = PENIS_LAYER_INDEX diff --git a/code/modules/arousal/organs/testicles.dm b/code/modules/arousal/organs/testicles.dm index 57f16be9b8..2fdb0fb2c2 100644 --- a/code/modules/arousal/organs/testicles.dm +++ b/code/modules/arousal/organs/testicles.dm @@ -13,6 +13,7 @@ var/size_name = "average" shape = DEF_BALLS_SHAPE fluid_id = /datum/reagent/consumable/semen + producing = TRUE masturbation_verb = "massage" can_climax = TRUE layer_index = TESTICLES_LAYER_INDEX diff --git a/tgstation.dme b/tgstation.dme index 6b7e5de851..f3bbf44f7f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4057,6 +4057,7 @@ #include "hyperstation\code\game\objects\railings.dm" #include "hyperstation\code\game\objects\structures\bench.dm" #include "hyperstation\code\game\objects\structures\sauna_oven.dm" +#include "hyperstation\code\modules\arousal\arousalhud.dm" #include "hyperstation\code\modules\clothing\sizeaccessories.dm" #include "hyperstation\code\modules\food_and_drinks\recipes\drinks_recipes.dm" #include "hyperstation\code\modules\mob\living\status_indicators.dm" @@ -4067,11 +4068,10 @@ #include "hyperstation\code\modules\resize\sizechems.dm" #include "hyperstation\code\modules\resize\sizegun.dm" #include "hyperstation\code\modules\surgery\organs\augments_arms.dm" -#include "hyperstation\code\modules\arousal\arousalhud.dm" #include "hyperstation\code\obj\ashtray.dm" #include "hyperstation\code\obj\decal.dm" -#include "hyperstation\code\obj\kinkyclothes.dm" #include "hyperstation\code\obj\fleshlight.dm" +#include "hyperstation\code\obj\kinkyclothes.dm" #include "hyperstation\code\obj\sizeitems.dm" #include "hyperstation\code\obj\stargate_clothing.dm" #include "hyperstation\code\obj\ZaoCorp\hat.dm" From 2eb2659590ed27ee3796c20d548d2e8459713ed6 Mon Sep 17 00:00:00 2001 From: AlManiak Date: Mon, 14 Oct 2024 16:53:47 +0200 Subject: [PATCH 3/9] Fix for belly_visibility Inflation added cleanup of warnings Fixed arousal hud genital visibility menu --- .../code/modules/mob/living/belly.dm | 1 + code/__DEFINES/citadel_defines.dm | 2 +- code/__HELPERS/mobs.dm | 2 ++ code/modules/arousal/arousal.dm | 3 +-- code/modules/arousal/genitals.dm | 6 +++++- code/modules/client/preferences.dm | 9 ++++++--- code/modules/client/preferences_savefile.dm | 2 +- .../code/modules/arousal/arousalhud.dm | 19 ++++++++----------- 8 files changed, 25 insertions(+), 19 deletions(-) diff --git a/GainStation13/code/modules/mob/living/belly.dm b/GainStation13/code/modules/mob/living/belly.dm index 796b0407d4..6ff2363f2b 100644 --- a/GainStation13/code/modules/mob/living/belly.dm +++ b/GainStation13/code/modules/mob/living/belly.dm @@ -45,6 +45,7 @@ else color = "#[D.features["belly_color"]]" size = D.features["belly_size"] + inflatable = D.features["inflatable_belly"] toggle_visibility(D.features["belly_visibility"], FALSE) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index bd9cb34827..de25ec52e9 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -67,7 +67,7 @@ #define BUTT_SIZE_DEF 1 #define BUTT_SIZE_MAX 10 //butt genitals are special in that they have caps. if there's the event there's even bigger butt sprites, raise this number. -#define BELLY_SIZE_DEF 0 +#define BELLY_SIZE_DEF 1 #define BELLY_SIZE_MAX 10 //GS13 Port - Add back Arousal diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index e2f76e1952..27a028d40f 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -215,6 +215,7 @@ "butt_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), // GS13 EDIT START - BELLY "has_belly" = FALSE, + "belly_size" = BELLY_SIZE_DEF, "hide_belly" = FALSE, "inflatable_belly" = FALSE, "belly_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), @@ -225,6 +226,7 @@ "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, + "belly_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_antenna" = "None", "flavor_text" = "", diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 3e8d0b0e45..8fa4ed092e 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -429,7 +429,6 @@ else to_chat(L, "You feel your belly strain.") - var/obj/item/organ/genital/penis/P = G fluid_source.trans_to(L, total_fluids) total_fluids = 0 if(!remote) @@ -719,8 +718,8 @@ if(picked_organ) var/mob/living/partner = pick_partner() //Get someone if(partner) + /*GS13 Port - De we need breeding? For now disable it for inital porting var/obj/item/organ/genital/penis/P = picked_organ - /*GS13 Port - De we need breeding? if(partner.breedable == 1 && picked_organ.name == "penis") var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No") if(impreg == "Yes") //If we are impregging diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 60fce42fd0..de892c050f 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -28,7 +28,7 @@ var/internal = FALSE var/hidden = FALSE var/colourtint = "" - var/mode = "clothes" + var/mode = "" var/obj/item/equipment //for fun stuff that goes on the gentials/maybe rings down the line var/dontlist = FALSE var/nochange = FALSE //stops people changing visablity. @@ -107,17 +107,21 @@ if(owner) owner.log_message("Exposed their [src]",LOG_EMOTE) owner.exposed_genitals += src + mode = GEN_VISIBLE_ALWAYS if(GEN_VISIBLE_NO_CLOTHES) if(owner) owner.log_message("Hid their [src] under clothes only",LOG_EMOTE) + mode = GEN_VISIBLE_NO_CLOTHES if(GEN_VISIBLE_NO_UNDIES) genital_flags |= GENITAL_UNDIES_HIDDEN if(owner) owner.log_message("Hid their [src] under underwear",LOG_EMOTE) + mode = GEN_VISIBLE_NO_UNDIES if(GEN_VISIBLE_NEVER) genital_flags |= GENITAL_HIDDEN if(owner) owner.log_message("Hid their [src] completely",LOG_EMOTE) + mode = GEN_VISIBLE_NEVER if(update && owner && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4d84e31f86..8ea36dfe0d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_fluid" = /datum/reagent/consumable/milk, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_fluid" = /datum/reagent/consumable/milk, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING, "belly_size" = BELLY_SIZE_DEF, "inflatable_belly" = FALSE, "belly_visibility" = GEN_VISIBLE_NO_UNDIES) var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races @@ -844,9 +844,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Color:
    " dat += "    Change
    " - dat += "Belly Visibility:[features["belly_visibility"]]" + dat += "Belly Visibility:[features["belly_visibility"]]" // GS13: tweak inflation description - //dat += "Inflation (climax with and manual belly size change in arousal menu):[features["inflatable_belly"] == 1 ? "Yes" : "No"]" + dat += "Inflation (climax with and manual belly size change in arousal menu):[features["inflatable_belly"] == 1 ? "Yes" : "No"]" + dat += "" dat += "" @@ -3051,6 +3052,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_butt"] = !features["has_butt"] if("has_belly") features["has_belly"] = !features["has_belly"] + if("inflatable_belly") + features["inflatable_belly"] = !features["inflatable_belly"] if("widescreenpref") widescreenpref = !widescreenpref user.client.view_size.setDefault(getScreenSize(widescreenpref)) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 488f167981..e4d86720f5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -704,7 +704,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE - features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "belly_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "belly_visibility" = GEN_VISIBLE_NO_UNDIES, "belly_size" = BELLY_SIZE_DEF, "inflatable_belly" = FALSE, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) S.cd = "/" if(!slot) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 5f079e9213..f4df481b63 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -12,10 +12,9 @@ if(!G.nochange) if(!G.dontlist) // GS13: Fix spelling - dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visible" ? "[G.name] (Visible)" : "[G.name] (Visible)"))]
    " + 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

    "} - var/obj/item/organ/genital/penis/P = user.getorganslot("penis") //Options dat += "Masturbate" dat += "(Stimulate a sexual organ with your hands.)
    " @@ -111,32 +110,32 @@ 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") + 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 clothes", "Always hidden") + 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 clothes", "Always hidden") + 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 clothes", "Always hidden") + 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["hideanus"]) + 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 clothes", "Always hidden") + 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 clothes", "Always hidden") + 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"]) @@ -379,7 +378,6 @@ 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 spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") if(spillage == "Yes") @@ -404,7 +402,6 @@ 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 mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) else to_chat(src, "You cannot do this alone.") From 46e3de0d5ea1f9a05569a220a62271712035bc50 Mon Sep 17 00:00:00 2001 From: AlManiak Date: Mon, 14 Oct 2024 19:18:36 +0200 Subject: [PATCH 4/9] Enabled Adiposexual --- GainStation13/code/mechanics/fatrousal.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GainStation13/code/mechanics/fatrousal.dm b/GainStation13/code/mechanics/fatrousal.dm index b2523ace24..2a93a8cad0 100644 --- a/GainStation13/code/mechanics/fatrousal.dm +++ b/GainStation13/code/mechanics/fatrousal.dm @@ -16,14 +16,14 @@ var/mob/living/carbon/C = quirk_holder C.hider_remove(src) -/* + /datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user) if(iscarbon(quirk_holder)) var/mob/living/carbon/C = quirk_holder return C.getArousal()*35 return FALSE -*/ + ///mob/living/adjust_arousal(amount, updating_arousal=1) // if(HAS_TRAIT(src, TRAIT_FATROUSAL)) From f348b44bef7d7813d868933641872ee51fc5a1ee Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Mon, 14 Oct 2024 23:57:52 -0400 Subject: [PATCH 5/9] ghost roles fix --- GainStation13/code/modules/mapping/ghost_roles.dm | 4 ++++ code/game/objects/structures/mirror.dm | 1 + code/modules/antagonists/nukeop/nukeop.dm | 6 ++++++ code/modules/antagonists/wizard/wizard.dm | 5 +++++ code/modules/awaymissions/corpse.dm | 6 ++++++ hyperstation/code/modules/mob/mob_helpers.dm | 12 +++++++++--- tgstation.dme | 1 + 7 files changed, 32 insertions(+), 3 deletions(-) diff --git a/GainStation13/code/modules/mapping/ghost_roles.dm b/GainStation13/code/modules/mapping/ghost_roles.dm index 21d5f16cc5..f37da590dd 100644 --- a/GainStation13/code/modules/mapping/ghost_roles.dm +++ b/GainStation13/code/modules/mapping/ghost_roles.dm @@ -12,6 +12,7 @@ flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \ Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - welcome and lure in new guests into the freshly opened GATO restaurant!" assignedrole = "Restaurant worker" + mirrorcanloadappearance = TRUE /obj/effect/mob_spawn/human/fastfoodmanager name = "Corporate cryostasis pod" @@ -27,6 +28,7 @@ flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \ Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - make sure to keep the best care of GATO's restaurant, currently under your management! You have a higher say over your workers, but do not abuse this power." assignedrole = "Restaurant manager" + mirrorcanloadappearance = TRUE /obj/effect/mob_spawn/human/fastfood/Initialize(mapload) . = ..() @@ -108,6 +110,7 @@ death = FALSE roundstart = FALSE mob_species = /datum/species/human + mirrorcanloadappearance = TRUE /datum/outfit/feeders_den/fanatic name = "Feeder Fanatic" @@ -152,6 +155,7 @@ death = FALSE roundstart = FALSE mob_species = /datum/species/human + mirrorcanloadappearance = TRUE /datum/outfit/feeders_den/victim name = "Den Victim" diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index ffb48ce633..a88d250eb7 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -21,6 +21,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user + H.checkloadappearance() // GS13 EDIT //see code/modules/mob/dead/new_player/preferences.dm at approx line 545 for comments! //this is largely copypasted from there. diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 9c0abf70b5..1313d21312 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -56,6 +56,12 @@ if(send_to_spawnpoint) move_to_spawnpoint() + //GS13 EDIT START + var/mob/living/carbon/human/H = owner.current + H.checkloadappearance() + //GS13 EDIT END + + /datum/antagonist/nukeop/get_team() return nuke_team diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 5747e5190d..65988577b7 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -30,6 +30,11 @@ create_objectives() if(move_to_lair) send_to_lair() + //GS13 EDIT START + var/mob/living/carbon/human/H = owner.current + H.mirrorcanloadappearance = TRUE + H.checkloadappearance() + //GS13 EDIT END . = ..() if(allow_rename) rename_wizard() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 46e80b3255..041dd4be96 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -32,6 +32,7 @@ var/banType = "lavaland" var/ghost_usable = TRUE var/skip_reentry_check = FALSE //Skips the ghost role blacklist time for people who ghost/suicide/cryo + var/mirrorcanloadappearance = TRUE //GS13 EDIT ///override this to add special spawn conditions to a ghost role /obj/effect/mob_spawn/proc/allow_spawn(mob/user, silent = FALSE) @@ -139,6 +140,7 @@ M.mind.assigned_role = assignedrole special(M, name) MM.name = M.real_name + M.checkloadappearance() // GS13 EDIT if(uses > 0) uses-- if(!permanent && !uses) @@ -251,6 +253,10 @@ W.assignment = id_job W.registered_name = H.real_name W.update_label() + //GS13 EDIT START + if (mirrorcanloadappearance) + H.mirrorcanloadappearance = TRUE + //GS13 EDIT END //Instant version - use when spawning corpses during runtime /obj/effect/mob_spawn/human/corpse diff --git a/hyperstation/code/modules/mob/mob_helpers.dm b/hyperstation/code/modules/mob/mob_helpers.dm index 50edbc330e..3aadbe3916 100644 --- a/hyperstation/code/modules/mob/mob_helpers.dm +++ b/hyperstation/code/modules/mob/mob_helpers.dm @@ -1,11 +1,14 @@ mob/proc/checkloadappearance() var/mob/living/carbon/human/H = src + if(!istype(H)) + return FALSE + //This will be where the person gets to select their appearance instead of the random character - if (world.time <= (H.time_initialized + 900) && H.mirrorcanloadappearance == TRUE) + if (H.mirrorcanloadappearance == TRUE) SEND_SOUND(H, 'sound/misc/server-ready.ogg') to_chat(H, "This ghost role allows you to select your loaded character's appearance. Make sure you have your ID in your ID slot, if you have one.") - if(alert(H, "Would you like to load your currently loaded character's appearance?", "This can only be done up until 90s after you spawn.", "Yes", "No") == "Yes" && world.time <= (H.time_initialized + 900)) - if(alert(H, "You should only load a character that has not currently died in the round. Do you accept this?", "Warning", "Yes", "No") == "Yes" && world.time <= (H.time_initialized + 900)) + if(alert(H, "Would you like to load your currently loaded character's appearance?", "This can only be done up until 90s after you spawn.", "Yes", "No") == "Yes") + if(alert(H, "You should only load a character that has not currently died in the round. Do you accept this?", "Warning", "Yes", "No") == "Yes") H.client?.prefs?.copy_to(H) if (H.custom_body_size) //Do they have a custom size set? H.resize(H.custom_body_size) @@ -27,3 +30,6 @@ mob/proc/checkloadappearance() else to_chat(H, "You either took too long or chose not to change. Alrighty. Remember, you have 90 seconds from spawn to get to a mirror and still do it if you wish.") return + +/mob/living/carbon/human + var/mirrorcanloadappearance = FALSE //Can the mob load their true appearance with a mirror? diff --git a/tgstation.dme b/tgstation.dme index f3bbf44f7f..02317ed49d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4060,6 +4060,7 @@ #include "hyperstation\code\modules\arousal\arousalhud.dm" #include "hyperstation\code\modules\clothing\sizeaccessories.dm" #include "hyperstation\code\modules\food_and_drinks\recipes\drinks_recipes.dm" +#include "hyperstation\code\modules\mob\mob_helpers.dm" #include "hyperstation\code\modules\mob\living\status_indicators.dm" #include "hyperstation\code\modules\reagents\chemistry\reagents\drink_reagents.dm" #include "hyperstation\code\modules\reagents\chemistry\reagents\food_reagents.dm" From 04cb381e02e3b3a3069343d097aaa5fd4933f4c0 Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:36:18 -0400 Subject: [PATCH 6/9] camera and arousal fixes --- .../code/mechanics/den abductors/console.dm | 13 ++++++----- GainStation13/code/modules/arousal/arousal.dm | 19 ++++++++++++++++ .../machinery/computer/camera_advanced.dm | 2 +- .../antagonists/abductor/machinery/camera.dm | 4 +++- code/modules/arousal/arousal.dm | 22 +------------------ hyperstation/code/obj/fleshlight.dm | 1 - tgstation.dme | 1 + 7 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 GainStation13/code/modules/arousal/arousal.dm diff --git a/GainStation13/code/mechanics/den abductors/console.dm b/GainStation13/code/mechanics/den abductors/console.dm index 4293c5e203..a0a967a3b6 100644 --- a/GainStation13/code/mechanics/den abductors/console.dm +++ b/GainStation13/code/mechanics/den abductors/console.dm @@ -26,7 +26,7 @@ var/credits = linked_scale?.credits dat += "Gear Credits: [credits]
    " - dat += "Transfer credits in exchange for supplies:
    " + dat += "Transfer credits in exchange for supplies:
    " for(var/goodie in subtypesof(/datum/feeders_den_goodie)) var/datum/feeders_den_goodie/temp_goodie = new goodie() dat += "[temp_goodie.name] (Cost: [temp_goodie.credit_cost])
    " @@ -64,7 +64,7 @@ say("Unable to purchase more!") return FALSE - if(!Dispense(item_path, price)) + if(!Dispense(item_path, price)) return FALSE if(buy_counts[goodie_datum.name] == null) @@ -146,7 +146,7 @@ return TRUE return ..() - + /obj/structure/scale/credits name = "tracking scale" desc = "A upgraded scale that tracks to weight of all of those that have stepped on it. Using this will add credits to the feeder console" @@ -155,7 +155,7 @@ /// How much credits do we currently have? var/credits = 0 /// How many credits are we going to reward per pound gained? - var/credits_per_fatness = 0.25 + var/credits_per_fatness = 0.25 /// A list containing all of the people we've scanned and their maximum weight. var/list/scanned_people = list() /// What is the current team number? @@ -201,7 +201,7 @@ var/credit_total = max((credits_to_add - credits_to_remove), 0) if(credit_total > 0) say("[credit_total] credits have been deposited into the console.") - + credits += credit_total scanned_people[fatty] += credit_total @@ -214,6 +214,7 @@ team_number = 27 vest_mode_action = null vest_disguise_action = null + check_if_abductor = FALSE /obj/machinery/computer/camera_advanced/abductor/feeder/IsScientist(mob/living/carbon/human/H) return TRUE @@ -245,4 +246,4 @@ prepare(target,user) return TRUE - + diff --git a/GainStation13/code/modules/arousal/arousal.dm b/GainStation13/code/modules/arousal/arousal.dm new file mode 100644 index 0000000000..11b2474e0d --- /dev/null +++ b/GainStation13/code/modules/arousal/arousal.dm @@ -0,0 +1,19 @@ +//GS13 Port +/mob/living/proc/mob_climax(forced_climax = FALSE, cause = "none")//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" + set category = "IC" + if(canbearoused && !restrained() && !stat) + if(mb_cd_timer <= world.time) + //start the cooldown even if it fails + mb_cd_timer = world.time + mb_cd_length + if(getArousal() >= ((max_arousal / 100) * 33))//33% arousal or greater required + src.visible_message("[src] starts masturbating!", \ + "You start masturbating.") + if(do_after(src, 30, target = src)) + src.visible_message("[src] relieves [p_them()]self!", \ + "You have relieved yourself.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + setArousal(min_arousal) + else + to_chat(src, "You aren't aroused enough for that.") + diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 5395dd6fee..fc4823cbc8 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -102,7 +102,7 @@ return TRUE /obj/machinery/computer/camera_advanced/abductor/can_use(mob/user) - if(!isabductor(user)) + if(check_if_abductor && !isabductor(user)) return FALSE return ..() diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 4fb6bf5645..9069130a7d 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -11,6 +11,8 @@ var/obj/machinery/abductor/console/console lock_override = TRUE + var/check_if_abductor = TRUE //GS13 EDIT + icon = 'icons/obj/abductor.dmi' icon_state = "camera" icon_keyboard = null @@ -24,7 +26,7 @@ /obj/machinery/computer/camera_advanced/abductor/Initialize(mapload) . = ..() - + if(tele_in_action) actions += new tele_in_action(src) if(tele_out_action) diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 8fa4ed092e..d918d0cb19 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -240,26 +240,6 @@ if(!. && !silent) to_chat(H, "Your [name] is unable to produce it's own fluids, it's missing the organs for it.") -//GS13 Port -/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" - set category = "IC" - if(canbearoused && !restrained() && !stat) - if(mb_cd_timer <= world.time) - //start the cooldown even if it fails - mb_cd_timer = world.time + mb_cd_length - if(getArousal() >= ((max_arousal / 100) * 33))//33% arousal or greater required - src.visible_message("[src] starts masturbating!", \ - "You start masturbating.") - if(do_after(src, 30, target = src)) - src.visible_message("[src] relieves [p_them()]self!", \ - "You have relieved yourself.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - setArousal(min_arousal) - else - to_chat(src, "You aren't aroused enough for that.") - - //These are various procs that we'll use later, split up for readability instead of having one, huge proc. //For all of these, we assume the arguments given are proper and have been checked beforehand. /mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral @@ -604,7 +584,7 @@ //Here's the main proc itself -/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints +/mob/living/carbon/human/mob_climax(forced_climax=FALSE, cause = "none") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 37e4574d58..593477fc6a 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -188,7 +188,6 @@ M.adjust_arousal(5) return - ..() /obj/item/portallight/proc/updatesleeve() //get their looks and vagina colour! diff --git a/tgstation.dme b/tgstation.dme index 02317ed49d..b2eadc6988 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3969,6 +3969,7 @@ #include "GainStation13\code\mobs\cakegolem.dm" #include "GainStation13\code\mobs\chocoslime.dm" #include "GainStation13\code\mobs\races\caloritegolem.dm" +#include "GainStation13\code\modules\arousal\arousal.dm" #include "GainStation13\code\modules\cargo\packs.dm" #include "GainStation13\code\modules\client\border_control.dm" #include "GainStation13\code\modules\client\preferences\preferences.dm" From 2908fed99107dc33b9b5b3bd8dac9b5adfb89aef Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:46:11 -0400 Subject: [PATCH 7/9] Update stock_parts.dm --- code/__DEFINES/research/stock_parts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/research/stock_parts.dm b/code/__DEFINES/research/stock_parts.dm index 457e3b632e..e493df242e 100644 --- a/code/__DEFINES/research/stock_parts.dm +++ b/code/__DEFINES/research/stock_parts.dm @@ -2,4 +2,4 @@ /// Efficiency scaling for stock part level to material usage. All code concerning lathing and production from raw material sheet should be using this. #define STANDARD_PART_LEVEL_LATHE_COEFFICIENT(level) clamp(1 - (level * 0.1), 0, 1) /// Efficiency scaling for stock part level to ore factor. All code concerning lathing and production from raw ores to raw material sheets should be using this. -#define STANDARD_PART_LEVEL_ORE_COEFFICIENT(level) clamp(1 + (level * 0.125), 1, 10) +#define STANDARD_PART_LEVEL_ORE_COEFFICIENT(level) clamp(1 + (level * 0.25), 1, 10) //GS13 EDIT, original level mult 0.125 From 4800f35a3aeb0570fd168b881f0655f2098631d7 Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:54:18 -0400 Subject: [PATCH 8/9] Update traits.dm --- GainStation13/code/datums/traits.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/GainStation13/code/datums/traits.dm b/GainStation13/code/datums/traits.dm index 8f4877fc8f..7196ca9423 100644 --- a/GainStation13/code/datums/traits.dm +++ b/GainStation13/code/datums/traits.dm @@ -57,3 +57,20 @@ /datum/quirk/slimespeaker/remove() var/mob/living/M = quirk_holder M?.remove_language(/datum/language/slime) + +/datum/quirk/SpawnWithWheelchair + name = "Mobility Assistance" + desc = "After your last failed fitness test, you were advised to start using a hoverchair" + +/datum/quirk/SpawnWithWheelchair/on_spawn() + if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. + quirk_holder.buckled.unbuckle_mob(quirk_holder) + + var/turf/T = get_turf(quirk_holder) + var/obj/structure/chair/spawn_chair = locate() in T + + var/obj/vehicle/ridden/wheelchair/wheels = new(T) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) + + wheels.buckle_mob(quirk_holder) From 2b19d9084f981a3f48c6c3c1d1d7abb75403483d Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Tue, 15 Oct 2024 01:07:10 -0400 Subject: [PATCH 9/9] needed emote --- GainStation13/code/mobs/emote.dm | 20 ++++++++++++++++---- GainStation13/sound/voice/cackle_yeen.ogg | Bin 0 -> 15563 bytes code/game/machinery/quantum_pad.dm | 2 +- tgstation.dme | 1 + 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 GainStation13/sound/voice/cackle_yeen.ogg diff --git a/GainStation13/code/mobs/emote.dm b/GainStation13/code/mobs/emote.dm index 647908b79e..2fa204ac0c 100644 --- a/GainStation13/code/mobs/emote.dm +++ b/GainStation13/code/mobs/emote.dm @@ -1,7 +1,3 @@ -/datum/emote/proc/get_sound(mob/living/user) - return sound //by default just return this var. - - /datum/emote/speen key = "speen" key_third_person = "speeeeens!" @@ -31,3 +27,19 @@ playsound(user, 'GainStation13/sound/voice/speen.ogg', 50, 1, -1) . = ..() + +/datum/emote/living/cackle + key = "cackle" + key_third_person = "cackles" + message = "cackles hysterically!" + emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + +/datum/emote/living/cackle/run_emote(mob/living/user, params) + if(ishuman(user)) + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'GainStation13/sound/voice//cackle_yeen.ogg', 50, 1, -1) + . = ..() diff --git a/GainStation13/sound/voice/cackle_yeen.ogg b/GainStation13/sound/voice/cackle_yeen.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8d76cda277e71a2dac2fe1d7a896f731dacf2184 GIT binary patch literal 15563 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

    LQ!7*0sKxE~3m*yh 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 M>*1`21VEVo5Bh7iuK)l5 literal 0 HcmV?d00001 diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 1ae2692da9..1eeec0fd74 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -139,7 +139,7 @@ to_chat(user, "[src] is unpowered!") teleporting = FALSE return - if(!target_pad || QDELETED(target_pad) || (needs_power && (target_pad.machine_stat & NOPOWER))) // GS13 EDIT + if(!target_pad || QDELETED(target_pad) || (target_pad.needs_power && (target_pad.machine_stat & NOPOWER))) // GS13 EDIT to_chat(user, "Linked pad is not responding to ping. Teleport aborted.") teleporting = FALSE return diff --git a/tgstation.dme b/tgstation.dme index b2eadc6988..6472c5205a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3968,6 +3968,7 @@ #include "GainStation13\code\mechanics\den abductors\purchaseble_goodies.dm" #include "GainStation13\code\mobs\cakegolem.dm" #include "GainStation13\code\mobs\chocoslime.dm" +#include "GainStation13\code\mobs\emote.dm" #include "GainStation13\code\mobs\races\caloritegolem.dm" #include "GainStation13\code\modules\arousal\arousal.dm" #include "GainStation13\code\modules\cargo\packs.dm"