From 9187ad48d64effafd50c3e1b704cf14c5821ef76 Mon Sep 17 00:00:00 2001 From: Albert Iordache Date: Thu, 26 Jul 2012 12:25:33 +0300 Subject: [PATCH 1/6] Because atmos techs also get two pairs of magboots now, I removed them from the steal objective list --- code/game/gamemodes/newobjective.dm | 4 ++-- code/game/gamemodes/objective.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index d3bd4ae403a..6bcf23e6e5a 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -723,7 +723,7 @@ datum return 20 - magboots + /*magboots steal_target = /obj/item/clothing/shoes/magboots explanation_text = "Steal a pair of \"NanoTrasen\" brand magboots." weight = 20 @@ -745,7 +745,7 @@ datum if(GetRank(job) == 4) return 10 else - return 20 + return 20*/ blueprints diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 14426d5aaee..84c6655ac5d 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -294,7 +294,7 @@ datum/objective/steal "a jetpack" = /obj/item/weapon/tank/jetpack, "a captains jumpsuit" = /obj/item/clothing/under/rank/captain, "a functional AI" = /obj/item/device/aicard, - "a pair of magboots" = /obj/item/clothing/shoes/magboots, + /*"a pair of magboots" = /obj/item/clothing/shoes/magboots,*/ "the station blueprints" = /obj/item/blueprints, "a nasa voidsuit" = /obj/item/clothing/suit/space/nasavoid, "28 moles of plasma (full tank)" = /obj/item/weapon/tank, From 0b8a75d6f9a8e4e26368742ec4b04b4c2893e63c Mon Sep 17 00:00:00 2001 From: Albert Iordache Date: Thu, 26 Jul 2012 15:55:04 +0300 Subject: [PATCH 2/6] Players who've disabled OOC no longer hear admins --- code/game/verbs/ooc.dm | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index d138c6ece49..5ec9347ae01 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -37,20 +37,20 @@ log_ooc("[src.name]/[src.key] : [msg]") for (var/client/C) - if (src.client.holder && (!src.client.stealth || ( C.holder && C.holder.level != 0))) - if (src.client.holder.rank == "Admin Observer") - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" - else if (src.client.holder.rank == "Retired Admin") - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" - else if (src.client.holder.rank == "Moderator") - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" - else if (src.client.holder.level >= 5) - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + if (C.listen_ooc) + if (src.client.holder && (!src.client.stealth || ( C.holder && C.holder.level != 0))) + if (src.client.holder.rank == "Admin Observer") + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + else if (src.client.holder.rank == "Retired Admin") + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + else if (src.client.holder.rank == "Moderator") + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + else if (src.client.holder.level >= 5) + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + else + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" - - else if (C.listen_ooc) - C << "OOC: [src.client.stealth ? src.client.fakekey : src.key]: [msg]" + C << "OOC: [src.client.stealth ? src.client.fakekey : src.key]: [msg]" /* /mob/verb/goonsay(msg as text) set name = "Goonsay" From 23e263e85114c54e5d6fe777aa046160eb666e2c Mon Sep 17 00:00:00 2001 From: CIB Date: Thu, 26 Jul 2012 20:22:54 +0300 Subject: [PATCH 3/6] This hopefully fixes death-cryo --- code/modules/mob/living/carbon/human/life.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 119591fa5ed..ef0cd7bdb43 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -603,6 +603,8 @@ if(istype(loc, /turf/space)) environment_heat_capacity = loc:heat_capacity loc_temp = 2.7 + else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + loc_temp = loc:air_contents.temperature else loc_temp = environment.temperature From c5f2df0aeb9e558ee2af6b962ce250ca1387bd65 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Thu, 26 Jul 2012 11:55:19 -0700 Subject: [PATCH 4/6] ZAS fixes. --- code/ZAS/FEA_system.dm | 11 ++++------- code/setup.dm | 6 +++--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm index 4f9bc2aa11f..27ce9995e19 100644 --- a/code/ZAS/FEA_system.dm +++ b/code/ZAS/FEA_system.dm @@ -136,15 +136,12 @@ datum var/start_time = world.timeofday for(var/turf/simulated/S in world) - if(S.z < 5) - if(!S.zone && !S.blocks_air) - if(S.CanPass(null, S, 0, 0)) - new/zone(S) + if(!S.zone && !S.blocks_air) + if(S.CanPass(null, S, 0, 0)) + new/zone(S) for(var/turf/simulated/S in world) - if(S.z < 5) - S.update_air_properties() - // S.check_connections() + S.update_air_properties() world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!" spawn start() diff --git a/code/setup.dm b/code/setup.dm index 9060feafac7..9be56d9f79e 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -19,9 +19,9 @@ #define MOLES_PLASMA_VISIBLE 0.5 //Moles in a standard cell after which plasma is visible -#define SPECIFIC_HEAT_TOXIN 700 -#define SPECIFIC_HEAT_AIR 100 -#define SPECIFIC_HEAT_CDO 150 +#define SPECIFIC_HEAT_TOXIN 200 +#define SPECIFIC_HEAT_AIR 20 +#define SPECIFIC_HEAT_CDO 30 #define HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) \ (carbon_dioxide*SPECIFIC_HEAT_CDO + (oxygen+nitrogen)*SPECIFIC_HEAT_AIR + toxins*SPECIFIC_HEAT_TOXIN) From af2af9d6b28df94a7e470afc761158e3c963beaa Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Thu, 26 Jul 2012 12:10:16 -0700 Subject: [PATCH 5/6] Attempted fix for ZAS possibly crashing BYOND, removed special case for Cryo from human life as it is already handled by cryo's return_air() proc, made breathing in superheated gas burn you a wee bit. --- code/ZAS/Creation.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ZAS/Creation.dm b/code/ZAS/Creation.dm index ff20eed6f2a..69a8e1425fe 100644 --- a/code/ZAS/Creation.dm +++ b/code/ZAS/Creation.dm @@ -1,5 +1,6 @@ zone New(turf/start) + . = ..() //Get the turfs that are part of the zone using a floodfill method if(istype(start,/list)) contents = start diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ef0cd7bdb43..2be48979c90 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -585,6 +585,7 @@ if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( if(prob(20)) src << "\red You feel a searing heat in your lungs!" + take_overall_damage(0,2) //burn them a bit. fire_alert = max(fire_alert, 1) else fire_alert = 0 @@ -603,8 +604,6 @@ if(istype(loc, /turf/space)) environment_heat_capacity = loc:heat_capacity loc_temp = 2.7 - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature else loc_temp = environment.temperature From 54ce48fb9dc832e48b65e436b2797aac417d7897 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Thu, 26 Jul 2012 15:26:32 -0700 Subject: [PATCH 6/6] Connections no longer are deleted when a door closes, instead persisting until merged or a wall is built there or something. Better runtime detection, and no more searching through world for fires to process. --- code/ZAS/Connection.dm | 368 +++++++++++++++++++-------------- code/ZAS/FEA_system.dm | 32 +-- code/ZAS/FEA_turf_tile.dm | 8 +- code/ZAS/Fire.dm | 3 + code/ZAS/Functions.dm | 4 +- code/ZAS/Processing.dm | 66 +++--- code/game/master_controller.dm | 7 +- 7 files changed, 278 insertions(+), 210 deletions(-) diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm index b95fd160bdc..0f0748bafd8 100644 --- a/code/ZAS/Connection.dm +++ b/code/ZAS/Connection.dm @@ -2,6 +2,10 @@ This object is contained within zone/var/connections. It's generated whenever two turfs from different zones are linked. Indirect connections will not merge the two zones after they reach equilibrium. */ +#define CONNECTION_DIRECT 2 +#define CONNECTION_INDIRECT 1 +#define CONNECTION_CLOSED 0 + connection var @@ -16,6 +20,7 @@ connection indirect = 0 //If the connection is purely indirect, the zones should not join. last_updated //The tick at which this was last updated. no_zone_count = 0 + New(turf/T,turf/O) A = T B = O @@ -30,52 +35,59 @@ connection zone_B = B.zone ref_B = "\ref[B]" - if(!A.connections) - A.connections = list(src) + if(ref_A in air_master.turfs_with_connections) + var/list/connections = air_master.turfs_with_connections[ref_A] + connections.Add(src) else - A.connections += src + air_master.turfs_with_connections[ref_A] = list(src) - if(!B.connections) - B.connections = list(src) + if(ref_B in air_master.turfs_with_connections) + var/list/connections = air_master.turfs_with_connections[ref_B] + connections.Add(src) else - B.connections += src + air_master.turfs_with_connections[ref_B] = list(src) if(!A.zone.connected_zones) A.zone.connected_zones = list() if(!B.zone.connected_zones) B.zone.connected_zones = list() - if(!(B.zone in A.zone.connected_zones)) + if(B.zone in A.zone.connected_zones) + A.zone.connected_zones[B.zone]++ + else A.zone.connected_zones += B.zone A.zone.connected_zones[B.zone] = 1 - else - A.zone.connected_zones[B.zone]++ - if(!(A.zone in B.zone.connected_zones)) + if(A.zone in B.zone.connected_zones) + B.zone.connected_zones[A.zone]++ + else B.zone.connected_zones += A.zone B.zone.connected_zones[A.zone] = 1 - else - B.zone.connected_zones[A.zone]++ if(A.HasDoor(B) || B.HasDoor(A)) indirect = 1 else world.log << "Attempted to create connection object for non-zone tiles: [T] -> [O]" del(src) + Del() + if(ref_B in air_master.turfs_with_connections) + var/list/connections = air_master.turfs_with_connections[ref_B] + connections.Remove(src) + + if(ref_A in air_master.turfs_with_connections) + var/list/connections = air_master.turfs_with_connections[ref_A] + connections.Remove(src) + if(A) if(A.zone && A.zone.connections) A.zone.connections.Remove(src) if(!A.zone.connections.len) del A.zone.connections - if(istype(A)) - A.connections -= src if(B) if(B.zone && B.zone.connections) B.zone.connections.Remove(src) if(!B.zone.connections.len) del B.zone.connections - if(istype(B)) - B.connections -= src if(zone_A) if(zone_A && zone_A.connections) zone_A.connections.Remove(src) @@ -87,74 +99,75 @@ connection if(!zone_B.connections.len) del zone_B.connections - if(A && A.zone) - if(B && B.zone) - if(B.zone in A.zone.connected_zones) - if(A.zone.connected_zones[B.zone] > 1) - A.zone.connected_zones[B.zone]-- - else - A.zone.connected_zones -= B.zone - if(A.zone.connected_zones && !A.zone.connected_zones.len) - A.zone.connected_zones = null - if( zone_B && (!B.zone || zone_B != B.zone) ) - if(zone_B in A.zone.connected_zones) - if(A.zone.connected_zones[zone_B] > 1) - A.zone.connected_zones[zone_B]-- - else - A.zone.connected_zones -= zone_B - if(A.zone.connected_zones && !A.zone.connected_zones.len) - A.zone.connected_zones = null - if(zone_A && (!A.zone || zone_A != A.zone)) - if(B && B.zone) - if(B.zone in zone_A.connected_zones) - if(zone_A.connected_zones[B.zone] > 1) - zone_A.connected_zones[B.zone]-- - else - zone_A.connected_zones -= B.zone - if(zone_A.connected_zones && !zone_A.connected_zones.len) - zone_A.connected_zones = null - if( zone_B && (!B.zone || zone_B != B.zone) ) - if(zone_B in zone_A.connected_zones) - if(zone_A.connected_zones[zone_B] > 1) - zone_A.connected_zones[zone_B]-- - else - zone_A.connected_zones -= zone_B - if(zone_A.connected_zones && !zone_A.connected_zones.len) - zone_A.connected_zones = null - if(B && B.zone) + if(indirect != CONNECTION_CLOSED) if(A && A.zone) - if(A.zone in B.zone.connected_zones) - if(B.zone.connected_zones[A.zone] > 1) - B.zone.connected_zones[A.zone]-- - else - B.zone.connected_zones -= A.zone - if(B.zone.connected_zones && !B.zone.connected_zones.len) - B.zone.connected_zones = null - if( zone_A && (!A.zone || zone_A != A.zone) ) - if(zone_A in B.zone.connected_zones) - if(B.zone.connected_zones[zone_A] > 1) - B.zone.connected_zones[zone_A]-- - else - B.zone.connected_zones -= zone_A - if(B.zone.connected_zones && !B.zone.connected_zones.len) - B.zone.connected_zones = null - if(zone_B && (!B.zone || zone_B != B.zone)) - if(A && A.zone) - if(A.zone in zone_B.connected_zones) - if(zone_B.connected_zones[A.zone] > 1) - zone_B.connected_zones[A.zone]-- - else - zone_B.connected_zones -= A.zone - if(zone_B.connected_zones && !zone_B.connected_zones.len) - zone_B.connected_zones = null - if( zone_A && (!A.zone || zone_A != A.zone) ) - if(zone_A in zone_B.connected_zones) - if(zone_B.connected_zones[zone_A] > 1) - zone_B.connected_zones[zone_A]-- - else - zone_B.connected_zones -= zone_A - if(zone_B.connected_zones && !zone_B.connected_zones.len) - zone_B.connected_zones = null + if(B && B.zone) + if(B.zone in A.zone.connected_zones) + if(A.zone.connected_zones[B.zone] > 1) + A.zone.connected_zones[B.zone]-- + else + A.zone.connected_zones -= B.zone + if(A.zone.connected_zones && !A.zone.connected_zones.len) + A.zone.connected_zones = null + if( zone_B && (!B.zone || zone_B != B.zone) ) + if(zone_B in A.zone.connected_zones) + if(A.zone.connected_zones[zone_B] > 1) + A.zone.connected_zones[zone_B]-- + else + A.zone.connected_zones -= zone_B + if(A.zone.connected_zones && !A.zone.connected_zones.len) + A.zone.connected_zones = null + if(zone_A && (!A.zone || zone_A != A.zone)) + if(B && B.zone) + if(B.zone in zone_A.connected_zones) + if(zone_A.connected_zones[B.zone] > 1) + zone_A.connected_zones[B.zone]-- + else + zone_A.connected_zones -= B.zone + if(zone_A.connected_zones && !zone_A.connected_zones.len) + zone_A.connected_zones = null + if( zone_B && (!B.zone || zone_B != B.zone) ) + if(zone_B in zone_A.connected_zones) + if(zone_A.connected_zones[zone_B] > 1) + zone_A.connected_zones[zone_B]-- + else + zone_A.connected_zones -= zone_B + if(zone_A.connected_zones && !zone_A.connected_zones.len) + zone_A.connected_zones = null + if(B && B.zone) + if(A && A.zone) + if(A.zone in B.zone.connected_zones) + if(B.zone.connected_zones[A.zone] > 1) + B.zone.connected_zones[A.zone]-- + else + B.zone.connected_zones -= A.zone + if(B.zone.connected_zones && !B.zone.connected_zones.len) + B.zone.connected_zones = null + if( zone_A && (!A.zone || zone_A != A.zone) ) + if(zone_A in B.zone.connected_zones) + if(B.zone.connected_zones[zone_A] > 1) + B.zone.connected_zones[zone_A]-- + else + B.zone.connected_zones -= zone_A + if(B.zone.connected_zones && !B.zone.connected_zones.len) + B.zone.connected_zones = null + if(zone_B && (!B.zone || zone_B != B.zone)) + if(A && A.zone) + if(A.zone in zone_B.connected_zones) + if(zone_B.connected_zones[A.zone] > 1) + zone_B.connected_zones[A.zone]-- + else + zone_B.connected_zones -= A.zone + if(zone_B.connected_zones && !zone_B.connected_zones.len) + zone_B.connected_zones = null + if( zone_A && (!A.zone || zone_A != A.zone) ) + if(zone_A in zone_B.connected_zones) + if(zone_B.connected_zones[zone_A] > 1) + zone_B.connected_zones[zone_A]-- + else + zone_B.connected_zones -= zone_A + if(zone_B.connected_zones && !zone_B.connected_zones.len) + zone_B.connected_zones = null . = ..() proc/Cleanup() @@ -176,14 +189,55 @@ connection return 0 return 1 + proc/UpdateZones() //Changes connection data in the zones if it is required. + if(A.ZAirPass(B)) + var/door_pass = A.CanPass(null,B,1.5,1) + if(door_pass || A.CanPass(null,B,0,0)) + if(indirect == CONNECTION_CLOSED) + //ADJUST FOR CAN CONNECT + if(!A.zone.connected_zones) + A.zone.connected_zones = list() + if(B.zone in A.zone.connected_zones) + A.zone.connected_zones[B.zone]++ + else + A.zone.connected_zones += B.zone + A.zone.connected_zones[B.zone] = 1 + + if(!B.zone.connected_zones) + B.zone.connected_zones = list() + if(A.zone in B.zone.connected_zones) + B.zone.connected_zones[A.zone]++ + else + B.zone.connected_zones += A.zone + B.zone.connected_zones[A.zone] = 1 + if(door_pass) + indirect = CONNECTION_DIRECT + else if(!door_pass) + indirect = CONNECTION_INDIRECT + else if(indirect > CONNECTION_CLOSED) + indirect = CONNECTION_CLOSED + //ADJUST FOR CANNOT CONNECT + if(A.zone.connected_zones) + if(A.zone.connected_zones[B.zone] > 1) + A.zone.connected_zones[B.zone]-- + else + A.zone.connected_zones.Remove(B.zone) + if(A.zone.connected_zones && !A.zone.connected_zones.len) + A.zone.connected_zones = null + if(B.zone.connected_zones) + if(B.zone.connected_zones[A.zone] > 1) + B.zone.connected_zones[A.zone]-- + else + B.zone.connected_zones.Remove(A.zone) + if(B.zone.connected_zones && !B.zone.connected_zones.len) + B.zone.connected_zones = null + else //If I can no longer pass air, better delete + del src + proc/CheckPassSanity() Cleanup() - if(!A.CanPass(null, B, 0, 0)) - del src - if(A.HasDoor(B) || B.HasDoor(A)) - indirect = 1 - else - indirect = 0 + UpdateZones() + return 1 proc/Sanitize() //If the zones change on connected turfs, update it. @@ -208,13 +262,14 @@ connection if(!zone_A.connections.len) del zone_A.connections - if(zone_A.connected_zones) - if(zone_A.connected_zones[zone_B] > 1) - zone_A.connected_zones[zone_B]-- - else - zone_A.connected_zones.Remove(zone_B) - if(zone_A.connected_zones && !zone_A.connected_zones.len) - zone_A.connected_zones = null + if(indirect != CONNECTION_CLOSED) + if(zone_A.connected_zones) + if(zone_A.connected_zones[zone_B] > 1) + zone_A.connected_zones[zone_B]-- + else + zone_A.connected_zones.Remove(zone_B) + if(zone_A.connected_zones && !zone_A.connected_zones.len) + zone_A.connected_zones = null if(zone_B) if(zone_B.connections) @@ -222,36 +277,38 @@ connection if(!zone_B.connections.len) del zone_B.connections - if(zone_B.connected_zones) - if(zone_B.connected_zones[zone_A] > 1) - zone_B.connected_zones[zone_A]-- - else - zone_B.connected_zones.Remove(zone_A) - if(zone_B.connected_zones && !zone_B.connected_zones.len) - zone_B.connected_zones = null + if(indirect != CONNECTION_CLOSED) + if(zone_B.connected_zones) + if(zone_B.connected_zones[zone_A] > 1) + zone_B.connected_zones[zone_A]-- + else + zone_B.connected_zones.Remove(zone_A) + if(zone_B.connected_zones && !zone_B.connected_zones.len) + zone_B.connected_zones = null - if(!A.zone.connections) - A.zone.connections = list() - A.zone.connections |= src - if(!B.zone.connections) - B.zone.connections = list() - B.zone.connections |= src + if(indirect != CONNECTION_CLOSED) + if(!A.zone.connections) + A.zone.connections = list() + A.zone.connections |= src + if(!B.zone.connections) + B.zone.connections = list() + B.zone.connections |= src - if(!A.zone.connected_zones) - A.zone.connected_zones = list() - if(!(B.zone in A.zone.connected_zones)) - A.zone.connected_zones += B.zone - A.zone.connected_zones[B.zone] = 1 - else - A.zone.connected_zones[B.zone]++ + if(!A.zone.connected_zones) + A.zone.connected_zones = list() + if(B.zone in A.zone.connected_zones) + A.zone.connected_zones[B.zone]++ + else + A.zone.connected_zones += B.zone + A.zone.connected_zones[B.zone] = 1 - if(!B.zone.connected_zones) - B.zone.connected_zones = list() - if(!(A.zone in B.zone.connected_zones)) - B.zone.connected_zones += A.zone - B.zone.connected_zones[A.zone] = 1 - else - B.zone.connected_zones[A.zone]++ + if(!B.zone.connected_zones) + B.zone.connected_zones = list() + if(A.zone in B.zone.connected_zones) + B.zone.connected_zones[A.zone]++ + else + B.zone.connected_zones += A.zone + B.zone.connected_zones[A.zone] = 1 zone_B = B.zone @@ -269,21 +326,22 @@ connection A.zone.connections = list() A.zone.connections |= src - if(zone_A.connected_zones) - if(zone_A.connected_zones[zone_B] > 1) - zone_A.connected_zones[zone_B]-- - else - zone_A.connected_zones.Remove(zone_B) - if(zone_A.connected_zones && !zone_A.connected_zones.len) - zone_A.connected_zones = null + if(indirect != CONNECTION_CLOSED) + if(zone_A.connected_zones) + if(zone_A.connected_zones[zone_B] > 1) + zone_A.connected_zones[zone_B]-- + else + zone_A.connected_zones.Remove(zone_B) + if(zone_A.connected_zones && !zone_A.connected_zones.len) + zone_A.connected_zones = null - if(!A.zone.connected_zones) - A.zone.connected_zones = list() - if(!(zone_B in A.zone.connected_zones)) - A.zone.connected_zones += zone_B - A.zone.connected_zones[zone_B] = 1 - else - A.zone.connected_zones[zone_B]++ + if(!A.zone.connected_zones) + A.zone.connected_zones = list() + if(!(zone_B in A.zone.connected_zones)) + A.zone.connected_zones += zone_B + A.zone.connected_zones[zone_B] = 1 + else + A.zone.connected_zones[zone_B]++ zone_A = A.zone @@ -301,23 +359,29 @@ connection B.zone.connections = list() B.zone.connections |= src - if(zone_B.connected_zones) - if(zone_B.connected_zones[zone_A] > 1) - zone_B.connected_zones[zone_A]-- - else - zone_B.connected_zones.Remove(zone_A) - if(zone_B.connected_zones && !zone_B.connected_zones.len) - zone_B.connected_zones = null + if(indirect != CONNECTION_CLOSED) + if(zone_B.connected_zones) + if(zone_B.connected_zones[zone_A] > 1) + zone_B.connected_zones[zone_A]-- + else + zone_B.connected_zones.Remove(zone_A) + if(zone_B.connected_zones && !zone_B.connected_zones.len) + zone_B.connected_zones = null - if(!B.zone.connected_zones) - B.zone.connected_zones = list() - if(!(zone_A in B.zone.connected_zones)) - B.zone.connected_zones += zone_A - B.zone.connected_zones[zone_A] = 1 - else - B.zone.connected_zones[zone_A]++ + if(!B.zone.connected_zones) + B.zone.connected_zones = list() + if(!(zone_A in B.zone.connected_zones)) + B.zone.connected_zones += zone_A + B.zone.connected_zones[zone_A] = 1 + else + B.zone.connected_zones[zone_A]++ zone_B = B.zone else - del src \ No newline at end of file + del src + + +#undef CONNECTION_DIRECT +#undef CONNECTION_INDIRECT +#undef CONNECTION_CLOSED \ No newline at end of file diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm index 27ce9995e19..e2c9d71fbc5 100644 --- a/code/ZAS/FEA_system.dm +++ b/code/ZAS/FEA_system.dm @@ -92,16 +92,14 @@ datum controller air_system //Geoemetry lists -// var/list/turf/simulated/active_singletons = list() + var/list/turf/simulated/turfs_with_connections = list() + var/list/obj/fire/active_hotspots = list() //Special functions lists -// var/list/turf/simulated/active_super_conductivity = list() -// var/list/turf/simulated/high_pressure_delta = list() //Geometry updates lists var/list/turf/simulated/tiles_to_update = list() var/list/connection/connections_checked = list() -// var/list/turf/simulated/groups_to_rebuild = list() var/current_cycle = 0 var/update_delay = 5 //How long between check should it try to process atmos again. @@ -144,7 +142,7 @@ datum S.update_air_properties() world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!" - spawn start() +// spawn start() proc/start() //Purpose: This is kicked off by the master controller, and controls the processing of all atmosphere. @@ -168,16 +166,19 @@ datum */ proc/tick() + . = 1 //Set the default return value, for runtime detection. if(current_cycle >= next_stat_check) var/zone/z = pick(zones) - var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY.txt")]") - log_file << "Zone | \The [get_area(pick(z.contents))] | [z.air.oxygen], [z.air.nitrogen], [z.air.carbon_dioxide], [z.air.toxins] | [z.air.temperature] | [z.air.group_multiplier * z.air.volume]" + var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY-air.txt")]") + log_file << "\"\The [get_area(pick(z.contents))]\",[z.air.oxygen],[z.air.nitrogen],[z.air.carbon_dioxide],[z.air.toxins],[z.air.temperature],[z.air.group_multiplier * z.air.volume]" next_stat_check = current_cycle + (rand(5,7)*60) if(tiles_to_update.len > 0) //If there are tiles to update, do so. for(var/turf/simulated/T in tiles_to_update) - T.update_air_properties() + var/output = T.update_air_properties() + if(. && T && !output) + . = 0 //If a runtime occured, make sure we can sense it. tiles_to_update = list() for(var/connection/C in connections_checked) C.CheckPassSanity() @@ -185,10 +186,13 @@ datum for(var/zone/Z in zones) if(Z.last_update < current_cycle) - Z.process() - if(Z) Z.last_update = current_cycle + var/output = Z.process() + if(Z) + Z.last_update = current_cycle + if(. && Z && !output) + . = 0 - for(var/obj/fire/F) - F.process() - - return 1 \ No newline at end of file + for(var/obj/fire/F in active_hotspots) + var/output = F.process() + if(. && F && !output) + . = 0 \ No newline at end of file diff --git a/code/ZAS/FEA_turf_tile.dm b/code/ZAS/FEA_turf_tile.dm index 9fc9fa3334e..dc7d4298b09 100644 --- a/code/ZAS/FEA_turf_tile.dm +++ b/code/ZAS/FEA_turf_tile.dm @@ -51,7 +51,6 @@ turf // current_cycle = 0 obj/fire/active_hotspot - tmp/list/connections // temperature_archived //USED ONLY FOR SOLIDS // being_superconductive = 0 @@ -194,12 +193,12 @@ turf if(!zone) //Still no zone, the floodfill determined it is not part of a larger zone. Force a zone on it. new/zone(list(src)) - if(connections) //Check pass sanity of the connections. - for(var/connection/C in connections) + if("\ref[src]" in air_master.turfs_with_connections) //Check pass sanity of the connections. + for(var/connection/C in air_master.turfs_with_connections["\ref[src]"]) if(!(C in air_master.connections_checked)) air_master.connections_checked += C - update_zone_properties() //Update self zone and adjacent zones. + . = update_zone_properties() //Update self zone and adjacent zones. if(air_check_directions) processing = 1 @@ -220,6 +219,7 @@ turf else ZConnect(src,T) + return 1 // else if(zone && !zone.rebuild) // for(var/direction2 in cardinal - reverse_direction(direction)) //Check all other directions for air that might be connected. diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index c7adbf2a7f7..c6be0e994d2 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -77,6 +77,7 @@ obj archived_firelevel = 0 process() + . = 1 if(firelevel > vsc.IgnitionLevel) @@ -167,12 +168,14 @@ obj firelevel = fl for(var/mob/living/carbon/human/M in loc) M.FireBurn(min(max(0.1,firelevel / 20),10)) //Burn the humans! + air_master.active_hotspots.Add(src) Del() if (istype(loc, /turf/simulated)) ul_SetLuminosity(0) loc = null + air_master.active_hotspots.Remove(src) ..() diff --git a/code/ZAS/Functions.dm b/code/ZAS/Functions.dm index 639eb8ef79e..dd21bbb0138 100644 --- a/code/ZAS/Functions.dm +++ b/code/ZAS/Functions.dm @@ -130,8 +130,8 @@ proc/ZConnect(turf/simulated/A,turf/simulated/B) return ZMerge(A.zone,B.zone) //Ensure the connection isn't already made. - if(A.connections) - for(var/connection/C in A.connections) + if("\ref[A]" in air_master.turfs_with_connections) + for(var/connection/C in air_master.turfs_with_connections["\ref[A]"]) C.Cleanup() if(C && (C.B == B || C.A == B)) return diff --git a/code/ZAS/Processing.dm b/code/ZAS/Processing.dm index d159d57369b..9e069dc62d0 100644 --- a/code/ZAS/Processing.dm +++ b/code/ZAS/Processing.dm @@ -1,10 +1,11 @@ #define QUANTIZE(variable) (round(variable,0.0001)) zone/proc/process() + . = 1 + //Deletes zone if empty. if(!contents.len) del src - return 0 - //Does rebuilding stuff. Not sure if used. + //Does rebuilding stuff. if(rebuild) rebuild = 0 Rebuild() //Shoving this into a proc. @@ -76,7 +77,7 @@ zone/proc/process() //Do merging if conditions are met. Specifically, if there's a non-door connection //to somewhere with space, the zones are merged regardless of equilibrium, to speed //up spacing in areas with double-plated windows. - if(C && !C.indirect && C.A.zone && C.B.zone) + if(C && C.indirect == 2 && C.A.zone && C.B.zone) //indirect = 2 is a direct connection. if(C.A.zone.air.compare(C.B.zone.air) || total_space) ZMerge(C.A.zone,C.B.zone) @@ -191,23 +192,6 @@ proc/ShareSpace(datum/gas_mixture/A, ratio) return 1 - -zone/proc/connected_zones() - //A legacy proc for getting connected zones. - . = list() - for(var/connection/C in connections) - var/zone/Z - if(C.A.zone == src) - Z = C.B.zone - else - Z = C.A.zone - - if(Z in .) - .[Z]++ - else - . += Z - .[Z] = 1 - zone/proc/Rebuild() //Choose a random turf and regenerate the zone from it. var @@ -215,11 +199,6 @@ zone/proc/Rebuild() list/new_contents problem = 0 - contents.Remove(null) //I can't believe this is needed. - - if(!contents.len) - del src - var/list/turfs_to_consider = contents.Copy() do if(sample) @@ -237,9 +216,8 @@ zone/proc/Rebuild() new_contents = FloodFill(sample) for(var/turf/space/S in new_contents) - if(!space_tiles) - space_tiles = list() - space_tiles |= S + AddSpace(S) + new_contents.Remove(S) if(contents.len != new_contents.len) problem = 1 @@ -255,20 +233,20 @@ zone/proc/Rebuild() var/list/turf/simulated/rebuild_turfs = contents - new_contents var/list/turf/simulated/reconsider_turfs = list() contents = new_contents - for(var/turf/T in rebuild_turfs) - if(istype(T,/turf/space)) - air_master.tiles_to_update |= T - else if(!T.zone && T.CanPass(null, T, 1.5, 1)) + for(var/turf/simulated/T in rebuild_turfs) + if(!T.zone && T.CanPass(null, T, 1.5, 1)) var/zone/Z = new /zone(T) Z.air.copy_from(air) else reconsider_turfs |= T - for(var/turf/T in reconsider_turfs) - if(!T.zone) + for(var/turf/simulated/T in reconsider_turfs) + if(!T.zone && T.CanPass(null, T, 1.5, 1)) var/zone/Z = new /zone(T) Z.air.copy_from(air) + else if(!T in air_master.tiles_to_update) + air_master.tiles_to_update.Add(T) - for(var/turf/T in contents) + for(var/turf/simulated/T in contents) if(T.zone && T.zone != src) T.zone.RemoveTurf(T) T.zone = src @@ -283,4 +261,20 @@ zone/proc/Rebuild() for(var/direction in cardinal) var/turf/simulated/T = get_step(S,direction) if(istype(T) && T.zone) - T.zone.AddSpace(S) \ No newline at end of file + T.zone.AddSpace(S) +/* +zone/proc/connected_zones() + //A legacy proc for getting connected zones. + . = list() + for(var/connection/C in connections) + var/zone/Z + if(C.A.zone == src) + Z = C.B.zone + else + Z = C.A.zone + + if(Z in .) + .[Z]++ + else + . += Z + .[Z] = 1*/ \ No newline at end of file diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index ab925dc6960..ec4a0cabe34 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -176,8 +176,11 @@ datum/controller/game_controller air_master.current_cycle++ var/success = air_master.tick() //Changed so that a runtime does not crash the ticker. if(!success) //Runtimed. - world << "ERROR IN ATMOS TICKER. Killing air simulation!" - kill_air = 1 + air_master.failed_ticks++ + if(air_master.failed_ticks > 5) + world << "RUNTIMES IN ATMOS TICKER. Killing air simulation!" + kill_air = 1 + air_master.failed_ticks = 0 air_master_ready = 1 src.set_debug_state("Tension Master")