From 0f791e3a45b2e9fa313e49d5d1db9780ec9e75da Mon Sep 17 00:00:00 2001
From: Alphas00 <154434082+Alphas00@users.noreply.github.com>
Date: Fri, 7 Jun 2024 00:06:27 +0200
Subject: [PATCH] Water Sponge quirk & Fatness Hiding Rework Tweaks
Added the Water Sponge quirk, it makes the user bloat when water is in their system and adds a few extra water-giving interactions to showers, vapors and water applications.
Tweaked fatness hiding, application has been separated from adjust_fatness who now calls it. Breathing also calls for hiders recalculations
---
GainStation13/code/mechanics/fatness.dm | 24 ++++++---
GainStation13/code/mechanics/water_sponge.dm | 51 +++++++++++++++++++
.../code/obj/items/bluespace_belt.dm | 4 +-
code/__DEFINES/traits.dm | 1 +
code/modules/surgery/organs/lungs.dm | 1 +
tgstation.dme | 1 +
6 files changed, 72 insertions(+), 10 deletions(-)
create mode 100644 GainStation13/code/mechanics/water_sponge.dm
diff --git a/GainStation13/code/mechanics/fatness.dm b/GainStation13/code/mechanics/fatness.dm
index c41a0c5c..7cbb51a3 100644
--- a/GainStation13/code/mechanics/fatness.dm
+++ b/GainStation13/code/mechanics/fatness.dm
@@ -42,14 +42,9 @@
if(client?.prefs?.max_weight) // GS13
fatness_real = min(fatness_real, (client?.prefs?.max_weight - 1))
- if(fat_hiders) //If a character's real fatness is being hidden
- var/fatness_over = hiders_calc() //calculate the sum of all hiders
- if(client?.prefs?.max_weight) //Check their prefs
- fatness_over = min(fatness_over, (client?.prefs?.max_weight - 1)) //And make sure it's not above their preferred max
+ fatness = fatness_real //Make their current fatness their real fatness
- fatness = fatness_real + fatness_over //Then, make their current fatness the sum of their real plus/minus the calculated amount
- else //If it's not being hidden
- fatness = fatness_real //Make their current fatness their real fatness
+ hiders_apply() //Check and apply hiders
if(client?.prefs?.weight_gain_extreme)
xwg_resize()
@@ -122,7 +117,7 @@
/mob/living/carbon/proc/hiders_calc()
var/hiders_value = 0
- for(var/hider in fat_hiders)
+ for(var/hider in fat_hiders)
var/hide_values = hider:fat_hide(src)
if(!islist(hide_values))
hiders_value += hide_values
@@ -131,6 +126,15 @@
hiders_value += hide_value
return hiders_value
+/mob/living/carbon/proc/hiders_apply()
+ if(fat_hiders) //do we have any hiders active?
+ var/fatness_over = hiders_calc() //calculate the sum of all hiders
+ if(client?.prefs?.max_weight) //Check their prefs
+ fatness_over = min(fatness_over, (client?.prefs?.max_weight - 1)) //And make sure it's not above their preferred max
+ fatness = fatness_real + fatness_over //Then, make their current fatness the sum of their real plus/minus the calculated amount
+ if(client?.prefs?.weight_gain_extreme)
+ xwg_resize()
+
/mob/living/carbon/proc/xwg_resize()
var/xwg_size = sqrt(fatness/FATNESS_LEVEL_BLOB)
xwg_size = min(xwg_size, RESIZE_HUGE)
@@ -158,3 +162,7 @@
return "Immobile"
return "Blob"
+
+/mob/living/carbon/human/handle_breathing(times_fired)
+ . = ..()
+ hiders_apply()
diff --git a/GainStation13/code/mechanics/water_sponge.dm b/GainStation13/code/mechanics/water_sponge.dm
new file mode 100644
index 00000000..1373a403
--- /dev/null
+++ b/GainStation13/code/mechanics/water_sponge.dm
@@ -0,0 +1,51 @@
+/datum/quirk/water_sponge
+ name = "Water Sponge"
+ desc = "You can hold lots of water in you! Careful with showers!"
+ value = 0 //ERP quirk
+ gain_text = "You feel absorbant."
+ lose_text = "You don't feel absorbant anymore."
+ category = CATEGORY_FOOD
+ mob_trait = TRAIT_WATER_SPONGE
+
+/datum/reagent/water/on_mob_add(mob/living/L, amount)
+ if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.hider_add(src)
+ . = ..()
+
+/datum/reagent/water/on_mob_delete(mob/living/L)
+ if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.hider_remove(src)
+ . = ..()
+
+/datum/reagent/water/reaction_mob(mob/living/M, method, reac_volume)
+ . = ..()
+ if(HAS_TRAIT(M, TRAIT_WATER_SPONGE))
+ if(method == TOUCH)
+ M.reagents.add_reagent(/datum/reagent/water, reac_volume/2)
+ if(method == VAPOR)
+ M.reagents.add_reagent(/datum/reagent/water, reac_volume/3)
+
+
+/datum/reagent/water/proc/fat_hide(mob/living/carbon/user)
+ return volume * 3.5
+
+/obj/machinery/shower/process()
+ ..()
+ for(var/atom/movable/AM in loc)
+ if(iscarbon(AM))
+ if(HAS_TRAIT(AM, TRAIT_WATER_SPONGE))
+ var/mob/living/carbon/L = AM
+ L.reagents.add_reagent(/datum/reagent/water, 3)
+
+/mob/living/carbon/proc/water_check(datum/gas_mixture/breath)
+ var/breath_gases = breath.gases
+ if(breath_gases[/datum/gas/water_vapor])
+ if(HAS_TRAIT(src, TRAIT_WATER_SPONGE))
+ var/H2O_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/water_vapor])
+ reagents.add_reagent(/datum/reagent/water, H2O_pp/10)
+ breath_gases[/datum/gas/water_vapor] -= H2O_pp
+
diff --git a/GainStation13/code/obj/items/bluespace_belt.dm b/GainStation13/code/obj/items/bluespace_belt.dm
index 8095bad5..c551b18e 100644
--- a/GainStation13/code/obj/items/bluespace_belt.dm
+++ b/GainStation13/code/obj/items/bluespace_belt.dm
@@ -15,7 +15,7 @@
return
var/mob/living/carbon/U = user
if(slot == SLOT_BELT)
- to_chat(user, "You put the belt around your waist and your mass begins to shrink...")
+ to_chat(U, "You put the belt around your waist and your mass begins to shrink...")
U.hider_add(src)
else
to_chat(user, "The belt is opened, letting your mass flow out!")
@@ -25,8 +25,8 @@
..()
if(!iscarbon(user))
return
- to_chat(user, "The belt is opened, letting your mass flow out!")
var/mob/living/carbon/U = user
+ to_chat(U, "The belt is opened, letting your mass flow out!")
U.hider_remove(src)
/obj/item/bluespace_belt/proc/fat_hide(var/mob/living/carbon/user)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f513280b..a5ad770e 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -205,6 +205,7 @@
#define TRAIT_STRONGLEGS "strong_legs"
#define TRAIT_WEB_WEAVER "web_weaving"
#define TRAIT_METAL_CRUNCHER "metal_cruncher"
+#define TRAIT_WATER_SPONGE "water_sponge"
//Hyper
#define TRAIT_MACROPHILE "macrophile" //likes the big
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index dd9db207..d644ffa8 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -102,6 +102,7 @@
/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
//TODO: add lung damage = less oxygen gains
+ H.water_check(breath) //GS13 Water Sponge quirk
var/breathModifier = (5-(5*(damage/maxHealth)/2)) //range 2.5 - 5
if((H.status_flags & GODMODE))
return
diff --git a/tgstation.dme b/tgstation.dme
index a21ddae9..80b2bf8f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3097,6 +3097,7 @@
#include "GainStation13\code\mechanics\metal_cruncher.dm"
#include "GainStation13\code\mechanics\spells.dm"
#include "GainStation13\code\mechanics\wand.dm"
+#include "GainStation13\code\mechanics\water_sponge.dm"
#include "GainStation13\code\mechanics\web_weaving.dm"
#include "GainStation13\code\mechanics\den abductors\console.dm"
#include "GainStation13\code\mechanics\den abductors\purchaseble_goodies.dm"