mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-13 08:03:43 +01:00
523c09bab9
* 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
128 lines
5.3 KiB
Plaintext
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
|