diff --git a/GainStation13/code/modules/mob/living/species.dm b/GainStation13/code/modules/mob/living/species.dm
index 10af3bf2ed..ca3e099e30 100644
--- a/GainStation13/code/modules/mob/living/species.dm
+++ b/GainStation13/code/modules/mob/living/species.dm
@@ -216,9 +216,31 @@
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
+/datum/movespeed_modifier/fatness
+ id = "fat"
+ variable = TRUE
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
handle_helplessness(H)
+
+ // update movement speed
+ var/fatness_delay = 0
+ if(H.fatness && !HAS_TRAIT(H, TRAIT_NO_FAT_SLOWDOWN))
+ fatness_delay = (H.fatness / FATNESS_DIVISOR)
+ fatness_delay = min(fatness_delay, FATNESS_MAX_MOVE_PENALTY)
+
+ if(HAS_TRAIT(H, TRAIT_STRONGLEGS))
+ fatness_delay = fatness_delay * FATNESS_STRONGLEGS_MODIFIER
+
+ if(HAS_TRAIT(H, TRAIT_WEAKLEGS))
+ if(H.fatness <= FATNESS_LEVEL_IMMOBILE)
+ fatness_delay += fatness_delay * FATNESS_WEAKLEGS_MODIFIER / 100
+ if(H.fatness > FATNESS_LEVEL_IMMOBILE)
+ fatness_delay += (H.fatness / FATNESS_LEVEL_IMMOBILE) * FATNESS_WEAKLEGS_MODIFIER
+ fatness_delay = min(fatness_delay, 60)
+
+ H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
+
if(HAS_TRAIT(H, TRAIT_BLOB))
handle_fatness_trait(
H,
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 245c39f367..d558b4bdcf 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -64,7 +64,7 @@
#define MILK_EFFICIENCY 1
#define BUTT_SIZE_DEF 1
-#define BUTT_SIZE_MAX 5 //butt genitals are special in that they have caps. if there's the event there's even bigger butt sprites, raise this number.
+#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_MAX 10
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
index 3b4d8d7611..95ca5eaef6 100644
--- a/code/datums/components/edible.dm
+++ b/code/datums/components/edible.dm
@@ -99,10 +99,16 @@ Behavior that's still missing from this component that original food items had t
return
if(!CanConsume(eater, feeder))
return
+
var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+ //GS13 Edit
+ var/mob/living/carbon/human/human_eater = eater
+ if(istype(human_eater))
+ fullness = human_eater.fullness
+
. = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
if(eater == feeder)//If you're eating it yourself.
@@ -112,15 +118,15 @@ Behavior that's still missing from this component that original food items had t
if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
to_chat(eater, "You don't feel like eating any more junk food at the moment!")
return
- else if(fullness <= 50)
+ else if(fullness <= FULLNESS_LEVEL_HALF_FULL)
eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
- else if(fullness > 50 && fullness < 150)
+ else if(fullness > FULLNESS_LEVEL_HALF_FULL && fullness < FULLNESS_LEVEL_FILLED)
eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
- else if(fullness > 150 && fullness < 500)
+ else if(fullness > FULLNESS_LEVEL_FILLED && fullness < FULLNESS_LEVEL_BLOATED)
eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
- else if(fullness > 500 && fullness < 600)
+ else if(fullness > FULLNESS_LEVEL_BLOATED && fullness < FULLNESS_LEVEL_BEEG)
eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
- else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
+ else if(fullness > (FULLNESS_LEVEL_BEEG * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
return
else //If you're feeding it to someone else.
@@ -153,6 +159,13 @@ Behavior that's still missing from this component that original food items had t
if(eater.satiety > -200)
eater.satiety -= junkiness
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ var/mob/living/carbon/human/human_eater = eater
+ if(istype(human_eater))
+ var/bitevolume = 1
+ if(HAS_TRAIT(human_eater, TRAIT_VORACIOUS))
+ bitevolume = bitevolume * 0.67
+ human_eater.fullness += bitevolume;
+
if(owner.reagents.total_volume)
SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder)
var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
diff --git a/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm
index d72c59f9af..33709f6e9e 100644
--- a/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/code/modules/arousal/genitals_sprite_accessories.dm
@@ -126,7 +126,8 @@
//BUTT BE HERE
/datum/sprite_accessory/butt
- icon = 'icons/obj/genitals/butt_onmob.dmi'
+ //icon = 'icons/obj/genitals/butt_onmob.dmi' GS13 EDIT - ASS SPRITES
+ icon = 'hyperstation/icons/obj/genitals/butt.dmi'
icon_state = "butt"
name = "butt"
color_src = "butt_color"
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index a39d374f5e..48b1d65b5a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -113,9 +113,14 @@ All foods are distributed among various categories. Use common sense.
if(!canconsume(M, user))
return FALSE
+ //GS13 EDIT, FULNESS
var/fullness = M.nutrition + 10
- for(var/datum/reagent/consumable/C in M.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
- fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+ //for(var/datum/reagent/consumable/C in M.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
+ // fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+ //GS13 Edit
+ var/mob/living/carbon/human/human_eater = M
+ if(istype(human_eater))
+ fullness = human_eater.fullness
if(M == user) //If you're eating it yourself.
if(junkiness && M.satiety < -150 && M.nutrition > NUTRITION_LEVEL_STARVING + 50 )
@@ -123,18 +128,18 @@ All foods are distributed among various categories. Use common sense.
return FALSE
else if(fullness <= 50)
user.visible_message("[user] hungrily takes a [eatverb] from \the [src], gobbling it down!", "You hungrily take a [eatverb] from \the [src], gobbling it down!")
- else if(fullness > 50 && fullness < 150)
+ else if(fullness > FULLNESS_LEVEL_HALF_FULL && fullness < FULLNESS_LEVEL_FILLED)
user.visible_message("[user] hungrily takes a [eatverb] from \the [src].", "You hungrily take a [eatverb] from \the [src].")
- else if(fullness > 150 && fullness < 500)
+ else if(fullness > FULLNESS_LEVEL_FILLED && fullness < FULLNESS_LEVEL_BLOATED)
user.visible_message("[user] takes a [eatverb] from \the [src].", "You take a [eatverb] from \the [src].")
- else if(fullness > 500 && fullness < 600)
+ else if(fullness > FULLNESS_LEVEL_BLOATED && fullness < FULLNESS_LEVEL_BEEG)
user.visible_message("[user] unwillingly takes a [eatverb] of a bit of \the [src].", "You unwillingly take a [eatverb] of a bit of \the [src].")
- else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
+ else if(fullness > (FULLNESS_LEVEL_BEEG * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!")
return FALSE
else
if(!isbrain(M)) //If you're feeding it to someone else.
- if(fullness <= (600 * (1 + M.overeatduration / 1000)))
+ if(fullness <= (FULLNESS_LEVEL_BEEG * (1 + M.overeatduration / 1000)))
M.visible_message("[user] attempts to feed [M] [src].", \
"[user] attempts to feed [M] [src].")
else
@@ -156,6 +161,12 @@ All foods are distributed among various categories. Use common sense.
if(M.satiety > -200)
M.satiety -= junkiness
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ var/bitevolume = 1
+ if(HAS_TRAIT(M, TRAIT_VORACIOUS))
+ bitevolume = bitevolume * 0.67
+ if(istype(human_eater))
+ human_eater.fullness += bitevolume;
+
if(reagents.total_volume)
SEND_SIGNAL(src, COMSIG_FOOD_EATEN, M, user)
var/fraction = min(bitesize / reagents.total_volume, 1)
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 958a8b599a..fa724556dd 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -118,6 +118,42 @@
if(7 to INFINITY)
msg += "[t_He] [t_is] just absolutely fucked up, you can look again to take a closer look...\n"
+ //GS13 EDIT FAT EXAMINE
+ switch(fullness)
+ if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
+ msg += "[t_He] look[p_s()] like [t_He] ate a bit too much.\n"
+ if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
+ msg += "[t_His] stomach looks very round and very full.\n"
+ if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
+ msg += "[t_His] stomach has been stretched to enormous proportions.\n"
+
+ if(nutrition < NUTRITION_LEVEL_STARVING - 50)
+ msg += "[t_He] [t_is] severely malnourished.\n"
+
+ if(fatness >= FATNESS_LEVEL_BLOB)
+ msg += "[t_He] [t_is] completely engulfed in rolls upon rolls of flab. [t_His] head is poking out on top of [t_His] body, akin to a marble on top of a hill.\n"
+
+ else if(fatness >= FATNESS_LEVEL_IMMOBILE)
+ msg += "[t_His] body is buried in an overflowing surplus of adipose, and [t_His] legs are completely buried beneath layers of meaty, obese flesh.\n"
+
+ else if(fatness >= FATNESS_LEVEL_BARELYMOBILE)
+ msg += "[t_He] [t_is] as wide as [t_He] [t_is] tall, barely able to move [t_His] masssive body that seems to be overtaken with piles of flab.\n"
+
+ else if(fatness >= FATNESS_LEVEL_EXTREMELY_OBESE)
+ msg += "[t_He] [t_is] ripe with numerous rolls of fat, almost all of [t_His] body layered with adipose.\n"
+
+ else if(fatness >= FATNESS_LEVEL_MORBIDLY_OBESE)
+ msg += "[t_He] [t_is] utterly stuffed with abundant lard, [t_He] doesn't seem to be able to move much.\n"
+
+ else if(fatness >= FATNESS_LEVEL_OBESE)
+ msg += "[t_He] [t_is] engorged with fat, [t_His] body laden in rolls of fattened flesh.\n"
+
+ else if(fatness >= FATNESS_LEVEL_VERYFAT)
+ msg += "[t_He] [t_is] pleasantly plushy, [t_His] body gently wobbling whenever they move. \n"
+
+ else if(fatness >= FATNESS_LEVEL_FATTER)
+ msg += "[t_He] [t_is] soft and curvy, [t_His] belly looking like a small pillow.\n"
+
if(msg.len)
. += "[msg.Join("")]"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 68d68f3d92..465b6d768d 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1545,13 +1545,31 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
hunger_rate *= H.physiology.hunger_mod
H.adjust_nutrition(-hunger_rate)
-
+/*
if (H.nutrition > NUTRITION_LEVEL_FULL)
if(H.overeatduration < 600) //capped so people don't take forever to unfat
H.overeatduration++
else
if(H.overeatduration > 1)
H.overeatduration -= 2 //doubled the unfat rate
+*/
+ if (H.nutrition > NUTRITION_LEVEL_FULL)
+ // fatConversionRate is functionally useless. It seems under normal curcumstances, each tick only processes, at most, 1 nutrition anyway. reducing the value has no effect.
+ var/fatConversionRate = 100 //GS13 what percentage of the excess nutrition should go to fat (total nutrition to transfer can't be under 1)
+ var/nutritionThatBecomesFat = max((H.nutrition - NUTRITION_LEVEL_FULL)*(fatConversionRate / 100),1)
+ H.nutrition -= nutritionThatBecomesFat
+ H.adjust_fatness(nutritionThatBecomesFat, FATTENING_TYPE_FOOD)
+ if(H.fullness > FULLNESS_LEVEL_EMPTY)//GS13 stomach-emptying routine
+ var/ticksToEmptyStomach = 20 // GS13 how many ticks it takes to decrease the fullness by 1
+ if(HAS_TRAIT(H, TRAIT_VORACIOUS))
+ ticksToEmptyStomach = ticksToEmptyStomach * 0.5
+ H.fullness -= 1/ticksToEmptyStomach
+ if (H.fullness > FULLNESS_LEVEL_BLOATED) //GS13 overeating depends on fullness now
+ if(H.overeatduration < 5000) //capped so people don't take forever to unfat
+ H.overeatduration++
+ else
+ if(H.overeatduration > 1)
+ H.overeatduration -= 1 //doubled the unfat rate -- GS13 Nah, put it back
//metabolism change
if(H.nutrition > NUTRITION_LEVEL_FAT)
diff --git a/config/entries/fetish_content.txt b/config/entries/fetish_content.txt
index 1bc9ebe968..b3448b3b30 100644
--- a/config/entries/fetish_content.txt
+++ b/config/entries/fetish_content.txt
@@ -14,7 +14,7 @@ PENIS_MAX_INCHES_PREFS 24
## Minimum and maximum limits for butt size from the character creation menu. If there's bigger butt sizes out there, change the max accordingly.
BUTT_MIN_SIZE_PREFS 1
-BUTT_MAX_SIZE_PREFS 5
+BUTT_MAX_SIZE_PREFS 10
## Body size configs, the feature will be disabled if both min and max have the same value.
BODY_SIZE_MIN 0.9
diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi
index 713c0e1804..8f1a153761 100644
Binary files a/hyperstation/icons/obj/genitals/butt.dmi and b/hyperstation/icons/obj/genitals/butt.dmi differ
diff --git a/icons/obj/genitals/butt.dmi b/icons/obj/genitals/butt.dmi
index 304a8424bb..b4726bf8c2 100644
Binary files a/icons/obj/genitals/butt.dmi and b/icons/obj/genitals/butt.dmi differ
diff --git a/tools/build/build.js b/tools/build/build.js
index f8d3a9a7dd..c75a65327a 100755
--- a/tools/build/build.js
+++ b/tools/build/build.js
@@ -61,6 +61,9 @@ export const DmTarget = new Juke.Target({
'html/**',
'icons/**',
'interface/**',
+ 'modular_citadel/**', // GS13 EDIT
+ 'hyperstation/**', // GS13 EDIT
+ 'GainStation13/**', // GS13 EDIT
`${DME_NAME}.dme`,
],
outputs: [