Files
Aurora.3/code/controllers/subsystems/initialization/codex.dm
T
Casper3667 87da794c48 Fixes the cooking codex searching and some duplicate entry shenanigans (#22855)
Cargo orders would have trouble clearing the list of orders shown
without reloading the ui, due to a lack of unique ID if there was
several of the same item. The same applied to the cooking codex. This is
fixed now.
This also fixes the cooking codex search.
2026-07-17 11:32:16 +00:00

186 lines
6.5 KiB
Plaintext

SUBSYSTEM_DEF(codex)
name = "Codex"
flags = SS_NO_FIRE
init_order = INIT_ORDER_CODEX
/// List of cooking recipes and associated data.
var/list/cooking_codex_data = list()
/// List of chemistry/reagent reactions and associated data.
var/list/chemistry_codex_data = list()
var/list/chemistry_codex_ignored_reaction_path = list(/datum/chemical_reaction/slime)
var/list/chemistry_codex_ignored_result_path = list(/singleton/reagent/drink, /singleton/reagent/alcohol)
/// List of fusion reactions and associated data.
var/list/fusion_codex_data = list()
/datum/controller/subsystem/codex/Initialize()
//We don't build the codex in fastboot, it's slow and kind of pointless for tests
if(GLOB.config.fastboot)
log_subsystem_codex("SScodex: Fastboot detected, skipping codex generation.")
else
generate_cooking_codex()
generate_chemistry_codex()
generate_fusion_codex()
log_subsystem_codex("SScodex: [length(cooking_codex_data)] cooking recipes; [length(chemistry_codex_data)] chemistry recipes; [length(fusion_codex_data)] fusion recipes;")
return SS_INIT_SUCCESS
/datum/controller/subsystem/codex/proc/generate_cooking_codex()
var/list/available_recipes = GET_SINGLETON_SUBTYPE_MAP(/singleton/recipe)
for (var/reaction_path in available_recipes)
var/singleton/recipe/recipe = GET_SINGLETON(reaction_path)
var/list/cookingRecipeData = list()
// ID for TGUI to use
cookingRecipeData["id"] = "[reaction_path]"
// result
var/obj/item/recipe_result = recipe.result
cookingRecipeData["result"] = initial(recipe_result.name)
// result image
var/icon/result_icon = icon(
icon=initial(recipe_result.icon),
icon_state=initial(recipe_result.icon_state),
frame=1,
)
cookingRecipeData["result_image"] = icon2base64(result_icon)
// ingredients
cookingRecipeData["ingredients"] = list()
// ingredients, items
if(recipe.items)
for(var/ingredient_path in recipe.items)
var/obj/item/ingredient = ingredient_path
cookingRecipeData["ingredients"] += initial(ingredient.name)
// ingredients, fruits
if(recipe.fruit)
for(var/fruit_name in recipe.fruit)
var/count = recipe.fruit[fruit_name]
cookingRecipeData["ingredients"] += "[count]x [fruit_name]"
// ingredients, reagents
if(recipe.reagents)
for(var/reagent_path in recipe.reagents)
var/count = recipe.reagents[reagent_path]
var/singleton/reagent/reagent = GET_SINGLETON(reagent_path)
cookingRecipeData["ingredients"] += "[count]u [reagent.name]"
// coating
if(recipe.coating)
var/singleton/reagent/reagent = GET_SINGLETON(recipe.coating)
cookingRecipeData["ingredients"] += "[reagent.name] coating"
// kitchen appliance
cookingRecipeData["appliances"] = ""
if(recipe.appliance)
cookingRecipeData["appliances"] = recipe.get_appliance_names()
// fin
cookingRecipeData["ingredients"] = english_list(cookingRecipeData["ingredients"])
cooking_codex_data += list(cookingRecipeData)
/datum/controller/subsystem/codex/proc/generate_chemistry_codex()
chemistry_codex_data = list()
for(var/chem_path in SSchemistry.chemical_reactions_clean)
if(chemistry_codex_ignored_reaction_path && is_path_in_list(chem_path, chemistry_codex_ignored_reaction_path))
continue
var/datum/chemical_reaction/CR = new chem_path
if(!CR.result)
continue
if(chemistry_codex_ignored_result_path && is_path_in_list(CR.result, chemistry_codex_ignored_result_path))
continue
var/singleton/reagent/R = GET_SINGLETON(CR.result)
var/chemistryReactionData = list(id = CR.id)
chemistryReactionData["result"] = list(
name = R.name,
description = R.description,
amount = CR.result_amount
)
chemistryReactionData["reagents"] = list()
for(var/reagent in CR.required_reagents)
var/singleton/reagent/required_reagent = reagent
chemistryReactionData["reagents"] += list(list(
name = initial(required_reagent.name),
amount = CR.required_reagents[reagent]
))
chemistryReactionData["catalysts"] = list()
for(var/reagent_path in CR.catalysts)
var/singleton/reagent/required_reagent = reagent_path
chemistryReactionData["catalysts"] += list(list(
name = initial(required_reagent.name),
amount = CR.catalysts[reagent_path]
))
chemistryReactionData["inhibitors"] = list()
for(var/reagent_path in CR.inhibitors)
var/singleton/reagent/required_reagent = reagent_path
var/inhibitor_amount = CR.inhibitors[reagent_path] ? CR.inhibitors[reagent_path] : "Any"
chemistryReactionData["inhibitors"] += list(list(
name = initial(required_reagent.name),
amount = inhibitor_amount
))
chemistryReactionData["temp_min"] = CR.required_temperature_min
chemistryReactionData["temp_max"] = CR.required_temperature_max
chemistry_codex_data += list(chemistryReactionData)
/// Generate a list of all fusion reaction fusion_reactions, then populate the codex from that list.
/datum/controller/subsystem/codex/proc/generate_fusion_codex()
fusion_codex_data = list()
var/list/available_fusion_reactions = GET_SINGLETON_SUBTYPE_MAP(/singleton/fusion_reaction)
for (var/reaction_path in available_fusion_reactions)
var/singleton/fusion_reaction/fusion_reaction = GET_SINGLETON(reaction_path)
var/list/fusionReactionData = list()
var/reaction_name = fusion_reaction.name
if(!reaction_name)
reaction_name = capitalize_first_letters(fusion_reaction.p_react) + "-" + capitalize_first_letters(fusion_reaction.s_react)
fusionReactionData["name"] = reaction_name
fusionReactionData["reactants"] = list()
if(fusion_reaction.p_react == fusion_reaction.s_react)
fusionReactionData["reactants"] += list(list(
name = capitalize_first_letters(fusion_reaction.p_react),
amount = 2
))
else
fusionReactionData["reactants"] += list(list(
name = capitalize_first_letters(fusion_reaction.p_react),
amount = 1
))
fusionReactionData["reactants"] += list(list(
name = capitalize_first_letters(fusion_reaction.s_react),
amount = 1
))
fusionReactionData["minimum_temp"] += fusion_reaction.minimum_energy_level
fusionReactionData["energy_consumption"] += fusion_reaction.energy_consumption
fusionReactionData["energy_production"] += fusion_reaction.energy_production
fusionReactionData["radiation"] += fusion_reaction.radiation
fusionReactionData["instability"] += fusion_reaction.instability
fusionReactionData["products"] = list()
for(var/product in fusion_reaction.products)
fusionReactionData["products"] += list(list(
name = capitalize_first_letters(product),
amount = fusion_reaction.products[product]
))
fusion_codex_data += list(fusionReactionData)