diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 758c491bba..4871f2a935 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -36,7 +36,7 @@
/mob/living/simple_animal/Destroy()
for(var/I in vore_organs)
var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
+ B.release_all_contents(include_absorbed = TRUE) // When your stomach is empty
prey_excludes.Cut()
. = ..()
@@ -130,7 +130,7 @@
/mob/living/simple_animal/death()
for(var/I in vore_organs)
var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
+ B.release_all_contents(include_absorbed = TRUE) // When your stomach is empty
..() // then you have my permission to die.
// Simple animals have only one belly. This creates it (if it isn't already set up)
diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm
index 5d36943a6a..10014599b6 100644
--- a/code/modules/vore/eating/belly_vr.dm
+++ b/code/modules/vore/eating/belly_vr.dm
@@ -114,20 +114,22 @@
// Release all contents of this belly into the owning mob's location.
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
// Returns the number of mobs so released.
-/datum/belly/proc/release_all_contents()
+/datum/belly/proc/release_all_contents(var/include_absorbed = FALSE)
if (internal_contents.len == 0)
return 0
- for (var/atom/movable/M in internal_contents)
+ for (var/M in internal_contents)
if(istype(M,/mob/living))
var/mob/living/ML = M
- if(ML.absorbed)
+ if(ML.absorbed && !include_absorbed)
continue
+ ML.absorbed = FALSE
- M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- internal_contents -= M // Remove from the belly contents
+ var/atom/movable/AM = M
+ AM.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
+ internal_contents -= AM // Remove from the belly contents
var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
if(B)
- B.internal_contents += M
+ B.internal_contents += AM
items_preserved.Cut()
checked_slots.Cut()
owner.visible_message("[owner] expels everything from their [lowertext(name)]!")
@@ -454,11 +456,11 @@
playsound(R.loc, strsound, 50, 1)
if(escapable) //If the stomach has escapable enabled.
- R << "You attempt to climb out of \the [name]."
- owner << "Someone is attempting to climb out of your [name]!"
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
+ R << "You start to climb out of \the [name]."
+ owner << "Someone is attempting to climb out of your [name]!"
if(do_after(R, escapetime))
- if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled?
+ if((escapable) && (R in internal_contents) && !R.absorbed) //Does the owner still have escapable enabled?
release_specific_contents(R)
R << "You climb out of \the [name]."
owner << "[R] climbs out of your [name]!"
@@ -467,10 +469,10 @@
return
else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
return
- else //Belly became inescapable.
- R << "Your attempt to escape [name] has failed!"
- owner << "The attempt to escape from your [name] has failed!"
- return
+ else //Belly became inescapable.
+ R << "Your attempt to escape [name] has failed!"
+ owner << "The attempt to escape from your [name] has failed!"
+ return
else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
var/location_found = 0
@@ -499,20 +501,20 @@
transfer_contents(R, transferlocation)
return
- else if(prob(absorbchance)) //After that, let's have it run the absorb chance.
- R << "In response to your struggling, \the [name] begins to get more active..."
- owner << "You feel your [name] beginning to become active!"
+ else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
+ R << "In response to your struggling, \the [name] begins to cling more tightly..."
+ owner << "You feel your [name] start to cling onto its contents..."
digest_mode = DM_ABSORB
return
- else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.
+ else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
R << "In response to your struggling, \the [name] begins to get more active..."
owner << "You feel your [name] beginning to become active!"
digest_mode = DM_DIGEST
return
else //Nothing interesting happened.
- R << "But make no progress in escaping [owner]'s [name]."
- owner << "But appears to be unable to make any progress in escaping your [name]."
+ R << "You make no progress in escaping [owner]'s [name]."
+ owner << "Your prey appears to be unable to make any progress in escaping your [name]."
return
//Transfers contents from one belly to another