diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 9ca086fad2..54510858f1 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -1,5 +1,9 @@
// Foam
// Similar to smoke, but slower and mobs absorb its reagent through their exposed skin.
+#define ALUMINUM_FOAM 1
+#define IRON_FOAM 2
+#define RESIN_FOAM 3
+
/obj/effect/particle_effect/foam
name = "foam"
@@ -22,13 +26,16 @@
/obj/effect/particle_effect/foam/metal
name = "aluminium foam"
- metal = 1
+ metal = ALUMINUM_FOAM
icon_state = "mfoam"
-
/obj/effect/particle_effect/foam/metal/iron
name = "iron foam"
- metal = 2
+ metal = IRON_FOAM
+
+/obj/effect/particle_effect/foam/metal/resin
+ name = "resin foam"
+ metal = RESIN_FOAM
/obj/effect/particle_effect/foam/New(loc)
@@ -45,10 +52,12 @@
/obj/effect/particle_effect/foam/proc/kill_foam()
STOP_PROCESSING(SSfastprocess, src)
switch(metal)
- if(1)
- new /obj/structure/foamedmetal(src.loc)
- if(2)
- new /obj/structure/foamedmetal/iron(src.loc)
+ if(ALUMINUM_FOAM)
+ new /obj/structure/foamedmetal(get_turf(src))
+ if(IRON_FOAM)
+ new /obj/structure/foamedmetal/iron(get_turf(src))
+ if(RESIN_FOAM)
+ new /obj/structure/foamedmetal/resin(get_turf(src))
flick("[icon_state]-disolve", src)
QDEL_IN(src, 5)
@@ -230,3 +239,44 @@
obj_integrity = 50
max_integrity = 50
icon_state = "ironfoam"
+
+//Atmos Backpack Resin, transparent, prevents atmos and filters the air
+/obj/structure/foamedmetal/resin
+ name = "ATMOS Resin"
+ desc = "A lightweight, transparent resin used to suffocate fires, scrub the air of toxins, and restore the air to a safe temperature"
+ opacity = FALSE
+ icon_state = "atmos_resin"
+ alpha = 120
+ obj_integrity = 10
+ max_integrity = 10
+ layer = EDGED_TURF_LAYER
+
+/obj/structure/foamedmetal/resin/Initialize()
+ . = ..()
+ if(isopenturf(loc))
+ var/turf/open/O = loc
+ if(O.air)
+ var/datum/gas_mixture/G = O.air
+ G.temperature = 293.15
+ for(var/obj/effect/hotspot/H in O)
+ qdel(H)
+ var/list/G_gases = G.gases
+ for(var/I in G_gases)
+ if(I != "o2" && I != "n2")
+ G.gases[I][MOLES] = 0
+ G.garbage_collect()
+ O.air_update_turf()
+ for(var/obj/machinery/atmospherics/components/unary/U in O)
+ if(!U.welded)
+ U.welded = TRUE
+ U.update_icon()
+ U.visible_message("[U] sealed shut!")
+ for(var/mob/living/L in O)
+ L.ExtinguishMob()
+ for(var/obj/item/Item in O)
+ Item.extinguish()
+
+
+#undef ALUMINUM_FOAM
+#undef IRON_FOAM
+#undef RESIN_FOAM
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 3b611883e6..861a530967 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -74,6 +74,14 @@
creation_time = 30
max_signs = 6
+/obj/item/weapon/holosign_creator/atmos
+ name = "ATMOS holofan projector"
+ desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions."
+ icon_state = "signmaker_engi"
+ holosign_type = /obj/structure/holosign/barrier/atmos
+ creation_time = 0
+ max_signs = 3
+
/obj/item/weapon/holosign_creator/cyborg
name = "Energy Barrier Projector"
desc = "A holographic projector that creates fragile energy fields"
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 3a63757157..7431d4ff85 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -178,15 +178,16 @@
//ATMOS FIRE FIGHTING BACKPACK
#define EXTINGUISHER 0
-#define NANOFROST 1
-#define METAL_FOAM 2
+#define RESIN_LAUNCHER 1
+#define RESIN_FOAM 2
/obj/item/weapon/watertank/atmos
name = "backpack firefighter tank"
- desc = "A refridgerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, nanofrost launcher, and metal foam dispenser for breaches. Nanofrost converts plasma in the air to nitrogen, but only if it is combusting at the time."
- icon_state = "waterbackpackatmos"
+ desc = "A refridgerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, resin launcher and a smaller scale resin foamer."
item_state = "waterbackpackatmos"
+ icon_state = "waterbackpackatmos"
volume = 200
+ slowdown = 0
/obj/item/weapon/watertank/atmos/New()
..()
@@ -211,6 +212,7 @@
safety = 0
max_water = 200
power = 8
+ force = 10
precision = 1
cooling_power = 5
w_class = WEIGHT_CLASS_HUGE
@@ -218,7 +220,7 @@
var/obj/item/weapon/watertank/tank
var/nozzle_mode = 0
var/metal_synthesis_cooldown = 0
- var/nanofrost_cooldown = 0
+ var/resin_cooldown = 0
/obj/item/weapon/extinguisher/mini/nozzle/New(parent_tank)
..()
@@ -238,16 +240,16 @@
/obj/item/weapon/extinguisher/mini/nozzle/attack_self(mob/user)
switch(nozzle_mode)
if(EXTINGUISHER)
- nozzle_mode = NANOFROST
+ nozzle_mode = RESIN_LAUNCHER
tank.icon_state = "waterbackpackatmos_1"
- to_chat(user, "Swapped to nanofrost launcher")
+ to_chat(user, "Swapped to resin launcher")
return
- if(NANOFROST)
- nozzle_mode = METAL_FOAM
+ if(RESIN_LAUNCHER)
+ nozzle_mode = RESIN_FOAM
tank.icon_state = "waterbackpackatmos_2"
- to_chat(user, "Swapped to metal foam synthesizer")
+ to_chat(user, "Swapped to resin foamer")
return
- if(METAL_FOAM)
+ if(RESIN_FOAM)
nozzle_mode = EXTINGUISHER
tank.icon_state = "waterbackpackatmos_0"
to_chat(user, "Swapped to water extinguisher")
@@ -267,20 +269,20 @@
var/Adj = user.Adjacent(target)
if(Adj)
AttemptRefill(target, user)
- if(nozzle_mode == NANOFROST)
+ if(nozzle_mode == RESIN_LAUNCHER)
if(Adj)
return //Safety check so you don't blast yourself trying to refill your tank
var/datum/reagents/R = reagents
if(R.total_volume < 100)
- to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!")
+ to_chat(user, "You need at least 100 units of water to use the resin launcher!")
return
- if(nanofrost_cooldown)
- to_chat(user, "Nanofrost launcher is still recharging...")
+ if(resin_cooldown)
+ to_chat(user, "Resin launcher is still recharging...")
return
- nanofrost_cooldown = 1
+ resin_cooldown = TRUE
R.remove_any(100)
- var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src))
- log_game("[user.ckey] ([user.name]) used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).")
+ var/obj/effect/resin_container/A = new (get_turf(src))
+ log_game("[key_name_admin(user)] used Resin Launcher at [get_area(user)] [COORD(user)].")
playsound(src,'sound/items/syringeproj.ogg',40,1)
for(var/a=0, a<5, a++)
step_towards(A, target)
@@ -288,43 +290,38 @@
A.Smoke()
spawn(100)
if(src)
- nanofrost_cooldown = 0
+ resin_cooldown = FALSE
return
- if(nozzle_mode == METAL_FOAM)
+ if(nozzle_mode == RESIN_FOAM)
if(!Adj|| !isturf(target))
return
if(metal_synthesis_cooldown < 5)
- var/obj/effect/particle_effect/foam/metal/F = new /obj/effect/particle_effect/foam/metal(get_turf(target))
+ var/obj/effect/particle_effect/foam/metal/resin/F = new (get_turf(target))
F.amount = 0
metal_synthesis_cooldown++
spawn(100)
metal_synthesis_cooldown--
else
- to_chat(user, "Metal foam mix is still being synthesized...")
+ to_chat(user, "Resin foam mix is still being synthesized...")
return
-/obj/effect/nanofrost_container
- name = "nanofrost container"
- desc = "A frozen shell of ice containing nanofrost that freezes the surrounding area after activation."
+/obj/effect/resin_container
+ name = "resin container"
+ desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches."
icon = 'icons/effects/effects.dmi'
icon_state = "frozen_smoke_capsule"
mouse_opacity = 0
pass_flags = PASSTABLE
-/obj/effect/nanofrost_container/proc/Smoke()
- var/datum/effect_system/smoke_spread/freezing/S = new
- S.set_up(2, src.loc, blasting=1)
- S.start()
- var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc)
- F.add_atom_colour("#B2FFFF", FIXED_COLOUR_PRIORITY)
- F.name = "nanofrost residue"
- F.desc = "Residue left behind from a nanofrost detonation. Perhaps there was a fire here?"
+/obj/effect/resin_container/proc/Smoke()
+ var/obj/effect/particle_effect/foam/metal/resin/S = new /obj/effect/particle_effect/foam/metal/resin(get_turf(loc))
+ S.amount = 3
playsound(src,'sound/effects/bamf.ogg',100,1)
qdel(src)
#undef EXTINGUISHER
-#undef NANOFROST
-#undef METAL_FOAM
+#undef RESIN_LAUNCHER
+#undef RESIN_FOAM
/obj/item/weapon/reagent_containers/chemtank
name = "backpack chemical injector"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 89273de04e..99662420ea 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -39,7 +39,7 @@
new /obj/item/clothing/gloves/color/yellow(src)
new /obj/item/clothing/gloves/color/yellow(src)
new /obj/item/weapon/inducer(src)
- new /obj/item/weapon/inducer(src)
+ new /obj/item/weapon/inducer(src)
for(var/i in 1 to 3)
new /obj/item/weapon/storage/toolbox/electrical(src)
for(var/i in 1 to 3)
@@ -88,7 +88,7 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
new /obj/item/device/analyzer(src)
- new /obj/item/weapon/holosign_creator/engineering(src)
+ new /obj/item/weapon/holosign_creator/atmos(src)
new /obj/item/weapon/watertank/atmos(src)
new /obj/item/clothing/suit/fire/atmos(src)
new /obj/item/clothing/head/hardhat/atmos(src)
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index a27febc997..18fd2875f7 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -65,6 +65,26 @@
/obj/structure/holosign/barrier/engineering
icon_state = "holosign_engi"
+/obj/structure/holosign/barrier/atmos
+ name = "holo firelock"
+ desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
+ icon_state = "holo_firelock"
+ density = FALSE
+ layer = ABOVE_MOB_LAYER
+ anchored = TRUE
+ CanAtmosPass = ATMOS_PASS_NO
+ layer = ABOVE_MOB_LAYER
+ alpha = 150
+
+/obj/structure/holosign/barrier/atmos/Initialize()
+ . = ..()
+ air_update_turf(TRUE)
+
+/obj/structure/holosign/barrier/atmos/Destroy()
+ var/turf/T = get_turf(src)
+ . = ..()
+ T.air_update_turf(TRUE)
+
/obj/structure/holosign/barrier/cyborg
name = "Energy Field"
desc = "A fragile energy field that blocks movement. Excels at blocking lethal projectiles."
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index eab44acdd7..885ad62131 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ