diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 14969e6c92..921b512d32 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -16,6 +16,8 @@ GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the stati
GLOBAL_LIST_EMPTY(grounding_rods) //list of all grounding rods on the station
GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions
+GLOBAL_LIST(drink_reactions_list) //list of all /datum/chemical_reaction datums where the output is of type /datum/reagent/consumable for bartender PDA
+GLOBAL_LIST(normalized_chemical_reactions_list) //list of all /datum/chemical_reaction datums with actual sane indexing for chemistry PDA
GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id.
GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path.
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 2339e88a76..1a130998b6 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -369,6 +369,10 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "
[PDAIMG(rdoor)]Toggle Remote Door"
if (cartridge.access & CART_DRONEPHONE)
dat += "[PDAIMG(dronephone)]Drone Phone"
+ if (cartridge.access & CART_BARTENDER)
+ dat += "[PDAIMG(bucket)]Drink Recipe Browser"
+ if (cartridge.access & CART_CHEMISTRY)
+ dat += "[PDAIMG(bucket)]Chemistry Recipe Browser"
dat += "[PDAIMG(atmos)]Atmospheric Scan"
dat += "[PDAIMG(flashlight)][fon ? "Disable" : "Enable"] Flashlight"
if (pai)
@@ -705,6 +709,16 @@ GLOBAL_LIST_EMPTY(PDAs)
if(T)
pai.forceMove(T)
+//DRINK RECIPE BROWSER=============================
+ if("Drink Recipe Browser")
+ if(cartridge && cartridge.access & CART_BARTENDER)
+ recipe_search(U, GLOB.drink_reactions_list)
+
+//CHEMISTRY RECIPE BROWSER
+ if("Chemistry Recipe Browser")
+ if(cartridge && cartridge.access & CART_CHEMISTRY)
+ recipe_search(U, GLOB.normalized_chemical_reactions_list)
+
//LINK FUNCTIONS===================================
else//Cartridge menu linking
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index 23ebaec3c2..8fcd97c261 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -222,6 +222,7 @@
/obj/item/pda/bar
name = "bartender PDA"
icon_state = "pda-bartender"
+ default_cartridge = /obj/item/cartridge/bartender
inserted_item = /obj/item/pen/fountain
/obj/item/pda/atmos
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 4ca0b86bc0..ca72e3371b 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -13,6 +13,8 @@
#define CART_QUARTERMASTER (1<<12)
#define CART_HYDROPONICS (1<<13)
#define CART_DRONEPHONE (1<<14)
+#define CART_BARTENDER (1<<15)
+#define CART_CHEMISTRY (1<<16)
/obj/item/cartridge
@@ -77,7 +79,7 @@
/obj/item/cartridge/chemistry
name = "\improper ChemWhiz cartridge"
icon_state = "cart-chem"
- access = CART_REAGENT_SCANNER
+ access = CART_REAGENT_SCANNER | CART_CHEMISTRY
bot_access_flags = MED_BOT
/obj/item/cartridge/security
@@ -190,6 +192,12 @@
bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
spam_enabled = 1
+/obj/item/cartridge/bartender
+ name = "\improper B.O.O.Z.E cartridge"
+ desc = "Now with 12% alcohol!"
+ icon_state = "cart-bar"
+ access = CART_BARTENDER
+
/obj/item/cartridge/captain/New()
..()
radio = new(src)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 2899f0ca11..cdad332def 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -14,6 +14,7 @@
GLOB.chemical_reagents_list[path] = D
/proc/build_chemical_reactions_list()
+ message_admins("STARTY START START!")
//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
// It is filtered into multiple lists within a list.
// For example:
@@ -26,11 +27,20 @@
//Randomized need to go last since they need to check against conflicts with normal recipes
var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized)
GLOB.chemical_reactions_list = list()
+ GLOB.normalized_chemical_reactions_list = list() // chemistry pda
+ GLOB.drink_reactions_list = list() // bartender pda
for(var/path in paths)
var/datum/chemical_reaction/D = new path()
var/list/reaction_ids = list()
+ // store recipes separately for bartender/chemistry cartridges
+ if(D.id && !D.is_secret) // don't show things like secretcatchem or secret sauce
+ var/datum/reagent/r = D.id
+ if(ispath(D.id, /datum/reagent/consumable))
+ GLOB.drink_reactions_list[initial(r.name)] = D
+ if(ispath(D.id, /datum/reagent))
+ GLOB.normalized_chemical_reactions_list[initial(r.name)] = D
if(D.required_reagents && D.required_reagents.len)
for(var/reaction in D.required_reagents)
@@ -43,6 +53,31 @@
GLOB.chemical_reactions_list[id] += D
break // Don't bother adding ourselves to other reagent ids, it is redundant
+/proc/recipe_search(mob/M, list/reaction_list)
+ var/option = input(M, "Enter keyword to return a recipe.")
+ if(option)
+ option = lowertext(option)
+ var/list/reagents_required
+ var/found_reagent_name
+ var/required_temp
+ for(var/reagent_name in reaction_list)
+ if(findtext(lowertext(reagent_name), option))
+ var/datum/chemical_reaction/reaction = reaction_list[reagent_name]
+ found_reagent_name = reagent_name
+ reagents_required = reaction.required_reagents
+ required_temp = reaction.required_temp
+ break
+ if(length(reagents_required))
+ to_chat(M, "Recipe found: [found_reagent_name][required_temp ? "
Required Temperature: [required_temp]K" : ""]
Required Reagents:")
+ var/reagents_required_string = ""
+ for(var/r in reagents_required)
+ var/datum/reagent/reagent = r
+ reagents_required_string += "
[initial(reagent.name)]: [reagents_required[r]]"
+ to_chat(M, reagents_required_string)
+ return
+ else
+ to_chat(M, "Reagent with term: [option] could not be located!")
+
///////////////////////////////////////////////////////////////////////////////////
/datum/reagents
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 41c0ed717e..aab46bc3e4 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -38,6 +38,8 @@
var/clear_conversion //bitflags for clear conversions; REACTION_CLEAR_IMPURE or REACTION_CLEAR_INVERSE
var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this.
+ var/is_secret = FALSE // If it should show in recipe searchers such as the bartender/chemistry PDA functions
+
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, multiplier, specialreact)
set waitfor = FALSE
diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm
index ad277ef4ff..4aab8e4046 100644
--- a/code/modules/reagents/chemistry/recipes/special.dm
+++ b/code/modules/reagents/chemistry/recipes/special.dm
@@ -54,6 +54,8 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
var/max_result_reagents = 1
var/list/possible_results = list()
+ is_secret = TRUE
+
/datum/chemical_reaction/randomized/proc/GenerateRecipe()
created = world.time
if(randomize_container)
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 8992f4a4a1..f968d15860 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index a78092988e..ce27433c07 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -548,6 +548,8 @@
FermiExplode = FALSE
PurityMin = 0.2
+ is_secret = TRUE
+
/datum/chemical_reaction/fermi/secretcatchem/New()
//rand doesn't seem to work with n^-e
OptimalTempMin += rand(-100, 100)