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"