From cc496f88cec629e774423aea25955f920acb1cb8 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 15 Oct 2013 16:27:30 -0400 Subject: [PATCH] Atmos changes --- code/game/objects/structures/false_walls.dm | 71 +++++++++++++++++++- code/game/objects/structures/girders.dm | 47 +++++++++---- code/game/objects/structures/window.dm | 51 ++++++++++++-- code/game/turfs/simulated.dm | 24 +++++++ code/game/turfs/simulated/floor_types.dm | 4 +- code/game/turfs/simulated/walls.dm | 32 ++++++++- code/game/turfs/simulated/walls_mineral.dm | 3 + code/modules/mob/living/carbon/human/life.dm | 2 +- 8 files changed, 213 insertions(+), 21 deletions(-) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index b49820dc548..81c4d7ee47e 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -1,6 +1,73 @@ /* * False Walls */ + +// Minimum pressure difference to fail building falsewalls. +// Also affects admin alerts. +#define FALSEDOOR_MAX_PRESSURE_DIFF 25.0 + +/** +* Gets the highest and lowest pressures from the tiles in cardinal directions +* around us, then checks the difference. +*/ +/proc/getOPressureDifferential(var/turf/loc) + var/minp=16777216; + var/maxp=0; + for(var/dir in cardinal) + var/turf/T=get_turf(get_step(loc,dir)) + var/cp=0 + if(T && istype(T,/turf/simulated) && T.zone) + var/datum/gas_mixture/environment = T.return_air() + cp = environment.return_pressure() + else + if(istype(T,/turf/simulated)) + continue + if(cpmaxp)maxp=cp + return abs(minp-maxp) + +// Checks pressure here vs. around us. +/proc/performFalseWallPressureCheck(var/turf/loc) + var/turf/simulated/lT=loc + if(!istype(lT) || !lT.zone) + return 0 + var/datum/gas_mixture/myenv=lT.return_air() + var/pressure=myenv.return_pressure() + + for(var/dir in cardinal) + var/turf/simulated/T=get_turf(get_step(loc,dir)) + if(T && istype(T) && T.zone) + var/datum/gas_mixture/environment = T.return_air() + var/pdiff = abs(pressure - environment.return_pressure()) + if(pdiff > FALSEDOOR_MAX_PRESSURE_DIFF) + return pdiff + return 0 + +/proc/performWallPressureCheck(var/turf/loc) + var/pdiff = getOPressureDifferential(loc) + if(pdiff > FALSEDOOR_MAX_PRESSURE_DIFF) + return pdiff + return 0 + +/client/proc/pdiff() + set name = "Get PDiff" + set category = "Debug" + + if(!mob || !holder) + return + var/turf/T = mob.loc + + if (!( istype(T, /turf) )) + return + + var/pdiff = getOPressureDifferential(T) + var/fwpcheck=performFalseWallPressureCheck(T) + var/wpcheck=performWallPressureCheck(T) + + src << "Pressure Differential (cardinals): [pdiff]" + src << "FWPCheck: [fwpcheck]" + src << "WPCheck: [wpcheck]" + /obj/structure/falsewall name = "wall" desc = "A huge chunk of metal used to seperate rooms." @@ -52,6 +119,7 @@ icon_state = "[mineral][junction]" return + /obj/structure/falsewall/attack_hand(mob/user as mob) if(opening) return @@ -175,6 +243,7 @@ ..() + /obj/structure/falserwall/attack_hand(mob/user as mob) if(opening) return @@ -231,7 +300,7 @@ if(istype(W, /obj/item/weapon/screwdriver)) var/turf/T = get_turf(src) user.visible_message("[user] tightens some bolts on the r wall.", "You tighten the bolts on the wall.") - T.ChangeTurf(/turf/simulated/wall) //Intentionally makes a regular wall instead of an r-wall (no cheap r-walls for you). + T.ChangeTurf(/turf/simulated/wall/r_wall) //Why not make rwall? del(src) if( istype(W, /obj/item/weapon/weldingtool) ) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index b50225838e6..bde37f03f78 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -70,10 +70,17 @@ if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) if(!anchored) if(S.amount < 2) return - S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." - new /obj/structure/falsewall (src.loc) - del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(!pdiff) + S.use(2) + user << "\blue You create a false wall! Push on it to open or close the passage." + new /obj/structure/falsewall (src.loc) + del(src) + else + user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." + message_admins("Attempted false wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false wall made by [user.real_name] (user.ckey) at [loc] had a pressure difference of [pdiff]!") + return else if(S.amount < 2) return ..() user << "\blue Now adding plating..." @@ -91,10 +98,17 @@ if(/obj/item/stack/sheet/plasteel) if(!anchored) if(S.amount < 2) return - S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." - new /obj/structure/falserwall (src.loc) - del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(!pdiff) + S.use(2) + user << "\blue You create a false wall! Push on it to open or close the passage." + new /obj/structure/falserwall (src.loc) + del(src) + else + user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." + message_admins("Attempted false rwall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false rwall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") + return else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.amount < 1) return ..() @@ -124,11 +138,18 @@ var/M = S.sheettype if(!anchored) if(S.amount < 2) return - S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." - var/F = text2path("/obj/structure/falsewall/[M]") - new F (src.loc) - del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(!pdiff) + S.use(2) + user << "\blue You create a false wall! Push on it to open or close the passage." + var/F = text2path("/obj/structure/falsewall/[M]") + new F (src.loc) + del(src) + else + user << "\red There is too much air moving through the gap! The door wouldn't stay closed if you built it." + message_admins("Attempted false [M] wall made by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)] had a pressure difference of [pdiff]!") + log_admin("Attempted false [M] wall made by [user.real_name] ([user.ckey]) at [loc] had a pressure difference of [pdiff]!") + return else if(S.amount < 2) return ..() user << "\blue Now adding plating..." diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index f98ebacbc7e..831d1dfec30 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -19,6 +19,10 @@ health -= Proj.damage ..() if(health <= 0) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window destroyed by [Proj.firer.real_name] ([formatPlayerPanel(Proj.firer,Proj.firer.ckey)]) via \an [Proj]! pdiff = [pdiff] at [formatJumpTo(loc)]!") + log_admin("Window destroyed by ([Proj.firer.ckey]) via \an [Proj]! pdiff = [pdiff] at [loc]!") new /obj/item/weapon/shard(loc) new /obj/item/stack/rods(loc) del(src) @@ -79,8 +83,10 @@ ..() visible_message("[src] was hit by [AM].") var/tforce = 0 + var/mob/M=null if(ismob(AM)) tforce = 40 + M=AM else if(isobj(AM)) var/obj/item/I = AM tforce = I.throwforce @@ -91,14 +97,27 @@ anchored = 0 update_nearby_icons() step(src, get_dir(AM, src)) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + if(M) + message_admins("Window with pdiff [pdiff] at [formatJumpTo(loc)] deanchored by [M.real_name] ([formatPlayerPanel(M,M.ckey)])!") + log_admin("Window with pdiff [pdiff] at [loc] deanchored by [M.real_name] ([M.ckey])!") + else + message_admins("Window with pdiff [pdiff] at [formatJumpTo(loc)] deanchored by [AM]!") + log_admin("Window with pdiff [pdiff] at [loc] deanchored by [AM]!") if(health <= 0) new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + if(M) + message_admins("Window with pdiff [pdiff] at [formatJumpTo(loc)] destroyed by [M.real_name] ([formatPlayerPanel(M,M.ckey)])!") + log_admin("Window with pdiff [pdiff] at [loc] destroyed by [M.real_name] ([M.ckey])!") + else + message_admins("Window with pdiff [pdiff] at [formatJumpTo(loc)] destroyed by [AM]!") + log_admin("Window with pdiff [pdiff] at [loc] destroyed by [AM]!") -/obj/structure/window/attack_tk(mob/user as mob) - user.visible_message("Something knocks on [src].") - playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) /obj/structure/window/attack_hand(mob/user as mob) if(HULK in user.mutations) @@ -107,6 +126,10 @@ new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window destroyed by hulk [user.real_name] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!") + log_admin("Window destroyed by hulk [user.real_name] ([user.ckey]) with pdiff [pdiff] at [loc]!") else if (usr.a_intent == "hurt") playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) usr.visible_message("\red [usr.name] bangs against the [src.name]!", \ @@ -131,6 +154,9 @@ new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) del(src) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window destroyed by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!") else //for nicer text~ user.visible_message("[user] smashes into [src]!") playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) @@ -188,11 +214,21 @@ update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) user << (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.") + if(!anchored) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!") + log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!") else if(!reinf) anchored = !anchored update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) user << (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.") + if(!anchored) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!") + log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!") else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1) state = 1 - state playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) @@ -204,6 +240,10 @@ anchored = 0 update_nearby_icons() step(src, get_dir(user, src)) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!") + log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!") else playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) ..() @@ -225,6 +265,9 @@ else new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Window with pdiff [pdiff] broken at [formatJumpTo(loc)]!") del(src) return @@ -307,7 +350,7 @@ update_nearby_tiles() playsound(src, "shatter", 70, 1) update_nearby_icons() - loc = null //garbage collect + ..() /obj/structure/window/Move() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 9cae414c923..5c537ce0c10 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -113,6 +113,30 @@ playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Weaken(10) + if(3) // Ice + if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes + if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30)) + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the icy floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(4) + M.Weaken(5) + else + M.inertia_dir = 0 + return + else if(!istype(M, /mob/living/carbon/metroid)) + if (M.m_intent == "run" && prob(30)) + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the icy floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(4) + M.Weaken(5) + else + M.inertia_dir = 0 + return + ..() //returns 1 if made bloody, returns 0 otherwise diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 8d82d1dbaf9..5b217390644 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -78,7 +78,9 @@ var/datum/gas/sleeping_agent/trace_gas = new air.trace_gases += trace_gas - trace_gas.moles = 9*4000 + trace_gas.moles = 70000 + air.oxygen = 0 + air.nitrogen = 0 air.update_values() /turf/simulated/floor/engine/vacuum diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index a8d73263661..b963dad8a6e 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -164,6 +164,10 @@ else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) user << "\The [src] crumbles away under the force of your [W.name]." src.dismantle_wall(1) + + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) broke a rotting wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!") return //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects @@ -203,6 +207,10 @@ if( user.loc == T && user.get_active_hand() == WT ) user << "You remove the outer plating." + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) dismanted a wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!") + log_admin("[user.real_name] ([user.ckey]) dismanted a wall with a pdiff of [pdiff] at [loc]!") dismantle_wall() else user << "You need more welding fuel to complete this task." @@ -221,6 +229,10 @@ if( user.loc == T && user.get_active_hand() == W ) user << "You remove the outer plating." dismantle_wall() + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) dismantled with a pdiff of [pdiff] at [formatJumpTo(loc)]!") + log_admin("[user.real_name] ([user.ckey]) dismantled with a pdiff of [pdiff] at [loc]!") for(var/mob/O in viewers(user, 5)) O.show_message("The wall was sliced apart by [user]!", 1, "You hear metal being sliced apart.", 2) return @@ -238,6 +250,10 @@ if( user.loc == T && user.get_active_hand() == W ) user << "Your drill tears though the last of the reinforced plating." dismantle_wall() + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) drilled a wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!") + log_admin("[user.real_name] ([user.ckey]) drilled a wall with a pdiff of [pdiff] at [loc]!") for(var/mob/O in viewers(user, 5)) O.show_message("The wall was drilled through by [user]!", 1, "You hear the grinding of metal.", 2) return @@ -259,6 +275,10 @@ playsound(src.loc, "sparks", 50, 1) playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) dismantle_wall(1) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) sliced up a wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!") + log_admin("[user.real_name] ([user.ckey]) sliced up a wall with a pdiff of [pdiff] at [loc]!") for(var/mob/O in viewers(user, 5)) O.show_message("The wall was sliced apart by [user]!", 1, "You hear metal being sliced apart and sparks flying.", 2) return @@ -340,9 +360,19 @@ src.ChangeTurf(/turf/simulated/floor/plating) var/turf/simulated/floor/F = src + if(!F) + if(O) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) thermited a wall into space at [formatJumpTo(loc)]!") + del(O) + user << "The thermite melts through the wall." + return F.burn_tile() F.icon_state = "wall_thermite" - user << "The thermite starts melting through the wall." + user << "The thermite melts through the wall." + + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff) + message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) thermited a wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!") spawn(100) if(O) del(O) diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index e1ec717d30c..a46a062772b 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -90,6 +90,9 @@ ..() /turf/simulated/wall/mineral/plasma/proc/PlasmaBurn(temperature) + var/pdiff=performWallPressureCheck(src.loc) + if(pdiff>0) + message_admins("Plasma wall with pdiff [pdiff] at [formatJumpTo(loc)] just caught fire!") spawn(2) new /obj/structure/girder(src) src.ChangeTurf(/turf/simulated/floor) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 615db9f8655..b3569321557 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -553,7 +553,7 @@ if(istype(loc, /obj/mecha)) var/obj/mecha/M = loc loc_temp = M.return_temperature() - else if(istype(get_turf(src), /turf/space)) + //else if(istype(get_turf(src), /turf/space)) else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) loc_temp = loc:air_contents.temperature else