diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index 13e20785d33..dad05f32c99 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -69,21 +69,24 @@
/obj/effect/hotspot/proc/perform_exposure()
var/turf/simulated/location = loc
- if(!istype(location) || !(location.air)) return 0
+ if(!istype(location) || !(location.air))
+ return FALSE
- if(volume > CELL_VOLUME*0.95) bypassing = 1
- else bypassing = 0
+ if(volume > CELL_VOLUME * 0.95)
+ bypassing = TRUE
+ else
+ bypassing = FALSE
if(bypassing)
if(!just_spawned)
- volume = location.air.fuel_burnt*FIRE_GROWTH_RATE
+ volume = location.air.fuel_burnt * FIRE_GROWTH_RATE
temperature = location.air.temperature
else
- var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
+ var/datum/gas_mixture/affected = location.air.remove_ratio(volume / location.air.volume)
affected.temperature = temperature
affected.react()
temperature = affected.temperature
- volume = affected.fuel_burnt*FIRE_GROWTH_RATE
+ volume = affected.fuel_burnt * FIRE_GROWTH_RATE
location.assume_air(affected)
for(var/A in loc)
@@ -93,7 +96,7 @@
color = heat2color(temperature)
set_light(l_color = color)
- return 0
+ return FALSE
/obj/effect/hotspot/process()
@@ -186,3 +189,127 @@
..()
if(isliving(L))
L.fire_act()
+
+/proc/fireflash(atom/center, radius, temp)
+ if(!temp)
+ temp = rand(2800, 3200)
+ for(var/turf/T in view(radius, get_turf(center)))
+ if(istype(T, /turf/space))
+ continue
+ if(locate(/obj/effect/hotspot) in T)
+ continue
+ if(!can_line(get_turf(center), T, radius + 1))
+ continue
+
+ var/obj/effect/hotspot/H = new(T)
+ H.temperature = temp
+ H.volume = 400
+ if(istype(T, /turf/simulated))
+ var/turf/simulated/S = T
+ S.active_hotspot = H
+
+ T.hotspot_expose(H.temperature, H.volume)
+
+ if(istype(T, /turf/simulated/floor))
+ var/turf/simulated/floor/F = T
+ F.burn_tile()
+
+ for(var/mob/living/L in T)
+ L.adjust_fire_stacks(3)
+ L.IgniteMob()
+ L.bodytemperature = max(temp / 3, L.bodytemperature)
+
+/proc/fireflash_s(atom/center, radius, temp, falloff)
+ if(temp < T0C + 60)
+ return list()
+ var/list/open = list()
+ var/list/affected = list()
+ var/list/closed = list()
+ var/turf/Ce = get_turf(center)
+ var/max_dist = radius
+ if(falloff)
+ max_dist = min((temp - (T0C + 60)) / falloff, radius)
+ open[Ce] = 0
+ while(open.len)
+ var/turf/T = open[1]
+ var/dist = open[T]
+ open -= T
+ closed += T
+
+ if(isspaceturf(T))
+ continue
+ if(dist > max_dist)
+ continue
+ if(!ff_cansee(Ce, T))
+ continue
+
+ var/obj/effect/hotspot/existing_hotspot = locate(/obj/effect/hotspot) in T
+ var/prev_temp = 0
+ var/need_expose = 0
+ var/expose_temp = 0
+ if(!existing_hotspot)
+ var/obj/effect/hotspot/H = new(T)
+ need_expose = TRUE
+ H.temperature = temp - dist * falloff
+ expose_temp = H.temperature
+ H.volume = 400
+ if(istype(T, /turf/simulated))
+ var/turf/simulated/S = T
+ S.active_hotspot = H
+ existing_hotspot = H
+
+ else if(existing_hotspot.temperature < temp - dist * falloff)
+ expose_temp = (temp - dist * falloff) - existing_hotspot.temperature
+ prev_temp = existing_hotspot.temperature
+ if(expose_temp > prev_temp * 3)
+ need_expose = TRUE
+ existing_hotspot.temperature = temp - dist * falloff
+
+ affected[T] = existing_hotspot.temperature
+ if(need_expose && expose_temp)
+ T.hotspot_expose(expose_temp, existing_hotspot.volume)
+ if(istype(T, /turf/simulated/floor))
+ var/turf/simulated/floor/F = T
+ F.burn_tile()
+ for(var/mob/living/L in T)
+ L.adjust_fire_stacks(3)
+ L.bodytemperature = (2 * L.bodytemperature + temp) / 3
+
+ if(T.density)
+ continue
+ for(var/obj/O in T)
+ if(O.density)
+ continue
+ if(dist == max_dist)
+ continue
+
+ for(var/dir in cardinal)
+ var/turf/link = get_step(T, dir)
+ if (!link)
+ continue
+ var/dx = link.x - Ce.x
+ var/dy = link.y - Ce.y
+ var/target_dist = max((dist + 1 + sqrt(dx * dx + dy * dy)) / 2, dist)
+ if(!(link in closed))
+ if(link in open)
+ if(open[link] > target_dist)
+ open[link] = target_dist
+ else
+ open[link] = target_dist
+
+ return affected
+
+/proc/fireflash_sm(atom/center, radius, temp, falloff, capped = TRUE, bypass_rng = FALSE)
+ var/list/affected = fireflash_s(center, radius, temp, falloff)
+ for(var/turf/simulated/T in affected)
+ var/mytemp = affected[T]
+ var/melt = 1643.15 // default steel melting point
+ var/divisor = melt
+ if(mytemp >= melt * 2)
+ var/chance = mytemp / divisor
+ if(capped)
+ chance = min(chance, 30)
+ if(prob(chance) || bypass_rng)
+ T.visible_message("[T] melts!")
+ T.burn_down()
+ return affected
\ No newline at end of file
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 79b7da3c10c..c7c3bbf5256 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -74,6 +74,19 @@
//turfs += centerturf
return atoms
+/proc/ff_cansee(atom/A, atom/B)
+ var/AT = get_turf(A)
+ var/BT = get_turf(B)
+ if(AT == BT)
+ return 1
+ var/list/line = getline(A, B)
+ for(var/turf/T in line)
+ if(T == AT || T == BT)
+ break
+ if(T.density)
+ return FALSE
+ return TRUE
+
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
var/dx = Loc1.x - Loc2.x
var/dy = Loc1.y - Loc2.y
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a22c4cf3f99..287de3fb424 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -216,6 +216,23 @@ Turf and target are seperate in case you want to teleport some distance from a t
line+=locate(px,py,M.z)
return line
+//Same as the thing below just for density and without support for atoms.
+/proc/can_line(atom/source, atom/target, length = 5)
+ var/turf/current = get_turf(source)
+ var/turf/target_turf = get_turf(target)
+ var/steps = 0
+
+ while(current != target_turf)
+ if(steps > length)
+ return FALSE
+ if(!current)
+ return FALSE
+ if(current.density)
+ return FALSE
+ current = get_step_towards(current, target_turf)
+ steps++
+ return TRUE
+
//Returns whether or not a player is a guest using their ckey as an input
/proc/IsGuestKey(key)
if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d47bc134774..47036da9cf8 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -12,6 +12,9 @@
return
/obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby!
+ if(is_hot(src) && A.reagents && !ismob(A))
+ to_chat(user, "You heat [A] with [src].")
+ A.reagents.temperature_reagents(is_hot(src))
return TRUE //return FALSE to avoid calling attackby after this proc does stuff
// No comment
@@ -123,9 +126,7 @@
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
// Click parameters is the params string from byond Click() code, see that documentation.
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if(is_hot(src) && target.reagents && !ismob(target) && proximity_flag)
- to_chat(user, "You heat [target].")
- target.reagents.temperature_reagents(is_hot(src))
+ return
/obj/item/proc/get_clamped_volume()
if(w_class)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index d26a24b39a2..6b3dc1e93ff 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -79,6 +79,9 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
src.hotspot_expose(1000,CELL_VOLUME)
return
+/turf/simulated/floor/burn_down()
+ ex_act(2)
+
/turf/simulated/floor/is_shielded()
for(var/obj/structure/A in contents)
if(A.level == 3)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 4c855ac1f15..6fddc40dfa9 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -201,6 +201,11 @@
for(var/i=0, i T0C + 600)
+ var/turf/T = get_turf(holder.my_atom)
+ holder.my_atom.visible_message("The oil burns!")
+ fireflash(T, min(max(0, volume / 40), 8))
+ var/datum/effect_system/smoke_spread/bad/BS = new
+ BS.set_up(1, 0, T)
+ BS.start()
+ if(holder)
+ holder.add_reagent("ash", round(volume * 0.5))
+ holder.del_reagent(id)
+
/datum/reagent/oil/reaction_turf(turf/T, volume)
if(volume >= 3 && !isspaceturf(T) && !locate(/obj/effect/decal/cleanable/blood/oil) in T)
new /obj/effect/decal/cleanable/blood/oil(T)
diff --git a/code/modules/reagents/chemistry/reagents/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
index 08f01bdd381..204848e1fe9 100644
--- a/code/modules/reagents/chemistry/reagents/paradise_pop.dm
+++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
@@ -29,7 +29,7 @@
/datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
- goonchem_vortex(T, 0, 2, 1)
+ goonchem_vortex(T, 1, 0)
to_chat(M, "You briefly feel super-massive, like a black hole. Probably just your imagination...")
..()
@@ -119,7 +119,7 @@
/datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
- goonchem_vortex(T, 1, 1, 2)
+ goonchem_vortex(T, 0, 0)
M.emote("burp")
to_chat(M, "You feel ready to burst! Oh wait, just a burp...")
else if(prob(25))
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
index b0dd577db9f..7761772a44c 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -8,6 +8,43 @@
drink_name = "Glass of welder fuel"
drink_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
taste_message = "mistakes"
+ var/max_radius = 7
+ var/min_radius = 0
+ var/volume_radius_modifier = -0.15
+ var/volume_radius_multiplier = 0.09
+ var/explosion_threshold = 100
+ var/min_explosion_radius = 0
+ var/max_explosion_radius = 4
+ var/volume_explosion_radius_multiplier = 0.005
+ var/volume_explosion_radius_modifier = 0
+ var/combustion_temp = T0C + 200
+
+/datum/reagent/fuel/reaction_temperature(exposed_temperature, exposed_volume)
+ if(exposed_temperature > combustion_temp)
+ if(volume < 1)
+ if(holder)
+ holder.del_reagent(id)
+ return
+ var/turf/T = get_turf(holder.my_atom)
+ var/radius = min(max(min_radius, volume * volume_radius_multiplier + volume_radius_modifier), max_radius)
+ fireflash_sm(T, radius, 2200 + radius * 250, radius * 50)
+ if(holder && volume >= explosion_threshold)
+ if(holder.my_atom)
+ holder.my_atom.visible_message("[holder.my_atom] explodes!")
+ message_admins("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
+ log_game("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].")
+ holder.my_atom.investigate_log("A fuel explosion, last touched by [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"], triggered at [COORD(holder.my_atom.loc)].", INVESTIGATE_BOMB)
+ var/boomrange = min(max(min_explosion_radius, round(volume * volume_explosion_radius_multiplier + volume_explosion_radius_modifier)), max_explosion_radius)
+ explosion(T, -1, -1, boomrange, 1)
+ if(holder)
+ holder.del_reagent(id)
+
+/datum/reagent/fuel/reaction_turf(turf/T, volume) //Don't spill the fuel, or you'll regret it
+ if(isspaceturf(T))
+ return
+ if(!T.reagents)
+ T.create_reagents(50)
+ T.reagents.add_reagent("fuel", volume)
/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite!
if(method == TOUCH)
@@ -23,6 +60,12 @@
color = "#7A2B94"
taste_message = "corporate assets going to waste"
+/datum/reagent/plasma/reaction_temperature(exposed_temperature, exposed_volume)
+ if(exposed_temperature >= T0C + 100)
+ fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8))
+ if(holder)
+ holder.del_reagent(id)
+
/datum/reagent/plasma/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
@@ -48,11 +91,27 @@
process_flags = ORGANIC | SYNTHETIC
taste_message = "rust"
-/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume)
- if(volume >= 5 && istype(W))
- W.thermite = 1
- W.overlays.Cut()
- W.overlays = image('icons/effects/effects.dmi', icon_state = "thermite")
+/datum/reagent/thermite/reaction_temperature(exposed_temperature, exposed_volume)
+ var/turf/simulated/S = holder.my_atom
+ if(!istype(S))
+ return
+
+ if(exposed_temperature >= T0C + 100)
+ var/datum/reagents/Holder = holder
+ var/Id = id
+ var/Volume = volume
+ Holder.del_reagent(Id)
+ fireflash_sm(S, 0, rand(20000, 25000) + Volume * 2500, 0, 0, 1)
+
+/datum/reagent/thermite/reaction_turf(turf/simulated/S, volume)
+ if(istype(S))
+ if(!S.reagents)
+ S.create_reagents(volume)
+ S.reagents.add_reagent("thermite", volume)
+ S.overlays.Cut()
+ S.overlays = image('icons/effects/effects.dmi', icon_state = "thermite")
+ if(S.active_hotspot)
+ S.reagents.temperature_reagents(S.active_hotspot.temperature, S.active_hotspot.volume, 10, 300)
/datum/reagent/glycerol
name = "Glycerol"
@@ -87,21 +146,11 @@
update_flags |= M.adjustFireLoss(burndmg, FALSE)
return ..() | update_flags
-/datum/reagent/clf3/reaction_turf(turf/simulated/T, volume)
- if(prob(1) && istype(T, /turf/simulated/floor/plating))
- var/turf/simulated/floor/plating/F = T
- F.ChangeTurf(/turf/space)
- if(istype(T, /turf/simulated/floor))
- var/turf/simulated/floor/F = T
- if(prob(volume/10))
- F.make_plating()
- if(istype(F, /turf/simulated/floor))
- new /obj/effect/hotspot(F)
- if(prob(volume/10) && istype(T, /turf/simulated/wall))
- var/turf/simulated/wall/W = T
- W.ChangeTurf(/turf/simulated/floor)
- if(istype(T, /turf/simulated/shuttle))
- new /obj/effect/hotspot(T)
+/datum/reagent/clf3/reaction_turf(turf/T, volume)
+ if(volume < 3)
+ return
+ var/radius = min((volume - 3) * 0.15, 3)
+ fireflash_sm(T, radius, 4500 + volume * 500, 350)
/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
@@ -116,6 +165,15 @@
reagent_state = LIQUID
color = "#FFA500"
+/datum/reagent/sorium/reaction_turf(turf/T, volume) // oh no
+ if(prob(75))
+ return
+ if(isspaceturf(T))
+ return
+ if(!T.reagents)
+ T.create_reagents(50)
+ T.reagents.add_reagent("sorium", 5)
+
/datum/reagent/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
@@ -130,6 +188,15 @@
color = "#800080"
taste_message = "the end of the world"
+/datum/reagent/liquid_dark_matter/reaction_turf(turf/T, volume) //Oh gosh, why
+ if(prob(75))
+ return
+ if(isspaceturf(T))
+ return
+ if(!T.reagents)
+ T.create_reagents(50)
+ T.reagents.add_reagent("liquid_dark_matter", 5)
+
/datum/reagent/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
@@ -292,6 +359,12 @@
color = "#500064" // rgb: 80, 0, 100
taste_message = "corporate assets going to waste"
+/datum/reagent/plasma_dust/reaction_temperature(exposed_temperature, exposed_volume)
+ if(exposed_temperature >= T0C + 100)
+ fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8))
+ if(holder)
+ holder.del_reagent(id)
+
/datum/reagent/plasma_dust/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(3, FALSE)
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 3464b145f6a..78f46884273 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -65,17 +65,16 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
-/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times)
- for(var/atom/movable/X in orange(range, T))
+/proc/goonchem_vortex(turf/T, setting_type, volume)
+ if(setting_type)
+ playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
+ else
+ playsound(T, 'sound/effects/bang.ogg', 25, 1)
+ for(var/atom/movable/X in view(2 + setting_type + (volume > 30 ? 1 : 0), T))
if(istype(X, /obj/effect))
continue //stop pulling smoke and hotspots please
- if(istype(X, /atom/movable))
- if((X) && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT)
- if(setting_type)
- playsound(T, 'sound/effects/bang.ogg', 25, 1)
- for(var/i = 0, i < pull_times, i++)
- step_away(X,T)
- else
- playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
- for(var/i = 0, i < pull_times, i++)
- step_towards(X,T)
\ No newline at end of file
+ if(X && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT)
+ if(setting_type)
+ X.throw_at(T, 20 + round(volume * 2), 1 + round(volume / 10))
+ else
+ X.throw_at(get_edge_target_turf(T, get_dir(T, X)), 20 + round(volume * 2), 1 + round(volume / 10))
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index aa0a9c21714..d2499a06c54 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -19,9 +19,8 @@
/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
- for(var/turf/turf in range(1,T))
- new /obj/effect/hotspot(turf)
- explosion(T,0,0,2)
+ fireflash(holder.my_atom, 1)
+ explosion(T, 0, 0, 2)
/datum/chemical_reaction/krokodil
name = "Krokodil"
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index e06dec7de3f..c40c1213793 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -171,16 +171,6 @@
mix_message = "The mixture bubbles and gives off an unpleasant medicinal odor."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/chemical_reaction/ash
- name = "Ash"
- id = "ash"
- result = "ash"
- required_reagents = list("oil" = 1)
- result_amount = 0.5
- min_temp = T0C + 600
- mix_sound = null
- no_message = 1
-
/datum/chemical_reaction/colorful_reagent
name = "colorful_reagent"
id = "colorful_reagent"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 8248a88b349..6c0c1566414 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -83,9 +83,7 @@
min_temp = T0C + 150
/datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume)
- var/turf/T = get_turf(holder.my_atom)
- for(var/turf/turf in range(1,T))
- new /obj/effect/hotspot(turf)
+ fireflash(holder.my_atom, 1, 7000)
/datum/chemical_reaction/sorium
name = "Sorium"
@@ -98,7 +96,7 @@
if(holder.has_reagent("stabilizing_agent"))
return
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1))
+ goonchem_vortex(T, 0, created_volume)
holder.remove_reagent("sorium", created_volume)
/datum/chemical_reaction/sorium_vortex
@@ -111,7 +109,7 @@
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1))
+ goonchem_vortex(T, 0, created_volume)
holder.remove_reagent("sorium_vortex", created_volume)
/datum/chemical_reaction/liquid_dark_matter
@@ -125,7 +123,7 @@
if(holder.has_reagent("stabilizing_agent"))
return
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1))
+ goonchem_vortex(T, 1, created_volume)
holder.remove_reagent("liquid_dark_matter", created_volume)
/datum/chemical_reaction/ldm_vortex
@@ -138,7 +136,7 @@
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1))
+ goonchem_vortex(T, 1, created_volume)
holder.remove_reagent("ldm_vortex", created_volume)
/datum/chemical_reaction/blackpowder
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index d7fa514d29d..098708bde57 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -22,6 +22,12 @@
reagents.add_reagent(reagent_id, tank_volume)
..()
+/obj/structure/reagent_dispensers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
+ if(reagents)
+ for(var/i in 1 to 8)
+ reagents.temperature_reagents(exposed_temperature, exposed_volume)
+
/obj/structure/reagent_dispensers/proc/boom()
visible_message("[src] ruptures!")
chem_splash(loc, 5, list(reagents))
@@ -68,6 +74,7 @@
desc = "A tank full of industrial welding fuel. Do not consume."
icon_state = "fuel"
reagent_id = "fuel"
+ tank_volume = 4000
var/obj/item/assembly_holder/rig = null
var/accepts_rig = 1
@@ -85,13 +92,13 @@
boom()
/obj/structure/reagent_dispensers/fueltank/boom(var/rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion
- if(reagents.has_reagent("fuel"))
- if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder
- message_admins("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank
- log_game("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]")
- investigate_log("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]", INVESTIGATE_BOMB)
- explosion(loc, 0, 1, 5, 7, 10, flame_range = 5)
- qdel(src)
+ if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder
+ message_admins("A fueltank, last rigged by [lastrigger], was triggered at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank
+ log_game("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]")
+ investigate_log("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]", INVESTIGATE_BOMB)
+ if(reagents)
+ reagents.set_reagent_temp(1000) //uh-oh
+ qdel(src)
/obj/structure/reagent_dispensers/fueltank/blob_act()
boom()
@@ -168,7 +175,7 @@
investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
else
- ..()
+ return ..()
/obj/structure/reagent_dispensers/fueltank/Move()
..()
@@ -296,3 +303,4 @@
anchored = 1
density = 0
accepts_rig = 0
+ tank_volume = 1000