diff --git a/code/__DEFINES/sex.dm b/code/__DEFINES/sex.dm index 1202a4b63cb..9e572660525 100644 --- a/code/__DEFINES/sex.dm +++ b/code/__DEFINES/sex.dm @@ -241,3 +241,9 @@ GLOBAL_LIST_EMPTY(locked_sex_objects) #define KNOTTED_NULL 0 #define KNOTTED_AS_TOP 1 #define KNOTTED_AS_BTM 2 + +//Caustic edit +#define IMPREG_PROB_DEFAULT 25 +#define IMPREG_PROB_INCREMENT 10 +#define IMPREG_PROB_MAX 95 +//Caustic edit end \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 13b62428969..16e5dc527b9 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -222,6 +222,9 @@ // ARMOR / CLOTHING GIVEN TRAITS (GIVEN BY WEARING CLOTHES/ARMOR PIECES) #define TRAIT_MONK_ROBE "Holy Vestatures" #define TRAIT_RACISMISBAD "Heritage Vision" +//Caustic edit +#define TRAIT_BAOTHA_FERTILITY_BOON "Marked and shaped by Baotha" +//Caustic edit end //Caustic edit #define TRAIT_NECRAS_ABATEMENT "Necra's Abatement" //keeps deadites from doing much of anything in town diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 85e32c4f6b2..cbd07b930c5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -787,6 +787,14 @@ GLOBAL_LIST_EMPTY(personal_objective_minds) for(var/obj/effect/proc_holder/S in spell_list) RemoveSpell(S) +//Caustic edit +//removes spells that have miracle = true on them +/datum/mind/proc/RemoveAllMiracles() + for(var/obj/effect/proc_holder/spell/spell in spell_list) + if(spell.miracle) + RemoveSpell(spell) +//Caustic edit end + /datum/mind/proc/transfer_martial_arts(mob/living/new_character) if(!ishuman(new_character)) return diff --git a/code/datums/sexcon2/actions/sex/anal.dm b/code/datums/sexcon2/actions/sex/anal.dm index 305f15de524..513c42af682 100644 --- a/code/datums/sexcon2/actions/sex/anal.dm +++ b/code/datums/sexcon2/actions/sex/anal.dm @@ -52,6 +52,10 @@ /datum/sex_action/sex/anal/handle_climax_message(mob/living/carbon/human/user, mob/living/carbon/human/target) user.visible_message(span_love("[user] cums into [target]'s butt!")) user.virginity = FALSE + //Caustic edit + if(HAS_TRAIT(target, TRAIT_BAOTHA_FERTILITY_BOON) && !target.getorganslot(ORGAN_SLOT_VAGINA)) + user.try_impregnate(target) + //Caustic edit end return "into" diff --git a/code/datums/sexcon2/actions/sex/slit.dm b/code/datums/sexcon2/actions/sex/slit.dm index f733ad5f8b3..1a9505d1404 100644 --- a/code/datums/sexcon2/actions/sex/slit.dm +++ b/code/datums/sexcon2/actions/sex/slit.dm @@ -56,6 +56,10 @@ /datum/sex_action/sex/slit/handle_climax_message(mob/living/carbon/human/user, mob/living/carbon/human/target) user.visible_message(span_love("[user] cums into [target]'s slit!")) user.virginity = FALSE + //Caustic edit + if(HAS_TRAIT(target, TRAIT_BAOTHA_FERTILITY_BOON) && !target.getorganslot(ORGAN_SLOT_VAGINA)) + user.try_impregnate(target) + //Caustic edit end return "into" /datum/sex_action/sex/slit/get_finish_message(mob/living/carbon/human/user, mob/living/carbon/human/target) diff --git a/code/datums/sexcon2/sex_procs.dm b/code/datums/sexcon2/sex_procs.dm index 063b8b8390d..a248cb50662 100644 --- a/code/datums/sexcon2/sex_procs.dm +++ b/code/datums/sexcon2/sex_procs.dm @@ -53,10 +53,35 @@ if(!testes) return var/obj/item/organ/vagina/vag = wife.getorganslot(ORGAN_SLOT_VAGINA) - if(!vag) + //Caustic edit + if(!vag && !HAS_TRAIT(wife, TRAIT_BAOTHA_FERTILITY_BOON)) return - if(prob(25) && wife.is_fertile() && is_virile()) - vag.be_impregnated(src) + if(!is_virile()) + return + if(vag) + if(!wife.is_fertile()) + return + var/prob_for_impreg = vag.impregnation_probability + if(wife.has_status_effect(/datum/status_effect/knotted)) + prob_for_impreg = min(prob_for_impreg & 2, IMPREG_PROB_MAX) + if(prob(prob_for_impreg)) + vag.be_impregnated(src) + vag.impregnation_probability = IMPREG_PROB_DEFAULT + else + vag.impregnation_probability = min(prob_for_impreg + IMPREG_PROB_INCREMENT, IMPREG_PROB_MAX) + else + var/prob_for_impreg = wife.mpreg_chance + if(wife.has_status_effect(/datum/status_effect/knotted)) + prob_for_impreg = min(prob_for_impreg * 2, IMPREG_PROB_MAX) + if(prob(prob_for_impreg)) + if(wife.mpreg) + to_chat(wife, span_love("I feel a surge of warmth inside me again...")) + return + to_chat(wife, span_love("I feel a strange surge of warmth inside me... Am I pregnant?..")) + wife.mpreg = TRUE + else + wife.mpreg_chance = min(prob_for_impreg + IMPREG_PROB_INCREMENT, IMPREG_PROB_MAX) + //Caustic edit end /mob/living/proc/can_do_sex() return TRUE diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 6ce60391f55..1453f1cf6f5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -146,6 +146,10 @@ /// Ref to orison-like sunder object var/sunder_light_obj = null + //Caustic edit + var/already_converted_once = FALSE + //Caustic edit end + /// Assoc list of culinary preferences of the mob var/list/culinary_preferences = list() @@ -175,5 +179,9 @@ var/virginity = FALSE // Used to prevent certain antag from having sex var/can_do_sex = TRUE + //Caustic edit + var/mpreg = FALSE + var/mpreg_chance = IMPREG_PROB_DEFAULT + //Caustic edit end fovangle = FOV_DEFAULT diff --git a/code/modules/sexcon/sex_organs/vagina.dm b/code/modules/sexcon/sex_organs/vagina.dm index 99bc4c245fd..03182f7f525 100644 --- a/code/modules/sexcon/sex_organs/vagina.dm +++ b/code/modules/sexcon/sex_organs/vagina.dm @@ -7,6 +7,9 @@ accessory_type = /datum/sprite_accessory/vagina/human var/pregnant = FALSE var/fertility = TRUE + //Caustic edit + var/impregnation_probability = IMPREG_PROB_DEFAULT + //Caustic edit end /obj/item/organ/vagina/proc/be_impregnated(mob/living/carbon/human/father) if(pregnant) diff --git a/icons/roguetown/misc/baotha_marking.dmi b/icons/roguetown/misc/baotha_marking.dmi new file mode 100644 index 00000000000..50959ba601b Binary files /dev/null and b/icons/roguetown/misc/baotha_marking.dmi differ diff --git a/modular_azurepeak/code/game/objects/items/ritualcircles.dm b/modular_azurepeak/code/game/objects/items/ritualcircles.dm index 8abcf9bd708..094c5c213f1 100644 --- a/modular_azurepeak/code/game/objects/items/ritualcircles.dm +++ b/modular_azurepeak/code/game/objects/items/ritualcircles.dm @@ -1514,12 +1514,74 @@ cloak = /obj/item/clothing/cloak/graggar r_hand = /obj/item/rogueweapon/greataxe/steel/doublehead/graggar +//Caustic edit /obj/effect/decal/cleanable/roguerune/god/baotha name = "Rune of Hedonism" desc = "A Holy Rune of Baotha. Relief for the broken hearted." icon_state = "baotha_chalky" - rituals = list(/datum/runeritual/joybringer::name = /datum/runeritual/joybringer) - allowed_patron = /datum/patron/inhumen/baotha + var/baotharites = list("Conversion", "Mark of Baotha", /datum/runeritual/joybringer::name = /datum/runeritual/joybringer) + +/obj/effect/decal/cleanable/roguerune/god/baotha/attack_hand(mob/living/user) + if((user.patron?.type) != /datum/patron/inhumen/baotha) + to_chat(user,span_smallred("I don't know the proper rites for this...")) + return + if(!HAS_TRAIT(user, TRAIT_RITUALIST)) + to_chat(user,span_smallred("I don't know the proper rites for this...")) + return + if(user.has_status_effect(/datum/status_effect/debuff/ritesexpended)) + to_chat(user,span_smallred("I have performed enough rituals for the day... I must rest before communing more.")) + return + if(!Adjacent(user)) + to_chat(user, "You must stand close to the rune to receive Baotha's blessing.") + return + var/riteselection = input(user, "Rituals of Desire", src) as null|anything in baotharites + switch(riteselection) // put ur rite selection here + if("Conversion") + var/list/valids_on_rune = list() + for(var/mob/living/carbon/human/peep in range(0, loc)) + if(HAS_TRAIT(peep, TRAIT_DEPRAVED)) + continue + valids_on_rune += peep + if(!valids_on_rune.len) + to_chat(user, "No valid targets on the rune!") + return + var/mob/living/carbon/human/target = input(user, "Choose a host") as null|anything in valids_on_rune + if(!target || QDELETED(target) || target.loc != loc) + return + if(do_after(user, 50)) + user.say("#Lady of Lust, grant this one succor...") + if(do_after(user, 20)) + user.say("#Bless them with thy carnal delight...") + if(do_after(user, 20)) + user.say("#Show them the pleasures of the flesh!") + if(do_after(user, 50)) + user.say("Praise Baotha!") + icon_state = "baotha_active" + baothaconversion(target) + spawn(120) + icon_state = "baotha_chalky" + if("Mark of Baotha") + var/list/valids_on_rune = list() + for(var/mob/living/carbon/human/peep in range(0, loc)) + valids_on_rune += peep + if(!valids_on_rune.len) + to_chat(user, "No valid targets on the rune!") + return + var/mob/living/carbon/human/target = input(user, "Choose a host") as null|anything in valids_on_rune + if(!target || QDELETED(target) || target.loc != loc) + return + if(do_after(user, 50)) + user.say("#Lady of Lust, hear my words...") + if(do_after(user, 50)) + user.say("#I offer to you this mortal vessel...") + if(do_after(user, 50)) + user.say("#Accept this offering, and bless their flesh with thy sigil!") + if(do_after(user, 50)) + user.say("Praise Baotha!") + icon_state = "baotha_active" + baothablessing(target) + spawn(120) + icon_state = "baotha_chalky" /datum/runeritual/joybringer name = "Rite of Joy" @@ -1552,6 +1614,101 @@ return TRUE +/obj/effect/decal/cleanable/roguerune/god/baotha/proc/baothaconversion(mob/living/carbon/human/target) + if(!target || QDELETED(target) || target.loc != loc) + to_chat(usr, "Selected target is not on the rune! [target.p_they(TRUE)] must be directly on top of the rune to receive Baotha's blessing.") + return + if(HAS_TRAIT(target, TRAIT_DEPRAVED)) + loc.visible_message(span_cult("THE RITE REJECTS ONE ALREADY DEPRAVED ENOUGH!!")) + return + if(target.already_converted_once) + loc.visible_message(span_cult("BLOODY NIMROD!!")) + target.apply_damage(150, BRUTE, BODY_ZONE_HEAD) + return + var/prompt = alert(target, "Sickly-sweet pleasure drips down your spine. You can feel a narcotic haze tugging at your mind...",, "INDULGE", "RESIST") + if(prompt == "INDULGE") + to_chat(target, span_love("A hot sensation gushes through your veins. Your body throbs with pleasure.")) + target.Stun(60) + target.Knockdown(60) + to_chat(target, span_userdanger("I can't hold back!")) + target.GetComponent(/datum/component/arousal)?.set_arousal(target, 300) + loc.visible_message(span_cult("[target] writhes and moans as they lose control of their body!")) + spawn(20) + playsound(target, 'sound/health/fastbeat.ogg', 60) + playsound(loc, 'sound/ambience/creepywind.ogg', 80) + target.adjust_skillrank(/datum/skill/misc/athletics, 1, TRUE) + target.adjust_skillrank(/datum/skill/misc/music, 1, TRUE) + target.adjust_skillrank(/datum/skill/misc/riding, 1, TRUE) // haha get it? + spawn(20) + to_chat(target, span_purple("You can't stop craving more...")) + if(target.devotion == null) + target.set_patron(new /datum/patron/inhumen/baotha) + return + else + var/previous_level = target.devotion.level //now you might ask why we get previous_level variable before switching le patron. reason is when swapping patrons it completely fucks up devotion data for people + target.set_patron(new /datum/patron/inhumen/baotha) + var/datum/devotion/C = new /datum/devotion(target, target.patron) + if(previous_level == 4) + target.mind?.RemoveAllMiracles() + C.grant_miracles(target, cleric_tier = CLERIC_T4, passive_gain = CLERIC_REGEN_MAJOR, start_maxed = TRUE) // gotta change? + if(previous_level == 3) + target.mind?.RemoveAllMiracles() + C.grant_miracles(target, cleric_tier = CLERIC_T3, passive_gain = CLERIC_REGEN_MAJOR, devotion_limit = CLERIC_REQ_3) // gotta change? + if(previous_level == 2) + target.mind?.RemoveAllMiracles() + C.grant_miracles(target, cleric_tier = CLERIC_T2, passive_gain = CLERIC_REGEN_MINOR, devotion_limit = CLERIC_REQ_2) + if(previous_level == 1) + target.mind?.RemoveAllMiracles() + C.grant_miracles(target, cleric_tier = CLERIC_T1, passive_gain = CLERIC_REGEN_DEVOTEE, devotion_limit = CLERIC_REQ_1) + if(prompt == "RESIST") + to_chat(target, span_warning("Your body seizes in pain!")) + target.Stun(60) + target.Knockdown(60) + to_chat(target, span_userdanger("YOUR FLESH BURNS!")) + target.emote("Agony") + target.apply_damage(60, BURN, BODY_ZONE_CHEST) + loc.visible_message(span_cult("[target] violently writhes and thrashes atop the rune as they dare to defy Baotha!")) + +/obj/effect/decal/cleanable/roguerune/god/baotha/proc/baothablessing(mob/living/carbon/human/target) + if(!target || QDELETED(target) || target.loc != loc) + to_chat(usr, "Selected target is not on the rune! [target.p_they(TRUE)] must be directly on top of the rune to receive Baotha's mark.") + return + if(HAS_TRAIT(target, TRAIT_BAOTHA_FERTILITY_BOON)) + loc.visible_message(span_cult("They have already been blessed!")) + return + var/prompt = alert(target, "Your hair stands on end. Shivers run down your spine. Something feels wrong...",, "SURRENDER", "RESIST") + if(prompt == "SURRENDER") + to_chat(target, span_love("A strange feeling of warmth blooms within your stomach.")) + target.reagents.add_reagent(/datum/reagent/fermented_crab, 5) + spawn(20) + to_chat(target, span_warning("You fall to your feet, your legs suddenly going limp.")) + target.Stun(60) + target.Knockdown(60) + spawn(20) + loc.visible_message(span_cult("[target] shuddders and moans as purple flames lick at their abdomen, burning a glowing pink symbol into their pelvis.")) + var/mutable_appearance/marking_overlay = mutable_appearance('icons/roguetown/misc/baotha_marking.dmi', "marking_[target.gender == "male" ? "m" : "f"]", -BODY_LAYER) + target.add_overlay(marking_overlay) + target.update_body_parts() + playsound(target, 'sound/health/fastbeat.ogg', 60) + target.adjust_skillrank(/datum/skill/misc/riding, 1, TRUE) // hue hue hue + spawn(40) + to_chat(target, span_purple("You have been marked by Baotha!")) + ADD_TRAIT(target, TRAIT_BAOTHA_FERTILITY_BOON, TRAIT_GENERIC) + if(!istype(target.charflaw, /datum/charflaw/addiction/lovefiend)) + target.charflaw = new /datum/charflaw/addiction/lovefiend(target) + var/obj/item/organ/vagina/vagina = target.getorganslot(ORGAN_SLOT_VAGINA) + if(vagina && !vagina.fertility) + vagina.fertility = TRUE + if(prompt == "RESIST") + to_chat(target, span_warning("White-hot flames sear your abdomen!")) + target.Stun(60) + target.Knockdown(60) + to_chat(target, span_userdanger("IT BURNS! MAKE IT STOP!")) + target.emote("Agony") + target.apply_damage(60, BURN, BODY_ZONE_CHEST) + loc.visible_message(span_cult("[target] violently writhes and thrashes atop the rune as their flesh is scorched by Baotha's wrath!")) +//Caustic edit end + /obj/effect/decal/cleanable/roguerune/god/psydon name = "Rune of Enduring" desc = "A Holy Rune of Psydon. It depicts His holy symbol, yet nothing stirs within you." diff --git a/roguetown.dme b/roguetown.dme index 418bb7ee6b7..33cbf78e91a 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -2880,6 +2880,7 @@ #include "modular_causticcove\code\datums\combat_music.dm" #include "modular_causticcove\code\datums\loadout.dm" #include "modular_causticcove\code\game\objects\effects\landmarks.dm" +#include "modular_causticcove\code\game\objects\effects\spawners\loot_magical.dm" #include "modular_causticcove\code\game\objects\items\clothes\stockings.dm" #include "modular_causticcove\code\game\objects\items\rogueitems\leash.dm" #include "modular_causticcove\code\game\objects\items\rogueitems\util.dm" @@ -2941,6 +2942,7 @@ #include "modular_causticcove\code\modules\classes\shrine_priest\shrine_guardian.dm" #include "modular_causticcove\code\modules\classes\shrine_priest\shrine_priest.dm" #include "modular_causticcove\code\modules\client\customizers\organ\genitals.dm" +#include "modular_causticcove\code\modules\clothing\npc\hobgoblin_armor.dm" #include "modular_causticcove\code\modules\dcbot\config.dm" #include "modular_causticcove\code\modules\dcbot\internaltools\ahelprelay.dm" #include "modular_causticcove\code\modules\dcbot\internaltools\whitelost.dm" @@ -2949,6 +2951,8 @@ #include "modular_causticcove\code\modules\dcbot\topichandlers\fetchmanifest.dm" #include "modular_causticcove\code\modules\dcbot\topichandlers\fetchplayers.dm" #include "modular_causticcove\code\modules\deadite_pac\deadite_pac.dm" +#include "modular_causticcove\code\modules\events\adventure\random_bosses\random_boss.dm" +#include "modular_causticcove\code\modules\events\adventure\random_patrols\random_patrols.dm" #include "modular_causticcove\code\modules\extra_virtue\prefs.dm" #include "modular_causticcove\code\modules\grazer\stomach.dm" #include "modular_causticcove\code\modules\grazer\virtue.dm" @@ -2973,10 +2977,9 @@ #include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\horns.dm" #include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\snout.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\hobgoblin.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\ambush_config\ambush_hobgoblin.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\npc\hobgoblin_npc.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\species\hobgoblin_species.dm" -#include "modular_causticcove\code\modules\clothing\npc\hobgoblin_armor.dm" -#include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\ambush_config\ambush_hobgoblin.dm" #include "modular_causticcove\code\modules\nat_armor\nat_armor.dm" #include "modular_causticcove\code\modules\nat_armor\virtue.dm" #include "modular_causticcove\code\modules\persistance\serialize.dm" @@ -2994,9 +2997,9 @@ #include "modular_causticcove\code\modules\spells\animagus\animagus_transformation.dm" #include "modular_causticcove\code\modules\spells\animagus\cat.dm" #include "modular_causticcove\code\modules\spells\animagus\zad.dm" -#include "modular_causticcove\code\modules\standardized_sprite\standardized_sprite_verb.dm" -#include "modular_causticcove\code\modules\spells\invoked_single_target\temperitem.dm" #include "modular_causticcove\code\modules\spells\components\temper_clothing.dm" +#include "modular_causticcove\code\modules\spells\invoked_single_target\temperitem.dm" +#include "modular_causticcove\code\modules\standardized_sprite\standardized_sprite_verb.dm" #include "modular_causticcove\code\modules\taurs\taur_bodyparts.dm" #include "modular_causticcove\code\modules\taurs\taur_markings.dm" #include "modular_causticcove\code\modules\vices\mind_broken.dm" @@ -3015,7 +3018,4 @@ #include "modular_hearthstone\code\modules\mob\living\simple_animal\rogue\orc.dm" #include "modular_hearthstone\code\modules\mob\living\simple_animal\rogue\rogue_corpse.dm" #include "modular_hearthstone\code\modules\reagents\reagent_containers\lux.dm" -#include "modular_causticcove\code\game\objects\effects\spawners\loot_magical.dm" -#include "modular_causticcove\code\modules\events\adventure\random_patrols\random_patrols.dm" -#include "modular_causticcove\code\modules\events\adventure\random_bosses\random_boss.dm" // END_INCLUDE