Files
Bubberstation/code/datums/components/crafting/_recipes.dm
plsleavemealon 20acca9c68 Morbid surgery toolset (#91668)
## About The Pull Request

A morbid surgery toolset for coroners! Functions exactly like an
ordinary surgical toolset except it uses morbid tools instead of normal
tools! All stats are the same between them otherwise! So to clarify,
this means that these tools all have the CRUEL_IMPLEMENT tag, as they
inherit it from their parent tool. Making them faster for morbid
surgeries when used by someone with the morbid trait (ala coroner).

Also includes a way to craft the toolset:
Requires 1 surgical arm implant
and the following tools: wirecutter, screwdriver, and welder
**NOTE:** Cannot use an emagged surgical toolset.

Takes 10 seconds to craft!

Also made a second craft which allows you to change it back to normal
toolset too. Functions identically to the first but obviously requires a
morbid toolset to do so.

The morbid toolset does not have an emagged variant at this time.

## Why It's Good For The Game

More fun thematic tools for players to enjoy, and for coroners that
prefer to use toolsets now they don't have to give up their thematic
tools for them.

## Changelog

🆑
add: Adds a brand new morbid themed surgical toolset, along with a way
to craft it from a normal surgical toolset! These tools, much like their
non-augmented counterparts are faster at certain surgeries when used by
someone that is morbidly inclined.
/🆑


![image](https://github.com/user-attachments/assets/ae7b7d99-63db-415c-a4ff-3f5fbd00a60e)

![image](https://github.com/user-attachments/assets/78c5b1a9-7e08-4581-b893-7fb2a0af212f)
2025-06-17 11:52:24 +10:00

125 lines
5.0 KiB
Plaintext

/datum/crafting_recipe
/// in-game display name
/// Optional, if not set uses result name
var/name
/// description displayed in game
/// Optional, if not set uses result desc
var/desc
///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
/**
* If defined, it'll spawn paths in this list first during the unit test.
* This is an assoc list, with the key being the paths and the value being the amount (e.g. list(/obj/item = 2))
*/
var/list/unit_test_spawn_extras
///time in seconds. Remember to use the SECONDS define!
var/time = 3 SECONDS
///type paths of items that will be forceMoved() into the result instead of being deleted
var/list/parts = list()
///items, structures and machineries of types that are in this list won't transfer their materials to the result
var/list/requirements_mats_blacklist
///like tool_behaviors but for reagents
var/list/chem_catalysts = list()
///where it shows up in the crafting UI
var/category
///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
///Required structures for the craft, set the assigned value of the typepath to CRAFTING_STRUCTURE_CONSUME or CRAFTING_STRUCTURE_USE. Lazy associative list: type_path key -> flag value.
var/list/structures
/// Bitflag of additional placement checks required to place. (STACK_CHECK_CARDINALS|STACK_CHECK_ADJACENT|STACK_CHECK_TRAM_FORBIDDEN|STACK_CHECK_TRAM_EXCLUSIVE)
var/placement_checks = NONE
/// 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
/// Whether we should delete the contents of the crafted storage item (Only works with storage items, used for ammo boxes, donut boxes, internals boxes, etc)
var/delete_contents = TRUE
/// Allows you to craft so that you don't have to click the craft button many times.
var/mass_craftable = FALSE
///crafting_flags var to hold bool values
var/crafting_flags = CRAFT_CHECK_DENSITY
/datum/crafting_recipe/New()
if(!name && result)
var/atom/atom_result = result
name = initial(atom_result.name)
if(!(result in reqs))
blacklist += result
// These should be excluded from all crafting recipies
blacklist += list(
/obj/item/cautery/augment,
/obj/item/cautery/cruel/augment,
/obj/item/circular_saw/augment,
/obj/item/circular_saw/cruel/augment,
/obj/item/crowbar/cyborg,
/obj/item/hemostat/augment,
/obj/item/hemostat/cruel/augment,
/obj/item/multitool/cyborg,
/obj/item/retractor/augment,
/obj/item/retractor/cruel/augment,
/obj/item/scalpel/augment,
/obj/item/scalpel/cruel/augment,
/obj/item/screwdriver/cyborg,
/obj/item/surgicaldrill/augment,
/obj/item/surgicaldrill/cruel/augment,
/obj/item/weldingtool/largetank/cyborg,
/obj/item/wirecutters/cyborg,
/obj/item/wrench/cyborg,
)
if(tool_behaviors)
tool_behaviors = string_list(tool_behaviors)
if(tool_paths)
tool_paths = string_list(tool_paths)
for(var/key in parts)
if(!parts[key])
//ensure every single, same-type part used for the recipe will be transferred if the value is otherwise not specified
parts[key] = INFINITY
/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
src.placement_checks = stack_recipe.placement_checks
if(!(stack_recipe.crafting_flags & CRAFT_APPLIES_MATS))
requirements_mats_blacklist = list(material) //the item is not intended to have mats :shrug:
/**
* 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
///Run custom pre-craft checks for this recipe for tools, rather than consumed requirements.
/datum/crafting_recipe/proc/check_tools(atom/source, list/collected_tools, final_check = FALSE)
return TRUE
/// Additional UI data to be passed to the crafting UI for this recipe
/datum/crafting_recipe/proc/crafting_ui_data()
return list()