Files
Paradise/code/modules/cooking/steps/recipe_step_add_reagent.dm
warriorstar-orion 523c09bab9 Fix issue with cooking recipes requiring reagents (#30611)
* Fix issue with cooking recipes requiring reagents

* don't spam debug messages with autochef

* reagent step processing, other fuckery

* fix lint

* properly clean up tracked recipes
2026-02-17 17:54:04 +00:00

128 lines
5.3 KiB
Plaintext

RESTRICT_TYPE(/datum/cooking/recipe_step/add_reagent)
/datum/cooking/recipe_step/add_reagent
var/expected_total
var/reagent_id
var/amount
/// What percentage of the reagent ends up in the product, as a value from 0.0 to 1.0
var/remain_percent = 0.0
/datum/cooking/recipe_step/add_reagent/New(reagent_id_, amount_, options)
reagent_id = reagent_id_
amount = amount_
if("remain_percent" in options)
remain_percent = options["remain_percent"]
..(options)
/datum/cooking/recipe_step/add_reagent/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker)
// Autochefs may do this up front before a tracker exists if nothing
// has been added to the container yet. In this case, we just check
// to see if the container has what we need.
if(!tracker)
if(!(used_item.container_type & OPENCONTAINER))
return PCWJ_CHECK_INVALID
var/obj/item/reagent_containers/reagent_container = used_item
if(istype(reagent_container))
if(reagent_container.reagents.has_reagent(reagent_id, amount))
return PCWJ_CHECK_VALID
return PCWJ_CHECK_INVALID
var/obj/item/container = locateUID(tracker.container_uid)
// Potentially might break shit, but we'll see; if we're currently being
// processed on a cooking machine, look for that case specifically, and just
// check to make sure we have the amount of reagents we need already, in
// order to skip this step.
//
// This should hopefully make it easier to deal with adding reagents across
// steps if, for example, you are adding a mix of reagents from a container,
// or if you added the reagents in two consecutive steps in the wrong order
// (e.g. adding pepper before salt versus salt before pepper, which really
// shouldn't matter.)
if(istype(used_item, /obj/machinery/cooking))
if(container.reagents.has_reagent(reagent_id, amount))
return PCWJ_CHECK_VALID
return PCWJ_CHECK_SILENT
if((container.reagents.total_volume + amount - container.reagents.get_reagent_amount(reagent_id)) > container.reagents.maximum_volume)
return PCWJ_CHECK_FULL
if(!istype(used_item, /obj/item/reagent_containers))
return PCWJ_CHECK_INVALID
if(!(used_item.container_type & OPENCONTAINER))
return PCWJ_CHECK_INVALID
var/obj/item/reagent_containers/reagent_container = used_item
if(!istype(reagent_container))
return PCWJ_CHECK_INVALID
if(reagent_container.amount_per_transfer_from_this <= 0)
return PCWJ_CHECK_INVALID
if(reagent_container.reagents.total_volume == 0)
return PCWJ_CHECK_INVALID
if(reagent_container.reagents.total_volume)
var/part = reagent_container.reagents.get_reagent_amount(reagent_id) / reagent_container.reagents.total_volume
var/incoming_amount = max(0, min(reagent_container.amount_per_transfer_from_this, reagent_container.reagents.total_volume, container.reagents.get_free_space()))
var/incoming_valid_amount = incoming_amount * part
if(incoming_valid_amount > 0)
return PCWJ_CHECK_VALID
return PCWJ_CHECK_INVALID
/datum/cooking/recipe_step/add_reagent/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker)
var/obj/item/reagent_containers/our_item = used_item
if(!istype(our_item))
return
var/obj/item/container = locateUID(tracker.container_uid)
var/trans = our_item.reagents.trans_to(container, our_item.amount_per_transfer_from_this)
return list("message" = "You transfer [trans] units to \the [container].", "amount" = amount, "reagent_remain_percent" = remain_percent, "reagent_id" = reagent_id)
/datum/cooking/recipe_step/add_reagent/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker, list/step_data)
var/obj/item/container = locateUID(tracker.container_uid)
if(!istype(container))
return FALSE
return container.reagents.has_reagent(reagent_id, amount)
/datum/cooking/recipe_step/add_reagent/get_pda_formatted_desc()
var/datum/reagent/reagent = GLOB.chemical_reagents_list[reagent_id]
return "Add [amount] unit[amount > 1 ? "s" : ""] of [reagent.name]."
/datum/cooking/recipe_step/add_reagent/attempt_autochef_perform(datum/autochef_task/follow_recipe/task)
for(var/obj/machinery/smartfridge/storage in task.autochef.linked_storages)
for(var/obj/item/reagent_containers/container in storage)
if(check_conditions_met(container, task.container.tracker))
var/old_amount_per_transfer = container.amount_per_transfer_from_this
container.amount_per_transfer_from_this = amount
var/result = task.container.process_item(null, container)
container.amount_per_transfer_from_this = old_amount_per_transfer
switch(result)
if(PCWJ_CONTAINER_FULL, PCWJ_NO_STEPS, PCWJ_NO_RECIPES)
return AUTOCHEF_ACT_FAILED
if(PCWJ_SUCCESS, PCWJ_PARTIAL_SUCCESS, PCWJ_COMPLETE)
task.autochef.Beam(storage, icon_state = "rped_upgrade", icon = 'icons/effects/effects.dmi', time = 5)
return AUTOCHEF_ACT_STEP_COMPLETE
var/datum/reagent/reagent = GLOB.chemical_reagents_list[reagent_id]
task.autochef.atom_say("Missing [reagent.name].")
return AUTOCHEF_ACT_MISSING_REAGENT
/datum/cooking/recipe_step/add_reagent/attempt_autochef_prepare(obj/machinery/autochef/autochef)
for(var/storage in autochef.linked_storages)
for(var/obj/item/reagent_containers/container in storage)
if(container.reagents.has_reagent(reagent_id, amount))
return AUTOCHEF_ACT_VALID
var/datum/reagent/reagent = GLOB.chemical_reagents_list[reagent_id]
autochef.atom_say("Cannot find [reagent.name].")
return AUTOCHEF_ACT_MISSING_REAGENT