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