[MIRROR] Recipie conflict unit test + Chemanalyzer PRO (#10494)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Willburd <7099514+Willburd@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-03-22 11:23:35 -07:00
committed by GitHub
parent fcd380c69a
commit 848d52a683
21 changed files with 389 additions and 103 deletions

View File

@@ -83,10 +83,6 @@
#define REAGENT_ID_TUNGSTEN "tungsten"
#define REAGENT_NUTRIMENT "Nutriment"
#define REAGENT_ID_NUTRIMENT "nutriment"
#define REAGENT_STEEL "Liquid Steel"
#define REAGENT_ID_STEEL "steel"
#define REAGENT_PLASTEEL "Liquid Plasteel"
#define REAGENT_ID_PLASTEEL "plasteel"
// Xeno chem react

View File

@@ -58,11 +58,6 @@
#define REAGENT_ALIZENE "Alizene"
#define REAGENT_ID_ALIZENE "alizene"
// Does not exist?
#define REAGENT_ID_SPACEDRUGS "space_drugs"
#define REAGENT_ID_HOTWATER "hotwater"
#define REAGENT_ID_BURBON "burbon"
// Food & Drinks
#define REAGENT_SNAPS "Akvavit"
#define REAGENT_ID_SNAPS "snaps"
@@ -151,8 +146,6 @@
#define REAGENT_ID_MAUNALOA "mauna_loa"
#define REAGENT_HIVEMINDERASER "Hivemind Eraser"
#define REAGENT_ID_HIVEMINDERASER "hiveminderaser"
#define REAGENT_STRAWBERRYLOVEPOTION "Strawberry Love Potion"
#define REAGENT_ID_STRAWBERRYLOVEPOTION "strawberrylovepotion"
#define REAGENT_WORMBLOOD "Worm Blood"
#define REAGENT_ID_WORMBLOOD "wormblood"

View File

@@ -5,8 +5,10 @@ SUBSYSTEM_DEF(chemistry)
init_order = INIT_ORDER_CHEMISTRY
var/list/chemical_reactions = list()
var/list/chemical_reactions_by_product = list()
var/list/instant_reactions_by_reagent = list()
var/list/distilled_reactions_by_reagent = list()
var/list/distilled_reactions_by_product = list()
// var/list/fusion_reactions_by_reagent = list() // TODO: Fusion reactions as chemical reactions
var/list/chemical_reagents = list()
@@ -45,6 +47,13 @@ SUBSYSTEM_DEF(chemistry)
if(istype(D, /decl/chemical_reaction/distilling))
add_to = distilled_reactions_by_reagent
if(istype(D, /decl/chemical_reaction/distilling))
LAZYINITLIST(distilled_reactions_by_product[D.result])
distilled_reactions_by_product[D.result] += D // for reverse lookup
else
LAZYINITLIST(chemical_reactions_by_product[D.result])
chemical_reactions_by_product[D.result] += D // for reverse lookup
LAZYINITLIST(add_to[reagent_id])
add_to[reagent_id] += D

View File

@@ -32,7 +32,7 @@
/datum/phororeactions
var/list/random_reagents = list(REAGENT_ID_HYDROGEN,REAGENT_ID_LITHIUM,REAGENT_ID_CARBON,REAGENT_ID_NITROGEN,REAGENT_ID_OXYGEN,REAGENT_ID_FLUORINE, \
REAGENT_ID_SODIUM,REAGENT_ID_ALUMINIUM,REAGENT_ID_SILICON,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SULFUR,REAGENT_ID_CHLORINE,REAGENT_ID_POTASSIUM,REAGENT_ID_IRON, \
REAGENT_ID_COPPER,REAGENT_ID_MERCURY,REAGENT_ID_RADIUM,REAGENT_ID_WATER,REAGENT_ID_SUGAR,REAGENT_ID_SACID,REAGENT_ID_TUNGSTEN, REAGENT_ID_LUBE, REAGENT_ID_INAPROVALINE, REAGENT_ID_SPACEDRUGS, \
REAGENT_ID_COPPER,REAGENT_ID_MERCURY,REAGENT_ID_RADIUM,REAGENT_ID_WATER,REAGENT_ID_SUGAR,REAGENT_ID_SACID,REAGENT_ID_TUNGSTEN, REAGENT_ID_LUBE, REAGENT_ID_INAPROVALINE, REAGENT_ID_BLISS, \
REAGENT_ID_THERMITE, REAGENT_ID_TRAMADOL, REAGENT_ID_CLEANER, REAGENT_ID_KELOTANE, REAGENT_ID_DERMALINE, REAGENT_ID_ANTITOXIN, REAGENT_ID_SYNAPTIZINE, \
REAGENT_ID_ALKYSINE, REAGENT_ID_IMIDAZOLINE, REAGENT_ID_HYPERZINE, REAGENT_ID_AMMONIA, REAGENT_ID_SODIUMCHLORIDE, REAGENT_ID_STERILIZINE, REAGENT_ID_SILICATE, REAGENT_ID_MINDBREAKER, \
REAGENT_ID_IMPEDREZENE, REAGENT_ID_LIPOZINE)

View File

@@ -729,7 +729,7 @@ var/induromol_code = rand(1, 50)
if(!init)
to_chat(M, span_warning("You start tripping balls."))
init = 1
var/drugs = list(REAGENT_ID_SPACEDRUGS, REAGENT_ID_SEROTROTIUM, REAGENT_ID_PSILOCYBIN, REAGENT_ID_NUKACOLA, REAGENT_ID_ATOMICBOMB, REAGENT_ID_HIPPIESDELIGHT)
var/drugs = list(REAGENT_ID_BLISS, REAGENT_ID_SEROTROTIUM, REAGENT_ID_PSILOCYBIN, REAGENT_ID_NUKACOLA, REAGENT_ID_ATOMICBOMB, REAGENT_ID_HIPPIESDELIGHT)
for(var/drug in drugs)
M.reagents.add_reagent(drug, 1)
M.reagents.add_reagent(REAGENT_ID_MINDBREAKER, 0.2)

View File

@@ -443,7 +443,7 @@
desc = "A mysterious slice, coated in purple frosting that smells like grapes."
nutriment_desc = list("The desire to show off an party" = 10)
reagents.add_reagent(REAGENT_ID_STOXIN, 2)
reagents.add_reagent(REAGENT_ID_SPACEDRUGS, 10)
reagents.add_reagent(REAGENT_ID_BLISS, 10)
reagents.add_reagent(REAGENT_ID_SEROTROTIUM, 4)
reagents.add_reagent(REAGENT_ID_CRYPTOBIOLIN, 8)
reagents.add_reagent(REAGENT_ID_MINDBREAKER, 10)

View File

@@ -101,6 +101,9 @@
while(reaction_occurred)
for(var/decl/chemical_reaction/C as anything in effect_reactions)
C.post_reaction(src)
#ifdef UNIT_TEST
SEND_SIGNAL(src, COMSIG_UNITTEST_DATA, list(C))
#endif
update_total()
/* Holder-to-chemical */

View File

@@ -1,9 +1,9 @@
// Detects reagents inside most containers, and acts as an infinite identification system for reagent-based unidentified objects.
/obj/machinery/chemical_analyzer
name = "chem analyzer"
desc = "Used to precisely scan chemicals and other liquids inside various containers. \
It may also identify the liquid contents of unknown objects."
name = "chem analyzer PRO"
desc = "New and improved! Used to precisely scan chemicals and other liquids inside various containers. \
It can also identify the liquid contents of unknown objects and their chemical breakdowns."
description_info = "This machine will try to tell you what reagents are inside of something capable of holding reagents. \
It is also used to 'identify' specific reagent-based objects with their properties obscured from inspection by normal means."
icon = 'icons/obj/chemical.dmi'
@@ -45,19 +45,153 @@
I.identify(IDENTITY_FULL, user)
// Now tell us everything that is inside.
var/final_message = ""
if(I.reagents && I.reagents.reagent_list.len)
to_chat(user, "<br>") // To add padding between regular chat and the output.
final_message += "<br>" // To add padding between regular chat and the output.
for(var/datum/reagent/R in I.reagents.reagent_list)
if(!R.name)
continue
to_chat(user, span_notice("Contains [R.volume]u of <b>[R.name]</b>.<br>[R.description]<br>"))
final_message += span_notice("*=*=*=*= Contains " + span_info("[R.volume]u") + " of " + span_bold(span_underline("[R.name]")) + " =*=*=*=*<br>[R.description][R.from_belly ? " Something seems strange about it...? (OOC: It's from a belly!)" : ""]<br><br>")
/* Downstream addiction code
if(R.id in addictives)
final_message += span_boldnotice(span_red("DANGER") + ", [(R.id in fast_addictives) ? "highly " : ""]addictive.)") + "<br>"
*/
var/list/products = SSchemistry.chemical_reactions_by_product[R.id]
if(products != null && products.len > 0)
var/segment = 1
var/list/display_reactions = list()
for(var/decl/chemical_reaction/CR in products)
// if(!CR.spoiler) - Downstream self documenting wiki code
display_reactions.Add(CR)
for(var/decl/chemical_reaction/CR in display_reactions)
if(display_reactions.len == 1)
final_message += span_underline("Potential Chemical breakdown: <br>")
else
final_message += span_underline("Potential Chemical breakdown [segment]: <br>")
segment += 1
// Last, unseal it if it's an autoinjector.
if(istype(I,/obj/item/reagent_containers/hypospray/autoinjector/biginjector) && !(I.flags & OPENCONTAINER))
I.flags |= OPENCONTAINER
to_chat(user, span_notice("Sample container unsealed.<br>"))
if(istype(CR,/decl/chemical_reaction/instant/slime))
// Handle slimes
var/decl/chemical_reaction/instant/slime/SR = CR
if(SR.required)
var/slime_path = SR.required
final_message += " -core [span_info(initial(slime_path:name))]<br>"
for(var/RQ in CR.required_reagents)
var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ]
if(!r_RQ)
continue
final_message += " -inducer [span_info(r_RQ.name)]<br>"
else
// Standard
for(var/RQ in CR.required_reagents)
var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ]
if(!r_RQ)
continue
final_message += " -parts [span_info(r_RQ.name)]<br>"
for(var/IH in CR.inhibitors)
var/decl/chemical_reaction/r_IH = SSchemistry.chemical_reagents[IH]
if(!r_IH)
continue
final_message += " -inhbi [span_info(r_IH.name)]<br>"
for(var/CL in CR.catalysts)
var/decl/chemical_reaction/r_CL = SSchemistry.chemical_reagents[CL]
if(!r_CL)
continue
final_message += " -catyl [span_info(r_CL.name)]<br>"
final_message += "<br>"
else
final_message += span_underline("Potential Chemical breakdown:") + "<br>" + span_red("UNKNOWN OR BASE-REAGENT") + "<br><br>"
var/list/distilled_products = SSchemistry.distilled_reactions_by_product[R.id]
if(distilled_products != null && distilled_products.len > 0)
var/segment = 1
to_chat(user, span_notice("Scanning of \the [I] complete."))
var/list/display_reactions = list()
for(var/decl/chemical_reaction/distilling/CR in distilled_products)
// if(!CR.spoiler) - Downstream self documenting wiki code
display_reactions.Add(CR)
for(var/decl/chemical_reaction/distilling/CR in display_reactions)
if(display_reactions.len == 1)
final_message += span_underline("Potential Chemical Distillation: <br>")
else
final_message += span_underline("Potential Chemical Distillation [segment]: <br>")
segment += 1
final_message += " -temps " + span_info("[CR.temp_range[1]]k") + " - " + span_info("[CR.temp_range[2]]k") + "<br>"
for(var/RQ in CR.required_reagents)
var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ]
if(!r_RQ)
continue
final_message += " -parts [span_info(r_RQ.name)]<br>"
for(var/IH in CR.inhibitors)
var/decl/chemical_reaction/r_IH = SSchemistry.chemical_reagents[IH]
if(!r_IH)
continue
final_message += " -inhbi [span_info(r_IH.name)]<br>"
for(var/CL in CR.catalysts)
var/decl/chemical_reaction/r_CL = SSchemistry.chemical_reagents[CL]
if(!r_CL)
continue
final_message += " -catyl [span_info(r_CL.name)]<br>"
final_message += "<br>"
// We can get some reagents by grinding sheets and ores!
var/grind_results = ""
for(var/source in global.sheet_reagents)
if(R.id in global.sheet_reagents[source])
var/nm = initial(source:name)
grind_results += " -grind [span_info(nm)]<br>"
if(grind_results != "")
final_message += span_underline("Material Sources: <br>")
final_message += grind_results
final_message += "<br>"
grind_results = ""
for(var/source in global.ore_reagents)
if(R.id in global.ore_reagents[source])
var/nm = initial(source:name)
grind_results += " -grind [span_info(nm)]<br>"
if(grind_results != "")
final_message += span_underline("Ore Sources: <br>")
final_message += grind_results
final_message += "<br>"
// The long forgotten fluid pumps!
// TODO : Update turfs to provide what their fluidpump outputs are too
var/pump_results = ""
for(var/O in GLOB.ore_data)
var/ore/OR = GLOB.ore_data[O]
if(OR.reagent == R.id)
pump_results += " -erosion [span_info(OR.display_name)]<br>"
if(pump_results != "")
final_message += span_underline("Fluid Pump Filtrate: <br>")
final_message += pump_results
final_message += "<br>"
var/makes_result = ""
var/list/instant_by_reagent = SSchemistry.instant_reactions_by_reagent["[R.id]"]
if(instant_by_reagent && instant_by_reagent.len)
for(var/i = 1, i <= instant_by_reagent.len, i++)
var/decl/chemical_reaction/OR = instant_by_reagent[i]
if(istype(OR,/decl/chemical_reaction/instant/slime)) // very bloated and meant to be a mystery
continue
makes_result += " -[span_info(OR.name)]<br>"
var/list/distilled_by_reagent = SSchemistry.distilled_reactions_by_reagent["[R.id]"]
if(distilled_by_reagent && distilled_by_reagent.len)
for(var/i = 1, i <= distilled_by_reagent.len, i++)
var/decl/chemical_reaction/OR = distilled_by_reagent[i]
makes_result += " -[span_info(OR.name)]<br>"
if(makes_result != "")
final_message += span_underline("Can Be Used To Produce: <br>")
final_message += makes_result
final_message += "<br>"
final_message += "Scanning of \the [I] complete."
to_chat(user, span_notice(final_message))
analyzing = FALSE
update_icon()
return

View File

@@ -7,8 +7,8 @@
conditions can cause different byproducts to be produced.<br>\
Magma or Lava can be pumped to produce mineralized fluid."
anchored = 0
density = 1
anchored = TRUE
density = TRUE
icon = 'icons/obj/machines/reagent.dmi'
icon_state = "pump"

View File

@@ -102,6 +102,9 @@
var/amt_produced = result_amount * reaction_progress
if(result)
holder.add_reagent(result, amt_produced, data, safety = 1, was_from_belly = belly_reagent)
// #ifdef UNIT_TEST
// log_unit_test("[name] - Reagent reaction result: [result] [amt_produced]") // Uncomment for UNIT_TEST debug assistance
// #endif
on_reaction(holder, amt_produced)

View File

@@ -87,7 +87,7 @@
/decl/chemical_reaction/instant/drinks/icecoffee/alt
name = "Iced Drip Coffee"
id = REAGENT_ID_ICECOFFEE
id = REAGENT_ID_ICECOFFEE + "_drip"
result = REAGENT_ID_ICECOFFEE
required_reagents = list(REAGENT_ID_ICE = 1, REAGENT_ID_DRIPCOFFEE = 2)
result_amount = 3
@@ -150,14 +150,14 @@
/decl/chemical_reaction/instant/drinks/mocha
name = REAGENT_MOCHA
id = REAGENT_ID_MOCHA
id = REAGENT_ID_MOCHA + "_milk"
result = REAGENT_ID_MOCHA
required_reagents = list(REAGENT_ID_MILK = 1, REAGENT_ID_CREAM = 1, REAGENT_ID_MILKFOAM = 1, REAGENT_ID_HOTCOCO = 2, REAGENT_ID_BREVE = 5) // 2 coffee, 2 milk, 2 cream, 2 milk foam and 2 hot coco
result_amount = 10
/decl/chemical_reaction/instant/drinks/mocha/alt //incase they use cream before milk
name = REAGENT_MOCHA
id = REAGENT_ID_MOCHA
id = REAGENT_ID_MOCHA + "_cream"
result = REAGENT_ID_MOCHA
required_reagents = list(REAGENT_ID_CREAM = 2, REAGENT_ID_HOTCOCO = 2, REAGENT_ID_CAPPUCCINO = 6) // 2 coffee, 2 milk, 2 cream, 2 milk foam and 2 hot coco
result_amount = 10
@@ -563,7 +563,7 @@
/decl/chemical_reaction/instant/drinks/iced_beer2
name = REAGENT_ICEDBEER
id = REAGENT_ID_ICEDBEER
id = REAGENT_ID_ICEDBEER + "_ice"
result = REAGENT_ID_ICEDBEER
required_reagents = list(REAGENT_ID_BEER = 5, REAGENT_ID_ICE = 1)
result_amount = 6

View File

@@ -31,7 +31,7 @@
/decl/chemical_reaction/instant/food/chocolate_bar
name = "Chocolate Bar"
id = "chocolate_bar"
id = "chocolate_bar_soy"
result = null
required_reagents = list(REAGENT_ID_SOYMILK = 2, REAGENT_ID_COCO = 2, REAGENT_ID_SUGAR = 2)
catalysts = list(REAGENT_ID_ENZYME = 5)
@@ -45,7 +45,7 @@
/decl/chemical_reaction/instant/food/chocolate_bar2
name = "Chocolate Bar"
id = "chocolate_bar"
id = "chocolate_bar_milk"
result = null
required_reagents = list(REAGENT_ID_MILK = 2, REAGENT_ID_COCO = 2, REAGENT_ID_SUGAR = 2)
catalysts = list(REAGENT_ID_ENZYME = 5)

View File

@@ -76,6 +76,7 @@
id = REAGENT_ID_WATER
result = REAGENT_ID_WATER
required_reagents = list(REAGENT_ID_OXYGEN = 1, REAGENT_ID_HYDROGEN = 2)
inhibitors = list(REAGENT_ID_CARBON = 1) // CHOMPAdd
result_amount = 1
/decl/chemical_reaction/instant/thermite
@@ -363,7 +364,7 @@
id = REAGENT_ID_STOXIN
result = REAGENT_ID_STOXIN
required_reagents = list(REAGENT_ID_CHLORALHYDRATE = 1, REAGENT_ID_SUGAR = 4)
inhibitors = list(REAGENT_ID_PHOSPHORUS) // Messes with the smoke
inhibitors = list(REAGENT_ID_PHOSPHORUS = 1) // Messes with the smoke
result_amount = 5
/decl/chemical_reaction/instant/chloralhydrate
@@ -614,14 +615,15 @@
/decl/chemical_reaction/instant/solidification/steel
name = "Solid Steel"
id = "solidsteel"
required_reagents = list(REAGENT_ID_FROSTOIL = 5, REAGENT_ID_STEEL = REAGENTS_PER_SHEET)
required_reagents = list(REAGENT_ID_FROSTOIL = 10, REAGENT_ID_IRON = REAGENTS_PER_SHEET, REAGENT_ID_CARBON = REAGENTS_PER_SHEET)
inhibitors = list(REAGENT_ID_PLATINUM = 1) // do not block plasteel formation
sheet_to_give = /obj/item/stack/material/steel
/decl/chemical_reaction/instant/solidification/plasteel
name = "Solid Plasteel"
id = "solidplasteel"
required_reagents = list(REAGENT_ID_FROSTOIL = 10, REAGENT_ID_PLASTEEL = REAGENTS_PER_SHEET)
required_reagents = list(REAGENT_ID_FROSTOIL = 10, REAGENT_ID_IRON = REAGENTS_PER_SHEET, REAGENT_ID_CARBON = REAGENTS_PER_SHEET, REAGENT_ID_PLATINUM = REAGENTS_PER_SHEET)
sheet_to_give = /obj/item/stack/material/plasteel
@@ -682,7 +684,7 @@
/decl/chemical_reaction/instant/carpetify/pcarpet
name = "Purple Carpet"
id = "Purplecarpet"
id = "purplecarpet"
required_reagents = list(REAGENT_ID_LIQUIDCARPETP = 2, REAGENT_ID_PLASTICIDE = 1)
carpet_type = /obj/item/stack/tile/carpet/purcarpet
@@ -784,6 +786,8 @@
result_amount = 2
log_is_important = 1
#ifndef UNIT_TEST
// If it becomes possible to make this without exploding and clearing reagents, remove the UNIT_TEST wrapper
/decl/chemical_reaction/instant/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume)
var/datum/effect/effect/system/reagents_explosion/e = new()
e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0)
@@ -792,14 +796,13 @@
var/mob/living/L = holder.my_atom
if(L.stat!=DEAD)
e.amount *= 0.5
//VOREStation Add Start
else
holder.clear_reagents() //No more powergaming by creating a tiny amount of this
//VOREStation Add End
e.start()
//holder.clear_reagents() //VOREStation Removal
return
#endif
/decl/chemical_reaction/instant/napalm
name = "Napalm"

View File

@@ -60,6 +60,7 @@
/decl/chemical_reaction/instant/glucose
name = REAGENT_GLUCOSE
id = REAGENT_ID_GLUCOSE
result = REAGENT_ID_GLUCOSE
required_reagents = list(REAGENT_ID_SODIUMCHLORIDE = 1, REAGENT_ID_WATER = 1, REAGENT_ID_SUGAR = 1)
result_amount = 1
@@ -67,7 +68,7 @@
/decl/chemical_reaction/instant/myelamine_sap //This is the clotting agent used by clotting packs.
name = REAGENT_MYELAMINE
id = REAGENT_ID_MYELAMINE
id = REAGENT_ID_MYELAMINE + "sap"
result = REAGENT_ID_MYELAMINE
required_reagents = list(REAGENT_ID_BICARIDINE = 1, REAGENT_ID_IRON = 2, REAGENT_ID_KELOTANE = 1, REAGENT_ID_BLUESAP = 1)
result_amount = 1

View File

@@ -103,6 +103,8 @@
/// Miscellaneous Reactions
/decl/chemical_reaction/instant/foam/softdrink
name = "Decarbonated Drink"
id = "soda_fizz"
required_reagents = list(REAGENT_ID_COLA = 1, REAGENT_ID_MINT = 1)
/decl/chemical_reaction/instant/firefightingfoam //TODO: Make it so we can add this to the foam tanks to refill them

View File

@@ -56,6 +56,7 @@
var/level_max = 2
/decl/chemical_reaction/instant/mix_virus/picky
id = "mixviruspicky"
var/list/datum/symptom/symptoms
/decl/chemical_reaction/instant/mix_virus/on_reaction(datum/reagents/holder)
@@ -156,6 +157,6 @@
name = REAGENT_ANTIBODIES
id = "antibodiesmix"
result = REAGENT_ID_ANTIBODIES
required_reagents = list(REAGENT_ID_VACCINE)
required_reagents = list(REAGENT_ID_VACCINE = 1)
catalysts = list(REAGENT_ID_INAPROVALINE = 0.1)
result_amount = 0.5

View File

@@ -24,6 +24,10 @@
log_unit_test("[Rpath]: Reagents - reagent ID blank.")
failed = TRUE
if(R.id != lowertext(R.id))
log_unit_test("[Rpath]: Reagents - Reagent ID must be all lowercase.")
failed = TRUE
if(collection_name[R.name])
log_unit_test("[Rpath]: Reagents - WARNING - reagent name \"[R.name]\" is not unique, used first in [collection_name[R.name]]. Is this intentional?")
collection_name[R.name] = R.type
@@ -54,7 +58,9 @@
var/failed = FALSE
var/list/collection_id = list()
for(var/decl/chemical_reaction/CR in decls_repository.get_decls_of_subtype(/decl/chemical_reaction))
var/list/all_reactions = decls_repository.get_decls_of_subtype(/decl/chemical_reaction)
for(var/rtype in all_reactions)
var/decl/chemical_reaction/CR = all_reactions[rtype]
if(CR.name == REAGENT_DEVELOPER_WARNING) // Ignore these types as they are meant to be overridden
continue
@@ -67,32 +73,50 @@
failed = TRUE
if(!CR.id)
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid id.")
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid ID.")
failed = TRUE
if(CR.id != lowertext(CR.id))
log_unit_test("[CR.type]: Reagents - chemical reaction ID must be all lowercase.")
failed = TRUE
if(CR.id in collection_id)
log_unit_test("[CR.type]: Reagents - chemical reaction id \"[CR.name]\" is not unique, used first in [collection_id[CR.id]].")
log_unit_test("[CR.type]: Reagents - chemical reaction ID \"[CR.name]\" is not unique, used first in [collection_id[CR.id]].")
failed = TRUE
else
collection_id[CR.id] = CR.type
if(CR.required_reagents)
if(CR.result_amount < 0)
log_unit_test("[CR.type]: Reagents - chemical reaction ID \"[CR.name]\" had less than 0 as as result_amount?")
failed = TRUE
if(CR.required_reagents && CR.required_reagents.len)
for(var/RR in CR.required_reagents)
if(!SSchemistry.chemical_reagents[RR])
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid required reagent ID \"[RR]\".")
failed = TRUE
if(CR.required_reagents[RR] <= 0)
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid required reagent amount or in invalid format \"[CR.required_reagents[RR]]\".")
failed = TRUE
if(CR.catalysts)
if(CR.catalysts && CR.catalysts.len)
for(var/RR in CR.catalysts)
if(!SSchemistry.chemical_reagents[RR])
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid required reagent ID \"[RR]\".")
failed = TRUE
if(CR.catalysts[RR] <= 0)
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid catalysts amount or in invalid format \"[CR.catalysts[RR]]\".")
failed = TRUE
if(CR.inhibitors)
if(CR.inhibitors && CR.inhibitors.len)
for(var/RR in CR.inhibitors)
if(!SSchemistry.chemical_reagents[RR])
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid required reagent ID \"[RR]\".")
failed = TRUE
if(CR.inhibitors[RR] <= 0)
log_unit_test("[CR.type]: Reagents - chemical reaction had invalid inhibitors amount or in invalid format \"[CR.inhibitors[RR]]\".")
failed = TRUE
if(CR.result)
if(!SSchemistry.chemical_reagents[CR.result])
@@ -142,3 +166,148 @@
else
pass("All /obj/item/reagent_containers had valid prefill reagents.")
return TRUE
/datum/unit_test/chemical_reactions_shall_not_conflict
name = "REAGENTS: Chemical Reactions shall not conflict"
var/obj/fake_beaker = null
var/list/result_reactions = list()
/datum/unit_test/chemical_reactions_shall_not_conflict/start_test()
var/failed = FALSE
#ifdef UNIT_TEST
var/list/all_reactions = decls_repository.get_decls_of_subtype(/decl/chemical_reaction)
for(var/rtype in all_reactions)
var/decl/chemical_reaction/CR = all_reactions[rtype]
if(CR.name == REAGENT_DEVELOPER_WARNING) // Ignore these types as they are meant to be overridden
continue
if(!CR.name || CR.name == "" || !CR.id || CR.id == "")
continue
if(CR.result_amount <= 0) //Makes nothing anyway, or maybe an effect/explosion!
continue
if(!CR.result) // Cannot check for this
continue
if(istype(CR, /decl/chemical_reaction/instant/slime))
// slime time
var/decl/chemical_reaction/instant/slime/SR = CR
if(!SR.required)
continue
var/obj/item/slime_extract/E = new SR.required()
qdel_swap(fake_beaker, E)
fake_beaker.reagents.maximum_volume = 5000
else if(istype(CR, /decl/chemical_reaction/distilling))
// distilling
var/decl/chemical_reaction/distilling/DR = CR
var/obj/machinery/portable_atmospherics/powered/reagent_distillery/D = new()
D.current_temp = DR.temp_range[1]
qdel_swap(fake_beaker, D)
fake_beaker.reagents.maximum_volume = 5000
else
// regular beaker
qdel_swap(fake_beaker, new /obj/item/reagent_containers/glass/beaker())
fake_beaker.reagents.maximum_volume = 5000
// Perform test! If it fails once, it will perform a deeper check trying to use the inhibitors of anything in the beaker
RegisterSignal(fake_beaker.reagents, COMSIG_UNITTEST_DATA, PROC_REF(get_signal_data))
if(perform_reaction(CR))
// Check if we failed the test with inhibitors in use, if so we absolutely couldn't make it...
// Uncomment the UNIT_TEST section in code\modules\reagents\reactions\_reactions.dm if you require more info
log_unit_test("[CR.type]: Reagents - chemical reaction did not produce \"[CR.result]\". CONTAINS: \"[fake_beaker.reagents.get_reagents()]\"")
failed = TRUE
UnregisterSignal(fake_beaker.reagents, COMSIG_UNITTEST_DATA)
qdel_null(fake_beaker)
#endif
if(failed)
fail("One or more /decl/chemical_reaction subtypes conflict with another reaction.")
else
pass("All /decl/chemical_reaction subtypes had no conflicts.")
return TRUE
/datum/unit_test/chemical_reactions_shall_not_conflict/proc/perform_reaction(var/decl/chemical_reaction/CR, var/list/inhib = list())
// clear for inhibitor searches
fake_beaker.reagents.clear_reagents()
result_reactions.Cut()
var/scale = 1
if(CR.result_amount < 1)
scale = 1 / CR.result_amount // Create at least 1 unit
if(inhib.len) // taken from argument and not reaction! Put in FIRST!
for(var/RR in inhib)
fake_beaker.reagents.add_reagent(RR, inhib[RR] * scale)
if(CR.catalysts) // Required for reaction
for(var/RR in CR.catalysts)
fake_beaker.reagents.add_reagent(RR, CR.catalysts[RR] * scale)
if(CR.required_reagents)
for(var/RR in CR.required_reagents)
fake_beaker.reagents.add_reagent(RR, CR.required_reagents[RR] * scale)
if(fake_beaker.reagents.has_reagent(CR.result))
return FALSE // INSTANT SUCCESS!
if(inhib.len)
// We've checked with inhibitors, so we're already in inhibitor checking phase.
// So we've absolutely failed this time. There is no way to make this...
return TRUE
if(!result_reactions.len)
// Nothing to check for inhibitors...
for(var/decl/chemical_reaction/test_react in result_reactions)
log_unit_test("[CR.type]: Reagents - Used [test_react] but failed.")
return TRUE
// Otherwise we check the resulting reagents and use their inhibitor this time!
for(var/decl/chemical_reaction/test_react in result_reactions)
if(!test_react)
continue
if(!test_react.inhibitors.len)
continue
// Test one by one
for(var/each in test_react.inhibitors)
if(!perform_reaction(CR, list("[each]" = test_react.inhibitors["[each]"])))
return FALSE // SUCCESS using an inhibitor!
// Test all at once
if(!perform_reaction(CR, test_react.inhibitors))
return FALSE // SUCCESS using all inhibitors!
// No inhibiting reagent worked...
for(var/decl/chemical_reaction/test_react in result_reactions)
log_unit_test("[CR.type]: Reagents - Used [test_react] but failed.")
return TRUE
/datum/unit_test/chemical_reactions_shall_not_conflict/get_signal_data(atom/source, list/data = list())
result_reactions.Add(data[1]) // Append the reactions that happened, then use that to check their inhibitors
/datum/unit_test/chemical_grinding_must_produce_valid_results
name = "REAGENTS: Chemical Grinding Must Have Valid Results"
/datum/unit_test/chemical_grinding_must_produce_valid_results/start_test()
var/failed = FALSE
for(var/grind in global.sheet_reagents + global.ore_reagents)
var/list/results = global.sheet_reagents[grind]
if(!results)
results = global.ore_reagents[grind]
if(!results || !islist(results))
log_unit_test("[grind]: Reagents - Grinding result had invalid list.")
failed = TRUE
continue
if(!results.len)
log_unit_test("[grind]: Reagents - Grinding result had empty.")
failed = TRUE
continue
for(var/reg_id in results)
if(!SSchemistry.chemical_reagents[reg_id])
log_unit_test("[grind]: Reagents - Grinding result had invalid reagent id \"[reg_id]\".")
failed = TRUE
if(failed)
fail("One or more grindable sheet or ore entries had invalid reagents or lists.")
else
pass("All grindable sheet or ore entries had valid lists and reagents.")
return TRUE

View File

@@ -17,7 +17,7 @@
REAGENT_ID_TONIC, REAGENT_ID_BEER, REAGENT_ID_KAHLUA, REAGENT_ID_WHISKEY, REAGENT_ID_REDWINE, REAGENT_ID_VODKA, REAGENT_ID_GIN, REAGENT_ID_RUM, REAGENT_ID_TEQUILA, REAGENT_ID_VERMOUTH, REAGENT_ID_COGNAC,
REAGENT_ID_ALE, REAGENT_ID_MEAD, REAGENT_ID_BITTERS, REAGENT_ID_CHAMPAGNE, REAGENT_ID_SINGULO, REAGENT_ID_DOCTORSDELIGHT, REAGENT_ID_NOTHING, REAGENT_ID_BANANA, REAGENT_ID_HONEY, REAGENT_ID_EGG,
REAGENT_ID_COCO, REAGENT_ID_CHERRYJELLY, REAGENT_ID_CARROTJUICE, REAGENT_ID_APPLEJUICE, REAGENT_ID_TOMATOJUICE, REAGENT_ID_PEANUTBUTTER, REAGENT_ID_SOYMILK, REAGENT_ID_GRENADINE, REAGENT_ID_GINGERALE, REAGENT_ID_ROYROGERS,
REAGENT_ID_PATRON, REAGENT_ID_GOLDSCHLAGER, REAGENT_GELATIN, REAGENT_ID_MELONLIQUOR, REAGENT_ID_BLUECURACAO, REAGENT_ID_THIRTEENLOKO, REAGENT_ID_DEADRUM, REAGENT_ID_SAKE, REAGENT_ID_ACIDSPIT,
REAGENT_ID_PATRON, REAGENT_ID_GOLDSCHLAGER, REAGENT_ID_GELATIN, REAGENT_ID_MELONLIQUOR, REAGENT_ID_BLUECURACAO, REAGENT_ID_THIRTEENLOKO, REAGENT_ID_DEADRUM, REAGENT_ID_SAKE, REAGENT_ID_ACIDSPIT,
REAGENT_ID_AMASEC, REAGENT_ID_BEEPSKYSMASH, REAGENT_ID_ATOMICBOMB, REAGENT_ID_NUKACOLA, REAGENT_ID_THREEMILEISLAND, REAGENT_ID_MANHATTANPROJ, REAGENT_ID_PSILOCYBIN, REAGENT_ID_MOONSHINE,
REAGENT_ID_SPECIALWHISKEY, REAGENT_ID_UNATHILIQUOR, REAGENT_ID_WINEBRANDY, REAGENT_ID_MATCHALATTE, REAGENT_ID_SNAPS
)

View File

@@ -34,7 +34,7 @@
/decl/chemical_reaction/instant/slime/secertslime
name = "Secert Slime "
id = "sepia_swapm"
result = "change_secert"
result = null
required_reagents = list(REAGENT_ID_BLOOD = 5, REAGENT_ID_WATER = 5)
result_amount = 1
required = /obj/item/slime_extract/sepia
@@ -427,7 +427,7 @@
/decl/chemical_reaction/instant/slime/nuclear_radpulse
name = "Slime Radiation Pulse"
id = "m_green_radpulse"
id = "m_green_radpulse2"
required_reagents = list(REAGENT_ID_PHORON = 5)
result_amount = 1
required = /obj/item/slime_extract/nuclear
@@ -443,7 +443,7 @@
/decl/chemical_reaction/instant/slime/nuclear_emitter
name = "Slime Radiation Emitter"
id = "m_green_emitter"
id = "m_green_emitter2"
required_reagents = list(REAGENT_ID_BLOOD = 5)
result_amount = 1
required = /obj/item/slime_extract/green
@@ -456,7 +456,7 @@
/decl/chemical_reaction/instant/slime/nuclear_radium
name = "Slime Radium"
id = "m_green_radium"
id = "m_green_radium2"
result = REAGENT_ID_RADIUM
required_reagents = list(REAGENT_ID_WATER = 5)
result_amount = 30
@@ -465,7 +465,7 @@
/decl/chemical_reaction/instant/slime/nuclear_uranium
name = "Slime Uranium"
id = "m_green_uranium"
id = "m_green_uranium2"
required_reagents = list(REAGENT_ID_SLIMEJELLY = 5)
result_amount = 1
required = /obj/item/slime_extract/green
@@ -690,8 +690,8 @@
..()
/decl/chemical_reaction/instant/slime/soundphoron
name = "sound blood"
id = "m_sound_blood"
name = "sound phoron"
id = "m_sound_phoron"
required_reagents = list(REAGENT_ID_PHORON = 5)
result_amount = 1
required = /obj/item/slime_extract/sound

View File

@@ -56,7 +56,7 @@
/decl/chemical_reaction/instant/freshtea/green
id = REAGENT_ID_FRESHTEAGREEN
result = REAGENT_ID_FRESHTEAGREEN
required_reagents = list (REAGENT_ID_TEALEAVESGREEN = 1, REAGENT_ID_HOTWATER = 9)
required_reagents = list (REAGENT_ID_TEALEAVESGREEN = 1, REAGENT_ID_WATER = 9)
result_amount = 10
/decl/chemical_reaction/instant/instantteapowder/green
@@ -74,7 +74,7 @@
/decl/chemical_reaction/instant/matcha
id = REAGENT_ID_MATCHA
result = REAGENT_ID_MATCHA
required_reagents = list (REAGENT_ID_MATCHAPOWDER = 1, REAGENT_ID_HOTWATER = 2)
required_reagents = list (REAGENT_ID_MATCHAPOWDER = 1, REAGENT_ID_WATER = 2)
result_amount = 2
/decl/chemical_reaction/instant/drinks/spiderdrink
@@ -86,37 +86,37 @@
/decl/chemical_reaction/instant/drinks/bubbleteawatermelon
name = REAGENT_BUBBLETEAWATERMELON
id = REAGENT_BUBBLETEAWATERMELON
result = REAGENT_BUBBLETEAWATERMELON
required_reagents = list(REAGENT_GELATIN = 2, REAGENT_ID_WATERMELONTEA = 6, REAGENT_ID_MILK = 2)
id = REAGENT_ID_BUBBLETEAWATERMELON
result = REAGENT_ID_BUBBLETEAWATERMELON
required_reagents = list(REAGENT_ID_GELATIN = 2, REAGENT_ID_WATERMELONTEA = 6, REAGENT_ID_MILK = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteastrawberry
name = REAGENT_BUBBLETEASTRAWBERRY
id = REAGENT_ID_BUBBLETEASTRAWBERRY
result = REAGENT_ID_BUBBLETEASTRAWBERRY
required_reagents = list(REAGENT_GELATIN = 2, REAGENT_ID_BERRYTEA = 6, REAGENT_ID_MILK = 2)
required_reagents = list(REAGENT_ID_GELATIN = 2, REAGENT_ID_BERRYTEA = 6, REAGENT_ID_MILK = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacherry
name = REAGENT_BUBBLETEACHERRY
id = REAGENT_ID_BUBBLETEACHERRY
result = REAGENT_ID_BUBBLETEACHERRY
required_reagents = list(REAGENT_GELATIN = 2, REAGENT_ID_CHERRYTEA = 6, REAGENT_ID_MILK = 2)
required_reagents = list(REAGENT_ID_GELATIN = 2, REAGENT_ID_CHERRYTEA = 6, REAGENT_ID_MILK = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacoffee
name = REAGENT_BUBBLETEACOFFEE
id = REAGENT_ID_BUBBLETEACOFFEE
result = REAGENT_ID_BUBBLETEACOFFEE
required_reagents = list(REAGENT_GELATIN = 2, REAGENT_ID_TEA = 5, REAGENT_ID_CAFELATTE = 3)
required_reagents = list(REAGENT_ID_GELATIN = 2, REAGENT_ID_TEA = 5, REAGENT_ID_CAFELATTE = 3)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteabanana
name = REAGENT_BUBBLETEABANANA
id = REAGENT_ID_BUBBLETEABANANA
result = REAGENT_ID_BUBBLETEABANANA
required_reagents = list(REAGENT_GELATIN = 2, REAGENT_ID_TEA = 5, REAGENT_ID_BANANA = 1, REAGENT_ID_MILK = 2)
required_reagents = list(REAGENT_ID_GELATIN = 2, REAGENT_ID_TEA = 5, REAGENT_ID_BANANA = 1, REAGENT_ID_MILK = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/horchata
@@ -186,7 +186,7 @@
name = REAGENT_HACHI
id = REAGENT_ID_HACHI
result = REAGENT_ID_HACHI
required_reagents = list(REAGENT_ID_BURBON = 2, REAGENT_ID_SAKE = 1, REAGENT_ID_LEMONJUICE = 1, PLANT_MUSHROOMS = 1) //Whoever coded this never made a mushroom reagent so this can't be created.
required_reagents = list(REAGENT_ID_WHISKEY = 2, REAGENT_ID_SAKE = 1, REAGENT_ID_LEMONJUICE = 1, REAGENT_ID_PSILOCYBIN = 1) //Whoever coded this never made a mushroom reagent so this can't be created.
result_amount = 5
/decl/chemical_reaction/instant/drinks/narsour
@@ -236,70 +236,70 @@
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer1
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "1"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_CYANIDE = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer2
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "2"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_CHLORALHYDRATE = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer3
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "3"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_STIMM = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer4
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "4"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_CRYOTOXIN = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer5
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "5"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_CRYPTOBIOLIN = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer6
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "6"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_STOXIN = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer7
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "7"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_CONDENSEDCAPSAICINV = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer8
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "8"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_PHORON = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer9
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "9"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_THERMITEV = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer10
name = REAGENT_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
id = REAGENT_ID_ENRAGEDARACHNIDSLAMMER + "10"
required_reagents = list(REAGENT_ID_ENRAGEDARACHNIDSLAMMER = 1, REAGENT_ID_SEROTROTIUMV = 1)
result = REAGENT_ID_ENRAGEDARACHNIDSLAMMER
result_amount = 0.1
@@ -384,13 +384,6 @@
result_amount = 6
//YW drinks
/decl/chemical_reaction/instant/drinks/lovepotion_yw
name = REAGENT_STRAWBERRYLOVEPOTION
id = REAGENT_ID_STRAWBERRYLOVEPOTION
result = REAGENT_ID_STRAWBERRYLOVEPOTION
required_reagents = list(REAGENT_ID_CREAM = 1, REAGENT_ID_BERRYJUICE = 1, REAGENT_ID_SUGAR = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/wormblood
name = "Wormblood"
id = REAGENT_ID_WORMBLOOD

View File

@@ -387,20 +387,9 @@
return
M.adjustToxLoss(-3 * removed) //Almost on par with dylovene despite being harder to obtain in bulk. Nerf if this causes problems.
/datum/reagent/drink/juice/gelatin
name = REAGENT_ID_GELATIN
id = REAGENT_GELATIN
description = "It doesnt taste like anything."
taste_description = REAGENT_ID_NOTHING
nutrition = 0
color = "#aaabcf"
glass_name = REAGENT_ID_GELATIN
glass_desc = "It's like flavourless slime."
/datum/reagent/drink/bubbleteawatermelon
name = REAGENT_BUBBLETEAWATERMELON
id = REAGENT_BUBBLETEAWATERMELON
id = REAGENT_ID_BUBBLETEAWATERMELON
description = "A tea with milk and watermelon in it and gelatin balls as well."
taste_description = "creamy tea and watermelon"
color = "#b83333"
@@ -682,16 +671,6 @@
//////////////////////////////////////////////
//YW drinks
/datum/reagent/drink/lovepotion_yw
name = REAGENT_STRAWBERRYLOVEPOTION
id = REAGENT_ID_STRAWBERRYLOVEPOTION
description = "Creamy strawberries and sugar, simple and sweet."
taste_description = "strawberries and cream"
color = "#fc8a8a" // rgb(252, 138, 138)
glass_name = "Love Potion"
glass_desc = "Love me tender, love me sweet."
/datum/reagent/ethanol/wormblood
name = REAGENT_WORMBLOOD
id = REAGENT_ID_WORMBLOOD