Ghosts stay in bellies (#15918)

* Ghosts stay in bellies

Ported a change to digestion from chomp:
Changed digestion death to place the characters ghost inside of the belly they died in. This allows them to be see the belly text still, be carried around and can even be moved between bellies (such as moved along with everything else to intestines, etc), or hear a final subtled message. Tested and seems to work fine here.

Ports these PRs: https://github.com/CHOMPStation2/CHOMPStation2/pull/3074 https://github.com/CHOMPStation2/CHOMPStation2/pull/4772 https://github.com/CHOMPStation2/CHOMPStation2/pull/7132

Plus one addition of my own to prevent it playing the ingestion sound upon the ghost being placed in the belly.

* Fixes the ghost's camera being stuck when transferring them to different bellies.

* Don't announce releasing observers

* Fix for ghosts being visible in examines
This commit is contained in:
SatinIsle
2024-04-21 21:11:26 +10:00
committed by GitHub
parent fe82c0b6f3
commit e59031cb33
+31 -7
View File
@@ -363,18 +363,31 @@
STOP_PROCESSING(SSbellies, src)
owner?.vore_organs?.Remove(src)
owner = null
for(var/mob/observer/G in src)
G.forceMove(get_turf(src)) //ported from CHOMPStation PR#7132
return ..()
// Called whenever an atom enters this belly
/obj/belly/Entered(atom/movable/thing, atom/OldLoc)
if(istype(thing, /mob/observer)) //Ports CHOMPStation PR#3072
if(desc) //Ports CHOMPStation PR#4772
//Allow ghosts see where they are if they're still getting squished along inside.
var/formatted_desc
formatted_desc = replacetext(desc, "%belly", lowertext(name)) //replace with this belly's name
formatted_desc = replacetext(formatted_desc, "%pred", owner) //replace with this belly's owner
formatted_desc = replacetext(formatted_desc, "%prey", thing) //replace with whatever mob entered into this belly
to_chat(thing, "<span class='notice'><B>[formatted_desc]</B></span>")
if(OldLoc in contents)
return //Someone dropping something (or being stripdigested)
//Generic entered message
to_chat(owner,"<span class='vnotice'>[thing] slides into your [lowertext(name)].</span>")
if(!istype(thing, /mob/observer)) //Don't have ghosts announce they're reentering the belly on death
to_chat(owner,"<span class='vnotice'>[thing] slides into your [lowertext(name)].</span>")
//Sound w/ antispam flag setting
if(vore_sound && !recent_sound)
if(vore_sound && !recent_sound && !istype(thing, /mob/observer))
var/soundfile
if(!fancy_vore)
soundfile = classic_vore_sounds[vore_sound]
@@ -639,7 +652,7 @@
privacy_volume = 25
//Print notifications/sound if necessary
if(!silent)
if(!silent && !isobserver(M))
owner.visible_message("<span class='vnotice'>[span_green("<b>[owner] [release_verb] [M] from their [lowertext(name)]!</b>")]</span>",range = privacy_range)
var/soundfile
if(!fancy_vore)
@@ -699,6 +712,15 @@
for(var/mob/living/L in contents)
living_count++
var/count_total = contents.len
for(var/mob/observer/C in contents)
count_total-- //Exclude any ghosts from %count
var/list/vore_contents = list()
for(var/G in contents)
if(!isobserver(G))
vore_contents += G //Exclude any ghosts from %prey
for(var/mob/living/P in contents)
if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
total_bulge += P.size_multiplier
@@ -708,9 +730,9 @@
formatted_message = replacetext(raw_message, "%belly", lowertext(name))
formatted_message = replacetext(formatted_message, "%pred", owner)
formatted_message = replacetext(formatted_message, "%prey", english_list(contents))
formatted_message = replacetext(formatted_message, "%prey", english_list(vore_contents))
formatted_message = replacetext(formatted_message, "%countprey", living_count)
formatted_message = replacetext(formatted_message, "%count", contents.len)
formatted_message = replacetext(formatted_message, "%count", count_total)
return(span_red("<i>[formatted_message]</i>"))
@@ -1020,7 +1042,9 @@
//Incase they have the loop going, let's double check to stop it.
M.stop_sound_channel(CHANNEL_PREYLOOP)
// Delete the digested mob
M.ghostize() // Make sure they're out, so we can copy attack logs and such.
var/mob/observer/G = M.ghostize() //Ports CHOMPStation PR#3074 Make sure they're out, so we can copy attack logs and such.
if(G)
G.forceMove(src)
qdel(M)
// Handle a mob being absorbed
@@ -1636,7 +1660,7 @@
if(!(content in src) || !istype(target))
return
content.forceMove(target)
if(ismob(content))
if(ismob(content) && !isobserver(content))
var/mob/ourmob = content
ourmob.reset_view(owner)
if(isitem(content))