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