Skip to content

Commit

Permalink
Merge pull request TS-Rogue-Star#536 from Screemonster/pudgepodge
Browse files Browse the repository at this point in the history
Makes absorbs escapable and other virgo ports
  • Loading branch information
Very-Soft authored Aug 18, 2024
2 parents 8858e43 + 24dbfb9 commit b362fc8
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 12 deletions.
7 changes: 6 additions & 1 deletion code/modules/mob/living/simple_mob/simple_mob_vr.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted
var/vore_absorb_chance = 0 // Chance to switch to absorb mode if resisted
var/vore_escape_chance = 25 // Chance of resisting out of mob
var/vore_escape_chance_absorbed = 20// Chance of absorbed prey finishing an escape. Requires a successful escape roll against the above as well. //RS add - copy from virgo

var/vore_stomach_name // The name for the first belly if not "stomach"
var/vore_stomach_flavor // The flavortext for the first belly if not the default
Expand Down Expand Up @@ -74,7 +75,10 @@
var/new_fullness = 0
for(var/obj/belly/B as anything in vore_organs)
for(var/mob/living/M in B)
new_fullness += M.size_multiplier
//RS edit start
if(!M.absorbed || B.count_absorbed_prey_for_sprite)
new_fullness += M.size_multiplier
//RS edit end
new_fullness = new_fullness / size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
new_fullness = new_fullness * belly_size_multiplier // Some mobs are small even at 100% size. Let's account for that.
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
Expand Down Expand Up @@ -239,6 +243,7 @@
B.contamination_color = vore_default_contamination_color
B.escapable = vore_escape_chance > 0
B.escapechance = vore_escape_chance
B.escapechance_absorbed = vore_escape_chance_absorbed // RS add
B.digestchance = vore_digest_chance
B.absorbchance = vore_absorb_chance
B.human_prey_swallow_time = swallowTime
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ TODO: Make them light up and heat the air when exposed to oxygen.
vore_ignores_undigestable = 0 // they absorb rather than digest, you're going in either way
vore_default_mode = DM_HOLD
vore_digest_chance = 0 // Chance to switch to digest mode if resisted
vore_absorb_chance = 20 // BECOME A PART OF ME.
vore_absorb_chance = 100 // Will always start to absorb if the prey fails its generous escape chance // RS edit - copy from virgo
vore_pounce_chance = 5 // Small chance to punish people who abuse their nomming behaviour to try and kite them forever with repeated melee attacks.
vore_stomach_name = "internal chamber"
vore_stomach_flavor = "You are squeezed into the tight embrace of the alien creature's warm and cozy insides."
Expand All @@ -92,7 +92,10 @@ TODO: Make them light up and heat the air when exposed to oxygen.
var/obj/belly/B = vore_selected
B.name = "internal chamber"
B.desc = "Having been too slow to disentangle yourself from the gaslamp's tentacles, the alien creature eventually winds enough of them around your body to lift you up off of the ground. Struggle as you might now, it is too late to deny the jellyfish-esque scavenger its lucky catch; inch by inch, the gaslamp tugs you upwards into its equivalent of a stomach, the transition between the cool-to-frigid atmosphere on the outside to its surprising internal heat something you can feel through any outer wear you possess. Minutes pass, soon resulting in the gentle creature's body sporting a rounded, bulging swell, an indistinct shadow shifting and twitching inside it as you squirm about. Be it to escape or simply to get settled, you might want to take care, however. The gaslamp's internal chamber is slick and squishy instead of overly oppressive, yet, each wave of warmth that pulses over you leaves you feeling weaker than the last..."

//RS edit start - copy from virgo
B.escapechance = 40 //easy to squirm out of...
B.escapechance_absorbed = 5 //...but EXTREMELY clingy if you fail
//RS edit end
B.emote_lists[DM_HOLD] = list(
"The gaslamp gently bobs up and down as it lazily drifts elsewhere, the movement hardly enough to disturb the shadowy, indistinct figure curled up within it: you.",
"The fungal creature’s inner walls tenderly ripple and squeeze about your form for a few moments, squelching softly... until another wave of warmth pulses through the chamber.",
Expand Down
58 changes: 55 additions & 3 deletions code/modules/mob/living/simple_mob/subtypes/vore/succubi.dm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN // They just want to drain you!
vore_digest_chance = 25 // But don't you dare try to escape...
vore_digest_chance = 0 // RS edit - no digest chance as they use select instead
vore_icons = SA_ICON_LIVING | SA_ICON_REST

/datum/say_list/succubus
Expand All @@ -66,8 +66,60 @@
B.digest_brute = 2
B.digest_burn = 2
B.digest_oxy = 1
B.digestchance = 25
B.selectchance = 25 // RS edit
B.digestchance = 0 // RS edit
B.absorbchance = 0
B.escapechance = 15
B.selective_preference = DM_DRAIN
B.selective_preference = DM_DIGEST //RS edit
B.escape_stun = 5
B.transferlocation_absorb = "curves" //RS edit

//RS edit start
var/obj/belly/curves = new /obj/belly(src)
curves.immutable = TRUE
curves.name = "curves"
curves.desc = "Your entire being is cast adrift, no longer tight as it was in the succubus's gut but still inexorably bound, a sensation of warmth surrounding your entire being - it's pleasantly comfortable, relaxing even, as though lulling you, tempting you into simply allowing yourself to drift off. It's difficult to focus on yourself at all, any sense of your own position having abandoned you - instead, you can simply feel an odd, gentle sensation of being occasionally rubbed, stroked, squeezed, your captor eager to enjoy her prize. Even trying to move seems to elicit a satisfied chuckle, almost as though she knows that, at least on some level, some part of you wanted to give yourself to her - and she seemingly has little intention of giving you back."
curves.digest_mode = DM_HOLD // like, shes got you already, doesn't need to get you more
curves.mode_flags = DM_FLAG_FORCEPSAY
curves.escapable = TRUE // good luck
curves.escapechance = 40 // high chance of STARTING a successful escape attempt
curves.escapechance_absorbed = 5 // m i n e
curves.vore_verb = "soak"
curves.count_absorbed_prey_for_sprite = FALSE

curves.absorbed_struggle_messages_inside = list(
"You try and push free from %pred's %belly, but can't seem to will yourself to move.",
"Your fruitless mental struggles only cause %pred to chuckle lightly.",
"You can't make any progress freeing yourself from %pred's %belly.")
/* copied from upstream - uncomment these if escape/struggle customisation PR is ported
curves.escape_attempt_absorbed_messages_owner = list(
"%prey is attempting to free themselves from your %belly!")
curves.escape_attempt_absorbed_messages_prey = list(
"You try to force yourself out of %pred's %belly.",
"You strain and push, attempting to reach out of %pred's %belly.",
"You work up the will to try and force yourself free of %pred's clutches.")
curves.escape_absorbed_messages_owner = list(
"%prey forces themselves free of your %belly!")
curves.escape_absorbed_messages_prey = list(
"You finally manage to wrest yourself free from %pred's %belly, re-asserting your more usual form.",
"You heave and push, eventually spilling out from %pred's %belly, eliciting an amused smile from your former captor.")
curves.escape_absorbed_messages_outside = list(
"%prey suddenly forces themselves free of %pred's %belly!")
curves.escape_fail_absorbed_messages_owner = list(
"%prey's attempt to escape form your %belly has failed!")
curves.escape_fail_absorbed_messages_prey = list(
"Before you manage to reach freedom, you feel yourself getting dragged back into %pred's %belly!",
"%pred laughs lightly, simply pressing your wrigging form back into her %belly before you get anywhere.",
"%pred gently rubs a finger over her %belly, the gentle pressure breaking your concentration and sending you sinking back into her form.",
"Try as you might, you barely make an impression before %pred simply clenches with the most minimal effort, binding you back into her %belly.",
"Unfortunately, %pred seems to have absolutely no intention of letting you go, and your futile effort goes nowhere.",
"Strain as you might, you can't keep up the effort long enough before you sink back into %pred's %belly.")
*/

//RS edit end
85 changes: 79 additions & 6 deletions code/modules/vore/eating/belly_obj_vr.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@
var/immutable = FALSE // Prevents this belly from being deleted
var/escapable = FALSE // Belly can be resisted out of at any time
var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
var/selectchance = 0 // % Chance of stomach switching to selective mode if prey struggles // RS add
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/escapechance_absorbed = 0 // % Chance of absorbed prey finishing an escape. Requires a successful escape roll against the above as well. //RS edit - copy from virgo
var/escape_stun = 0 // AI controlled mobs with a number here will be weakened by the provided var when someone escapes, to prevent endless nom loops
var/transferchance = 0 // % Chance of prey being trasnsfered, goes from 0-100%
var/transferchance_secondary = 0 // % Chance of prey being transfered to transferchance_secondary, also goes 0-100%
Expand All @@ -42,6 +44,7 @@
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/transferlocation_secondary // Secondary location that prey is released to.
var/transferlocation_absorb // Location that prey is moved to if they get absorbed. //RS add
var/release_sound = "Splatter" // Sound for letting someone out. Replaced from True/false
var/mode_flags = 0 // Stripping, numbing, etc.
var/fancy_vore = FALSE // Using the new sounds?
Expand Down Expand Up @@ -114,6 +117,14 @@
"Your fruitless mental struggles only shift %pred's %belly a tiny bit.",
"You can't make any progress freeing yourself from %pred's %belly.")

//RS edit start
var/list/select_chance_messages_owner = list(
"You feel your %belly beginning to become active!")

var/list/select_chance_messages_prey = list(
"In response to your struggling, %pred's %belly begins to get more active...")
//RS edit end

var/list/digest_messages_owner = list(
"You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
"You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
Expand Down Expand Up @@ -942,6 +953,21 @@
owner.updateVRPanel()
if(isanimal(owner))
owner.update_icon()
//RS edit start
// Finally, if they're to be sent to a special pudge belly, send them there
if(transferlocation_absorb)
var/obj/belly/dest_belly
for(var/obj/belly/B as anything in owner.vore_organs)
if(B.name == transferlocation_absorb)
dest_belly = B
break
if(!dest_belly)
to_chat(owner, "<span class='vwarning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had its transfer location cleared as a precaution.</span>")
transferlocation_absorb = null
return

transfer_contents(M, dest_belly)
//RS edit end

// Handle a mob being unabsorbed
/obj/belly/proc/unabsorb_living(mob/living/M)
Expand Down Expand Up @@ -1069,7 +1095,7 @@

for(var/mob/M in hearers(4, owner))
M.show_message(struggle_outer_message, 2) // hearable
to_chat(R, struggle_user_message)
//to_chat(R, struggle_user_message) RS remove - moved to bottom of proc

var/sound/struggle_snuggle
var/sound/struggle_rustle = sound(get_sfx("rustle"))
Expand Down Expand Up @@ -1164,17 +1190,40 @@
digest_mode = DM_ABSORB
return

else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
else if(prob(digestchance) && digest_mode != DM_DIGEST) //Next, let's see if it should run the digest chance.
to_chat(R, "<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get more active...</span>")
to_chat(owner, "<span class='warning'>You feel your [lowertext(name)] beginning to become active!</span>")
digest_mode = DM_DIGEST
return

//RS edit start
else if(prob(selectchance) && digest_mode != DM_SELECT) //Finally, let's see if it should run the selective mode chance.
var/select_chance_owner_message = pick(select_chance_messages_owner)
var/select_chance_prey_message = pick(select_chance_messages_prey)

select_chance_owner_message = replacetext(select_chance_owner_message, "%pred", owner)
select_chance_owner_message = replacetext(select_chance_owner_message, "%prey", R)
select_chance_owner_message = replacetext(select_chance_owner_message, "%belly", lowertext(name))
select_chance_owner_message = replacetext(select_chance_owner_message, "%countprey", living_count)
select_chance_owner_message = replacetext(select_chance_owner_message, "%count", contents.len)

select_chance_prey_message = replacetext(select_chance_prey_message, "%pred", owner)
select_chance_prey_message = replacetext(select_chance_prey_message, "%prey", R)
select_chance_prey_message = replacetext(select_chance_prey_message, "%belly", lowertext(name))
select_chance_prey_message = replacetext(select_chance_prey_message, "%countprey", living_count)
select_chance_prey_message = replacetext(select_chance_prey_message, "%count", contents.len)

select_chance_owner_message = "<span class='vwarning'>[select_chance_owner_message]</span>"
select_chance_prey_message = "<span class='vwarning'>[select_chance_prey_message]</span>"

to_chat(R, select_chance_prey_message)
to_chat(owner, select_chance_owner_message)
digest_mode = DM_SELECT
//RS edit end
else //Nothing interesting happened.
to_chat(R, "<span class='warning'>You make no progress in escaping [owner]'s [lowertext(name)].</span>")
to_chat(R, struggle_user_message) //RS edit
to_chat(owner, "<span class='warning'>Your prey appears to be unable to make any progress in escaping your [lowertext(name)].</span>")
return

to_chat(R, struggle_user_message) //RS add

/obj/belly/proc/relay_absorbed_resist(mob/living/R)
if (!(R in contents) || !R.absorbed)
Expand Down Expand Up @@ -1205,7 +1254,7 @@

for(var/mob/M in hearers(4, owner))
M.show_message(struggle_outer_message, 2) // hearable
to_chat(R, struggle_user_message)
//to_chat(R, struggle_user_message) RS remove - moved to bottom of proc

var/sound/struggle_snuggle
var/sound/struggle_rustle = sound(get_sfx("rustle"))
Expand All @@ -1219,6 +1268,30 @@
else
playsound(src, struggle_rustle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises, volume_channel = VOLUME_CHANNEL_VORE)

//RS Edit Start - virgo port
//absorb resists
if(escapable || owner.stat) //If the stomach has escapable enabled or the owner is dead/unconscious
if(prob(escapechance) || owner.stat) //Let's have it check to see if the prey's escape attempt starts.
to_chat(R, "<span class='warning'>You try to force yourself out of \the [lowertext(name)].</span>")
to_chat(owner, "<span class='warning'>Someone is attempting to free themselves from your [lowertext(name)]!</span>")
if(do_after(R, escapetime))
if((escapable || owner.stat) && (R.loc == src) && prob(escapechance_absorbed)) //Does the escape attempt succeed?
release_specific_contents(R)
to_chat(R,"<span class='warning'>You manage to free yourself from \the [lowertext(name)].</span>")
to_chat(owner,"<span class='warning'>[R] forces themselves free of your [lowertext(name)]!</span>")
for(var/mob/M in hearers(4, owner))
M.show_message("<span class='warning'>[R] climbs out of [owner]'s [lowertext(name)]!</span>", 2)
return
else if(!(R.loc == src)) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or you failed your roll.
to_chat(R,"<span class='warning'>Before you manage to reach freedom, you feel yourself getting dragged back into \the [lowertext(name)]!</span>")
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
return
to_chat(R, struggle_user_message)
//RS edit end


/obj/belly/proc/get_mobs_and_objs_in_belly()
var/list/see = list()
var/list/belly_mobs = list()
Expand Down

0 comments on commit b362fc8

Please sign in to comment.