From 7597de2ab86ade38dbb5fadeed4f94b0b0476def Mon Sep 17 00:00:00 2001
From: Alphas00 <154434082+Alphas00@users.noreply.github.com>
Date: Sun, 22 Dec 2024 13:05:34 +0100
Subject: [PATCH] Mobility exoskeleton & modules, max fat genital sizes
Added the mobility exoskeleton, weak MODsuit that comes with mobility-related modules.
Added mobility-related modules
Added preference for max genital sizes due to fat increase
---
GainStation13/code/mechanics/helplessness.dm | 9 +-
GainStation13/code/mechanics/water_sponge.dm | 2 +-
.../code/modules/mob/living/belly.dm | 2 +
.../code/modules/mob/living/species.dm | 65 +++++-
.../code/modules/mod/modules/modules_fat.dm | 215 ++++++++++++++++++
.../mob/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 5241 bytes
.../obj/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 2413 bytes
.../obj/clothing/modsuit/mod_construction.dmi | Bin 0 -> 1046 bytes
.../obj/clothing/modsuit/mod_modules.dmi | Bin 0 -> 1402 bytes
code/__DEFINES/traits.dm | 1 +
code/modules/arousal/organs/breasts.dm | 2 +
code/modules/arousal/organs/butt.dm | 2 +
code/modules/client/preferences.dm | 18 ++
code/modules/client/preferences_savefile.dm | 6 +
.../research/techweb/nodes/mod_nodes.dm | 4 +
tgstation.dme | 1 +
16 files changed, 316 insertions(+), 11 deletions(-)
create mode 100644 GainStation13/code/modules/mod/modules/modules_fat.dm
create mode 100644 GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi
create mode 100644 GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi
create mode 100644 GainStation13/icons/obj/clothing/modsuit/mod_construction.dmi
create mode 100644 GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi
diff --git a/GainStation13/code/mechanics/helplessness.dm b/GainStation13/code/mechanics/helplessness.dm
index cf06e7e09a..317e674744 100644
--- a/GainStation13/code/mechanics/helplessness.dm
+++ b/GainStation13/code/mechanics/helplessness.dm
@@ -5,7 +5,7 @@
return ..()
/datum/species/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self)
- if(HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
+ if(!istype(I, /obj/item/mod) && HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
to_chat(H, "You are too fat to wear anything on your back.")
return FALSE
@@ -13,8 +13,13 @@
to_chat(H, "You are too fat to wear [I].")
return FALSE
- if(HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
+ if(!mod_check(I) && HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
to_chat(H, "You are too fat to wear [I].")
return FALSE
return ..()
+
+/datum/species/proc/mod_check(I)
+ if(istype(I, /obj/item/mod) || istype(I, /obj/item/clothing/head/mod) || istype(I, /obj/item/clothing/gloves/mod) || istype(I, /obj/item/clothing/shoes/mod) || istype(I, /obj/item/clothing/suit/mod) )
+ return TRUE
+ return FALSE
diff --git a/GainStation13/code/mechanics/water_sponge.dm b/GainStation13/code/mechanics/water_sponge.dm
index b3bf8b287d..b43fc4f2c8 100644
--- a/GainStation13/code/mechanics/water_sponge.dm
+++ b/GainStation13/code/mechanics/water_sponge.dm
@@ -49,7 +49,7 @@
if(breath)
var/pressure = breath.return_pressure()
var/total_moles = breath.total_moles()
- #define PP_MOLES(X) ((X / total_moles) * pressure)
+ //#define PP_MOLES(X) ((X / total_moles) * pressure)
#define PP(air, gas) PP_MOLES(air.get_moles(gas))
var/gas_breathed = PP(breath,GAS_H2O)
if(gas_breathed > 0)
diff --git a/GainStation13/code/modules/mob/living/belly.dm b/GainStation13/code/modules/mob/living/belly.dm
index 86fd0f9088..9ef0940211 100644
--- a/GainStation13/code/modules/mob/living/belly.dm
+++ b/GainStation13/code/modules/mob/living/belly.dm
@@ -7,6 +7,7 @@
slot = ORGAN_SLOT_BELLY
w_class = 3
size = 0
+ var/max_size = 0
shape = DEF_BELLY_SHAPE
var/statuscheck = FALSE
genital_flags = UPDATE_OWNER_APPEARANCE
@@ -65,6 +66,7 @@
else
color = "#[D.features["belly_color"]]"
size = D.features["belly_size"]
+ max_size = D.features["max_belly_size"]
starting_size = D.features["belly_size"]
shape = D.features["belly_shape"]
inflatable = D.features["inflatable_belly"]
diff --git a/GainStation13/code/modules/mob/living/species.dm b/GainStation13/code/modules/mob/living/species.dm
index c18bda8f14..e69d703bdc 100644
--- a/GainStation13/code/modules/mob/living/species.dm
+++ b/GainStation13/code/modules/mob/living/species.dm
@@ -7,11 +7,23 @@
var/obj/item/organ/genital/breasts/breasts = H.getorganslot(ORGAN_SLOT_BREASTS)
if(butt)
- butt.modify_size(size_change)
+ if(butt.max_size > 0)
+ if((butt.size + size_change) <= butt.max_size)
+ butt.modify_size(size_change)
+ else
+ butt.modify_size(size_change)
if(belly)
- belly.modify_size(size_change)
+ if(belly.max_size > 0)
+ if((belly.size + size_change) <= belly.max_size)
+ belly.modify_size(size_change)
+ else
+ belly.modify_size(size_change)
if(breasts)
- breasts.modify_size(size_change)
+ if(breasts.max_size > 0)
+ if((breasts.cached_size + size_change) <= breasts.max_size)
+ breasts.modify_size(size_change)
+ else
+ breasts.modify_size(size_change)
H.genital_override = TRUE
H.update_body()
@@ -38,7 +50,7 @@
/datum/species/proc/handle_helplessness(mob/living/carbon/human/fatty)
var/datum/preferences/preferences = fatty?.client?.prefs
- if(!istype(preferences))
+ if(!istype(preferences) || HAS_TRAIT(fatty, TRAIT_NO_HELPLESSNESS))
return FALSE
if(preferences.helplessness_no_movement)
@@ -161,17 +173,17 @@
ADD_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
var/obj/item/clothing/suit/worn_suit = fatty.wear_suit
- if(istype(worn_suit))
+ if(istype(worn_suit) && !istype(worn_suit, /obj/item/clothing/suit/mod))
to_chat(fatty, "[worn_suit] can no longer contain your weight!")
fatty.dropItemToGround(worn_suit)
var/obj/item/clothing/gloves/worn_gloves = fatty.gloves
- if(istype(worn_gloves))
+ if(istype(worn_gloves)&& !istype(worn_gloves, /obj/item/clothing/gloves/mod))
to_chat(fatty, "[worn_gloves] can no longer contain your weight!")
fatty.dropItemToGround(worn_gloves)
var/obj/item/clothing/shoes/worn_shoes = fatty.shoes
- if(istype(worn_shoes))
+ if(istype(worn_shoes) && !istype(worn_shoes, /obj/item/clothing/shoes/mod))
to_chat(fatty, "[worn_shoes] can no longer contain your weight!")
fatty.dropItemToGround(worn_shoes)
@@ -189,7 +201,7 @@
if(fatty.fatness >= preferences.helplessness_clothing_back)
ADD_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
var/obj/item/back_item = fatty.back
- if(istype(back_item))
+ if(istype(back_item) && !istype(back_item, /obj/item/mod))
to_chat(fatty, "Your weight makes it impossible for you to carry [back_item].")
fatty.dropItemToGround(back_item)
@@ -220,6 +232,42 @@
id = "fat"
variable = TRUE
+/mob/living/carbon
+ var/list/fatness_delay_modifiers
+
+/datum/fatness_delay_modifier
+ var/name
+ var/amount = 0
+ var/multiplier = 1
+
+/mob/living/carbon/proc/add_fat_delay_modifier(name = "", amount = 0, multiplier = 1)
+ var/find_name = FALSE
+ for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
+ if(modifier.name == name && find_name == FALSE)
+ modifier.amount = amount
+ modifier.multiplier = multiplier
+ find_name = TRUE
+ if(find_name == FALSE)
+ var/datum/fatness_delay_modifier/new_modifier = new()
+ new_modifier.name = name
+ new_modifier.amount = amount
+ new_modifier.multiplier = multiplier
+ LAZYADD(fatness_delay_modifiers, new_modifier)
+
+/mob/living/carbon/proc/remove_fat_delay_modifier(name)
+ for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
+ if(modifier.name == name)
+ LAZYREMOVE(fatness_delay_modifiers, modifier)
+
+/datum/species/proc/apply_fatness_speed_modifiers(mob/living/carbon/human/H, fatness_delay)
+ for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
+ fatness_delay = fatness_delay + modifier.amount
+ for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
+ fatness_delay *= modifier.multiplier
+ fatness_delay = max(fatness_delay, 0)
+ fatness_delay = min(fatness_delay, FATNESS_MAX_MOVE_PENALTY)
+ return fatness_delay
+
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
handle_helplessness(H)
H.handle_modular_items()
@@ -241,6 +289,7 @@
fatness_delay = min(fatness_delay, 60)
if(fatness_delay)
+ fatness_delay = apply_fatness_speed_modifiers(H, fatness_delay)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
else
H.remove_movespeed_modifier(/datum/movespeed_modifier/fatness)
diff --git a/GainStation13/code/modules/mod/modules/modules_fat.dm b/GainStation13/code/modules/mod/modules/modules_fat.dm
new file mode 100644
index 0000000000..c1b60c02b1
--- /dev/null
+++ b/GainStation13/code/modules/mod/modules/modules_fat.dm
@@ -0,0 +1,215 @@
+/obj/item/mod/module/hydraulic_movement
+ icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
+ icon_state = "hydraulic_mod"
+ name = "MOD hydraulic movement assistance module"
+ desc = "A module created by GATO, installed across the suit, featuring a system of hydraulic pistons \
+ that support and lighten vast amounts of excess weight to provide easier movement."
+ complexity = 1
+ incompatible_modules = list(/obj/item/mod/module/hydraulic_movement)
+ idle_power_cost = 5
+ var/amount = -2
+ var/modifier_name = "hydraulic_mod"
+
+/obj/item/mod/module/hydraulic_movement/on_suit_activation()
+ var/mob/living/carbon/human/wearer = mod.wearer
+ wearer.add_fat_delay_modifier(modifier_name, amount)
+
+ if(!HAS_TRAIT_FROM(wearer, TRAIT_NO_HELPLESSNESS, src))
+ ADD_TRAIT(wearer, TRAIT_NO_HELPLESSNESS, src)
+
+ if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
+ REMOVE_TRAIT(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
+// if(HAS_TRAIT_FROM(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
+// REMOVE_TRAIT(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
+// if(HAS_TRAIT_FROM(wearer, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
+// wearer.cure_nearsighted(HELPLESSNESS_TRAIT)
+// if(HAS_TRAIT_FROM(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
+// REMOVE_TRAIT(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
+ if(HAS_TRAIT_FROM(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT))
+ REMOVE_TRAIT(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT)
+ if(HAS_TRAIT_FROM(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
+ REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
+ REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
+ wearer.update_disabled_bodyparts()
+// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
+// REMOVE_TRAIT(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
+ if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
+ REMOVE_TRAIT(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
+ if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
+ REMOVE_TRAIT(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
+// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
+// REMOVE_TRAIT(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
+
+/obj/item/mod/module/hydraulic_movement/on_suit_deactivation(deleting = FALSE)
+ if(deleting)
+ return
+ if(HAS_TRAIT_FROM(mod.wearer, TRAIT_NO_HELPLESSNESS, src))
+ REMOVE_TRAIT(mod.wearer, TRAIT_NO_HELPLESSNESS, src)
+ mod.wearer.remove_fat_delay_modifier(modifier_name)
+
+/datum/design/module/hydraulic_movement
+ name = "Hydraulic Assistance Module"
+ id = "mod_hydraulic"
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 200)
+ build_path = /datum/design/module/hydraulic_movement
+ desc = "A GATO-designed module that supports plumper bodies and allows easier movement."
+
+/obj/item/mod/module/calovoltaic
+ icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
+ icon_state = "calovoltaic_mod"
+ name = "MOD calovoltaic generator module"
+ desc = "A module created by GATO, capable of burning adipose tissue \
+ to generate power for the suit it is installed onto."
+ module_type = MODULE_TOGGLE
+ complexity = 1
+ incompatible_modules = list(/obj/item/mod/module/calovoltaic)
+ var/rate = 5
+
+/obj/item/mod/module/calovoltaic/on_select()
+ . = ..()
+ if(active)
+ balloon_alert(mod.wearer, "activeted!")
+ else
+ balloon_alert(mod.wearer, "deactivated!")
+
+/obj/item/mod/module/calovoltaic/on_active_process(delta_time)
+ if(istype(mod.wearer, /mob/living/carbon))
+ var/mob/living/carbon/C = mod.wearer
+ var/adjusted_rate = rate * C.weight_loss_rate
+ if(C.fatness_real > 0 && (C.fatness_real - adjusted_rate) >= adjusted_rate)
+ C.adjust_fatness(-rate, FATTENING_TYPE_WEIGHT_LOSS)
+ mod.cell.give(rate)
+
+/datum/design/module/calovoltaic
+ name = "Calovoltaic Generator Module"
+ id = "mod_calovoltaic"
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 500)
+ build_path = /obj/item/mod/module/calovoltaic
+ desc = "A GATO-designed module for burning excess fat to make power for your suit."
+
+/obj/item/mod/construction/armor/exoskeleton
+ theme = /datum/mod_theme/exoskeleton
+
+/obj/item/mod/control/Initialize(mapload, new_theme, new_skin)
+ . = ..()
+ gs13_icon_update()
+
+/obj/item/mod/control/proc/gs13_icon_update()
+ if(theme.use_gs_icon == TRUE)
+ icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
+ mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
+ icon_state = "[theme]-control"
+ item_state = "[theme]-control"
+
+ helmet.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
+ helmet.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
+ helmet.icon_state = "[theme]-helmet"
+ helmet.item_state = "[theme]-helmet"
+
+ chestplate.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
+ chestplate.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
+ chestplate.icon_state = "[theme]-chestplate"
+ chestplate.item_state = "[theme]-chestplate"
+
+ gauntlets.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
+ gauntlets.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
+ gauntlets.icon_state = "[theme]-gauntlets"
+ gauntlets.item_state = "[theme]-gauntlets"
+
+ boots.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
+ boots.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
+ boots.icon_state = "[theme]-boots"
+ boots.item_state = "[theme]-boots"
+
+/datum/mod_theme
+ var/use_gs_icon = FALSE
+
+/datum/mod_theme/exoskeleton
+ use_gs_icon = TRUE
+ name = "exoskeleton"
+ desc = "The design for a GATO-branded mobility exoskeleton"
+ extended_desc = "To combat the obesity epidemic that spreads on its stations, \
+ GATO scientists have worked hard to create this simple yet efficient way to support \
+ people whose weight proves restrictive and help them on their journey to lose it."
+ default_skin = "exoskeleton"
+ complexity_max = 5
+ armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 5, BIO = 5, FIRE = 5, ACID = 5, WOUND = 5, RAD = 5)
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = 1
+ min_cold_protection_temperature = -1
+ permeability_coefficient = 1
+ siemens_coefficient = 1
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ inbuilt_modules = list(/obj/item/mod/module/hydraulic_movement, /obj/item/mod/module/calovoltaic, /obj/item/mod/module/storage)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
+ skins = list(
+ "exoskeleton" = list(
+ HELMET_LAYER = NECK_LAYER,
+ HELMET_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ UNSEALED_INVISIBILITY = NONE,
+ SEALED_INVISIBILITY = NONE,
+ SEALED_COVER = NONE,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ SEALED_INVISIBILITY = NONE,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ ),
+ ),
+ "invisible" = list(
+ HELMET_LAYER = NECK_LAYER,
+ HELMET_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ UNSEALED_INVISIBILITY = NONE,
+ SEALED_INVISIBILITY = NONE,
+ SEALED_COVER = NONE,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ SEALED_INVISIBILITY = NONE,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = NONE,
+ SEALED_CLOTHING = NONE,
+ ),
+ )
+ )
+
+/obj/item/mod/control/pre_equipped/exoskeleton
+ desc = "A pre-built GATO mobility exoskeleton, designed to support high weights, favor movement and weight loss."
+ theme = /datum/mod_theme/exoskeleton
+ cell = /obj/item/stock_parts/cell/upgraded/plus
+
+/datum/design/module/exoskeleton
+ name = "MOD exoskeleton"
+ id = "mod_exoskeleton"
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/plasma = 5000)
+ build_path = /obj/item/mod/control/pre_equipped/exoskeleton
+ desc = "A GATO-designed assistance exoskeleton based on MODsuit tech."
+ build_type = MECHFAB
+ construction_time = 10 SECONDS
+ category = list("MODsuit Chassis", "MODsuit Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/gear/hands/exoskeleton
+ name = "MOD exoskeleton"
+ category = LOADOUT_CATEGORY_HANDS
+ path = /obj/item/mod/control/pre_equipped/exoskeleton
+ cost = 4
diff --git a/GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi b/GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..6c4cfeb37c1e848f2a2775aa1a58c99f66ac87b1
GIT binary patch
literal 5241
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
z£&-G_TP;soc-`PNzaiO*+Pa)sItVg_`{k|vK?C8{|SMHn{YUk-FXPLlGL=-?{XJ_XsyI&pVAphm4q`EDgejFoXqsMFu~
zIu%q^o$&GYHenZmT7fP6_?|WBQNWYi!|{iB_-bx&%*>Vd1&5T+Z)Hylk^GRx=C;V4ZU1GQ6!0N2UYgKi1b(Ni+9o6W5
z?~_FldiY{JwMXR1$qIaE0tnQvVGz@K(D+#*VKV#`w`%?){*|$LtLi-dcKiL_A8Q+t
zR^TY(Q^FS+$SqQYa2S&|p4g}#U^~S)_70lbQQ|o1;2z05C}OzZ>Sx`{GXkeh7!_?s
zJ~^EV*GP*tS&CQojQ{61od01&ON_vFI$x+F
zo|%}~GGEAnJUx5UNbTV*Zi`}v8*?5cmt!sKSH}t-qK1Nba#*)0nHUO!WPYEj=DhbC
zEYF%)6YJxggYi4Sw!DxUk%@V1SzACLa7%3H5eG(L93URQM`NS~#Cb}MD^Q8rR<-Jv
z(~JG_FmHeB83zY@VvU!NEkn*pSpW)3R2fioLkw3g+%-yjczTa{mG=7x#P2OnugFz1tHB8PT{yx%0EVSX-UMmdFlb-69GfggKxz=xh=6l2V0KUN8L69@h4DouQnL$|?7zT44INA&j)2
zsQoZpTetQdOtR7>QX3%BTjGb(>lv(I!{HJ0k~pM`)%Cn(ty^#(h`;B4**d)eqY1T)
zd)v)MF!ck~e8o2Af$z!J)@cyt{1Fz#@zgL@2sn>4ZnwUCc~A{vAFy-1x-;l^O@O^k
zmcRaeM~o3HhB?oc6lBUvk@X7zR5%Y(A8kf04~$3~OVKE}7idWV^T3T+HqJ3iHPBZh
zG|6#*?T{U9?KKlq#tL4p0Cza<-@88QJKmd;Yz?_nPJlW(IyUkpFCC>3i-7RwMsV;q
zgH_fCiR`>^a92uz*sCpj`7GE)m7%2RE*+qg@@ms76D|ivw=P*7q{NVfEl!Z
zKv{X8mUicCz!+##oN&FdBd!R_&QH(8jgAiMSJ)dKZp>r_CzxC)!q|FhWEL2~zA`#)
z+h}xopkx%flid?X`*I1oB&n`wW(~G@myEP@^+vJHtj3^;Nn;63QFwtUzEwi2&c~OJ
z3keAs&4e4XDYVeHCl3%R^z#7h8b{3q*UokGqQ-)O!S*_6`_}RLhF)
zgXWc!MWSUHJ+%P<9iKS_Me4r@7$A%N+p6xC2E$l|2B+-Dm*i0*=l?6y@wYtaW~pbN
zts*FY0SE0h%jN^n2nO@TCTAFIoCV|i`uZ}X>BK@pkN9)dP8KD1n1sxK9
z@WD5CNC9gFR*hbfcn#DDwgml@6J)NV?4dH`TFPIC$J1ONemS<^ru5OnhYw@A2*G12
z4s(o8`yM~Ii~7ZE9sizu?AO*ZtmLn|6z|_r2E~2{hg{=|a(N%4S4XgtuIzU+rlw|*
zc(X3V+NWLq6*i7ZS9d1o#Oq9DYVY5GH9fJm4r!~ovT@-eh}Mi1goYq
nPzy+NG_;5l^m9*s4%-+fS4sveFkFFLBFMtj+NAt~N9;cU?*Cyn
literal 0
HcmV?d00001
diff --git a/GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi b/GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..c5da100c5b2db693859bc9d9c6126876dc40225b
GIT binary patch
literal 2413
zcma)8X*d+@8h&S*VY06!jf1SmmMkUPFvh3Jl4MK55ZNY@Y!Oi*pGsxPlBP7mXA47?
z$oN9CPGuNV`83DY*kTwn%$a_j^Rw%EpZC6=>w2#H{&U~Y`(`>j*@+6t3jqK`u_rJt
zd`#h&A3}hCe@aNe@}WM#)iW9scqJezBr-ZA;t~LH#U;aLVrlv!DbvS~-+~*u`G(~Q
zxgP0KKwrjwlz85ggzVfSbxvEY$Rcr@DWx~q#3U?vvAZR7X(Z)jB>)~h6u|4
z*={meu|?Yg{q2
z_*6LUvqEoYnfdbxi5}$(duo}XB+XarPiIPaQAC>uN6}Eh}+*H5L#7X253jqvXXP>ekdnS8CIjp
zR8Nw=a6l?!Q-#gRT;^O){62GSY-~&l#yu2k2CQQxq2G|oU}%0Z2DD{51fk`T$gZ~K
zU9q^aIH}6Y-4RBe7y3d9qS)ke3)ITp?Gt>YwsJu{FAxjv_dE36#x#t$Fg
z*U%U~@#G$+OMP_Nh^UW%V7iPPTWZ<_fhD((3IlF#bi*^to8n?(>yL?hhd(Q(C%e(x
z_9{)YBSYAaD>fN#-$Jkyqwxl{P^AAs7b?w)tUncgl;(UE*G$VUt5uBjWpiOm^p4I!
z)`x~uGm7cFI}C>-q_4YvHFHB2TR;EP(YD#_wqiJJnO#Bn>L0vdrOG34z(lyafe3lS
zRd4oZyzh-dA{J;>xC(W6v2~tDw2J{x?v^yq48NnGbY%P8BENg6yK1zEiWZPV87nL7
zY)rpjTQiWcod`OdKX9U);>qUBX0q+~YdhLXLk|zS$@*EA-g8SVB)+b2tt8To9D5Gz
zSuDi|H!hF<$vXj+qjomC=;aeMh2Aq>MLg$e-$_mX%Jq2C89iEk4mRUZJV`^8dk@^VB;T2fSXrG?l_Aeesp@|8eI
zUmi#7QjLy(WN<-KmWad+q5%MWsx1oPr_%Tzm6J0mveYU&yVa%*H6II8uTOdiyI{zO
zPxCX)g4SPTq7iT6kgR@V2l@~@cbGLq6V7yisb%+4}Mi1lERcAYP6cW|e*xVqq)T-XeNtY?T7NvEy
zZ(ryf&HMr5+J=w&JQyC*N;@!;@D9>@q{q*>dQnF=nNuC>f52~n1g_fvf}lxGd`=VF#B2Uxl-KEx89?h!z1pz4kx-j;5^x(Qayc5
zOWp-v{?M%ZJR?#4p10oY-F>}Q2rVjLL4#=S3D6LDokoj%^ud@;_m}ROP5y|yGpk028Ua*R8`AaR
zM|^A$t37L|`h)FGbPuW;urRkPQbIXRX^EDHKfMPV;TwEcCvjNV6rQtsOR0n6=N@B6
z?)p5%05sp=z4>YA_+4qK4_Os7g1Q?vpYPlHuWC2SOg&RBUZ
zKlypRdlxTm4+&mp^fFLIgC_@xt1a$M;xs{oy(&aUN9P2YOg2b)gC;2HUcB>Q{GadB
z)3|sX4mTh^#E8OMK&*K-X9P_b6oZrDM$aY&PEvOceHB<}T}q8t2jOit8QI=?8doP#
zZ41}}pQI+n)HyYWz@yqS^;WRijAM8cJ4DKro8bSUB^kFytq-7!5vnpoek+^55#Rrf
zNGJIBZB^{u4}2`6VZKvde{)}CN$Hjc0`8g#b?=dNd4fSo;Mt{#`Azvtu`$~go_VqZ
zp$cZow|!I}0av%&po@9{ylH8=lP|8YiVq(sDtXO+69Yn$evMr42m++;8`Y^22bAP<
z3;}ITv+=Ko2b41Uz~HDe$P0Y^cF0451ixEa7)hf;C*-;%>_j?Fo`-nmF+wNd=7})=
zNn}k_^76a$MwxuAMqN?C06)~DP*TjhkpV93x=)+kBNOXx{{IPJZJjVRXus6|0=syH
Ag8%>k
literal 0
HcmV?d00001
diff --git a/GainStation13/icons/obj/clothing/modsuit/mod_construction.dmi b/GainStation13/icons/obj/clothing/modsuit/mod_construction.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..4a94bdf19bf2e47870d2dfac5baafc9fc8080e76
GIT binary patch
literal 1046
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
literal 0
HcmV?d00001
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f2c3c13848..98d5205a20 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -260,6 +260,7 @@
#define TRAIT_LIVESTOCK "livestock"
#define TRAIT_NO_FAT_SLOWDOWN "no_fat_slowdown"
#define HELPLESSNESS_TRAIT "helplessness"
+#define TRAIT_NO_HELPLESSNESS "no_helplessness"
#define TRAIT_RADRESONANCE "radresonance" //FIX THIS LATER
#define COMSIG_MICRO_PICKUP_FEET "micro_force_grabbed" //From /datum/element/mob_holder/micro
diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm
index e9974d672d..d284030c1c 100644
--- a/code/modules/arousal/organs/breasts.dm
+++ b/code/modules/arousal/organs/breasts.dm
@@ -9,6 +9,7 @@
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values
+ var/max_size = 0 //GS13 Edit
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
producing = TRUE
@@ -115,6 +116,7 @@
else
color = "#[D.features["breasts_color"]]"
size = D.features["breasts_size"]
+ max_size = D.features["max_breasts_size"]
starting_size = D.features["breasts_size"]
shape = D.features["breasts_shape"]
if(!D.features["breasts_producing"])
diff --git a/code/modules/arousal/organs/butt.dm b/code/modules/arousal/organs/butt.dm
index fd20703168..93ac4dfc69 100644
--- a/code/modules/arousal/organs/butt.dm
+++ b/code/modules/arousal/organs/butt.dm
@@ -7,6 +7,7 @@
slot = ORGAN_SLOT_BUTT
w_class = 3
size = 0
+ var/max_size = 0 //GS13 Edit
var/size_name = "nonexistent"
shape = "Pair" //turn this into a default constant if for some inexplicable reason we get more than one butt type but I doubt it.
genital_flags = UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
@@ -84,6 +85,7 @@
else
color = "#[D.features["butt_color"]]"
size = D.features["butt_size"]
+ max_size = D.features["max_butt_size"]
starting_size = D.features["butt_size"] // GS13 EDIT
prev_size = size
toggle_visibility(D.features["butt_visibility"], FALSE)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 060bd31a1c..044e3cd9c7 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -810,6 +810,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Color:
"
dat += "#[features["breasts_color"]] Change
"
dat += "Cup Size:[features["breasts_size"]]"
+ dat += "Max Fat Breast Size:[features["max_breasts_size"]]" //GS13 Edit
dat += "Breasts Shape:[features["breasts_shape"]]"
dat += "Breasts Visibility:[features["breasts_visibility"]]"
dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]"
@@ -846,6 +847,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Color:
"
dat += "#[features["butt_color"]] Change
"
dat += "Butt Size:[features["butt_size"]]"
+ dat += "Max Fat Butt Size:[features["max_butt_size"]]" //GS13 Edit
dat += "Butt Visibility:[features["butt_visibility"]]"
dat += ""
dat += ""
@@ -860,6 +862,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
dat += "#[features["belly_color"]] Change
"
dat += "Belly Size: [features["belly_size"]]"
+ dat += "Max Fat Belly Size: [features["max_belly_size"]]"
dat += "Belly Shape: [features["belly_shape"]]"
dat += "Belly Visibility:[features["belly_visibility"]]"
// GS13: tweak inflation description
@@ -2698,6 +2701,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs)
if(new_size)
features["breasts_size"] = new_size
+ //GS13 Edit
+ if("max_breasts_size")
+ var/new_max = input(user, "Max fat breasts size:\n([0]-[30])", "Character Preference") as num|null
+ if(new_max)
+ features["max_breasts_size"] = clamp(round(new_max), 0, 30)
if("breasts_shape")
var/new_shape
@@ -2783,6 +2791,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/new_length = input(user, "Butt size:\n([min_B]-[max_B])", "Character Preference") as num|null
if(new_length)
features["butt_size"] = clamp(round(new_length), min_B, max_B)
+ //GS13 Edit
+ if("max_butt_size")
+ var/new_max = input(user, "Max fat butt size:\n([0]-[10])", "Character Preference") as num|null
+ if(new_max)
+ features["max_butt_size"] = clamp(round(new_max), 0, 10)
if("butt_visibility")
var/n_vis = input(user, "Butt Visibility", "Character Preference") as null|anything in CONFIG_GET(str_list/safe_visibility_toggles)
@@ -2806,6 +2819,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_bellysize)
features["belly_size"] = clamp(round(new_bellysize), 1, 10)
+ if("max_belly_size")
+ var/new_bellymax = input(user, "Max belly fat size :\n(0-10, 0 = none)", "Character Preference") as num|null
+ if(new_bellymax)
+ features["max_belly_size"] = clamp(round(new_bellymax), 0, 10)
+
if("belly_shape") //GS13 - belly shapes
var/new_shape
new_shape = input(user, "Belly Type", "Character Preference") as null|anything in GLOB.belly_shapes_list
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 09e7a10661..20278d34de 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -874,6 +874,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//breasts features
S["feature_has_breasts"] >> features["has_breasts"]
S["feature_breasts_size"] >> features["breasts_size"]
+ S["feature_max_breasts_size"] >> features["max_breasts_size"] //GS13 Edit - Max size
S["feature_breasts_shape"] >> features["breasts_shape"]
S["feature_breasts_color"] >> features["breasts_color"]
S["feature_breasts_producing"] >> features["breasts_producing"]
@@ -889,10 +890,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_has_butt"] >> features["has_butt"]
S["feature_butt_color"] >> features["butt_color"]
S["feature_butt_size"] >> features["butt_size"]
+ S["feature_max_butt_size"] >> features["max_butt_size"] //GS13 Edit - Max size
S["feature_butt_visibility"] >> features["butt_visibility"]
//belly features
S["feature_has_belly"] >> features["has_belly"]
S["feature_belly_size"] >> features["belly_size"]
+ S["feature_max_belly_size"] >> features["max_belly_size"]
S["feature_belly_shape"] >> features["belly_shape"]
S["feature_belly_color"] >> features["belly_color"]
S["feature_hide_belly"] >> features["hide_belly"]
@@ -1291,6 +1294,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_has_breasts"], features["has_breasts"])
WRITE_FILE(S["feature_breasts_size"], features["breasts_size"])
+ WRITE_FILE(S["feature_max_breasts_size"], features["max_breasts_size"]) //GS13 Edit - Max size
WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"])
WRITE_FILE(S["feature_breasts_color"], features["breasts_color"])
WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"])
@@ -1306,10 +1310,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_has_butt"], features["has_butt"])
WRITE_FILE(S["feature_butt_color"], features["butt_color"])
WRITE_FILE(S["feature_butt_size"], features["butt_size"])
+ WRITE_FILE(S["feature_max_butt_size"], features["max_butt_size"]) //GS13 Edit - Max size
WRITE_FILE(S["feature_butt_visibility"], features["butt_visibility"])
//belly features
WRITE_FILE(S["feature_has_belly"], features["has_belly"])
WRITE_FILE(S["feature_belly_size"], features["belly_size"])
+ WRITE_FILE(S["feature_max_belly_size"], features["max_belly_size"])
WRITE_FILE(S["feature_belly_shape"], features["belly_shape"])
WRITE_FILE(S["feature_belly_color"], features["belly_color"])
WRITE_FILE(S["feature_hide_belly"], features["hide_belly"])
diff --git a/code/modules/research/techweb/nodes/mod_nodes.dm b/code/modules/research/techweb/nodes/mod_nodes.dm
index db453bb0d6..bb6cb10d3c 100644
--- a/code/modules/research/techweb/nodes/mod_nodes.dm
+++ b/code/modules/research/techweb/nodes/mod_nodes.dm
@@ -15,6 +15,10 @@
"mod_welding",
"mod_mouthhole",
"mod_flashlight",
+ //GS13 Edit
+ "mod_hydraulic",
+ "mod_calovoltaic",
+ "mod_exoskeleton",
)
/datum/techweb_node/mod_advanced
diff --git a/tgstation.dme b/tgstation.dme
index 3478a43ce9..322c59b8ff 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4055,6 +4055,7 @@
#include "GainStation13\code\modules\mob\living\nutribot.dm"
#include "GainStation13\code\modules\mob\living\species.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\trasheat_lists.dm"
+#include "GainStation13\code\modules\mod\modules\modules_fat.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\consumable_reagents.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\dwarverndrinks.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\fatty_drinks.dm"