Merge branch 'master' into upstream-merge-33055
This commit is contained in:
@@ -59,6 +59,19 @@
|
||||
if(my_atom && my_atom.reagents == src)
|
||||
my_atom.reagents = null
|
||||
|
||||
|
||||
// Used in attack logs for reagents in pills and such
|
||||
/datum/reagents/proc/log_list()
|
||||
if(!length(reagent_list))
|
||||
return "no reagents"
|
||||
|
||||
var/list/data = list()
|
||||
for(var/r in reagent_list) //no reagents will be left behind
|
||||
var/datum/reagent/R = r
|
||||
data += "[R.id] ([round(R.volume, 0.1)]u)"
|
||||
//Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
|
||||
return english_list(data)
|
||||
|
||||
/datum/reagents/proc/remove_any(amount = 1)
|
||||
var/list/cached_reagents = reagent_list
|
||||
var/total_transfered = 0
|
||||
@@ -228,8 +241,7 @@
|
||||
var/list/cached_reagents = reagent_list
|
||||
var/list/cached_addictions = addiction_list
|
||||
if(C)
|
||||
chem_temp = C.bodytemperature
|
||||
handle_reactions()
|
||||
expose_temperature(C.bodytemperature, 0.25)
|
||||
var/need_mob_update = 0
|
||||
for(var/reagent in cached_reagents)
|
||||
var/datum/reagent/R = reagent
|
||||
@@ -580,7 +592,7 @@
|
||||
if (R.id == reagent)
|
||||
//clamp the removal amount to be between current reagent amount
|
||||
//and zero, to prevent removing more than the holder has stored
|
||||
amount = Clamp(amount, 0, R.volume)
|
||||
amount = CLAMP(amount, 0, R.volume)
|
||||
R.volume -= amount
|
||||
update_total()
|
||||
if(!safety)//So it does not handle reactions when it need not to
|
||||
@@ -731,6 +743,16 @@
|
||||
out += "[taste_desc]"
|
||||
|
||||
return english_list(out, "something indescribable")
|
||||
|
||||
|
||||
/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02)
|
||||
var/temp_delta = (temperature - chem_temp) * coeff
|
||||
if(temp_delta > 0)
|
||||
chem_temp = min(chem_temp + max(temp_delta, 1), temperature)
|
||||
else
|
||||
chem_temp = max(chem_temp + min(temp_delta, -1), temperature)
|
||||
chem_temp = round(chem_temp)
|
||||
handle_reactions()
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
|
||||
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
var/obj/item/reagent_containers/B = I
|
||||
. = 1 //no afterattack
|
||||
if(beaker)
|
||||
@@ -211,7 +211,7 @@
|
||||
|
||||
/obj/machinery/chem_dispenser/emp_act(severity)
|
||||
var/list/datum/reagents/R = list()
|
||||
var/total = min(rand(7,15), Floor(cell.charge*powerefficiency))
|
||||
var/total = min(rand(7,15), FLOOR(cell.charge*powerefficiency, 1))
|
||||
var/datum/reagents/Q = new(total*10)
|
||||
if(beaker && beaker.reagents)
|
||||
R += beaker.reagents
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
|
||||
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
. = 1 //no afterattack
|
||||
if(beaker)
|
||||
to_chat(user, "<span class='warning'>A container is already loaded into [src]!</span>")
|
||||
@@ -126,7 +126,7 @@
|
||||
target = text2num(target)
|
||||
. = TRUE
|
||||
if(.)
|
||||
target_temperature = Clamp(target, 0, 1000)
|
||||
target_temperature = CLAMP(target, 0, 1000)
|
||||
if("eject")
|
||||
on = FALSE
|
||||
eject_beaker()
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
|
||||
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
. = 1 // no afterattack
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You can't use the [src.name] while its panel is opened!</span>")
|
||||
@@ -215,7 +215,7 @@
|
||||
var/amount = 1
|
||||
var/vol_each = min(reagents.total_volume, 50)
|
||||
if(text2num(many))
|
||||
amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0, 10)
|
||||
amount = CLAMP(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0, 10)
|
||||
if(!amount)
|
||||
return
|
||||
vol_each = min(reagents.total_volume / amount, 50)
|
||||
@@ -251,7 +251,7 @@
|
||||
var/amount = 1
|
||||
var/vol_each = min(reagents.total_volume, 40)
|
||||
if(text2num(many))
|
||||
amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0, 10)
|
||||
amount = CLAMP(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0, 10)
|
||||
if(!amount)
|
||||
return
|
||||
vol_each = min(reagents.total_volume / amount, 40)
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1))
|
||||
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
. = TRUE //no afterattack
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER_1) )
|
||||
if (istype(I, /obj/item/reagent_containers) && I.is_open_container())
|
||||
if (!beaker)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
@@ -294,7 +294,7 @@
|
||||
/obj/machinery/reagentgrinder/proc/mix_complete()
|
||||
if(beaker && beaker.reagents.total_volume)
|
||||
//Recipe to make Butter
|
||||
var/butter_amt = Floor(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF)
|
||||
var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF, 1)
|
||||
beaker.reagents.remove_reagent("milk", MILK_TO_BUTTER_COEFF * butter_amt)
|
||||
for(var/i in 1 to butter_amt)
|
||||
new /obj/item/reagent_containers/food/snacks/butter(drop_location())
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define REAGENTS_BASE_VOLUME 100 // actual volume is REAGENTS_BASE_VOLUME plus REAGENTS_BASE_VOLUME * rating for each matterbin
|
||||
|
||||
/obj/machinery/smoke_machine
|
||||
name = "smoke machine"
|
||||
desc = "A machine with a centrifuge installed into it. It produces smoke with any reagents you put into the machine."
|
||||
@@ -11,14 +13,13 @@
|
||||
var/cooldown = 0
|
||||
var/screen = "home"
|
||||
var/useramount = 30 // Last used amount
|
||||
var/volume = 300
|
||||
var/setting = 3
|
||||
var/list/possible_settings = list(3,6,9)
|
||||
var/setting = 1 // displayed range is 3 * setting
|
||||
var/max_range = 3 // displayed max range is 3 * max range
|
||||
|
||||
/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting = 3, efficiency = 10, loc)
|
||||
amount = setting
|
||||
/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc)
|
||||
amount = setting * 3
|
||||
carry.copy_to(chemholder, 20)
|
||||
carry.remove_any(setting * 16 / efficiency)
|
||||
carry.remove_any(amount * 16 / efficiency)
|
||||
location = loc
|
||||
|
||||
/datum/effect_system/smoke_spread/chem/smoke_machine
|
||||
@@ -28,10 +29,11 @@
|
||||
opaque = FALSE
|
||||
alpha = 100
|
||||
|
||||
|
||||
/obj/machinery/smoke_machine/Initialize()
|
||||
. = ..()
|
||||
create_reagents(volume)
|
||||
create_reagents(REAGENTS_BASE_VOLUME)
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating
|
||||
|
||||
/obj/machinery/smoke_machine/update_icon()
|
||||
if((!is_operational()) || (!on) || (reagents.total_volume == 0))
|
||||
@@ -41,13 +43,22 @@
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/smoke_machine/RefreshParts()
|
||||
efficiency = 6
|
||||
var/new_volume = REAGENTS_BASE_VOLUME
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
efficiency += B.rating
|
||||
new_volume += REAGENTS_BASE_VOLUME * B.rating
|
||||
if(!reagents)
|
||||
create_reagents(new_volume)
|
||||
reagents.maximum_volume = new_volume
|
||||
if(new_volume < reagents.total_volume)
|
||||
reagents.reaction(loc, TOUCH) // if someone manages to downgrade it without deconstructing
|
||||
reagents.clear_reagents()
|
||||
efficiency = 9
|
||||
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
||||
efficiency += C.rating
|
||||
max_range = 1
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
efficiency += M.rating
|
||||
max_range += M.rating
|
||||
max_range = max(3, max_range)
|
||||
|
||||
/obj/machinery/smoke_machine/process()
|
||||
..()
|
||||
@@ -78,6 +89,11 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/smoke_machine/deconstruct()
|
||||
reagents.reaction(loc, TOUCH)
|
||||
reagents.clear_reagents()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/smoke_machine/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -99,6 +115,7 @@
|
||||
data["active"] = on
|
||||
data["setting"] = setting
|
||||
data["screen"] = screen
|
||||
data["maxSetting"] = max_range
|
||||
return data
|
||||
|
||||
/obj/machinery/smoke_machine/ui_act(action, params)
|
||||
@@ -110,7 +127,7 @@
|
||||
. = TRUE
|
||||
if("setting")
|
||||
var/amount = text2num(params["amount"])
|
||||
if (locate(amount) in possible_settings)
|
||||
if(amount in 1 to max_range)
|
||||
setting = amount
|
||||
. = TRUE
|
||||
if("power")
|
||||
@@ -122,3 +139,5 @@
|
||||
if("goScreen")
|
||||
screen = params["screen"]
|
||||
. = TRUE
|
||||
|
||||
#undef REAGENTS_BASE_VOLUME
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
return 0
|
||||
if(method == VAPOR) //smoke, foam, spray
|
||||
if(M.reagents)
|
||||
var/modifier = Clamp((1 - touch_protection), 0, 1)
|
||||
var/modifier = CLAMP((1 - touch_protection), 0, 1)
|
||||
var/amount = round(reac_volume*modifier, 0.1)
|
||||
if(amount >= 0.5)
|
||||
M.reagents.add_reagent(id, amount)
|
||||
|
||||
@@ -961,7 +961,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
var/datum/antagonist/changeling/changeling = M.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(changeling)
|
||||
changeling.chem_charges += metabolization_rate
|
||||
changeling.chem_charges = Clamp(changeling.chem_charges, 0, changeling.chem_storage)
|
||||
changeling.chem_charges = CLAMP(changeling.chem_charges, 0, changeling.chem_storage)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/irishcarbomb
|
||||
|
||||
@@ -97,10 +97,10 @@
|
||||
|
||||
/datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume)
|
||||
if(holder && holder.chem_temp >= fry_temperature)
|
||||
if(isitem(O))
|
||||
if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder))
|
||||
O.loc.visible_message("<span class='warning'>[O] rapidly fries as it's splashed with hot oil! Somehow.</span>")
|
||||
var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location())
|
||||
F.fry(O, volume)
|
||||
var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O)
|
||||
F.fry(volume)
|
||||
|
||||
/datum/reagent/consumable/cooking_oil/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0)
|
||||
if(!istype(M))
|
||||
|
||||
@@ -850,9 +850,9 @@
|
||||
|
||||
/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M)
|
||||
if(M.confused < 6)
|
||||
M.confused = Clamp(M.confused + 3, 0, 5)
|
||||
M.confused = CLAMP(M.confused + 3, 0, 5)
|
||||
if(M.dizziness < 6)
|
||||
M.dizziness = Clamp(M.dizziness + 3, 0, 5)
|
||||
M.dizziness = CLAMP(M.dizziness + 3, 0, 5)
|
||||
if(prob(20))
|
||||
to_chat(M, "You feel confused and disorientated.")
|
||||
..()
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
return
|
||||
holder.remove_reagent("sorium", created_volume*4)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
var/range = Clamp(sqrt(created_volume*4), 1, 6)
|
||||
var/range = CLAMP(sqrt(created_volume*4), 1, 6)
|
||||
goonchem_vortex(T, 1, range)
|
||||
|
||||
/datum/chemical_reaction/sorium_vortex
|
||||
@@ -179,7 +179,7 @@
|
||||
|
||||
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
var/range = Clamp(sqrt(created_volume), 1, 6)
|
||||
var/range = CLAMP(sqrt(created_volume), 1, 6)
|
||||
goonchem_vortex(T, 1, range)
|
||||
|
||||
/datum/chemical_reaction/liquid_dark_matter
|
||||
@@ -193,7 +193,7 @@
|
||||
return
|
||||
holder.remove_reagent("liquid_dark_matter", created_volume*3)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
var/range = Clamp(sqrt(created_volume*3), 1, 6)
|
||||
var/range = CLAMP(sqrt(created_volume*3), 1, 6)
|
||||
goonchem_vortex(T, 0, range)
|
||||
|
||||
/datum/chemical_reaction/ldm_vortex
|
||||
@@ -204,7 +204,7 @@
|
||||
|
||||
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
var/range = Clamp(sqrt(created_volume/2), 1, 6)
|
||||
var/range = CLAMP(sqrt(created_volume/2), 1, 6)
|
||||
goonchem_vortex(T, 0, range)
|
||||
|
||||
/datum/chemical_reaction/flash_powder
|
||||
|
||||
Reference in New Issue
Block a user