diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 91d03dd9d06..245f8f969a9 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -20,8 +20,6 @@ var/ducting_layer = DUCT_LAYER_DEFAULT ///In-case we don't want the main machine to get the reagents, but perhaps whoever is buckled to it var/recipient_reagents_holder - ///How do we apply the new reagents to the receiver? Generally doesn't matter, but some stuff, like people, does care if its injected or whatevs - var/methods ///What color is our demand connect? var/demand_color = COLOR_RED ///What color is our supply connect? @@ -139,10 +137,8 @@ /datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) if(!reagents || !target || !target.reagents) return FALSE - if(reagent) - reagents.trans_id_to(target.recipient_reagents_holder, reagent, amount) - else - reagents.trans_to(target.recipient_reagents_holder, amount, methods = methods) + + reagents.trans_to(target.recipient_reagents_holder, amount, target_id = reagent) ///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() /datum/component/plumbing/proc/create_overlays(atom/movable/parent_movable, list/overlays) diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm index 4b8dd8d54a6..30e36c05788 100644 --- a/code/datums/components/plumbing/filter.dm +++ b/code/datums/components/plumbing/filter.dm @@ -31,7 +31,7 @@ direction = get_original_direction(text2num(A)) break if(reagent) - reagents.trans_id_to(target.parent, reagent, amount) + reagents.trans_to(target.parent, amount, target_id = reagent) else for(var/A in reagents.reagent_list) var/datum/reagent/R = A @@ -40,7 +40,7 @@ var/new_amount if(R.volume < amount) new_amount = amount - R.volume - reagents.trans_id_to(target.parent, R.type, amount) + reagents.trans_to(target.parent, amount, target_id = R.type) amount = new_amount if(amount <= 0) break diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index 4e2da58c79b..ffb451b83ac 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -51,15 +51,15 @@ . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM var/obj/item/reagent_containers/container = parent - var/refill = container.reagents.get_master_reagent_id() var/amount = min((container.amount_per_transfer_from_this + container.reagents.total_volume), container.reagents.total_volume) - if (amount == 0) return - if (!is_path_in_list(refill, whitelisted_reagents)) + + var/datum/reagent/refill = container.reagents.get_master_reagent() + if (!is_path_in_list(refill?.type, whitelisted_reagents)) return - addtimer(CALLBACK(src, PROC_REF(add_reagents), container, container.loc, refill, amount), time_to_refill) + addtimer(CALLBACK(src, PROC_REF(add_reagents), container, container.loc, refill.type, amount), time_to_refill) /// Refills the reagent container, and uses cell power if applicable /datum/component/reagent_refiller/proc/add_reagents(obj/item/reagent_containers/target, oldloc, reagent_to_refill, amount) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index fa9f86abbaa..79c4909d277 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -51,7 +51,7 @@ M.adjust_confusion(-2 SECONDS) if(purge_alcohol) - M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3) + M.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 3, include_subtypes = TRUE) M.adjust_drunk_effect(-5) if(A.stage >= 4) diff --git a/code/datums/elements/chemical_transfer.dm b/code/datums/elements/chemical_transfer.dm index 9802f0cc059..01296d97ade 100644 --- a/code/datums/elements/chemical_transfer.dm +++ b/code/datums/elements/chemical_transfer.dm @@ -58,7 +58,7 @@ return var/built_attacker_message = replacetext(attacker_message, "%VICTIM", transfer_victim) var/built_victim_message = replacetext(attacker_message, "%ATTACKER", transfer_attacker) - transfer_attacker.reagents?.trans_to(transfer_victim, transfer_attacker.reagents.total_volume, multiplier = 1, preserve_data = 1, no_react = 0, transferred_by = transfer_attacker) + transfer_attacker.reagents?.trans_to(transfer_victim, transfer_attacker.reagents.total_volume, transferred_by = transfer_attacker) to_chat(transfer_attacker, built_attacker_message) to_chat(transfer_victim, built_victim_message) diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm index 5d210c344b5..b33b78d7d1b 100644 --- a/code/datums/mutations/tongue_spike.dm +++ b/code/datums/mutations/tongue_spike.dm @@ -173,7 +173,7 @@ return FALSE to_chat(transferred, span_warning("You feel a tiny prick!")) - transferer.reagents.trans_to(transferred, transferer.reagents.total_volume, 1, 1, 0, transferred_by = transferer) + transferer.reagents.trans_to(transferred, transferer.reagents.total_volume, transferred_by = transferer) var/obj/item/hardened_spike/chem/chem_spike = target var/obj/item/bodypart/spike_location = chem_spike.check_embedded() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 9ff9ee7f76b..956e2bd7588 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -481,7 +481,7 @@ var/datum/reagents/reactants = new(time_release) reactants.my_atom = src for(var/obj/item/reagent_containers/RC in beakers) - RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, 1, 1, 1) + RC.reagents.trans_to(reactants, RC.reagents.total_volume * fraction, no_react = TRUE) chem_splash(get_turf(src), reagents, spread_range, list(reactants), temp_boost) // Detonate it again in one second, until it's out of juice. diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm index c48e9fe8f1e..7d8aa808df9 100644 --- a/code/game/objects/items/devices/portable_chem_mixer.dm +++ b/code/game/objects/items/devices/portable_chem_mixer.dm @@ -121,11 +121,15 @@ /obj/item/storage/portable_chem_mixer/proc/update_contents() dispensable_reagents.Cut() for (var/obj/item/reagent_containers/container in contents) - var/key = container.reagents.get_master_reagent_id() - if (!(key in dispensable_reagents)) - dispensable_reagents[key] = list() - dispensable_reagents[key]["reagents"] = list() - dispensable_reagents[key]["reagents"] += container.reagents + var/datum/reagent/key = container.reagents.get_master_reagent() + if(isnull(key)) //no reagent inside container + continue + + var/key_type = key.type + if (!(key_type in dispensable_reagents)) + dispensable_reagents[key_type] = list() + dispensable_reagents[key_type]["reagents"] = list() + dispensable_reagents[key_type]["reagents"] += container.reagents /obj/item/storage/portable_chem_mixer/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 49304446c0b..f8ac3748de9 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -313,11 +313,11 @@ var/container_ratio = available_extract_volume / beaker_total_volume var/datum/reagents/tmp_holder = new/datum/reagents(beaker_total_volume) for(var/obj/item/container as anything in other_containers) - container.reagents.trans_to(tmp_holder, container.reagents.total_volume * container_ratio, 1, preserve_data = TRUE, no_react = TRUE) + container.reagents.trans_to(tmp_holder, container.reagents.total_volume * container_ratio, no_react = TRUE) for(var/obj/item/slime_extract/extract as anything in extracts) var/available_volume = extract.reagents.maximum_volume - extract.reagents.total_volume - tmp_holder.trans_to(extract, beaker_total_volume * (available_volume / available_extract_volume), 1, preserve_data = TRUE, no_react = TRUE) + tmp_holder.trans_to(extract, beaker_total_volume * (available_volume / available_extract_volume), no_react = TRUE) extract.reagents.handle_reactions() // Reaction handling in the transfer proc is reciprocal and we don't want to blow up the tmp holder early. if(QDELETED(extract)) @@ -390,7 +390,12 @@ var/datum/reagents/reactants = new(unit_spread) reactants.my_atom = src for(var/obj/item/reagent_containers/reagent_container in beakers) - reagent_container.reagents.trans_to(reactants, reagent_container.reagents.total_volume*fraction, threatscale, 1, 1) + reagent_container.reagents.trans_to( + reactants, + reagent_container.reagents.total_volume * fraction, + threatscale, + no_react = TRUE + ) chem_splash(get_turf(src), reagents, affected_area, list(reactants), ignition_temp, threatscale) var/turf/detonated_turf = get_turf(src) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 04eb28e236e..558c287e1e5 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -467,7 +467,7 @@ var/inj_am = injection_amount * seconds_per_tick var/used_amount = inj_am / usage_ratio - reagents.trans_to(user, used_amount, multiplier=usage_ratio, methods = INJECT) + reagents.trans_to(user, used_amount, usage_ratio, methods = INJECT) update_appearance() user.update_worn_back() //for overlays update diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 12fa04dbe0b..dea2864fabe 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -101,11 +101,11 @@ to_chat(user, span_warning("[powder_keg] doesn't have at least 15u of gunpowder to fill [src]!")) return if(has_enough_gunpowder) - powder_keg.reagents.trans_id_to(src, /datum/reagent/gunpowder, amount = charge_size) + powder_keg.reagents.trans_to(src, charge_size, target_id = /datum/reagent/gunpowder) balloon_alert(user, "[src] loaded with gunpowder") return if(has_enough_alt_fuel) - powder_keg.reagents.trans_id_to(src, /datum/reagent/fuel, amount = charge_size) + powder_keg.reagents.trans_to(src, charge_size, target_id = /datum/reagent/fuel) balloon_alert(user, "[src] loaded with welding fuel") return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index a12d53cde73..0f2e237d720 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -322,7 +322,12 @@ if(air1.total_moles() > CRYO_MIN_GAS_MOLES) if(beaker) - beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * seconds_per_tick, efficiency * CRYO_MULTIPLY_FACTOR, methods = VAPOR) // Transfer reagents. + beaker.reagents.trans_to( + occupant, + (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * seconds_per_tick, + efficiency * CRYO_MULTIPLY_FACTOR, + methods = VAPOR + ) consume_gas = TRUE return TRUE diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index 5c860c57a92..998ac0300b4 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -111,7 +111,7 @@ return for(var/datum/reagent/R in beaker.reagents.reagent_list) if(R.type in icecream_vat_reagents) - beaker.reagents.trans_id_to(src, R.type, R.volume) + beaker.reagents.trans_to(src, R.volume, target_id = R.type) say("Internalizing reagent.") playsound(src, 'sound/items/drink.ogg', 25, TRUE) return diff --git a/code/modules/food_and_drinks/restaurant/custom_order.dm b/code/modules/food_and_drinks/restaurant/custom_order.dm index d87797b2578..ac819e4debf 100644 --- a/code/modules/food_and_drinks/restaurant/custom_order.dm +++ b/code/modules/food_and_drinks/restaurant/custom_order.dm @@ -171,7 +171,8 @@ var/datum/reagents/holder = object_used.reagents // The container must be majority reagent - if(holder.get_master_reagent_id() != reagent_type) + var/datum/reagent/master_reagent = holder.get_master_reagent() + if(master_reagent?.type != reagent_type) return FALSE // We must fulfill the sample size threshold if(reagents_needed > holder.total_volume) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 98569f7e248..b872fc0ec37 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -148,7 +148,7 @@ var/average_purity = reagents.get_average_purity() var/total_nutriment_amount = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment, include_subtypes = TRUE) var/single_reagent_amount = grind_results_num > 1 ? round(total_nutriment_amount / grind_results_num, CHEMICAL_QUANTISATION_LEVEL) : total_nutriment_amount - reagents.remove_all_type(/datum/reagent/consumable/nutriment, total_nutriment_amount) + reagents.remove_reagent(/datum/reagent/consumable/nutriment, total_nutriment_amount, include_subtypes = TRUE) for(var/reagent in grind_results) reagents.add_reagent(reagent, single_reagent_amount, added_purity = average_purity) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index cc95f5467f3..593651460d5 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -253,7 +253,7 @@ // Move the leaked water from nutrients to... water var/leaking_water_amount = nutri_reagents.get_reagent_amount(/datum/reagent/water) if(leaking_water_amount) - nutri_reagents.trans_id_to(water_reagents, /datum/reagent/water, leaking_water_amount) + nutri_reagents.trans_to(water_reagents, leaking_water_amount, target_id = /datum/reagent/water) // We should only take MACHINE_REAGENT_TRANSFER every tick; this is the remaining amount we can take var/remaining_transfer_amount = max(MACHINE_REAGENT_TRANSFER - (nutri_reagents.total_volume - initial_nutri_amount), 0) @@ -887,7 +887,7 @@ if(istype(not_water_reagent,/datum/reagent/water)) continue var/transfer_me_to_tray = reagent_source.reagents.get_reagent_amount(not_water_reagent.type) * transfer_amount / reagent_source.reagents.total_volume - reagent_source.reagents.trans_id_to(H.reagents, not_water_reagent.type, transfer_me_to_tray) + reagent_source.reagents.trans_to(H.reagents, transfer_me_to_tray, target_id = not_water_reagent.type) else reagent_source.reagents.trans_to(H.reagents, transfer_amount, transferred_by = user) lastuser = WEAKREF(user) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 3a399c87216..d079323e3a9 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -292,14 +292,14 @@ // Heats up the plant's contents by 25 kelvin per 1 unit of nutriment. Mutually exclusive with cooling. if(get_gene(/datum/plant_gene/trait/chem_heating)) T.visible_message(span_notice("[T] releases freezing air, consuming its nutriments to heat its contents.")) - T.reagents.remove_all_type(/datum/reagent/consumable/nutriment, num_nutriment, strict = TRUE) + T.reagents.remove_reagent(/datum/reagent/consumable/nutriment, num_nutriment) T.reagents.chem_temp = min(1000, (T.reagents.chem_temp + num_nutriment * 25)) T.reagents.handle_reactions() playsound(T.loc, 'sound/effects/wounds/sizzle2.ogg', 5) // Cools down the plant's contents by 5 kelvin per 1 unit of nutriment. Mutually exclusive with heating. else if(get_gene(/datum/plant_gene/trait/chem_cooling)) T.visible_message(span_notice("[T] releases a blast of hot air, consuming its nutriments to cool its contents.")) - T.reagents.remove_all_type(/datum/reagent/consumable/nutriment, num_nutriment, strict = TRUE) + T.reagents.remove_reagent(/datum/reagent/consumable/nutriment, num_nutriment) T.reagents.chem_temp = max(3, (T.reagents.chem_temp + num_nutriment * -5)) T.reagents.handle_reactions() playsound(T.loc, 'sound/effects/space_wind.ogg', 50) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 42722607199..5ed1e44b709 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -463,7 +463,7 @@ if(reagents.has_reagent(reagent_required, reagent_required_amount)) balloon_alert(mod.wearer, "already charged!") return FALSE - if(!attacking_item.reagents.trans_id_to(src, reagent_required, reagent_required_amount)) + if(!attacking_item.reagents.trans_to(src, reagent_required_amount, target_id = reagent_required)) return FALSE balloon_alert(mod.wearer, "charge [reagents.has_reagent(reagent_required, reagent_required_amount) ? "fully" : "partially"] reloaded") return TRUE diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index a03c79f44d0..29eeffb7e75 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -174,7 +174,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department var/obj/item/reagent_containers/spray/clean_spray = item if(!clean_spray.reagents.has_reagent(/datum/reagent/space_cleaner, clean_spray.amount_per_transfer_from_this)) return FALSE - clean_spray.reagents.remove_reagent(/datum/reagent/space_cleaner, clean_spray.amount_per_transfer_from_this, 1) + clean_spray.reagents.remove_reagent(/datum/reagent/space_cleaner, clean_spray.amount_per_transfer_from_this) playsound(loc, 'sound/effects/spray3.ogg', 50, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) user.visible_message(span_notice("[user] cleans \the [src]."), span_notice("You clean \the [src].")) jammed = FALSE diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index eab1811ec6c..8e0158b61da 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -91,13 +91,13 @@ var/obj/item/B = AM ///see if it would overflow else inject if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume) - reagents.trans_to(B, wanted_amount, transferred_by = src) + reagents.trans_to(B, wanted_amount) B.forceMove(goodspot) return ///glass was full so we move it away AM.forceMove(badspot) else if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject AM.forceMove(goodspot) - reagents.trans_to(AM, wanted_amount, transferred_by = src, methods = INJECT) + reagents.trans_to(AM, wanted_amount, methods = INJECT) else if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things - reagents.trans_to(AM, wanted_amount, transferred_by = src, methods = INJECT) + reagents.trans_to(AM, wanted_amount, methods = INJECT) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 98cc1806374..965b428acbd 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -3,9 +3,6 @@ /// coefficient to convert temperature to joules. same lvl as acclimator #define HEATER_COEFFICIENT 0.05 -/// maximum number of attempts the reaction chamber will make to balance the ph(More means better results but higher tick usage) -#define MAX_PH_ADJUSTMENTS 3 - /obj/machinery/plumbing/reaction_chamber name = "mixing chamber" desc = "Keeps chemicals separated until given conditions are met." @@ -175,8 +172,7 @@ return ..() /obj/machinery/plumbing/reaction_chamber/chem/handle_reagents(seconds_per_tick) - var/ph_balance_attempts = 0 - while(ph_balance_attempts < MAX_PH_ADJUSTMENTS && (reagents.ph < acidic_limit || reagents.ph > alkaline_limit)) + if(reagents.ph < acidic_limit || reagents.ph > alkaline_limit) //no power if(machine_stat & NOPOWER) return @@ -197,15 +193,12 @@ //transfer buffer and handle reactions var/ph_change = max((reagents.ph > alkaline_limit ? (reagents.ph - alkaline_limit) : (acidic_limit - reagents.ph)), 0.25) - if(ph_change <= 0.7) //make big jumps towards the end so we can end our work quickly - ph_change *= 2 var/buffer_amount = ((ph_change * reagents.total_volume) / (BUFFER_IONIZING_STRENGTH * num_of_reagents)) * seconds_per_tick if(!buffer.trans_to(reagents, buffer_amount)) return //some power for accurate ph balancing & keep track of attempts made use_power(active_power_usage * 0.03 * buffer_amount) - ph_balance_attempts += 1 /obj/machinery/plumbing/reaction_chamber/chem/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -231,4 +224,3 @@ return FALSE #undef HEATER_COEFFICIENT -#undef MAX_PH_ADJUSTMENTS diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 69d3430cf9e..d515c252baf 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -45,7 +45,9 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!victim.reagents) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!victim.reagents.has_reagent(/datum/reagent/gold, check_subtypes = TRUE)) + + var/gold_amount = victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE) + if(!gold_amount) balloon_alert(user, "no gold in bloodstream") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/gold_beam = user.Beam(victim, icon_state="drain_gold") @@ -53,8 +55,8 @@ qdel(gold_beam) balloon_alert(user, "link broken") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - handle_gold_charges(user, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) - victim.reagents.remove_all_type(/datum/reagent/gold, victim.reagents.get_reagent_amount(/datum/reagent/gold, include_subtypes = TRUE)) + handle_gold_charges(user, gold_amount) + victim.reagents.remove_reagent(/datum/reagent/gold, gold_amount, include_subtypes = TRUE) victim.remove_status_effect(/datum/status_effect/midas_blight) qdel(gold_beam) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index 5b29cb64caf..2e94083f8cb 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -50,7 +50,7 @@ holder.multiply_reagents(threatscale) for(var/datum/reagents/reactant as anything in reactants) - reactant.trans_to(holder, reactant.total_volume, threatscale, preserve_data = TRUE, no_react = TRUE) + reactant.trans_to(holder, reactant.total_volume, threatscale, no_react = TRUE) holder.chem_temp += extra_heat // Average temperature of reagents + extra heat. holder.handle_reactions() // React them now. diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index 073eaf69e5a..bcca8eb67da 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -332,7 +332,7 @@ //Calculate how much product to make and how much reactant to remove factors.. for(var/reagent in reaction.required_reagents) - holder.remove_reagent(reagent, (delta_chem_factor * reaction.required_reagents[reagent]), safety = TRUE) + holder.remove_reagent(reagent, (delta_chem_factor * reaction.required_reagents[reagent])) //Apply pH changes var/pH_adjust if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) @@ -414,4 +414,4 @@ ///Panic stop a reaction - cleanup should be handled by the next timestep /datum/equilibrium/proc/force_clear_reactive_agents() for(var/reagent in reaction.required_reagents) - holder.remove_reagent(reagent, (multiplier * reaction.required_reagents[reagent]), safety = 1) + holder.remove_reagent(reagent, (multiplier * reaction.required_reagents[reagent])) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f948bdffebb..8dfe1dbcf5e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -205,8 +205,9 @@ * * [reagent_type][datum/reagent] - the type of reagent * * amount - the volume to remove * * safety - if FALSE will initiate reactions upon removing. used for trans_id_to + * * include_subtypes - if TRUE will remove the specified amount from all subtypes of reagent_type as well */ -/datum/reagents/proc/remove_reagent(datum/reagent/reagent_type, amount, safety = TRUE) +/datum/reagents/proc/remove_reagent(datum/reagent/reagent_type, amount, safety = TRUE, include_subtypes = FALSE) if(!ispath(reagent_type)) stack_trace("invalid reagent passed to remove reagent [reagent_type]") return FALSE @@ -219,23 +220,37 @@ if(amount <= 0) return FALSE + var/total_removed_amount = 0 + var/remove_amount = 0 var/list/cached_reagents = reagent_list for(var/datum/reagent/cached_reagent as anything in cached_reagents) - if(cached_reagent.type == reagent_type) - cached_reagent.volume -= amount + //check for specific type or subtypes + if(!include_subtypes) + if(cached_reagent.type != reagent_type) + continue + else if(!istype(cached_reagent, reagent_type)) + continue - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() + remove_amount = min(cached_reagent.volume, amount) + cached_reagent.volume -= remove_amount - SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(cached_reagent) ? reagent_type : cached_reagent, amount) + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(cached_reagent) ? reagent_type : cached_reagent, amount) - return TRUE + total_removed_amount += remove_amount - return FALSE + //if we reached here means we have found our specific reagent type so break + if(!include_subtypes) + break + + return total_removed_amount /** - * Removes a reagent at random by the specified amount + * Removes a reagent at random and by a random quantity till the specified amount has been removed. + * Used to create a shower/spray effect for e.g. when you spill a bottle or turn a shower on + * and you want an chaotic effect of whatever coming out * Arguments * * * amount- the volume to remove @@ -298,56 +313,13 @@ var/list/cached_reagents = reagent_list var/part = amount / total_volume - var/remove_amount - var/removed_amount = 0 + var/total_removed_amount = 0 for(var/datum/reagent/reagent as anything in cached_reagents) - remove_amount = reagent.volume * part - remove_reagent(reagent.type, remove_amount) - removed_amount += remove_amount + total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) handle_reactions() - return round(removed_amount, CHEMICAL_VOLUME_ROUNDING) - -/** - * Removes all reagent of X type - * Arguments - * - * * [reagent_type][datum/reagent] - the reagent typepath we are trying to remove - * * amount - the volume of reagent to remove - * * strict - If TRUE will also remove childs of this reagent type - */ -/datum/reagents/proc/remove_all_type(datum/reagent/reagent_type, amount, strict = 0, safety = 1) - if(!ispath(reagent_type)) - stack_trace("invalid reagent path passed to remove all type [reagent_type]") - return FALSE - - if(!IS_FINITE(amount)) - stack_trace("non finite amount passed to remove all type reagent [amount] [reagent_type]") - return FALSE - - amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) - if(amount <= 0) - return FALSE - - var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - - for(var/datum/reagent/reagent as anything in cached_reagents) - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(reagent.type == reagent_type) - matches = 1 - else - if(istype(reagent, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(reagent.type, amount, safety) - - return has_removed_reagent + return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) /** * Removes an specific reagent from this holder @@ -487,6 +459,7 @@ * * obj/target - Target to attempt transfer to * * amount - amount of reagent volume to transfer * * multiplier - multiplies each reagent amount by this number well byond their available volume before transfering. used to create reagents from thin air if you ever need to + * * datum/reagent/target_id - transfer only this reagent in this holder leaving others untouched * * preserve_data - if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. * * no_react - passed through to [/datum/reagents/proc/add_reagent] * * mob/transferred_by - used for logging @@ -499,6 +472,7 @@ obj/target, amount = 1, multiplier = 1, + datum/reagent/target_id, preserve_data = TRUE, no_react = FALSE, mob/transferred_by, @@ -508,12 +482,16 @@ ignore_stomach = FALSE ) if(QDELETED(target) || !total_volume) - return + return FALSE if(!IS_FINITE(amount)) stack_trace("non finite amount passed to trans_to [amount] amount of reagents") return FALSE + if(!isnull(target_id) && !ispath(target_id)) + stack_trace("invalid target reagent id [target_id] passed to trans_to") + return FALSE + var/list/cached_reagents = reagent_list var/atom/target_atom @@ -554,7 +532,7 @@ var/list/r_to_send = list() // Validated list of reagents to be exposed var/list/reagents_to_remove = list() - var/part = amount / total_volume + var/part = isnull(target_id) ? (amount / total_volume) : 1 var/transfer_amount var/transfered_amount var/total_transfered_amount = 0 @@ -563,11 +541,20 @@ for(var/datum/reagent/reagent as anything in cached_reagents) if(remove_blacklisted && !(reagent.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED)) continue + + if(!isnull(target_id)) + if(reagent.type == target_id) + force_stop_reagent_reacting(reagent) + transfer_amount = min(amount, reagent.volume) + else + continue + else + transfer_amount = reagent.volume * part + if(preserve_data) trans_data = copy_data(reagent) if(reagent.intercept_reagents_transfer(target_holder, cached_amount)) continue - transfer_amount = reagent.volume * part transfered_amount = target_holder.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) //we only handle reaction after every reagent has been transferred. if(!transfered_amount) continue @@ -576,6 +563,9 @@ reagents_to_remove += list(list("R" = reagent, "T" = transfer_amount)) total_transfered_amount += transfered_amount + if(!isnull(target_id)) + break + //expose target to reagent changes target_holder.expose_multiple(r_to_send, isorgan(target_atom) ? target : target_atom, methods, part, show_message) @@ -600,64 +590,6 @@ return round(total_transfered_amount, CHEMICAL_VOLUME_ROUNDING) -/** - * Transfer a specific reagent id to the target object - * Arguments - * - * * [target][obj] - the target to transfer reagents to - * * [reagent_type][datum/reagent] - the type of reagent to transfer to the target - * * amount - volume to transfer - * * preserve_data- if TRUE reagent user data will remain preserved - */ -/datum/reagents/proc/trans_id_to( - obj/target, - datum/reagent/reagent_type, - amount = 1, - preserve_data = 1 -) - if (QDELETED(target) || !total_volume) - return - - if(!IS_FINITE(amount)) - stack_trace("non finite amount passed to trans_id_to [amount] [reagent_type]") - return FALSE - - var/cached_amount = amount - - var/available_volume = get_reagent_amount(reagent_type) - var/datum/reagents/holder - if(istype(target, /datum/reagents)) - holder = target - else if(target.reagents && available_volume) - holder = target.reagents - else - return - - // Prevents small amount problems, as well as zero and below zero amounts. - amount = round(min(amount, available_volume, holder.maximum_volume - holder.total_volume), CHEMICAL_QUANTISATION_LEVEL) - if(amount <= 0) - return - - var/list/cached_reagents = reagent_list - - var/trans_data = null - for (var/looping_through_reagents in cached_reagents) - var/datum/reagent/current_reagent = looping_through_reagents - if(current_reagent.type == reagent_type) - if(preserve_data) - trans_data = current_reagent.data - if(current_reagent.intercept_reagents_transfer(holder, cached_amount))//Use input amount instead. - break - force_stop_reagent_reacting(current_reagent) - holder.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, current_reagent.ph, no_react = TRUE, ignore_splitting = current_reagent.chemical_flags & REAGENT_DONOTSPLIT) - remove_reagent(current_reagent.type, amount, 1) - break - - update_total() - holder.update_total() - holder.handle_reactions() - return amount - /** * Copies the reagents to the target object * Arguments @@ -704,7 +636,7 @@ for(var/datum/reagent/reagent as anything in cached_reagents) transfer_amount = reagent.volume * part * multiplier if(preserve_data) - trans_data = reagent.data + trans_data = copy_data(reagent) transfered_amount = target_holder.add_reagent(reagent.type, transfer_amount, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) if(!transfered_amount) continue @@ -739,30 +671,6 @@ handle_reactions() -/// Get the name of the reagent there is the most of in this holder -/datum/reagents/proc/get_master_reagent_name() - var/list/cached_reagents = reagent_list - var/name - var/max_volume = 0 - for(var/datum/reagent/reagent as anything in cached_reagents) - if(reagent.volume > max_volume) - max_volume = reagent.volume - name = reagent.name - - return name - -/// Get the id of the reagent there is the most of in this holder -/datum/reagents/proc/get_master_reagent_id() - var/list/cached_reagents = reagent_list - var/max_type - var/max_volume = 0 - for(var/datum/reagent/reagent as anything in cached_reagents) - if(reagent.volume > max_volume) - max_volume = reagent.volume - max_type = reagent.type - - return max_type - /// Get a reference to the reagent there is the most of in this holder /datum/reagents/proc/get_master_reagent() var/list/cached_reagents = reagent_list @@ -1279,7 +1187,7 @@ if (!reagent) continue sum_purity += reagent.purity - remove_reagent(_reagent, (multiplier * cached_required_reagents[_reagent]), safety = 1) + remove_reagent(_reagent, (multiplier * cached_required_reagents[_reagent])) sum_purity /= cached_required_reagents.len for(var/product in selected_reaction.results) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 3716715a2d6..2461f8eb90b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -447,10 +447,10 @@ To continue set your target temperature to 390K."} if(acid_reagent_heater) cur_vol = acid_reagent_heater.volume volume = 100 - cur_vol - beaker.reagents.trans_id_to(src, acid_reagent.type, volume)//negative because we're going backwards + beaker.reagents.trans_to(src, volume, target_id = acid_reagent.type)//negative because we're going backwards return //We must be positive here - reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/acidic_buffer, dispense_volume) + reagents.trans_to(beaker, dispense_volume, target_id = /datum/reagent/reaction_agent/acidic_buffer) return if(buffer_type == "basic") @@ -464,9 +464,9 @@ To continue set your target temperature to 390K."} if(basic_reagent_heater) cur_vol = basic_reagent_heater.volume volume = 100 - cur_vol - beaker.reagents.trans_id_to(src, basic_reagent.type, volume)//negative because we're going backwards + beaker.reagents.trans_to(src, volume, target_id = basic_reagent.type)//negative because we're going backwards return - reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/basic_buffer, dispense_volume) + reagents.trans_to(beaker, dispense_volume, target_id = /datum/reagent/reaction_agent/basic_buffer) return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 39146c12d0e..65698c7e389 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -340,10 +340,11 @@ // Generate item name var/item_name_default = initial(container_style.name) + var/datum/reagent/master_reagent = reagents.get_master_reagent() if(selected_container == default_container) // Tubes and bottles gain reagent name - item_name_default = "[reagents.get_master_reagent_name()] [item_name_default]" + item_name_default = "[master_reagent.name] [item_name_default]" if(!(initial(container_style.reagent_flags) & OPENCONTAINER)) // Closed containers get both reagent name and units in the name - item_name_default = "[reagents.get_master_reagent_name()] [item_name_default] ([volume_in_each]u)" + item_name_default = "[master_reagent.name] [item_name_default] ([volume_in_each]u)" var/item_name = tgui_input_text(usr, "Container name", "Name", @@ -395,7 +396,7 @@ if (target == TARGET_BUFFER) if(!check_reactions(reagent, beaker.reagents)) return FALSE - beaker.reagents.trans_id_to(src, reagent.type, amount) + beaker.reagents.trans_to(src, amount, target_id = reagent.type) update_appearance(UPDATE_ICON) return TRUE @@ -406,7 +407,7 @@ if (target == TARGET_BEAKER && transfer_mode == TRANSFER_MODE_MOVE) if(!check_reactions(reagent, reagents)) return FALSE - reagents.trans_id_to(beaker, reagent.type, amount) + reagents.trans_to(beaker, amount, target_id = reagent.type) update_appearance(UPDATE_ICON) return TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index 2e5571fd431..13be8d6554f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -231,7 +231,7 @@ soundloop.start() var/vapor_amount = distillation_rate * seconds_per_tick // Vapor to condenser - reagents.trans_id_to(condenser, separating_reagent.type, vapor_amount) + reagents.trans_to(condenser, vapor_amount, target_id = separating_reagent.type) // Cool the vapor down condenser.set_temperature(air.temperature) // Condense into container diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 28039f8b5b6..9a459e41e5b 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -225,7 +225,7 @@ if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 0, updating_health = FALSE)) . = UPDATE_MOB_HEALTH if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * seconds_per_tick) + holder.remove_reagent(/datum/reagent/consumable/capsaicin, seconds_per_tick) return ..() || . /datum/reagent/consumable/soymilk diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 68eefcdf0cd..b5b1f2f89f5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1148,7 +1148,7 @@ . = ..() for(var/effect in status_effects_to_clear) affected_mob.remove_status_effect(effect) - affected_mob.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick * normalise_creation_purity(), FALSE, TRUE) + affected_mob.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick * normalise_creation_purity(), include_subtypes = TRUE) if(affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) . = UPDATE_MOB_HEALTH affected_mob.adjust_drunk_effect(-10 * REM * seconds_per_tick * normalise_creation_purity()) @@ -1285,7 +1285,7 @@ /datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) //wtb flavortext messages that hint that you're vomitting up robots . = ..() if(SPT_PROB(13, seconds_per_tick)) - affected_mob.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code + affected_mob.reagents.remove_reagent(type, metabolization_rate * 15) // ~5 units at a rate of 0.4 but i wanted a nice number in code affected_mob.vomit(vomit_flags = VOMIT_CATEGORY_DEFAULT, vomit_type = /obj/effect/decal/cleanable/vomit/nanites, lost_nutrition = 20) // nanite safety protocols make your body expel them to prevent harmies /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 3b39b82d52f..de662e8905e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -549,7 +549,7 @@ need_mob_update += affected_mob.adjustFireLoss(0.5*seconds_per_tick, updating_health = FALSE) //Hence the other damages... ain't I a bastard? affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2.5*seconds_per_tick, 150) if(holder) - holder.remove_reagent(type, 0.5*seconds_per_tick) + holder.remove_reagent(type, 0.5 * seconds_per_tick) if(need_mob_update) return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 390c3d7bfd4..f281bb3c852 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -782,7 +782,7 @@ if(SPT_PROB(1.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) - holder.remove_reagent(/datum/reagent/toxin/itching_powder,1.2) + holder.remove_reagent(/datum/reagent/toxin/itching_powder, 1.2) return else return ..() || . @@ -963,7 +963,7 @@ affected_mob.vomit(vomit_flags = constructed_flags, distance = rand(0,4)) for(var/datum/reagent/toxin/R in affected_mob.reagents.reagent_list) if(R != src) - affected_mob.reagents.remove_reagent(R.type,1) + affected_mob.reagents.remove_reagent(R.type, 1) /datum/reagent/toxin/spewium/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index a1f10c9afe6..5f57de94b4d 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -168,7 +168,7 @@ var/cached_purity = reagent.purity if((reaction_flags & REACTION_CLEAR_INVERSE) && reagent.inverse_chem) if(reagent.inverse_chem_val > reagent.purity) - holder.remove_reagent(reagent.type, cached_volume, FALSE) + holder.remove_reagent(reagent.type, cached_volume, safety = FALSE) holder.add_reagent(reagent.inverse_chem, cached_volume, FALSE, added_purity = reagent.get_inverse_purity(cached_purity)) return diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 05bc622faa7..f524d92ff8e 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -17,7 +17,7 @@ if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 25, CHEMICAL_QUANTISATION_LEVEL))) return - holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume*2) + holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume * 2) ..() /datum/chemical_reaction/reagent_explosion/nitroglycerin_explosion @@ -35,7 +35,7 @@ /datum/chemical_reaction/reagent_explosion/rdx/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent(/datum/reagent/rdx, created_volume*2) + holder.remove_reagent(/datum/reagent/rdx, created_volume * 2) ..() /datum/chemical_reaction/reagent_explosion/rdx_explosion @@ -242,7 +242,7 @@ /datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent(/datum/reagent/sorium, created_volume*4) + holder.remove_reagent(/datum/reagent/sorium, created_volume * 4) var/turf/T = get_turf(holder.my_atom) var/range = clamp(sqrt(created_volume*4), 1, 6) goonchem_vortex(T, 1, range) @@ -265,7 +265,7 @@ /datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume*3) + holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume * 3) var/turf/T = get_turf(holder.my_atom) var/range = clamp(sqrt(created_volume*3), 1, 6) goonchem_vortex(T, 0, range) @@ -301,7 +301,7 @@ C.Paralyze(60) else C.Stun(100) - holder.remove_reagent(/datum/reagent/flash_powder, created_volume*3) + holder.remove_reagent(/datum/reagent/flash_powder, created_volume * 3) /datum/chemical_reaction/flash_powder_flash required_reagents = list(/datum/reagent/flash_powder = 1) @@ -331,7 +331,7 @@ /datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent(/datum/reagent/smoke_powder, created_volume*3) + holder.remove_reagent(/datum/reagent/smoke_powder, created_volume * 3) var/location = get_turf(holder.my_atom) var/datum/effect_system/fluid_spread/smoke/chem/S = new S.attach(location) @@ -368,7 +368,7 @@ /datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent(/datum/reagent/sonic_powder, created_volume*3) + holder.remove_reagent(/datum/reagent/sonic_powder, created_volume * 3) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, TRUE) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location)) @@ -574,7 +574,7 @@ modifier = 1 /datum/chemical_reaction/reagent_explosion/nitrous_oxide/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.remove_reagent(/datum/reagent/sorium, created_volume*2) + holder.remove_reagent(/datum/reagent/sorium, created_volume * 2) var/turf/turfie = get_turf(holder.my_atom) //generally half as strong as sorium. var/range = clamp(sqrt(created_volume*2), 1, 6) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 3a956d7968e..ca941be8ca1 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -466,9 +466,12 @@ /// Handles reagents getting added to the condiment pack. /obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents) SIGNAL_HANDLER - var/main_reagent = reagents.get_master_reagent_id() - if(main_reagent in possible_states) - var/list/temp_list = possible_states[main_reagent] + + var/datum/reagent/main_reagent = reagents.get_master_reagent() + + var/main_reagent_type = main_reagent?.type + if(main_reagent_type in possible_states) + var/list/temp_list = possible_states[main_reagent_type] icon_state = temp_list[1] desc = temp_list[3] else diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 0ababd34422..7c27399b03e 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -14,10 +14,10 @@ Burning extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/burning/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma, 10)) to_chat(user, span_warning("This extract needs to be full of plasma to activate!")) return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) + reagents.remove_reagent(/datum/reagent/toxin/plasma, 10) to_chat(user, span_notice("You squeeze the extract, and it absorbs the plasma!")) playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 8941057453b..586a33d2dff 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -15,10 +15,10 @@ Charged extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/charged/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma, 10)) to_chat(user, span_warning("This extract needs to be full of plasma to activate!")) return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) + reagents.remove_reagent(/datum/reagent/toxin/plasma, 10) to_chat(user, span_notice("You squeeze the extract, and it absorbs the plasma!")) playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) playsound(src, 'sound/effects/light_flicker.ogg', 50, TRUE) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index c3586437c32..65c7199a7f0 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -14,10 +14,10 @@ Chilling extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/chilling/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma, 10)) to_chat(user, span_warning("This extract needs to be full of plasma to activate!")) return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) + reagents.remove_reagent(/datum/reagent/toxin/plasma, 10) to_chat(user, span_notice("You squeeze the extract, and it absorbs the plasma!")) playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) playsound(src, 'sound/effects/glassbr1.ogg', 50, TRUE) diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index 5222ab3608c..da878b77b5a 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -32,11 +32,11 @@ Industrial extracts: var/IsWorking = FALSE if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 2) && plasmarequired > 1) //Can absorb as much as 2 IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,2) + reagents.remove_reagent(/datum/reagent/toxin/plasma, 2) plasmaabsorbed += 2 else if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 1)) //Can absorb as little as 1 IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,1) + reagents.remove_reagent(/datum/reagent/toxin/plasma, 1) plasmaabsorbed += 1 if(plasmaabsorbed >= plasmarequired) diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm index e7d22a3ece6..81047ce0d8b 100644 --- a/code/modules/surgery/organs/internal/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -82,7 +82,7 @@ // transfer the reagents over to the body at the rate of the stomach metabolim // this way the body is where all reagents that are processed and react // the stomach manages how fast they are feed in a drip style - reagents.trans_id_to(body, bit.type, amount=amount) + reagents.trans_to(body, amount, target_id = bit.type) //Handle disgust if(body) diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index ca3b4f2f479..e16a142dd2e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -198,7 +198,7 @@ log_message("Injecting [patient] with [to_inject] units of [R.name].", LOG_MECHA) for(var/driver in chassis.return_drivers()) log_combat(driver, patient, "injected", "[name] ([R] - [to_inject] units)") - SG.reagents.trans_id_to(patient,R.type,to_inject) + SG.reagents.trans_to(patient, to_inject, target_id = R.type) /obj/item/mecha_parts/mecha_equipment/medical/sleeper/container_resist_act(mob/living/user) go_out() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index b7ddb1f6c57..45e96b9700d 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -173,7 +173,7 @@ var/datum/reagents/water_reagents = new /datum/reagents(required_amount/8) //required_amount/8, because the water usage is split between eight sprays. As of this comment, required_amount/8 = 10u each. water.reagents = water_reagents water_reagents.my_atom = water - reagents.trans_to(water, required_amount/8) + reagents.trans_to(water, required_amount / 8) water.move_at(get_step(chassis, get_dir(targetturf, chassis)), 2, 4) //Target is the tile opposite of the mech as the starting turf. playsound(chassis, 'sound/effects/extinguish.ogg', 75, TRUE, -3) diff --git a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 32391bd465e..8c4ba3dfe84 100644 --- a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -27,11 +27,11 @@ name = "glass of synthanol" desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." -/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/carbon/C) - if(!(C.mob_biotypes & MOB_ROBOTIC)) - C.reagents.remove_reagent(type, 3.6) //gets removed from organics very fast +/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(!(affected_mob.mob_biotypes & MOB_ROBOTIC)) + affected_mob.reagents.remove_reagent(type, 3.6 * REM * seconds_per_tick) //gets removed from organics very fast if(prob(25)) - C.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 5) + affected_mob.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 5) return ..() /datum/reagent/consumable/ethanol/synthanol/expose_mob(mob/living/carbon/C, method=TOUCH, volume) @@ -162,9 +162,9 @@ name = "glass of hellfire" desc = "An amber colored drink that isn't quite as hot as it looks." -/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30) - return ..() +/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, 0, BODYTEMP_NORMAL + 30) /datum/reagent/consumable/ethanol/sins_delight name = "Sin's Delight" @@ -256,10 +256,11 @@ name = "glass of hotlime miami" desc = "This looks very aesthetically pleasing." -/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M, seconds_per_tick, times_fired) - M.set_drugginess(1.5 MINUTES * REM * seconds_per_tick) - M.adjustStaminaLoss(-2) - return ..() +/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.set_drugginess(1.5 MINUTES * REM * seconds_per_tick) + if(affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE)) + return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/coggrog name = "Cog Grog" @@ -321,9 +322,9 @@ name = "glass of mercuryblast" desc = "No thermometers were harmed in the creation of this drink" -/datum/reagent/consumable/ethanol/mercuryblast/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) - return ..() +/datum/reagent/consumable/ethanol/mercuryblast/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick, T0C) /datum/reagent/consumable/ethanol/piledriver name = "Piledriver" @@ -540,10 +541,11 @@ name = "glass of jell wyrm" desc = "A bubbly drink that is rather inviting to those that don't know who it's meant for." -/datum/reagent/consumable/ethanol/jell_wyrm/on_mob_life(mob/living/carbon/M) +/datum/reagent/consumable/ethanol/jell_wyrm/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() if(prob(20)) - M.adjustToxLoss(1, 0) - return ..() + if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE)) + return UPDATE_MOB_HEALTH #define JELLWYRM_DISGUST 25 @@ -643,12 +645,10 @@ #undef BLOODSHOT_DISGUST /datum/reagent/consumable/ethanol/bloodshot/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(drinker.blood_volume < drinker.blood_volume_normal) drinker.blood_volume = max(drinker.blood_volume, min(drinker.blood_volume + (3 * REM * seconds_per_tick), BLOOD_VOLUME_NORMAL)) //Bloodshot quickly restores blood loss. - return ..() - - /datum/reagent/consumable/ethanol/blizzard_brew name = "Blizzard Brew" description = "An ancient recipe. Served best chilled as much as dwarvenly possible." @@ -675,18 +675,18 @@ return ..() /datum/reagent/consumable/ethanol/blizzard_brew/overdose_start(mob/living/carbon/drinker) + . = ..() cube = new /obj/structure/ice_stasis(get_turf(drinker)) cube.color = COLOR_CYAN cube.set_anchored(TRUE) drinker.forceMove(cube) cryostylane_alert = drinker.throw_alert("cryostylane_alert", /atom/movable/screen/alert/status_effect/freon/cryostylane) cryostylane_alert.attached_effect = src //so the alert can reference us, if it needs to - ..() /datum/reagent/consumable/ethanol/blizzard_brew/on_mob_delete(mob/living/carbon/drinker, amount) QDEL_NULL(cube) drinker.clear_alert("cryostylane_alert") - ..() + return ..() /datum/reagent/consumable/ethanol/molten_mead name = "Molten Mead" @@ -743,14 +743,14 @@ quality = DRINK_FANTASTIC return ..() -/datum/reagent/consumable/ethanol/hippie_hooch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) +/datum/reagent/consumable/ethanol/hippie_hooch/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) for(var/effect in status_effects_to_clear) - drinker.remove_status_effect(effect) - drinker.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick, FALSE, TRUE) - drinker.adjustToxLoss(-0.2 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) - drinker.adjust_drunk_effect(-10 * REM * seconds_per_tick) - ..() - . = TRUE + affected_mob.remove_status_effect(effect) + affected_mob.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 3 * REM * seconds_per_tick, include_subtypes = TRUE) + . = ..() + if(affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + . = UPDATE_MOB_HEALTH + affected_mob.adjust_drunk_effect(-10 * REM * seconds_per_tick) /datum/reagent/consumable/ethanol/research_rum name = "Research Rum" @@ -774,10 +774,9 @@ return ..() /datum/reagent/consumable/ethanol/research_rum/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) + . = ..() if(prob(5)) drinker.say(pick_list_replacements(VISTA_FILE, "ballmer_good_msg"), forced = "ballmer") - ..() - . = TRUE /datum/reagent/consumable/ethanol/golden_grog name = "Golden Grog" diff --git a/modular_skyrat/modules/novaya_ert/code/mod_suit.dm b/modular_skyrat/modules/novaya_ert/code/mod_suit.dm index d9c5adb7f71..3494429f13d 100644 --- a/modular_skyrat/modules/novaya_ert/code/mod_suit.dm +++ b/modular_skyrat/modules/novaya_ert/code/mod_suit.dm @@ -290,7 +290,7 @@ balloon_alert(mod.wearer, "already full!") return FALSE /// And if the reagent's wrong. - if(!attacking_item.reagents.trans_id_to(src, reagent_required, reagent_required_amount)) + if(!attacking_item.reagents.trans_to(src, reagent_required_amount, target_id = reagent_required)) return FALSE /// And if you got to that point without screwing up then it awards you with being refilled. balloon_alert(mod.wearer, "charge reloaded") diff --git a/modular_skyrat/modules/reagent_forging/code/forge.dm b/modular_skyrat/modules/reagent_forging/code/forge.dm index 1aee837169a..ca9f8edd423 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge.dm @@ -590,12 +590,12 @@ for(var/datum/reagent/weapon_reagent as anything in attacking_weapon.reagents.reagent_list) if(weapon_reagent.volume < MINIMUM_IMBUING_REAGENT_AMOUNT) - attacking_weapon.reagents.remove_all_type(weapon_reagent.type) + attacking_weapon.reagents.remove_reagent(weapon_reagent.type) continue if(is_type_in_typecache(weapon_reagent, disallowed_reagents)) balloon_alert(user, "cannot imbue with [weapon_reagent.name]") - attacking_weapon.reagents.remove_all_type(weapon_reagent.type) + attacking_weapon.reagents.remove_reagent(weapon_reagent.type, include_subtypes = TRUE) continue weapon_component.imbued_reagent += weapon_reagent.type @@ -640,12 +640,12 @@ for(var/datum/reagent/clothing_reagent as anything in attacking_clothing.reagents.reagent_list) if(clothing_reagent.volume < MINIMUM_IMBUING_REAGENT_AMOUNT) - attacking_clothing.reagents.remove_all_type(clothing_reagent.type) + attacking_clothing.reagents.remove_reagent(clothing_reagent.type, include_subtypes = TRUE) continue if(is_type_in_typecache(clothing_reagent, disallowed_reagents)) balloon_alert(user, "cannot imbue with [clothing_reagent.name]") - attacking_clothing.reagents.remove_all_type(clothing_reagent.type) + attacking_clothing.reagents.remove_reagent(clothing_reagent.type, include_subtypes = TRUE) continue clothing_component.imbued_reagent += clothing_reagent.type