From f3c684ad9868e0d6e03c668a73d7443cf9fa5848 Mon Sep 17 00:00:00 2001
From: ReoDaProtovali <84661000+ReoDaProtovali@users.noreply.github.com>
Date: Sun, 29 Sep 2024 07:25:34 -0500
Subject: [PATCH] Almost complete....
---
.../crafting/recipes/recipes_misc_gs.dm | 12 +-
.../code/machinery/feeding_tube_industrial.dm | 458 +++++++++++-------
.../icons/obj/feeding_tube_industrial.dmi | Bin 0 -> 2854 bytes
v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg | Bin 0 -> 9043 bytes
4 files changed, 298 insertions(+), 172 deletions(-)
create mode 100644 GainStation13/icons/obj/feeding_tube_industrial.dmi
create mode 100644 v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg
diff --git a/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm
index 19da0bca4d..9d53cff605 100644
--- a/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm
+++ b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm
@@ -3,13 +3,15 @@
/datum/crafting_recipe/industrial_feeding_tube
name = "Industrial Feeding Tube"
reqs = list(
- /obj/machinery/iv_drip/feeding_tube = 1,
- /obj/item/stack/sheet/metal = 2,
- /obj/item/pipe = 2
+ // /obj/machinery/iv_drip/feeding_tube = 1, //Removing this. Seems to be buggy with not-items used to craft
+ /obj/item/stack/sheet/metal = 5,
+ /obj/item/stack/sheet/plastic = 5,
+ /obj/item/pipe = 2,
+ /obj/item/stock_parts/matter_bin = 2
)
parts = list(
- /obj/machinery/iv_drip/feeding_tube = 1
+ /obj/item/stock_parts/matter_bin = 2
)
- results = /obj/structure/disposaloutlet/industrial_feeding_tube
+ result = /obj/structure/disposaloutlet/industrial_feeding_tube
tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_SCREWDRIVER)
category = CAT_MISC
diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm
index f4f445a0ca..7de83343fa 100644
--- a/GainStation13/code/machinery/feeding_tube_industrial.dm
+++ b/GainStation13/code/machinery/feeding_tube_industrial.dm
@@ -5,9 +5,10 @@
/obj/structure/disposaloutlet/industrial_feeding_tube
name = "\improper industrial feeding tube"
- desc = "An imposing machine designed to pump an absurd amount of food down something's throat. It seems to connect to disposal pipes."
- icon = 'GainStation13/icons/obj/feeding_tube.dmi'
- icon_state = "feeding_tube"
+ desc = "An imposing machine designed to pump an absurd amount of \"food\" down something's throat. It seems to connect to disposal pipes."
+ icon = 'GainStation13/icons/obj/feeding_tube_industrial.dmi'
+ icon_state = "base"
+ max_integrity = 500 //Durable...
anchored = FALSE
/// Is it welded down?
var/welded = FALSE
@@ -17,44 +18,73 @@
var/output_dest
/// It's Glogged !
var/clogged = FALSE
- /// This is made using a feeding tube
- var/obj/machinery/iv_drip/feeding_tube/storedFeeder //Really wish I could redefine stored.
+ /// Are we currently pumping?
+ var/pumping = FALSE
+ /// Stuff we're currently trying to pump out
+ var/list/pump_stuff = list()
+ /// How many items we can push per-pump.
+ var/pump_limit = 5
-/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload, obj/machinery/iv_drip/feeding_tube/make_from)
+/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload)
. = ..()
- if(make_from)
- make_from.forceMove(src)
- storedFeeder = make_from
- else
- storedFeeder = new /obj/machinery/iv_drip/feeding_tube(src)
- trunk = locate() in loc
- if(trunk)
+ update_icon()
+
+ if(anchored) // So it can be mapped in, attached to something.
+ trunk = locate() in loc
+ if(!trunk)
+ return
trunk.linked = src // link the pipe trunk to self
anchored = TRUE
welded = TRUE //Make it functional
/obj/structure/disposaloutlet/industrial_feeding_tube/CheckParts(list/parts_list)
..()
- storedFeeder = locate(/obj/machinery/iv_drip/feeding_tube) in contents
+ pump_limit = 0
+ for(var/obj/item/stock_parts/matter_bin/mb in contents)
+ if(pump_stuff.Find(mb)) //stuff we're going to pump are not being used to build us.
+ continue
+ pump_limit += mb.rating * 2.5 // ~20 items per pump with 2 bluespace bins
+ pump_limit = ceil(pump_limit) //Only whole numbers
+
+/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ new /obj/item/stack/sheet/metal(loc, 5)
+ new /obj/item/stack/sheet/plastic(loc, 5)
+ new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
+ new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
+
+ if(contents) //Anything still glogged inside...
+ for(var/atom/movable/AM in src)
+ AM.forceMove(loc)
+ qdel(src)
+
/obj/structure/disposaloutlet/industrial_feeding_tube/Destroy()
if(attached)
attached = null
if(output_dest)
output_dest = null
- QDEL_NULL(storedFeeder)
+
+ if(LAZYLEN(contents)) // Just to be safe, lets dump everything out before it's deleted.
+ for(var/atom/movable/AM in contents)
+ if(istype(AM, /obj/item/stock_parts/matter_bin))
+ if(AM in pump_stuff) // Unless it's one of our component parts..
+ AM.forceMove(loc)
+ continue
+ qdel(AM)
+
return ..()
/obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target)
. = ..()
- if(!usr.canUseTopic(src, BE_CLOSE) || !isliving(target))
+ if(!usr.canUseTopic(src, BE_CLOSE)) // iscarbon() so that xenos/wendigos(?) can do feeding stuff maybe. Maybe.
return
-
- if(!anchored || !welded)
- to_chat(usr, "You need to anchor down \the [src] before you can use it.")
+ if(!welded)
+ to_chat(usr, "You need to weld down \the [src] before you can use it.")
+ return
+ if(!isliving(target))
return
-
if(attached)
attached.visible_message("[attached] is detached from [src].")
attached = null
@@ -62,18 +92,39 @@
return
if(iscarbon(target))
- var/mob/living/carbon/feedee
+ var/mob/living/carbon/feedee = target
+
+ if(HAS_TRAIT(feedee, TRAIT_TRASHCAN))
+ var/food_dump = input(usr, "Where do you shove the tube? (cancel for to just feed normally)", "Select belly") as null|anything in feedee.vore_organs
+ if(food_dump && isbelly(food_dump))
+ // Best to be safe with this thing. Since you can eat pretty much anythign with it...
+ // Including People, Intentionally or otherwise.
+ if(usr != feedee) // If someone is feeding themself, skip the prefcheck.
+ var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your [food_dump]! Do you want this?", "THE TUBE", "Yes!!", "No!")
+ if(feedeePrefCheck != "Yes!!")
+ to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
+ 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
output_dest = food_dump //Attach to vorebelly
+ attached = feedee
+ update_icon()
+ START_PROCESSING(SSobj, src)
+ face_atom(feedee)
+ return
+ //Either we arn't attaching to vorebelly, or we arnt able to. Let's try to feed them normally!
+ if(usr != feedee) //
+ var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your mouth! Do you want this?", "THE TUBE", "Yes!!", "No!")
+ if(feedeePrefCheck != "Yes!!")
+ to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
+ return
+
+ output_dest = feedee //Attach normally
attached = feedee
+
update_icon()
- START_PROCESSING(SSmachines, src)
+ START_PROCESSING(SSobj, src)
+ face_atom(feedee)
return
/obj/structure/disposaloutlet/industrial_feeding_tube/process()
@@ -87,21 +138,28 @@
update_icon()
return PROCESS_KILL
- //face_atom(attached)
+ face_atom(attached)
-/obj/structure/disposaloutlet/industrial_feeding_tube/update_icon()
+/obj/structure/disposaloutlet/industrial_feeding_tube/update_overlays()
// A lot of this is temp. More likely than not you shouldnt see this comment as it'll be properly updated when reo PRs this.
// Or it wont because epic fail :333
- if(attached)
- icon_state = "injecting" //Temp. Change it when proper icons are made
- else
- icon_state = "injectidle" //Temp.
-
+ . = ..()
cut_overlays()
+ var/mutable_appearance/tube_overlay = mutable_appearance('GainStation13/icons/obj/feeding_tube_industrial.dmi', "tube_idle")
+
+ if(pumping)
+ tube_overlay.icon_state = "tube-pump"
+ else
+ if(attached)
+ tube_overlay.icon_state = "tube-active"
+ else
+ tube_overlay.icon_state = "tube-idle"
+
+ add_overlay("light-[clogged ? "r" : "g"]")
+
+ add_overlay(tube_overlay)
-
-
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
@@ -111,71 +169,109 @@
clunkVol += 25
playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50 : 25))
H.active = FALSE
+ H.vent_gas(get_turf(src))
if(clogged)
clog(H.contents)
- if(!attached)
- //flick("ind-tube-spew", src)
-
- addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 5)
- return
-
+ else
+ for(var/atom/movable/AM in H.contents)
+ pump_stuff += AM // Get ready to pump!
+ AM.forceMove(src)
+ if(!pumping) //Lets start a new pump cycle if we arnt pumping. Otherwise, it'll just be added to the queue.
+ pump()
+ qdel(H)
- 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/datum/reagents/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/obj/item/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)
+/obj/structure/disposaloutlet/industrial_feeding_tube/proc/pump(repeat = TRUE, unlimited = FALSE)
+ if(clogged)
return
+ var/list/this_pump = list() //What we're going to pump this cycle
+ var/item_count = 0
+ for(var/atom/movable/AM in pump_stuff)
+ this_pump += AM // Add to the stuff we're currently pumping
+ item_count++
+ if(item_count > pump_limit && !unlimited) //We're pumping as much as our parts allow!
+ break
+ if(!pumping)
+ pumping = TRUE
+ update_icon()
+ spawn(8)
+ pumping = FALSE
+ update_icon()
+ spawn(9) //Wait for the animation to finish
- 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)
+ if(!output_dest || !attached) //We either arnt, or got disconnected by time stuff was about to splort out!
+ spew(this_pump, TRUE)
+ if(LAZYLEN(pump_stuff) && repeat)
+ pump()
+ return
- H.vent_gas(T)
- qdel(H)
+ var/fed_something = FALSE
+ // Feed Normally
+ if(isliving(output_dest))
+ var/list/not_food = list()
+ for(var/atom/movable/AM in this_pump)
+ if(istype(AM, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/food = AM
+ var/datum/reagents/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/obj/item/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(get_turf(src)) // Otherwise move it to the tile. For convinience
+
+ fed_something = TRUE
+ pump_stuff -= food
+ qdel(food) //Gulp...
+ continue
+ else
+ not_food += AM // That's not (traditionally) edible!
+
+ if(LAZYLEN(not_food))
+ clog(not_food) // Now you've gone and clogged us...
+
+ // Feed Voraciously
+ if(isbelly(output_dest))
+ var/list/inedible //Some things shouldnt be eaten...
+ for(var/atom/movable/AM in this_pump)
+ pump_stuff -= AM // We're putting this in. Remove it from the list.
+ if(isitem(AM))
+ var/obj/item/I = AM
+ if(is_type_in_list(I, item_vore_blacklist))
+ inedible += I
+ continue
+ if(isliving(AM))
+ var/mob/living/cutie = AM
+ if(cutie.devourable != TRUE) //Do not eat this QT...
+ inedible += cutie
+ continue
+
+ fed_something = TRUE
+ AM.forceMove(output_dest)
+ if(inedible)
+ clog(inedible)
+
+ // After everything, if we've pushed something, play the "rubber tube noise"
+ // It's technically an evil digestion sound from a snowflake shadekin, but it makes for a good tube sound. Thanks Verkie!
+ if(fed_something)
+ playsound(attached.loc, 'v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg', rand(10,50), 1)
+
+ if(LAZYLEN(pump_stuff) && repeat)
+ pump()
+ else
+ pumping = FALSE
+ update_icon()
+
/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)
@@ -183,18 +279,9 @@
if(!H)
return
- var/turf/T = get_turf(src)
+ spew(H.contents)
- 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)
-
- H.vent_gas(T)
+ H.vent_gas(get_turf(src))
qdel(H)
/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user)
@@ -202,41 +289,49 @@
if(attached)
attached.visible_message("[attached] is detached from [src].")
attached = null
+ output_dest = null
update_icon()
return
/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params)
- if(user.a_intent == INTENT_HARM)
+ if(user.a_intent != INTENT_HELP)
return ..()
switch(I.tool_behaviour)
if(TOOL_WRENCH)
if(welded)
to_chat(user, "\The [src] is firmly welded to the floor. Cut the floorwelds before trying to unwrench it!")
+ return TRUE
var/turf/T = get_turf(src)
- if(!T.intact || !isfloorturf(T))
- to_chat(user, "You need to remove the floor tiles before detaching \the [src]!")
- return
+ if(T.intact && isfloorturf(T))
+ to_chat(user, "You need to remove the floor tiles before [anchored ? "detaching" : "attaching"] \the [src]!")
+ return TRUE
if(anchored)
I.play_tool_sound(src, 100)
- anchored = !anchored
+
+ anchored = FALSE
trunk.linked = null
trunk = null
attached = null
output_dest = null
+
user.visible_message("[user] detaches \the [src] from the floor!")
- return
+ return TRUE
else
var/found_trunk = FALSE
for(var/obj/structure/disposalpipe/P in T)
if(istype(P, /obj/structure/disposalpipe/trunk))
+ var/obj/structure/disposalpipe/trunk/newtrunk = P
+ if(newtrunk.linked) //Trunk is already linked to something
+ continue
found_trunk = TRUE
+ trunk = newtrunk
break
if(!found_trunk)
to_chat(user, "\The [src] requires a trunk underneath it in order to work!")
return
-
+
to_chat(user, "You attach \the [src] to the trunk.")
- return
+ anchored = TRUE
I.play_tool_sound(src, 100)
update_icon()
@@ -245,84 +340,113 @@
if(TOOL_CROWBAR)
if(!clogged)
to_chat(user, "\The [src] doesnt seem to be clogged at the moment...")
- return
+ return TRUE
- user.visible_message("[user] inserts [user.p_their()] [I] into the maintenance hatch of \the [src], attempting to unclog it...")
+ user.visible_message("[user] starts to pry open the maintenance hatch of \the [src], attempting to unclog it...")
if(do_after(user, 30, TRUE, src))
user.visible_message("[user] unclogs \the [src]!")
unclog()
-
+ return
. = ..()
-/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()
-
- var/turf/T = get_turf(src)
- for(var/atom/movable/AM in src)
- if(AM == storedFeeder) // We need to keep this...
- continue
-
- target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2))
-
- 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
if(anchored)
- var/turf/T = get_turf(src)
- if(!welded) // If we're attaching it, we need to check for the pipe we're attaching to
- var/found_trunk = FALSE
- for(var/obj/structure/disposalpipe/P in T)
- if(istype(P, /obj/structure/disposalpipe/trunk))
- found_trunk = TRUE
- break
- if(!found_trunk) // No pipe, no attach.
- to_chat(user, "\The [src] needs to be welded to a trunk!")
- return
-
- to_chat(user, welded ? "You start slicing the floorweld off \the [src]..." : "You start welding \the [src] in place...")
+ //var/turf/T = get_turf(src)
+ if(!welded)
+ if(!trunk) // If we're attaching it, we need to check for the pipe we're attaching to
+ to_chat(user, "\The [src] needs to be welded to a trunk.")
+ return TRUE
+ to_chat(user, "You start welding \the [src] in place...")
+ else
+ if(clogged) // There's junk inside!
+ to_chat(user, "There's junk inside \the [src]! Clean it out before trying to remove it!")
+ return TRUE
+ //Already welded, lets cut it free
+ to_chat(user, "You start slicing the floorweld off \the [src]...")
+
playsound(src, 'sound/items/welder2.ogg', 100, 1)
if(I.use_tool(src, user, 20))
if(welded)
to_chat(user, "You slice the floorweld off [src].")
welded = FALSE
- return
+ trunk.linked = null
+ return TRUE
else
to_chat(user, "You weld \the [src] to the floor.")
welded = TRUE
- trunk = locate(/obj/structure/disposalpipe/trunk) in T
trunk.linked = src
- return
+ return TRUE
else
to_chat(user, "You begin deconstructing \the [src]")
if(I.use_tool(src, user, 30))
deconstruct(TRUE)
- return
+ return TRUE
-/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(storedFeeder)
- storedFeeder.forceMove(loc) //Lets get our Feeder back
- transfer_fingerprints_to(storedFeeder)
- storedFeeder = null
+// Someone got stuck inside after it got clogged!
+// Lets let them force their way out
+/obj/structure/disposaloutlet/industrial_feeding_tube/container_resist(mob/living/user)
+ if(user.stat || !clogged) //If it's not clogged, they'll be ejected soon... One way or another.
+ return
+ playsound(src, "clang", 50)
+ visible_message("\The [src] loudly clongs as something inside tries to break free!")
+ if(do_after(user, 100))
+ unclog()
+
+/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk)
+ clogged = TRUE
+ for(var/atom/movable/AM in clog_junk)
+ if(!pump_stuff.Find(AM))
+ pump_stuff += AM
+
+ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1)
+
+/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog()
+
+ spew(pump_stuff)
+
+ clogged = FALSE
+
+/obj/structure/disposaloutlet/industrial_feeding_tube/proc/spew(var/list/spew_stuff, playsound = FALSE)
+ var/turf/T = get_turf(src)
+
+ if(playsound)
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ for(var/atom/movable/AM in spew_stuff)
+ if(AM in pump_stuff)
+ pump_stuff -= AM
+ target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2))
+
+ AM.forceMove(T)
+ AM.pipe_eject(dir)
+ AM.throw_at(target, eject_range, 1)
+
+/obj/structure/disposaloutlet/industrial_feeding_tube/proc/face_atom(atom/A) //Literally stolen from /mob. Sue me.
+ if(!A || !x || !y || !A.x || !A.y )
+ return
+ var/dx = A.x - x
+ var/dy = A.y - y
+ if(!dx && !dy) // Wall items are graphically shifted but on the floor
+ if(A.pixel_y > 16)
+ setDir(NORTH)
+ else if(A.pixel_y < -16)
+ setDir(SOUTH)
+ else if(A.pixel_x > 16)
+ setDir(EAST)
+ else if(A.pixel_x < -16)
+ setDir(WEST)
+ return
+
+ if(abs(dx) < abs(dy))
+ if(dy > 0)
+ setDir(NORTH)
else
- var/feeder = new /obj/machinery/iv_drip/feeding_tube(loc)
- transfer_fingerprints_to(feeder)
- new /obj/item/stack/sheet/metal(loc, 2)
- new /obj/item/pipe(loc)
- new /obj/item/pipe(loc)
- if(contents) //Anything still glogged inside...
- for(var/atom/movable/AM in src)
- AM.forceMove(loc)
- qdel(src)
-
\ No newline at end of file
+ setDir(SOUTH)
+ else
+ if(dx > 0)
+ setDir(EAST)
+ else
+ setDir(WEST)
diff --git a/GainStation13/icons/obj/feeding_tube_industrial.dmi b/GainStation13/icons/obj/feeding_tube_industrial.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..99adb797ecc03568c9de501e1dd672974b1b7e2d
GIT binary patch
literal 2854
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
literal 0
HcmV?d00001
diff --git a/v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg b/v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..cef4bf5c2d0d231fe27357610f5100a9ab01f615
GIT binary patch
literal 9043
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
DUL8By
literal 0
HcmV?d00001