diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 7dbc8d279fc7..5f3fd5ff2f01 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -290,7 +290,11 @@
//used because it's more reliable than checking for the component
#define TRAIT_DULLAHAN "dullahan"
-#define TRAIT_AKIMBO "akimbo"
+#define TRAIT_AKIMBO "akimbo" // BLUEMOON ADDITION
+#define TRAIT_FLUID "fluid" // BLUEMOON ADDITION
+#define TRAIT_FLUID_TITS "fluid_tits" // BLUEMOON ADDITION
+#define TRAIT_FLUID_WOMB "fluid_womb" // BLUEMOON ADDITION
+#define TRAIT_FLUID_PENIS "fluid_penis" // BLUEMOON ADDITION
// mobility flag traits
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 97f301a05f6e..e48725a0954b 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -172,6 +172,9 @@
HandleNutrition(owner)
HandleThirst(owner)
+ if(HAS_TRAIT(owner, TRAIT_FLUID))
+ HandleFluid(owner) // BLUEMOON ADDITION
+
/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions.
var/mob/living/master = parent
diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm
index d62c6554c774..f695465dc88f 100644
--- a/code/modules/arousal/arousal.dm
+++ b/code/modules/arousal/arousal.dm
@@ -91,6 +91,7 @@
if(condomning)
to_chat(src, "Ты чувствуешь, как презерватив наполняется изнутри твоей спермой!")
R.trans_to(condomning, R.total_volume)
+ sender.fluid_volume = 0
else
if(spill && R.total_volume > 0)
var/turf/location = get_turf(target)
@@ -99,12 +100,14 @@
if(istype(sender, /obj/item/organ/genital/penis))
if(S)
if(R.trans_to(S, R.total_volume))
+ sender.fluid_volume = 0
S.blood_DNA |= get_blood_dna_list()
S.update_icon()
return
else
var/obj/effect/decal/cleanable/semendrip/drip = (locate(/obj/effect/decal/cleanable/semendrip) in location) || new(location)
if(R.trans_to(drip, R.total_volume))
+ sender.fluid_volume = 0
drip.blood_DNA |= get_blood_dna_list()
drip.update_icon()
if(drip.reagents.total_volume >= 10)
@@ -117,12 +120,14 @@
if(istype(sender, /obj/item/organ/genital/vagina))
if(F)
if(R.trans_to(F, R.total_volume))
+ sender.fluid_volume = 0
F.blood_DNA |= get_blood_dna_list()
F.update_icon()
return
else
F = new(location)
if(R.trans_to(F, R.total_volume))
+ sender.fluid_volume = 0
F.blood_DNA |= get_blood_dna_list()
F.update_icon()
return
@@ -139,6 +144,7 @@
if(copy.total_volume > 0)
cummed_on.apply_status_effect(STATUS_EFFECT_DRIPPING_CUM, copy, get_blood_dna_list(), receiver)
R.trans_to(target, amount_to_transfer, log = TRUE)
+ sender.fluid_volume = 0
//
sender.last_orgasmed = world.time
R.clear_reagents()
diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm
index eda8b37ee4dc..03098271b486 100644
--- a/code/modules/arousal/genitals.dm
+++ b/code/modules/arousal/genitals.dm
@@ -12,7 +12,7 @@
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
- var/fluid_max_volume = 50
+ var/fluid_max_volume = 100 // BLUEMOON EDIT || 50 to 100
var/fluid_efficiency = 1
var/fluid_rate = CUM_RATE
var/fluid_mult = 1
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 11b6dd895af5..c43718e844ef 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -524,6 +524,17 @@ BLUEMOON - mechanical_erp_verbs_examine - REMOVAL END*/
if (!isnull(trait_exam))
msg += trait_exam
+ if(HAS_TRAIT(user, TRAIT_FLUID))
+ if(HAS_TRAIT(user, TRAIT_FLUID_TITS))
+ if(breasts_fluid_leak_examine != null)
+ . += breasts_fluid_leak_examine
+ if(HAS_TRAIT(user, TRAIT_FLUID_PENIS))
+ if(penis_fluid_leak_examine != null)
+ . += penis_fluid_leak_examine
+ if(HAS_TRAIT(user, TRAIT_FLUID_WOMB))
+ if(womb_fluid_leak_examine != null)
+ . += womb_fluid_leak_examine
+
var/scar_severity = 0
for(var/i in all_scars)
var/datum/scar/S = i
diff --git a/modular_bluemoon/SmiLeY/code/serverside/pronouns_ru.dm b/modular_bluemoon/SmiLeY/code/serverside/pronouns_ru.dm
index 040fcd47181d..f39fc277281f 100644
--- a/modular_bluemoon/SmiLeY/code/serverside/pronouns_ru.dm
+++ b/modular_bluemoon/SmiLeY/code/serverside/pronouns_ru.dm
@@ -42,6 +42,8 @@
/datum/proc/ru_aya_oy(temp_gender)
. = "ой"
+/datum/proc/ru_oy_im(temp_gender)
+ . = "ым"
//like clients, which do have gender.
/client/ru_who(capitalized, temp_gender)
@@ -128,6 +130,18 @@
if(capitalized)
. = capitalize(.)
+/atom/ru_oy_im(capitalized, temp_gender) // Я чувствую себя свободн(ым/ой)
+ if(!temp_gender)
+ temp_gender = gender
+ . = "ым"
+ switch(temp_gender)
+ if(FEMALE)
+ . = "ой"
+ if(MALE)
+ . = "ым"
+ if(capitalized)
+ . = capitalize(.)
+
//mobs(and atoms but atoms don't really matter write your own proc overrides) also have gender!
/atom/ru_who(capitalized, temp_gender)
if(!temp_gender)
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/_limits.dm b/modular_bluemoon/krashly/code/modules/sexfluids_limits/_limits.dm
new file mode 100644
index 000000000000..bc05f30a3dd3
--- /dev/null
+++ b/modular_bluemoon/krashly/code/modules/sexfluids_limits/_limits.dm
@@ -0,0 +1,12 @@
+#define MAX_FLUID 300
+#define VERY_CLOSE_FLUID 280
+#define CLOSE_FLUID 200
+#define MEDIUM_FLUID 150
+#define MIN_FLUID 0
+
+#define MIN_FLUID_SPAWN 100
+#define MAX_FLUID_SPAWN 200
+
+#define HAS_NO_FLUID_COUNT 1
+#define MEDIUM_FLUID_COUNT 2
+#define OVERCHARGED_FLUID_COUNT 3
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/effects.dm b/modular_bluemoon/krashly/code/modules/sexfluids_limits/effects.dm
new file mode 100644
index 000000000000..6150b1d3b05f
--- /dev/null
+++ b/modular_bluemoon/krashly/code/modules/sexfluids_limits/effects.dm
@@ -0,0 +1,101 @@
+/obj/effect/decal/cleanable/fluidrip
+ name = "fluid"
+ density = 0
+ layer = ABOVE_NORMAL_TURF_LAYER
+ icon = 'modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/drips.dmi'
+ icon_state = "drip1"
+ random_icon_states = list("drip1", "drip2", "drip3", "drip4", "drip5")
+
+/obj/effect/decal/cleanable/fluidrip/replace_decal(obj/effect/decal/cleanable/fluidrip/C)
+ . = ..()
+ if(!. || QDELETED(src))
+ return FALSE
+ var/obj/effect/decal/cleanable/fluid/S = (locate(/obj/effect/decal/cleanable/fluid) in C.loc)
+ if(S) // Merge ourselves into this puddle.
+ reagents.trans_to(S, reagents.total_volume)
+ S.transfer_blood_dna(blood_DNA)
+ update_icon()
+ return TRUE
+ reagents.trans_to(C, reagents.total_volume)
+ C.transfer_blood_dna(blood_DNA)
+ if(C.reagents.total_volume >= 10) // Turn the drip into a puddle.
+ S = new(C.loc)
+ C.reagents.trans_to(S, C.reagents.total_volume)
+ C.transfer_blood_dna(S.blood_DNA)
+ S.update_icon()
+ qdel(C)
+ update_icon()
+
+/obj/effect/decal/cleanable/fluidrip/update_icon()
+ . = ..()
+ add_atom_colour(mix_color_from_reagents(reagents.reagent_list), FIXED_COLOUR_PRIORITY)
+
+///
+
+/obj/effect/decal/cleanable/fluid
+ name = "fluid"
+ desc = null
+ gender = PLURAL
+ density = 0
+ layer = ABOVE_NORMAL_TURF_LAYER
+ icon = 'modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/drips.dmi'
+ icon_state = "pool"
+
+/obj/effect/decal/cleanable/fluid/Initialize(mapload)
+ . = ..()
+ dir = GLOB.cardinals
+ if(mapload)
+ reagents.add_reagent(/datum/reagent/consumable/fluid, 10)
+ add_blood_DNA(list("Non-human DNA" = "A+"))
+ update_icon()
+
+/obj/effect/decal/cleanable/fluid/replace_decal(obj/effect/decal/cleanable/fluid/S)
+ if(reagents.total_volume > 0)
+ reagents.trans_to(S.reagents, reagents.total_volume)
+ if(blood_DNA)
+ S.blood_DNA |= blood_DNA
+ S.update_icon()
+ return ..()
+
+/obj/effect/decal/cleanable/fluid/update_icon()
+ . = ..()
+ if(QDELETED(src) || !reagents)
+ return
+ add_atom_colour(mix_color_from_reagents(reagents.reagent_list), FIXED_COLOUR_PRIORITY)
+
+///
+
+/datum/reagent/consumable/fluid
+ name = "Fluid"
+ description = "Fluid from some animal. Useless for anything but insemination, really."
+ taste_description = "something salty"
+ taste_mult = 2 //Not very overpowering flavor
+ data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
+ reagent_state = LIQUID
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ can_synth = FALSE
+ // you know i wouldn't
+ // boiling_point = T0C + 100
+ nutriment_factor = 0.5 * REAGENTS_METABOLISM
+ var/decal_path = /obj/effect/decal/cleanable/fluid
+
+/datum/reagent/consumable/fluid/reaction_turf(turf/location, reac_volume)
+ ..()
+ if(!istype(location))
+ return
+
+ var/obj/effect/decal/cleanable/fluid/S = locate(/obj/effect/decal/cleanable/fluid) in location
+ if(S)
+ if(S.reagents.add_reagent(type, volume, data))
+ S.update_icon()
+ return
+
+ var/obj/effect/decal/cleanable/fluidrip/drip = (locate(/obj/effect/decal/cleanable/fluidrip) in location) || new(location)
+ if(drip.reagents.add_reagent(type, volume, data))
+ drip.update_icon()
+ if(drip.reagents.total_volume >= 10)
+ S = new(location)
+ drip.reagents.trans_to(S, drip.reagents.total_volume)
+ S.update_icon()
+ qdel(drip)
+ return
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/drips.dmi b/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/drips.dmi
new file mode 100644
index 000000000000..c4ce75e33d74
Binary files /dev/null and b/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/drips.dmi differ
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/overlay.dmi b/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/overlay.dmi
new file mode 100644
index 000000000000..725a1ab4ecad
Binary files /dev/null and b/modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/overlay.dmi differ
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/moods.dm b/modular_bluemoon/krashly/code/modules/sexfluids_limits/moods.dm
new file mode 100644
index 000000000000..e06a6f971029
--- /dev/null
+++ b/modular_bluemoon/krashly/code/modules/sexfluids_limits/moods.dm
@@ -0,0 +1,246 @@
+// ░░░░░░░░░░░░▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄
+// ░░░█░░░░▄▀█▀▀▄░░▀▀▀▄░░░░▐█░░░░░░░░░▄▀█▀▀▄░░░▀█▄
+// ░░█░░░░▀░▐▌░░▐▌░░░░░▀░░░▐█░░░░░░░░▀░▐▌░░▐▌░░░░█▀
+// ░▐▌░░░░░░░▀▄▄▀░░░░░░░░░░▐█▄▄░░░░░░░░░▀▄▄▀░░░░░▐▌
+// ░█░░░░░░░░░░░░░░░░░░░░░░░░░▀█░░░░░░░░░░░░░░░░░░█
+
+// ⠄⠄⣿⣿⣿⣿⠘⡿⢛⣿⣿⣿⣿⣿⣧⢻⣿⣿⠃⠸⣿⣿⣿⠄⠄⠄⠄⠄
+// ⠄⠄⣿⣿⣿⣿⢀⠼⣛⣛⣭⢭⣟⣛⣛⣛⠿⠿⢆⡠⢿⣿⣿⠄⠄⠄⠄⠄
+// ⠄⠄⠸⣿⣿⢣⢶⣟⣿⣖⣿⣷⣻⣮⡿⣽⣿⣻⣖⣶⣤⣭⡉⠄⠄⠄⠄⠄
+// ⠄⠄⠄⢹⠣⣛⣣⣭⣭⣭⣁⡛⠻⢽⣿⣿⣿⣿⢻⣿⣿⣿⣽⡧⡄⠄⠄⠄
+// ⠄⠄⠄⠄⣼⣿⣿⣿⣿⣿⣿⣿⣿⣶⣌⡛⢿⣽⢘⣿⣷⣿⡻⠏⣛⣀⠄⠄
+// ⠄⠄⠄⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠙⡅⣿⠚⣡⣴⣿⣿⣿⡆⠄
+// ⠄⠄⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠄⣱⣾⣿⣿⣿⣿⣿⣿⠄
+// ⠄⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⠄
+// ⠄⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠣⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄
+// ⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠑⣿⣮⣝⣛⠿⠿⣿⣿⣿⣿⠄
+// ⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⠄⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠄
+
+// ⠄⠄⠄⠄⠄⡇⠄⠄⠄⠄⠄⢠⡀⠄⠄⢀⡬⠛⠁⠄⠄⠄⠄⠄⠄⠄⠉⠻⣿⣿⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣧⠄⠄⠙⢦
+// ⠄⠄⠄⠄⠄⡇⠄⠄⠄⠄⢰⠼⠙⢀⡴⠋⠄⠄⠄⠄⠄⠄⠄⠄⠄⡠⠖⠄⠄⠙⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣀⡀⠄⠄⠄⡀
+// ⠄⠄⠄⠄⠄⡇⠄⠄⠄⠄⠄⠄⡴⠋⠄⠄⠄⠄⠄⠄⠄⠄⠄⢠⠞⠄⠄⠄⠄⠄⠄⠄⠄⠄⠉⠉⠉⠙⠋⠙⠋⠙⠻⠦⠤⣤⣼⣆⣀⣀⣀⣀⡀
+// ⠄⠄⠄⠄⠄⢷⠄⠄⠄⠄⢠⠞⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⡰⠃⡄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠉⠉⠉
+// ⠄⠄⠄⠄⠄⢸⡀⠄⠄⢠⠏⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣰⠁⣸⠁⠄⠄⠄⠄⠄⠄⠄⠄⢀⠄⠄⡄
+// ⠄⠄⠄⠄⠄⢀⣧⠄⢠⠏⠄⠄⠄⠄⠄⠄⠄⠄⠄⢀⢾⠃⡜⡿⠄⠄⠄⠄⠄⠄⠄⠄⣠⠋⢀⣼⠁⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠸⢾⣀⣠
+// ⠄⠄⠄⢀⣠⢌⣦⢀⡏⠄⡄⠄⠄⢠⠃⠄⠄⠐⣶⡁⡞⡼⠄⣇⠄⠄⠄⠄⠄⠄⠄⡴⠁⢠⠎⢸⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⢈⠝⠁
+// ⠄⢀⠞⠉⠄⠄⠹⡼⠄⣼⠁⠄⠄⡏⠄⠄⢀⡞⠄⠈⣷⠇⠄⢻⠄⠄⠄⠄⠄⢐⣞⣀⣰⣃⣀⣸⠄⢀⠇⠄⠄⠄⠄⠄⠄⠄⠄⠄⠁⠄⠄⠄⠄⠄⢀
+// ⢰⠋⠄⠄⠄⠄⢀⡇⢠⡏⠄⠄⢸⠄⠄⢀⠎⠄⠄⠄⡇⠄⠄⢸⡀⠄⠄⠄⢠⢾⢁⡜⠁⠄⠄⢸⠄⣸⠄⠄⠄⠄⠄⠄⡀⠄⠄⠄⠄⠄⠄⠄⢀⡴⠃
+// ⡞⠄⠄⠄⠄⠄⢸⠄⡞⡷⠄⠄⡟⠄⢘⡟⠛⠷⠶⣤⣅⠄⠄⠄⣇⠄⠄⢠⠋⡧⠊⠄⠄⠄⠄⢸⢀⠇⠄⠄⠄⠄⠄⢰⠁⠄⠄⠄⠄⠄⢀⡴⠋
+// ⢹⠄⠄⠄⠄⠄⡾⢰⠃⡇⠄⠄⡇⠄⡜⢀⣠⣤⠶⠞⠛⠁⠄⠄⠘⡄⡰⠃⠘⠱⣾⣟⡛⠛⠛⠛⡟⠂⠄⠄⠄⠄⠄⡎⠄⠄⠄⠄⣀⠴⡋
+// ⠈⢳⠄⠄⠄⠄⡇⡼⠄⢻⠄⢠⡇⢸⠁⠈⠁⠄⠄⠄⠄⠄⠄⠄⠄⠈⠁⠄⠄⠄⠄⠙⠿⣶⣄⡰⠇⠄⠄⠄⠄⠄⡼⠄⠄⠄⡠⢾⣿⣆⢳
+// ⣀⣬⠿⠷⠦⠤⣷⣇⡠⠾⡄⢸⣇⢸⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⢹⠛⠂⠄⠄⠄⠄⣰⠁⠄⣀⣬⣷⠞⠛⠙⠛⢧⣤⣀
+// ⠉⠄⠄⠄⠄⠄⢻⠄⠄⠄⢧⢸⢸⠘⡇⠄⠄⠄⠄⠄⠄⠄⠄⣠⠄⠄⠄⠄⠄⠄⠄⠄⠄⢠⠃⠄⠄⠄⠄⠄⣰⠃⣶⢉⠜⠋⠄⠄⠄⠄⠄⠄⠄⠈⢳
+// ⠄⠄⠄⢀⣤⡀⢸⠄⠄⠄⠈⢿⠄⠄⣿⣆⠄⠄⠄⠄⠄⠄⠄⡟⣧⠄⠄⠄⠄⠄⠄⠄⡴⠃⠄⠄⠄⡠⠊⡰⡗⠋⡰⡼⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⢨
+// ⠄⢀⡔⠉⠄⠙⢦⠄⠄⠄⠄⢸⡀⢰⡏⠈⠳⣄⠄⠄⠄⠄⠄⠉⠁⠄⠄⠄⠄⠄⢀⡞⠁⠄⢀⣤⠎⠄⡔⣡⠃⢰⡇⣹⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⢼
+// ⣰⠋⠄⢀⣴⣖⠒⠓⡆⠄⠄⠈⣇⣿⣿⠄⢸⠹⡷⢄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣠⠋⠄⢀⣴⣿⠏⠠⠊⣴⡏⢠⢻⡇⢹⡆⠄⠄⠄⠄⠄⣷⠄⠄⣰⠋
+// ⡇⠄⣰⣿⣿⣿⠒⠋⣛⣄⠄⠄⣹⢸⠈⢧⠸⡄⠹⣄⠙⠶⢶⣶⣶⣶⣶⡶⢾⠃⠄⡴⢋⡾⠋⣀⡴⣞⡝⡰⠃⠄⡇⡸⠉⠳⣄⣀⣀⣀⣿⣦⠞⠁
+// ⢷⢰⣿⣿⣿⣿⠄⠈⠁⠈⡇⠄⡏⢸⠄⠈⠓⢧⣀⣈⣤⡤⠖⠛⠉⠁⠄⢡⠃⢠⡞⠓⠚⠓⠚⣳⡞⠈⠘⠁⠄⠄⢹⡇⠄⠄⠄⠈⠉⠁⠸⣷⣀⣀⣀
+// ⢸⣿⣿⣿⣿⣿⠄⣿⣁⠜⠁⢸⡇⢸⣄⣀⡀⠘⢦⡀⠄⠄⠄⠄⠄⠄⢀⠏⡴⡻⠄⠄⠄⠠⣎⠹⡄⠄⢀⣀⣤⣤⣀⠁⠄⠄⠄⠄⠄⠄⠄⠈⢻⣿⣿
+// ⢸⣿⣿⣿⣿⣿⡇⢸⠄⠄⢀⡴⡇⠈⡇⠈⣩⠗⠒⣵⠆⠄⠄⠄⠄⠄⢸⡞⢰⠃⢀⠄⣀⡰⠟⠒⠒⡿⠉⠄⠄⠄⠈⠑⣄⠄⠄⠄⠄⠄⠄⠄⠈⢿⣿
+// ⣿⣿⣿⣿⣿⣿⣷⠎⠄⢠⠏⠄⠹⣄⢣⢠⠃⠄⠄⢤⠤⠄⠄⠠⠤⢶⡏⠄⡎⢠⠞⠋⠁⠄⠄⠄⣸⠁⠄⠄⠄⠄⠄⠄⠈⣧⠄⠄⠄⠄⠄⠄⠄⠄⠻
+// ⣿⣿⣿⣿⣿⣿⣃⡀⢠⠏⠄⠄⠄⠄⣨⠇⠄⣠⠴⠚⠁⠄⠄⠄⠄⠈⡇⢰⠃⠄⠄⠄⠄⠄⠄⢰⠇⠄⠄⠄⠄⠄⠄⠄⠄⢹⡀
+// ⣿⣿⣿⣿⣿⡿⢉⣇⡎⠄⠄⠄⠄⢰⠇⠄⢨⠇⠄⠄⠄⠄⠄⠄⠄⠄⠘⢾⡀⠄⠄⠄⠄⠄⠄⡞⢀⠄⠄⠄⠄⠄⠄⠄⠄⢸⡇
+
+// ░░░░░░░░░░░░▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄
+// ░░░█░░░░▄▀█▀▀▄░░▀▀▀▄░░░░▐█░░░░░░░░░▄▀█▀▀▄░░░▀█▄
+// ░░█░░░░▀░▐▌░░▐▌░░░░░▀░░░▐█░░░░░░░░▀░▐▌░░▐▌░░░░█▀
+// ░▐▌░░░░░░░▀▄▄▀░░░░░░░░░░▐█▄▄░░░░░░░░░▀▄▄▀░░░░░▐▌
+// ░█░░░░░░░░░░░░░░░░░░░░░░░░░▀█░░░░░░░░░░░░░░░░░░█
+
+/// Муд Ивенты.
+/datum/mood_event/fluid_spustil // АХАХХАХАХА, СПУСТИЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ mood_change = 3
+
+/datum/mood_event/fluid_spustil/add_effects(param)
+ . = ..()
+ var/mob/living/carbon/human/owner_mob = owner_mob()
+ description = "Я чувствую себя свободн[owner_mob.ru_oy_im()] от жидкостей в моем организме.\n"
+
+/datum/mood_event/fluid_charged
+ description = "Я начинаю чувствовать тяжесть.\n"
+ mood_change = -5
+
+/datum/mood_event/fluid_overcharged
+ description = "Я теку!\n"
+ mood_change = -8
+
+/// Оверлей протекших органов.
+/atom/movable/fluid_leak
+ name = ""
+ vis_flags = VIS_INHERIT_ID|VIS_INHERIT_DIR
+ layer = ABOVE_MOB_LAYER
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ icon = 'modular_bluemoon/krashly/code/modules/sexfluids_limits/icons/overlay.dmi'
+ icon_state = "blank"
+
+/// Переменные.
+/obj/item/organ/genital
+ /// Текущее количество жидкости в гениталии.
+ var/fluid_volume = 0
+ /// Цвет жидкости fluid_id.color
+ var/fluid_color = "#000000"
+ /// Обозначаем тут оверлей протекших органов.
+ var/atom/movable/fluid_leak/fluid_leak
+ /// Изначально его "нет".
+ var/icon_state_organ = "blank"
+ /// Т.к. инициализация не работает, придумал такой костыль. Спавнит начальное кол-во жидкости в персонаже.
+ var/is_character_spawned = FALSE
+ /// Имеется ли на одежде оверлей протекших органов?
+ var/has_clothing_liquid_trail = FALSE
+
+/// Описание на кукле, если протекло.
+/mob/living/carbon
+ var/breasts_fluid_leak_examine = null
+ var/penis_fluid_leak_examine = null
+ var/womb_fluid_leak_examine = null
+
+/obj/item/organ/genital/proc/fluid_add() // Прибавление Жидкостей в органе.
+ if(!owner)
+ return
+ if(owner.stat == DEAD)
+ return
+ if(HAS_TRAIT(owner, TRAIT_FLUID))
+ if(!is_character_spawned)
+ fluid_volume = rand(MIN_FLUID_SPAWN, MAX_FLUID_SPAWN)
+ fluid_color = fluid_id?.color
+ is_character_spawned = TRUE
+ if(fluid_id != null)
+ if(fluid_volume < MAX_FLUID)
+ fluid_volume += (fluid_rate*0.05)
+
+/obj/item/organ/genital/proc/get_fluid_number(obj/item/organ/genital/O) // Получаем число от 1 до 3.
+ switch(O.fluid_volume)
+ if(VERY_CLOSE_FLUID to INFINITY)
+ return OVERCHARGED_FLUID_COUNT
+ if(CLOSE_FLUID to VERY_CLOSE_FLUID)
+ return MEDIUM_FLUID_COUNT
+ else
+ return HAS_NO_FLUID_COUNT
+
+/proc/overlay_fluid(mob/living/carbon/owner, obj/item/organ/genital/organ) // Создаём оверлей протечки на одежде и описание персонажа.
+ if(HAS_TRAIT(owner, TRAIT_FLUID_TITS))
+ if(istype(organ, /obj/item/organ/genital/breasts))
+ var/obj/item/organ/genital/breasts/breasts = organ
+ switch(breasts.fluid_volume)
+ if(VERY_CLOSE_FLUID to INFINITY)
+ breasts.icon_state_organ = "breasts_overfluid"
+ if(owner.is_chest_exposed())
+ owner.breasts_fluid_leak_examine = "Грудь [owner] выглядит крайне мокрой!"
+ if(prob(20))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = breasts.fluid_color
+ drip?.reagents.add_reagent(breasts.fluid_id, 1)
+ else
+ owner.breasts_fluid_leak_examine = "Одежда [owner] в районе груди выглядит крайне мокрой!"
+ if(CLOSE_FLUID to VERY_CLOSE_FLUID)
+ breasts.icon_state_organ = "breasts_fluid"
+ if(owner.is_chest_exposed())
+ owner.breasts_fluid_leak_examine = "Грудь [owner] выглядит чутка мокрой."
+ if(prob(5))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = breasts.fluid_color
+ drip?.reagents.add_reagent(breasts.fluid_id, 1)
+ else
+ owner.breasts_fluid_leak_examine = "Одежда [owner] в районе груди выглядит чутка мокрой."
+ else
+ breasts.icon_state_organ = "blank"
+ owner.breasts_fluid_leak_examine = null
+
+ else if(HAS_TRAIT(owner, TRAIT_FLUID_PENIS))
+ if(istype(organ, /obj/item/organ/genital/testicles))
+ var/obj/item/organ/genital/testicles/testicles = organ
+ switch(testicles.fluid_volume)
+ if(VERY_CLOSE_FLUID to INFINITY)
+ testicles.icon_state_organ = "penis_overfluid"
+ if(owner.is_groin_exposed())
+ owner.penis_fluid_leak_examine = "Пенис [owner] выглядит крайне мокрым!"
+ if(prob(20))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = testicles.fluid_color
+ drip?.reagents.add_reagent(testicles.fluid_id, 1)
+ else
+ owner.penis_fluid_leak_examine = "Одежда [owner] в районе паха выглядит крайне мокрой!"
+ if(CLOSE_FLUID to VERY_CLOSE_FLUID)
+ testicles.icon_state_organ = "penis_fluid"
+ if(owner.is_chest_exposed())
+ owner.penis_fluid_leak_examine = "Пенис [owner] выглядит чутка мокрым."
+ if(prob(5))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = testicles.fluid_color
+ drip?.reagents.add_reagent(testicles.fluid_id, 1)
+ else
+ owner.penis_fluid_leak_examine = "Одежда [owner] в районе паха выглядит чутка мокрой."
+ else
+ testicles.icon_state_organ = "blank"
+ owner.penis_fluid_leak_examine = null
+
+ else if(HAS_TRAIT(owner, TRAIT_FLUID_WOMB))
+ if(istype(organ, /obj/item/organ/genital/womb))
+ var/obj/item/organ/genital/womb/vagina = organ
+ switch(vagina.fluid_volume)
+ if(VERY_CLOSE_FLUID to INFINITY)
+ vagina.icon_state_organ = "vagina_overfluid"
+ if(owner.is_groin_exposed())
+ owner.womb_fluid_leak_examine = "Киска [owner] выглядит крайне мокрой!"
+ if(prob(20))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = vagina.fluid_color
+ drip?.reagents.add_reagent(vagina.fluid_id, 1)
+ else
+ owner.womb_fluid_leak_examine = "Одежда [owner] в районе паха выглядит крайне мокрой!"
+ if(CLOSE_FLUID to VERY_CLOSE_FLUID)
+ vagina.icon_state_organ = "vagina_fluid"
+ if(owner.is_chest_exposed())
+ owner.womb_fluid_leak_examine = "Киска [owner] выглядит чутка мокрой."
+ if(prob(5))
+ var/obj/effect/decal/cleanable/fluidrip/drip = new(owner.loc)
+ drip?.color = vagina.fluid_color
+ drip?.reagents.add_reagent(vagina.fluid_id, 1)
+ else
+ owner.womb_fluid_leak_examine = "Одежда [owner] в районе паха выглядит чутка мокрой."
+ else
+ vagina.icon_state_organ = "blank"
+ owner.womb_fluid_leak_examine = null
+ organ.update_icon_fluid()
+
+/obj/item/organ/genital/proc/update_icon_fluid() // Апдейтим иконку оверлея протечки.
+ if(has_clothing_liquid_trail == FALSE)
+ fluid_leak = new(src)
+ owner.vis_contents += fluid_leak
+ has_clothing_liquid_trail = TRUE
+ if(get_fluid_number(src) >= 2)
+ if(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING))
+ if(!owner.is_chest_exposed())
+ var/obj/item/organ/genital/breasts/breasts = src
+ breasts.icon_state_organ = "blank"
+ fluid_leak.update_appearance()
+ if(!owner.is_groin_exposed())
+ var/obj/item/organ/genital/testicles/testicles = src
+ var/obj/item/organ/genital/womb/vagina = src
+ testicles.icon_state_organ = "blank"
+ vagina.icon_state_organ = "blank"
+ fluid_leak.update_appearance()
+ else
+ fluid_leak.icon_state = icon_state_organ
+ fluid_leak.color = fluid_color
+ fluid_leak.update_appearance()
+ else
+ vis_contents -= fluid_leak
+ qdel(fluid_leak)
+ has_clothing_liquid_trail = FALSE
+
+/datum/component/mood/proc/HandleFluid(mob/living/carbon/L)
+ if(!HAS_TRAIT(L, TRAIT_FLUID))
+ return
+ for(var/obj/item/organ/genital/O in L.internal_organs)
+ O.fluid_add()
+ overlay_fluid(L, O)
+ switch(O.fluid_volume)
+ if(VERY_CLOSE_FLUID to INFINITY)
+ add_event(null, "fluid", /datum/mood_event/fluid_overcharged)
+ if(CLOSE_FLUID to VERY_CLOSE_FLUID)
+ add_event(null, "fluid", /datum/mood_event/fluid_charged)
+ if(MEDIUM_FLUID to CLOSE_FLUID)
+ clear_event(null, "fluid")
+ if(MIN_FLUID to MEDIUM_FLUID)
+ add_event(null, "fluid", /datum/mood_event/fluid_spustil)
diff --git a/modular_bluemoon/krashly/code/modules/sexfluids_limits/quirk.dm b/modular_bluemoon/krashly/code/modules/sexfluids_limits/quirk.dm
new file mode 100644
index 000000000000..47079573fe29
--- /dev/null
+++ b/modular_bluemoon/krashly/code/modules/sexfluids_limits/quirk.dm
@@ -0,0 +1,44 @@
+/datum/quirk/fluid_leak_tits
+ name = "Протечка! (Грудь)"
+ desc = "Ваши органы не знают предела в выработке телесных жидкостей, от того ваше грудное молоко или другие жидкости могут протекать!"
+ value = 0
+ mob_trait = TRAIT_FLUID_TITS
+
+/datum/quirk/fluid_leak_tits/add()
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ ADD_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
+
+/datum/quirk/fluid_leak_tits/remove()
+ if(HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID_WOMB || TRAIT_FLUID_PENIS))
+ REMOVE_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
+
+/datum/quirk/fluid_leak_vagina
+ name = "Протечка! (Матка)"
+ desc = "Ваши органы не знают предела в выработке телесных жидкостей, от того ваше грудное молоко или другие жидкости могут протекать!"
+ value = 0
+ mob_trait = TRAIT_FLUID_WOMB
+
+/datum/quirk/fluid_leak_vagina/add()
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ ADD_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
+
+/datum/quirk/fluid_leak_vagina/remove()
+ if(HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID_TITS || TRAIT_FLUID_PENIS))
+ REMOVE_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
+
+/datum/quirk/fluid_leak_penis
+ name = "Протечка! (Яйца(Пенис))"
+ desc = "Ваши органы не знают предела в выработке телесных жидкостей, от того ваше грудное молоко или другие жидкости могут протекать!"
+ value = 0
+ mob_trait = TRAIT_FLUID_PENIS
+
+/datum/quirk/fluid_leak_penis/add()
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ ADD_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
+
+/datum/quirk/fluid_leak_penis/remove()
+ if(HAS_TRAIT(quirk_holder, TRAIT_FLUID))
+ if(!HAS_TRAIT(quirk_holder, TRAIT_FLUID_TITS || TRAIT_FLUID_WOMB))
+ REMOVE_TRAIT(quirk_holder, TRAIT_FLUID, ROUNDSTART_TRAIT)
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm
index 739e2aed1300..a63051ab4521 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm
@@ -33,6 +33,12 @@
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
var/modifier = B?.get_lactation_amount_modifier() || 1
if(B?.fluid_id)
+ if(HAS_TRAIT(target, TRAIT_FLUID)) // BLUEMOON ADDITION START
+ if(B.fluid_volume >= 2)
+ B.fluid_volume -= 2
+ else
+ user_message += ", ничего не вытягивая!"
+ return // BLUEMOON ADDITION END
var/milktype = B?.fluid_id
var/datum/reagent/milk = find_reagent_object_from_type(milktype)
var/milktext = milk.name //So you know what are you drinking. - Gardelin0
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
index facab15c2c0c..98349ab1246d 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
@@ -59,6 +59,9 @@
if(milkers && milktype)
liquid_container.reagents.add_reagent(milktype, rand(1,3 * milkers.get_lactation_amount_modifier()))
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1)
+ if(HAS_TRAIT(user, TRAIT_FLUID)) // BLUEMOON ADDITION START
+ if(milkers.fluid_volume >= 2)
+ milkers.fluid_volume -= 2
else
message += ", но дойка не дает результатов..."
@@ -92,6 +95,9 @@
if(milkers && milktype)
user.reagents.add_reagent(milktype, rand(1,3 * milkers.get_lactation_amount_modifier()) * user.get_fluid_mod(milkers))
+ if(HAS_TRAIT(user, TRAIT_FLUID)) // BLUEMOON ADDITION START
+ if(milkers.fluid_volume >= 2)
+ milkers.fluid_volume -= 2 // BLUEMOON ADDITION END
lines = list(
"подносит соски своих собственных ёмкостей для молока ко рту и начинает их посасывать.",
"делает большой глоток свежего '[lowertext(milktext)]' и громко выдыхает после такого.",
diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm
index 838fa75b9c93..f00b12d1a035 100644
--- a/modular_sand/code/datums/interactions/lewd_definitions.dm
+++ b/modular_sand/code/datums/interactions/lewd_definitions.dm
@@ -774,6 +774,17 @@
if(!message)
message = pick("оргазмирует!", "трясётся в оргазме.", "дрожит от оргазма!", "кончает на себя!")
visible_message(message = span_userlove("\The [src] [message]"), ignored_mobs = get_unconsenting(ignored_mobs = obscure_to))
+// BM ADDITION START - Krashly New Fluid Trait
+ if(istype(last_genital, /obj/item/organ/genital))
+ var/obj/item/organ/genital/P = last_genital
+ if(HAS_TRAIT(src, TRAIT_FLUID))
+ if(istype(P, /obj/item/organ/genital/vagina))
+ var/mob/living/carbon/O = src
+ var/obj/item/organ/genital/womb/J = locate() in O.internal_organs
+ J.fluid_volume = 0
+ else
+ P.fluid_volume = 0
+// BM ADDITION END
multiorgasms += 1
COOLDOWN_START(src, refractory_period, (rand(300, 900) - get_sexual_potency()))//sex cooldown
diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
index bf1c14b1c821..b15560a06ac6 100644
--- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm
+++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
@@ -233,6 +233,11 @@ SPLURT теперь обрабатывают все это дело в /mob/livi
R.mob_climax_silicon(TRUE, "sex", partner, !cumin, target_gen)
set_lust(0)
+ if(istype(last_genital, /obj/item/organ/genital))
+ var/obj/item/organ/genital/P = last_genital
+ if(HAS_TRAIT(src, TRAIT_FLUID)) // BLUEMOON ADDITION
+ P.fluid_volume = 0 // BLUEMOON ADDITION
+
SEND_SIGNAL(src, COMSIG_MOB_POST_CAME, target_orifice, partner, cumin, last_genital)
return TRUE
diff --git a/modular_splurt/code/modules/arousal/arousal.dm b/modular_splurt/code/modules/arousal/arousal.dm
index 466df8ba0d86..41e18aa68949 100644
--- a/modular_splurt/code/modules/arousal/arousal.dm
+++ b/modular_splurt/code/modules/arousal/arousal.dm
@@ -73,6 +73,7 @@
if(locate(/obj/item/genital_equipment/sounding) in bepis.contents)
spill = TRUE
to_chat(src, "Ты чувствуешь, как стержень выталкивается из твоей уретры вместе со струей оргазменной жидкости!")
+ bepis.fluid_volume = 0
var/obj/item/genital_equipment/sounding/rod = locate(/obj/item/genital_equipment/sounding) in bepis.contents
rod.forceMove(get_turf(src))
diff --git a/tgstation.dme b/tgstation.dme
index 7f35e78c19a1..a1e1c38c9b22 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4415,6 +4415,10 @@
#include "modular_bluemoon\krashly\code\modules\mecha\mecha.dm"
#include "modular_bluemoon\krashly\code\modules\mobs\carbon\nucleation\code\nucleation.dm"
#include "modular_bluemoon\krashly\code\modules\mobs\simple\brown_carp.dm"
+#include "modular_bluemoon\krashly\code\modules\sexfluids_limits\_limits.dm"
+#include "modular_bluemoon\krashly\code\modules\sexfluids_limits\effects.dm"
+#include "modular_bluemoon\krashly\code\modules\sexfluids_limits\moods.dm"
+#include "modular_bluemoon\krashly\code\modules\sexfluids_limits\quirk.dm"
#include "modular_bluemoon\krashly\code\uplink\uplink.dm"
#include "modular_bluemoon\krashly\code\uplink\uplink_items.dm"
#include "modular_bluemoon\krashly\modulars\clownfart\code.dm"