diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index c5d024c4d3..4e3677f2f9 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -233,6 +233,7 @@
"breasts_stuffing" = FALSE,
"butt_stuffing" = FALSE,
"belly_stuffing" = FALSE,
+ "inert_eggs" = FALSE,
//Hyper's custom fluids
"balls_fluid" = /datum/reagent/consumable/semen,
"womb_fluid" = /datum/reagent/consumable/semen/femcum,
diff --git a/code/__SPLURTCODE/DEFINES/signals.dm b/code/__SPLURTCODE/DEFINES/signals.dm
index 9a44ad968d..43df4522e7 100644
--- a/code/__SPLURTCODE/DEFINES/signals.dm
+++ b/code/__SPLURTCODE/DEFINES/signals.dm
@@ -1,5 +1,6 @@
#define COMSIG_MOB_CAME "mob_came"
#define COMSIG_HEALTH_SCAN "health_scan"
+#define COMSIG_ORGAN_INSERTED "organ_inserted"
#define COMSIG_ORGAN_REMOVED "organ_removed"
#define COMSIG_MOB_CLIMAX "mob_coomed"
#define COMSIG_OBJ_WRITTEN_ON "written_on"
diff --git a/code/modules/arousal/organs/womb.dm b/code/modules/arousal/organs/womb.dm
index 3958a71b14..6b9cf581a3 100644
--- a/code/modules/arousal/organs/womb.dm
+++ b/code/modules/arousal/organs/womb.dm
@@ -8,3 +8,8 @@
genital_flags = GENITAL_INTERNAL|GENITAL_FUID_PRODUCTION|HAS_EQUIPMENT
fluid_id = /datum/reagent/consumable/semen/femcum
linked_organ_slot = ORGAN_SLOT_VAGINA
+
+/obj/item/organ/genital/womb/get_features(mob/living/carbon/human/H)
+ var/datum/dna/D = H.dna
+ if(D.features["inert_eggs"])
+ AddComponent(/datum/component/ovipositor)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index be26307057..2bf08f1591 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -224,6 +224,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"breasts_stuffing" = FALSE,
"butt_stuffing" = FALSE,
"belly_stuffing" = FALSE,
+"inert_eggs" = FALSE,
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = "",
@@ -373,6 +374,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/fertility = 0
/// Does john spaceman look like a gluttonous slob if he pregent?
var/pregnancy_inflation = FALSE
+ /// Self explanitory
+ var/pregnancy_breast_growth = FALSE
var/egg_shell = "chicken"
//SPLURT END
@@ -856,8 +859,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
Pregnancy preferences
"
dat += "Chance of impregnation:[virility ? virility : "Disabled"]"
dat += "Chance of getting pregnant:[fertility ? fertility : "Disabled"]"
+ dat += "Lay inert eggs:[features["inert_eggs"] == TRUE ? "Enabled" : "Disabled"]"
if(fertility)
dat += "Pregnancy inflation:[pregnancy_inflation ? "Enabled" : "Disabled"]"
+ dat += "Pregnancy breast growth:[pregnancy_breast_growth ? "Enabled" : "Disabled"]"
+ if(fertility || features["inert_eggs"])
dat += "Egg shell:[egg_shell]"
dat += ""
//SPLURT EDIT END
@@ -2090,6 +2096,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("pregnancy_inflation")
pregnancy_inflation = !pregnancy_inflation
+ if("pregnancy_breast_growth")
+ pregnancy_breast_growth = !pregnancy_breast_growth
+
//SPLURT EDIT END
if("hair")
@@ -3202,6 +3211,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["butt_stuffing"] = !features["butt_stuffing"]
if("belly_stuffing")
features["belly_stuffing"] = !features["belly_stuffing"]
+ if("inert_eggs")
+ features["inert_eggs"] = !features["inert_eggs"]
if("pixel_size")
switch(pixel_size)
if(PIXEL_SCALING_AUTO)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 1838638f2a..a51b52daeb 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -759,6 +759,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
"breasts_stuffing" = FALSE,
"butt_stuffing" = FALSE,
"belly_stuffing" = FALSE,
+"inert_eggs" = FALSE,
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = "",
@@ -997,6 +998,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_vag_stuffing"] >> features["vag_stuffing"]
S["feature_butt_stuffing"] >> features["butt_stuffing"]
S["feature_belly_stuffing"] >> features["belly_stuffing"]
+ S["feature_inert_eggs"] >> features["inert_eggs"]
var/char_vr_path = "[vr_path]/character_[default_slot]_v2.json"
if(fexists(char_vr_path))
@@ -1213,6 +1215,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(S["egg_shell"])
S["egg_shell"] >> egg_shell
S["pregnancy_inflation"] >> pregnancy_inflation
+ S["pregnancy_breast_growth"] >> pregnancy_breast_growth
//SPLURT EDIT END
cit_character_pref_load(S)
@@ -1345,6 +1348,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_belly_visibility"], features["belly_visibility"])
WRITE_FILE(S["feature_belly_stuffing"], features["belly_stuffing"])
+ WRITE_FILE(S["feature_inert_eggs"], features["inert_eggs"])
+
WRITE_FILE(S["feature_neckfire"], features["neckfire"])
WRITE_FILE(S["feature_neckfire_color"], features["neckfire_color"])
@@ -1420,6 +1425,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["fertile"], fertility)
WRITE_FILE(S["egg_shell"], egg_shell)
WRITE_FILE(S["pregnancy_inflation"], pregnancy_inflation)
+ WRITE_FILE(S["pregnancy_breast_growth"], pregnancy_breast_growth)
WRITE_FILE(S["headshot"], features["headshot_link"])
//SPLURT EDIT END
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 253c601a6d..1a600e2cc0 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -62,6 +62,7 @@
owner = M
M.internal_organs |= src
M.internal_organs_slot[slot] = src
+ SEND_SIGNAL(src, COMSIG_ORGAN_INSERTED)//SPLURT EDIT ADD - gregnancy
moveToNullspace()
for(var/X in actions)
var/datum/action/A = X
diff --git a/modular_splurt/code/datums/components/pregnancy.dm b/modular_splurt/code/datums/components/pregnancy.dm
index 94327903b5..3e4b884376 100644
--- a/modular_splurt/code/datums/components/pregnancy.dm
+++ b/modular_splurt/code/datums/components/pregnancy.dm
@@ -1,6 +1,6 @@
/datum/component/pregnancy
- dupe_mode = COMPONENT_DUPE_UNIQUE
+ dupe_mode = COMPONENT_DUPE_ALLOWED
can_transfer = TRUE
/// type of baby the mother will plop out - needs to be subtype of /mob/living
@@ -21,11 +21,13 @@
var/max_stage = PREGNANCY_STAGES
COOLDOWN_DECLARE(stage_time)
- var/added_belly_size = 0
+ var/added_size = 0
/// this boolean is for identifying whether this preg is in the egg state or not
var/oviposition = TRUE
/// this boolean is for saving whether or not we should inflate the belly if appropriate
var/pregnancy_inflation = TRUE
+ /// breast growth
+ var/pregnancy_breast_growth = TRUE
/// whether the pregnancy is revealed or not, scanners will reveal this no matter what
var/revealed = FALSE
@@ -75,6 +77,8 @@
pregnancy_inflation = gregnant.client?.prefs?.pregnancy_inflation
+ pregnancy_breast_growth = gregnant.client?.prefs?.pregnancy_breast_growth
+
if(container_organ)
container = container_organ
@@ -108,7 +112,6 @@
RegisterSignal(carrier, COMSIG_LIVING_BIOLOGICAL_LIFE, .proc/handle_life)
RegisterSignal(carrier, COMSIG_HEALTH_SCAN, .proc/on_scan)
RegisterSignal(carrier, COMSIG_MOB_APPLY_DAMAGE, .proc/handle_damage)
- RegisterSignal(carrier, COMSIG_MOB_CLIMAX)
if(container)
RegisterSignal(container, COMSIG_ORGAN_REMOVED, .proc/fetus_mortus)
if(oviposition)
@@ -179,6 +182,7 @@
carrier = preg_container.owner
container = preg_container
pregnancy_inflation = carrier.client?.prefs?.pregnancy_inflation
+ pregnancy_breast_growth = carrier.client?.prefs?.pregnancy_breast_growth
register_carrier()
generic_pragency_start()
else if(carrier)
@@ -205,17 +209,22 @@
if(COOLDOWN_FINISHED(src, stage_time))
stage += 1
stage = min(stage, max_stage)
- if(ishuman(carrier) && pregnancy_inflation && stage >= 2)
- handle_belly_stuff(carrier)
+ if(ishuman(carrier) && stage >= 2 && (pregnancy_inflation || pregnancy_breast_growth))
+ handle_organ_inflation(carrier)
COOLDOWN_START(src, stage_time, PREGNANCY_STAGE_DURATION)
-/datum/component/pregnancy/proc/handle_belly_stuff(mob/living/carbon/human/gregnant)
+/datum/component/pregnancy/proc/handle_organ_inflation(mob/living/carbon/human/gregnant)
var/obj/item/organ/genital/belly/belly = gregnant.getorganslot(ORGAN_SLOT_BELLY)
- if(!belly)
+ var/obj/item/organ/genital/breasts/boob = gregnant.getorganslot(ORGAN_SLOT_BREASTS)
+
+ if(added_size < 4)
+ added_size += 1
+ else
return
- if(added_belly_size < 4)
- added_belly_size += 1
- belly.modify_size(1)
+ if(pregnancy_inflation)
+ belly?.modify_size(1)
+ else if(pregnancy_breast_growth)
+ boob?.modify_size(1)
/datum/component/pregnancy/proc/handle_incubation()
if(carrier && (stage < max_stage) && prob(2))
@@ -391,15 +400,24 @@
var/obj/item/organ/genital/belly/belly = gregnant.getorganslot(ORGAN_SLOT_BELLY)
if(!belly)
belly = gregnant.give_genital(/obj/item/organ/genital/belly)
- if(added_belly_size > 0)
- belly.modify_size(added_belly_size)
+ if(added_size > 0)
+ belly.modify_size(added_size)
+ if(pregnancy_breast_growth)
+ var/obj/item/organ/genital/breasts/boob = gregnant.getorganslot(ORGAN_SLOT_BREASTS)
+ if(!boob)
+ boob = gregnant.give_genital(/obj/item/organ/genital/breasts)
+ if(added_size > 0)
+ boob.modify_size(added_size)
return TRUE
/datum/component/pregnancy/proc/human_pragency_end(mob/living/carbon/human/gregnant)
//get rid of king ass ripper belly
var/obj/item/organ/genital/belly/belly = gregnant.getorganslot(ORGAN_SLOT_BELLY)
- if(belly && pregnancy_inflation)
- belly.modify_size(-added_belly_size)
+ var/obj/item/organ/genital/breasts/boob = gregnant.getorganslot(ORGAN_SLOT_BREASTS)
+ if(pregnancy_inflation)
+ belly?.modify_size(-added_size)
+ if(pregnancy_breast_growth)
+ boob?.modify_size(-added_size)
SEND_SIGNAL(gregnant, COMSIG_CLEAR_MOOD_EVENT, "pregnancy")
/datum/component/pregnancy/proc/fetus_mortus()
diff --git a/modular_splurt/code/datums/components/pregnancy_inert.dm b/modular_splurt/code/datums/components/pregnancy_inert.dm
new file mode 100644
index 0000000000..cb8899d150
--- /dev/null
+++ b/modular_splurt/code/datums/components/pregnancy_inert.dm
@@ -0,0 +1,111 @@
+#define EGG_STAGE_TIME 2 MINUTES
+
+/datum/component/ovipositor
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+
+ var/egg_type = "chicken"
+ var/mob/living/carrier
+
+ var/egg_stage = 0
+ var/eggs_stored = 1
+ COOLDOWN_DECLARE(egg_timer)
+
+/datum/component/ovipositor/Initialize()
+ if(!isgenital(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ var/obj/item/organ/genital = parent
+
+ carrier = genital.owner
+
+/datum/component/ovipositor/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ORGAN_INSERTED, .proc/on_inserted)
+ RegisterSignal(parent, COMSIG_ORGAN_REMOVED, .proc/on_removed)
+ if(carrier)
+ register_carrier()
+ egg_type = carrier?.client?.prefs?.egg_shell ? carrier.client.prefs.egg_shell : "chicken"
+
+/datum/component/ovipositor/proc/register_carrier()
+ RegisterSignal(carrier, COMSIG_LIVING_BIOLOGICAL_LIFE, .proc/handle_life)
+ RegisterSignal(carrier, COMSIG_MOB_CLIMAX, .proc/on_climax)
+
+/datum/component/ovipositor/proc/unregister_carrier()
+ UnregisterSignal(carrier, COMSIG_LIVING_BIOLOGICAL_LIFE)
+ UnregisterSignal(carrier, COMSIG_MOB_CLIMAX)
+
+/datum/component/ovipositor/proc/on_inserted(datum/source)
+ SIGNAL_HANDLER
+
+ var/obj/item/organ/genital/gen = parent
+
+ if(gen.owner)
+ carrier = gen.owner
+ register_carrier()
+
+/datum/component/ovipositor/proc/on_removed(datum/source)
+ SIGNAL_HANDLER
+
+ var/obj/item/organ/genital/gen = parent
+
+ if(gen.owner)
+ unregister_carrier()
+ carrier = null
+
+/datum/component/ovipositor/proc/handle_life(seconds)
+ SIGNAL_HANDLER
+
+ if(COOLDOWN_FINISHED(src, egg_timer))
+ egg_stage += 1
+ egg_stage = min(2, egg_stage)
+ COOLDOWN_START(src, egg_stage, EGG_STAGE_TIME)
+
+ if(egg_stage == 2)
+ egg_stage = 0
+ eggs_stored += 1
+ eggs_stored = min(3, eggs_stored)
+
+/datum/component/ovipositor/proc/on_climax(datum/source, atom/target, obj/item/organ/genital/sender, obj/item/organ/genital/receiver, spill)
+ SIGNAL_HANDLER
+
+ if(eggs_stored <= 0)
+ return FALSE
+
+ to_chat(carrier, span_userlove("You feel your egg sliding out slowly inside!"))
+
+ if(receiver && isliving(target))
+ if(CHECK_BITFIELD(receiver.genital_flags, GENITAL_CAN_STUFF))
+ return lay_eg(receiver)
+ return lay_eg(get_turf(carrier))
+
+/datum/component/ovipositor/proc/lay_eg(atom/location)
+ if(prob(30))
+ return FALSE
+
+ if(isorgan(location))
+ var/obj/item/organ/recv = location
+ if(!recv.owner)
+ return FALSE
+
+ var/obj/item/organ/genital/gen = parent
+ if(!gen.is_exposed() && gen.linked_organ && !gen.linked_organ.is_exposed())
+ return FALSE
+
+ playsound(carrier, 'sound/effects/splat.ogg', 70, TRUE)
+
+ var/obj/item/oviposition_egg/eggo = new(carrier)
+
+ eggo.icon_state = "egg_" + egg_type
+ eggo.update_appearance()
+
+ if(isorgan(location))
+ var/obj/item/organ/recv = location
+ carrier.visible_message(span_userlove("[carrier] laid an egg!"), \
+ span_userlove("You laid an egg inside [recv.owner]'s [recv]"))
+ else
+ carrier.visible_message(span_notice("[carrier] laid an egg!"), \
+ span_nicegreen("The egg came out!"))
+
+ eggo.forceMove(location)
+ eggs_stored -= 1
+
+ return TRUE
diff --git a/tgstation.dme b/tgstation.dme
index b4ceba00ca..565ea3a2ae 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4243,6 +4243,7 @@
#include "modular_splurt\code\datums\components\pregnancy.dm"
#include "modular_splurt\code\datums\components\dullahan.dm"
#include "modular_splurt\code\datums\components\nanites.dm"
+#include "modular_splurt\code\datums\components\pregnancy_inert.dm"
#include "modular_splurt\code\datums\components\size_normalized.dm"
#include "modular_splurt\code\datums\components\crafting\recipes\recipes_misc.dm"
#include "modular_splurt\code\datums\components\crafting\recipes\recipes_primal.dm"