diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8274fd53b6..64cc9c755a 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 @@ -319,6 +320,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..2c94a77309 --- /dev/null +++ b/modular_chomp/code/game/objects/structures/watercloset_ch.dm @@ -0,0 +1,162 @@ +//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 hopper" + B.desc = "With a resounding CRUNCH, your form has gotten snagged by the Muffin Monster's rotational interlocking cutters indiscriminately crunching away at anything unlucky enough to end up in its hopper, only for the insatiable machine to grind it all down into a slurry mulch fine enough to pass through the narrow sewage lines trouble-free..." + B.digest_brute = 20 + 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..de249b5512 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"