diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index ada5e6a9e5f..3d0ec87a8a2 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -1,5 +1,7 @@
/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(reagents)
+ reagents.temperature_reagents(exposed_temperature)
return null
@@ -10,6 +12,8 @@
/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
var/datum/gas_mixture/air_contents = return_air()
+ if(reagents)
+ reagents.temperature_reagents(exposed_temperature, 10, 300)
if(!air_contents)
return 0
if(active_hotspot)
@@ -55,31 +59,37 @@
var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
var/just_spawned = 1
var/bypassing = 0
+ var/fake = FALSE
+ var/burn_time = 0
/obj/effect/hotspot/New()
..()
- SSair.hotspots += src
- perform_exposure()
+ if(!fake)
+ SSair.hotspots += src
+ perform_exposure()
dir = pick(cardinal)
air_update_turf()
/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)
@@ -89,7 +99,7 @@
color = heat2color(temperature)
set_light(l_color = color)
- return 0
+ return FALSE
/obj/effect/hotspot/process()
@@ -155,7 +165,8 @@
/obj/effect/hotspot/Destroy()
set_light(0)
SSair.hotspots -= src
- DestroyTurf()
+ if(!fake)
+ DestroyTurf()
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.active_hotspot == src)
@@ -182,3 +193,147 @@
..()
if(isliving(L))
L.fire_act()
+
+/obj/effect/hotspot/fake // Largely for the fireflash procs below
+ fake = TRUE
+ burn_time = 30
+
+/obj/effect/hotspot/fake/New()
+ ..()
+ if(burn_time)
+ QDEL_IN(src, burn_time)
+
+/proc/fireflash(atom/center, radius, temp)
+ if(!temp)
+ temp = rand(2800, 3200)
+ for(var/turf/T in view(radius, get_turf(center)))
+ if(isspaceturf(T))
+ continue
+ if(locate(/obj/effect/hotspot) in T)
+ continue
+ if(!can_line(get_turf(center), T, radius + 1))
+ continue
+
+ var/obj/effect/hotspot/fake/H = new(T)
+ H.temperature = temp
+ H.volume = 400
+ H.color = heat2color(H.temperature)
+ H.set_light(l_color = H.color)
+
+ T.hotspot_expose(H.temperature, H.volume)
+ for(var/atom/A in T)
+ if(isliving(A))
+ continue
+ if(A != H)
+ A.fire_act(null, H.temperature, H.volume)
+
+ if(isfloorturf(T))
+ 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/fake/H = new(T)
+ need_expose = TRUE
+ H.temperature = temp - dist * falloff
+ expose_temp = H.temperature
+ H.volume = 400
+ H.color = heat2color(H.temperature)
+ H.set_light(l_color = H.color)
+ 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
+ existing_hotspot.color = heat2color(existing_hotspot.temperature)
+ existing_hotspot.set_light(l_color = existing_hotspot.color)
+
+ affected[T] = existing_hotspot.temperature
+ if(need_expose && expose_temp)
+ T.hotspot_expose(expose_temp, existing_hotspot.volume)
+ for(var/atom/A in T)
+ if(isliving(A))
+ continue
+ if(A != existing_hotspot)
+ A.fire_act(null, expose_temp, existing_hotspot.volume)
+ if(isfloorturf(T))
+ 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 = (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 d9039e8c004..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
@@ -1165,7 +1182,7 @@ var/global/list/common_tools = list(
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/O = W
if(O.isOn())
- return 3800
+ return 2500
else
return 0
if(istype(W, /obj/item/lighter))
@@ -1207,7 +1224,7 @@ var/global/list/common_tools = list(
else
return 0
if(istype(W, /obj/item/assembly/igniter))
- return 1000
+ return 20000
else
return 0
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 76ef6bf5031..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
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 58197cbadf1..91132a5f9bd 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -311,8 +311,9 @@
/atom/proc/blob_act(obj/structure/blob/B)
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
-/atom/proc/fire_act()
- return
+/atom/proc/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ if(reagents)
+ reagents.temperature_reagents(exposed_temperature)
/atom/proc/emag_act()
return
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 6edc8e67ecc..a96b3e18620 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -46,7 +46,7 @@
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
-/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5))
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 644383f344d..4bdc2cafddd 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -45,7 +45,7 @@
GLOB.poi_list.Remove(src)
return ..()
-/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
return
/obj/structure/blob/core/update_icon()
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 19ac320287a..32b6ce1f408 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -20,7 +20,7 @@
var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay")
src.overlays += C
-/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
return
/obj/structure/blob/node/Destroy()
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index 1fb293be2cf..696a33d94b9 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -3,9 +3,9 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
- health = 75
+ health = 75
fire_resist = 2
- var/maxHealth = 75
+ var/maxHealth = 75
/obj/structure/blob/shield/update_icon()
if(health <= 0)
@@ -13,7 +13,7 @@
return
return
-/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
return
/obj/structure/blob/shield/CanPass(atom/movable/mover, turf/target, height=0)
@@ -42,11 +42,11 @@
P.setAngle(new_angle_s)
P.firer = src //so people who fired the lasers are not immune to them when it reflects
visible_message("[P] reflects off [src]!")
- return -1// complete projectile permutation
+ return -1// complete projectile permutation
else
playsound(src, P.hitsound, 50, 1)
visible_message("[src] is hit by \a [P]!")
take_damage(P.damage, P.damage_type)
-
+
/obj/structure/blob/shield/reflective/bullet_act()
return
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 7d55f2fe1c9..ba3ad1dada8 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -45,7 +45,7 @@
Life()
return
-/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
take_damage(damage, BURN)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 5ed9af46fe1..dbe3146dd7f 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -868,7 +868,7 @@ var/global/list/multiverse = list()
var/area/A = get_area(src)
to_chat(victim, "You feel a dark presence from [A.name]")
-/obj/item/voodoo/fire_act()
+/obj/item/voodoo/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(target)
target.adjust_fire_stacks(20)
target.IgniteMob()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 1be5fa5e43a..95e609ee524 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -244,6 +244,7 @@ update_flag
return 0
/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > temperature_resistance)
health -= 5
healthcheck()
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 53fab536afd..8e3c7f76342 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -171,6 +171,7 @@
assemblytype = /obj/structure/door_assembly/door_assembly_plasma
/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
PlasmaBurn(exposed_temperature)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 1ab22f341b6..21ff909796f 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -205,9 +205,9 @@
qdel(src)
/obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > T0C + (reinf ? 1600 : 800))
take_damage(round(exposed_volume / 200), BURN, 0, 0)
- ..()
/obj/machinery/door/window/attack_ai(mob/user)
return attack_hand(user)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index b949028c713..f1651d5bb99 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -52,6 +52,7 @@ FIRE ALARM
playsound(loc, 'sound/effects/sparks4.ogg', 50, 1)
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
+ ..()
if(!emagged && detecting && temperature > T0C + 200)
alarm() // added check of detector status here
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index e8e4ae6027b..6cfd1d63942 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -721,6 +721,7 @@
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL, MECHA_INT_CONTROL_LOST, MECHA_INT_SHORT_CIRCUIT), 1)
/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > max_temperature)
log_message("Exposed to dangerous temperature.", 1)
take_damage(5, "fire")
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index aef1999ff69..d601283a703 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -90,7 +90,8 @@
icon_state = "cobweb1"
burntime = 1
-/obj/effect/decal/cleanable/cobweb/fire_act()
+/obj/effect/decal/cleanable/cobweb/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
qdel(src)
/obj/effect/decal/cleanable/molten_object
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 130a50cac89..52ec24df16c 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -35,22 +35,9 @@
if(!reagents.total_volume && !noclear) //scooped up all of it
qdel(src)
return
- if(is_hot(W)) //todo: make heating a reagent holder proc
- if(istype(W, /obj/item/clothing/mask/cigarette))
- return
- else
- src.reagents.chem_temp += 15
- src.reagents.handle_reactions()
- to_chat(user, "You heat [src] with [W]!")
/obj/effect/decal/cleanable/ex_act()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
R.on_ex_act()
- ..()
-
-/obj/effect/decal/cleanable/fire_act()
- if(reagents)
- reagents.chem_temp += 30
- reagents.handle_reactions()
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_chem_smoke.dm b/code/game/objects/effects/effect_system/effects_chem_smoke.dm
index d68692a03e6..4b720a607ea 100644
--- a/code/game/objects/effects/effect_system/effects_chem_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_chem_smoke.dm
@@ -7,6 +7,7 @@
icon_state = "smoke"
density = FALSE
opacity = FALSE
+ layer = ABOVE_MOB_LAYER
animate_movement = NO_STEPS
var/matrix/first = matrix()
var/matrix/second = matrix()
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 0a8436867be..6d746377ec7 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -84,7 +84,10 @@
// foam disolves when heated
// except metal foams
-/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/effect/particle_effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) //Don't heat the reagents inside
+ return
+
+/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) // overriden to prevent weird behaviors with heating reagents inside
if(!metal && prob(max(0, exposed_temperature - 475)))
flick("[icon_state]-disolve", src)
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index a08e7fac021..21b9759df62 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -12,8 +12,5 @@
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
-/obj/effect/fire_act()
- return
-
/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
return FALSE
\ No newline at end of file
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index 4cf5e79cc77..464d5c277fd 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -180,6 +180,7 @@
qdel(src)
/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
endurance -= 5
CheckEndurance()
diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm
index a67bbd3c5f7..08a64d62f17 100644
--- a/code/game/objects/effects/snowcloud.dm
+++ b/code/game/objects/effects/snowcloud.dm
@@ -113,7 +113,8 @@
else
return ..()
-/obj/effect/snow/fire_act()
+/obj/effect/snow/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
qdel(src)
/obj/effect/snow/ex_act(severity)
@@ -133,7 +134,8 @@
..()
qdel(src)
-/obj/item/snowball/fire_act()
+/obj/item/snowball/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
qdel(src)
/obj/item/snowball/ex_act(severity)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 7ea087eb8cb..f0233bb0f9e 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -69,6 +69,7 @@
qdel(src)
/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
health -= 5
healthcheck()
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8b9314e9a6f..880043c8be6 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -211,3 +211,21 @@
pixel_x = rand(-4,4)
pixel_y = rand(-4,4)
animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25)
+
+/obj/effect/temp_visual/shockwave
+ name = "shockwave"
+ icon = 'icons/goonstation/effects/64x64.dmi'
+ icon_state = "shockwave"
+ randomdir = FALSE
+ pixel_y = -16
+ pixel_x = -16
+ duration = 20
+
+/obj/effect/temp_visual/implosion
+ name = "implosion"
+ icon = 'icons/goonstation/effects/64x64.dmi'
+ icon_state = "implosion"
+ randomdir = FALSE
+ pixel_y = -16
+ pixel_x = -16
+ duration = 20
\ No newline at end of file
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index f4f527c1b7f..85780484264 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -51,7 +51,8 @@
light("[user] tilts [C] and lights [src] with it.")
-/obj/item/candle/fire_act()
+/obj/item/candle/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
if(!lit)
light() //honk
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 4eaf0e79dce..d3d0a2fe6bb 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -47,7 +47,7 @@
update_icon()
-/obj/item/taperecorder/fire_act()
+/obj/item/taperecorder/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
mytape.ruin() //Fires destroy the tape
return ..()
@@ -262,7 +262,8 @@
var/list/timestamp = list()
var/ruined = 0
-/obj/item/tape/fire_act()
+/obj/item/tape/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
ruin()
/obj/item/tape/attack_self(mob/user)
diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm
index 4f8abd4ac49..3ba466b7eec 100644
--- a/code/game/objects/items/flag.dm
+++ b/code/game/objects/items/flag.dm
@@ -21,7 +21,7 @@
user.visible_message("[user] [rolled ? "rolls up" : "unfurls"] [src].", "You [rolled ? "roll up" : "unfurl"] [src].", "You hear fabric rustling.")
update_icon()
-/obj/item/flag/fire_act(global_overlay = FALSE)
+/obj/item/flag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = FALSE)
..()
update_icon()
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index d7585608ec7..771ccce0f6b 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -50,9 +50,9 @@
burst()
/obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume)
+ ..()
if(temperature > T0C+100)
burst()
- return
/obj/item/latexballon/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/tank))
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 615882021b4..c7a27b5650e 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -179,7 +179,8 @@ var/global/list/datum/stack_recipe/adamantine_recipes = list(
else
return ..()
-/obj/item/stack/sheet/mineral/plasma/fire_act()
+/obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, amount*10)
qdel(src)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index b4405a9fbe5..67fcacbe91a 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -275,7 +275,8 @@
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
-/obj/item/toy/snappop/fire_act()
+/obj/item/toy/snappop/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
pop_burst()
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
@@ -1689,5 +1690,5 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/restraints/handcuffs/toy
desc = "Toy handcuffs. Plastic and extremely cheaply made."
throwforce = 0
- breakouttime = 0
+ breakouttime = 0
ignoresClumsy = TRUE
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index bfe91b5a81b..1378b5c004d 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -61,7 +61,8 @@ LIGHTERS ARE IN LIGHTERS.DM
return ..()
-/obj/item/clothing/mask/cigarette/fire_act()
+/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
light()
/obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, params)
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index 0b348510b8e..a2d8b03da84 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -166,7 +166,8 @@
location.hotspot_expose(700, 5)
return
-/obj/item/match/fire_act()
+/obj/item/match/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
matchignite()
/obj/item/match/proc/matchignite()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index e90a7bb4b6d..5eb7a5b30ff 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -469,7 +469,6 @@
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
if(!proximity)
return
-
if(welding)
remove_fuel(1)
var/turf/location = get_turf(user)
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 3ab8de69f7f..246fc5df75d 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -93,7 +93,7 @@
/obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
collision_damage(pusher, force, direction)
return TRUE
-
+
/obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10)
take_damage(amt, BRUTE)
@@ -163,14 +163,15 @@
//// FIRE
-/obj/fire_act(global_overlay=1)
+/obj/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
if(!burn_state)
burn_state = ON_FIRE
SSfires.processing[src] = src
burn_world_time = world.time + burntime*rand(10,20)
if(global_overlay)
overlays += fire_overlay
- return 1
+ return TRUE
/obj/proc/burn()
empty_object_contents(1, loc)
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 111da862e97..90e32882087 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -158,6 +158,7 @@
new /obj/structure/alien/weeds(T, linked_node)
/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
take_damage(5, BURN, 0, 0)
@@ -295,6 +296,7 @@
Burst(kill = TRUE)
/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 500)
take_damage(5, BURN, 0, 0)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 61113a4864a..8c4f40a7b62 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -245,7 +245,7 @@ LINEN BINS
else icon_state = "linenbin-full"
-/obj/structure/bedsheetbin/fire_act()
+/obj/structure/bedsheetbin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!amount)
return
..()
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 6851cd3cfc5..9b777d45b58 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -249,6 +249,7 @@
qdel(src)
/obj/structure/falsewall/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
burnbabyburn()
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index b46324a838c..b3468668f5a 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -48,6 +48,7 @@
qdel(src)
/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature)
+ ..()
var/temp_check = exposed_temperature
if(temp_check >= GIRDER_MELTING_TEMP)
take_damage(10)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 8d3e178fe58..c06e5d82244 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -261,10 +261,10 @@
return 0
/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(!broken)
if(exposed_temperature > T0C + 1500)
take_damage(1, BURN, 0, 0)
- ..()
/obj/structure/grille/hitby(atom/movable/AM)
if(istype(AM, /obj))
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index e0e9ba1b6a7..5e6e72929fe 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -229,6 +229,7 @@
return ..()
/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
TemperatureAct(exposed_temperature)
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 090327d1c7f..88adc9643ba 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -169,6 +169,7 @@
icon_state = "xeno"
/obj/structure/statue/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
PlasmaBurn(exposed_temperature)
@@ -359,7 +360,8 @@
else
return ..()
-/obj/structure/snowman/built/fire_act()
+/obj/structure/snowman/built/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
qdel(src)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index cf87454a97c..ad655a39b64 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -461,9 +461,9 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
overlays += crack_overlay
/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > (T0C + heat_resistance))
take_damage(round(exposed_volume / 100), BURN, 0, 0)
- ..()
/obj/structure/window/GetExplosionBlock()
return reinf && fulltile ? real_explosion_block : 0
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/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index 38f1bdc14a1..d201a38d697 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -33,6 +33,7 @@
icons = list("plasma","plasma_dam")
/turf/simulated/floor/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
PlasmaBurn()
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 300)
PlasmaBurn(exposed_temperature)
@@ -246,6 +247,9 @@
/turf/simulated/wall/mineral/titanium/nodecon/thermitemelt(mob/user as mob, speed)
return
+/turf/simulated/wall/mineral/titanium/nodecon/burn_down()
+ return
+
/////////////////////Plastitanium walls/////////////////////
/turf/simulated/wall/mineral/plastitanium
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 7eb81c589e1..677357cf170 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -282,6 +282,9 @@
/turf/proc/Bless()
flags |= NOJAUNT
+/turf/proc/burn_down()
+ return
+
/////////////////////////////////////////////////////////////////////////
// Navigation procs
// Used for A-star pathfinding
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 55e87f575b0..7d52d7cd969 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -684,6 +684,7 @@
wither()
/obj/structure/spacevine/temperature_expose(null, temp, volume)
+ ..()
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.process_temperature(src, temp, volume)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 2c9c2480a4b..52a4a9dcd35 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -106,17 +106,6 @@
return FALSE
-/obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
- return FALSE
- if(is_hot(I))
- if(reagents)
- reagents.chem_temp += 15
- to_chat(user, "You heat [src] with [I].")
- reagents.handle_reactions()
- else
- return ..()
-
/obj/item/reagent_containers/food/drinks/examine(mob/user)
if(!..(user, 1))
return
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index f5bd0e8e4eb..bdc473d774e 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -27,7 +27,7 @@
else
..()
-/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act()
+/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!reagents.total_volume)
return
..()
diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
index 393543b093c..cd158c70e74 100644
--- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
@@ -51,7 +51,7 @@
if(A.volume >= 5 && A.alcohol_perc >= 0.35) //Only an approximation to if something's flammable but it will do
return TRUE
-/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(global_overlay = FALSE)
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = FALSE)
if(!isShotFlammable() || burn_state == ON_FIRE) //You can't light a shot that's not flammable!
return
..()
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 605f5082522..0d60c7d864f 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -151,5 +151,4 @@
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/goonstation/misc/fuse.ogg', seed.potency, 0)
- reagents.chem_temp = 1000 //Sets off the black powder
- reagents.handle_reactions()
+ reagents.set_reagent_temp(1000) //Sets off the black powder
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index f71cd6ed86a..4ed9d963274 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -153,7 +153,8 @@
Burn()
processing_objects.Add(src)
-/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume)
+/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
StartBurning()
/obj/structure/bonfire/Crossed(atom/movable/AM)
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 08b81e1fd78..dda5fb47f78 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -52,7 +52,7 @@
F.attackby(OB, AM)
return ..()
-/obj/item/stack/ore/fire_act()
+/obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
if(isnull(refined_type))
return
diff --git a/code/modules/mob/living/carbon/_defines.dm b/code/modules/mob/living/carbon/_defines.dm
index 163ce8f7c8d..483502965da 100644
--- a/code/modules/mob/living/carbon/_defines.dm
+++ b/code/modules/mob/living/carbon/_defines.dm
@@ -4,7 +4,7 @@
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
-#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 1000K point
+#define HEAT_DAMAGE_LEVEL_3 5 //Amount of damage applied when your body temperature passes the 1000K point
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 5294e3bda91..04dcb0c60ef 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -65,9 +65,9 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(exposed_temperature > 300)
Die()
- return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
Attach(M)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 965a2c81ab2..84764bfddaa 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -513,3 +513,12 @@ emp_act
return TRUE
if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
return TRUE
+
+/mob/living/carbon/human/proc/reagent_safety_check(hot = TRUE)
+ if(wear_mask)
+ to_chat(src, "Your [wear_mask.name] protects you from the [hot ? "hot" : "cold"] liquid!")
+ return FALSE
+ if(head)
+ to_chat(src, "Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!")
+ return FALSE
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index f65faaba70d..0641ce380f5 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -179,7 +179,8 @@
var/turf/location = get_turf(src)
location.hotspot_expose(700, 50, 1)
-/mob/living/fire_act()
+/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
adjust_fire_stacks(3)
IgniteMob()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 752cdc0f631..5f37177f674 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -230,7 +230,7 @@
if(on_fire)
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning")
-/mob/living/silicon/robot/fire_act()
+/mob/living/silicon/robot/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
IgniteMob()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 8e176a19131..d5ca6b0b0f8 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -401,7 +401,7 @@
add_fingerprint(user)
-/obj/item/paper/fire_act()
+/obj/item/paper/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read.
info = "[stars(info)]"
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a3f41c0ac25..e8643c97cff 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -12,7 +12,7 @@
var/amount = 30 //How much paper is in the bin.
var/list/papers = list() //List of papers put in the bin for reference.
-/obj/item/paper_bin/fire_act()
+/obj/item/paper_bin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!amount)
return
..()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index dcd884da879..8dda1ed8731 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -586,6 +586,7 @@
// called when on fire
/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ..()
if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C
broken()
diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm
index e586e6f806b..c73ffc72ced 100644
--- a/code/modules/reagents/chem_splash.dm
+++ b/code/modules/reagents/chem_splash.dm
@@ -25,8 +25,7 @@
for(var/datum/reagents/R in reactants)
R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1)
total_temp += R.chem_temp
- splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat.
- splash_holder.handle_reactions() // React them now.
+ splash_holder.set_reagent_temp((total_temp / reactants.len) + extra_heat) // Average temperature of reagents + extra heat.
if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around.
var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index fa2a8d71a9a..95dece3ad75 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -9,7 +9,7 @@ var/const/INGEST = 2
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
- var/chem_temp = 300
+ var/chem_temp = T20C
var/list/datum/reagent/addiction_list = new/list()
var/flags
@@ -166,6 +166,30 @@ var/const/INGEST = 2
handle_reactions()
return amount
+/datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE)
+ chem_temp = new_temp
+ if(react)
+ temperature_react()
+ handle_reactions()
+
+/datum/reagents/proc/temperature_react() //Calls the temperature reaction procs without changing the temp.
+ for(var/datum/reagent/current_reagent in reagent_list)
+ current_reagent.reaction_temperature(chem_temp, 100)
+
+/datum/reagents/proc/temperature_reagents(exposed_temperature, divisor = 35, change_cap = 15) //This is what you use to change the temp of a reagent holder.
+ //Do not manually change the reagent unless you know what youre doing.
+ var/difference = abs(chem_temp - exposed_temperature)
+ var/change = min(max((difference / divisor), 1), change_cap)
+ if(exposed_temperature > chem_temp)
+ chem_temp += change
+ else if(exposed_temperature < chem_temp)
+ chem_temp -= change
+
+ chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment.
+ temperature_react()
+
+ handle_reactions()
+
/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
if(!target)
return
@@ -194,8 +218,7 @@ var/const/INGEST = 2
/datum/reagents/proc/metabolize(mob/living/M)
if(M)
- chem_temp = M.bodytemperature
- handle_reactions()
+ set_reagent_temp(M.bodytemperature)
// a bitfield filled in by each reagent's `on_mob_life` to find out which states to update
var/update_flags = STATUS_UPDATE_NONE
@@ -531,6 +554,35 @@ var/const/INGEST = 2
react_type = "OBJ"
else
return
+
+ if(react_type == "LIVING" && ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(method == TOUCH)
+ var/obj/item/organ/external/head/affecting = H.get_organ("head")
+ if(affecting)
+ if(chem_temp > H.dna.species.heat_level_1)
+ if(H.reagent_safety_check())
+ to_chat(H, "You are scalded by the hot chemicals!")
+ affecting.receive_damage(0, round(log(chem_temp / 50) * 10))
+ H.emote("scream")
+ H.adjust_bodytemperature(min(max((chem_temp - T0C) - 20, 5), 500))
+ else if(chem_temp < H.dna.species.cold_level_1)
+ if(H.reagent_safety_check(FALSE))
+ to_chat(H, "You are frostbitten by the freezing cold chemicals!")
+ affecting.receive_damage(0, round(log(T0C - chem_temp / 50) * 10))
+ H.emote("scream")
+ H.adjust_bodytemperature(- min(max(T0C - chem_temp - 20, 5), 500))
+
+ if(method == INGEST)
+ if(chem_temp > H.dna.species.heat_level_1)
+ to_chat(H, "You scald yourself trying to consume the boiling hot substance!")
+ H.adjustFireLoss(7)
+ H.adjust_bodytemperature(min(max((chem_temp - T0C) - 20, 5), 700))
+ else if(chem_temp < H.dna.species.cold_level_1)
+ to_chat(H, "You frostburn yourself trying to consume the freezing cold substance!")
+ H.adjustFireLoss(7)
+ H.adjust_bodytemperature(- min(max((T0C - chem_temp) - 20, 5), 700))
+
for(var/datum/reagent/R in reagent_list)
switch(react_type)
if("LIVING")
@@ -548,14 +600,14 @@ var/const/INGEST = 2
var/amt = list_reagents[r_id]
add_reagent(r_id, amt, data)
-/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0)
+/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = T20C, no_react = 0)
if(!isnum(amount))
return 1
update_total()
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
if(amount <= 0)
return 0
- chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
+ chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems
for(var/A in reagent_list)
@@ -567,6 +619,7 @@ var/const/INGEST = 2
my_atom.on_reagent_change()
R.on_merge(data)
if(!no_react)
+ temperature_react()
handle_reactions()
return 0
@@ -585,6 +638,7 @@ var/const/INGEST = 2
if(my_atom)
my_atom.on_reagent_change()
if(!no_react)
+ temperature_react()
handle_reactions()
return 0
else
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 1b84afb3d74..2db474b39c4 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -7,8 +7,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 40
var/obj/item/reagent_containers/beaker = null
- var/desired_temp = 300
- var/heater_coefficient = 0.03
+ var/desired_temp = T0C
var/on = FALSE
/obj/machinery/chem_heater/New()
@@ -19,34 +18,22 @@
component_parts += new /obj/item/stock_parts/console_screen(null)
RefreshParts()
-/obj/machinery/chem_heater/upgraded/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/chem_heater(null)
- component_parts += new /obj/item/stock_parts/micro_laser/ultra(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/chem_heater/RefreshParts()
- heater_coefficient = 0.03
- for(var/obj/item/stock_parts/micro_laser/M in component_parts)
- heater_coefficient *= M.rating
-
/obj/machinery/chem_heater/process()
..()
if(stat & NOPOWER)
return
- var/state_change = 0
+ var/state_change = FALSE
if(on)
if(beaker)
- if(beaker.reagents.chem_temp > desired_temp)
- beaker.reagents.chem_temp += min(-1, max((desired_temp - beaker.reagents.chem_temp) * heater_coefficient, -15))
- if(beaker.reagents.chem_temp < desired_temp)
- beaker.reagents.chem_temp += max(1, min((desired_temp - beaker.reagents.chem_temp) * heater_coefficient, 15))
- beaker.reagents.chem_temp = round(beaker.reagents.chem_temp) //stops stuff like 456.12312312302
-
- beaker.reagents.handle_reactions()
- state_change = 1
+ if(!beaker.reagents.total_volume)
+ on = FALSE
+ SSnanoui.update_uis(src)
+ return
+ beaker.reagents.temperature_reagents(desired_temp)
+ beaker.reagents.temperature_reagents(desired_temp)
+ if(abs(beaker.reagents.chem_temp - desired_temp) <= 3)
+ on = FALSE
+ state_change = TRUE
if(state_change)
SSnanoui.update_uis(src)
@@ -54,7 +41,6 @@
/obj/machinery/chem_heater/proc/eject_beaker()
if(beaker)
beaker.forceMove(get_turf(src))
- beaker.reagents.handle_reactions()
beaker = null
icon_state = "mixer0b"
on = FALSE
@@ -108,9 +94,11 @@
/obj/machinery/chem_heater/Topic(href, href_list)
if(..())
- return 0
+ return FALSE
if(href_list["toggle_on"])
+ if(!beaker.reagents.total_volume)
+ return FALSE
on = !on
. = 1
@@ -122,7 +110,7 @@
var/target = input("Please input the target temperature", name) as num
desired_temp = Clamp(target, 0, 1000)
else
- return 0
+ return FALSE
. = 1
if(href_list["eject_beaker"])
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 7e76217fe15..79c23d8dfad 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -33,6 +33,9 @@
. = ..()
holder = null
+/datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing.
+ return
+
/datum/reagent/proc/reaction_mob(mob/living/M, method = TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(holder) //for catching rare runtimes
if(method == TOUCH && penetrates_skin)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm
index 88e2d685f57..d2fb4eec567 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol.dm
@@ -1126,7 +1126,7 @@
/datum/reagent/consumable/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST && prob(20))
if(M.on_fire)
- M.adjust_fire_stacks(3)
+ M.adjust_fire_stacks(6)
/datum/reagent/consumable/ethanol/dragons_breath/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1148,7 +1148,7 @@
if(prob(2 * volume))
to_chat(M, "OH GOD OH GOD PLEASE NO!!")
if(M.on_fire)
- M.adjust_fire_stacks(5)
+ M.adjust_fire_stacks(20)
if(prob(50))
to_chat(M, "IT BURNS!!!!")
M.visible_message("[M] is consumed in flames!")
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index 7e015a006e8..9277ba33fd9 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -205,6 +205,18 @@
taste_message = "motor oil"
process_flags = ORGANIC | SYNTHETIC
+/datum/reagent/oil/reaction_temperature(exposed_temperature, exposed_volume)
+ if(exposed_temperature > 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 857b15330d4..fb58e351a03 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -1,3 +1,80 @@
+/datum/reagent/phlogiston
+ name = "phlogiston"
+ id = "phlogiston"
+ description = "It appears to be liquid fire."
+ reagent_state = LIQUID
+ color = "#FFAF00"
+ process_flags = ORGANIC | SYNTHETIC
+ var/temp_fire = 4000
+ var/temp_deviance = 1000
+ var/size_divisor = 40
+ var/mob_burning = 6.6 // 33
+
+/datum/reagent/phlogiston/reaction_turf(turf/T, volume)
+ if(holder.chem_temp <= T0C - 50)
+ return
+ var/radius = min(max(0, volume / size_divisor), 8)
+ fireflash_sm(T, radius, rand(temp_fire - temp_deviance, temp_fire + temp_deviance), 500)
+
+/datum/reagent/phlogiston/reaction_mob(mob/living/M, method = TOUCH, volume)
+ if(holder.chem_temp <= T0C - 50)
+ return
+ M.adjust_fire_stacks(mob_burning)
+ M.IgniteMob()
+ if(method == INGEST)
+ M.adjustFireLoss(min(max(15, volume * 3), 45))
+ to_chat(M, "It burns!")
+ M.emote("scream")
+
+/datum/reagent/phlogiston/on_mob_life(mob/living/M)
+ if(holder.chem_temp <= T0C - 50)
+ return
+ M.adjust_fire_stacks(0.4)
+ M.IgniteMob()
+ return ..()
+
+/datum/reagent/phlogiston/firedust
+ name = "phlogiston dust"
+ id = "phlogiston_dust"
+ description = "And this is solid fire. However that works."
+ temp_fire = 1500
+ temp_deviance = 500
+ size_divisor = 80
+ mob_burning = 3 // 15
+
+/datum/reagent/napalm
+ name = "napalm"
+ id = "napalm"
+ description = "A highly flammable jellied fuel."
+ reagent_state = LIQUID
+ process_flags = ORGANIC | SYNTHETIC
+ color = "#C86432"
+
+/datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume)
+ if(exposed_temperature > T0C + 100)
+ var/radius = min(max(0, volume * 0.15), 8)
+ fireflash_sm(get_turf(holder.my_atom), radius, rand(3000, 6000), 500)
+ if(holder)
+ holder.del_reagent(id)
+
+/datum/reagent/napalm/reaction_turf(turf/T, volume)
+ if(isspaceturf(T))
+ return
+ if(!T.reagents)
+ T.create_reagents(volume)
+ T.reagents.add_reagent("napalm", volume)
+
+/datum/reagent/napalm/reaction_mob(mob/living/M, method = TOUCH, volume)
+ if(method == TOUCH)
+ if(M.on_fire)
+ M.adjust_fire_stacks(14)
+ M.emote("scream")
+
+/datum/reagent/napalm/on_mob_life(mob/living/M)
+ if(M.on_fire)
+ M.adjust_fire_stacks(2)
+ return ..()
+
/datum/reagent/fuel
name = "Welding fuel"
id = "fuel"
@@ -8,12 +85,54 @@
drink_name = "Glass of welder fuel"
drink_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
taste_message = "mistakes"
+ process_flags = ORGANIC | SYNTHETIC
+ 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/on_mob_life(mob/living/M)
+ if(M.on_fire)
+ M.adjust_fire_stacks(0.4)
+ return ..()
+
+/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)
- M.adjust_fire_stacks(volume / 10)
- return
- ..()
+ if(M.on_fire)
+ M.adjust_fire_stacks(6)
/datum/reagent/plasma
name = "Plasma"
@@ -23,6 +142,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)
@@ -33,10 +158,10 @@
C.adjustPlasma(10)
return ..() | update_flags
-/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel!
+/datum/reagent/plasma/reaction_mob(mob/living/M, method = TOUCH, volume)//Splashing people with plasma is stronger than fuel!
if(method == TOUCH)
- M.adjust_fire_stacks(volume / 5)
- ..()
+ if(M.on_fire)
+ M.adjust_fire_stacks(6)
/datum/reagent/thermite
@@ -48,11 +173,32 @@
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_mob(mob/living/M, method= TOUCH, volume)
+ if(method == TOUCH)
+ if(M.on_fire)
+ M.adjust_fire_stacks(20)
+
+/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, 10, 300)
/datum/reagent/glycerol
name = "Glycerol"
@@ -81,33 +227,24 @@
taste_message = null
/datum/reagent/clf3/on_mob_life(mob/living/M)
- var/update_flags = STATUS_UPDATE_NONE
- M.adjust_fire_stacks(2)
- var/burndmg = max(0.3*M.fire_stacks, 0.3)
- update_flags |= M.adjustFireLoss(burndmg, FALSE)
- return ..() | update_flags
+ if(M.on_fire)
+ M.adjust_fire_stacks(1)
+ return ..()
-/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)
- M.adjust_fire_stacks(min(volume/5, 10))
+/datum/reagent/clf3/reaction_mob(mob/living/M, method = TOUCH, volume)
+ if(method == TOUCH || method == INGEST)
+ M.adjust_fire_stacks(10)
M.IgniteMob()
- M.bodytemperature += 30
+ if(method == INGEST)
+ M.adjustFireLoss(min(max(30, volume * 6), 90))
+ to_chat(M, "It burns!")
+ M.emote("scream")
/datum/reagent/sorium
name = "Sorium"
@@ -116,6 +253,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 +276,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"
@@ -157,6 +312,7 @@
description = "Makes a very bright flash."
reagent_state = LIQUID
color = "#FFFF00"
+ penetrates_skin = TRUE
/datum/reagent/smoke_powder
name = "Smoke Powder"
@@ -171,42 +327,7 @@
description = "Makes a deafening noise."
reagent_state = LIQUID
color = "#0000FF"
-
-/datum/reagent/phlogiston
- name = "Phlogiston"
- id = "phlogiston"
- description = "Catches you on fire and makes you ignite."
- reagent_state = LIQUID
- color = "#FF9999"
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/phlogiston/on_mob_life(mob/living/M)
- var/update_flags = STATUS_UPDATE_NONE
- M.adjust_fire_stacks(1)
- var/burndmg = max(0.3*M.fire_stacks, 0.3)
- update_flags |= M.adjustFireLoss(burndmg, FALSE)
- return ..() | update_flags
-
-/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume)
- M.adjust_fire_stacks(1)
- M.IgniteMob()
- ..()
-
-/datum/reagent/napalm
- name = "Napalm"
- id = "napalm"
- description = "Very flammable."
- reagent_state = LIQUID
- color = "#FF9999"
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/napalm/on_mob_life(mob/living/M)
- M.adjust_fire_stacks(1)
- return ..()
-
-/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- M.adjust_fire_stacks(min(volume/4, 20))
+ penetrates_skin = TRUE
/datum/reagent/cryostylane
name = "Cryostylane"
@@ -223,11 +344,16 @@
/datum/reagent/cryostylane/on_tick()
if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp -= 10
- holder.handle_reactions()
+ holder.remove_reagent("oxygen", 2)
+ holder.remove_reagent("cryostylane", 2)
+ holder.temperature_reagents(holder.chem_temp - 200)
+ holder.temperature_reagents(holder.chem_temp - 200)
..()
+/datum/reagent/cryostylane/reaction_mob(mob/living/M, method = TOUCH, volume)
+ if(method == TOUCH)
+ M.ExtinguishMob()
+
/datum/reagent/cryostylane/reaction_turf(turf/T, volume)
if(volume >= 5)
for(var/mob/living/carbon/slime/M in T)
@@ -248,9 +374,10 @@
/datum/reagent/pyrosium/on_tick()
if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp += 10
- holder.handle_reactions()
+ holder.remove_reagent("oxygen", 2)
+ holder.remove_reagent("pyrosium", 2)
+ holder.temperature_reagents(holder.chem_temp + 200)
+ holder.temperature_reagents(holder.chem_temp + 200)
..()
/datum/reagent/firefighting_foam
@@ -264,8 +391,7 @@
/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
// Put out fire
if(method == TOUCH)
- M.adjust_fire_stacks(-(volume / 5)) // more effective than water
- M.ExtinguishMob()
+ M.adjust_fire_stacks(-10) // more effective than water
/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume)
O.extinguish()
@@ -290,6 +416,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/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 6d8ea272cfe..5623023659b 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -23,8 +23,7 @@
/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
// Put out fire
- M.adjust_fire_stacks(-(volume / 10))
- M.ExtinguishMob()
+ M.adjust_fire_stacks(-(volume * 0.2))
if(ishuman(M))
var/mob/living/carbon/human/H = M
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 3464b145f6a..288abeb5f4d 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -65,17 +65,18 @@ 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)
+ new /obj/effect/temp_visual/implosion(T)
+ playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
+ else
+ new /obj/effect/temp_visual/shockwave(T)
+ 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/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm
index c348db060ff..2f3eda996b0 100644
--- a/code/modules/reagents/chemistry/recipes/drinks.dm
+++ b/code/modules/reagents/chemistry/recipes/drinks.dm
@@ -229,7 +229,7 @@
id = "flamingmoe"
result = "flamingmoe"
required_reagents = list("vodka" = 1, "gin" = 1, "cognac" = 1, "tequila" = 1, "salglu_solution" = 1) //Close enough
- min_temp = 374 //Fire makes it good!
+ min_temp = T0C + 100 //Fire makes it good!
result_amount = 5
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
mix_message = "The concoction bursts into flame!"
@@ -701,7 +701,7 @@
id = "applejack"
result = "applejack"
required_reagents = list("cider" = 2)
- max_temp = 270
+ max_temp = T0C
result_amount = 1
mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind."
mix_sound = null
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index e44ace8f511..d2499a06c54 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -15,13 +15,12 @@
result_amount = 5
mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
mix_sound = 'sound/goonstation/effects/crystalshatter.ogg'
- min_temp = 390
+ min_temp = T0C + 100
/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"
@@ -30,7 +29,7 @@
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
- min_temp = 380
+ min_temp = T0C + 100
mix_sound = 'sound/goonstation/misc/fuse.ogg'
/datum/chemical_reaction/methamphetamine
@@ -39,7 +38,7 @@
result = "methamphetamine"
required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
result_amount = 4
- min_temp = 374
+ min_temp = T0C + 100
/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
@@ -57,7 +56,7 @@
result = "bath_salts"
required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1)
result_amount = 6
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh."
mix_sound = 'sound/goonstation/misc/fuse.ogg'
diff --git a/code/modules/reagents/chemistry/recipes/food.dm b/code/modules/reagents/chemistry/recipes/food.dm
index ec732bba858..5b5efc105d6 100644
--- a/code/modules/reagents/chemistry/recipes/food.dm
+++ b/code/modules/reagents/chemistry/recipes/food.dm
@@ -124,7 +124,7 @@
result = "corn_syrup"
required_reagents = list("corn_starch" = 1, "sacid" = 1)
result_amount = 2
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "The mixture forms a viscous, clear fluid!"
/datum/chemical_reaction/vhfcs
@@ -176,7 +176,7 @@
result = "hydrogenated_soybeanoil"
required_reagents = list("soybeanoil" = 1, "hydrogen" = 1)
result_amount = 2
- min_temp = 520
+ min_temp = T0C + 250
mix_message = "The mixture emits a burnt, oily smell."
/datum/chemical_reaction/meatslurry
@@ -194,7 +194,7 @@
result = "gravy"
required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1)
result_amount = 3
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "The substance thickens and takes on a meaty odor."
/datum/chemical_reaction/beff
@@ -221,7 +221,7 @@
result = "enzyme"
required_reagents = list("vomit" = 1, "sugar" = 1)
result_amount = 2
- min_temp = 750
+ min_temp = T0C + 480
mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink."
mix_sound = 'sound/goonstation/misc/fuse.ogg'
@@ -231,6 +231,6 @@
result = "enzyme"
required_reagents = list("green_vomit" = 1, "sugar" = 1)
result_amount = 2
- min_temp = 750
+ min_temp = T0C + 480
mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink."
mix_sound = 'sound/goonstation/misc/fuse.ogg'
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 864733f6555..0897de76566 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -50,7 +50,7 @@
required_reagents = list("ash" = 1, "sodiumchloride" = 1)
result_amount = 2
mix_message = "The mixture yields a fine black powder."
- min_temp = 380
+ min_temp = T0C + 100
mix_sound = 'sound/goonstation/misc/fuse.ogg'
/datum/chemical_reaction/silver_sulfadiazine
@@ -92,7 +92,7 @@
result = "calomel"
required_reagents = list("mercury" = 1, "chlorine" = 1)
result_amount = 2
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "Stinging vapors rise from the solution."
/datum/chemical_reaction/potass_iodide
@@ -135,7 +135,7 @@
result = "perfluorodecalin"
required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
result_amount = 3
- min_temp = 370
+ min_temp = T0C + 100
mix_message = "The mixture rapidly turns into a dense pink liquid."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
@@ -195,7 +195,7 @@
result = null
required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
result_amount = 3
- min_temp = 374
+ min_temp = T0C + 100
/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume)
chemical_mob_spawn(holder, 1, "Life")
@@ -263,7 +263,7 @@
result = "liquid_solder"
required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
result_amount = 3
- min_temp = 370
+ min_temp = T0C + 100
mix_message = "The solution gently swirls with a metallic sheen."
/datum/chemical_reaction/corazone
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 0259ed89e86..c40c1213793 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -74,7 +74,7 @@
result = "diethylamine"
required_reagents = list ("ammonia" = 1, "ethanol" = 1)
result_amount = 2
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "A horrible smell pours forth from the mixture."
/datum/chemical_reaction/space_cleaner
@@ -98,7 +98,7 @@
id = "plastic_polymers"
result = null
required_reagents = list("oil" = 5, "sacid" = 2, "ash" = 3)
- min_temp = 374
+ min_temp = T0C + 100
result_amount = 1
/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume)
@@ -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 = 480
- mix_sound = null
- no_message = 1
-
/datum/chemical_reaction/colorful_reagent
name = "colorful_reagent"
id = "colorful_reagent"
@@ -195,7 +185,7 @@
result = null
required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
result_amount = 3
- min_temp = 374
+ min_temp = T0C + 100
/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -208,7 +198,7 @@
result = null
required_reagents = list("egg" = 1, "colorful_reagent" = 1, "chicken_soup" = 1, "strange_reagent" = 1, "blood" = 1)
result_amount = 5
- min_temp = 374
+ min_temp = T0C + 100
mix_message = "The substance turns an airy sky-blue and foams up into a new shape."
/datum/chemical_reaction/flaptonium/on_reaction(datum/reagents/holder, created_volume)
@@ -244,7 +234,7 @@
id = "soapification"
result = null
required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles
- min_temp = 374
+ min_temp = T0C + 100
result_amount = 1
@@ -257,7 +247,7 @@
id = "candlefication"
result = null
required_reagents = list("liquidgibs" = 5, "oxygen" = 5) //
- min_temp = 374
+ min_temp = T0C + 100
result_amount = 1
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
@@ -295,7 +285,7 @@
id = "jestosterone"
result = "jestosterone"
required_reagents = list("blood" = 1, "sodiumchloride" = 1, "banana" = 1, "lube" = 1, "space_drugs" = 1) //Or one freshly-squeezed clown
- min_temp = 374
+ min_temp = T0C + 100
result_amount = 5
mix_message = "The substance quickly shifts colour, cycling from red, to yellow, to green, to blue, and finally settles at a vibrant fuchsia."
@@ -338,7 +328,7 @@
result = "ice"
required_reagents = list("water" = 1)
result_amount = 1
- max_temp = 273
+ max_temp = T0C
mix_message = "Ice forms as the water freezes."
mix_sound = null
@@ -348,7 +338,7 @@
result = "water"
required_reagents = list("ice" = 1)
result_amount = 1
- min_temp = 301 // In Space.....ice melts at 82F...don't ask
+ min_temp = T0C + 29 // In Space.....ice melts at 82F...don't ask
mix_message = "Water pools as the ice melts."
mix_sound = null
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index a83bf0f7989..6b8d4035822 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -80,12 +80,10 @@
result = "clf3"
required_reagents = list("chlorine" = 1, "fluorine" = 3)
result_amount = 2
- min_temp = 424
+ 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
@@ -107,11 +105,11 @@
result = "sorium_vortex"
required_reagents = list("sorium" = 1)
result_amount = 1
- min_temp = 474
+ min_temp = T0C + 200
/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
@@ -134,11 +132,11 @@
result = "ldm_vortex"
required_reagents = list("liquid_dark_matter" = 1)
result_amount = 1
- min_temp = 474
+ min_temp = T0C + 200
/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
@@ -155,23 +153,23 @@
result = null
required_reagents = list("blackpowder" = 1)
result_amount = 1
- min_temp = 474
+ min_temp = T0C + 200
no_message = 1
mix_sound = null
/datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
do_sparks(2, 1, location)
- sleep(rand(20,30))
- blackpowder_detonate(holder, created_volume)
+ spawn(rand(5, 15))
+ blackpowder_detonate(holder, created_volume)
/proc/blackpowder_detonate(datum/reagents/holder, created_volume)
- var/turf/simulated/T = get_turf(holder.my_atom)
+ var/turf/T = get_turf(holder.my_atom)
var/ex_severe = round(created_volume / 100)
var/ex_heavy = round(created_volume / 42)
var/ex_light = round(created_volume / 20)
var/ex_flash = round(created_volume / 8)
- explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1)
+ explosion(T, ex_severe, ex_heavy,ex_light, ex_flash, 1)
// If this black powder is in a decal, remove the decal, because it just exploded
if(istype(holder.my_atom, /obj/effect/decal/cleanable/dirt/blackpowder))
spawn(0)
@@ -202,7 +200,7 @@ datum/chemical_reaction/flash_powder
id = "flash_powder_flash"
result = null
required_reagents = list("flash_powder" = 1)
- min_temp = 374
+ min_temp = T0C + 100
/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -214,6 +212,40 @@ datum/chemical_reaction/flash_powder
continue
C.Stun(5)
+/datum/chemical_reaction/phlogiston
+ name = "Phlogiston"
+ id = "phlogiston"
+ result = "phlogiston"
+ required_reagents = list("phosphorus" = 1, "plasma" = 1, "sacid" = 1, "stabilizing_agent" = 1)
+ result_amount = 4
+ mix_message = "The substance becomes sticky and extremely warm."
+
+/datum/chemical_reaction/phlogiston_dust
+ name = "Phlogiston Dust"
+ id = "phlogiston_dust"
+ result = "phlogiston_dust"
+ required_reagents = list("phlogiston" = 1, "charcoal" = 1, "phosphorus" = 1, "sulfur" = 1)
+ result_amount = 2
+ mix_message = "The substance becomes a pile of burning dust."
+
+/datum/chemical_reaction/phlogiston_fire //This MUST be above the smoke recipe.
+ name = "Phlogiston Fire"
+ id = "phlogiston_fire"
+ result = "phlogiston"
+ required_reagents = list("phosphorus" = 1, "plasma" = 1, "sacid" = 1)
+ mix_message = "The substance erupts into wild flames."
+
+/datum/chemical_reaction/phlogiston_fire/on_reaction(datum/reagents/holder, created_volume)
+ fireflash(get_turf(holder.my_atom), min(max(2, round(created_volume / 10)), 8))
+
+/datum/chemical_reaction/napalm
+ name = "Napalm"
+ id = "napalm"
+ result = "napalm"
+ required_reagents = list("fuel" = 1, "sugar" = 1, "ethanol" = 1)
+ result_amount = 3
+ mix_message = "The mixture congeals into a sticky gel."
+
/datum/chemical_reaction/smoke_powder
name = "smoke_powder"
id = "smoke_powder"
@@ -254,7 +286,7 @@ datum/chemical_reaction/flash_powder
name = "smoke_powder_smoke"
id = "smoke_powder_smoke"
required_reagents = list("smoke_powder" = 1)
- min_temp = 374
+ min_temp = T0C + 100
secondary = 1
result_amount = 1
forbidden_reagents = list("stimulants")
@@ -305,7 +337,7 @@ datum/chemical_reaction/flash_powder
id = "sonic_powder_deafen"
result = null
required_reagents = list("sonic_powder" = 1)
- min_temp = 374
+ min_temp = T0C + 100
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -337,28 +369,6 @@ datum/chemical_reaction/flash_powder
if(ears.ear_damage >= 5)
to_chat(M, "Your ears start to ring!")
-
-/datum/chemical_reaction/phlogiston
- name = "phlogiston"
- id = "phlogiston"
- result = "phlogiston"
- required_reagents = list("phosphorus" = 1, "sacid" = 1, "plasma" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- var/turf/simulated/T = get_turf(holder.my_atom)
- for(var/turf/simulated/turf in range(min(created_volume/10,4),T))
- new /obj/effect/hotspot(turf)
-
-/datum/chemical_reaction/napalm
- name = "Napalm"
- id = "napalm"
- result = "napalm"
- required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 )
- result_amount = 1
-
/datum/chemical_reaction/cryostylane
name = "cryostylane"
id = "cryostylane"
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 1531c80542a..54e3ce4fdb8 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -4,7 +4,7 @@
result = "formaldehyde"
required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
result_amount = 3
- min_temp = 420
+ min_temp = T0C + 150
mix_message = "Ugh, it smells like the morgue in here."
/datum/chemical_reaction/neurotoxin2
@@ -13,7 +13,7 @@
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
- min_temp = 674
+ min_temp = T0C + 400
mix_sound = null
no_message = 1
@@ -23,7 +23,7 @@
result = "cyanide"
required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
result_amount = 3
- min_temp = 380
+ min_temp = T0C + 100
mix_message = "The mixture gives off a faint scent of almonds."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
@@ -49,7 +49,7 @@
result = "facid"
required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
result_amount = 4
- min_temp = 380
+ min_temp = T0C + 100
mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container."
/datum/chemical_reaction/initropidril
@@ -83,7 +83,7 @@
required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1)
result_amount = 3
mix_message = "The mixture yields a colorless, odorless liquid."
- min_temp = 374
+ min_temp = T0C + 100
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder)
@@ -139,7 +139,7 @@
required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1)
result_amount = 3
mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry."
- min_temp = 400
+ min_temp = T0C + 130
mix_sound = null
/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 6d58e42d539..a350d75a4b4 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -44,11 +44,6 @@
R.on_ex_act()
..()
-/obj/item/reagent_containers/fire_act()
- reagents.chem_temp += 30
- reagents.handle_reactions()
- ..()
-
/obj/item/reagent_containers/attack_self(mob/user)
if(has_lid)
if(is_open_container())
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 23ec5f5cadb..cc866f7a2c7 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -124,13 +124,6 @@
/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
- return
- if(is_hot(I))
- if(reagents)
- reagents.chem_temp += 15
- to_chat(user, "You heat [src] with [I].")
- reagents.handle_reactions()
if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen))
var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
if(length(tmp_label) > MAX_NAME_LEN)
@@ -210,8 +203,7 @@
/obj/item/reagent_containers/glass/beaker/proc/heat_beaker()
if(reagents)
- reagents.chem_temp += 30
- reagents.handle_reactions()
+ reagents.temperature_reagents(4000)
/obj/item/reagent_containers/glass/beaker/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/assembly_holder) && can_assembly)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index da9f408a7c3..b3c98f82b54 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -22,6 +22,13 @@
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)
+ if(reagents)
+ reagents.temperature_reagents(exposed_temperature)
+
/obj/structure/reagent_dispensers/proc/boom()
visible_message("[src] ruptures!")
chem_splash(loc, 5, list(reagents))
@@ -68,6 +75,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
@@ -84,14 +92,14 @@
investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB)
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)
+/obj/structure/reagent_dispensers/fueltank/boom(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(rigtrigger) // 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()
@@ -99,7 +107,8 @@
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
-/obj/structure/reagent_dispensers/fueltank/fire_act()
+/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
boom()
/obj/structure/reagent_dispensers/fueltank/tesla_act()
@@ -167,7 +176,7 @@
investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
else
- ..()
+ return ..()
/obj/structure/reagent_dispensers/fueltank/Move()
..()
@@ -295,3 +304,4 @@
anchored = 1
density = 0
accepts_rig = 0
+ tank_volume = 1000
diff --git a/icons/goonstation/effects/64x64.dmi b/icons/goonstation/effects/64x64.dmi
index e1b168bbc11..17910cfdfb1 100644
Binary files a/icons/goonstation/effects/64x64.dmi and b/icons/goonstation/effects/64x64.dmi differ