From 7366cba99c2183a10f2a691397fabb91d556c246 Mon Sep 17 00:00:00 2001 From: ReoDaProtovali Date: Tue, 17 Sep 2024 00:46:35 -0500 Subject: [PATCH] done? --- .../code/machinery/feeding_tube_industrial.dm | 157 ++++++++++++++---- code/datums/traits/neutral.dm | 4 +- tgstation.dme | 1 + 3 files changed, 129 insertions(+), 33 deletions(-) diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm index dbaabc7a..9921541d 100644 --- a/GainStation13/code/machinery/feeding_tube_industrial.dm +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -5,13 +5,19 @@ /obj/structure/disposaloutlet/industrial_feeding_tube name = "industrial feeding tube" - desc = "" + desc = "An imposing machine designed to pump an absurd amount of food down something's throat. It seems to connect to disposal pipes." icon = 'icons/obj/atmospherics/pipes/disposal.dmi' icon_state = "outlet" anchored = FALSE var/turf/target // this will be where the output objects are 'thrown' to. - var/attached //Where the tube tries to splort out into - var/obj/machinery/iv_drip/feeding_tube/stored //This is made using a feeding tube + /// Who the tube is attached to + var/mob/living/attached + /// Where the tube tries to dump it's stuff into + var/output_dest + /// It's Glogged ! + var/clogged = FALSE + /// This is made using a feeding tube + var/obj/machinery/iv_drip/feeding_tube/stored var/start_eject = 0 var/eject_range = 2 @@ -30,22 +36,14 @@ /obj/machinery/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) . = ..() - if(!isliving(usr) || !usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) + if(!usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) return if(attached) - visible_message("[attached] is detached from [src].") + attached.visible_message("[attached] is detached from [src].") attached = null update_icon() - return - - if(!Adjacent(target) || !usr.Adjacent(target)) - return - - - if(!target.has_dna()) - to_chat(usr, "[src] beeps: Warning, incompatible creature!") - return + return if(Adjacent(target) && usr.Adjacent(target)) if(beaker) @@ -53,35 +51,98 @@ log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") add_fingerprint(usr) attached = target - START_PROCESSING(SSmachines, src) update_icon() else to_chat(usr, "There's nothing attached to [src]!") //gs13 edit if(iscarbon(target)) var/mob/living/carbon/feedee - if(HAS_TRAIT(feedee, TRAIT_TRASHCAN)) - var/food_dump = input("Where do you shove the tube?", "Select belly") as null|anything in feedee.vore_organs - if(!food_dump || !istype(food_dump, /obj/belly)) - attached = target //Attach normally - return + + if(HAS_TRAIT(feedee, TRAIT_TRASHCAN) || feedee) + var/food_dump = input("Where do you shove the tube? (cancel for it to just feed normally)", "Select belly") as null|anything in feedee.vore_organs + if(!food_dump || !isbelly(food_dump)) + output_dest = feedee //Attach normally else - attached = food_dump - + output_dest = food_dump //Attach to vorebelly + + attached = feedee + START_PROCESSING(SSmachines, src) + return // expel the contents of the holder object, then delete it // called when the holder exits the outlet /obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H) + var/clunkVol = LAZYLEN(H.contents) + if(H.hasmob) //Uh oh- + clunkVol += 25 + playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50, 25)) H.active = FALSE - flick("outlet-open", src) - if((start_eject + 30) < world.time) - start_eject = world.time - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) - addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 20) - else - addtimer(CALLBACK(src,PROC_REF(expel_holder), H), 20) + if(clogged) + clog(H.contents) + if(!attached) + flick("ind-tube-spew", src) + + addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 5) + return -/obj/structure/disposaloutlet/proc/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) + + if(isliving(output_dest)) + var/list/not_food = list() + var/turf/T = get_turf(src) + + for(var/atom/movable/AM in H) + if(istype(AM, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/food = AM + + var/food_reagents = food.reagents + if(food_reagents.total_volume) + var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~ + + SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached) + + food_reagents.reaction(attached, INGEST, food_size) + food_reagents.trans_to(attached, food_size) + + food.checkLiked(food_size, attached) //...Hopefully you like the taste. + + if(food.trash) //Lets make the trash the food's supposed to make, if it has any + var/trash = food.generate_trash(src) + if(not_food) + not_food += trash // If it's already going to get clogged, clog it more with the trash + else + trash.forceMove(T) // Otherwise move it to the tile. For convinience + + qdel(food) //Gulp... + continue + + else + not_food += AM // That's not (traditionally) edible! + + if(not_food) + clog(not_food) // Now you've gone and clogged us... + H.vent_gas(T) + qdel(H) + return + + if(isbelly(output_dest)) + var/list/inedible //Some things shouldnt be eaten... + var/turf/T = get_turf(src) + + for(var/atom/movable/AM in H) + if(isliving(AM)) + var/mob/living/cutie = AM + if(cutie.devourable != TRUE) //Do not eat this QT... + inedible += cutie + continue + + AM.forceMove(attached) + if(inedible) + clog(inedible) + + H.vent_gas(T) + qdel(H) + +/obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) if(playsound) playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) @@ -92,6 +153,9 @@ for(var/A in H) var/atom/movable/AM = A + + target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) + AM.forceMove(T) AM.pipe_eject(dir) AM.throw_at(target, eject_range, 1) @@ -99,7 +163,38 @@ H.vent_gas(T) qdel(H) -/obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) +/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user) + . = ..() + if(attached) + attached.visible_message("[attached] is detached from [src].") + attached = null + update_icon() + return + +/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params) + if(I.tool_behaviour == TOOL_CROWBAR) + user.visible_message("") + if(do_after(user, 30, TRUE, src)) + unclog() + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) + for(var/atom/movable/AM in clog_junk) + AM.forceMove(src) + clogged = TRUE + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() + + for(var/atom/movable/AM in src) + + target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) + + AM.forceMove(T) + AM.pipe_eject(dir) + AM.throw_at(target, eject_range, 1) + + +/obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I) if(!I.tool_start_check(user, amount=0)) return TRUE diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 3c1f24e6..77b03dd8 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -191,10 +191,10 @@ medical_record_text = "Patient has been observed eating inedible garbage." /datum/quirk/trashcan/add() - quirk_holder.verbs += /mob/living/proc/eat_trash + add_verb(quirk_holder, /mob/living/proc/eat_trash) /datum/quirk/trashcan/remove() - quirk_holder.verbs -= /mob/living/proc/eat_trash + remove_verb(quirk_holder, /mob/living/proc/eat_trash) /datum/quirk/universal_diet name = "Universal diet" diff --git a/tgstation.dme b/tgstation.dme index 4d263c91..ab9402e8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3097,6 +3097,7 @@ #include "GainStation13\code\machinery\adipoelectric_transformer.dm" #include "GainStation13\code\machinery\fattening_turret.dm" #include "GainStation13\code\machinery\feeding_tube.dm" +#include "GainStation13\code\machinery\feeding_tube_industrial.dm" #include "GainStation13\code\machinery\supply_teleporter.dm" #include "GainStation13\code\mechanics\fatness.dm" #include "GainStation13\code\mechanics\fatrousal.dm"