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"