diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f5272fd4027..651805e661c 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -474,7 +474,7 @@ R = target target_atom = R.my_atom else - if(!ignore_stomach && (methods & INGEST) && istype(target, /mob/living/carbon)) + if(!ignore_stomach && (methods & INGEST) && iscarbon(target)) var/mob/living/carbon/eater = target var/obj/item/organ/internal/stomach/belly = eater.getorganslot(ORGAN_SLOT_STOMACH) if(!belly) @@ -496,6 +496,7 @@ var/trans_data = null var/transfer_log = list() var/r_to_send = list() // Validated list of reagents to be exposed + var/reagents_to_remove = list() if(!round_robin) var/part = amount / src.total_volume for(var/datum/reagent/reagent as anything in cached_reagents) @@ -510,15 +511,20 @@ continue if(methods) r_to_send += reagent - remove_reagent(reagent.type, transfer_amount, no_react) //SKYRAT EDIT CHANGE - var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) - transfer_log[reagent.type] = reagent_qualities - if(istype(target_atom, /obj/item/organ)) + reagents_to_remove += reagent + + if(isorgan(target_atom)) R.expose_multiple(r_to_send, target, methods, part, show_message) else R.expose_multiple(r_to_send, target_atom, methods, part, show_message) + for(var/datum/reagent/reagent as anything in reagents_to_remove) + var/transfer_amount = reagent.volume * part + remove_reagent(reagent.type, transfer_amount, no_react) //SKYRAT EDIT CHANGE + var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) + transfer_log[reagent.type] = reagent_qualities + else var/to_transfer = amount for(var/datum/reagent/reagent as anything in cached_reagents) @@ -537,7 +543,7 @@ continue to_transfer = max(to_transfer - transfer_amount , 0) if(methods) - if(istype(target_atom, /obj/item/organ)) + if(isorgan(target_atom)) R.expose_single(reagent, target, methods, transfer_amount, show_message) else R.expose_single(reagent, target_atom, methods, transfer_amount, show_message) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index a8ff6e16e3b..d8d3dbaef09 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -139,6 +139,7 @@ #include "reagent_mod_procs.dm" #include "reagent_names.dm" #include "reagent_recipe_collisions.dm" +#include "reagent_transfer.dm" #include "resist.dm" #include "say.dm" #include "screenshot_antag_icons.dm" diff --git a/code/modules/unit_tests/reagent_transfer.dm b/code/modules/unit_tests/reagent_transfer.dm new file mode 100644 index 00000000000..9e0f4fe3352 --- /dev/null +++ b/code/modules/unit_tests/reagent_transfer.dm @@ -0,0 +1,26 @@ +/// Tests transferring reagents between two reagents datums. +/datum/unit_test/reagent_transfer + +/datum/unit_test/reagent_transfer/Run() + var/datum/reagents/source_reagents = allocate(/datum/reagents, 100) + var/datum/reagents/target_reagents = allocate(/datum/reagents, 100) + + // Quick test to make sure reagents add properly. + source_reagents.add_reagent(/datum/reagent/water, 10) + TEST_ASSERT_EQUAL(length(source_reagents.reagent_list), 1, "Source reagents has [length(source_reagents.reagent_list)] unique reagents (expected 1).") + TEST_ASSERT_EQUAL(source_reagents.total_volume, 10, "Source reagents has incorrect total_volume [source_reagents.total_volume] (expected 10).") + + // Test to make sure the water reagent was added correctly. + var/datum/reagent/water/water_reagent = source_reagents.reagent_list[1] + TEST_ASSERT(istype(water_reagent), "Incorrect reagent type detected source reagents: [water_reagent.type] (expected /datum/reagent/water).") + TEST_ASSERT_EQUAL(water_reagent.volume, 10, "Source reagents has [water_reagent.volume] reagent volume (expected 10).") + + // Test to make sure reagents transfer properly. + source_reagents.trans_to(target_reagents, 10) + TEST_ASSERT_EQUAL(length(source_reagents.reagent_list), 0, "Source reagents has [length(source_reagents.reagent_list)] unique reagents after transfer (expected 0, possible duplication?)") + TEST_ASSERT_EQUAL(length(target_reagents.reagent_list), 1, "Target reagents has [length(target_reagents.reagent_list)] unique reagents after transfer (expected 1).") + TEST_ASSERT_EQUAL(target_reagents.total_volume, 10, "Target reagents has incorrect total_volume [source_reagents.total_volume] (expected 10).") + + water_reagent = target_reagents.reagent_list[1] + TEST_ASSERT(istype(water_reagent), "Incorrect reagent type detected in target reagents after transfer: [water_reagent.type] (should be /datum/reagent/water).") + TEST_ASSERT_EQUAL(water_reagent.volume, 10, "Target reagents has [water_reagent.volume] reagent volume (expected 10)")