diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 0833c55e04..d5902ccb25 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -54,6 +54,7 @@
var/emote_active = TRUE // Are we even giving emotes out at all or not?
var/next_emote = 0 // When we're supposed to print our next emote, as a world.time
var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to?
+ var/special_entrance_sound // CHOMPEdit: Mob specific custom entry sound set by mob's init_vore when applicable
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
@@ -314,6 +315,8 @@
soundfile = classic_vore_sounds[vore_sound]
else
soundfile = fancy_vore_sounds[vore_sound]
+ if(special_entrance_sound) //CHOMPEdit: Custom sound set by mob's init_vore or ingame varedits.
+ soundfile = special_entrance_sound
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
recent_sound = TRUE
diff --git a/modular_chomp/code/game/objects/structures/watercloset_ch.dm b/modular_chomp/code/game/objects/structures/watercloset_ch.dm
new file mode 100644
index 0000000000..9367fd926f
--- /dev/null
+++ b/modular_chomp/code/game/objects/structures/watercloset_ch.dm
@@ -0,0 +1,161 @@
+//Flushable toilets on station levels. Flushing sends stuff directly to a trashpit landmark without stinking up the cargo office.
+//Only on-station toilets are affected and only if the trashpit landmark also exists. Otherwise toilets will stay normal.
+
+/obj/structure/toilet
+ var/teleplumbed = FALSE
+ var/exit_landmark
+ var/exit_container
+ var/refill_cooldown = 200
+ var/refilling = FALSE
+
+/obj/structure/toilet/Initialize()
+ if(z in global.using_map.map_levels)
+ teleplumbed = TRUE
+ exit_landmark = locate(/obj/effect/landmark/teleplumb_exit)
+ exit_container = locate(/obj/structure/biowaste_tank)
+ if(exit_container)
+ exit_landmark = exit_container //Override landmark if container is available.
+ if(teleplumbed && exit_landmark)
+ desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean."
+ return ..()
+
+/obj/structure/toilet/attack_hand(mob/living/user as mob)
+ if(open && teleplumbed && exit_landmark && !refilling)
+ var/list/bowl_contents = list()
+ for(var/obj/item/I in loc.contents)
+ if(istype(I) && !I.anchored)
+ bowl_contents += I
+ for(var/mob/living/L in loc.contents)
+ if(L.resting || L.lying && L.size_multiplier <= 0.75 && !L.buckled)
+ bowl_contents += L
+ if(bowl_contents.len)
+ refilling = TRUE
+ user.visible_message("[user] flushes the toilet.", "You flush the toilet.")
+ playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao.
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ playsound(src, 'sound/mecha/powerup.ogg', 30, 1)
+ var/bowl_conga = 0
+ for(var/atom/movable/F in bowl_contents)
+ if(bowl_conga < 150)
+ bowl_conga += 2
+ spawn(3 + bowl_conga)
+ F.SpinAnimation(5,3)
+ spawn(15)
+ if(F.loc == loc)
+ F.forceMove(src)
+ spawn(refill_cooldown)
+ for(var/atom/movable/F in bowl_contents)
+ if(F.loc == src)
+ F.forceMove(exit_landmark)
+ bowl_contents.Cut()
+ refilling = FALSE
+ return
+ if(refilling)
+ playsound(src, 'sound/machines/door_locked.ogg', 30, 1)
+ to_chat(user, "The toilet is still refilling its tank.")
+ return ..()
+
+/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob)
+ if(refilling) //No cistern interactions until bowl contents have been dealt with.
+ return
+ return ..()
+
+/obj/structure/toilet/attack_ai(mob/user as mob)
+ if(isrobot(user))
+ if(user.client && user.client.eye == user)
+ return attack_hand(user)
+ else
+ return attack_hand(user)
+
+/obj/effect/landmark/teleplumb_exit
+ name = "teleplumbing exit"
+
+/obj/effect/landmark/teleplumb_exit/Entered(atom/movable/thing, atom/OldLoc)
+ thing.forceMove(get_turf(src))
+
+/obj/structure/biowaste_tank
+ name = "Bluespace Bio-Compostor Terminal"
+ icon = 'icons/obj/survival_pod_comp.dmi'
+ icon_state = "pod_computer"
+ desc = "It appears to be a massive sealed container attached to some heavy machinery and thick tubes containing a whole network of interdimensional pipeworks. It appears whatever vanished down the station's toilets ends up in this thing."
+ anchored = TRUE
+ density = TRUE
+ var/muffin_mode = FALSE
+ var/mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster
+
+/obj/structure/biowaste_tank/Initialize()
+ muffinmonster = new /mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster(src)
+ muffinmonster.name = "Activate Muffin Monster"
+ muffinmonster.voremob_loaded = TRUE
+ muffinmonster.init_vore()
+ return ..()
+
+/obj/structure/biowaste_tank/AllowDrop()
+ return TRUE
+
+/obj/structure/biowaste_tank/Entered(atom/movable/thing, atom/OldLoc)
+ if(istype(thing, /obj/item/weapon/reagent_containers/food))
+ qdel(thing)
+ return
+ if(istype(thing, /obj/item/organ))
+ qdel(thing)
+ return
+ if(istype(thing, /obj/item/weapon/storage/vore_egg))
+ if(thing.contents.len)
+ for(var/atom/movable/C in thing.contents)
+ C.forceMove(src)
+ qdel(thing)
+ return
+ if(muffin_mode)
+ if(muffinmonster)
+ thing.forceMove(muffinmonster.vore_selected)
+ else
+ muffin_mode = FALSE
+
+/obj/structure/biowaste_tank/attack_hand(var/mob/user as mob)
+ if(contents.len)
+ var/atom/movable/choice = tgui_input_list(usr, "It appears the machine has caught some items in the lost-and-found filter system. Would you like to eject something?", "Item Retrieval Console", contents)
+ if(choice)
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ return
+ if(choice == muffinmonster && muffinmonster.loc == src)
+ muffin_mode = !muffin_mode
+ if(muffin_mode)
+ muffinmonster.name = "Deactivate Muffin Monster"
+ for(var/atom/movable/C in contents)
+ if(C == muffinmonster)
+ continue
+ C.forceMove(muffinmonster.vore_selected)
+ else
+ muffinmonster.name = "Activate Muffin Monster"
+ muffinmonster.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
+ return
+ else
+ choice.forceMove(get_turf(src))
+
+/obj/structure/biowaste_tank/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
+ if(muffinmonster && muffin_mode)
+ muffinmonster.name = "Muffin Monster"
+ muffinmonster.forceMove(get_turf(src))
+ muffinmonster = null
+ muffin_mode = FALSE
+
+/mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster
+ name = "Muffin Monster"
+ desc = "OH GOD IT'S LOOSE!"
+ icon_state = "muffinmonster"
+ icon_living = "muffinmonster"
+ icon_dead = "muffinmonster-dead"
+ icon_rest = "muffinmonster_rest"
+ icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi'
+ has_eye_glow = FALSE
+ vore_default_item_mode = IM_DIGEST
+
+/mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster/init_vore()
+ if(!voremob_loaded)
+ return
+ .=..()
+ var/obj/belly/B = vore_selected
+ B.name = "waste shredder"
+ B.digest_brute = 12
+ B.special_entrance_sound = 'sound/machines/blender.ogg'
\ No newline at end of file
diff --git a/modular_chomp/icons/mob/vore64x32_ch.dmi b/modular_chomp/icons/mob/vore64x32_ch.dmi
index 64a36e6a5d..85f8d558ef 100644
Binary files a/modular_chomp/icons/mob/vore64x32_ch.dmi and b/modular_chomp/icons/mob/vore64x32_ch.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index d26c936fc8..ef82f3509a 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1604,7 +1604,6 @@
#include "code\game\objects\structures\trash_pile_vr_ch.dm"
#include "code\game\objects\structures\under_wardrobe.dm"
#include "code\game\objects\structures\watercloset.dm"
-#include "code\game\objects\structures\watercloset_vr.dm"
#include "code\game\objects\structures\windoor_assembly.dm"
#include "code\game\objects\structures\window.dm"
#include "code\game\objects\structures\window_spawner.dm"
@@ -4491,6 +4490,7 @@
#include "modular_chomp\code\datums\autolathe\engineering_ch.dm"
#include "modular_chomp\code\datums\autolathe\general_ch.dm"
#include "modular_chomp\code\game\machinery\airconditioner_ch.dm"
+#include "modular_chomp\code\game\objects\structures\watercloset_ch.dm"
#include "modular_chomp\code\game\objects\structures\crate_lockers\largecrate.dm"
#include "modular_chomp\code\game\turfs\simulated\outdoors\desert_planet.dm"
#include "modular_chomp\code\modules\admin\functions\modify_traits.dm"