diff --git a/GainStation13/code/mechanics/fatness.dm b/GainStation13/code/mechanics/fatness.dm
new file mode 100644
index 00000000..c31a7fef
--- /dev/null
+++ b/GainStation13/code/mechanics/fatness.dm
@@ -0,0 +1,62 @@
+/mob/living/carbon
+ ///What level of fatness is the parent mob at?
+ var/fatness = 0
+ ///At what rate does the parent mob gain weight? 1 = 100%
+ var/weight_gain_rate = 1
+ //At what rate does the parent mob lose weight? 1 = 100%
+ var/weight_loss_rate = 1
+
+/**
+* Adjusts the fatness level of the parent mob.
+*
+* * adjustment_amount - adjusts how much weight is gained or loss. Positive numbers add weight.
+* * type_of_fattening - what type of fattening is being used. Look at the traits in fatness.dm for valid options.
+*/
+/mob/living/carbon/proc/adjust_fatness(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM)
+ if(!adjustment_amount || !type_of_fattening)
+ return FALSE
+
+ if(!HAS_TRAIT(src, TRAIT_UNIVERSAL_GAINER) && client?.prefs)
+ switch(type_of_fattening)
+ if(FATTENING_TYPE_ITEM)
+ if(!client.prefs.weight_gain_items)
+ return FALSE
+
+ if(FATTENING_TYPE_FOOD)
+ if(!client.prefs.weight_gain_food)
+ return FALSE
+
+ if(FATTENING_TYPE_CHEM)
+ if(!client.prefs.weight_gain_chems)
+ return FALSE
+
+ if(FATTENING_TYPE_WEAPON)
+ if(!client.prefs.weight_gain_weapons)
+ return FALSE
+
+ if(FATTENING_TYPE_MAGIC)
+ if(!client.prefs.weight_gain_magic)
+ return FALSE
+
+ if(FATTENING_TYPE_VIRUS)
+ if(!client.prefs.weight_gain_viruses)
+ return FALSE
+
+ if(FATTENING_TYPE_WEIGHT_LOSS)
+ if(!HAS_TRAIT(src, TRAIT_WEIGHT_LOSS_IMMUNE))
+ return FALSE
+
+ var/amount_to_change = adjustment_amount
+ if(adjustment_amount > 0)
+ amount_to_change = amount_to_change * weight_gain_rate
+ else
+ amount_to_change = amount_to_change * weight_loss_rate
+
+ fatness += amount_to_change
+ fatness = max(fatness, MINIMUM_FATNESS_LEVEL) //It would be a little silly if someone got negative fat.
+ return TRUE
+
+
+/mob/living/carbon/fully_heal(admin_revive)
+ fatness = 0
+ . = ..()
diff --git a/GainStation13/code/modules/client/preferences/preferences.dm b/GainStation13/code/modules/client/preferences/preferences.dm
new file mode 100644
index 00000000..09748049
--- /dev/null
+++ b/GainStation13/code/modules/client/preferences/preferences.dm
@@ -0,0 +1,18 @@
+//GS13 Preferences
+/datum/preferences
+ //Weight Gain Sources
+ ///Weight gain from food
+ var/weight_gain_food = FALSE
+ ///Weight gain from chems
+ var/weight_gain_chems = FALSE
+ ///Weight gain from items
+ var/weight_gain_items = FALSE
+ ///Weight gain from weapons
+ var/weight_gain_weapons = FALSE
+ ///Weight gain from magic
+ var/weight_gain_magic = FALSE
+ ///Weight gain from viruses
+ var/weight_gain_viruses = FALSE
+
+ ///Does the person wish to be involved with non-con weight gain events?
+ var/noncon_weight_gain = FALSE
diff --git a/GainStation13/code/modules/reagents/chemistry/reagents/consumable_reagents.dm b/GainStation13/code/modules/reagents/chemistry/reagents/consumable_reagents.dm
index 28faf8d6..e77d7ed1 100644
--- a/GainStation13/code/modules/reagents/chemistry/reagents/consumable_reagents.dm
+++ b/GainStation13/code/modules/reagents/chemistry/reagents/consumable_reagents.dm
@@ -10,7 +10,5 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/consumable/lipoifier/on_mob_life(mob/living/carbon/M)
- if(M && !HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
- M.fatness = M.fatness + 10
-
+ M.adjust_fatness(10, FATTENING_TYPE_CHEM)
return ..()
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 6f72bd48..8f9ad059 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -517,3 +517,14 @@ GLOBAL_LIST_INIT(lighter_reskins, list(ZIPPO_SKIN_PLAIN = "plain", ZIPPO_SKIN_DA
#define FOURSPACES " "
#define CANT_REENTER_ROUND -1
+
+//GS13 WEIGHT GAIN TYPES
+#define MINIMUM_FATNESS_LEVEL 0
+
+#define FATTENING_TYPE_ITEM "item"
+#define FATTENING_TYPE_FOOD "food"
+#define FATTENING_TYPE_CHEM "chem"
+#define FATTENING_TYPE_WEAPON "weapon"
+#define FATTENING_TYPE_MAGIC "magic"
+#define FATTENING_TYPE_VIRUS "virus"
+#define FATTENING_TYPE_WEIGHT_LOSS "weight_loss"
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 807c9255..3fe39024 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -180,7 +180,6 @@
#define TRAIT_PHOTOGRAPHER "photographer"
#define TRAIT_MUSICIAN "musician"
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
-#define TRAIT_LIPOIFIER_IMMUNE "lipoifier_immune"
#define TRAIT_NYMPHO "nymphomania"
#define TRAIT_DISTANT "headpat_hater"
//#define TRAIT_FLUID_LEAK "leaky_fluids" removed because milk snail trails are not okay
@@ -215,6 +214,11 @@
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
+//GS13
+#define TRAIT_WEIGHT_LOSS_IMMUNE "weight_loss_immune"
+#define TRAIT_UNIVERSAL_GAINER "universal_gainer"
+
+
// common trait sources
#define TRAIT_GENERIC "generic"
#define EYE_DAMAGE "eye_damage"
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index dbeec758..f188c66c 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -291,7 +291,10 @@
/datum/component/mood/proc/hud_click(datum/source, location, control, params, mob/user)
print_mood(user)
-/datum/component/mood/proc/HandleFatness(mob/living/L)
+/datum/component/mood/proc/HandleFatness(mob/living/carbon/L)
+ if(!L)
+ return FALSE
+
switch(L.fatness)
if(FATNESS_LEVEL_FAT to INFINITY)
add_event(null, "fatness", /datum/mood_event/fat)
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 2479d2ab..652a771b 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -42,7 +42,7 @@ Bonus
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
if(!..())
return
- var/mob/living/M = A.affected_mob
+ var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance))
@@ -51,12 +51,9 @@ Bonus
to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
M.overeatduration = max(M.overeatduration - 100, 0)
M.nutrition = max(M.nutrition - 100, 0)
- M.fatness = M.fatness - 30
-
-
+ M.adjust_fatness(-30, FATTENING_TYPE_WEIGHT_LOSS)
/datum/symptom/weight_gain
-
name = "Weight Gain"
desc = "The virus mutates and merges itself with the host's adipocytes, allowing them to perform a form of mitosis and replicate on their own."
stealth = -3
@@ -77,9 +74,9 @@ Bonus
/datum/symptom/weight_gain/Activate(datum/disease/advance/A)
if(!..())
return
- var/mob/living/M = A.affected_mob
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
- return
+ var/mob/living/carbon/M = A.affected_mob
+ if(!(M?.client?.prefs?.weight_gain_viruses))
+ return FALSE
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance))
@@ -87,8 +84,8 @@ Bonus
else
to_chat(M, "[pick("You feel your body churn...", "You feel heavier...", "You hear an ominous gurgle from your belly...", "You feel bulkier...")]")
if(A.properties["transmittable"] >= 12) //get chunkier quicker
- M.fatness = M.fatness + 70
+ M.adjust_fatness(70, FATTENING_TYPE_VIRUS)
else if(A.properties["transmittable"] >= 7)
- M.fatness = M.fatness + 40
+ M.adjust_fatness(40, FATTENING_TYPE_VIRUS)
else
- M.fatness = M.fatness + 15
+ M.adjust_fatness(15, FATTENING_TYPE_VIRUS)
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index ed3c3643..e025626d 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -127,16 +127,6 @@
lose_text = "You don't feel as prudish as before."
medical_record_text = "Patient exhibits a special gene that makes them immune to Crocin and Hexacrocin."
-/datum/quirk/lipoifier_immunity
- name = "Lipoifier Immunity"
- desc = "Your body is mostly immune to widening properties of Lipoifier chemical and its cheaper alternative: corn oil."
- mob_trait = TRAIT_LIPOIFIER_IMMUNE
- value = 0
- category = CATEGORY_SEXUAL
- gain_text = "You feel less prone to sudden weight gain."
- lose_text = "You don't feel that resistant to gaining sudden weight anymore."
- medical_record_text = "Patient exhibits a special gene that makes them immune to Lipoifier and Corn Oil."
-
/datum/quirk/assblastusa
name = "Buns of Steel"
desc = "You've never skipped ass day. With this trait, you are completely immune to all forms of ass slapping and anyone who tries to slap your rock hard ass usually gets a broken hand."
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 52267774..cd5083d5 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -279,10 +279,7 @@
if(world.time > last_event+15)
active = 1
for(var/mob/living/carbon/human/M in orange(3,src))
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
- return
- else
- M.fatness = M.fatness + 50
+ M.adjust_fatness(50, FATTENING_TYPE_ITEM)
last_event = world.time
active = null
return
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 264967d4..361f7b2d 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -359,57 +359,55 @@
..()
/obj/structure/statue/calorite/fatty/attackby(obj/item/W, mob/living/carbon/M, params)
+ if(!M.adjust_fatness(20, FATTENING_TYPE_ITEM))
+ to_chat(M, "Nothing happens.")
+ return
+
+ if(M.fatness < 200)
+ to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
+ if(HAS_TRAIT(M, TRAIT_FAT))
+ to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
+ if(HAS_TRAIT(M, TRAIT_OBESE))
+ to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
+ if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
+ to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
+ if(HAS_TRAIT(M, TRAIT_IMMOBILE))
+ to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
+ if(HAS_TRAIT(M, TRAIT_BLOB))
+ to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
- to_chat(M, "Nothing happens.")
- else
- M.fatness = M.fatness + 20
- if(M.fatness < 200)
- to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
- if(HAS_TRAIT(M, TRAIT_FAT))
- to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
- if(HAS_TRAIT(M, TRAIT_OBESE))
- to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
- if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
- to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
- if(HAS_TRAIT(M, TRAIT_IMMOBILE))
- to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
- if(HAS_TRAIT(M, TRAIT_BLOB))
- to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
-
/obj/structure/statue/calorite/fatty/attack_hand(mob/living/carbon/M)
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
+ if(!M.adjust_fatness(20, FATTENING_TYPE_ITEM))
to_chat(M, "Nothing happens.")
- else
- M.fatness = M.fatness + 20
- if(M.fatness < 200)
- to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
- if(HAS_TRAIT(M, TRAIT_FAT))
- to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
- if(HAS_TRAIT(M, TRAIT_OBESE))
- to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
- if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
- to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
- if(HAS_TRAIT(M, TRAIT_IMMOBILE))
- to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
- if(HAS_TRAIT(M, TRAIT_BLOB))
- to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
-
+ return
+
+ if(M.fatness < 200)
+ to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
+ if(HAS_TRAIT(M, TRAIT_FAT))
+ to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
+ if(HAS_TRAIT(M, TRAIT_OBESE))
+ to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
+ if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
+ to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
+ if(HAS_TRAIT(M, TRAIT_IMMOBILE))
+ to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
+ if(HAS_TRAIT(M, TRAIT_BLOB))
+ to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
+
/obj/structure/statue/calorite/fatty/attack_paw(mob/living/carbon/M)
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
+ if(!M.adjust_fatness(20, FATTENING_TYPE_ITEM))
to_chat(M, "Nothing happens.")
- else
- M.fatness = M.fatness + 20
- if(M.fatness < 200)
- to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
- if(HAS_TRAIT(M, TRAIT_FAT))
- to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
- if(HAS_TRAIT(M, TRAIT_OBESE))
- to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
- if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
- to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
- if(HAS_TRAIT(M, TRAIT_IMMOBILE))
- to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
- if(HAS_TRAIT(M, TRAIT_BLOB))
- to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
-
\ No newline at end of file
+ return
+
+ if(M.fatness < 200)
+ to_chat(M, "The moment your hand meets the statue, you feel a little warmer...")
+ if(HAS_TRAIT(M, TRAIT_FAT))
+ to_chat(M, "Upon each poke of the statue, you feel yourself get a little heavier.")
+ if(HAS_TRAIT(M, TRAIT_OBESE))
+ to_chat(M, "With each touch you keep getting fatter... But the fatter you grow, the more enticed you feel to poke the statue.")
+ if(HAS_TRAIT(M, TRAIT_MORBIDLYOBESE))
+ to_chat(M, "The world around you blurs as you focus on prodding the statue, your waistline widening further...")
+ if(HAS_TRAIT(M, TRAIT_IMMOBILE))
+ to_chat(M, "A whispering voice gently compliments your massive body, your own mind begging to touch the statue more.")
+ if(HAS_TRAIT(M, TRAIT_BLOB))
+ to_chat(M, "You can barely reach the statue past your floor-covering stomach! And yet, it still calls to you...")
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index 5e2844a2..6ecec3dc 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -218,10 +218,10 @@
var/fat_to_add = 50
/turf/open/floor/mineral/calorite/Entered(mob/living/carbon/M)
- if(!istype(M, /mob/living/carbon) || HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
+ if(!istype(M, /mob/living/carbon))
return FALSE
else
- M.fatness = M.fatness + fat_to_add
+ M.adjust_fatness(fat_to_add, FATTENING_TYPE_ITEM)
// calorite floor, disguised version - GS13
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index d96d68d9..436648ca 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -55,10 +55,7 @@
if(world.time > last_event+15)
active = 1
for(var/mob/living/carbon/human/M in orange(3,src))
- if(HAS_TRAIT(M, TRAIT_LIPOIFIER_IMMUNE))
- return
- else
- M.fatness = M.fatness + 50
+ M.adjust_fatness(50, FATTENING_TYPE_ITEM)
last_event = world.time
active = null
return
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 700bdb76..1493274d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1018,6 +1018,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
"
if (user && user.client && !user.client.prefs.screenshake==0)
dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
"
+ //GS13 stuff goes here
+ dat += "