#define SAFETY_COOLDOWN 100 /obj/machinery/recycler name = "recycler" desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side." icon = 'icons/obj/recycling.dmi' icon_state = "grinder-o0" layer = ABOVE_ALL_MOB_LAYER // Overhead density = TRUE circuit = /obj/item/circuitboard/machine/recycler var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/icon_name = "grinder-o" var/blood = 0 var/eat_dir = WEST var/amount_produced = 50 var/crush_damage = 1000 var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/welder.ogg' /obj/machinery/recycler/Initialize() AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), INFINITY, FALSE, null, null, null, TRUE) AddComponent(/datum/component/butchering, 1, amount_produced,amount_produced/5) . = ..() update_icon() req_one_access = get_all_accesses() + get_all_centcom_access() /obj/machinery/recycler/RefreshParts() var/amt_made = 0 var/mat_mod = 0 for(var/obj/item/stock_parts/matter_bin/B in component_parts) mat_mod = 2 * B.rating mat_mod *= 50000 for(var/obj/item/stock_parts/manipulator/M in component_parts) amt_made = 12.5 * M.rating //% of materials salvaged var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = mat_mod amount_produced = min(50, amt_made) + 50 var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) butchering.effectiveness = amount_produced butchering.bonus_modifier = amount_produced/5 /obj/machinery/recycler/examine(mob/user) ..() to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") to_chat(user, "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"].") /obj/machinery/recycler/power_change() ..() update_icon() /obj/machinery/recycler/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) return if(default_pry_open(I)) return if(default_unfasten_wrench(user, I)) return if(default_deconstruction_crowbar(I)) return return ..() /obj/machinery/recycler/emag_act(mob/user) . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED if(safety_mode) safety_mode = FALSE update_icon() playsound(src, "sparks", 75, 1, -1) to_chat(user, "You use the cryptographic sequencer on [src].") return TRUE /obj/machinery/recycler/update_icon() ..() var/is_powered = !(stat & (BROKEN|NOPOWER)) if(safety_mode) is_powered = FALSE icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end /obj/machinery/recycler/Bumped(atom/movable/AM) if(stat & (BROKEN|NOPOWER)) return if(!anchored) return if(safety_mode) return var/move_dir = get_dir(loc, AM.loc) if(move_dir == eat_dir) eat(AM) /obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) var/list/to_eat if(isitem(AM0)) to_eat = AM0.GetAllContentsIgnoring(GLOB.typecache_mob) else to_eat = list(AM0) var/items_recycled = 0 for(var/i in to_eat) var/atom/movable/AM = i var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) if(brain_holder) emergency_stop(AM) else if(isliving(AM)) if((obj_flags & EMAGGED)||((!allowed(AM))&&(!ishuman(AM)))) crush_living(AM) else emergency_stop(AM) else if(isitem(AM)) var/obj/O = AM if(O.resistance_flags & INDESTRUCTIBLE) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) O.forceMove(loc) else recycle_item(AM) items_recycled++ else playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) AM.forceMove(loc) if(items_recycled && sound) playsound(src, item_recycle_sound, 50, 1) /obj/machinery/recycler/proc/recycle_item(obj/item/I) I.forceMove(loc) var/obj/item/grown/log/L = I if(istype(L)) var/seed_modifier = 0 if(L.seed) seed_modifier = round(L.seed.potency / 25) new L.plank_type(src.loc, 1 + seed_modifier) qdel(L) return else var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) qdel(I) return materials.insert_item(I, multiplier = (amount_produced / 100)) qdel(I) materials.retrieve_all() /obj/machinery/recycler/proc/emergency_stop(mob/living/L) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) safety_mode = TRUE update_icon() L.forceMove(loc) addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) /obj/machinery/recycler/proc/reboot() playsound(src, 'sound/machines/ping.ogg', 50, 0) safety_mode = FALSE update_icon() /obj/machinery/recycler/proc/crush_living(mob/living/L) L.forceMove(loc) if(issilicon(L)) playsound(src, 'sound/items/welder.ogg', 50, 1) else playsound(src, 'sound/effects/splat.ogg', 50, 1) // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) if(iscarbon(L)) if(L.stat == CONSCIOUS) L.say("ARRRRRRRRRRRGH!!!", forced="recycler grinding") add_mob_blood(L) if(!blood && !issilicon(L)) blood = TRUE update_icon() // Remove and recycle the equipped items if(eat_victim_items) for(var/obj/item/I in L.get_equipped_items(TRUE)) if(L.dropItemToGround(I)) eat(I, sound=FALSE) // Instantly lie down, also go unconscious from the pain, before you die. L.Unconscious(100) L.adjustBruteLoss(crush_damage) if(L.stat == DEAD && (L.butcher_results || L.guaranteed_butcher_results)) var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) butchering.Butcher(src,L) /obj/machinery/recycler/deathtrap name = "dangerous old crusher" obj_flags = CAN_BE_HIT | EMAGGED crush_damage = 120 flags_1 = NODECONSTRUCT_1 /obj/item/paper/guides/recycler name = "paper - 'garbage duty instructions'" info = "