From 57e88e60915685b5bcec72a7d4fee86c76abeb2b Mon Sep 17 00:00:00 2001 From: tattle <66640614+dragomagol@users.noreply.github.com> Date: Mon, 23 Jan 2023 01:45:27 -0800 Subject: [PATCH] Crafting fireaxe cabinets, mech removal cabinets, and mirrors (#72856) ## About The Pull Request Breaking down #72371 because it's... unreasonably large. So this PR splits the crafting recipe file, and adds 3 new recipes for fireaxe cabinets, mech removal cabinets, and mirrors. ## Why It's Good For The Game Wallening compliance, and more of me on my shit breaking down long files. ## Changelog :cl: Tattle qol: fireaxe cabinets, mech removal cabinets, and mirrors can now all be crafted /:cl: Co-authored-by: tattle --- code/datums/components/crafting/_recipes.dm | 82 + .../datums/components/crafting/atmospheric.dm | 351 ++++ code/datums/components/crafting/chemistry.dm | 157 ++ code/datums/components/crafting/containers.dm | 45 + code/datums/components/crafting/doors.dm | 25 + .../components/crafting/entertainment.dm | 193 ++ code/datums/components/crafting/equipment.dm | 190 ++ code/datums/components/crafting/furniture.dm | 38 + .../components/crafting/melee_weapon.dm | 132 ++ code/datums/components/crafting/misc.dm | 25 + .../components/crafting/ranged_weapon.dm | 255 +++ code/datums/components/crafting/recipes.dm | 1871 ----------------- code/datums/components/crafting/robot.dm | 214 ++ code/datums/components/crafting/structures.dm | 62 + code/datums/components/crafting/tailoring.dm | 166 ++ code/datums/components/crafting/tiles.dm | 9 + code/datums/components/crafting/tools.dm | 48 + .../datums/components/crafting/weapon_ammo.dm | 95 + code/game/objects/structures/fireaxe.dm | 34 +- code/game/objects/structures/mirror.dm | 24 +- tgstation.dme | 17 +- 21 files changed, 2153 insertions(+), 1880 deletions(-) create mode 100644 code/datums/components/crafting/_recipes.dm create mode 100644 code/datums/components/crafting/atmospheric.dm create mode 100644 code/datums/components/crafting/chemistry.dm create mode 100644 code/datums/components/crafting/containers.dm create mode 100644 code/datums/components/crafting/doors.dm create mode 100644 code/datums/components/crafting/entertainment.dm create mode 100644 code/datums/components/crafting/equipment.dm create mode 100644 code/datums/components/crafting/furniture.dm create mode 100644 code/datums/components/crafting/melee_weapon.dm create mode 100644 code/datums/components/crafting/misc.dm create mode 100644 code/datums/components/crafting/ranged_weapon.dm delete mode 100644 code/datums/components/crafting/recipes.dm create mode 100644 code/datums/components/crafting/robot.dm create mode 100644 code/datums/components/crafting/structures.dm create mode 100644 code/datums/components/crafting/tiles.dm create mode 100644 code/datums/components/crafting/tools.dm create mode 100644 code/datums/components/crafting/weapon_ammo.dm diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm new file mode 100644 index 00000000000000..02fdfdd63cb7b8 --- /dev/null +++ b/code/datums/components/crafting/_recipes.dm @@ -0,0 +1,82 @@ +///If the machine is used/deleted in the crafting process +#define CRAFTING_MACHINERY_CONSUME 1 +///If the machine is only "used" i.e. it checks to see if it's nearby and allows crafting, but doesn't delete it +#define CRAFTING_MACHINERY_USE 0 + +/datum/crafting_recipe + ///in-game display name + var/name + ///type paths of items consumed associated with how many are needed + var/list/reqs = list() + ///type paths of items explicitly not allowed as an ingredient + var/list/blacklist = list() + ///type path of item resulting from this craft + var/result + /// String defines of items needed but not consumed. Lazy list. + var/list/tool_behaviors + /// Type paths of items needed but not consumed. Lazy list. + var/list/tool_paths + ///time in seconds. Remember to use the SECONDS define! + var/time = 3 SECONDS + ///type paths of items that will be placed in the result + var/list/parts = list() + ///like tool_behaviors but for reagents + var/list/chem_catalysts = list() + ///where it shows up in the crafting UI + var/category + ///Set to FALSE if it needs to be learned first. + var/always_available = TRUE + /// Additonal requirements text shown in UI + var/additional_req_text + ///Required machines for the craft, set the assigned value of the typepath to CRAFTING_MACHINERY_CONSUME or CRAFTING_MACHINERY_USE. Lazy associative list: type_path key -> flag value. + var/list/machinery + ///Should only one object exist on the same turf? + var/one_per_turf = FALSE + /// Steps needed to achieve the result + var/list/steps + /// Whether the result can be crafted with a crafting menu button + var/non_craftable + /// Chemical reaction described in the recipe + var/datum/chemical_reaction/reaction + /// Resulting amount (for stacks only) + var/result_amount + +/datum/crafting_recipe/New() + if(!(result in reqs)) + blacklist += result + if(tool_behaviors) + tool_behaviors = string_list(tool_behaviors) + if(tool_paths) + tool_paths = string_list(tool_paths) + +/datum/crafting_recipe/stack/New(obj/item/stack/material, datum/stack_recipe/stack_recipe) + if(!material || !stack_recipe || !stack_recipe.result_type) + stack_trace("Invalid stack recipe [stack_recipe]") + return + ..() + + src.name = stack_recipe.title + src.time = stack_recipe.time + src.result = stack_recipe.result_type + src.result_amount = stack_recipe.res_amount + src.reqs[material] = stack_recipe.req_amount + src.category = stack_recipe.category || CAT_MISC + +/** + * Run custom pre-craft checks for this recipe, don't add feedback messages in this because it will spam the client + * + * user: The /mob that initiated the crafting + * collected_requirements: A list of lists of /obj/item instances that satisfy reqs. Top level list is keyed by requirement path. + */ +/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) + return TRUE + +/datum/crafting_recipe/proc/on_craft_completion(mob/user, atom/result) + return + +///Check if the pipe used for atmospheric device crafting is the proper one +/datum/crafting_recipe/proc/atmos_pipe_check(mob/user, list/collected_requirements) + var/obj/item/pipe/required_pipe = collected_requirements[/obj/item/pipe][1] + if(ispath(required_pipe.pipe_type, /obj/machinery/atmospherics/pipe/smart)) + return TRUE + return FALSE diff --git a/code/datums/components/crafting/atmospheric.dm b/code/datums/components/crafting/atmospheric.dm new file mode 100644 index 00000000000000..5a2e0b2b72d6e4 --- /dev/null +++ b/code/datums/components/crafting/atmospheric.dm @@ -0,0 +1,351 @@ +/datum/crafting_recipe/bluespace_vendor_mount + name = "Bluespace Vendor Wall Mount" + result = /obj/item/wallframe/bluespace_vendor_mount + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 15, + /obj/item/stack/sheet/glass = 10, + /obj/item/stack/cable_coil = 10, + ) + category = CAT_ATMOSPHERIC + +/datum/crafting_recipe/pipe + name = "Smart pipe fitting" + tool_behaviors = list(TOOL_WRENCH) + result = /obj/item/pipe/quaternary/pipe + reqs = list(/obj/item/stack/sheet/iron = 1) + time = 0.5 SECONDS + category = CAT_ATMOSPHERIC + +/datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.p_init_dir = ALL_CARDINALS + crafted_pipe.setDir(SOUTH) + crafted_pipe.update() + +/datum/crafting_recipe/layer_adapter + name = "Layer manifold fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/binary/layer_adapter + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 1 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/layer_adapter/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/layer_adapter/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/layer_manifold + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/color_adapter + name = "Color adapter fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/binary/color_adapter + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 1 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/color_adapter/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/color_adapter/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/color_adapter + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/he_pipe + name = "H/E pipe fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/quaternary/he_pipe + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 1 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/he_pipe/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/he_pipe/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/he_junction + name = "H/E junction fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/he_junction + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 1 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/he_junction/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/he_junction/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/junction + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/pressure_pump + name = "Pressure pump fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/binary/pressure_pump + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/pressure_pump/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/pressure_pump/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/binary/pump + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/manual_valve + name = "Manual valve fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/binary/manual_valve + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/manual_valve/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/manual_valve/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/binary/valve + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/vent + name = "Vent pump fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/vent + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/vent/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/vent/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/vent_pump + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/scrubber + name = "Scrubber fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/scrubber + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/scrubber/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/scrubber/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/vent_scrubber + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/filter + name = "Filter fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/trinary/flippable/filter + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/filter/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/filter/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/trinary/filter + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/mixer + name = "Mixer fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/trinary/flippable/mixer + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/mixer/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/mixer/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/trinary/mixer + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/connector + name = "Portable connector fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/connector + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/connector/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/connector/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/portables_connector + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/passive_vent + name = "Passive vent fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/passive_vent + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/passive_vent/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/passive_vent/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/passive_vent + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/injector + name = "Outlet injector fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/injector + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/iron = 1, + /obj/item/stack/cable_coil = 5, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/injector/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/injector/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/outlet_injector + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/he_exchanger + name = "Heat exchanger fitting" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) + result = /obj/item/pipe/directional/he_exchanger + reqs = list( + /obj/item/pipe = 1, + /obj/item/stack/sheet/plasteel = 1, + ) + time = 2 SECONDS + category = CAT_ATMOSPHERIC + additional_req_text = " smart pipe fitting" + +/datum/crafting_recipe/he_exchanger/check_requirements(mob/user, list/collected_requirements) + return atmos_pipe_check(user, collected_requirements) + +/datum/crafting_recipe/he_exchanger/on_craft_completion(mob/user, atom/result) + var/obj/item/pipe/crafted_pipe = result + crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/heat_exchanger + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.setDir(user.dir) + crafted_pipe.update() + +/datum/crafting_recipe/steam_vent + name = "Steam Vent" + result = /obj/structure/steam_vent + time = 0.8 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 2, + /obj/item/stack/tile/iron = 1, + /obj/item/stock_parts/water_recycler = 1, + ) + category = CAT_ATMOSPHERIC diff --git a/code/datums/components/crafting/chemistry.dm b/code/datums/components/crafting/chemistry.dm new file mode 100644 index 00000000000000..fc5d553d8f59bd --- /dev/null +++ b/code/datums/components/crafting/chemistry.dm @@ -0,0 +1,157 @@ +/datum/crafting_recipe/improv_explosive + name = "IED" + result = /obj/item/grenade/iedcasing + reqs = list( + /datum/reagent/fuel = 50, + /obj/item/stack/cable_coil = 1, + /obj/item/assembly/igniter = 1, + /obj/item/reagent_containers/cup/soda_cans = 1, + ) + parts = list(/obj/item/reagent_containers/cup/soda_cans = 1) + time = 1.5 SECONDS + category = CAT_CHEMISTRY + +/datum/crafting_recipe/molotov + name = "Molotov" + result = /obj/item/reagent_containers/cup/glass/bottle/molotov + reqs = list( + /obj/item/reagent_containers/cup/rag = 1, + /obj/item/reagent_containers/cup/glass/bottle = 1, + ) + parts = list(/obj/item/reagent_containers/cup/glass/bottle = 1) + time = 4 SECONDS + category = CAT_CHEMISTRY + +/datum/crafting_recipe/chemical_payload + name = "Chemical Payload (C4)" + result = /obj/item/bombcore/chemical + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/grenade/c4 = 1, + /obj/item/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) + time = 3 SECONDS + category = CAT_CHEMISTRY + +/datum/crafting_recipe/chemical_payload2 + name = "Chemical Payload (Gibtonite)" + result = /obj/item/bombcore/chemical + reqs = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/gibtonite = 1, + /obj/item/grenade/chem_grenade = 2, + ) + parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) + time = 5 SECONDS + category = CAT_CHEMISTRY + +/datum/crafting_recipe/alcohol_burner + name = "Burner (Ethanol)" + result = /obj/item/burner + time = 5 SECONDS + reqs = list( + /obj/item/reagent_containers/cup/beaker = 1, + /datum/reagent/consumable/ethanol = 15, + /obj/item/paper = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/oil_burner + name = "Burner (Oil)" + result = /obj/item/burner/oil + time = 5 SECONDS + reqs = list( + /obj/item/reagent_containers/cup/beaker = 1, + /datum/reagent/fuel/oil = 15, + /obj/item/paper = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/fuel_burner + name = "Burner (Fuel)" + result = /obj/item/burner/fuel + time = 5 SECONDS + reqs = list( + /obj/item/reagent_containers/cup/beaker = 1, + /datum/reagent/fuel = 15, + /obj/item/paper = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/thermometer + name = "Thermometer" + tool_behaviors = list(TOOL_WELDER) + result = /obj/item/thermometer + time = 5 SECONDS + reqs = list( + /datum/reagent/mercury = 5, + /obj/item/stack/sheet/glass = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/thermometer_alt + name = "Thermometer" + result = /obj/item/thermometer/pen + time = 5 SECONDS + reqs = list( + /datum/reagent/mercury = 5, + /obj/item/pen = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/ph_booklet + name = "pH booklet" + result = /obj/item/ph_booklet + time = 5 SECONDS + reqs = list( + /datum/reagent/universal_indicator = 5, + /obj/item/paper = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/dropper //Maybe make a glass pipette icon? + name = "Dropper" + result = /obj/item/reagent_containers/dropper + tool_behaviors = list(TOOL_WELDER) + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/glass = 1, + ) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/improvised_chem_heater + name = "Improvised chem heater" + result = /obj/machinery/space_heater/improvised_chem_heater + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER) + time = 15 SECONDS + reqs = list( + /obj/item/stack/cable_coil = 2, + /obj/item/stack/sheet/glass = 2, + /obj/item/stack/sheet/iron = 2, + /datum/reagent/water = 50, + /obj/item/thermometer = 1, + ) + machinery = list(/obj/machinery/space_heater = CRAFTING_MACHINERY_CONSUME) + category = CAT_CHEMISTRY + +/datum/crafting_recipe/improvised_chem_heater/on_craft_completion(mob/user, atom/result) + var/obj/item/stock_parts/cell/cell = locate(/obj/item/stock_parts/cell) in range(1) + if(!cell) + return + var/obj/machinery/space_heater/improvised_chem_heater/heater = result + var/turf/turf = get_turf(cell) + heater.forceMove(turf) + heater.attackby(cell, user) //puts it into the heater + +/datum/crafting_recipe/improvised_coolant + name = "Improvised cooling spray" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/extinguisher/crafted + time = 10 SECONDS + reqs = list( + /obj/item/toy/crayon/spraycan = 1, + /datum/reagent/water = 20, + /datum/reagent/consumable/ice = 10, + ) + category = CAT_CHEMISTRY diff --git a/code/datums/components/crafting/containers.dm b/code/datums/components/crafting/containers.dm new file mode 100644 index 00000000000000..2106b859f5a764 --- /dev/null +++ b/code/datums/components/crafting/containers.dm @@ -0,0 +1,45 @@ +/datum/crafting_recipe/papersack + name = "Paper Sack" + result = /obj/item/storage/box/papersack + time = 1 SECONDS + reqs = list(/obj/item/paper = 5) + category = CAT_CONTAINERS + +/datum/crafting_recipe/sillycup + name = "Paper Cup" + result = /obj/item/reagent_containers/cup/glass/sillycup + time = 1 SECONDS + reqs = list(/obj/item/paper = 2) + category = CAT_CONTAINERS + +/datum/crafting_recipe/boh + name = "Bag of Holding" + reqs = list( + /obj/item/bag_of_holding_inert = 1, + /obj/item/assembly/signaler/anomaly/bluespace = 1, + ) + result = /obj/item/storage/backpack/holding + category = CAT_CONTAINERS + +/datum/crafting_recipe/underwater_basket + name = "Underwater Basket (Bamboo)" + reqs = list(/obj/item/stack/sheet/mineral/bamboo = 20) + result = /obj/item/storage/basket + category = CAT_CONTAINERS + additional_req_text = " being underwater, underwater basketweaving mastery" + +/datum/crafting_recipe/underwater_basket/check_requirements(mob/user, list/collected_requirements) + . = ..() + if(!HAS_TRAIT(user,TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE)) + return FALSE + var/turf/T = get_turf(user) + if(istype(T, /turf/open/water)) + return TRUE + var/obj/machinery/shower/S = locate() in T + if(S?.actually_on) + return TRUE + +//Same but with wheat +/datum/crafting_recipe/underwater_basket/wheat + name = "Underwater Basket (Wheat)" + reqs = list(/obj/item/food/grown/wheat = 50) diff --git a/code/datums/components/crafting/doors.dm b/code/datums/components/crafting/doors.dm new file mode 100644 index 00000000000000..e8fcb3fdfd915c --- /dev/null +++ b/code/datums/components/crafting/doors.dm @@ -0,0 +1,25 @@ +/datum/crafting_recipe/shutters + name = "Shutters" + reqs = list( + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/electronics/airlock = 1, + ) + result = /obj/machinery/door/poddoor/shutters/preopen + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) + time = 10 SECONDS + category = CAT_DOORS + one_per_turf = TRUE + +/datum/crafting_recipe/blast_doors + name = "Blast Door" + reqs = list( + /obj/item/stack/sheet/plasteel = 15, + /obj/item/stack/cable_coil = 15, + /obj/item/electronics/airlock = 1, + ) + result = /obj/machinery/door/poddoor/preopen + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) + time = 30 SECONDS + category = CAT_DOORS + one_per_turf = TRUE diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm new file mode 100644 index 00000000000000..476a099dafe5a3 --- /dev/null +++ b/code/datums/components/crafting/entertainment.dm @@ -0,0 +1,193 @@ +/datum/crafting_recipe/mothplush + name = "Moth Plushie" + result = /obj/item/toy/plush/moth + reqs = list( + /obj/item/stack/sheet/animalhide/mothroach = 1, + /obj/item/organ/internal/heart = 1, + /obj/item/stack/sheet/cloth = 3, + ) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/mixedbouquet + name = "Mixed bouquet" + result = /obj/item/bouquet + reqs = list( + /obj/item/food/grown/poppy/lily = 2, + /obj/item/food/grown/sunflower = 2, + /obj/item/food/grown/poppy/geranium = 2, + ) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/sunbouquet + name = "Sunflower bouquet" + result = /obj/item/bouquet/sunflower + reqs = list(/obj/item/food/grown/sunflower = 6) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/poppybouquet + name = "Poppy bouquet" + result = /obj/item/bouquet/poppy + reqs = list (/obj/item/food/grown/poppy = 6) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/rosebouquet + name = "Rose bouquet" + result = /obj/item/bouquet/rose + reqs = list(/obj/item/food/grown/rose = 6) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/spooky_camera + name = "Camera Obscura" + result = /obj/item/camera/spooky + time = 1.5 SECONDS + reqs = list( + /obj/item/camera = 1, + /datum/reagent/water/holywater = 10, + ) + parts = list(/obj/item/camera = 1) + category = CAT_ENTERTAINMENT + + +/datum/crafting_recipe/skateboard + name = "Skateboard" + result = /obj/vehicle/ridden/scooter/skateboard/improvised + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 10, + ) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/scooter + name = "Scooter" + result = /obj/vehicle/ridden/scooter + time = 6.5 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 12, + ) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/headpike + name = "Spike Head (Glass Spear)" + time = 6.5 SECONDS + reqs = list( + /obj/item/spear = 1, + /obj/item/bodypart/head = 1, + ) + parts = list( + /obj/item/bodypart/head = 1, + /obj/item/spear = 1, + ) + blacklist = list( + /obj/item/spear/explosive, + /obj/item/spear/bonespear, + /obj/item/spear/bamboospear, + ) + result = /obj/structure/headpike + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/headpikebone + name = "Spike Head (Bone Spear)" + time = 6.5 SECONDS + reqs = list( + /obj/item/spear/bonespear = 1, + /obj/item/bodypart/head = 1, + ) + parts = list( + /obj/item/bodypart/head = 1, + /obj/item/spear/bonespear = 1, + ) + result = /obj/structure/headpike/bone + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/headpikebamboo + name = "Spike Head (Bamboo Spear)" + time = 6.5 SECONDS + reqs = list( + /obj/item/spear/bamboospear = 1, + /obj/item/bodypart/head = 1, + ) + parts = list( + /obj/item/bodypart/head = 1, + /obj/item/spear/bamboospear = 1, + ) + result = /obj/structure/headpike/bamboo + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/guillotine + name = "Guillotine" + result = /obj/structure/guillotine + time = 15 SECONDS // Building a functioning guillotine takes time + reqs = list( + /obj/item/stack/sheet/plasteel = 3, + /obj/item/stack/sheet/mineral/wood = 20, + /obj/item/stack/cable_coil = 10, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/toiletbong + name = "Toiletbong" + result = /obj/structure/toiletbong + time = 5 SECONDS + tool_behaviors = list(TOOL_WRENCH) + reqs = list(/obj/item/flamethrower = 1) + machinery = list(/obj/structure/toilet) + additional_req_text = " plasma tank (on flamethrower), toilet" + category = CAT_ENTERTAINMENT + +/datum/crafting_recipe/toiletbong/check_requirements(mob/user, list/collected_requirements) + if((locate(/obj/structure/toilet) in range(1, user.loc)) == null) + return FALSE + var/obj/item/flamethrower/flamethrower = collected_requirements[/obj/item/flamethrower][1] + if(flamethrower.ptank == null) + return FALSE + return TRUE + +/datum/crafting_recipe/toiletbong/on_craft_completion(mob/user, atom/result) + var/obj/structure/toiletbong/toiletbong = result + var/obj/structure/toilet/toilet = locate(/obj/structure/toilet) in range(1, user.loc) + for (var/obj/item/cistern_item in toilet.contents) + cistern_item.forceMove(user.loc) + to_chat(user, span_warning("[cistern_item] falls out of the toilet!")) + toiletbong.dir = toilet.dir + toiletbong.loc = toilet.loc + qdel(toilet) + to_chat(user, span_notice("[user] attaches the flamethrower to the repurposed toilet.")) + +/datum/crafting_recipe/punching_bag + name = "Punching Bag" + result = /obj/structure/punching_bag + tool_behaviors = list(TOOL_SCREWDRIVER) + reqs = list( + /obj/item/stack/sheet/iron = 2, + /obj/item/stack/rods = 1, + /obj/item/pillow = 1, + ) + category = CAT_ENTERTAINMENT + time = 10 SECONDS + +/datum/crafting_recipe/stacklifter + name = "Chest Press" + result = /obj/structure/weightmachine/stacklifter + tool_behaviors = list(TOOL_SCREWDRIVER) + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 2, + /obj/item/chair = 1, + ) + category = CAT_ENTERTAINMENT + time = 10 SECONDS + +/datum/crafting_recipe/weightlifter + name = "Bench Press" + result = /obj/structure/weightmachine/weightlifter + tool_behaviors = list(TOOL_SCREWDRIVER) + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/rods = 2, + /obj/item/chair = 1, + ) + category = CAT_ENTERTAINMENT + time = 10 SECONDS diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm new file mode 100644 index 00000000000000..f3766b2645dd68 --- /dev/null +++ b/code/datums/components/crafting/equipment.dm @@ -0,0 +1,190 @@ +/datum/crafting_recipe/strobeshield + name = "Strobe Shield" + result = /obj/item/shield/riot/flash + reqs = list( + /obj/item/wallframe/flasher = 1, + /obj/item/assembly/flash/handheld = 1, + /obj/item/shield/riot = 1, + ) + time = 4 SECONDS + category = CAT_EQUIPMENT + +/datum/crafting_recipe/strobeshield/New() + ..() + blacklist |= subtypesof(/obj/item/shield/riot) + +/datum/crafting_recipe/radiogloves + name = "Radio Gloves" + result = /obj/item/clothing/gloves/radio + time = 1.5 SECONDS + reqs = list( + /obj/item/clothing/gloves/color/black = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/radio = 1, + ) + tool_behaviors = list(TOOL_WIRECUTTER) + category = CAT_EQUIPMENT + +/datum/crafting_recipe/radiogloves/New() + ..() + blacklist |= typesof(/obj/item/radio/headset) + blacklist |= typesof(/obj/item/radio/intercom) + +/datum/crafting_recipe/wheelchair + name = "Wheelchair" + result = /obj/vehicle/ridden/wheelchair + reqs = list( + /obj/item/stack/sheet/iron = 4, + /obj/item/stack/rods = 6, + ) + time = 10 SECONDS + category = CAT_EQUIPMENT + +/datum/crafting_recipe/motorized_wheelchair + name = "Motorized Wheelchair" + result = /obj/vehicle/ridden/wheelchair/motorized + reqs = list( + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/rods = 8, + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/capacitor = 1, + ) + parts = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/capacitor = 1, + ) + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) + time = 20 SECONDS + category = CAT_EQUIPMENT + +/datum/crafting_recipe/trapdoor_kit + name = "Trapdoor Construction Kit" + result = /obj/item/trapdoor_kit + reqs = list( + /obj/item/stack/sheet/iron = 4, + /obj/item/stack/rods = 4, + /obj/item/stack/cable_coil = 10, + /obj/item/stock_parts/manipulator = 2, + /obj/item/assembly/signaler = 1, + ) + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + time = 10 SECONDS + category = CAT_EQUIPMENT + +/datum/crafting_recipe/trapdoor_remote + name = "Trapdoor Remote" + result = /obj/item/trapdoor_remote/preloaded // since its useless without its assembly just require an assembly to craft it + reqs = list( + /obj/item/compact_remote = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/assembly/trapdoor = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + time = 5 SECONDS + category = CAT_EQUIPMENT + +/datum/crafting_recipe/mousetrap + name = "Mouse Trap" + result = /obj/item/assembly/mousetrap + time = 1 SECONDS + reqs = list( + /obj/item/stack/sheet/cardboard = 1, + /obj/item/stack/rods = 1, + ) + category = CAT_EQUIPMENT + +/datum/crafting_recipe/flashlight_eyes + name = "Flashlight Eyes" + result = /obj/item/organ/internal/eyes/robotic/flashlight + time = 10 + reqs = list( + /obj/item/flashlight = 2, + /obj/item/restraints/handcuffs/cable = 1 + ) + category = CAT_EQUIPMENT + +/datum/crafting_recipe/extendohand_r + name = "Extendo-Hand (Right Arm)" + reqs = list( + /obj/item/bodypart/arm/right/robot = 1, + /obj/item/clothing/gloves/boxing = 1, + ) + result = /obj/item/extendohand + category = CAT_EQUIPMENT + +/datum/crafting_recipe/extendohand_l + name = "Extendo-Hand (Left Arm)" + reqs = list( + /obj/item/bodypart/arm/left/robot = 1, + /obj/item/clothing/gloves/boxing = 1, + ) + result = /obj/item/extendohand + category = CAT_EQUIPMENT + +/datum/crafting_recipe/ore_sensor + name = "Ore Sensor" + time = 3 SECONDS + reqs = list( + /datum/reagent/brimdust = 15, + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 1, + ) + result = /obj/item/ore_sensor + category = CAT_EQUIPMENT + +/datum/crafting_recipe/pressureplate + name = "Pressure Plate" + result = /obj/item/pressure_plate + time = 0.5 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 1, + /obj/item/stack/tile/iron = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/assembly/igniter = 1, + ) + category = CAT_EQUIPMENT + +/datum/crafting_recipe/rcl + name = "Makeshift Rapid Pipe Cleaner Layer" + result = /obj/item/rcl/ghetto + time = 4 SECONDS + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) + reqs = list(/obj/item/stack/sheet/iron = 15) + category = CAT_EQUIPMENT + +/datum/crafting_recipe/ghettojetpack + name = "Improvised Jetpack" + result = /obj/item/tank/jetpack/improvised + time = 30 + reqs = list( + /obj/item/tank/internals/oxygen = 2, + /obj/item/extinguisher = 1, + /obj/item/pipe = 3, + /obj/item/stack/cable_coil = MAXCOIL, + ) + category = CAT_EQUIPMENT + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) + +/datum/crafting_recipe/gripperoffbrand + name = "Improvised Gripper Gloves" + reqs = list( + /obj/item/clothing/gloves/fingerless = 1, + /obj/item/stack/sticky_tape = 1, + ) + result = /obj/item/clothing/gloves/tackler/offbrand + category = CAT_EQUIPMENT + +/** + * Recipe used for upgrading fake N-spect scanners to bananium HONK-spect scanners + */ +/datum/crafting_recipe/clown_scanner_upgrade + name = "Bananium HONK-spect scanner" + result = /obj/item/inspector/clown/bananium + reqs = list( + /obj/item/inspector/clown = 1, + /obj/item/stack/sticky_tape = 3, + /obj/item/stack/sheet/mineral/bananium = 5, + ) //the chainsaw of prank tools + tool_paths = list(/obj/item/bikehorn) + time = 40 SECONDS + category = CAT_EQUIPMENT diff --git a/code/datums/components/crafting/furniture.dm b/code/datums/components/crafting/furniture.dm new file mode 100644 index 00000000000000..bdd7372f17030d --- /dev/null +++ b/code/datums/components/crafting/furniture.dm @@ -0,0 +1,38 @@ +/datum/crafting_recipe/curtain + name = "Curtains" + reqs = list( + /obj/item/stack/sheet/cloth = 4, + /obj/item/stack/rods = 1, + ) + result = /obj/structure/curtain/cloth + category = CAT_FURNITURE + +/datum/crafting_recipe/showercurtain + name = "Shower Curtains" + reqs = list( + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/plastic = 2, + /obj/item/stack/rods = 1, + ) + result = /obj/structure/curtain + category = CAT_FURNITURE + +/datum/crafting_recipe/aquarium + name = "Aquarium" + result = /obj/structure/aquarium + time = 10 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 15, + /obj/item/stack/sheet/glass = 10, + /obj/item/aquarium_kit = 1, + ) + category = CAT_FURNITURE + +/datum/crafting_recipe/mirror + name = "Mirror" + result = /obj/item/wallframe/mirror + reqs = list( + /obj/item/stack/sheet/glass = 5, + /obj/item/stack/sheet/mineral/silver = 2, + ) + category = CAT_FURNITURE diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm new file mode 100644 index 00000000000000..87bcbbbf17e32f --- /dev/null +++ b/code/datums/components/crafting/melee_weapon.dm @@ -0,0 +1,132 @@ +/datum/crafting_recipe/stunprod + name = "Stunprod" + result = /obj/item/melee/baton/security/cattleprod + reqs = list( + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/rods = 1, + /obj/item/assembly/igniter = 1, + ) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/teleprod + name = "Teleprod" + result = /obj/item/melee/baton/security/cattleprod/teleprod + reqs = list( + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/rods = 1, + /obj/item/assembly/igniter = 1, + /obj/item/stack/ore/bluespace_crystal = 1, + ) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/tailclub + name = "Tail Club" + result = /obj/item/tailclub + reqs = list( + /obj/item/organ/external/tail/lizard = 1, + /obj/item/stack/sheet/iron = 1, + ) + blacklist = list(/obj/item/organ/external/tail/lizard/fake) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/tailwhip + name = "Liz O' Nine Tails" + result = /obj/item/melee/chainofcommand/tailwhip + reqs = list( + /obj/item/organ/external/tail/lizard = 1, + /obj/item/stack/cable_coil = 1, + ) + blacklist = list(/obj/item/organ/external/tail/lizard/fake) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/catwhip + name = "Cat O' Nine Tails" + result = /obj/item/melee/chainofcommand/tailwhip/kitty + reqs = list( + /obj/item/organ/external/tail/cat = 1, + /obj/item/stack/cable_coil = 1, + ) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/chainsaw + name = "Chainsaw" + result = /obj/item/chainsaw + reqs = list( + /obj/item/circular_saw = 1, + /obj/item/stack/cable_coil = 3, + /obj/item/stack/sheet/plasteel = 5, + ) + tool_behaviors = list(TOOL_WELDER) + time = 5 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/spear + name = "Spear" + result = /obj/item/spear + reqs = list( + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/shard = 1, + /obj/item/stack/rods = 1, + ) + parts = list(/obj/item/shard = 1) + time = 4 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/toysword + name = "Toy Sword" + reqs = list( + /obj/item/light/bulb = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/plastic = 4, + ) + result = /obj/item/toy/sword + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/bonedagger + name = "Bone Dagger" + result = /obj/item/knife/combat/bone + time = 2 SECONDS + reqs = list(/obj/item/stack/sheet/bone = 2) + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/bonespear + name = "Bone Spear" + result = /obj/item/spear/bonespear + time = 3 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 4, + /obj/item/stack/sheet/sinew = 1, + ) + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/boneaxe + name = "Bone Axe" + result = /obj/item/fireaxe/boneaxe + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 6, + /obj/item/stack/sheet/sinew = 3, + ) + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/house_edge + name = "House Edge" + result = /obj/item/house_edge + always_available = FALSE + tool_behaviors = list(TOOL_WRENCH, TOOL_SCREWDRIVER, TOOL_WELDER) + reqs = list( + /obj/item/v8_engine = 1, + /obj/item/weaponcrafting/receiver = 1, + /obj/item/assembly/igniter = 1, + /obj/item/stack/sheet/iron = 2, + /obj/item/knife = 1, + /obj/item/weldingtool = 1, + /obj/item/roulette_wheel_beacon = 1, + ) + time = 10 SECONDS + category = CAT_WEAPON_MELEE diff --git a/code/datums/components/crafting/misc.dm b/code/datums/components/crafting/misc.dm new file mode 100644 index 00000000000000..b9981c39b5e02e --- /dev/null +++ b/code/datums/components/crafting/misc.dm @@ -0,0 +1,25 @@ +/datum/crafting_recipe/naturalpaper + name = "Hand-Pressed Paper" + time = 3 SECONDS + reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1) + tool_paths = list(/obj/item/hatchet) + result = /obj/item/paper_bin/bundlenatural + category = CAT_MISC + +/datum/crafting_recipe/skeleton_key + name = "Skeleton Key" + time = 3 SECONDS + reqs = list(/obj/item/stack/sheet/bone = 5) + result = /obj/item/skeleton_key + always_available = FALSE + category = CAT_MISC + +/datum/crafting_recipe/coffee_cartridge + name = "Bootleg Coffee Cartridge" + result = /obj/item/coffee_cartridge/bootleg + time = 2 SECONDS + reqs = list( + /obj/item/blank_coffee_cartridge = 1, + /datum/reagent/toxin/coffeepowder = 10, + ) + category = CAT_MISC diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm new file mode 100644 index 00000000000000..114d407ac9ea35 --- /dev/null +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -0,0 +1,255 @@ +/datum/crafting_recipe/bola + name = "Bola" + result = /obj/item/restraints/legcuffs/bola + reqs = list( + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/sheet/iron = 6, + ) + time = 2 SECONDS //faster than crafting them by hand! + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/gonbola + name = "Gonbola" + result = /obj/item/restraints/legcuffs/bola/gonbola + reqs = list( + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/stack/sheet/iron = 6, + /obj/item/stack/sheet/animalhide/gondola = 1, + ) + time = 4 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/reciever + name = "Modular Rifle Reciever" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_SAW) + result = /obj/item/weaponcrafting/receiver + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/sticky_tape = 1, + /obj/item/screwdriver = 1, + /obj/item/assembly/mousetrap = 1, + ) + time = 10 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/riflestock + name = "Wooden Rifle Stock" + tool_paths = list(/obj/item/hatchet) + result = /obj/item/weaponcrafting/stock + reqs = list( + /obj/item/stack/sheet/mineral/wood = 8, + /obj/item/stack/sticky_tape = 1, + ) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/advancedegun + name = "Advanced Energy Gun" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/e_gun/nuclear + reqs = list( + /obj/item/gun/energy/e_gun = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/nuclear = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/advancedegun/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/e_gun) + +/datum/crafting_recipe/tempgun + name = "Temperature Gun" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/temperature + reqs = list( + /obj/item/gun/energy/e_gun = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/temperature = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/tempgun/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/e_gun) + +/datum/crafting_recipe/beam_rifle + name = "Particle Acceleration Rifle" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/beam_rifle + reqs = list( + /obj/item/gun/energy/e_gun = 1, + /obj/item/assembly/signaler/anomaly/flux = 1, + /obj/item/assembly/signaler/anomaly/grav = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/beam_rifle = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/beam_rifle/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/e_gun) + +/datum/crafting_recipe/ebow + name = "Energy Crossbow" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/recharge/ebow/large + reqs = list( + /obj/item/gun/energy/recharge/kinetic_accelerator = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/ebow = 1, + /datum/reagent/uranium/radium = 15, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/xraylaser + name = "X-ray Laser Gun" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/xray + reqs = list( + /obj/item/gun/energy/laser = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/xray = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/xraylaser/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/laser) + +/datum/crafting_recipe/hellgun + name = "Hellfire Laser Gun" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/laser/hellgun + reqs = list( + /obj/item/gun/energy/laser = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/hellgun = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/hellgun/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/laser) + +/datum/crafting_recipe/ioncarbine + name = "Ion Carbine" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/ionrifle/carbine + reqs = list( + /obj/item/gun/energy/laser = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/ion = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/ioncarbine/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/laser) + +/datum/crafting_recipe/decloner + name = "Biological Demolecularisor" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/decloner + reqs = list( + /obj/item/gun/energy/laser = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/decloner = 1, + /datum/reagent/baldium = 30, + /datum/reagent/toxin/mutagen = 4, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/decloner/New() + ..() + blacklist += subtypesof(/obj/item/gun/energy/laser) + +/datum/crafting_recipe/teslacannon + name = "Tesla Cannon" + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/gun/energy/tesla_cannon + reqs = list( + /obj/item/assembly/signaler/anomaly/flux = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weaponcrafting/gunkit/tesla = 1, + ) + time = 20 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but + name = "Pneumatic Cannon" + result = /obj/item/pneumatic_cannon/ghetto + tool_behaviors = list(TOOL_WELDER, TOOL_WRENCH) + reqs = list( + /obj/item/stack/sheet/iron = 4, + /obj/item/stack/package_wrap = 8, + /obj/item/pipe/quaternary = 2, + ) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/flamethrower + name = "Flamethrower" + result = /obj/item/flamethrower + reqs = list( + /obj/item/weldingtool = 1, + /obj/item/assembly/igniter = 1, + /obj/item/stack/rods = 1, + ) + parts = list( + /obj/item/assembly/igniter = 1, + /obj/item/weldingtool = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 1 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/pipegun + name = "Pipegun" + result = /obj/item/gun/ballistic/rifle/boltaction/pipegun + reqs = list(/obj/item/weaponcrafting/receiver = 1, + /obj/item/pipe = 1, + /obj/item/weaponcrafting/stock = 1, + /obj/item/stack/sticky_tape = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/pipegun_prime + name = "Regal Pipegun" + always_available = FALSE + result = /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime + reqs = list( + /obj/item/gun/ballistic/rifle/boltaction/pipegun = 1, + /obj/item/food/deadmouse = 1, + /datum/reagent/consumable/grey_bull = 20, + /obj/item/spear = 1, + /obj/item/storage/toolbox = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + tool_paths = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas, /obj/item/melee/baton/security/cattleprod) + time = 30 SECONDS //contemplate for a bit + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/trash_cannon + name = "Trash Cannon" + always_available = FALSE + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + result = /obj/structure/cannon/trash + reqs = list( + /obj/item/melee/skateboard/improvised = 1, + /obj/item/tank/internals/oxygen = 1, + /datum/reagent/drug/maint/tar = 15, + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/storage/toolbox = 1, + ) + category = CAT_WEAPON_RANGED diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm deleted file mode 100644 index 586c88116f0233..00000000000000 --- a/code/datums/components/crafting/recipes.dm +++ /dev/null @@ -1,1871 +0,0 @@ -///If the machine is used/deleted in the crafting process -#define CRAFTING_MACHINERY_CONSUME 1 -///If the machine is only "used" i.e. it checks to see if it's nearby and allows crafting, but doesn't delete it -#define CRAFTING_MACHINERY_USE 0 - -/datum/crafting_recipe - ///in-game display name - var/name - ///type paths of items consumed associated with how many are needed - var/list/reqs = list() - ///type paths of items explicitly not allowed as an ingredient - var/list/blacklist = list() - ///type path of item resulting from this craft - var/result - /// String defines of items needed but not consumed. Lazy list. - var/list/tool_behaviors - /// Type paths of items needed but not consumed. Lazy list. - var/list/tool_paths - ///time in seconds. Remember to use the SECONDS define! - var/time = 3 SECONDS - ///type paths of items that will be placed in the result - var/list/parts = list() - ///like tool_behaviors but for reagents - var/list/chem_catalysts = list() - ///where it shows up in the crafting UI - var/category - ///Set to FALSE if it needs to be learned first. - var/always_available = TRUE - /// Additonal requirements text shown in UI - var/additional_req_text - ///Required machines for the craft, set the assigned value of the typepath to CRAFTING_MACHINERY_CONSUME or CRAFTING_MACHINERY_USE. Lazy associative list: type_path key -> flag value. - var/list/machinery - ///Should only one object exist on the same turf? - var/one_per_turf = FALSE - /// Steps needed to achieve the result - var/list/steps - /// Whether the result can be crafted with a crafting menu button - var/non_craftable - /// Chemical reaction described in the recipe - var/datum/chemical_reaction/reaction - /// Resulting amount (for stacks only) - var/result_amount - -/datum/crafting_recipe/New() - if(!(result in reqs)) - blacklist += result - if(tool_behaviors) - tool_behaviors = string_list(tool_behaviors) - if(tool_paths) - tool_paths = string_list(tool_paths) - -/datum/crafting_recipe/stack/New(obj/item/stack/material, datum/stack_recipe/stack_recipe) - if(!material || !stack_recipe || !stack_recipe.result_type) - stack_trace("Invalid stack recipe [stack_recipe]") - return - ..() - - src.name = stack_recipe.title - src.time = stack_recipe.time - src.result = stack_recipe.result_type - src.result_amount = stack_recipe.res_amount - src.reqs[material] = stack_recipe.req_amount - src.category = stack_recipe.category || CAT_MISC - -/** - * Run custom pre-craft checks for this recipe, don't add feedback messages in this because it will spam the client - * - * user: The /mob that initiated the crafting - * collected_requirements: A list of lists of /obj/item instances that satisfy reqs. Top level list is keyed by requirement path. - */ -/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) - return TRUE - -/datum/crafting_recipe/proc/on_craft_completion(mob/user, atom/result) - return - -///Check if the pipe used for atmospheric device crafting is the proper one -/datum/crafting_recipe/proc/atmos_pipe_check(mob/user, list/collected_requirements) - var/obj/item/pipe/required_pipe = collected_requirements[/obj/item/pipe][1] - if(ispath(required_pipe.pipe_type, /obj/machinery/atmospherics/pipe/smart)) - return TRUE - return FALSE - -/datum/crafting_recipe/improv_explosive - name = "IED" - result = /obj/item/grenade/iedcasing - reqs = list(/datum/reagent/fuel = 50, - /obj/item/stack/cable_coil = 1, - /obj/item/assembly/igniter = 1, - /obj/item/reagent_containers/cup/soda_cans = 1) - parts = list(/obj/item/reagent_containers/cup/soda_cans = 1) - time = 1.5 SECONDS - category = CAT_CHEMISTRY - -/datum/crafting_recipe/strobeshield - name = "Strobe Shield" - result = /obj/item/shield/riot/flash - reqs = list(/obj/item/wallframe/flasher = 1, - /obj/item/assembly/flash/handheld = 1, - /obj/item/shield/riot = 1) - time = 4 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/strobeshield/New() - ..() - blacklist |= subtypesof(/obj/item/shield/riot) - -/datum/crafting_recipe/molotov - name = "Molotov" - result = /obj/item/reagent_containers/cup/glass/bottle/molotov - reqs = list(/obj/item/reagent_containers/cup/rag = 1, - /obj/item/reagent_containers/cup/glass/bottle = 1) - parts = list(/obj/item/reagent_containers/cup/glass/bottle = 1) - time = 4 SECONDS - category = CAT_CHEMISTRY - -/datum/crafting_recipe/stunprod - name = "Stunprod" - result = /obj/item/melee/baton/security/cattleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/teleprod - name = "Teleprod" - result = /obj/item/melee/baton/security/cattleprod/teleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/ore/bluespace_crystal = 1) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/bola - name = "Bola" - result = /obj/item/restraints/legcuffs/bola - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/sheet/iron = 6) - time = 2 SECONDS//faster than crafting them by hand! - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/gonbola - name = "Gonbola" - result = /obj/item/restraints/legcuffs/bola/gonbola - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/sheet/iron = 6, - /obj/item/stack/sheet/animalhide/gondola = 1) - time = 4 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/tailclub - name = "Tail Club" - result = /obj/item/tailclub - reqs = list(/obj/item/organ/external/tail/lizard = 1, - /obj/item/stack/sheet/iron = 1) - blacklist = list(/obj/item/organ/external/tail/lizard/fake) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/tailwhip - name = "Liz O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip - reqs = list(/obj/item/organ/external/tail/lizard = 1, - /obj/item/stack/cable_coil = 1) - blacklist = list(/obj/item/organ/external/tail/lizard/fake) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/catwhip - name = "Cat O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip/kitty - reqs = list(/obj/item/organ/external/tail/cat = 1, - /obj/item/stack/cable_coil = 1) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/reciever - name = "Modular Rifle Reciever" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_SAW) - result = /obj/item/weaponcrafting/receiver - reqs = list(/obj/item/stack/sheet/iron = 5, - /obj/item/stack/sticky_tape = 1, - /obj/item/screwdriver = 1, - /obj/item/assembly/mousetrap = 1) - time = 10 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/riflestock - name = "Wooden Rifle Stock" - tool_paths = list(/obj/item/hatchet) - result = /obj/item/weaponcrafting/stock - reqs = list(/obj/item/stack/sheet/mineral/wood = 8, - /obj/item/stack/sticky_tape = 1) - time = 5 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/advancedegun - name = "Advanced Energy Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/e_gun/nuclear - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/nuclear = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/advancedegun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/tempgun - name = "Temperature Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/temperature - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/temperature = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/tempgun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/beam_rifle - name = "Particle Acceleration Rifle" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/beam_rifle - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/assembly/signaler/anomaly/flux = 1, - /obj/item/assembly/signaler/anomaly/grav = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/beam_rifle = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/beam_rifle/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/ebow - name = "Energy Crossbow" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/recharge/ebow/large - reqs = list(/obj/item/gun/energy/recharge/kinetic_accelerator = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/ebow = 1, - /datum/reagent/uranium/radium = 15) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/xraylaser - name = "X-ray Laser Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/xray - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/xray = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/xraylaser/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/hellgun - name = "Hellfire Laser Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/laser/hellgun - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/hellgun = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/hellgun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/ioncarbine - name = "Ion Carbine" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/ionrifle/carbine - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/ion = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/ioncarbine/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/decloner - name = "Biological Demolecularisor" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/decloner - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/decloner = 1, - /datum/reagent/baldium = 30, - /datum/reagent/toxin/mutagen = 40) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/decloner/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/teslacannon - name = "Tesla Cannon" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/tesla_cannon - reqs = list(/obj/item/assembly/signaler/anomaly/flux = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/tesla = 1) - time = 20 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/ed209 - name = "ED209" - result = /mob/living/simple_animal/bot/secbot/ed209 - reqs = list(/obj/item/robot_suit = 1, - /obj/item/clothing/head/helmet = 1, - /obj/item/clothing/suit/armor/vest = 1, - /obj/item/bodypart/leg/left/robot = 1, - /obj/item/bodypart/leg/right/robot = 1, - /obj/item/stack/sheet/iron = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/gun/energy/disabler = 1, - /obj/item/assembly/prox_sensor = 1) - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) - time = 6 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/secbot - name = "Secbot" - result = /mob/living/simple_animal/bot/secbot - reqs = list(/obj/item/assembly/signaler = 1, - /obj/item/clothing/head/helmet/sec = 1, - /obj/item/melee/baton/security/ = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/arm/right/robot = 1) - tool_behaviors = list(TOOL_WELDER) - time = 6 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/cleanbot - name = "Cleanbot" - result = /mob/living/simple_animal/bot/cleanbot - reqs = list(/obj/item/reagent_containers/cup/bucket = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/arm/right/robot = 1) - parts = list(/obj/item/reagent_containers/cup/bucket = 1) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/floorbot - name = "Floorbot" - result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox = 1, - /obj/item/stack/tile/iron = 10, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/arm/right/robot = 1) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/medbot - name = "Medbot" - result = /mob/living/simple_animal/bot/medbot - reqs = list(/obj/item/healthanalyzer = 1, - /obj/item/storage/medkit = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bodypart/arm/right/robot = 1) - parts = list( - /obj/item/storage/medkit = 1, - /obj/item/healthanalyzer = 1, - ) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/medbot/on_craft_completion(mob/user, atom/result) - var/mob/living/simple_animal/bot/medbot/bot = result - var/obj/item/storage/medkit/medkit = bot.contents[3] - bot.medkit_type = medkit - bot.healthanalyzer = bot.contents[4] - - if (istype(medkit, /obj/item/storage/medkit/fire)) - bot.skin = "ointment" - else if (istype(medkit, /obj/item/storage/medkit/toxin)) - bot.skin = "tox" - else if (istype(medkit, /obj/item/storage/medkit/o2)) - bot.skin = "o2" - else if (istype(medkit, /obj/item/storage/medkit/brute)) - bot.skin = "brute" - else if (istype(medkit, /obj/item/storage/medkit/advanced)) - bot.skin = "advanced" - - bot.damagetype_healer = initial(medkit.damagetype_healed) ? initial(medkit.damagetype_healed) : BRUTE - bot.update_appearance() - -/datum/crafting_recipe/honkbot - name = "Honkbot" - result = /mob/living/simple_animal/bot/secbot/honkbot - reqs = list(/obj/item/storage/box/clown = 1, - /obj/item/bodypart/arm/right/robot = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/bikehorn/ = 1) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/firebot - name = "Firebot" - result = /mob/living/simple_animal/bot/firebot - reqs = list(/obj/item/extinguisher = 1, - /obj/item/bodypart/arm/right/robot = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/clothing/head/utility/hardhat/red = 1) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/vibebot - name = "Vibebot" - result = /mob/living/simple_animal/bot/vibebot - reqs = list(/obj/item/light/bulb = 2, - /obj/item/bodypart/head/robot = 1, - /obj/item/assembly/prox_sensor = 1, - /obj/item/toy/crayon = 1) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/hygienebot - name = "Hygienebot" - result = /mob/living/simple_animal/bot/hygienebot - reqs = list(/obj/item/bot_assembly/hygienebot = 1, - /obj/item/stack/ducts = 1, - /obj/item/assembly/prox_sensor = 1) - tool_behaviors = list(TOOL_WELDER) - time = 4 SECONDS - category = CAT_ROBOT - -/datum/crafting_recipe/vim - name = "Vim" - result = /obj/vehicle/sealed/car/vim - reqs = list(/obj/item/clothing/head/helmet/space/eva = 1, - /obj/item/bodypart/leg/left/robot = 1, - /obj/item/bodypart/leg/right/robot = 1, - /obj/item/flashlight = 1, - /obj/item/assembly/voice = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 6 SECONDS //Has a four second do_after when building manually - category = CAT_ROBOT - -/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but - name = "Pneumatic Cannon" - result = /obj/item/pneumatic_cannon/ghetto - tool_behaviors = list(TOOL_WELDER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/iron = 4, - /obj/item/stack/package_wrap = 8, - /obj/item/pipe/quaternary = 2) - time = 5 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/flamethrower - name = "Flamethrower" - result = /obj/item/flamethrower - reqs = list(/obj/item/weldingtool = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/assembly/igniter = 1, - /obj/item/weldingtool = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 1 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/meteorslug - name = "Meteorslug Shell" - result = /obj/item/ammo_casing/shotgun/meteorslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/rcd_ammo = 1, - /datum/reagent/gunpowder = 10, - /datum/reagent/consumable/ethanol/rum = 10, - /obj/item/stock_parts/manipulator = 2) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/pulseslug - name = "Pulse Slug Shell" - result = /obj/item/ammo_casing/shotgun/pulseslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/capacitor/adv = 2, - /obj/item/stock_parts/micro_laser/ultra = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/dragonsbreath - name = "Dragonsbreath Shell" - result = /obj/item/ammo_casing/shotgun/dragonsbreath - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/frag12 - name = "FRAG-12 Shell" - result = /obj/item/ammo_casing/shotgun/frag12 - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /datum/reagent/glycerol = 5, - /datum/reagent/toxin/acid = 5, - /datum/reagent/toxin/acid/fluacid = 5) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/ionslug - name = "Ion Scatter Shell" - result = /obj/item/ammo_casing/shotgun/ion - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/micro_laser/ultra = 1, - /obj/item/stock_parts/subspace/crystal = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/improvisedslug - name = "Improvised Shotgun Shell" - result = /obj/item/ammo_casing/shotgun/improvised - reqs = list(/obj/item/stack/sheet/iron = 2, - /obj/item/stack/cable_coil = 1, - /datum/reagent/fuel = 10) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 1.2 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/laserslug - name = "Scatter Laser Shell" - result = /obj/item/ammo_casing/shotgun/laserslug - reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, - /obj/item/stock_parts/capacitor/adv = 1, - /obj/item/stock_parts/micro_laser/high = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 0.5 SECONDS - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/pipegun - name = "Pipegun" - result = /obj/item/gun/ballistic/rifle/boltaction/pipegun - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 1, - /obj/item/weaponcrafting/stock = 1, - /obj/item/stack/sticky_tape = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 5 SECONDS - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/pipegun_prime - name = "Regal Pipegun" - always_available = FALSE - result = /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime - reqs = list(/obj/item/gun/ballistic/rifle/boltaction/pipegun = 1, - /obj/item/food/deadmouse = 1, - /datum/reagent/consumable/grey_bull = 20, - /obj/item/spear = 1, - /obj/item/storage/toolbox= 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - tool_paths = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas, /obj/item/melee/baton/security/cattleprod) - time = 30 SECONDS //contemplate for a bit - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/trash_cannon - name = "Trash Cannon" - always_available = FALSE - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) - result = /obj/structure/cannon/trash - reqs = list( - /obj/item/melee/skateboard/improvised = 1, - /obj/item/tank/internals/oxygen = 1, - /datum/reagent/drug/maint/tar = 15, - /obj/item/restraints/handcuffs/cable = 1, - /obj/item/storage/toolbox = 1, - ) - category = CAT_WEAPON_RANGED - -/datum/crafting_recipe/trashball - name = "Trashball" - always_available = FALSE - result = /obj/item/stack/cannonball/trashball - reqs = list( - /obj/item/stack/sheet = 5, - /datum/reagent/consumable/space_cola = 10, - ) - category = CAT_WEAPON_AMMO - -/datum/crafting_recipe/chainsaw - name = "Chainsaw" - result = /obj/item/chainsaw - reqs = list(/obj/item/circular_saw = 1, - /obj/item/stack/cable_coil = 3, - /obj/item/stack/sheet/plasteel = 5) - tool_behaviors = list(TOOL_WELDER) - time = 5 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/spear - name = "Spear" - result = /obj/item/spear - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/shard = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/shard = 1) - time = 4 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/lizardhat - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/costume/lizard - time = 1 SECONDS - reqs = list(/obj/item/organ/external/tail/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/lizardhat_alternate - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/costume/lizard - time = 1 SECONDS - reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/kittyears - name = "Kitty Ears" - result = /obj/item/clothing/head/costume/kitty/genuine - time = 1 SECONDS - reqs = list(/obj/item/organ/external/tail/cat = 1, - /obj/item/organ/internal/ears/cat = 1) - category = CAT_CLOTHING - - -/datum/crafting_recipe/radiogloves - name = "Radio Gloves" - result = /obj/item/clothing/gloves/radio - time = 1.5 SECONDS - reqs = list(/obj/item/clothing/gloves/color/black = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/radio = 1) - tool_behaviors = list(TOOL_WIRECUTTER) - category = CAT_EQUIPMENT - -/datum/crafting_recipe/radiogloves/New() - ..() - blacklist |= typesof(/obj/item/radio/headset) - blacklist |= typesof(/obj/item/radio/intercom) - -/datum/crafting_recipe/mothplush - name = "Moth Plushie" - result = /obj/item/toy/plush/moth - reqs = list(/obj/item/stack/sheet/animalhide/mothroach = 1, - /obj/item/organ/internal/heart = 1, - /obj/item/stack/sheet/cloth = 3) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/mixedbouquet - name = "Mixed bouquet" - result = /obj/item/bouquet - reqs = list(/obj/item/food/grown/poppy/lily =2, - /obj/item/food/grown/sunflower = 2, - /obj/item/food/grown/poppy/geranium = 2) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/sunbouquet - name = "Sunflower bouquet" - result = /obj/item/bouquet/sunflower - reqs = list(/obj/item/food/grown/sunflower = 6) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/poppybouquet - name = "Poppy bouquet" - result = /obj/item/bouquet/poppy - reqs = list (/obj/item/food/grown/poppy = 6) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/rosebouquet - name = "Rose bouquet" - result = /obj/item/bouquet/rose - reqs = list(/obj/item/food/grown/rose = 6) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/spooky_camera - name = "Camera Obscura" - result = /obj/item/camera/spooky - time = 1.5 SECONDS - reqs = list(/obj/item/camera = 1, - /datum/reagent/water/holywater = 10) - parts = list(/obj/item/camera = 1) - category = CAT_ENTERTAINMENT - - -/datum/crafting_recipe/skateboard - name = "Skateboard" - result = /obj/vehicle/ridden/scooter/skateboard/improvised - time = 6 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 5, - /obj/item/stack/rods = 10) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/scooter - name = "Scooter" - result = /obj/vehicle/ridden/scooter - time = 6.5 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 5, - /obj/item/stack/rods = 12) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/wheelchair - name = "Wheelchair" - result = /obj/vehicle/ridden/wheelchair - reqs = list(/obj/item/stack/sheet/iron = 4, - /obj/item/stack/rods = 6) - time = 10 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/motorized_wheelchair - name = "Motorized Wheelchair" - result = /obj/vehicle/ridden/wheelchair/motorized - reqs = list(/obj/item/stack/sheet/iron = 10, - /obj/item/stack/rods = 8, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/capacitor = 1) - parts = list(/obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/capacitor = 1) - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) - time = 20 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/trapdoor_kit - name = "Trapdoor Construction Kit" - result = /obj/item/trapdoor_kit - reqs = list(/obj/item/stack/sheet/iron = 4, - /obj/item/stack/rods = 4, - /obj/item/stack/cable_coil = 10, - /obj/item/stock_parts/manipulator = 2, - /obj/item/assembly/signaler = 1) - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) - time = 10 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/trapdoor_remote - name = "Trapdoor Remote" - result = /obj/item/trapdoor_remote/preloaded // since its useless without its assembly just require an assembly to craft it - reqs = list( - /obj/item/compact_remote = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/assembly/trapdoor = 1) - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - time = 5 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/mousetrap - name = "Mouse Trap" - result = /obj/item/assembly/mousetrap - time = 1 SECONDS - reqs = list(/obj/item/stack/sheet/cardboard = 1, - /obj/item/stack/rods = 1) - category = CAT_EQUIPMENT - -/datum/crafting_recipe/papersack - name = "Paper Sack" - result = /obj/item/storage/box/papersack - time = 1 SECONDS - reqs = list(/obj/item/paper = 5) - category = CAT_CONTAINERS - - -/datum/crafting_recipe/flashlight_eyes - name = "Flashlight Eyes" - result = /obj/item/organ/internal/eyes/robotic/flashlight - time = 10 - reqs = list( - /obj/item/flashlight = 2, - /obj/item/restraints/handcuffs/cable = 1 - ) - category = CAT_EQUIPMENT - -/datum/crafting_recipe/paperframes - name = "Paper Frames" - result = /obj/item/stack/sheet/paperframes - result_amount = 5 - time = 1 SECONDS - reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) - category = CAT_STRUCTURE - -/datum/crafting_recipe/naturalpaper - name = "Hand-Pressed Paper" - time = 3 SECONDS - reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1) - tool_paths = list(/obj/item/hatchet) - result = /obj/item/paper_bin/bundlenatural - category = CAT_MISC - -/datum/crafting_recipe/sillycup - name = "Paper Cup" - result = /obj/item/reagent_containers/cup/glass/sillycup - time = 1 SECONDS - reqs = list(/obj/item/paper = 2) - category = CAT_CONTAINERS - -/datum/crafting_recipe/toysword - name = "Toy Sword" - reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) - result = /obj/item/toy/sword - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/blackcarpet - name = "Black Carpet" - reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) - result = /obj/item/stack/tile/carpet/black - result_amount = 50 - category = CAT_TILES - -/datum/crafting_recipe/curtain - name = "Curtains" - reqs = list(/obj/item/stack/sheet/cloth = 4, /obj/item/stack/rods = 1) - result = /obj/structure/curtain/cloth - category = CAT_FURNITURE - -/datum/crafting_recipe/showercurtain - name = "Shower Curtains" - reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1) - result = /obj/structure/curtain - category = CAT_FURNITURE - -/datum/crafting_recipe/extendohand_r - name = "Extendo-Hand (Right Arm)" - reqs = list(/obj/item/bodypart/arm/right/robot = 1, /obj/item/clothing/gloves/boxing = 1) - result = /obj/item/extendohand - category = CAT_EQUIPMENT - -/datum/crafting_recipe/extendohand_l - name = "Extendo-Hand (Left Arm)" - reqs = list(/obj/item/bodypart/arm/left/robot = 1, /obj/item/clothing/gloves/boxing = 1) - result = /obj/item/extendohand - category = CAT_EQUIPMENT - -/datum/crafting_recipe/chemical_payload - name = "Chemical Payload (C4)" - result = /obj/item/bombcore/chemical - reqs = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/grenade/c4 = 1, - /obj/item/grenade/chem_grenade = 2 - ) - parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) - time = 3 SECONDS - category = CAT_CHEMISTRY - -/datum/crafting_recipe/chemical_payload2 - name = "Chemical Payload (Gibtonite)" - result = /obj/item/bombcore/chemical - reqs = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/gibtonite = 1, - /obj/item/grenade/chem_grenade = 2 - ) - parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) - time = 5 SECONDS - category = CAT_CHEMISTRY - -/datum/crafting_recipe/bonearmor - name = "Bone Armor" - result = /obj/item/clothing/suit/armor/bone - time = 3 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 6) - category = CAT_CLOTHING - -/datum/crafting_recipe/bonetalisman - name = "Bone Talisman" - result = /obj/item/clothing/accessory/talisman - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/bonecodpiece - name = "Skull Codpiece" - result = /obj/item/clothing/accessory/skullcodpiece - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/skilt - name = "Sinew Kilt" - result = /obj/item/clothing/accessory/skilt - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 2) - category = CAT_CLOTHING - -/datum/crafting_recipe/bracers - name = "Bone Bracers" - result = /obj/item/clothing/gloves/bracer - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/skullhelm - name = "Skull Helmet" - result = /obj/item/clothing/head/helmet/skull - time = 3 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 4) - category = CAT_CLOTHING - -/datum/crafting_recipe/goliathcloak - name = "Goliath Cloak" - result = /obj/item/clothing/suit/hooded/cloak/goliath - time = 5 SECONDS - reqs = list(/obj/item/stack/sheet/leather = 2, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned - category = CAT_CLOTHING - -/datum/crafting_recipe/drakecloak - name = "Ash Drake Armour" - result = /obj/item/clothing/suit/hooded/cloak/drake - time = 6 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 10, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/ashdrake = 5) - category = CAT_CLOTHING - -/datum/crafting_recipe/godslayer - name = "Godslayer Armour" - result = /obj/item/clothing/suit/hooded/cloak/godslayer - time = 6 SECONDS - reqs = list(/obj/item/ice_energy_crystal = 1, /obj/item/wendigo_skull = 1, /obj/item/clockwork_alloy = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/gold_horn - name = "Golden Bike Horn" - result = /obj/item/bikehorn/golden - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, - /obj/item/bikehorn = 1) - category = CAT_TOOLS - -/datum/crafting_recipe/bonedagger - name = "Bone Dagger" - result = /obj/item/knife/combat/bone - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 2) - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/bonespear - name = "Bone Spear" - result = /obj/item/spear/bonespear - time = 3 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 4, - /obj/item/stack/sheet/sinew = 1) - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/boneaxe - name = "Bone Axe" - result = /obj/item/fireaxe/boneaxe - time = 5 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 6, - /obj/item/stack/sheet/sinew = 3) - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/bonfire - name = "Bonfire" - time = 6 SECONDS - reqs = list(/obj/item/grown/log = 5) - parts = list(/obj/item/grown/log = 5) - blacklist = list(/obj/item/grown/log/steel) - result = /obj/structure/bonfire - category = CAT_TOOLS - -/datum/crafting_recipe/skeleton_key - name = "Skeleton Key" - time = 3 SECONDS - reqs = list(/obj/item/stack/sheet/bone = 5) - result = /obj/item/skeleton_key - always_available = FALSE - category = CAT_MISC - -/datum/crafting_recipe/ore_sensor - name = "Ore Sensor" - time = 3 SECONDS - reqs = list( - /datum/reagent/brimdust = 15, - /obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 1, - ) - result = /obj/item/ore_sensor - category = CAT_EQUIPMENT - -/datum/crafting_recipe/headpike - name = "Spike Head (Glass Spear)" - time = 6.5 SECONDS - reqs = list(/obj/item/spear = 1, - /obj/item/bodypart/head = 1) - parts = list(/obj/item/bodypart/head = 1, - /obj/item/spear = 1) - blacklist = list(/obj/item/spear/explosive, /obj/item/spear/bonespear, /obj/item/spear/bamboospear) - result = /obj/structure/headpike - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/headpikebone - name = "Spike Head (Bone Spear)" - time = 6.5 SECONDS - reqs = list(/obj/item/spear/bonespear = 1, - /obj/item/bodypart/head = 1) - parts = list(/obj/item/bodypart/head = 1, - /obj/item/spear/bonespear = 1) - result = /obj/structure/headpike/bone - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/headpikebamboo - name = "Spike Head (Bamboo Spear)" - time = 6.5 SECONDS - reqs = list(/obj/item/spear/bamboospear = 1, - /obj/item/bodypart/head = 1) - parts = list(/obj/item/bodypart/head = 1, - /obj/item/spear/bamboospear = 1) - result = /obj/structure/headpike/bamboo - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/pressureplate - name = "Pressure Plate" - result = /obj/item/pressure_plate - time = 0.5 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 1, - /obj/item/stack/tile/iron = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/assembly/igniter = 1) - category = CAT_EQUIPMENT - - -/datum/crafting_recipe/rcl - name = "Makeshift Rapid Pipe Cleaner Layer" - result = /obj/item/rcl/ghetto - time = 4 SECONDS - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/iron = 15) - category = CAT_EQUIPMENT - -/datum/crafting_recipe/mummy - name = "Mummification Bandages (Mask)" - result = /obj/item/clothing/mask/mummy - time = 1 SECONDS - tool_paths = list(/obj/item/nullrod/egyptian) - reqs = list(/obj/item/stack/sheet/cloth = 2) - category = CAT_CLOTHING - -/datum/crafting_recipe/mummy/body - name = "Mummification Bandages (Body)" - result = /obj/item/clothing/under/costume/mummy - reqs = list(/obj/item/stack/sheet/cloth = 5) - -/datum/crafting_recipe/chaplain_hood - name = "Follower Hoodie" - result = /obj/item/clothing/suit/hooded/chaplain_hoodie - time = 1 SECONDS - tool_paths = list(/obj/item/clothing/suit/hooded/chaplain_hoodie, /obj/item/storage/book/bible) - reqs = list(/obj/item/stack/sheet/cloth = 4) - category = CAT_CLOTHING - -/datum/crafting_recipe/flower_garland - name = "Flower Garland" - result = /obj/item/clothing/head/costume/garland - time = 1 SECONDS - reqs = list(/obj/item/food/grown/poppy = 4, - /obj/item/food/grown/harebell = 4, - /obj/item/food/grown/rose = 4) - category = CAT_CLOTHING - -/datum/crafting_recipe/guillotine - name = "Guillotine" - result = /obj/structure/guillotine - time = 15 SECONDS // Building a functioning guillotine takes time - reqs = list(/obj/item/stack/sheet/plasteel = 3, - /obj/item/stack/sheet/mineral/wood = 20, - /obj/item/stack/cable_coil = 10) - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) - category = CAT_ENTERTAINMENT - -/datum/crafting_recipe/aitater - name = "intelliTater" - result = /obj/item/aicard/aitater - time = 3 SECONDS - tool_behaviors = list(TOOL_WIRECUTTER) - reqs = list(/obj/item/aicard = 1, - /obj/item/food/grown/potato = 1, - /obj/item/stack/cable_coil = 5) - parts = list(/obj/item/aicard = 1) - category = CAT_ROBOT - -/datum/crafting_recipe/aitater/aispook - name = "intelliLantern" - result = /obj/item/aicard/aispook - reqs = list(/obj/item/aicard = 1, - /obj/item/food/grown/pumpkin = 1, - /obj/item/stack/cable_coil = 5) - -/datum/crafting_recipe/aitater/on_craft_completion(mob/user, atom/result) - var/obj/item/aicard/new_card = result - var/obj/item/aicard/base_card = result.contents[1] - var/mob/living/silicon/ai = base_card.AI - - if(ai) - base_card.AI = null - ai.forceMove(new_card) - new_card.AI = ai - new_card.update_appearance() - qdel(base_card) - -/datum/crafting_recipe/ghettojetpack - name = "Improvised Jetpack" - result = /obj/item/tank/jetpack/improvised - time = 30 - reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = MAXCOIL) - category = CAT_EQUIPMENT - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) - -/datum/crafting_recipe/rib - name = "Colossal Rib" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 10, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/rib - category = CAT_STRUCTURE - -/datum/crafting_recipe/skull - name = "Skull Carving" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 6, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/skull - category = CAT_STRUCTURE - -/datum/crafting_recipe/halfskull - name = "Cracked Skull Carving" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 3, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/skull/half - category = CAT_STRUCTURE - -/datum/crafting_recipe/boneshovel - name = "Serrated Bone Shovel" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 4, - /datum/reagent/fuel/oil = 5, - /obj/item/shovel/spade = 1, - ) - result = /obj/item/shovel/serrated - category = CAT_TOOLS - -/datum/crafting_recipe/lasso - name = "Bone Lasso" - reqs = list( - /obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 5, - ) - result = /obj/item/key/lasso - category = CAT_TOOLS - -/datum/crafting_recipe/gripperoffbrand - name = "Improvised Gripper Gloves" - reqs = list( - /obj/item/clothing/gloves/fingerless = 1, - /obj/item/stack/sticky_tape = 1, - ) - result = /obj/item/clothing/gloves/tackler/offbrand - category = CAT_EQUIPMENT - -/datum/crafting_recipe/boh - name = "Bag of Holding" - reqs = list( - /obj/item/bag_of_holding_inert = 1, - /obj/item/assembly/signaler/anomaly/bluespace = 1, - ) - result = /obj/item/storage/backpack/holding - category = CAT_CONTAINERS - -/datum/crafting_recipe/ipickaxe - name = "Improvised Pickaxe" - reqs = list( - /obj/item/crowbar = 1, - /obj/item/knife = 1, - /obj/item/stack/sticky_tape = 1, - ) - result = /obj/item/pickaxe/improvised - category = CAT_TOOLS - -/datum/crafting_recipe/underwater_basket - name = "Underwater Basket (Bamboo)" - reqs = list( - /obj/item/stack/sheet/mineral/bamboo = 20 - ) - result = /obj/item/storage/basket - category = CAT_CONTAINERS - additional_req_text = " being underwater, underwater basketweaving mastery" - -/datum/crafting_recipe/underwater_basket/check_requirements(mob/user, list/collected_requirements) - . = ..() - if(!HAS_TRAIT(user,TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE)) - return FALSE - var/turf/T = get_turf(user) - if(istype(T, /turf/open/water)) - return TRUE - var/obj/machinery/shower/S = locate() in T - if(S?.actually_on) - return TRUE - -//Same but with wheat -/datum/crafting_recipe/underwater_basket/wheat - name = "Underwater Basket (Wheat)" - reqs = list( - /obj/item/food/grown/wheat = 50 - ) - - -/datum/crafting_recipe/elder_atmosian_statue - name = "Elder Atmosian Statue" - result = /obj/structure/statue/elder_atmosian - time = 6 SECONDS - reqs = list(/obj/item/stack/sheet/mineral/metal_hydrogen = 20, - /obj/item/stack/sheet/mineral/zaukerite = 15, - /obj/item/stack/sheet/iron = 30, - ) - category = CAT_STRUCTURE - -/datum/crafting_recipe/bluespace_vendor_mount - name = "Bluespace Vendor Wall Mount" - result = /obj/item/wallframe/bluespace_vendor_mount - time = 6 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 15, - /obj/item/stack/sheet/glass = 10, - /obj/item/stack/cable_coil = 10, - ) - category = CAT_ATMOSPHERIC - -/datum/crafting_recipe/shutters - name = "Shutters" - reqs = list(/obj/item/stack/sheet/plasteel = 5, - /obj/item/stack/cable_coil = 5, - /obj/item/electronics/airlock = 1 - ) - result = /obj/machinery/door/poddoor/shutters/preopen - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) - time = 10 SECONDS - category = CAT_DOORS - one_per_turf = TRUE - -/datum/crafting_recipe/blast_doors - name = "Blast Door" - reqs = list(/obj/item/stack/sheet/plasteel = 15, - /obj/item/stack/cable_coil = 15, - /obj/item/electronics/airlock = 1 - ) - result = /obj/machinery/door/poddoor/preopen - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) - time = 30 SECONDS - category = CAT_DOORS - one_per_turf = TRUE - -/datum/crafting_recipe/aquarium - name = "Aquarium" - result = /obj/structure/aquarium - time = 10 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 15, - /obj/item/stack/sheet/glass = 10, - /obj/item/aquarium_kit = 1 - ) - category = CAT_FURNITURE - -/datum/crafting_recipe/mod_core_standard - name = "MOD core (Standard)" - result = /obj/item/mod/core/standard - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 10 SECONDS - reqs = list(/obj/item/stack/cable_coil = 5, - /obj/item/stack/rods = 2, - /obj/item/stack/sheet/glass = 1, - /obj/item/organ/internal/heart/ethereal = 1, - ) - category = CAT_ROBOT - -/datum/crafting_recipe/mod_core_ethereal - name = "MOD core (Ethereal)" - result = /obj/item/mod/core/ethereal - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 10 SECONDS - reqs = list(/datum/reagent/consumable/liquidelectricity = 5, - /obj/item/stack/cable_coil = 5, - /obj/item/stack/rods = 2, - /obj/item/stack/sheet/glass = 1, - /obj/item/reagent_containers/syringe = 1, - ) - category = CAT_ROBOT - -/datum/crafting_recipe/alcohol_burner - name = "Burner (Ethanol)" - result = /obj/item/burner - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/cup/beaker = 1, - /datum/reagent/consumable/ethanol = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/oil_burner - name = "Burner (Oil)" - result = /obj/item/burner/oil - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/cup/beaker = 1, - /datum/reagent/fuel/oil = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/fuel_burner - name = "Burner (Fuel)" - result = /obj/item/burner/fuel - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/cup/beaker = 1, - /datum/reagent/fuel = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/thermometer - name = "Thermometer" - tool_behaviors = list(TOOL_WELDER) - result = /obj/item/thermometer - time = 5 SECONDS - reqs = list( - /datum/reagent/mercury = 5, - /obj/item/stack/sheet/glass = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/thermometer_alt - name = "Thermometer" - result = /obj/item/thermometer/pen - time = 5 SECONDS - reqs = list( - /datum/reagent/mercury = 5, - /obj/item/pen = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/ph_booklet - name = "pH booklet" - result = /obj/item/ph_booklet - time = 5 SECONDS - reqs = list( - /datum/reagent/universal_indicator = 5, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/dropper //Maybe make a glass pipette icon? - name = "Dropper" - result = /obj/item/reagent_containers/dropper - tool_behaviors = list(TOOL_WELDER) - time = 5 SECONDS - reqs = list( - /obj/item/stack/sheet/glass = 1, - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/improvised_chem_heater - name = "Improvised chem heater" - result = /obj/machinery/space_heater/improvised_chem_heater - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER) - time = 15 SECONDS - reqs = list( - /obj/item/stack/cable_coil = 2, - /obj/item/stack/sheet/glass = 2, - /obj/item/stack/sheet/iron = 2, - /datum/reagent/water = 50, - /obj/item/thermometer = 1 - ) - machinery = list(/obj/machinery/space_heater = CRAFTING_MACHINERY_CONSUME) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/improvised_chem_heater/on_craft_completion(mob/user, atom/result) - var/obj/item/stock_parts/cell/cell = locate(/obj/item/stock_parts/cell) in range(1) - if(!cell) - return - var/obj/machinery/space_heater/improvised_chem_heater/heater = result - var/turf/turf = get_turf(cell) - heater.forceMove(turf) - heater.attackby(cell, user) //puts it into the heater - -/datum/crafting_recipe/improvised_coolant - name = "Improvised cooling spray" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/extinguisher/crafted - time = 10 SECONDS - reqs = list( - /obj/item/toy/crayon/spraycan = 1, - /datum/reagent/water = 20, - /datum/reagent/consumable/ice = 10 - ) - category = CAT_CHEMISTRY - -/** - * Recipe used for upgrading fake N-spect scanners to bananium HONK-spect scanners - */ -/datum/crafting_recipe/clown_scanner_upgrade - name = "Bananium HONK-spect scanner" - result = /obj/item/inspector/clown/bananium - reqs = list(/obj/item/inspector/clown = 1, /obj/item/stack/sticky_tape = 3, /obj/item/stack/sheet/mineral/bananium = 5) //the chainsaw of prank tools - tool_paths = list(/obj/item/bikehorn) - time = 40 SECONDS - category = CAT_EQUIPMENT - -/datum/crafting_recipe/pipe - name = "Smart pipe fitting" - tool_behaviors = list(TOOL_WRENCH) - result = /obj/item/pipe/quaternary/pipe - reqs = list(/obj/item/stack/sheet/iron = 1) - time = 0.5 SECONDS - category = CAT_ATMOSPHERIC - -/datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.p_init_dir = ALL_CARDINALS - crafted_pipe.setDir(SOUTH) - crafted_pipe.update() - -/datum/crafting_recipe/layer_adapter - name = "Layer manifold fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/binary/layer_adapter - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 1 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/layer_adapter/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/layer_adapter/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/layer_manifold - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/color_adapter - name = "Color adapter fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/binary/color_adapter - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 1 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/color_adapter/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/color_adapter/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/color_adapter - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/he_pipe - name = "H/E pipe fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/quaternary/he_pipe - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 1 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/he_pipe/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/he_pipe/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/he_junction - name = "H/E junction fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/he_junction - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 1 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/he_junction/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/he_junction/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/junction - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/pressure_pump - name = "Pressure pump fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/binary/pressure_pump - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/pressure_pump/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/pressure_pump/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/binary/pump - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/manual_valve - name = "Manual valve fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/binary/manual_valve - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/manual_valve/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/manual_valve/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/binary/valve - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/vent - name = "Vent pump fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/vent - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/vent/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/vent/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/vent_pump - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/scrubber - name = "Scrubber fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/scrubber - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/scrubber/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/scrubber/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/vent_scrubber - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/filter - name = "Filter fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/trinary/flippable/filter - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/filter/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/filter/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/trinary/filter - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/mixer - name = "Mixer fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/trinary/flippable/mixer - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/mixer/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/mixer/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/trinary/mixer - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/connector - name = "Portable connector fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/connector - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/connector/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/connector/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/portables_connector - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/passive_vent - name = "Passive vent fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/passive_vent - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/passive_vent/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/passive_vent/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/passive_vent - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/injector - name = "Outlet injector fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/injector - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/iron = 1, - /obj/item/stack/cable_coil = 5) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/injector/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/injector/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/outlet_injector - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/he_exchanger - name = "Heat exchanger fitting" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) - result = /obj/item/pipe/directional/he_exchanger - reqs = list( - /obj/item/pipe = 1, - /obj/item/stack/sheet/plasteel = 1) - time = 2 SECONDS - category = CAT_ATMOSPHERIC - additional_req_text = " smart pipe fitting" - -/datum/crafting_recipe/he_exchanger/check_requirements(mob/user, list/collected_requirements) - return atmos_pipe_check(user, collected_requirements) - -/datum/crafting_recipe/he_exchanger/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/components/unary/heat_exchanger - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.setDir(user.dir) - crafted_pipe.update() - -/datum/crafting_recipe/steam_vent - name = "Steam Vent" - result = /obj/structure/steam_vent - time = 0.8 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 2, - /obj/item/stack/tile/iron = 1, - /obj/item/stock_parts/water_recycler = 1) - category = CAT_ATMOSPHERIC - -/datum/crafting_recipe/coffee_cartridge - name = "Bootleg Coffee Cartridge" - result = /obj/item/coffee_cartridge/bootleg - time = 2 SECONDS - reqs = list( - /obj/item/blank_coffee_cartridge = 1, - /datum/reagent/toxin/coffeepowder = 10, - ) - category = CAT_MISC - -/datum/crafting_recipe/toiletbong - name = "Toiletbong" - category = CAT_ENTERTAINMENT - tool_behaviors = list(TOOL_WRENCH) - reqs = list(/obj/item/flamethrower = 1) - machinery = list( /obj/structure/toilet) - result = /obj/structure/toiletbong - time = 5 SECONDS - additional_req_text = " plasma tank (on flamethrower), toilet" - -/datum/crafting_recipe/toiletbong/check_requirements(mob/user, list/collected_requirements) - if((locate(/obj/structure/toilet) in range(1, user.loc)) == null) - return FALSE - var/obj/item/flamethrower/flamethrower = collected_requirements[/obj/item/flamethrower][1] - if(flamethrower.ptank == null) - return FALSE - return TRUE - -/datum/crafting_recipe/toiletbong/on_craft_completion(mob/user, atom/result) - var/obj/structure/toiletbong/toiletbong = result - var/obj/structure/toilet/toilet = locate(/obj/structure/toilet) in range(1, user.loc) - for (var/obj/item/cistern_item in toilet.contents) - cistern_item.forceMove(user.loc) - to_chat(user, span_warning("[cistern_item] falls out of the toilet!")) - toiletbong.dir = toilet.dir - toiletbong.loc = toilet.loc - qdel(toilet) - to_chat(user, span_notice("[user] attaches the flamethrower to the repurposed toilet.")) - -/datum/crafting_recipe/pillow_suit - name = "pillow suit" - result = /obj/item/clothing/suit/pillow_suit - time = 2 SECONDS - reqs = list( - /obj/item/stack/sticky_tape = 10, - /obj/item/pillow = 5, - ) - category = CAT_CLOTHING - -/datum/crafting_recipe/pillow_hood - name = "pillow hood" - result = /obj/item/clothing/head/pillow_hood - tool_behaviors = list(TOOL_WIRECUTTER, TOOL_KNIFE) - time = 2 SECONDS - reqs = list( - /obj/item/stack/sticky_tape = 5, - /obj/item/pillow = 1, - ) - category = CAT_CLOTHING - - -/datum/crafting_recipe/house_edge - name = "House Edge" - result = /obj/item/house_edge - always_available = FALSE - tool_behaviors = list(TOOL_WRENCH, TOOL_SCREWDRIVER, TOOL_WELDER) - reqs = list( - /obj/item/v8_engine = 1, - /obj/item/weaponcrafting/receiver = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/sheet/iron = 2, - /obj/item/knife = 1, - /obj/item/weldingtool = 1, - /obj/item/roulette_wheel_beacon = 1, - ) - time = 10 SECONDS - category = CAT_WEAPON_MELEE - -/datum/crafting_recipe/punching_bag - name = "Punching Bag" - result = /obj/structure/punching_bag - tool_behaviors = list(TOOL_SCREWDRIVER) - reqs = list( - /obj/item/stack/sheet/iron = 2, - /obj/item/stack/rods = 1, - /obj/item/pillow = 1, - ) - category = CAT_ENTERTAINMENT - time = 10 SECONDS - -/datum/crafting_recipe/stacklifter - name = "Chest Press" - result = /obj/structure/weightmachine/stacklifter - tool_behaviors = list(TOOL_SCREWDRIVER) - reqs = list( - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/rods = 2, - /obj/item/chair = 1, - ) - category = CAT_ENTERTAINMENT - time = 10 SECONDS - -/datum/crafting_recipe/weightlifter - name = "Bench Press" - result = /obj/structure/weightmachine/weightlifter - tool_behaviors = list(TOOL_SCREWDRIVER) - reqs = list( - /obj/item/stack/sheet/iron = 5, - /obj/item/stack/rods = 2, - /obj/item/chair = 1, - ) - category = CAT_ENTERTAINMENT - time = 10 SECONDS - -#undef CRAFTING_MACHINERY_CONSUME -#undef CRAFTING_MACHINERY_USE diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm new file mode 100644 index 00000000000000..ba5221f0d241d8 --- /dev/null +++ b/code/datums/components/crafting/robot.dm @@ -0,0 +1,214 @@ +/datum/crafting_recipe/ed209 + name = "ED209" + result = /mob/living/simple_animal/bot/secbot/ed209 + reqs = list( + /obj/item/robot_suit = 1, + /obj/item/clothing/head/helmet = 1, + /obj/item/clothing/suit/armor/vest = 1, + /obj/item/bodypart/leg/left/robot = 1, + /obj/item/bodypart/leg/right/robot = 1, + /obj/item/stack/sheet/iron = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/gun/energy/disabler = 1, + /obj/item/assembly/prox_sensor = 1, + ) + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + time = 6 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/secbot + name = "Secbot" + result = /mob/living/simple_animal/bot/secbot + reqs = list( + /obj/item/assembly/signaler = 1, + /obj/item/clothing/head/helmet/sec = 1, + /obj/item/melee/baton/security/ = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/arm/right/robot = 1, + ) + tool_behaviors = list(TOOL_WELDER) + time = 6 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/cleanbot + name = "Cleanbot" + result = /mob/living/simple_animal/bot/cleanbot + reqs = list( + /obj/item/reagent_containers/cup/bucket = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/arm/right/robot = 1, + ) + parts = list(/obj/item/reagent_containers/cup/bucket = 1) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/floorbot + name = "Floorbot" + result = /mob/living/simple_animal/bot/floorbot + reqs = list( + /obj/item/storage/toolbox = 1, + /obj/item/stack/tile/iron = 10, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/arm/right/robot = 1, + ) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/medbot + name = "Medbot" + result = /mob/living/simple_animal/bot/medbot + reqs = list( + /obj/item/healthanalyzer = 1, + /obj/item/storage/medkit = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bodypart/arm/right/robot = 1, + ) + parts = list( + /obj/item/storage/medkit = 1, + /obj/item/healthanalyzer = 1, + ) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/medbot/on_craft_completion(mob/user, atom/result) + var/mob/living/simple_animal/bot/medbot/bot = result + var/obj/item/storage/medkit/medkit = bot.contents[3] + bot.medkit_type = medkit + bot.healthanalyzer = bot.contents[4] + + if (istype(medkit, /obj/item/storage/medkit/fire)) + bot.skin = "ointment" + else if (istype(medkit, /obj/item/storage/medkit/toxin)) + bot.skin = "tox" + else if (istype(medkit, /obj/item/storage/medkit/o2)) + bot.skin = "o2" + else if (istype(medkit, /obj/item/storage/medkit/brute)) + bot.skin = "brute" + else if (istype(medkit, /obj/item/storage/medkit/advanced)) + bot.skin = "advanced" + + bot.damagetype_healer = initial(medkit.damagetype_healed) ? initial(medkit.damagetype_healed) : BRUTE + bot.update_appearance() + +/datum/crafting_recipe/honkbot + name = "Honkbot" + result = /mob/living/simple_animal/bot/secbot/honkbot + reqs = list( + /obj/item/storage/box/clown = 1, + /obj/item/bodypart/arm/right/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/bikehorn = 1, + ) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/firebot + name = "Firebot" + result = /mob/living/simple_animal/bot/firebot + reqs = list( + /obj/item/extinguisher = 1, + /obj/item/bodypart/arm/right/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/clothing/head/utility/hardhat/red = 1, + ) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/vibebot + name = "Vibebot" + result = /mob/living/simple_animal/bot/vibebot + reqs = list( + /obj/item/light/bulb = 2, + /obj/item/bodypart/head/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/toy/crayon = 1, + ) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/hygienebot + name = "Hygienebot" + result = /mob/living/simple_animal/bot/hygienebot + reqs = list( + /obj/item/bot_assembly/hygienebot = 1, + /obj/item/stack/ducts = 1, + /obj/item/assembly/prox_sensor = 1, + ) + tool_behaviors = list(TOOL_WELDER) + time = 4 SECONDS + category = CAT_ROBOT + +/datum/crafting_recipe/vim + name = "Vim" + result = /obj/vehicle/sealed/car/vim + reqs = list( + /obj/item/clothing/head/helmet/space/eva = 1, + /obj/item/bodypart/leg/left/robot = 1, + /obj/item/bodypart/leg/right/robot = 1, + /obj/item/flashlight = 1, + /obj/item/assembly/voice = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 6 SECONDS //Has a four second do_after when building manually + category = CAT_ROBOT + +/datum/crafting_recipe/aitater + name = "intelliTater" + result = /obj/item/aicard/aitater + time = 3 SECONDS + tool_behaviors = list(TOOL_WIRECUTTER) + reqs = list( + /obj/item/aicard = 1, + /obj/item/food/grown/potato = 1, + /obj/item/stack/cable_coil = 5, + ) + parts = list(/obj/item/aicard = 1) + category = CAT_ROBOT + +/datum/crafting_recipe/aitater/aispook + name = "intelliLantern" + result = /obj/item/aicard/aispook + reqs = list( + /obj/item/aicard = 1, + /obj/item/food/grown/pumpkin = 1, + /obj/item/stack/cable_coil = 5, + ) + +/datum/crafting_recipe/aitater/on_craft_completion(mob/user, atom/result) + var/obj/item/aicard/new_card = result + var/obj/item/aicard/base_card = result.contents[1] + var/mob/living/silicon/ai = base_card.AI + + if(ai) + base_card.AI = null + ai.forceMove(new_card) + new_card.AI = ai + new_card.update_appearance() + qdel(base_card) + +/datum/crafting_recipe/mod_core_standard + name = "MOD core (Standard)" + result = /obj/item/mod/core/standard + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 10 SECONDS + reqs = list( + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/organ/internal/heart/ethereal = 1, + ) + category = CAT_ROBOT + +/datum/crafting_recipe/mod_core_ethereal + name = "MOD core (Ethereal)" + result = /obj/item/mod/core/ethereal + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 10 SECONDS + reqs = list( + /datum/reagent/consumable/liquidelectricity = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/reagent_containers/syringe = 1, + ) + category = CAT_ROBOT diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm new file mode 100644 index 00000000000000..4a56852ecd5efc --- /dev/null +++ b/code/datums/components/crafting/structures.dm @@ -0,0 +1,62 @@ +/datum/crafting_recipe/paperframes + name = "Paper Frames" + time = 1 SECONDS + reqs = list( + /obj/item/stack/sheet/mineral/wood = 5, + /obj/item/paper = 20, + ) + result = /obj/item/stack/sheet/paperframes + result_amount = 5 + category = CAT_STRUCTURE + +/datum/crafting_recipe/rib + name = "Colossal Rib" + always_available = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 10, + /datum/reagent/fuel/oil = 5, + ) + result = /obj/structure/statue/bone/rib + category = CAT_STRUCTURE + +/datum/crafting_recipe/skull + name = "Skull Carving" + always_available = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 6, + /datum/reagent/fuel/oil = 5, + ) + result = /obj/structure/statue/bone/skull + category = CAT_STRUCTURE + +/datum/crafting_recipe/halfskull + name = "Cracked Skull Carving" + always_available = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 3, + /datum/reagent/fuel/oil = 5, + ) + result = /obj/structure/statue/bone/skull/half + category = CAT_STRUCTURE + +/datum/crafting_recipe/firecabinet + name = "Fire Axe Cabinet" + result = /obj/item/wallframe/fireaxecabinet + time = 8 SECONDS + reqs = list( + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/sheet/glass = 5, + /obj/item/stack/cable_coil = 10, + ) + category = CAT_STRUCTURE + +/datum/crafting_recipe/mechcabinet + name = "Mech Removal Cabinet" + result = /obj/item/wallframe/fireaxecabinet/mechremoval + time = 8 SECONDS + reqs = list( + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/sheet/glass = 5, + /obj/item/stack/cable_coil = 10, + ) + category = CAT_STRUCTURE diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index f52db4c894ec17..f7864032df6397 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -138,3 +138,169 @@ time = 2 SECONDS category = CAT_CLOTHING +/datum/crafting_recipe/lizardhat + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/costume/lizard + time = 1 SECONDS + reqs = list(/obj/item/organ/external/tail/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/lizardhat_alternate + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/costume/lizard + time = 1 SECONDS + reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/kittyears + name = "Kitty Ears" + result = /obj/item/clothing/head/costume/kitty/genuine + time = 1 SECONDS + reqs = list( + /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/internal/ears/cat = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/bonearmor + name = "Bone Armor" + result = /obj/item/clothing/suit/armor/bone + time = 3 SECONDS + reqs = list(/obj/item/stack/sheet/bone = 6) + category = CAT_CLOTHING + +/datum/crafting_recipe/bonetalisman + name = "Bone Talisman" + result = /obj/item/clothing/accessory/talisman + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/bonecodpiece + name = "Skull Codpiece" + result = /obj/item/clothing/accessory/skullcodpiece + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/skilt + name = "Sinew Kilt" + result = /obj/item/clothing/accessory/skilt + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 2, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/bracers + name = "Bone Bracers" + result = /obj/item/clothing/gloves/bracer + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/skullhelm + name = "Skull Helmet" + result = /obj/item/clothing/head/helmet/skull + time = 3 SECONDS + reqs = list(/obj/item/stack/sheet/bone = 4) + category = CAT_CLOTHING + +/datum/crafting_recipe/goliathcloak + name = "Goliath Cloak" + result = /obj/item/clothing/suit/hooded/cloak/goliath + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 2, + ) //it takes 4 goliaths to make 1 cloak if the plates are skinned + category = CAT_CLOTHING + +/datum/crafting_recipe/drakecloak + name = "Ash Drake Armour" + result = /obj/item/clothing/suit/hooded/cloak/drake + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/ashdrake = 5, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/godslayer + name = "Godslayer Armour" + result = /obj/item/clothing/suit/hooded/cloak/godslayer + time = 6 SECONDS + reqs = list( + /obj/item/ice_energy_crystal = 1, + /obj/item/wendigo_skull = 1, + /obj/item/clockwork_alloy = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/mummy + name = "Mummification Bandages (Mask)" + result = /obj/item/clothing/mask/mummy + time = 1 SECONDS + tool_paths = list(/obj/item/nullrod/egyptian) + reqs = list(/obj/item/stack/sheet/cloth = 2) + category = CAT_CLOTHING + +/datum/crafting_recipe/mummy/body + name = "Mummification Bandages (Body)" + result = /obj/item/clothing/under/costume/mummy + reqs = list(/obj/item/stack/sheet/cloth = 5) + +/datum/crafting_recipe/chaplain_hood + name = "Follower Hoodie" + result = /obj/item/clothing/suit/hooded/chaplain_hoodie + time = 1 SECONDS + tool_paths = list( + /obj/item/clothing/suit/hooded/chaplain_hoodie, + /obj/item/storage/book/bible, + ) + reqs = list(/obj/item/stack/sheet/cloth = 4) + category = CAT_CLOTHING + +/datum/crafting_recipe/flower_garland + name = "Flower Garland" + result = /obj/item/clothing/head/costume/garland + time = 1 SECONDS + reqs = list( + /obj/item/food/grown/poppy = 4, + /obj/item/food/grown/harebell = 4, + /obj/item/food/grown/rose = 4, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/pillow_suit + name = "pillow suit" + result = /obj/item/clothing/suit/pillow_suit + time = 2 SECONDS + reqs = list( + /obj/item/stack/sticky_tape = 10, + /obj/item/pillow = 5, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/pillow_hood + name = "pillow hood" + result = /obj/item/clothing/head/pillow_hood + tool_behaviors = list(TOOL_WIRECUTTER, TOOL_KNIFE) + time = 2 SECONDS + reqs = list( + /obj/item/stack/sticky_tape = 5, + /obj/item/pillow = 1, + ) + category = CAT_CLOTHING diff --git a/code/datums/components/crafting/tiles.dm b/code/datums/components/crafting/tiles.dm new file mode 100644 index 00000000000000..5f7c41e012e0cf --- /dev/null +++ b/code/datums/components/crafting/tiles.dm @@ -0,0 +1,9 @@ +/datum/crafting_recipe/blackcarpet + name = "Black Carpet" + reqs = list( + /obj/item/stack/tile/carpet = 50, + /obj/item/toy/crayon/black = 1, + ) + result = /obj/item/stack/tile/carpet/black + result_amount = 50 + category = CAT_TILES diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm new file mode 100644 index 00000000000000..e6929845c38a1f --- /dev/null +++ b/code/datums/components/crafting/tools.dm @@ -0,0 +1,48 @@ +/datum/crafting_recipe/gold_horn + name = "Golden Bike Horn" + result = /obj/item/bikehorn/golden + time = 2 SECONDS + reqs = list( + /obj/item/stack/sheet/mineral/bananium = 5, + /obj/item/bikehorn = 1, + ) + category = CAT_TOOLS + +/datum/crafting_recipe/bonfire + name = "Bonfire" + time = 6 SECONDS + reqs = list(/obj/item/grown/log = 5) + parts = list(/obj/item/grown/log = 5) + blacklist = list(/obj/item/grown/log/steel) + result = /obj/structure/bonfire + category = CAT_TOOLS + +/datum/crafting_recipe/boneshovel + name = "Serrated Bone Shovel" + always_available = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 4, + /datum/reagent/fuel/oil = 5, + /obj/item/shovel/spade = 1, + ) + result = /obj/item/shovel/serrated + category = CAT_TOOLS + +/datum/crafting_recipe/lasso + name = "Bone Lasso" + reqs = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 5, + ) + result = /obj/item/key/lasso + category = CAT_TOOLS + +/datum/crafting_recipe/ipickaxe + name = "Improvised Pickaxe" + reqs = list( + /obj/item/crowbar = 1, + /obj/item/knife = 1, + /obj/item/stack/sticky_tape = 1, + ) + result = /obj/item/pickaxe/improvised + category = CAT_TOOLS diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm new file mode 100644 index 00000000000000..e7ad919c1de64b --- /dev/null +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -0,0 +1,95 @@ +/datum/crafting_recipe/meteorslug + name = "Meteorslug Shell" + result = /obj/item/ammo_casing/shotgun/meteorslug + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/rcd_ammo = 1, + /datum/reagent/gunpowder = 10, + /datum/reagent/consumable/ethanol/rum = 10, + /obj/item/stock_parts/manipulator = 2, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/pulseslug + name = "Pulse Slug Shell" + result = /obj/item/ammo_casing/shotgun/pulseslug + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/capacitor/adv = 2, + /obj/item/stock_parts/micro_laser/ultra = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/dragonsbreath + name = "Dragonsbreath Shell" + result = /obj/item/ammo_casing/shotgun/dragonsbreath + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /datum/reagent/phosphorus = 5, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/frag12 + name = "FRAG-12 Shell" + result = /obj/item/ammo_casing/shotgun/frag12 + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /datum/reagent/glycerol = 5, + /datum/reagent/toxin/acid = 5, + /datum/reagent/toxin/acid/fluacid = 5, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/ionslug + name = "Ion Scatter Shell" + result = /obj/item/ammo_casing/shotgun/ion + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/micro_laser/ultra = 1, + /obj/item/stock_parts/subspace/crystal = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/improvisedslug + name = "Improvised Shotgun Shell" + result = /obj/item/ammo_casing/shotgun/improvised + reqs = list( + /obj/item/stack/sheet/iron = 2, + /obj/item/stack/cable_coil = 1, + /datum/reagent/fuel = 10, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 1.2 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/laserslug + name = "Scatter Laser Shell" + result = /obj/item/ammo_casing/shotgun/laserslug + reqs = list( + /obj/item/ammo_casing/shotgun/techshell = 1, + /obj/item/stock_parts/capacitor/adv = 1, + /obj/item/stock_parts/micro_laser/high = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 0.5 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/trashball + name = "Trashball" + always_available = FALSE + result = /obj/item/stack/cannonball/trashball + reqs = list( + /obj/item/stack/sheet = 5, + /datum/reagent/consumable/space_cola = 10, + ) + category = CAT_WEAPON_AMMO diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 4bfc9217ab1521..b64702a22c0a49 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -18,6 +18,8 @@ var/item_path = /obj/item/fireaxe /// Overlay we get when the item is inside us. var/item_overlay = "axe" + /// Whether we should populate our own contents on Initialize() + var/populate_contents = TRUE MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) @@ -31,7 +33,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) /obj/structure/fireaxecabinet/Initialize(mapload) . = ..() - held_item = new item_path(src) + if(populate_contents) + held_item = new item_path(src) update_appearance() /obj/structure/fireaxecabinet/Destroy() @@ -115,7 +118,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) if(!(flags_1 & NODECONSTRUCT_1)) if(held_item && loc) held_item.forceMove(loc) - new /obj/item/stack/sheet/iron(loc, 2) + new /obj/item/wallframe/fireaxecabinet(loc) qdel(src) /obj/structure/fireaxecabinet/blob_act(obj/structure/blob/B) @@ -190,6 +193,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) update_appearance() return +/obj/structure/fireaxecabinet/empty + populate_contents = FALSE + +/obj/item/wallframe/fireaxecabinet + name = "fire axe cabinet" + desc = "Home to a window's greatest nightmare. Apply to wall to use." + icon = 'icons/obj/wallmounts.dmi' + icon_state = "fireaxe" + result_path = /obj/structure/fireaxecabinet/empty + pixel_shift = 32 + /obj/structure/fireaxecabinet/mechremoval name = "mech removal tool cabinet" desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the tool. As if." @@ -198,3 +212,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) item_overlay = "crowbar" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval, 32) + +/obj/structure/fireaxecabinet/mechremoval/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + if(held_item && loc) + held_item.forceMove(loc) + new /obj/item/wallframe/fireaxecabinet/mechremoval(loc) + qdel(src) + +/obj/structure/fireaxecabinet/mechremoval/empty + populate_contents = FALSE + +/obj/item/wallframe/fireaxecabinet/mechremoval + name = "mech removal tool cabinet" + desc = "Home to a very special crowbar. Apply to wall to use." + icon_state = "mechremoval" + result_path = /obj/structure/fireaxecabinet/mechremoval/empty diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 6223445231558e..81251b1382ef85 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -1,4 +1,3 @@ -//wip wip wup /obj/structure/mirror name = "mirror" desc = "Mirror mirror on the wall, who's the most robust of them all?" @@ -91,7 +90,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) /obj/structure/mirror/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(!disassembled) - new /obj/item/shard( src.loc ) + new /obj/item/shard(loc) + else + new /obj/item/wallframe/mirror(loc) qdel(src) /obj/structure/mirror/welder_act(mob/living/user, obj/item/I) @@ -105,10 +106,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(!I.tool_start_check(user, amount=0)) return TRUE - to_chat(user, span_notice("You begin repairing [src]...")) - if(I.use_tool(src, user, 10, volume=50)) - to_chat(user, span_notice("You repair [src].")) - broken = 0 + balloon_alert(user, "repairing...") + if(I.use_tool(src, user, 10, volume = 50)) + balloon_alert(user, "repaired") + broken = FALSE icon_state = initial(icon_state) desc = initial(desc) @@ -121,6 +122,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(BURN) playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) +/obj/item/wallframe/mirror + name = "mirror" + desc = "An unmounted mirror. Attach it to a wall to use." + icon = 'icons/obj/watercloset.dmi' + icon_state = "mirror" + custom_materials = list( + /datum/material/glass = MINERAL_MATERIAL_AMOUNT, + /datum/material/silver = MINERAL_MATERIAL_AMOUNT, + ) + result_path = /obj/structure/mirror + pixel_shift = 28 /obj/structure/mirror/magic name = "magic mirror" diff --git a/tgstation.dme b/tgstation.dme index 0af341ee48af32..5b917c79470dad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -987,10 +987,25 @@ #include "code\datums\components\wet_floor.dm" #include "code\datums\components\container_item\container_item.dm" #include "code\datums\components\container_item\tank_holder.dm" +#include "code\datums\components\crafting\_recipes.dm" +#include "code\datums\components\crafting\atmospheric.dm" +#include "code\datums\components\crafting\chemistry.dm" +#include "code\datums\components\crafting\containers.dm" #include "code\datums\components\crafting\crafting.dm" +#include "code\datums\components\crafting\doors.dm" +#include "code\datums\components\crafting\entertainment.dm" +#include "code\datums\components\crafting\equipment.dm" +#include "code\datums\components\crafting\furniture.dm" #include "code\datums\components\crafting\guncrafting.dm" -#include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\melee_weapon.dm" +#include "code\datums\components\crafting\misc.dm" +#include "code\datums\components\crafting\ranged_weapon.dm" +#include "code\datums\components\crafting\robot.dm" +#include "code\datums\components\crafting\structures.dm" #include "code\datums\components\crafting\tailoring.dm" +#include "code\datums\components\crafting\tiles.dm" +#include "code\datums\components\crafting\tools.dm" +#include "code\datums\components\crafting\weapon_ammo.dm" #include "code\datums\components\fantasy\_fantasy.dm" #include "code\datums\components\fantasy\affix.dm" #include "code\datums\components\fantasy\prefixes.dm"