diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a4bb54dfb24..7e937c3a1c6 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 3b611883e68..861a5309673 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 3a637571570..7431d4ff850 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 e30f40d173d..8154282a728 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 1d1aac2bdee..841ce45b7b5 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 eab44acdd79..885ad621311 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ