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"