Unit test material checks are now performed on all crafting recipes by default. All stack recipes now transfer mats to the results (#92620)

## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.

## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.

Currently a WIP as I slowly deal with the unit test reports.

## Changelog

🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
This commit is contained in:
Ghom
2025-12-02 18:29:01 -05:00
committed by GitHub
parent 085007eae1
commit 0b0c5ea91e
272 changed files with 850 additions and 280 deletions
@@ -7,6 +7,7 @@
icon = 'icons/obj/antags/abductor.dmi'
build_stack_type = /obj/item/stack/sheet/mineral/abductor
icon_state = "bed"
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2)
/obj/structure/table_frame/abductor
name = "alien table frame"
@@ -14,6 +15,7 @@
icon_state = "alien_frame"
framestack = /obj/item/stack/sheet/mineral/abductor
framestackamount = 1
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT)
/obj/structure/table_frame/abductor/get_table_type(obj/item/stack/our_stack)
if(istype(our_stack, /obj/item/stack/sheet/mineral/abductor))
@@ -36,6 +38,7 @@
frame = /obj/structure/table_frame/abductor
custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT)
can_flip = FALSE
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2)
/obj/structure/table/optable/abductor
name = "alien operating table"
@@ -49,6 +52,7 @@
icon_state = "bed"
can_buckle = TRUE
buckle_lying = 90
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT, /datum/material/silver = SHEET_MATERIAL_AMOUNT)
/// Amount to inject per second
var/inject_amount = 0.5
@@ -88,6 +92,7 @@
can_weld_shut = FALSE
door_anim_time = 0
material_drop = /obj/item/stack/sheet/mineral/abductor
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2)
/obj/structure/door_assembly/door_assembly_abductor
name = "alien airlock assembly"
@@ -97,3 +102,4 @@
airlock_type = /obj/machinery/door/airlock/abductor
material_type = /obj/item/stack/sheet/mineral/abductor
noglass = TRUE
custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 4)
@@ -246,6 +246,7 @@
actions_types = null
color_cutoffs = list(40, 0, 0) //red
glass_colour_type = null
custom_materials = null
/obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot)
. = ..()
@@ -12,6 +12,7 @@
icon_state = "talismanaltar"
break_message = span_warning("The altar shatters, leaving only the wailing of the damned!")
mansus_conversion_path = /obj/effect/heretic_rune
custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3)
/obj/structure/destructible/cult/item_dispenser/altar/setup_options()
var/static/list/altar_items = list(
@@ -14,6 +14,7 @@
light_color = LIGHT_COLOR_FIRE
break_message = span_warning("The books and tomes of the archives burn into ash as the desk shatters!")
mansus_conversion_path = /obj/item/codex_cicatrix
custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3)
/obj/structure/destructible/cult/item_dispenser/archives/setup_options()
var/static/list/archive_items = list(
@@ -14,6 +14,7 @@
light_color = LIGHT_COLOR_LAVA
break_message = span_warning("The forge breaks apart into shards with a howling scream!")
mansus_conversion_path = /obj/structure/destructible/eldritch_crucible
custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3)
/obj/structure/destructible/cult/item_dispenser/forge/setup_options()
var/static/list/forge_items = list(
@@ -8,6 +8,7 @@
break_sound = 'sound/effects/glass/glassbr2.ogg'
break_message = span_warning("The blood-red crystal falls to the floor and shatters!")
/// Length of the cooldown in between tile corruptions. Doubled if no turfs are found.
custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 4)
var/corruption_cooldown_duration = 5 SECONDS
/// The cooldown for corruptions.
COOLDOWN_DECLARE(corruption_cooldown)