From 37394c7d60719f1f0e925f0a4d8a2d95bfdcdc56 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:01:54 -0400 Subject: [PATCH 001/200] Initial commit --- code/__DEFINES/subsystems.dm | 10 + code/controllers/subsystem/zas.dm | 521 ++++++++++++++++++ code/modules/atmospherics/ZAS/Airflow.dm | 152 +++++ code/modules/atmospherics/ZAS/Atom.dm | 59 ++ code/modules/atmospherics/ZAS/Connection.dm | 168 ++++++ .../atmospherics/ZAS/ConnectionGroup.dm | 260 +++++++++ .../atmospherics/ZAS/ConnectionManager.dm | 105 ++++ code/modules/atmospherics/ZAS/Debug.dm | 20 + code/modules/atmospherics/ZAS/Diagnostic.dm | 82 +++ code/modules/atmospherics/ZAS/Fire.dm | 443 +++++++++++++++ code/modules/atmospherics/ZAS/Plasma.dm | 176 ++++++ code/modules/atmospherics/ZAS/Turf.dm | 295 ++++++++++ code/modules/atmospherics/ZAS/XGM/gas_data.dm | 103 ++++ code/modules/atmospherics/ZAS/Zone.dm | 214 +++++++ code/modules/atmospherics/ZAS/_docs.dm | 28 + tgstation.dme | 20 +- 16 files changed, 2655 insertions(+), 1 deletion(-) create mode 100644 code/controllers/subsystem/zas.dm create mode 100644 code/modules/atmospherics/ZAS/Airflow.dm create mode 100644 code/modules/atmospherics/ZAS/Atom.dm create mode 100644 code/modules/atmospherics/ZAS/Connection.dm create mode 100644 code/modules/atmospherics/ZAS/ConnectionGroup.dm create mode 100644 code/modules/atmospherics/ZAS/ConnectionManager.dm create mode 100644 code/modules/atmospherics/ZAS/Debug.dm create mode 100644 code/modules/atmospherics/ZAS/Diagnostic.dm create mode 100644 code/modules/atmospherics/ZAS/Fire.dm create mode 100644 code/modules/atmospherics/ZAS/Plasma.dm create mode 100644 code/modules/atmospherics/ZAS/Turf.dm create mode 100644 code/modules/atmospherics/ZAS/XGM/gas_data.dm create mode 100644 code/modules/atmospherics/ZAS/Zone.dm create mode 100644 code/modules/atmospherics/ZAS/_docs.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index f4437406205..9e1d38c8394 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -271,6 +271,16 @@ #define SSAIR_SUPERCONDUCTIVITY 7 #define SSAIR_PROCESS_ATOMS 8 +//ZAS subsystem subtasks +#define SSZAS_PIPENETS 1 +#define SSZAS_MACHINES 2 +#define SSZAS_TILES 3 +#define SSZAS_DEFERED_TILES 4 +#define SSZAS_EDGES 5 +#define SSZAS_FIRES 6 +#define SSZAS_HOTSPOTS 7 +#define SSZAS_ZONES 8 + //Pipeline rebuild helper defines, these suck but it'll do for now //Fools you actually merged it #define SSAIR_REBUILD_PIPELINE 1 #define SSAIR_REBUILD_QUEUE 2 diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm new file mode 100644 index 00000000000..f6cf060c884 --- /dev/null +++ b/code/controllers/subsystem/zas.dm @@ -0,0 +1,521 @@ +/* + +Overview: + The air controller does everything. There are tons of procs in here. + +Class Vars: + zones - All zones currently holding one or more turfs. + edges - All processing edges. + + tiles_to_update - Tiles scheduled to update next tick. + zones_to_update - Zones which have had their air changed and need air archival. + active_hotspots - All processing fire objects. + + active_zones - The number of zones which were archived last tick. Used in debug verbs. + next_id - The next UID to be applied to a zone. Mostly useful for debugging purposes as zones do not need UIDs to function. + +Class Procs: + + mark_for_update(turf/T) + Adds the turf to the update list. When updated, update_air_properties() will be called. + When stuff changes that might affect airflow, call this. It's basically the only thing you need. + + add_zone(zone/Z) and remove_zone(zone/Z) + Adds zones to the zones list. Does not mark them for update. + + air_blocked(turf/A, turf/B) + Returns a bitflag consisting of: + AIR_BLOCKED - The connection between turfs is physically blocked. No air can pass. + ZONE_BLOCKED - There is a door between the turfs, so zones cannot cross. Air may or may not be permeable. + + has_valid_zone(turf/T) + Checks the presence and validity of T's zone. + May be called on unsimulated turfs, returning 0. + + merge(zone/A, zone/B) + Called when zones have a direct connection and equivalent pressure and temperature. + Merges the zones to create a single zone. + + connect(turf/simulated/A, turf/B) + Called by turf/update_air_properties(). The first argument must be simulated. + Creates a connection between A and B. + + mark_zone_update(zone/Z) + Adds zone to the update list. Unlike mark_for_update(), this one is called automatically whenever + air is returned from a simulated turf. + + equivalent_pressure(zone/A, zone/B) + Currently identical to A.air.compare(B.air). Returns 1 when directly connected zones are ready to be merged. + + get_edge(zone/A, zone/B) + get_edge(zone/A, turf/B) + Gets a valid connection_edge between A and B, creating a new one if necessary. + + has_same_air(turf/A, turf/B) + Used to determine if an unsimulated edge represents a specific turf. + Simulated edges use connection_edge/contains_zone() for the same purpose. + Returns 1 if A has identical gases and temperature to B. + + remove_edge(connection_edge/edge) + Called when an edge is erased. Removes it from processing. + +*/ + +SUBSYSTEM_DEF(zas) + name = "ZAS" + priority = FIRE_PRIORITY_AIR + init_order = INIT_ORDER_AIR + flags = SS_POST_FIRE_TIMING + + //The variable setting controller + var/zas_controller/settings + //XGM gas data + var/datum/xgm_gas_data/gas_data + //Geometry lists + var/list/zones = list() + var/list/edges = list() + + //Pipenets + var/list/networks = list() + var/list/rebuild_queue = list() + var/list/expansion_queue = list() + + //Atmos Machines + var/list/atmos_machinery = list() + + //Geometry updates lists + var/list/tiles_to_update = list() + var/list/zones_to_update = list() + var/list/active_fire_zones = list() + var/list/active_hotspots = list() + var/list/active_edges = list() + + var/tmp/list/deferred = list() + var/tmp/list/processing_edges + var/tmp/list/processing_fires + var/tmp/list/processing_hotspots + var/tmp/list/processing_zones + + //Currently processing + var/list/curr_tiles + var/list/curr_defer + var/list/curr_edges + var/list/curr_fire + var/list/curr_hotspot + var/list/curr_zones + var/list/curr_machines + + + var/current_process = SSZAS_TILES + var/active_zones = 0 + var/next_id = 1 + +/datum/controller/subsystem/zas/proc/Reboot() + // Stop processing while we rebuild. + can_fire = FALSE + + // Make sure we don't rebuild mid-tick. + if (state != SS_IDLE) + to_chat(world, bold_announce("ZAS Rebuild initiated. Waiting for current air tick to complete before continuing.")) + while (state != SS_IDLE) + stoplag() + + while (zones.len) + var/zone/zone = zones[zones.len] + zones.len-- + + zone.c_invalidate() + + edges.Cut() + tiles_to_update.Cut() + zones_to_update.Cut() + active_fire_zones.Cut() + active_hotspots.Cut() + active_edges.Cut() + + // Re-run setup without air settling. + Initialize(REALTIMEOFDAY, simulate = FALSE) + + // Update next_fire so the MC doesn't try to make up for missed ticks. + next_fire = world.time + wait + can_fire = TRUE + +/datum/controller/subsystem/zas/stat_entry(msg) + if(!can_fire) + msg += "REBOOTING..." + else + msg += "TtU: [length(tiles_to_update)]" + msg += "ZtU: [length(zones_to_update)]" + msg += "AFZ: [length(active_fire_zones)]" + msg += "AH: [length(active_hotspots)]" + msg += "AE: [length(active_edges)]" + return ..() + +/datum/controller/subsystem/zas/Initialize(timeofday, simulate = TRUE) + + var/starttime = REALTIMEOFDAY + settings = new + gas_data = new /datum/xgm_gas_data + + to_chat(world, bold_announce("Processing Geometry...")) + + var/simulated_turf_count = 0 + for(var/turf/simulated/S) + simulated_turf_count++ + S.update_air_properties() + + CHECK_TICK + + to_chat(world, bold_announce( + {"Total Simulated Turfs: [simulated_turf_count] + Total Zones: [zones.len] + Total Edges: [edges.len] + Total Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"] + Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]"} + )) + + to_chat(world, bold_announce("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + + if (simulate) + to_chat(world, bold_announce("Settling air...")) + + starttime = REALTIMEOFDAY + fire(FALSE, TRUE) + + to_chat(world, bold_announce("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + + ..(timeofday) + +/datum/controller/subsystem/zas/fire(resumed = FALSE) + if (!resumed) + processing_edges = active_edges.Copy() + processing_fires = active_fire_zones.Copy() + processing_hotspots = active_hotspots.Copy() + + + curr_machines = atmos_machinery + if(current_process == SSZAS_MACHINES) + while (curr_machines.len) + var/obj/machinery/atmospherics/current_machine = curr_machines[curr_machines.len] + curr_machines.len-- + + if(!current_machine) + atmos_machinery -= current_machine + if(current_machine.process_atmos() == PROCESS_KILL) + stop_processing_machine(current_machine) + + if(MC_TICK_CHECK) + return + + current_process = SSZAS_TILES + curr_tiles = tiles_to_update + if(current_process == SSZAS_TILES || !resumed) + while (curr_tiles.len) + var/turf/T = curr_tiles[curr_tiles.len] + curr_tiles.len-- + + if (!T) + if (MC_TICK_CHECK) + return + continue + + //check if the turf is self-zone-blocked + var/c_airblock + ATMOS_CANPASS_TURF(c_airblock, T, T) + if(c_airblock & ZONE_BLOCKED) + deferred += T + if (MC_TICK_CHECK) + return + continue + + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + updated++ + #endif + + if (MC_TICK_CHECK) + return + + current_process = SSZAS_DEFERED_TILES + curr_defer = deferred + if(current_process == SSZAS_DEFERED_TILES) + while (curr_defer.len) + var/turf/T = curr_defer[curr_defer.len] + curr_defer.len-- + + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + updated++ + #endif + + if (MC_TICK_CHECK) + return + + current_process = SSZAS_EDGES + curr_edges = processing_edges + if(current_process == SSZAS_EDGES) + while (curr_edges.len) + var/connection_edge/edge = curr_edges[curr_edges.len] + curr_edges.len-- + + if (!edge) + if (MC_TICK_CHECK) + return + continue + + edge.tick() + if (MC_TICK_CHECK) + return + + current_process = SSZAS_FIRES + curr_fire = processing_fires + if(current_process == SSZAS_FIRES) + while (curr_fire.len) + var/zone/Z = curr_fire[curr_fire.len] + curr_fire.len-- + + Z.process_fire() + + if (MC_TICK_CHECK) + return + + current_process = SSZAS_HOTSPOTS + curr_hotspot = processing_hotspots + if(current_process == SSZAS_HOTSPOTS) + while (curr_hotspot.len) + var/obj/fire/F = curr_hotspot[curr_hotspot.len] + curr_hotspot.len-- + + F.Process() + + if (MC_TICK_CHECK) + return + + current_process = SSZAS_ZONES + curr_zones = processing_zones + if(current_process == SSZAS_ZONES) + while (curr_zones.len) + var/zone/Z = curr_zones[curr_zones.len] + curr_zones.len-- + + Z.tick() + Z.needs_update = FALSE + + if (MC_TICK_CHECK) + return + + current_process = SSZAS_MACHINES + +/** + * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. + * + * Arguments: + * * machine - The machine to start processing. Can be any /obj/machinery. + */ +/datum/controller/subsystem/zas/proc/start_processing_machine(obj/machinery/machine) + if(machine.atmos_processing) + return + if(QDELETED(machine)) + stack_trace("We tried to add a garbage collecting machine to SSzas. Don't") + return + machine.atmos_processing = TRUE + atmos_machinery += machine + +/** + * Removes a given machine to the processing system for SSZAS_MACHINES processing. + * + * Arguments: + * * machine - The machine to stop processing. + */ +/datum/controller/subsystem/zas/proc/stop_processing_machine(obj/machinery/machine) + if(!machine.atmos_processing) + return + machine.atmos_processing = FALSE + atmos_machinery -= machine + + // If we're currently processing atmos machines, there's a chance this machine is in + // the currentrun list, which is a cache of atmos_machinery. Remove it from that list + // as well to prevent processing qdeleted objects in the cache. + if(current_process == SSZAS_MACHINES) + curr_machines -= machine + +/datum/controller/subsystem/zas/proc/add_to_rebuild_queue(obj/machinery/atmospherics/atmos_machine) + if(istype(atmos_machine, /obj/machinery/atmospherics) && !atmos_machine.rebuilding) + rebuild_queue += atmos_machine + atmos_machine.rebuilding = TRUE + +/datum/controller/subsystem/zas/proc/add_to_expansion(datum/pipeline/line, starting_point) + var/list/new_packet = new(SSAIR_REBUILD_QUEUE) + new_packet[SSZAS_REBUILD_PIPELINE] = line + new_packet[SSZAS_REBUILD_QUEUE] = list(starting_point) + expansion_queue += list(new_packet) + +/datum/controller/subsystem/zas/proc/add_zone(zone/z) + zones += z + z.name = "Zone [next_id++]" + mark_zone_update(z) + +/datum/controller/subsystem/zas/proc/remove_zone(zone/z) + zones -= z + zones_to_update -= z + if (processing_zones) + processing_zones -= z + +/datum/controller/subsystem/zas/proc/air_blocked(turf/A, turf/B) + #ifdef ZASDBG + ASSERT(isturf(A)) + ASSERT(isturf(B)) + #endif + var/ablock + ATMOS_CANPASS_TURF(ablock, A, B) + if(ablock == BLOCKED) + return BLOCKED + ATMOS_CANPASS_TURF(., B, A) + return ablock | . + +/datum/controller/subsystem/zas/proc/merge(zone/A, zone/B) + #ifdef ZASDBG + ASSERT(istype(A)) + ASSERT(istype(B)) + ASSERT(!A.invalid) + ASSERT(!B.invalid) + ASSERT(A != B) + #endif + if(A.contents.len < B.contents.len) + A.c_merge(B) + mark_zone_update(B) + else + B.c_merge(A) + mark_zone_update(A) + +/datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) + #ifdef ZASDBG + ASSERT(istype(A)) + ASSERT(isturf(B)) + ASSERT(A.zone) + ASSERT(!A.zone.invalid) + //ASSERT(B.zone) + ASSERT(A != B) + #endif + + var/block = air_blocked(A,B) + if(block & AIR_BLOCKED) return + + var/direct = !(block & ZONE_BLOCKED) + var/space = !istype(B) + + if(!space) + if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) + merge(A.zone,B.zone) + return + + var/a_to_b = get_dir(A,B) + var/b_to_a = get_dir(B,A) + + if(!A.connections) A.connections = new + if(!B.connections) B.connections = new + + if(A.connections.get(a_to_b)) + return + if(B.connections.get(b_to_a)) + return + if(!space) + if(A.zone == B.zone) return + + + var/connection/c = new /connection(A,B) + + A.connections.place(c, a_to_b) + B.connections.place(c, b_to_a) + + if(direct) c.mark_direct() + +/datum/controller/subsystem/zas/proc/mark_for_update(turf/T) + #ifdef ZASDBG + ASSERT(isturf(T)) + #endif + if(T.needs_air_update) + return + tiles_to_update += T + #ifdef ZASDBG + T.overlays += mark + #endif + T.needs_air_update = 1 + +/datum/controller/subsystem/zas/proc/mark_zone_update(zone/Z) + #ifdef ZASDBG + ASSERT(istype(Z)) + #endif + if(Z.needs_update) + return + zones_to_update += Z + Z.needs_update = 1 + +/datum/controller/subsystem/zas/proc/mark_edge_sleeping(connection_edge/E) + #ifdef ZASDBG + ASSERT(istype(E)) + #endif + if(E.sleeping) + return + active_edges -= E + E.sleeping = 1 + +/datum/controller/subsystem/zas/proc/mark_edge_active(connection_edge/E) + #ifdef ZASDBG + ASSERT(istype(E)) + #endif + if(!E.sleeping) + return + active_edges += E + E.sleeping = 0 + +/datum/controller/subsystem/zas/proc/equivalent_pressure(zone/A, zone/B) + return A.air.compare(B.air) + +/datum/controller/subsystem/zas/proc/get_edge(zone/A, zone/B) + if(istype(B)) + for(var/connection_edge/zone/edge in A.edges) + if(edge.contains_zone(B)) + return edge + var/connection_edge/edge = new/connection_edge/zone(A,B) + edges += edge + edge.recheck() + return edge + else + for(var/connection_edge/unsimulated/edge in A.edges) + if(has_same_air(edge.B,B)) + return edge + var/connection_edge/edge = new/connection_edge/unsimulated(A,B) + edges += edge + edge.recheck() + return edge + +/datum/controller/subsystem/zas/proc/has_same_air(turf/A, turf/B) + if(A.initial_gas) + if(!B.initial_gas) + return 0 + for(var/g in A.initial_gas) + if(A.initial_gas[g] != B.initial_gas[g]) + return 0 + if(B.initial_gas) + if(!A.initial_gas) + return 0 + for(var/g in B.initial_gas) + if(A.initial_gas[g] != B.initial_gas[g]) + return 0 + if(A.temperature != B.temperature) + return 0 + return 1 + +/datum/controller/subsystem/zas/proc/remove_edge(connection_edge/E) + edges -= E + if(!E.sleeping) + active_edges -= E + if(processing_edges) + processing_edges -= E diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm new file mode 100644 index 00000000000..49020e27a64 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -0,0 +1,152 @@ +/* +Contains helper procs for airflow, handled in /connection_group. +*/ + +mob/var/tmp/last_airflow_stun = 0 +mob/proc/airflow_stun() + if(stat == 2) + return 0 + if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 + + if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) + to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>") + return 0 + if(buckled) + to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") + return 0 + if(!lying) + to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") + Weaken(5) + last_airflow_stun = world.time + +mob/living/silicon/airflow_stun() + return + +mob/living/carbon/slime/airflow_stun() + return + +mob/living/carbon/human/airflow_stun() + if(!slip_chance()) + to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") + return 0 + ..() + +atom/movable/proc/check_airflow_movable(n) + + if(anchored && !ismob(src)) return 0 + + if(!isobj(src) && n < vsc.airflow_dense_pressure) return 0 + + return 1 + +mob/check_airflow_movable(n) + if(n < vsc.airflow_heavy_pressure) + return 0 + return 1 + +mob/living/silicon/check_airflow_movable() + return 0 + + +obj/check_airflow_movable(n) + if(isnull(w_class)) + if(n < vsc.airflow_dense_pressure) return 0 //most non-item objs don't have a w_class yet + else + switch(w_class) + if(1,2) + if(n < vsc.airflow_lightest_pressure) return 0 + if(3) + if(n < vsc.airflow_light_pressure) return 0 + if(4,5) + if(n < vsc.airflow_medium_pressure) return 0 + if(6) + if(n < vsc.airflow_heavy_pressure) return 0 + if(7 to INFINITY) + if(n < vsc.airflow_dense_pressure) return 0 + return ..() + + +/atom/movable/var/tmp/turf/airflow_dest +/atom/movable/var/tmp/airflow_speed = 0 +/atom/movable/var/tmp/airflow_time = 0 +/atom/movable/var/tmp/last_airflow = 0 +/atom/movable/var/tmp/airborne_acceleration = 0 + +/atom/movable/proc/AirflowCanMove(n) + return 1 + +/mob/AirflowCanMove(n) + if(status_flags & GODMODE) + return 0 + if(buckled) + return 0 + var/obj/item/shoes = get_equipped_item(slot_shoes) + if(istype(shoes) && (shoes.item_flags & ITEM_FLAG_NOSLIP)) + return 0 + return 1 + +/atom/movable/Bump(atom/A) + if(airflow_speed > 0 && airflow_dest) + if(airborne_acceleration > 1) + airflow_hit(A) + else if(istype(src, /mob/living/carbon/human)) + to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") + airborne_acceleration = 0 + else + airflow_speed = 0 + airflow_time = 0 + airborne_acceleration = 0 + . = ..() + +atom/movable/proc/airflow_hit(atom/A) + airflow_speed = 0 + airflow_dest = null + airborne_acceleration = 0 + +mob/airflow_hit(atom/A) + for(var/mob/M in hearers(src)) + M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) + playsound(src.loc, "smash.ogg", 25, 1, -1) + var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh + Weaken(weak_amt) + . = ..() + +obj/airflow_hit(atom/A) + for(var/mob/M in hearers(src)) + M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) + playsound(src.loc, "smash.ogg", 25, 1, -1) + . = ..() + +obj/item/airflow_hit(atom/A) + airflow_speed = 0 + airflow_dest = null + +mob/living/carbon/human/airflow_hit(atom/A) +// for(var/mob/M in hearers(src)) +// M.show_message("<span class='danger'>[src] slams into [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) + playsound(src.loc, "punch", 25, 1, -1) + if (prob(33)) + loc:add_blood(src) + bloody_body(src) + var/b_loss = min(airflow_speed, (airborne_acceleration*2)) * vsc.airflow_damage + + apply_damage(b_loss/3, BRUTE, BP_HEAD, used_weapon = "Airflow") + + apply_damage(b_loss/3, BRUTE, BP_CHEST, used_weapon = "Airflow") + + apply_damage(b_loss/3, BRUTE, BP_GROIN, used_weapon = "Airflow") + + if(airflow_speed > 10) + Paralyse(round(airflow_speed * vsc.airflow_stun)) + Stun(paralysis + 3) + else + Stun(round(airflow_speed * vsc.airflow_stun/2)) + . = ..() + +zone/proc/movables() + . = list() + for(var/turf/T in contents) + for(var/atom/movable/A in T) + if(!A.simulated || A.anchored || istype(A, /obj/effect) || isobserver(A)) + continue + . += A diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm new file mode 100644 index 00000000000..fdf263052e7 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -0,0 +1,59 @@ + +/atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) + //Purpose: Determines if the object (or airflow) can pass this atom. + //Called by: Movement, airflow. + //Inputs: The moving atom (optional), target turf, "height" and air group + //Outputs: Boolean if can pass. + + return (!density || !height || air_group) + +/turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) + if(!target) return 0 + + if(istype(mover)) // turf/Enter(...) will perform more advanced checks + return !density + + else // Now, doing more detailed checks for air movement and air group formation + if(target.blocks_air||blocks_air) + return 0 + + for(var/obj/obstacle in src) + if(!obstacle.CanPass(mover, target, height, air_group)) + return 0 + if(target != src) + for(var/obj/obstacle in target) + if(!obstacle.CanPass(mover, src, height, air_group)) + return 0 + + return 1 + +//Convenience function for atoms to update turfs they occupy +/atom/movable/proc/update_nearby_tiles(need_rebuild) + for(var/turf/simulated/turf in locs) + SSair.mark_for_update(turf) + + return 1 + +//Basically another way of calling CanPass(null, other, 0, 0) and CanPass(null, other, 1.5, 1). +//Returns: +// 0 - Not blocked +// AIR_BLOCKED - Blocked +// ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. +// BLOCKED - Blocked, zone boundaries will not cross even if opened. +atom/proc/c_airblock(turf/other) + #ifdef ZASDBG + ASSERT(isturf(other)) + #endif + return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) + +// This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. +turf/c_airblock(turf/other) + #ifdef ZASDBG + ASSERT(isturf(other)) + #endif + + . = 0 + ATMOS_CANPASS_TURF(., src, other) + +/atom/movable + var/atmos_canpass = CANPASS_ALWAYS diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm new file mode 100644 index 00000000000..17c8ea16281 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -0,0 +1,168 @@ +#define CONNECTION_DIRECT 2 +#define CONNECTION_SPACE 4 +#define CONNECTION_INVALID 8 + +/* + +Overview: + Connections are made between turfs by SSair.connect(). They represent a single point where two zones converge. + +Class Vars: + A - Always a simulated turf. + B - A simulated or unsimulated turf. + + zoneA - The archived zone of A. Used to check that the zone hasn't changed. + zoneB - The archived zone of B. May be null in case of unsimulated connections. + + edge - Stores the edge this connection is in. Can reference an edge that is no longer processed + after this connection is removed, so make sure to check edge.coefficient > 0 before re-adding it. + +Class Procs: + + mark_direct() + Marks this connection as direct. Does not update the edge. + Called when the connection is made and there are no doors between A and B. + Also called by update() as a correction. + + mark_indirect() + Unmarks this connection as direct. Does not update the edge. + Called by update() as a correction. + + mark_space() + Marks this connection as unsimulated. Updating the connection will check the validity of this. + Called when the connection is made. + This will not be called as a correction, any connections failing a check against this mark are erased and rebuilt. + + direct() + Returns 1 if no doors are in between A and B. + + valid() + Returns 1 if the connection has not been erased. + + erase() + Called by update() and connection_manager/erase_all(). + Marks the connection as erased and removes it from its edge. + + update() + Called by connection_manager/update_all(). + Makes numerous checks to decide whether the connection is still valid. Erases it automatically if not. + +*/ + +/connection/var/turf/simulated/A +/connection/var/turf/simulated/B +/connection/var/zone/zoneA +/connection/var/zone/zoneB + +/connection/var/connection_edge/edge + +/connection/var/state = 0 + +/connection/New(turf/simulated/A, turf/simulated/B) + #ifdef ZASDBG + ASSERT(SSair.has_valid_zone(A)) + //ASSERT(SSair.has_valid_zone(B)) + #endif + src.A = A + src.B = B + zoneA = A.zone + if(!istype(B)) + mark_space() + edge = SSair.get_edge(A.zone,B) + edge.add_connection(src) + else + zoneB = B.zone + edge = SSair.get_edge(A.zone,B.zone) + edge.add_connection(src) + +/connection/proc/mark_direct() + if(!direct()) + state |= CONNECTION_DIRECT + edge.direct++ +// log_debug("Marked direct.") + +/connection/proc/mark_indirect() + if(direct()) + state &= ~CONNECTION_DIRECT + edge.direct-- +// log_debug("Marked indirect.") + +/connection/proc/mark_space() + state |= CONNECTION_SPACE + +/connection/proc/direct() + return (state & CONNECTION_DIRECT) + +/connection/proc/valid() + return !(state & CONNECTION_INVALID) + +/connection/proc/erase() + edge.remove_connection(src) + state |= CONNECTION_INVALID +// log_debug("Connection Erased: [state]") + +/connection/proc/update() +// log_debug("Updated, \...") + if(!istype(A,/turf/simulated)) +// log_debug("Invalid A.") + erase() + return + + var/block_status = SSair.air_blocked(A,B) + if(block_status & AIR_BLOCKED) +// log_debug("Blocked connection.") + erase() + return + else if(block_status & ZONE_BLOCKED) + mark_indirect() + else + mark_direct() + + var/b_is_space = !istype(B,/turf/simulated) + + if(state & CONNECTION_SPACE) + if(!b_is_space) +// log_debug("Invalid B.") + erase() + return + if(A.zone != zoneA) +// log_debug("Zone changed, \...") + if(!A.zone) + erase() +// log_debug("erased.") + return + else + edge.remove_connection(src) + edge = SSair.get_edge(A.zone, B) + edge.add_connection(src) + zoneA = A.zone + +// log_debug("valid.") + return + + else if(b_is_space) +// log_debug("Invalid B.") + erase() + return + + if(A.zone == B.zone) +// log_debug("A == B") + erase() + return + + if(A.zone != zoneA || (zoneB && (B.zone != zoneB))) + +// log_debug("Zones changed, \...") + if(A.zone && B.zone) + edge.remove_connection(src) + edge = SSair.get_edge(A.zone, B.zone) + edge.add_connection(src) + zoneA = A.zone + zoneB = B.zone + else +// log_debug("erased.") + erase() + return + + +// log_debug("valid.") \ No newline at end of file diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm new file mode 100644 index 00000000000..17249aae155 --- /dev/null +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -0,0 +1,260 @@ +/* + +Overview: + These are what handle gas transfers between zones and into space. + They are found in a zone's edges list and in SSair.edges. + Each edge updates every air tick due to their role in gas transfer. + They come in two flavors, /connection_edge/zone and /connection_edge/unsimulated. + As the type names might suggest, they handle inter-zone and spacelike connections respectively. + +Class Vars: + + A - This always holds a zone. In unsimulated edges, it holds the only zone. + + connecting_turfs - This holds a list of connected turfs, mainly for the sake of airflow. + + coefficent - This is a marker for how many connections are on this edge. Used to determine the ratio of flow. + + connection_edge/zone + + B - This holds the second zone with which the first zone equalizes. + + direct - This counts the number of direct (i.e. with no doors) connections on this edge. + Any value of this is sufficient to make the zones mergeable. + + connection_edge/unsimulated + + B - This holds an unsimulated turf which has the gas values this edge is mimicing. + + air - Retrieved from B on creation and used as an argument for the legacy ShareSpace() proc. + +Class Procs: + + add_connection(connection/c) + Adds a connection to this edge. Usually increments the coefficient and adds a turf to connecting_turfs. + + remove_connection(connection/c) + Removes a connection from this edge. This works even if c is not in the edge, so be careful. + If the coefficient reaches zero as a result, the edge is erased. + + contains_zone(zone/Z) + Returns true if either A or B is equal to Z. Unsimulated connections return true only on A. + + erase() + Removes this connection from processing and zone edge lists. + + tick() + Called every air tick on edges in the processing list. Equalizes gas. + + flow(list/movable, differential, repelled) + Airflow proc causing all objects in movable to be checked against a pressure differential. + If repelled is true, the objects move away from any turf in connecting_turfs, otherwise they approach. + A check against vsc.lightest_airflow_pressure should generally be performed before calling this. + + get_connected_zone(zone/from) + Helper proc that allows getting the other zone of an edge given one of them. + Only on /connection_edge/zone, otherwise use A. + +*/ + + +/connection_edge/var/zone/A + +/connection_edge/var/list/connecting_turfs = list() +/connection_edge/var/direct = 0 +/connection_edge/var/sleeping = 1 + +/connection_edge/var/coefficient = 0 + +/connection_edge/New() + CRASH("Cannot make connection edge without specifications.") + +/connection_edge/proc/add_connection(connection/c) + coefficient++ + if(c.direct()) direct++ +// log_debug("Connection added: [type] Coefficient: [coefficient]") + + +/connection_edge/proc/remove_connection(connection/c) +// log_debug("Connection removed: [type] Coefficient: [coefficient-1]") + + coefficient-- + if(coefficient <= 0) + erase() + if(c.direct()) direct-- + +/connection_edge/proc/contains_zone(zone/Z) + +/connection_edge/proc/erase() + SSair.remove_edge(src) +// log_debug("[type] Erased.") + + +/connection_edge/proc/tick() + +/connection_edge/proc/recheck() + +/connection_edge/proc/flow(list/movable, differential, repelled) + for(var/i = 1; i <= movable.len; i++) + var/atom/movable/M = movable[i] + + //If they're already being tossed, don't do it again. + if(M.last_airflow > world.time - vsc.airflow_delay) continue + if(M.airflow_speed) continue + + //Check for knocking people over + if(ismob(M) && differential > vsc.airflow_stun_pressure) + if(M:status_flags & GODMODE) continue + M:airflow_stun() + + if(M.check_airflow_movable(differential)) + //Check for things that are in range of the midpoint turfs. + var/list/close_turfs = list() + for(var/turf/U in connecting_turfs) + if(get_dist(M,U) < world.view) close_turfs += U + if(!close_turfs.len) continue + + M.airflow_dest = pick(close_turfs) //Pick a random midpoint to fly towards. + + if(repelled) spawn if(M) M.RepelAirflowDest(differential/5) + else spawn if(M) M.GotoAirflowDest(differential/10) + + + + +/connection_edge/zone/var/zone/B + +/connection_edge/zone/New(zone/A, zone/B) + + src.A = A + src.B = B + A.edges.Add(src) + B.edges.Add(src) + //id = edge_id(A,B) +// log_debug("New edge between [A] and [B]") + + +/connection_edge/zone/add_connection(connection/c) + . = ..() + connecting_turfs.Add(c.A) + +/connection_edge/zone/remove_connection(connection/c) + connecting_turfs.Remove(c.A) + . = ..() + +/connection_edge/zone/contains_zone(zone/Z) + return A == Z || B == Z + +/connection_edge/zone/erase() + A.edges.Remove(src) + B.edges.Remove(src) + . = ..() + +/connection_edge/zone/tick() + if(A.invalid || B.invalid) + erase() + return + + var/equiv = A.air.share_ratio(B.air, coefficient) + + var/differential = A.air.return_pressure() - B.air.return_pressure() + if(abs(differential) >= vsc.airflow_lightest_pressure) + var/list/attracted + var/list/repelled + if(differential > 0) + attracted = A.movables() + repelled = B.movables() + else + attracted = B.movables() + repelled = A.movables() + + flow(attracted, abs(differential), 0) + flow(repelled, abs(differential), 1) + + if(equiv) + if(direct) + erase() + SSair.merge(A, B) + return + else + A.air.equalize(B.air) + SSair.mark_edge_sleeping(src) + + SSair.mark_zone_update(A) + SSair.mark_zone_update(B) + +/connection_edge/zone/recheck() + if(!A.air.compare(B.air, vacuum_exception = 1)) + // Edges with only one side being vacuum need processing no matter how close. + SSair.mark_edge_active(src) + +//Helper proc to get connections for a zone. +/connection_edge/zone/proc/get_connected_zone(zone/from) + if(A == from) return B + else return A + +/connection_edge/unsimulated/var/turf/B +/connection_edge/unsimulated/var/datum/gas_mixture/air + +/connection_edge/unsimulated/New(zone/A, turf/B) + src.A = A + src.B = B + A.edges.Add(src) + air = B.return_air() + //id = 52*A.id +// log_debug("New edge from [A] to [B].") + + +/connection_edge/unsimulated/add_connection(connection/c) + . = ..() + connecting_turfs.Add(c.B) + air.group_multiplier = coefficient + +/connection_edge/unsimulated/remove_connection(connection/c) + connecting_turfs.Remove(c.B) + air.group_multiplier = coefficient + . = ..() + +/connection_edge/unsimulated/erase() + A.edges.Remove(src) + . = ..() + +/connection_edge/unsimulated/contains_zone(zone/Z) + return A == Z + +/connection_edge/unsimulated/tick() + if(A.invalid) + erase() + return + + var/equiv = A.air.share_space(air) + + var/differential = A.air.return_pressure() - air.return_pressure() + if(abs(differential) >= vsc.airflow_lightest_pressure) + var/list/attracted = A.movables() + flow(attracted, abs(differential), differential < 0) + + if(equiv) + A.air.copy_from(air) + SSair.mark_edge_sleeping(src) + + SSair.mark_zone_update(A) + +/connection_edge/unsimulated/recheck() + // Edges with only one side being vacuum need processing no matter how close. + // Note: This handles the glaring flaw of a room holding pressure while exposed to space, but + // does not specially handle the less common case of a simulated room exposed to an unsimulated pressurized turf. + if(!A.air.compare(air, vacuum_exception = 1)) + SSair.mark_edge_active(src) + +proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) + //This implements a simplistic version of the Stefan-Boltzmann law. + var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 + var/maximum_energy_delta = max(0, min(A.temperature * A.heat_capacity() * A.group_multiplier, B.temperature * B.heat_capacity() * B.group_multiplier)) + if(maximum_energy_delta > abs(energy_delta)) + if(energy_delta < 0) + maximum_energy_delta *= -1 + energy_delta = maximum_energy_delta + + A.temperature -= energy_delta / (A.heat_capacity() * A.group_multiplier) + B.temperature += energy_delta / (B.heat_capacity() * B.group_multiplier) diff --git a/code/modules/atmospherics/ZAS/ConnectionManager.dm b/code/modules/atmospherics/ZAS/ConnectionManager.dm new file mode 100644 index 00000000000..3890cd85f5c --- /dev/null +++ b/code/modules/atmospherics/ZAS/ConnectionManager.dm @@ -0,0 +1,105 @@ +/* + +Overview: + The connection_manager class stores connections in each cardinal direction on a turf. + It isn't always present if a turf has no connections, check if(connections) before using. + Contains procs for mass manipulation of connection data. + +Class Vars: + + NSEWUD - Connections to this turf in each cardinal direction. + +Class Procs: + + get(d) + Returns the connection (if any) in this direction. + Preferable to accessing the connection directly because it checks validity. + + place(connection/c, d) + Called by air_master.connect(). Sets the connection in the specified direction to c. + + update_all() + Called after turf/update_air_properties(). Updates the validity of all connections on this turf. + + erase_all() + Called when the turf is changed with ChangeTurf(). Erases all existing connections. + +Macros: + check(connection/c) + Checks for connection validity. It's possible to have a reference to a connection that has been erased. + + +*/ + +// macro-ized to cut down on proc calls +#define check(c) (c && c.valid()) + +/turf/var/tmp/connection_manager/connections + +/connection_manager/var/connection/N +/connection_manager/var/connection/S +/connection_manager/var/connection/E +/connection_manager/var/connection/W + +#ifdef MULTIZAS +/connection_manager/var/connection/U +/connection_manager/var/connection/D +#endif + +/connection_manager/proc/get(d) + switch(d) + if(NORTH) + if(check(N)) return N + else return null + if(SOUTH) + if(check(S)) return S + else return null + if(EAST) + if(check(E)) return E + else return null + if(WEST) + if(check(W)) return W + else return null + + #ifdef MULTIZAS + if(UP) + if(check(U)) return U + else return null + if(DOWN) + if(check(D)) return D + else return null + #endif + +/connection_manager/proc/place(connection/c, d) + switch(d) + if(NORTH) N = c + if(SOUTH) S = c + if(EAST) E = c + if(WEST) W = c + + #ifdef MULTIZAS + if(UP) U = c + if(DOWN) D = c + #endif + +/connection_manager/proc/update_all() + if(check(N)) N.update() + if(check(S)) S.update() + if(check(E)) E.update() + if(check(W)) W.update() + #ifdef MULTIZAS + if(check(U)) U.update() + if(check(D)) D.update() + #endif + +/connection_manager/proc/erase_all() + if(check(N)) N.erase() + if(check(S)) S.erase() + if(check(E)) E.erase() + if(check(W)) W.erase() + #ifdef MULTIZAS + if(check(U)) U.erase() + if(check(D)) D.erase() + #endif + +#undef check diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm new file mode 100644 index 00000000000..6f0a67fd3eb --- /dev/null +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -0,0 +1,20 @@ +var/image/assigned = image('icons/Testing/Zone.dmi', icon_state = "assigned") +var/image/created = image('icons/Testing/Zone.dmi', icon_state = "created") +var/image/merged = image('icons/Testing/Zone.dmi', icon_state = "merged") +var/image/invalid_zone = image('icons/Testing/Zone.dmi', icon_state = "invalid") +var/image/air_blocked = image('icons/Testing/Zone.dmi', icon_state = "block") +var/image/zone_blocked = image('icons/Testing/Zone.dmi', icon_state = "zoneblock") +var/image/blocked = image('icons/Testing/Zone.dmi', icon_state = "fullblock") +var/image/mark = image('icons/Testing/Zone.dmi', icon_state = "mark") + +/connection_edge/var/dbg_out = 0 + +/turf/var/tmp/dbg_img +/turf/proc/dbg(image/img, d = 0) + if(d > 0) img.dir = d + overlays -= dbg_img + overlays += img + dbg_img = img + +proc/soft_assert(thing,fail) + if(!thing) message_admins(fail) \ No newline at end of file diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm new file mode 100644 index 00000000000..4433dfefdd8 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -0,0 +1,82 @@ +client/proc/Zone_Info(turf/T as null|turf) + set category = "Debug" + if(T) + if(istype(T,/turf/simulated) && T:zone) + T:zone:dbg_data(src) + else + to_chat(mob, "No zone here.") + var/datum/gas_mixture/mix = T.return_air() + to_chat(mob, "[mix.return_pressure()] kPa [mix.temperature]C") + for(var/g in mix.gas) + to_chat(mob, "[g]: [mix.gas[g]]\n") + else + if(zone_debug_images) + for(var/zone in zone_debug_images) + images -= zone_debug_images[zone] + zone_debug_images = null + +client/var/list/zone_debug_images + +client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) + set category = "Debug" + if(!istype(T)) + return + + var/direction_list = list(\ + "North" = NORTH,\ + "South" = SOUTH,\ + "East" = EAST,\ + "West" = WEST,\ + #ifdef MULTIZAS + "Up" = UP,\ + "Down" = DOWN,\ + #endif + "N/A" = null) + var/direction = input("What direction do you wish to test?","Set direction") as null|anything in direction_list + if(!direction) + return + + if(direction == "N/A") + if(!(T.c_airblock(T) & AIR_BLOCKED)) + to_chat(mob, "The turf can pass air! :D") + else + to_chat(mob, "No air passage :x") + return + + var/turf/simulated/other_turf = get_step(T, direction_list[direction]) + if(!istype(other_turf)) + return + + var/t_block = T.c_airblock(other_turf) + var/o_block = other_turf.c_airblock(T) + + if(o_block & AIR_BLOCKED) + if(t_block & AIR_BLOCKED) + to_chat(mob, "Neither turf can connect. :(") + + else + to_chat(mob, "The initial turf only can connect. :\\") + else + if(t_block & AIR_BLOCKED) + to_chat(mob, "The other turf can connect, but not the initial turf. :/") + + else + to_chat(mob, "Both turfs can connect! :)") + + to_chat(mob, "Additionally, \...") + + if(o_block & ZONE_BLOCKED) + if(t_block & ZONE_BLOCKED) + to_chat(mob, "neither turf can merge.") + else + to_chat(mob, "the other turf cannot merge.") + else + if(t_block & ZONE_BLOCKED) + to_chat(mob, "the initial turf cannot merge.") + else + to_chat(mob, "both turfs can merge.") + +client/proc/ZASSettings() + set category = "Debug" + + vsc.SetDefault(mob) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm new file mode 100644 index 00000000000..477714c2c76 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -0,0 +1,443 @@ +/* + +Making Bombs with ZAS: +Get gas to react in an air tank so that it gains pressure. If it gains enough pressure, it goes boom. +The more pressure, the more boom. +If it gains pressure too slowly, it may leak or just rupture instead of exploding. +*/ + +//#define FIREDBG + +/turf/var/obj/fire/fire = null + +//Some legacy definitions so fires can be started. +atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return null + +/atom/movable/proc/is_burnable() + return FALSE + +/mob/is_burnable() + return simulated + +turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) + + +/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) + if(fire_protection > world.time-300) + return 0 + if(locate(/obj/fire) in src) + return 1 + var/datum/gas_mixture/air_contents = return_air() + if(!air_contents || exposed_temperature < PHORON_MINIMUM_BURN_TEMPERATURE) + return 0 + + var/igniting = 0 + var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src + + if(air_contents.check_combustability(liquid)) + igniting = 1 + + create_fire(exposed_temperature) + return igniting + +/zone/proc/process_fire() + var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len) + + var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) + + air.merge(burn_gas) + + if(firelevel) + for(var/turf/T in fire_tiles) + if(T.fire) + T.fire.firelevel = firelevel + else + var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + fire_tiles -= T + fuel_objs -= fuel + else + for(var/turf/simulated/T in fire_tiles) + if(istype(T.fire)) + qdel(T.fire) + fire_tiles.Cut() + fuel_objs.Cut() + + if(!fire_tiles.len) + SSair.active_fire_zones.Remove(src) + +/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0) + if(!fuel_objs.len) + return + + //As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel, + //some have less, but whatever. It will mean that sometimes we will remove a tiny bit less fuel then we intended to. + + var/fuel_to_remove = used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units + + for(var/O in fuel_objs) + var/obj/effect/decal/cleanable/liquid_fuel/fuel = O + if(!istype(fuel)) + fuel_objs -= fuel + continue + + fuel.amount -= fuel_to_remove + if(fuel.amount <= 0) + fuel_objs -= fuel + if(remove_fire) + var/turf/T = fuel.loc + if(istype(T) && T.fire) qdel(T.fire) + qdel(fuel) + +/turf/proc/create_fire(fl) + return 0 + +/turf/simulated/create_fire(fl) + + if(submerged()) + return 1 + + if(fire) + fire.firelevel = max(fl, fire.firelevel) + return 1 + + if(!zone) + return 1 + + fire = new(src, fl) + SSair.active_fire_zones |= zone + + var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src + zone.fire_tiles |= src + if(fuel) zone.fuel_objs += fuel + + return 0 + +/obj/fire + //Icon for fire on turfs. + + anchored = TRUE + mouse_opacity = 0 + + blend_mode = BLEND_ADD + + icon = 'icons/effects/fire.dmi' + icon_state = "1" + light_color = "#ed9200" + layer = FIRE_LAYER + + var/firelevel = 1 //Calculated by gas_mixture.calculate_firelevel() + +/obj/fire/Process() + . = 1 + + var/turf/simulated/my_tile = loc + if(!istype(my_tile) || !my_tile.zone || my_tile.submerged()) + if(my_tile && my_tile.fire == src) + my_tile.fire = null + qdel(src) + return PROCESS_KILL + + var/datum/gas_mixture/air_contents = my_tile.return_air() + + if(firelevel > 6) + icon_state = "3" + set_light(1, 2, 7) + else if(firelevel > 2.5) + icon_state = "2" + set_light(0.7, 2, 5) + else + icon_state = "1" + set_light(0.5, 1, 3) + + for(var/mob/living/L in loc) + L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs! + + loc.fire_act(air_contents, air_contents.temperature, air_contents.volume) + for(var/atom/A in loc) + A.fire_act(air_contents, air_contents.temperature, air_contents.volume) + + //spread + for(var/direction in GLOB.cardinal) + var/turf/simulated/enemy_tile = get_step(my_tile, direction) + + if(istype(enemy_tile)) + if(my_tile.open_directions & direction) //Grab all valid bordering tiles + if(!enemy_tile.zone || enemy_tile.fire) + continue + + //if(!enemy_tile.zone.fire_tiles.len) TODO - optimize + var/datum/gas_mixture/acs = enemy_tile.return_air() + var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in enemy_tile + if(!acs || !acs.check_combustability(liquid)) + continue + + //If extinguisher mist passed over the turf it's trying to spread to, don't spread and + //reduce firelevel. + if(enemy_tile.fire_protection > world.time-30) + firelevel -= 1.5 + continue + + //Spread the fire. + if(prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && my_tile.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, my_tile, 0,0)) + enemy_tile.create_fire(firelevel) + + else + enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume) + + animate(src, color = fire_color(air_contents.temperature), 5) + set_light(l_color = color) + +/obj/fire/New(newLoc,fl) + ..() + + if(!istype(loc, /turf)) + qdel(src) + return + + set_dir(pick(GLOB.cardinal)) + + var/datum/gas_mixture/air_contents = loc.return_air() + color = fire_color(air_contents.temperature) + set_light(0.5, 1, 3, l_color = color) + + firelevel = fl + SSair.active_hotspots.Add(src) + +/obj/fire/proc/fire_color(var/env_temperature) + var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature) + return heat2color(temperature) + +/obj/fire/Destroy() + var/turf/T = loc + if (istype(T)) + set_light(0) + T.fire = null + SSair.active_hotspots.Remove(src) + . = ..() + +/turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. +/turf/proc/apply_fire_protection() +/turf/simulated/apply_fire_protection() + fire_protection = world.time + +//Returns the firelevel +/datum/gas_mixture/proc/react(zone/zone, force_burn, no_check = 0) + . = 0 + if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null))) + + #ifdef FIREDBG + log_debug("***************** FIREDBG *****************") + log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!") + #endif + + var/gas_fuel = 0 + var/liquid_fuel = 0 + var/total_fuel = 0 + var/total_oxidizers = 0 + + //*** Get the fuel and oxidizer amounts + for(var/g in gas) + if(gas_data.flags[g] & XGM_GAS_FUEL) + gas_fuel += gas[g] + if(gas_data.flags[g] & XGM_GAS_OXIDIZER) + total_oxidizers += gas[g] + gas_fuel *= group_multiplier + total_oxidizers *= group_multiplier + + //Liquid Fuel + var/fuel_area = 0 + if(zone) + for(var/obj/effect/decal/cleanable/liquid_fuel/fuel in zone.fuel_objs) + liquid_fuel += fuel.amount*LIQUIDFUEL_AMOUNT_TO_MOL + fuel_area++ + + total_fuel = gas_fuel + liquid_fuel + if(total_fuel <= 0.005) + return 0 + + //*** Determine how fast the fire burns + + //get the current thermal energy of the gas mix + //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity + var/starting_energy = temperature * heat_capacity() + + //determine how far the reaction can progress + var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit + + //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) + var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / vsc.fire_firelevel_multiplier + var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast + var/gas_reaction_progress = min(max(min_burn, gas_firelevel*gas_fuel)*FIRE_GAS_BURNRATE_MULT, gas_fuel) + + //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area. + var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / vsc.fire_firelevel_multiplier + var/liquid_reaction_progress = min((liquid_firelevel*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT, liquid_fuel) + + var/firelevel = (gas_fuel*gas_firelevel + liquid_fuel*liquid_firelevel)/total_fuel + + var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress + var/used_fuel = min(total_reaction_progress, reaction_limit) + var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) + + #ifdef FIREDBG + log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]") + log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]") + log_debug("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])") + log_debug("liquid_reaction_progress = [liquid_reaction_progress]") + log_debug("gas_reaction_progress = [gas_reaction_progress]") + log_debug("total_reaction_progress = [total_reaction_progress]") + log_debug("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") + #endif + + //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out + if(zone) //be less restrictive with canister and tank reactions + if((!liquid_fuel || used_fuel <= FIRE_LIQUD_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE*zone.contents.len)) + return 0 + + + //*** Remove fuel and oxidizer, add carbon dioxide and heat + + //remove and add gasses as calculated + var/used_gas_fuel = min(max(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress)), gas_fuel) //remove in proportion to the relative reaction progress + var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel) + + //remove_by_flag() and adjust_gas() handle the group_multiplier for us. + remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) + var/datum/gas_mixture/burned_fuel = remove_by_flag(XGM_GAS_FUEL, used_gas_fuel) + for(var/g in burned_fuel.gas) + adjust_gas(gas_data.burn_product[g], burned_fuel.gas[g]) + + if(zone) + zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) + + //calculate the energy produced by the reaction and then set the new temperature of the mix + temperature = (starting_energy + vsc.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity() + update_values() + + #ifdef FIREDBG + log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") + log_debug("new temperature = [temperature]; new pressure = [return_pressure()]") + #endif + + if (temperature<220) + firelevel = 0 + + return firelevel + +datum/gas_mixture/proc/check_recombustability(list/fuel_objs) + . = 0 + for(var/g in gas) + if(gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) + . = 1 + break + + if(!.) + return 0 + + if(fuel_objs && fuel_objs.len) + return 1 + + . = 0 + for(var/g in gas) + if(gas_data.flags[g] & XGM_GAS_FUEL && gas[g] >= 0.1) + . = 1 + break + +/datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid=null) + . = 0 + for(var/g in gas) + if(gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1) + . = 1 + break + + if(!.) + return 0 + + if(liquid) + return 1 + + . = 0 + for(var/g in gas) + if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1) + . = 1 + break + +//returns a value between 0 and vsc.fire_firelevel_multiplier +/datum/gas_mixture/proc/calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, gas_volume) + //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. + var/firelevel = 0 + + var/total_combustables = (total_fuel + total_oxidizers) + var/active_combustables = (FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT + 1)*reaction_limit + + if(total_moles && total_combustables > 0) + //slows down the burning when the concentration of the reactants is low + var/damping_multiplier = min(1, active_combustables / (total_moles/group_multiplier)) + + //weight the damping mult so that it only really brings down the firelevel when the ratio is closer to 0 + damping_multiplier = 2*damping_multiplier - (damping_multiplier*damping_multiplier) + + //calculates how close the mixture of the reactants is to the optimum + //fires burn better when there is more oxidizer -- too much fuel will choke the fire out a bit, reducing firelevel. + var/mix_multiplier = 1 / (1 + (5 * ((total_fuel / total_combustables) ** 2))) + + #ifdef FIREDBG + ASSERT(damping_multiplier <= 1) + ASSERT(mix_multiplier <= 1) + #endif + + //toss everything together -- should produce a value between 0 and fire_firelevel_multiplier + firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * damping_multiplier + + return max( 0, firelevel) + + +/mob/living/proc/FireBurn(var/firelevel, var/last_temperature, var/pressure) + var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + apply_damage(2.5*mx, BURN) + return mx + + +/mob/living/carbon/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) + //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. + //Due to TG reworking how fireprotection works, this is kinda less meaningful. + + var/head_exposure = 1 + var/chest_exposure = 1 + var/groin_exposure = 1 + var/legs_exposure = 1 + var/arms_exposure = 1 + + //Get heat transfer coefficients for clothing. + + for(var/obj/item/clothing/C in src) + if(l_hand == C || r_hand == C) + continue + + if( C.max_heat_protection_temperature >= last_temperature ) + if(C.body_parts_covered & HEAD) + head_exposure = 0 + if(C.body_parts_covered & UPPER_TORSO) + chest_exposure = 0 + if(C.body_parts_covered & LOWER_TORSO) + groin_exposure = 0 + if(C.body_parts_covered & LEGS) + legs_exposure = 0 + if(C.body_parts_covered & ARMS) + arms_exposure = 0 + //minimize this for low-pressure environments + var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + + //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. + + apply_damage(0.9*mx*head_exposure, BURN, BP_HEAD, used_weapon = "Fire") + apply_damage(2.5*mx*chest_exposure, BURN, BP_CHEST, used_weapon = "Fire") + apply_damage(2.0*mx*groin_exposure, BURN, BP_GROIN, used_weapon = "Fire") + apply_damage(0.6*mx*legs_exposure, BURN, BP_L_LEG, used_weapon = "Fire") + apply_damage(0.6*mx*legs_exposure, BURN, BP_R_LEG, used_weapon = "Fire") + apply_damage(0.4*mx*arms_exposure, BURN, BP_L_ARM, used_weapon = "Fire") + apply_damage(0.4*mx*arms_exposure, BURN, BP_R_ARM, used_weapon = "Fire") + + //return a truthy value of whether burning actually happened + return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm new file mode 100644 index 00000000000..e9543deb18d --- /dev/null +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -0,0 +1,176 @@ +GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contamination.dmi')) + +/pl_control + var/plasma_dmg = 3 + var/plasma_dmg_name = "Plasma Damage Amount" + var/plasma_dmg_desc = "Self Descriptive" + + var/cloth_contamination = TRUE + var/cloth_contamination_name = "Cloth Contamination" + var/cloth_contamination_desc = "If this is on, phoron does damage by getting into cloth." + + var/plasmaguard_only = FALSE + var/plamaguard_only_name = "\"PlasmaGuard Only\"" + var/plasmaguard_only_desc = "If this is on, only biosuits and spacesuits protect against contamination and ill effects." + + var/genetic_corruption = FALSE + var/genetic_corruption_name = "Genetic Corruption Chance" + var/genetic_corruption_desc = "Chance of genetic corruption as well as toxic damage, X in 10,000." + + var/skin_burns = TRUE + var/skin_burns_name = "Skin Burns" + var/skin_burns_desc = "Phoron has an effect similar to mustard gas on the un-suited." + + var/eye_burns = TRUE + var/eye_burns_name = "Eye Burns" + var/eye_burns_desc = "Phoron burns the eyes of anyone not wearing eye protection." + + var/contamination_loss = 0.02 + var/contamination_loss_name = "Contamination Loss" + var/contamination_loss_desc = "How much toxin damage is dealt from contaminated clothing" //Per tick? ASK ARYN + + var/phoron_hallucination = 0 + var/phoron_hallucination_name = "Phoron Hallucination" + var/phoron_hallucination_desc = "Does being in phoron cause you to hallucinate?" + + +/atom/proc/can_contaminate() + return + +/atom/proc/contaminate() + return + +/atom/proc/decontaminate() + return + +/obj/item/can_contaminate() + //Clothing can be contaminated, with exceptions for certain items which cannot be washed in washing_machine.dm + if(obj_flags & PLASMAGUARD) + return FALSE + return TRUE + +/obj/item/contaminate() + //Do a contamination overlay? Temporary measure to keep contamination less deadly than it was. + if(!(flags_1 & CONTAMINATED_1)) + flags_1 |= CONTAMINATED_1 + add_overlay(GLOB.contamination_overlay) + +/obj/item/decontaminate() + flags_1 ~= CONTAMINATED_1 + cut_overlay(GLOB.contamination_overlay) + + +/mob/living/carbon/human/contaminate() + //See if anything can be contaminated. + + if(!pl_suit_protected()) + suit_contamination() + + if(!pl_head_protected()) + if(prob(1)) + suit_contamination() //Phoron can sometimes get through such an open suit. + +//Cannot wash backpacks currently. +// if(istype(back,/obj/item/storage/backpack)) +// back.contaminate() + +/atom/proc/expose_plasma() + return + +/mob/living/carbon/human/expose_plasma() + //Handles all the bad things phoron can do. + + //Contamination + if(SSzas.settings.plc.cloth_contamination) + contaminate() + + //Anything else requires them to not be dead. + if(stat >= 2) + return + + //Burn skin if exposed. + if(SSzas.settings.plc.skin_burns) + if(!pl_head_protected() || !pl_suit_protected()) + burn_skin(0.75) + if(prob(20)) + to_chat(src, "<span class='danger'>Your skin burns!</span>") + updatehealth() + + //Burn eyes if exposed. + if(SSzas.settings.plc.eye_burns) + if(!is_eyes_covered()) + burn_eyes() + + //Genetic Corruption + if(SSzas.settings.plc.genetic_corruption) + if(rand(1,10000) < SSzas.settings.plc.genetic_corruption) + easy_random_mutate(NEGATIVE) + to_chat(src, "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>") + domutcheck(src, null) + +/mob/proc/burn_eyes() + return + +/mob/living/carbon/human/burn_eyes() + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + if(E && !E.status == ORGAN_ROBOTIC) + if(prob(20)) + to_chat(src, "<span class='danger'>Your eyes burn!</span>") + E.applyOrganDamage(2.5) + eye_blurry = min(eye_blurry+1.5,50) + if (prob(max(0, E.damage - 15) + 1) &&!eye_blind) + to_chat(src, "<span class='danger'>You are blinded!</span>") + eye_blind += 20 + +/mob/living/carbon/human/proc/pl_head_protected() + //Checks if the head is adequately sealed. + if(head) + if(SSzas.settings.plc.plasmaguard_only) + if(head.item_flags & PLASMAGUARD) + return TRUE + else if(is_eyes_covered()) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/pl_suit_protected() + //Checks if the suit is adequately sealed. + var/coverage = NONE + for(var/obj/item/protection in list(wear_suit, gloves, shoes)) + if(!protection) + continue + if(istype(protection, /obj/item/clothing)) + var/obj/item/clothing/clothing_item = protection + if(SSzas.settings.plc.plasmaguard_only && !((clothing_item.clothing_flags & THICKMATERIAL) || (clothing_item.clothing_flags & GAS_FILTERING) || (clothing_item.obj_flags & PLASMAGUARD))) + return FALSE + + else if(SSzas.settings.plc.plasmaguard_only && !(protection.obj_flags & PLASMAGUARD)) + return FALSE + + coverage |= protection.body_parts_covered + + if(SSzas.settings.plc.plasmaguard_only) + return TRUE + + return (~(coverage) & (CHEST|LEGS|FEET|ARMS|HANDS) == 0) + +/mob/living/carbon/human/proc/suit_contamination() + //Runs over the things that can be contaminated and does so. + if (w_uniform && w_uniform.can_contaminate()) + w_uniform.contaminate() + if (shoes && shoes.can_contaminate()) + shoes.contaminate() + if (gloves && gloves.can_contaminate()) + gloves.contaminate() + + +/turf/Entered(obj/item/I) + . = ..() + //Items that are in plasma, but not on a mob, can still be contaminated. + if(istype(I) && SSzas && SSzas.settings.plc.cloth_contamination && I.can_contaminate()) + var/datum/gas_mixture/env = return_air(1) + if(!env) + return + for(var/g in env.gas) + if(SSzas.gas_data.flags[g] & XGM_GAS_CONTAMINANT && env.gas[g] > SSzas.gas_data.overlay_limit[g] + 1) + I.contaminate() + break diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm new file mode 100644 index 00000000000..7166223f43c --- /dev/null +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -0,0 +1,295 @@ +/turf/simulated/var/zone/zone +/turf/simulated/var/open_directions + +/turf/var/needs_air_update = 0 +/turf/var/datum/gas_mixture/air + +/turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) + if(graphic_add && graphic_add.len) + vis_contents += graphic_add + if(graphic_remove && graphic_remove.len) + vis_contents -= graphic_remove + +/turf/proc/update_air_properties() + var/block + ATMOS_CANPASS_TURF(block, src, src) + if(block & AIR_BLOCKED) + //dbg(blocked) + return 1 + + #ifdef MULTIZAS + for(var/d = 1, d < 64, d *= 2) + #else + for(var/d = 1, d < 16, d *= 2) + #endif + + var/turf/unsim = get_step(src, d) + + if(!unsim) + continue + + block = unsim.c_airblock(src) + + if(block & AIR_BLOCKED) + //unsim.dbg(air_blocked, turn(180,d)) + continue + + var/r_block = c_airblock(unsim) + + if(r_block & AIR_BLOCKED) + continue + + if(istype(unsim, /turf/simulated)) + + var/turf/simulated/sim = unsim + if(TURF_HAS_VALID_ZONE(sim)) + SSair.connect(sim, src) + +// Helper for can_safely_remove_from_zone(). +#define GET_ZONE_NEIGHBOURS(T, ret) \ + ret = 0; \ + if (T.zone) { \ + for (var/_gzn_dir in gzn_check) { \ + var/turf/simulated/other = get_step(T, _gzn_dir); \ + if (istype(other) && other.zone == T.zone) { \ + var/block; \ + ATMOS_CANPASS_TURF(block, other, T); \ + if (!(block & AIR_BLOCKED)) { \ + ret |= _gzn_dir; \ + } \ + } \ + } \ + } + +/* + Simple heuristic for determining if removing the turf from it's zone will not partition the zone (A very bad thing). + Instead of analyzing the entire zone, we only check the nearest 3x3 turfs surrounding the src turf. + This implementation may produce false negatives but it (hopefully) will not produce any false postiives. +*/ + +/turf/simulated/proc/can_safely_remove_from_zone() + if(!zone) + return 1 + + var/check_dirs + GET_ZONE_NEIGHBOURS(src, check_dirs) + . = check_dirs + for(var/dir in csrfz_check) + //for each pair of "adjacent" cardinals (e.g. NORTH and WEST, but not NORTH and SOUTH) + if((dir & check_dirs) == dir) + //check that they are connected by the corner turf + var/turf/simulated/T = get_step(src, dir) + if (!istype(T)) + . &= ~dir + continue + + var/connected_dirs + GET_ZONE_NEIGHBOURS(T, connected_dirs) + if(connected_dirs && (dir & GLOB.reverse_dir[connected_dirs]) == dir) + . &= ~dir //they are, so unflag the cardinals in question + + //it is safe to remove src from the zone if all cardinals are connected by corner turfs + . = !. + +/turf/simulated/update_air_properties() + + if(zone && zone.invalid) //this turf's zone is in the process of being rebuilt + c_copy_air() //not very efficient :( + zone = null //Easier than iterating through the list at the zone. + + var/s_block + ATMOS_CANPASS_TURF(s_block, src, src) + if(s_block & AIR_BLOCKED) + #ifdef ZASDBG + if(verbose) log_debug("Self-blocked.") + //dbg(blocked) + #endif + if(zone) + var/zone/z = zone + + if(can_safely_remove_from_zone()) //Helps normal airlocks avoid rebuilding zones all the time + c_copy_air() //we aren't rebuilding, but hold onto the old air so it can be readded + z.remove(src) + else + z.rebuild() + + return 1 + + var/previously_open = open_directions + open_directions = 0 + + var/list/postponed + #ifdef MULTIZAS + for(var/d = 1, d < 64, d *= 2) + #else + for(var/d = 1, d < 16, d *= 2) + #endif + + var/turf/unsim = get_step(src, d) + + if(!unsim) //edge of map + continue + + var/block = unsim.c_airblock(src) + if(block & AIR_BLOCKED) + + #ifdef ZASDBG + if(verbose) log_debug("[d] is blocked.") + //unsim.dbg(air_blocked, turn(180,d)) + #endif + + continue + + var/r_block = c_airblock(unsim) + if(r_block & AIR_BLOCKED) + + #ifdef ZASDBG + if(verbose) log_debug("[d] is blocked.") + //dbg(air_blocked, d) + #endif + + //Check that our zone hasn't been cut off recently. + //This happens when windows move or are constructed. We need to rebuild. + if((previously_open & d) && istype(unsim, /turf/simulated)) + var/turf/simulated/sim = unsim + if(zone && sim.zone == zone) + zone.rebuild() + return + + continue + + open_directions |= d + + if(istype(unsim, /turf/simulated)) + + var/turf/simulated/sim = unsim + sim.open_directions |= GLOB.reverse_dir[d] + + if(TURF_HAS_VALID_ZONE(sim)) + + //Might have assigned a zone, since this happens for each direction. + if(!zone) + + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) + #ifdef ZASDBG + if(verbose) log_debug("[d] is zone blocked.") + + //dbg(zone_blocked, d) + #endif + + //Postpone this tile rather than exit, since a connection can still be made. + if(!postponed) postponed = list() + postponed.Add(sim) + + else + + sim.zone.add(src) + + #ifdef ZASDBG + dbg(assigned) + if(verbose) log_debug("Added to [zone]") + #endif + + else if(sim.zone != zone) + + #ifdef ZASDBG + if(verbose) log_debug("Connecting to [sim.zone]") + #endif + + SSair.connect(src, sim) + + + #ifdef ZASDBG + else if(verbose) log_debug("[d] has same zone.") + + else if(verbose) log_debug("[d] has invalid zone.") + #endif + + else + + //Postponing connections to tiles until a zone is assured. + if(!postponed) postponed = list() + postponed.Add(unsim) + + if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. + var/zone/newzone = new/zone() + newzone.add(src) + + #ifdef ZASDBG + dbg(created) + + ASSERT(zone) + #endif + + //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. + + for(var/turf/T in postponed) + SSair.connect(src, T) + +/turf/proc/post_update_air_properties() + if(connections) connections.update_all() + +/turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air + return 0 + +/turf/proc/assume_gas(gasid, moles, temp = 0) + return 0 + +/turf/return_air() + //Create gas mixture to hold data for passing + var/datum/gas_mixture/GM = new + + if(initial_gas) + GM.gas = initial_gas.Copy() + GM.temperature = temperature + GM.update_values() + + return GM + +/turf/remove_air(amount as num) + var/datum/gas_mixture/GM = return_air() + return GM.remove(amount) + +/turf/simulated/assume_air(datum/gas_mixture/giver) + var/datum/gas_mixture/my_air = return_air() + my_air.merge(giver) + +/turf/simulated/assume_gas(gasid, moles, temp = null) + var/datum/gas_mixture/my_air = return_air() + + if(isnull(temp)) + my_air.adjust_gas(gasid, moles) + else + my_air.adjust_gas_temp(gasid, moles, temp) + + return 1 + +/turf/simulated/return_air() + if(zone) + if(!zone.invalid) + SSair.mark_zone_update(zone) + return zone.air + else + if(!air) + make_air() + c_copy_air() + return air + else + if(!air) + make_air() + return air + +/turf/proc/make_air() + air = new/datum/gas_mixture + air.temperature = temperature + if(initial_gas) + air.gas = initial_gas.Copy() + air.update_values() + +/turf/simulated/proc/c_copy_air() + if(!air) air = new/datum/gas_mixture + air.copy_from(zone.air) + air.group_multiplier = 1 diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm new file mode 100644 index 00000000000..dc504b2f7dd --- /dev/null +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -0,0 +1,103 @@ +/datum/xgm_gas_data + //Simple list of all the gas IDs. + var/list/gases = list() + //The friendly, human-readable name for the gas. + var/list/name = list() + //Specific heat of the gas. Used for calculating heat capacity. + var/list/specific_heat = list() + //Molar mass of the gas. Used for calculating specific entropy. + var/list/molar_mass = list() + //Tile overlays. /obj/effect/gas_overlay, created from references to 'icons/effects/tile_effects.dmi' + var/list/tile_overlay = list() + //Optional color for tile overlay + var/list/tile_overlay_color = list() + //Overlay limits. There must be at least this many moles for the overlay to appear. + var/list/overlay_limit = list() + //Flags. + var/list/flags = list() + //Products created when burned. For fuel only for now (not oxidizers) + var/list/burn_product = list() + // Reagent created when inhaled by lungs. + var/list/breathed_product = list() + // Temperature in K that the gas will condense. + var/list/condensation_points = list() + // Reagent path resulting from condesation. + var/list/condensation_products = list() + //If it shouldn't autogenerate a codex entry + var/list/hidden_from_codex = list() + + //Holds the symbols + var/list/symbol_html = list() + var/list/symbol = list() + +/datum/xgm_gas + var/id = "" + var/name = "Unnamed Gas" + var/specific_heat = 20 // J/(mol*K) + var/molar_mass = 0.032 // kg/mol + + var/tile_overlay = "generic" + var/tile_color = null + var/overlay_limit = null + + var/flags = 0 + var/burn_product = GAS_CO2 + var/breathed_product + var/condensation_point = INFINITY + var/condensation_product + var/hidden_from_codex + var/symbol_html = "X" + var/symbol = "X" + +/datum/xgm_gas_data/Initialize() + for(var/p in subtypesof(/datum/xgm_gas)) + var/datum/xgm_gas/gas = new p //avoid initial() because of potential New() actions + + if(gas.id in SSzas.gas_data.gases) + stack_trace("Duplicate gas id `[gas.id]` in `[p]`") + + SSzas.gas_data.gases += gas.id + SSzas.gas_data.name[gas.id] = gas.name + SSzas.gas_data.specific_heat[gas.id] = gas.specific_heat + SSzas.gas_data.molar_mass[gas.id] = gas.molar_mass + if(gas.overlay_limit) + SSzas.gas_data.overlay_limit[gas.id] = gas.overlay_limit + SSzas.gas_data.tile_overlay[gas.id] = gas.tile_overlay + SSzas.gas_data.tile_overlay_color[gas.id] = gas.tile_color + SSzas.gas_data.flags[gas.id] = gas.flags + SSzas.gas_data.burn_product[gas.id] = gas.burn_product + + SSzas.gas_data.symbol_html[gas.id] = gas.symbol_html + SSzas.gas_data.symbol[gas.id] = gas.symbol + + if(!isnull(gas.condensation_product) && !isnull(gas.condensation_point)) + SSzas.gas_data.condensation_points[gas.id] = gas.condensation_point + SSzas.gas_data.condensation_products[gas.id] = gas.condensation_product + + gas_data.breathed_product[gas.id] = gas.breathed_product + gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + + return 1 + +/obj/effect/gas_overlay + name = "gas" + desc = "You shouldn't be clicking this." + icon = 'icons/effects/tile_effects.dmi' + icon_state = "generic" + layer = FIRE_LAYER + appearance_flags = DEFAULT_APPEARANCE_FLAGS | RESET_COLOR + mouse_opacity = 0 + var/gas_id + +/obj/effect/gas_overlay/proc/update_alpha_animation(var/new_alpha) + animate(src, alpha = new_alpha) + alpha = new_alpha + animate(src, alpha = 0.8 * new_alpha, time = 10, easing = SINE_EASING | EASE_OUT, loop = -1) + animate(alpha = new_alpha, time = 10, easing = SINE_EASING | EASE_IN, loop = -1) + +/obj/effect/gas_overlay/Initialize(mapload, gas) + . = ..() + gas_id = gas + if(SSzas.gas_data.tile_overlay[gas_id]) + icon_state = SSzas.gas_data.tile_overlay[gas_id] + color = SSzas.gas_data.tile_overlay_color[gas_id] diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm new file mode 100644 index 00000000000..aff8d23d929 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -0,0 +1,214 @@ +/* + +Overview: + Each zone is a self-contained area where gas values would be the same if tile-based equalization were run indefinitely. + If you're unfamiliar with ZAS, FEA's air groups would have similar functionality if they didn't break in a stiff breeze. + +Class Vars: + name - A name of the format "Zone [#]", used for debugging. + invalid - True if the zone has been erased and is no longer eligible for processing. + needs_update - True if the zone has been added to the update list. + edges - A list of edges that connect to this zone. + air - The gas mixture that any turfs in this zone will return. Values are per-tile with a group multiplier. + +Class Procs: + add(turf/simulated/T) + Adds a turf to the contents, sets its zone and merges its air. + + remove(turf/simulated/T) + Removes a turf, sets its zone to null and erases any gas graphics. + Invalidates the zone if it has no more tiles. + + c_merge(zone/into) + Invalidates this zone and adds all its former contents to into. + + c_invalidate() + Marks this zone as invalid and removes it from processing. + + rebuild() + Invalidates the zone and marks all its former tiles for updates. + + add_tile_air(turf/simulated/T) + Adds the air contained in T.air to the zone's air supply. Called when adding a turf. + + tick() + Called only when the gas content is changed. Archives values and changes gas graphics. + + dbg_data(mob/M) + Sends M a printout of important figures for the zone. + +*/ + + +/zone + var/name + var/invalid = 0 + var/list/contents = list() + var/list/fire_tiles = list() + var/list/fuel_objs = list() + var/needs_update = 0 + var/list/edges = list() + var/datum/gas_mixture/air = new + var/list/graphic_add = list() + var/list/graphic_remove = list() + var/last_air_temperature = TCMB + +/zone/New() + SSair.add_zone(src) + air.temperature = TCMB + air.group_multiplier = 1 + air.volume = CELL_VOLUME + +/zone/proc/add(turf/simulated/T) +#ifdef ZASDBG + ASSERT(!invalid) + ASSERT(istype(T)) + ASSERT(!SSair.has_valid_zone(T)) +#endif + + var/datum/gas_mixture/turf_air = T.return_air() + add_tile_air(turf_air) + T.zone = src + contents.Add(T) + if(T.fire) + var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + fire_tiles.Add(T) + SSair.active_fire_zones |= src + if(fuel) fuel_objs += fuel + T.update_graphic(air.graphic) + +/zone/proc/remove(turf/simulated/T) +#ifdef ZASDBG + ASSERT(!invalid) + ASSERT(istype(T)) + ASSERT(T.zone == src) + soft_assert(T in contents, "Lists are weird broseph") +#endif + contents.Remove(T) + fire_tiles.Remove(T) + if(T.fire) + var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + fuel_objs -= fuel + T.zone = null + T.update_graphic(graphic_remove = air.graphic) + if(contents.len) + air.group_multiplier = contents.len + else + c_invalidate() + +/zone/proc/c_merge(zone/into) +#ifdef ZASDBG + ASSERT(!invalid) + ASSERT(istype(into)) + ASSERT(into != src) + ASSERT(!into.invalid) +#endif + c_invalidate() + for(var/turf/simulated/T in contents) + into.add(T) + T.update_graphic(graphic_remove = air.graphic) + #ifdef ZASDBG + T.dbg(merged) + #endif + + //rebuild the old zone's edges so that they will be possessed by the new zone + for(var/connection_edge/E in edges) + if(E.contains_zone(into)) + continue //don't need to rebuild this edge + for(var/turf/T in E.connecting_turfs) + SSair.mark_for_update(T) + +/zone/proc/c_invalidate() + invalid = 1 + SSair.remove_zone(src) + #ifdef ZASDBG + for(var/turf/simulated/T in contents) + T.dbg(invalid_zone) + #endif + +/zone/proc/rebuild() + if(invalid) return //Short circuit for explosions where rebuild is called many times over. + c_invalidate() + for(var/turf/simulated/T in contents) + T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + //T.dbg(invalid_zone) + T.needs_air_update = 0 //Reset the marker so that it will be added to the list. + SSair.mark_for_update(T) + +/zone/proc/add_tile_air(datum/gas_mixture/tile_air) + //air.volume += CELL_VOLUME + air.group_multiplier = 1 + air.multiply(contents.len) + air.merge(tile_air) + air.divide(contents.len+1) + air.group_multiplier = contents.len+1 + +/zone/proc/tick() + + // Update fires. + if(air.temperature >= PHORON_FLASHPOINT && !(src in SSair.active_fire_zones) && air.check_combustability() && contents.len) + var/turf/T = pick(contents) + if(istype(T)) + T.create_fire(vsc.fire_firelevel_multiplier) + + // Update gas overlays. + if(air.check_tile_graphic(graphic_add, graphic_remove)) + for(var/turf/simulated/T in contents) + T.update_graphic(graphic_add, graphic_remove) + graphic_add.len = 0 + graphic_remove.len = 0 + + // Update connected edges. + for(var/connection_edge/E in edges) + if(E.sleeping) + E.recheck() + + // Handle condensation from the air. + for(var/g in air.gas) + var/product = gas_data.condensation_products[g] + if(product && air.temperature <= gas_data.condensation_points[g]) + var/condensation_area = air.group_multiplier + while(condensation_area > 0) + condensation_area-- + var/turf/flooding = pick(contents) + var/condense_amt = min(air.gas[g], rand(3,5)) + if(condense_amt < 1) + break + air.adjust_gas(g, -condense_amt) + flooding.add_fluid(condense_amt, product) + + // Update atom temperature. + if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) + last_air_temperature = air.temperature + for(var/turf/simulated/T in contents) + for(var/check_atom in T.contents) + var/atom/checking = check_atom + if(checking.simulated) + QUEUE_TEMPERATURE_ATOMS(checking) + CHECK_TICK + +/zone/proc/dbg_data(mob/M) + to_chat(M, name) + for(var/g in air.gas) + to_chat(M, "[gas_data.name[g]]: [air.gas[g]]") + to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") + to_chat(M, "O2 per N2: [(air.gas[GAS_NITROGEN] ? air.gas[GAS_OXYGEN]/air.gas[GAS_NITROGEN] : "N/A")] Moles: [air.total_moles]") + to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") +// to_chat(M, "Unsimulated: [unsimulated_contents.len]") +// to_chat(M, "Edges: [edges.len]") + if(invalid) to_chat(M, "Invalid!") + var/zone_edges = 0 + var/space_edges = 0 + var/space_coefficient = 0 + for(var/connection_edge/E in edges) + if(E.type == /connection_edge/zone) zone_edges++ + else + space_edges++ + space_coefficient += E.coefficient + to_chat(M, "[E:air:return_pressure()]kPa") + + to_chat(M, "Zone Edges: [zone_edges]") + to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)") + + //for(var/turf/T in unsimulated_contents) +// to_chat(M, "[T] at ([T.x],[T.y])") diff --git a/code/modules/atmospherics/ZAS/_docs.dm b/code/modules/atmospherics/ZAS/_docs.dm new file mode 100644 index 00000000000..41372ea2a06 --- /dev/null +++ b/code/modules/atmospherics/ZAS/_docs.dm @@ -0,0 +1,28 @@ +/* + +Zone Air System: + +This air system divides the station into impermeable areas called zones. +When something happens, i.e. a door opening or a wall being taken down, +zones equalize and eventually merge. Making an airtight area closes the connection again. + +Control Flow: +Every air tick: + Marked turfs are updated with update_air_properties(), followed by post_update_air_properties(). + Edges, including those generated by connections in the previous step, are processed. This is where gas is exchanged. + Fire is processed. + Marked zones have their air archived. + +Important Functions: + +SSair.mark_for_update(turf) + When stuff happens, call this. It works on everything. You basically don't need to worry about any other + functions besides CanPass(). + +Notes for people who used ZAS before: + There is no connected_zones anymore. + To get the zones that are connected to a zone, use this loop: + for(var/connection_edge/zone/edge in zone.edges) + var/zone/connected_zone = edge.get_connected_zone(zone) + +*/ \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index cc56f8a8b02..a0d92e739f5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -448,7 +448,7 @@ #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\addiction.dm" #include "code\controllers\subsystem\ai_controllers.dm" -#include "code\controllers\subsystem\air.dm" +//#include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" @@ -526,6 +526,7 @@ #include "code\controllers\subsystem\wardrobe.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\wiremod_composite.dm" +#include "code\controllers\subsystem\zas.dm" #include "code\controllers\subsystem\movement\ai_movement.dm" #include "code\controllers\subsystem\movement\move_handler.dm" #include "code\controllers\subsystem\movement\movement.dm" @@ -2274,6 +2275,7 @@ #include "code\modules\asset_cache\assets\vv.dm" #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" +/* #include "code\modules\atmospherics\environmental\LINDA_fire.dm" #include "code\modules\atmospherics\environmental\LINDA_system.dm" #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" @@ -2282,6 +2284,7 @@ #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" #include "code\modules\atmospherics\gasmixtures\reaction_factors.dm" #include "code\modules\atmospherics\gasmixtures\reactions.dm" +*/ #include "code\modules\atmospherics\machinery\airalarm.dm" #include "code\modules\atmospherics\machinery\atmosmachinery.dm" #include "code\modules\atmospherics\machinery\bluespace_vendor.dm" @@ -2301,6 +2304,7 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" +/* #include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" #include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" #include "code\modules\atmospherics\machinery\components\fusion\hfr_fuel_datums.dm" @@ -2310,6 +2314,7 @@ #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" +*/ #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" @@ -2335,7 +2340,20 @@ #include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm" #include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" +#include "code\modules\atmospherics\ZAS\Connection.dm" +#include "code\modules\atmospherics\ZAS\ConnectionGroup.dm" +#include "code\modules\atmospherics\ZAS\ConnectionManager.dm" +#include "code\modules\atmospherics\ZAS\Debug.dm" +#include "code\modules\atmospherics\ZAS\Diagnostic.dm" +#include "code\modules\atmospherics\ZAS\Fire.dm" #include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" +#include "code\modules\atmospherics\ZAS\Turf.dm" +#include "code\modules\atmospherics\ZAS\Zone.dm" +#include "code\modules\atmospherics\ZAS\_docs.dm" +#include "code\modules\atmospherics\ZAS\Airflow.dm" +#include "code\modules\atmospherics\ZAS\Atom.dm" +#include "code\modules\atmospherics\ZAS\Plasma.dm" +#include "code\modules\atmospherics\ZAS\XGM\gas_data.dm" #include "code\modules\atmospherics\machinery\portable\canister.dm" #include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" #include "code\modules\atmospherics\machinery\portable\pump.dm" From 5860ade6f08db3f20df74b7252702d737521e6d7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 13 Apr 2022 14:53:17 -0400 Subject: [PATCH 002/200] PAIN AND AGONY --- code/__DEFINES/atmospherics/ZAS.dm | 268 +++++++++ code/__DEFINES/atmospherics/ZAS_math.dm | 31 + code/__DEFINES/atmospherics/atmos_core.dm | 46 +- .../atmospherics/atmos_mob_interaction.dm | 6 +- code/__DEFINES/atmospherics/atmos_piping.dm | 8 +- code/__DEFINES/colors.dm | 2 + code/__DEFINES/flags.dm | 2 + code/__DEFINES/movespeed_modification.dm | 1 + code/__DEFINES/obj_flags.dm | 1 + code/__DEFINES/sound.dm | 2 +- code/__DEFINES/subsystems.dm | 5 + code/__HELPERS/_logging.dm | 7 +- code/__HELPERS/areas.dm | 4 +- code/__HELPERS/atmospherics.dm | 29 +- code/_onclick/adjacent.dm | 39 ++ code/controllers/subsystem/airflow.dm | 150 +++++ code/controllers/subsystem/minor_mapping.dm | 2 +- code/controllers/subsystem/time_track.dm | 4 +- code/controllers/subsystem/zas.dm | 47 +- code/datums/atmosphere/_atmosphere.dm | 6 +- .../components/atmos_reaction_recorder.dm | 7 +- code/datums/components/combustible_flooder.dm | 6 +- code/datums/components/gas_leaker.dm | 8 +- code/datums/diseases/_disease.dm | 4 +- code/datums/diseases/advance/symptoms/heal.dm | 6 +- code/datums/elements/atmos_requirements.dm | 12 +- code/datums/elements/atmos_sensitive.dm | 12 +- code/datums/helper_datums/teleport.dm | 26 +- code/game/atoms_movable.dm | 2 +- code/game/gamemodes/objective_items.dm | 2 +- code/game/machinery/_machinery.dm | 5 +- .../computer/atmos_computers/_air_sensor.dm | 4 +- .../atmos_computers/_atmos_control.dm | 2 +- code/game/machinery/doors/airlock.dm | 6 +- code/game/machinery/doors/door.dm | 14 +- code/game/machinery/doors/firedoor.dm | 8 +- code/game/machinery/doors/windowdoor.dm | 8 +- code/game/machinery/pipe/construction.dm | 4 +- code/game/machinery/shieldgen.dm | 12 +- code/game/machinery/spaceheater.dm | 8 +- code/game/objects/effects/anomalies.dm | 7 +- .../effects/effect_system/effects_foam.dm | 23 +- .../effects/effect_system/effects_smoke.dm | 11 +- code/game/objects/items.dm | 2 +- code/game/objects/items/RCD.dm | 2 +- code/game/objects/items/RPD.dm | 2 +- code/game/objects/items/cigs_lighters.dm | 4 +- code/game/objects/items/devices/powersink.dm | 2 +- .../items/devices/scanners/gas_analyzer.dm | 16 +- code/game/objects/items/flamethrower.dm | 4 +- .../objects/items/grenades/atmos_grenades.dm | 2 + code/game/objects/items/secret_documents.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 3 +- code/game/objects/items/tanks/tanks.dm | 4 +- code/game/objects/structures.dm | 2 +- code/game/objects/structures/aliens.dm | 4 +- code/game/objects/structures/false_walls.dm | 4 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/holosign.dm | 4 +- code/game/objects/structures/mineral_doors.dm | 10 +- code/game/objects/structures/plasticflaps.dm | 6 +- code/game/objects/structures/tram_walls.dm | 2 +- .../structures/transit_tubes/station.dm | 2 +- .../objects/structures/windoor_assembly.dm | 4 +- code/game/objects/structures/window.dm | 10 +- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/turf.dm | 5 +- code/modules/admin/admin_verbs.dm | 2 +- .../abductor/equipment/glands/plasma.dm | 4 +- code/modules/antagonists/blob/blob_mobs.dm | 2 +- .../antagonists/blob/structures/_blob.dm | 4 +- .../antagonists/blob/structures/shield.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 127 ++-- code/modules/atmospherics/ZAS/Atom.dm | 48 +- code/modules/atmospherics/ZAS/Connection.dm | 18 +- .../atmospherics/ZAS/ConnectionGroup.dm | 32 +- code/modules/atmospherics/ZAS/Debug.dm | 4 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 12 +- code/modules/atmospherics/ZAS/Fire.dm | 74 ++- code/modules/atmospherics/ZAS/Plasma.dm | 6 +- code/modules/atmospherics/ZAS/Turf.dm | 44 +- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 6 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 241 ++++++++ .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 553 ++++++++++++++++++ code/modules/atmospherics/ZAS/ZAS_Settings.dm | 78 +++ code/modules/atmospherics/ZAS/Zone.dm | 22 +- .../atmospherics/environmental/LINDA_fire.dm | 2 +- .../environmental/LINDA_system.dm | 6 +- .../environmental/LINDA_turf_tile.dm | 6 +- .../atmospherics/machinery/airalarm.dm | 27 +- .../atmospherics/machinery/atmosmachinery.dm | 18 +- .../components/electrolyzer/electrolyzer.dm | 2 +- .../components/unary_devices/passive_vent.dm | 2 +- .../machinery/portable/canister.dm | 4 +- .../portable/portable_atmospherics.dm | 16 +- .../atmospherics/machinery/portable/pump.dm | 2 +- .../machinery/portable/scrubber.dm | 2 +- code/modules/awaymissions/cordon.dm | 1 - code/modules/hydroponics/fermenting_barrel.dm | 2 +- code/modules/mapping/map_template.dm | 2 +- code/modules/mining/aux_base.dm | 2 +- code/modules/mining/equipment/survival_pod.dm | 4 +- code/modules/mining/satchel_ore_boxdm.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 2 +- .../mob/living/carbon/carbon_defines.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/living_defines.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../living/simple_animal/heretic_monsters.dm | 2 +- .../mob/living/simple_animal/hostile/carp.dm | 2 +- .../simple_animal/hostile/retaliate/ghost.dm | 2 +- .../simple_animal/hostile/space_dragon.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/movespeed/modifiers/mobs.dm | 5 + code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- code/modules/paperwork/paperbin.dm | 2 +- code/modules/paperwork/pen.dm | 4 +- code/modules/paperwork/stamps.dm | 2 +- .../power/singularity/containment_field.dm | 4 +- .../power/singularity/field_generator.dm | 4 +- .../power/supermatter/supermatter_process.dm | 4 +- code/modules/power/turbine/turbine.dm | 4 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- .../recycling/disposal/construction.dm | 2 +- code/modules/research/experimentor.dm | 4 +- code/modules/research/server.dm | 2 +- .../xenobiology/crossbreeding/chilling.dm | 2 +- code/modules/shuttle/on_move.dm | 8 +- code/modules/vehicles/mecha/_mecha.dm | 8 +- .../mecha/equipment/tools/other_tools.dm | 2 +- .../components/sensors/pressuresensor.dm | 2 +- .../wiremod/components/sensors/tempsensor.dm | 2 +- tgstation.dme | 8 +- 135 files changed, 1931 insertions(+), 502 deletions(-) create mode 100644 code/__DEFINES/atmospherics/ZAS.dm create mode 100644 code/__DEFINES/atmospherics/ZAS_math.dm create mode 100644 code/controllers/subsystem/airflow.dm create mode 100644 code/modules/atmospherics/ZAS/XGM/gases.dm create mode 100644 code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm create mode 100644 code/modules/atmospherics/ZAS/ZAS_Settings.dm diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm new file mode 100644 index 00000000000..b3e9fbcade6 --- /dev/null +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -0,0 +1,268 @@ +//#define ZASDBG +//#define MULTIZAS + +#define AIR_BLOCKED 1 +#define ZONE_BLOCKED 2 +#define BLOCKED 3 + +#define ZONE_MIN_SIZE 14 //zones with less than this many turfs will always merge, even if the connection is not direct + +#define CANPASS_ALWAYS 1 +#define CANPASS_DENSITY 2 +#define CANPASS_PROC 3 +#define CANPASS_NEVER 4 + +#define NORTHUP (NORTH|UP) +#define EASTUP (EAST|UP) +#define SOUTHUP (SOUTH|UP) +#define WESTUP (WEST|UP) +#define NORTHDOWN (NORTH|DOWN) +#define EASTDOWN (EAST|DOWN) +#define SOUTHDOWN (SOUTH|DOWN) +#define WESTDOWN (WEST|DOWN) + +#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) + +#ifdef MULTIZAS + +var/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) +var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) + +#define ATMOS_CANPASS_TURF(ret,A,B) \ + if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ + ret = BLOCKED; \ + } \ + else if (B.z != A.z) { \ + if (B.z < A.z) { \ + ret = (A.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ + } \ + else { \ + ret = (B.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ + } \ + } \ + else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ + ret = (A.z == B.z) ? ZONE_BLOCKED : AIR_BLOCKED; \ + } \ + else if (A.contents.len) { \ + ret = 0;\ + for (var/thing in A) { \ + var/atom/movable/AM = thing; \ + switch (AM.can_atmos_pass) { \ + if (CANPASS_ALWAYS) { \ + continue; \ + } \ + if (CANPASS_DENSITY) { \ + if (AM.density) { \ + ret |= AIR_BLOCKED; \ + } \ + } \ + if (CANPASS_PROC) { \ + ret |= AM.c_airblock(B); \ + } \ + if (CANPASS_NEVER) { \ + ret = BLOCKED; \ + } \ + } \ + if (ret == BLOCKED) { \ + break;\ + }\ + }\ + } +#else + +var/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) +var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) + +#define ATMOS_CANPASS_TURF(ret,A,B) \ + if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ + ret = BLOCKED; \ + } \ + else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ + ret = ZONE_BLOCKED; \ + } \ + else if (A.contents.len) { \ + ret = 0;\ + for (var/thing in A) { \ + var/atom/movable/AM = thing; \ + switch (AM.can_atmos_pass) { \ + if (CANPASS_ALWAYS) { \ + continue; \ + } \ + if (CANPASS_DENSITY) { \ + if (AM.density) { \ + ret |= AIR_BLOCKED; \ + } \ + } \ + if (CANPASS_PROC) { \ + ret |= AM.c_airblock(B); \ + } \ + if (CANPASS_NEVER) { \ + ret = BLOCKED; \ + } \ + } \ + if (ret == BLOCKED) { \ + break;\ + }\ + }\ + } + +#endif + + +#define CELL_VOLUME 2500 // Liters in a cell. +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. + +#define O2STANDARD 0.21 // Percentage. +#define N2STANDARD 0.79 + +#define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible. +#define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%) +#define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%) +#define MOLES_O2ATMOS (MOLES_O2STANDARD*50) +#define MOLES_N2ATMOS (MOLES_N2STANDARD*50) + +// These are for when a mob breathes poisonous air. +#define MIN_TOXIN_DAMAGE 1 +#define MAX_TOXIN_DAMAGE 10 + +#define STD_BREATH_VOLUME 12 // Liters in a normal breath. + +#define HUMAN_HEAT_CAPACITY 280000 //J/K For 80kg person + +#define SOUND_MINIMUM_PRESSURE 10 + +#define PRESSURE_DAMAGE_COEFFICIENT 4 // The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE. +#define MAX_HIGH_PRESSURE_DAMAGE 4 // This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( +#define LOW_PRESSURE_DAMAGE 0.6 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). + +#define MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND (MINIMUM_AIR_TO_SUSPEND*R_IDEAL_GAS_EQUATION*T20C)/CELL_VOLUME // Minimum pressure difference between zones to suspend +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 // Minimum ratio of air that must move to/from a tile to suspend group processing +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Minimum amount of air that has to move before a group processing can be suspended +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Either this must be active +#define MINIMUM_TEMPERATURE_TO_MOVE (T20C + 100) // or this (or both, obviously) + +#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 // Minimum temperature difference before group processing is suspended. +#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 +#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 // Minimum temperature difference before the gas temperatures are just set to be equal. +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C + 10) +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C + 200) + +// Must be between 0 and 1. Values closer to 1 equalize temperature faster. Should not exceed 0.4, else strange heat flow occurs. +#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 +#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 +#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 // A hack to partly simulate radiative heat. +#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 // A hack for now. + +// Fire damage. +#define CARBON_LIFEFORM_FIRE_RESISTANCE (T0C + 200) +#define CARBON_LIFEFORM_FIRE_DAMAGE 4 + +// Phoron fire properties. +#define PHORON_MINIMUM_BURN_TEMPERATURE (T0C + 126) //400 K - autoignite temperature in tanks and canisters - enclosed environments I guess +#define PHORON_FLASHPOINT (T0C + 246) //519 K - autoignite temperature in air if that ever gets implemented. + +//These control the mole ratio of oxidizer and fuel used in the combustion reaction +#define FIRE_REACTION_OXIDIZER_AMOUNT 3 //should be greater than the fuel amount if fires are going to spread much +#define FIRE_REACTION_FUEL_AMOUNT 2 + +//These control the speed at which fire burns +#define FIRE_GAS_BURNRATE_MULT 1 +#define FIRE_LIQUID_BURNRATE_MULT 0.225 + +//If the fire is burning slower than this rate then the reaction is going too slow to be self sustaining and the fire burns itself out. +//This ensures that fires don't grind to a near-halt while still remaining active forever. +#define FIRE_GAS_MIN_BURNRATE 0.01 +#define FIRE_LIQUD_MIN_BURNRATE 0.0025 + +//How many moles of fuel are contained within one solid/liquid fuel volume unit +#define LIQUIDFUEL_AMOUNT_TO_MOL 0.45 //mol/volume unit + +// XGM gas flags. +#define XGM_GAS_FUEL 1 +#define XGM_GAS_OXIDIZER 2 +#define XGM_GAS_CONTAMINANT 4 +#define XGM_GAS_FUSION_FUEL 8 + +#define TANK_LEAK_PRESSURE (30 * ONE_ATMOSPHERE) // Tank starts leaking. +#define TANK_RUPTURE_PRESSURE (40 * ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. +#define TANK_FRAGMENT_PRESSURE (50 * ONE_ATMOSPHERE) // Boom 3x3 base explosion. +#define TANK_FRAGMENT_SCALE (10 * ONE_ATMOSPHERE) // +1 for each SCALE kPa above threshold. Was 2 atm. + +#define NORMPIPERATE 30 // Pipe-insulation rate divisor. +#define HEATPIPERATE 8 // Heat-exchange pipe insulation. +#define FLOWFRAC 0.99 // Fraction of gas transfered per process. + +//Flags for zone sleeping +#define ZONE_ACTIVE 1 +#define ZONE_SLEEPING 0 + +// Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) +#define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it +#define ATMOSTANK_OXYGEN 50000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. +#define ATMOSTANK_CO2 60000 // CO2 is used for the GUP, Charon, and Torch as the primary fuel propellant, and we need lots to stick around. +#define ATMOSTANK_PHORON 25000 +#define ATMOSTANK_PHORON_FUEL 15000 +#define ATMOSTANK_HYDROGEN 50000 +#define ATMOSTANK_HYDROGEN_FUEL 25000 +#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? + +#define MAX_PUMP_PRESSURE 15000 // Maximal pressure setting for pumps and vents +#define MAX_OMNI_PRESSURE 15000 // Maximal output(s) pressure for omni devices (filters/mixers) + +#define GAS_OXYGEN "oxygen" +#define GAS_CO2 "carbon_dioxide" +#define GAS_CO "carbon_monoxide" +#define GAS_METHYL_BROMIDE "methyl_bromide" +#define GAS_N2O "sleeping_agent" +#define GAS_NITROGEN "nitrogen" +#define GAS_NO2 "nitrodioxide" +#define GAS_NO "nitricoxide" +#define GAS_METHANE "methane" +#define GAS_ALIEN "aliether" +#define GAS_HYDROGEN "hydrogen" +#define GAS_DEUTERIUM "deuterium" +#define GAS_TRITIUM "tritium" +#define GAS_HELIUM "helium" +#define GAS_ARGON "argon" +#define GAS_KRYPTON "krypton" +#define GAS_NEON "neon" +#define GAS_XENON "xenon" +#define GAS_AMMONIA "ammonia" +#define GAS_CHLORINE "chlorine" +#define GAS_SULFUR "sulfurdioxide" +#define GAS_STEAM "water" +#define GAS_PLASMA "phoron" + +#define ALL_GASES list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA) + +GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir + 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, + 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, + 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, + 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63 +)) + +#define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !QDELETED(A) && !(A.atom_flags & ATOM_FLAG_NO_TEMP_CHANGE)) +#define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 +#define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 + +#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ + _atom.temperature = _temp; \ + if(_atom.reagents) { \ + HANDLE_REACTIONS(_atom.reagents); \ + } \ + QUEUE_TEMPERATURE_ATOMS(_atom); + +#define QUEUE_TEMPERATURE_ATOMS(_atoms) \ + if(islist(_atoms)) { \ + for(var/thing in _atoms) { \ + var/atom/A = thing; \ + if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ + SStemperature.processing[A] = TRUE; \ + } \ + } \ + } else if(ATOM_IS_TEMPERATURE_SENSITIVE(_atoms)) { \ + SStemperature.processing[_atoms] = TRUE; \ + } diff --git a/code/__DEFINES/atmospherics/ZAS_math.dm b/code/__DEFINES/atmospherics/ZAS_math.dm new file mode 100644 index 00000000000..2c8ac21470b --- /dev/null +++ b/code/__DEFINES/atmospherics/ZAS_math.dm @@ -0,0 +1,31 @@ +// Math constants. +#define R_IDEAL_GAS_EQUATION 8.31 // kPa*L/(K*mol). +#define ONE_ATMOSPHERE 101.325 // kPa. +#define IDEAL_GAS_ENTROPY_CONSTANT 1164 // (mol^3 * s^3) / (kg^3 * L). + +// Radiation constants. +#define STEFAN_BOLTZMANN_CONSTANT 5.6704e-8 // W/(m^2*K^4). +#define COSMIC_RADIATION_TEMPERATURE 3.15 // K. +#define AVERAGE_SOLAR_RADIATION 200 // W/m^2. Kind of arbitrary. Really this should depend on the sun position much like solars. +#define RADIATOR_OPTIMUM_PRESSURE 3771 // kPa at 20 C. This should be higher as gases aren't great conductors until they are dense. Used the critical pressure for air. +#define GAS_CRITICAL_TEMPERATURE 132.65 // K. The critical point temperature for air. + +#define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. +#define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder + +#define T0C 273.15 // 0.0 degrees celsius +#define T20C 293.15 // 20.0 degrees celsius +#define T100C 373.15 // 100.0 degrees celsius +#define TCMB 2.7 // -270.3 degrees celsius + +#define CELSIUS + T0C + +#define ATMOS_PRECISION 0.0001 +#define QUANTIZE(variable) (round(variable, ATMOS_PRECISION)) + +// Determines the exchange ratio of reagents being converted to gas and vice versa. +#define REAGENT_GAS_EXCHANGE_FACTOR 10 + +//where a unit turf is 1 on a side, its diagonal is sqrt(2) +#define UNIT_DIAGONAL 1.41421356237 +#define HALF_UNIT_DIAGONAL 0.70710678118 diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm index c0ca6bb78c8..bfb3455f636 100644 --- a/code/__DEFINES/atmospherics/atmos_core.dm +++ b/code/__DEFINES/atmospherics/atmos_core.dm @@ -25,17 +25,17 @@ //ATMOS //stuff you should probably leave well alone! /// kPa*L/(K*mol) -#define R_IDEAL_GAS_EQUATION 8.31 +//#define R_IDEAL_GAS_EQUATION 8.31 /// kPa -#define ONE_ATMOSPHERE 101.325 +//#define ONE_ATMOSPHERE 101.325 /// -270.3degC -#define TCMB 2.7 +//#define TCMB 2.7 /// -48.15degC #define TCRYO 225 /// 0degC -#define T0C 273.15 +//#define T0C 273.15 /// 20degC -#define T20C 293.15 +//#define T20C 293.15 /// -14C - Temperature used for kitchen cold room, medical freezer, etc. #define COLD_ROOM_TEMP 259.15 @@ -100,31 +100,31 @@ /// number of FULL air controller ticks before an excited group dismantles and removes its turfs from active #define EXCITED_GROUP_DISMANTLE_CYCLES (EXCITED_GROUP_BREAKDOWN_CYCLES * 2) + 1 //Reset after 2 breakdowns /// Ratio of air that must move to/from a tile to reset group processing -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.1 +//#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.1 /// Minimum ratio of air that must move to/from a tile -#define MINIMUM_AIR_RATIO_TO_MOVE 0.001 +//#define MINIMUM_AIR_RATIO_TO_MOVE 0.001 /// Minimum amount of air that has to move before a group processing can be suspended (Round about 10) -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) +//#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) /// Either this must be active (round about 0.1) //Might need to raise this a tad to better support space leaks. we'll see -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) +//#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_MOVE) /// or this (or both, obviously) -#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) +//#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) /// Minimum temperature difference before group processing is suspended -#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 +//#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 /// Minimum temperature difference before the gas temperatures are just set to be equal -#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 +//#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 ///Minimum temperature to continue superconduction once started -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+80) +//#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+80) ///Minimum temperature to start doing superconduction calculations -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+400) +//#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+400) //HEAT TRANSFER COEFFICIENTS //Must be between 0 and 1. Values closer to 1 equalize temperature faster //Should not exceed 0.4 else strange heat flow occur -#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 +//#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 +//#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 /// a hack for now -#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 +//#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 /// a hack to help make vacuums "cold", sacrificing realism for gameplay #define HEAT_CAPACITY_VACUUM 7000 @@ -139,19 +139,19 @@ #define FIRE_GROWTH_RATE 40000 ///moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC (103 or so) -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) +//#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) ///compared against for superconductivity #define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) /// percentage of oxygen in a normal mixture of air -#define O2STANDARD 0.21 +//#define O2STANDARD 0.21 /// same but for nitrogen -#define N2STANDARD 0.79 +//#define N2STANDARD 0.79 /// O2 standard value (21%) -#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) +//#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) /// N2 standard value (79%) -#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) +//#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) /// liters in a cell -#define CELL_VOLUME 2500 +//#define CELL_VOLUME 2500 ///O2 value for anesthetic canister #define O2_ANESTHETIC 0.65 diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm index 1f0c3a0669e..84476d2b431 100644 --- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -79,10 +79,10 @@ #define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define PRESSURE_DAMAGE_COEFFICIENT 2 -#define MAX_HIGH_PRESSURE_DAMAGE 2 +//#define PRESSURE_DAMAGE_COEFFICIENT 2 +//#define MAX_HIGH_PRESSURE_DAMAGE 2 /// The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). -#define LOW_PRESSURE_DAMAGE 2 +//#define LOW_PRESSURE_DAMAGE 2 /// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this #define COLD_SLOWDOWN_FACTOR 20 diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index f0919f37276..8624de386e1 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -44,13 +44,13 @@ /// The internal temperature in kelvins at which a handheld gas tank begins to take damage. #define TANK_MELT_TEMPERATURE 1000000 /// The internal pressure in kPa at which a handheld gas tank begins to take damage. -#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) +//#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) /// The internal pressure in kPa at which a handheld gas tank almost immediately ruptures. -#define TANK_RUPTURE_PRESSURE (35.*ONE_ATMOSPHERE) +//#define TANK_RUPTURE_PRESSURE (35.*ONE_ATMOSPHERE) /// The internal pressure in kPa at which an gas tank that breaks will cause an explosion. -#define TANK_FRAGMENT_PRESSURE (40.*ONE_ATMOSPHERE) +//#define TANK_FRAGMENT_PRESSURE (40.*ONE_ATMOSPHERE) /// Range scaling constant for tank explosions. Calibrated so that a TTV assembled using two 70L tanks will hit the maxcap at at least 160atm. -#define TANK_FRAGMENT_SCALE (84.*ONE_ATMOSPHERE) +//#define TANK_FRAGMENT_SCALE (84.*ONE_ATMOSPHERE) /// Denotes that our tank is overpressurized simply from gas merging. #define TANK_MERGE_OVERPRESSURE "tank_overpressure" // Indices for the reaction_results returned by explosion_information() diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 7d7325e6007..eab21d13db1 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -219,3 +219,5 @@ #define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA") /// Icon filter that creates gaussian blur #define GAUSSIAN_BLUR(filter_size) filter(type="blur", size=filter_size) + +#define RANDOM_RGB rgb(rand(0,255), rand(0,255), rand(0,255)) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b09a0d11214..389a4f2681b 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -58,6 +58,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define IS_PLAYER_COLORABLE_1 (1<<21) /// Whether or not this atom has contextual screentips when hovered OVER #define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<22) +///Plasma Contamination +#define CONTAMINATED_1 (1<<23) // Update flags for [/atom/proc/update_appearance] /// Update the atom's name diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index c4300d96606..fe6ac65a3b6 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -11,3 +11,4 @@ #define MOVESPEED_ID_MOB_GRAB_STATE "mob_grab_state" #define MOVESPEED_ID_MOB_WALK_RUN "mob_walk_run" +#define MOVESPEED_ID_MOB_ATMOS_AFFLICTION "mob_atmos_pressured" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 159a8de9fc7..4c5bdb7169d 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -15,6 +15,7 @@ #define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above? #define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below? #define NO_BUILD (1<<13) // Can we build on this object? +#define PLASMAGUARD (1<<14) //Immune to plasma contamination // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index e0a46bb6e62..1ebdf032034 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -27,7 +27,7 @@ #define MAX_INSTRUMENT_CHANNELS (128 * 6) -#define SOUND_MINIMUM_PRESSURE 10 +//#define SOUND_MINIMUM_PRESSURE 10 #define INTERACTION_SOUND_RANGE_MODIFIER -3 #define EQUIP_SOUND_VOLUME 30 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 9e1d38c8394..44e17d7c122 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -173,6 +173,7 @@ #define FIRE_PRIORITY_AMBIENCE 10 #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_DATABASE 16 +#define FIRE_PRIORITY_AIRFLOW 17 #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 @@ -280,6 +281,10 @@ #define SSZAS_FIRES 6 #define SSZAS_HOTSPOTS 7 #define SSZAS_ZONES 8 +#define SSZAS_ATOMS 9 + +#define SSZAS_REBUILD_PIPELINE 1 +#define SSZAS_REBUILD_QUEUE 2 //Pipeline rebuild helper defines, these suck but it'll do for now //Fools you actually merged it #define SSAIR_REBUILD_PIPELINE 1 diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 2b142806d43..bb72d342457 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -178,10 +178,9 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /// Logs the contents of the gasmix to the game log, prefixed by text /proc/log_atmos(text, datum/gas_mixture/mix) var/message = text - message += "TEMP=[mix.temperature],MOL=[mix.total_moles()],VOL=[mix.volume]" - for(var/key in mix.gases) - var/list/gaslist = mix.gases[key] - message += "[gaslist[GAS_META][META_GAS_ID]]=[gaslist[MOLES]];" + message += "TEMP=[mix.return_temperature()],MOL=[mix.total_moles()],VOL=[mix.volume]" + for(var/key in mix.gas) + message += "[key]=[mix.get_gas(key)];" log_game(message) /proc/log_say(text) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index cc99089e29d..a15767bb241 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -36,7 +36,9 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engineerin if(break_if_found[checkT.type] || break_if_found[checkT.loc.type]) return FALSE var/static/list/cardinal_cache = list("[NORTH]"=TRUE, "[EAST]"=TRUE, "[SOUTH]"=TRUE, "[WEST]"=TRUE) - if(!cardinal_cache["[dir]"] || !TURFS_CAN_SHARE(sourceT, checkT)) + var/canpass + ATMOS_CANPASS_TURF(canpass, sourceT, checkT) + if(!cardinal_cache["[dir]"] || !canpass) continue found_turfs += checkT // Since checkT is connected, add it to the list to be processed diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 6df62fec3ef..2635c68c148 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -41,18 +41,18 @@ ) if(!gasmix) return - for(var/gas_path in gasmix.gases) + for(var/gas_path in gasmix.gas) .["gases"] += list(list( - gasmix.gases[gas_path][GAS_META][META_GAS_ID], - gasmix.gases[gas_path][GAS_META][META_GAS_NAME], - gasmix.gases[gas_path][MOLES], - )) - for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results) - .["reactions"] += list(list( - initial(reaction_result.id), - initial(reaction_result.name), - gasmix.reaction_results[reaction_result], + "[gas_path]", + "[gas_path]", + gasmix.get_gas(gas_path), )) + //.for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results) + .["reactions"] += list(list( + "UNIMPLIMENTED", + "UNIMPLIMENTED", + "UNIMPLIMENTED", + )) .["total_moles"] = gasmix.total_moles() .["temperature"] = gasmix.temperature .["volume"] = gasmix.volume @@ -64,7 +64,7 @@ GLOBAL_LIST_EMPTY(gas_handbook) /// Automatically populates gas_handbook and reaction_handbook. They are formatted lists containing information regarding gases and reactions they participate in. /// Structure can be found in TS form at AtmosHandbook.tsx -/proc/atmos_handbooks_init() +/*/proc/atmos_handbooks_init() if(length(GLOB.reaction_handbook)) GLOB.reaction_handbook = list() if(length(GLOB.gas_handbook)) @@ -84,8 +84,8 @@ GLOBAL_LIST_EMPTY(gas_handbook) gas_info["specific_heat"] = meta_information[META_GAS_SPECIFIC_HEAT] gas_info["reactions"] = list() momentary_gas_list[gas_path] = gas_info - - for (var/datum/gas_reaction/reaction_path as anything in subtypesof(/datum/gas_reaction)) + + for (var/datum/gas_reaction/reaction_path as anything in subtypesof(/datum/gas_reaction)) var/datum/gas_reaction/reaction = new reaction_path var/list/reaction_info = list() reaction_info["id"] = reaction.id @@ -117,7 +117,7 @@ GLOBAL_LIST_EMPTY(gas_handbook) reaction_info["factors"] += list(factor_info) GLOB.reaction_handbook += list(reaction_info) qdel(reaction) - + for (var/gas_info_index in momentary_gas_list) GLOB.gas_handbook += list(momentary_gas_list[gas_info_index]) @@ -125,3 +125,4 @@ GLOBAL_LIST_EMPTY(gas_handbook) /// For UIs, simply do data += return_atmos_handbooks() to use. /proc/return_atmos_handbooks() return list("gasInfo" = GLOB.gas_handbook, "reactionInfo" = GLOB.reaction_handbook) +*/ diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index e33ba9cb540..5b30c07d1eb 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -75,6 +75,45 @@ return TRUE return FALSE +/turf/proc/Adjacent_free_dir(atom/destination, path_dir = 0) + var/turf/dest_T = get_turf(destination) + if(dest_T == src) + return TRUE + if(!dest_T || dest_T.z != z) + return FALSE + if(get_dist(src,dest_T) > 1) + return FALSE + if(!path_dir) + return FALSE + + if(dest_T.x == x || dest_T.y == y) //orthogonal + return dest_T.ClickCross(get_dir(dest_T, src), border_only = 1) + + var/turf/intermediate_T = get_step(src, path_dir) //diagonal + if(!intermediate_T || intermediate_T.density \ + || !intermediate_T.ClickCross(get_dir(intermediate_T, src) | get_dir(intermediate_T, dest_T), border_only = 0)) + return FALSE + + if(!dest_T.ClickCross(get_dir(dest_T, intermediate_T), border_only = 1)) + return FALSE + + return TRUE + +/** +* Quick adjacency (to turf): +* If you are in the same turf, always true +* If you are not adjacent, then false +*/ +/turf/proc/AdjacentQuick(var/atom/neighbor, var/atom/target = null) + var/turf/T0 = get_turf(neighbor) + if(T0 == src) + return 1 + + if(get_dist(src,T0) > 1) + return 0 + + return 1 + // This is necessary for storage items not on your person. /obj/item/Adjacent(atom/neighbor, atom/target, atom/movable/mover, recurse = 1) if(neighbor == loc) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm new file mode 100644 index 00000000000..31407e67fa9 --- /dev/null +++ b/code/controllers/subsystem/airflow.dm @@ -0,0 +1,150 @@ +#define CLEAR_OBJECT(TARGET) \ + processing -= TARGET; \ + TARGET.airflow_dest = null; \ + TARGET.airflow_speed = 0; \ + TARGET.airflow_time = 0; \ + TARGET.airflow_skip_speedcheck = FALSE; \ + if (TARGET.airflow_od) { \ + TARGET.set_density(FALSE); \ + } + + +SUBSYSTEM_DEF(airflow) + name = "Airflow" + wait = 1 + flags = SS_NO_INIT + priority = FIRE_PRIORITY_AIRFLOW + + var/static/tmp/list/processing = list() + var/static/tmp/list/current = list() + + +/datum/controller/subsystem/airflow/Recover() + current.Cut() + + +/datum/controller/subsystem/airflow/fire(resumed, no_mc_tick) + if (!resumed) + current = processing.Copy() + var/atom/movable/target + for (var/i = current.len to 1 step -1) + target = current[i] + if (QDELETED(target)) + if (target) + CLEAR_OBJECT(target) + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + if (target.airflow_speed <= 0) + CLEAR_OBJECT(target) + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + if (target.airflow_process_delay > 0) + target.airflow_process_delay -= 1 + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + else if (target.airflow_process_delay) + target.airflow_process_delay = 0 + target.airflow_speed = min(target.airflow_speed, 15) + target.airflow_speed -= SSzas.settings.airflow_speed_decay + if (!target.airflow_skip_speedcheck) + if (target.airflow_speed > 7) + if (target.airflow_time++ >= target.airflow_speed - 7) + if (target.airflow_od) + target.set_density(FALSE) + target.airflow_skip_speedcheck = TRUE + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + else + if (target.airflow_od) + target.set_density(FALSE) + target.airflow_process_delay = max(1, 10 - (target.airflow_speed + 3)) + target.airflow_skip_speedcheck = TRUE + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + target.airflow_skip_speedcheck = FALSE + if (target.airflow_od) + target.set_density(TRUE) + if (!target.airflow_dest || target.loc == target.airflow_dest) + target.airflow_dest = locate(min(max(target.x + target.airflow_xo, 1), world.maxx), min(max(target.y + target.airflow_yo, 1), world.maxy), target.z) + if ((target.x == 1) || (target.x == world.maxx) || (target.y == 1) || (target.y == world.maxy)) + CLEAR_OBJECT(target) + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + if (!isturf(target.loc)) + CLEAR_OBJECT(target) + if (MC_TICK_CHECK) + current.Cut(i) + return + continue + step_towards(target, target.airflow_dest) + if (ismob(target)) + var/mob/M = target + M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, SSzas.settings.airflow_mob_slowdown) + addtimer(CALLBACK(M, /mob/proc/remove_movespeed_modifier, /datum/movespeed_modifier/atmos_pressure, TRUE)) + if (MC_TICK_CHECK) + current.Cut(i) + return + +#undef CLEAR_OBJECT + + +/atom/movable/var/tmp/airflow_xo +/atom/movable/var/tmp/airflow_yo +/atom/movable/var/tmp/airflow_od +/atom/movable/var/tmp/airflow_process_delay +/atom/movable/var/tmp/airflow_skip_speedcheck + + +/atom/movable/proc/prepare_airflow(strength) + if (!airflow_dest || airflow_speed < 0 || last_airflow > world.time - SSzas.settings.airflow_delay) + return FALSE + if (airflow_speed) + airflow_speed = strength / max(get_dist(src, airflow_dest), 1) + return FALSE + if (airflow_dest == loc) + step_away(src, loc) + if (!AirflowCanMove(strength)) + return FALSE + if (ismob(src)) + to_chat(src, span_danger("You are pushed away by a rush of air!")) + last_airflow = world.time + var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) + if (airflow_falloff < 1) + airflow_dest = null + return FALSE + airflow_speed = min(max(strength * (9 / airflow_falloff), 1), 9) + airflow_od = FALSE + if (!density) + set_density(TRUE) + airflow_od = TRUE + return TRUE + + +/atom/movable/proc/GotoAirflowDest(strength) + if (!prepare_airflow(strength)) + return + airflow_xo = airflow_dest.x - x + airflow_yo = airflow_dest.y - y + airflow_dest = null + SSairflow.processing += src + + +/atom/movable/proc/RepelAirflowDest(strength) + if (!prepare_airflow(strength)) + return + airflow_xo = -(airflow_dest.x - x) + airflow_yo = -(airflow_dest.y - y) + airflow_dest = null + SSairflow.processing += src diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 32a04f57ba4..a45c9921098 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(minor_mapping) mouse.forceMove(proposed_turf) else mouse = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) - if(proposed_turf.air.has_gas(/datum/gas/oxygen, 5)) + if(proposed_turf.air.has_gas(GAS_OXYGEN, 5)) num_mice -= 1 mouse = null diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index c2a0ff0f195..17ece9c7e85 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -129,7 +129,7 @@ SUBSYSTEM_DEF(time_track) time_dilation_avg_slow, MAPTICK_LAST_INTERNAL_TICK_USAGE, length(SStimer.timer_id_dict), - SSair.cost_turfs, + /*SSair.cost_turfs, SSair.cost_groups, SSair.cost_highpressure, SSair.cost_hotspots, @@ -141,7 +141,7 @@ SUBSYSTEM_DEF(time_track) length(SSair.hotspots), length(SSair.networks), length(SSair.high_pressure_delta), - length(SSair.active_super_conductivity), + length(SSair.active_super_conductivity),*/ SSdbcore.all_queries_num, SSdbcore.queries_active_num, SSdbcore.queries_standby_num diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index f6cf060c884..26a3631b8e0 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -68,9 +68,10 @@ SUBSYSTEM_DEF(zas) flags = SS_POST_FIRE_TIMING //The variable setting controller - var/zas_controller/settings + var/datum/zas_controller/settings //XGM gas data var/datum/xgm_gas_data/gas_data + //Geometry lists var/list/zones = list() var/list/edges = list() @@ -82,6 +83,8 @@ SUBSYSTEM_DEF(zas) //Atmos Machines var/list/atmos_machinery = list() + //Atoms to be processed + var/list/atom_process = list() //Geometry updates lists var/list/tiles_to_update = list() @@ -104,6 +107,7 @@ SUBSYSTEM_DEF(zas) var/list/curr_hotspot var/list/curr_zones var/list/curr_machines + var/list/curr_atoms var/current_process = SSZAS_TILES @@ -116,7 +120,7 @@ SUBSYSTEM_DEF(zas) // Make sure we don't rebuild mid-tick. if (state != SS_IDLE) - to_chat(world, bold_announce("ZAS Rebuild initiated. Waiting for current air tick to complete before continuing.")) + to_chat(world, span_boldannounce("ZAS Rebuild initiated. Waiting for current air tick to complete before continuing.")) while (state != SS_IDLE) stoplag() @@ -155,9 +159,9 @@ SUBSYSTEM_DEF(zas) var/starttime = REALTIMEOFDAY settings = new - gas_data = new /datum/xgm_gas_data + gas_data = new - to_chat(world, bold_announce("Processing Geometry...")) + to_chat(world, span_boldannounce("Processing Geometry...")) var/simulated_turf_count = 0 for(var/turf/simulated/S) @@ -166,7 +170,7 @@ SUBSYSTEM_DEF(zas) CHECK_TICK - to_chat(world, bold_announce( + to_chat(world, span_boldannounce( {"Total Simulated Turfs: [simulated_turf_count] Total Zones: [zones.len] Total Edges: [edges.len] @@ -174,15 +178,15 @@ SUBSYSTEM_DEF(zas) Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]"} )) - to_chat(world, bold_announce("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_boldannounce("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) if (simulate) - to_chat(world, bold_announce("Settling air...")) + to_chat(world, span_boldannounce("Settling air...")) starttime = REALTIMEOFDAY fire(FALSE, TRUE) - to_chat(world, bold_announce("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_boldannounce("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) ..(timeofday) @@ -310,6 +314,18 @@ SUBSYSTEM_DEF(zas) if (MC_TICK_CHECK) return + current_process = SSZAS_ATOMS + curr_atoms = atom_process + if(current_process == SSZAS_ATOMS) + while(curr_atoms.len) + var/atom/talk_to = curr_atoms[curr_atoms.len] + curr_atoms.len-- + if(!talk_to) + return + talk_to.process_exposure() + if(MC_TICK_CHECK) + return + current_process = SSZAS_MACHINES /** @@ -519,3 +535,18 @@ SUBSYSTEM_DEF(zas) active_edges -= E if(processing_edges) processing_edges -= E + +/datum/controller/subsystem/zas/proc/get_init_dirs(type, dir, init_dir) + + if(!pipe_init_dirs_cache[type]) + pipe_init_dirs_cache[type] = list() + + if(!pipe_init_dirs_cache[type]["[init_dir]"]) + pipe_init_dirs_cache[type]["[init_dir]"] = list() + + if(!pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"]) + var/obj/machinery/atmospherics/temp = new type(null, FALSE, dir, init_dir) + pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] = temp.get_init_directions() + qdel(temp) + + return pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index 431a6695753..5bc91a7d85b 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -1,5 +1,5 @@ /datum/atmosphere - var/gas_string + //var/gas_string var/id var/list/base_gases // A list of gases to always have @@ -14,8 +14,9 @@ var/maximum_temp /datum/atmosphere/New() - generate_gas_string() + //generate_gas_string() +/* /datum/atmosphere/proc/generate_gas_string() var/list/spicy_gas = restricted_gases.Copy() var/target_pressure = rand(minimum_pressure, maximum_pressure) @@ -65,3 +66,4 @@ gas_string_builder += "[gas[GAS_META][META_GAS_ID]]=[gas[MOLES]]" gas_string_builder += "TEMP=[gasmix.temperature]" gas_string = gas_string_builder.Join(";") +*/ diff --git a/code/datums/components/atmos_reaction_recorder.dm b/code/datums/components/atmos_reaction_recorder.dm index 02ec672655c..d2f1ffa6895 100644 --- a/code/datums/components/atmos_reaction_recorder.dm +++ b/code/datums/components/atmos_reaction_recorder.dm @@ -5,13 +5,13 @@ * Add this component after gasmixes has been initialized. */ /datum/component/atmos_reaction_recorder - /// The list we write append each reaction tick to. + /// The list we write append each reaction tick to. /// This is often a list initialized by something else (passed as a reference under Initialize). var/list/copied_reaction_results /// Signals we have been listening to. var/list/registered_signals -/** +/** * Verify that parent is indeed an atom, and then register signals. * Args: * - target_list (list): The list we are writing the captured reaction_results to. @@ -46,8 +46,7 @@ /// Fetches reaction_results and updates the list. /datum/component/atmos_reaction_recorder/proc/update_data(datum/gas_mixture/recorded_gasmix) SIGNAL_HANDLER - for (var/reaction in recorded_gasmix.reaction_results) - copied_reaction_results[reaction] += recorded_gasmix.reaction_results[reaction] + //copied_reaction_results[reaction] += "UNIMPLIMENTED: ATMOS REACTION RECORDER" /datum/component/atmos_reaction_recorder/proc/reset_data() SIGNAL_HANDLER diff --git a/code/datums/components/combustible_flooder.dm b/code/datums/components/combustible_flooder.dm index 98c88e3290d..cae32ef8f64 100644 --- a/code/datums/components/combustible_flooder.dm +++ b/code/datums/components/combustible_flooder.dm @@ -37,8 +37,8 @@ flooded_turf = parent_turf.ScrapeAway(1, CHANGETURF_INHERIT_AIR) delete_parent = FALSE - flooded_turf.atmos_spawn_air("[gas_id]=[gas_amount];TEMP=[temp_amount || trigger_temperature]") - + flooded_turf.atmos_spawn_air(gas_id, gas_amount, temp_amount||trigger_temperature) + // Logging-related var/admin_message = "[parent] ignited in [ADMIN_VERBOSEJMP(flooded_turf)]" var/log_message = "[parent] ignited in [AREACOORD(flooded_turf)]" @@ -52,7 +52,7 @@ log_game(log_message) if(delete_parent && !QDELETED(parent)) - qdel(parent) // For things with the explodable component like plasma mats this isn't necessary, but there's no harm. + qdel(parent) // For things with the explodable component like plasma mats this isn't necessary, but there's no harm. qdel(src) /// fire_act reaction. diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index 71565bb29f4..b5977d93bd5 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -31,7 +31,7 @@ src.leak_rate = leak_rate /datum/component/gas_leaker/Destroy(force, silent) - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) return ..() /datum/component/gas_leaker/RegisterWithParent() @@ -56,7 +56,7 @@ SIGNAL_HANDLER // Hello fellow atmospherics machines, I too am definitely an atmos machine like you! // This component needs to tick at the same rate as the atmos system - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) /datum/component/gas_leaker/proc/process_obj(obj/master, list/airs=list()) airs += master.return_air() @@ -78,9 +78,7 @@ var/turf/location = get_turf(master) var/true_rate = (1 - (current_integrity / master.max_integrity)) * leak_rate for(var/datum/gas_mixture/mix as anything in airs) - var/pressure = mix.return_pressure() - if(mix.release_gas_to(location.return_air(), pressure, true_rate)) - location.air_update_turf(FALSE, FALSE) + mix.mingle_with_turf(get_turf(parent), true_rate)//Not sure this is the best way to do this buuuuuut, ZASSED! #undef PROCESS_OBJ #undef PROCESS_MACHINE diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 2306f13407c..5039ca06fd6 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -126,7 +126,9 @@ if(end == start) return TRUE var/turf/Temp = get_step_towards(end, start) - if(!TURFS_CAN_SHARE(end, Temp)) //Don't go through a wall + var/canpass_air + ATMOS_CANPASS_TURF(canpass_air, end, Temp) + if(!canpass_air) //Don't go through a wall return FALSE end = Temp diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index b9088b7efb5..a5e9fbed306 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -489,10 +489,8 @@ if(M.loc) environment = M.loc.return_air() - if(environment) - gases = environment.gases - if(gases[/datum/gas/plasma]) - . += power * min(0.5, gases[/datum/gas/plasma][MOLES] * HEALING_PER_MOL) + if(environment && environment.get_gas(GAS_PLASMA)) + . += power * min(0.5, environment.get_gas(GAS_PLASMA) * HEALING_PER_MOL) if(M.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) . += power * 0.75 //Determines how much the symptom heals if injected or ingested diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 94493a18097..6b3c13899fc 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -46,15 +46,13 @@ if(!open_turf.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) return FALSE - var/open_turf_gases = open_turf.air.gases - open_turf.air.assert_gases(arglist(GLOB.hardcoded_gases)) + var/datum/gas_mixture/open_turf_gases = open_turf.return_air() - var/plas = open_turf_gases[/datum/gas/plasma][MOLES] - var/oxy = open_turf_gases[/datum/gas/oxygen][MOLES] - var/n2 = open_turf_gases[/datum/gas/nitrogen][MOLES] - var/co2 = open_turf_gases[/datum/gas/carbon_dioxide][MOLES] - open_turf.air.garbage_collect() + var/plas = open_turf_gases.get_gas(GAS_PLASMA) + var/oxy = open_turf_gases.get_gas(GAS_OXYGEN) + var/n2 = open_turf_gases.get_gas(GAS_NITROGEN) + var/co2 = open_turf_gases.get_gas(GAS_CO2) . = TRUE if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index ca676327e26..9cc8799db7b 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -24,7 +24,7 @@ us.RemoveElement(/datum/element/connect_loc, pass_on) if(us.flags_1 & ATMOS_IS_PROCESSING_1) us.atmos_end() - SSair.atom_process -= us + SSzas.atom_process -= us us.flags_1 &= ~ATMOS_IS_PROCESSING_1 return ..() @@ -40,11 +40,11 @@ if(should_atmos_process(air, exposed_temperature)) if(flags_1 & ATMOS_IS_PROCESSING_1) return - SSair.atom_process += src + SSzas.atom_process += src flags_1 |= ATMOS_IS_PROCESSING_1 else if(flags_1 & ATMOS_IS_PROCESSING_1) atmos_end() - SSair.atom_process -= src + SSzas.atom_process -= src flags_1 &= ~ATMOS_IS_PROCESSING_1 /atom/proc/process_exposure() @@ -52,12 +52,12 @@ if(!istype(loc, /turf/open)) //If you end up in a locker or a wall reconsider your life decisions atmos_end() - SSair.atom_process -= src + SSzas.atom_process -= src flags_1 &= ~ATMOS_IS_PROCESSING_1 return if(!should_atmos_process(spot.air, spot.air.temperature)) //Things can change without a tile becoming active atmos_end() - SSair.atom_process -= src + SSzas.atom_process -= src flags_1 &= ~ATMOS_IS_PROCESSING_1 return atmos_expose(spot.air, spot.air.temperature) @@ -65,7 +65,7 @@ /turf/open/process_exposure() if(!should_atmos_process(air, air.temperature)) atmos_end() - SSair.atom_process -= src + SSzas.atom_process -= src flags_1 &= ~ATMOS_IS_PROCESSING_1 return atmos_expose(air, air.temperature) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index cb5aa00386a..3fc5a504215 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -128,32 +128,22 @@ if(no_teleport && (destination_area.area_flags & NOTELEPORT)) return - var/datum/gas_mixture/floor_gas_mixture = floor_turf.air - if(!floor_gas_mixture) - return - - var/list/floor_gases = floor_gas_mixture.gases - var/trace_gases - for(var/id in floor_gases) - if(id in GLOB.hardcoded_gases) - continue - trace_gases = TRUE - break + var/datum/gas_mixture/floor_gases= floor_turf.return_air() - // Can most things breathe? - if(trace_gases) + if(!floor_gases) return - if(!(floor_gases[/datum/gas/oxygen] && floor_gases[/datum/gas/oxygen][MOLES] >= 16)) + + if(!(floor_gases.get_gas(GAS_OXYGEN) >= 16)) return - if(floor_gases[/datum/gas/plasma]) + if(floor_gases.get_gas(GAS_PLASMA)) return - if(floor_gases[/datum/gas/carbon_dioxide] && floor_gases[/datum/gas/carbon_dioxide][MOLES] >= 10) + if(floor_gases.get_gas(GAS_CO2) >= 10) return // Aim for goldilocks temperatures and pressure - if((floor_gas_mixture.temperature <= 270) || (floor_gas_mixture.temperature >= 360)) + if((floor_gases.temperature <= 270) || (floor_gases.temperature >= 360)) return - var/pressure = floor_gas_mixture.return_pressure() + var/pressure = floor_gases.return_pressure() if((pressure <= 20) || (pressure >= 550)) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 79ddce1ff12..bdaa6a41803 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -116,7 +116,7 @@ //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) can_atmos_pass = ATMOS_PASS_YES - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) loc.handle_atom_del(src) if(opacity) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 39665740779..4c66c5e301d 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -299,7 +299,7 @@ var/target_amount = text2num(name) var/found_amount = 0 var/datum/gas_mixture/mix = T.return_air() - found_amount += mix.gases[/datum/gas/plasma] ? mix.gases[/datum/gas/plasma][MOLES] : 0 + found_amount += mix.get_gas(GAS_PLASMA) return found_amount>=target_amount diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 4f5a5125183..316ab1fa2ee 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -90,7 +90,7 @@ desc = "Some kind of machine." verb_say = "beeps" verb_yell = "blares" - pressure_resistance = 15 + //pressure_resistance = 15 pass_flags_self = PASSMACHINE max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. @@ -536,10 +536,11 @@ if(!.) return FALSE - var/turf/user_turf = get_turf(user) + /*var/turf/user_turf = get_turf(user) var/turf/machine_turf = get_turf(src) if(!(user_turf in machine_turf.atmos_adjacent_turfs)) return FALSE + */ if((interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SIGHT) && user.is_blind()) to_chat(user, span_warning("This machine requires sight to use.")) diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index 72a3df3153e..7b4a83bad3c 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -16,13 +16,13 @@ /obj/machinery/air_sensor/Initialize(mapload) id_tag = chamber_id + "_sensor" - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) return ..() /obj/machinery/air_sensor/Destroy() INVOKE_ASYNC(src, .proc/broadcast_destruction, src.frequency) - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) SSradio.remove_object(src, frequency) return ..() diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm index 7651109971f..9d3416aa1e1 100644 --- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm +++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm @@ -133,7 +133,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) data["maxOutput"] = MAX_OUTPUT_PRESSURE data["control"] = control data["reconnecting"] = reconnecting - data += return_atmos_handbooks() + //data += return_atmos_handbooks() return data /obj/machinery/computer/atmos_control/ui_data(mob/user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b817ef75e3f..9e15c38656a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1220,7 +1220,7 @@ filler.set_density(FALSE) //PARIAH STATION EDIT END flags_1 &= ~PREVENT_CLICK_UNDER_1 - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) sleep(1) layer = OPEN_DOOR_LAYER update_icon(ALL, AIRLOCK_OPEN, TRUE) @@ -1270,7 +1270,7 @@ if(multi_tile) filler.density = TRUE //PARIAH STATION EDIT END - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) sleep(1) if(!air_tight) set_density(TRUE) @@ -1279,7 +1279,7 @@ if(multi_tile) filler.density = TRUE //PARIAH STATION EDIT END - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) sleep(4) if(dangerous_close) crush() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ab7943b5c57..8e9b2fc379f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -47,7 +47,7 @@ . = ..() set_init_door_layer() update_freelook_sight() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) register_context() GLOB.airlocks += src spark_system = new /datum/effect_system/spark_spread @@ -101,7 +101,7 @@ if(spark_system) qdel(spark_system) spark_system = null - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) return ..() /** @@ -169,8 +169,8 @@ /obj/machinery/door/Move() var/turf/T = loc . = ..() - if(density) //Gotta be closed my friend - move_update_air(T) + /*if(density) //Gotta be closed my friend + move_update_air(T)*/ /obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -183,7 +183,7 @@ /obj/machinery/door/proc/bumpopen(mob/user) if(operating || !can_open_with_hands) return - + add_fingerprint(user) if(!density || (obj_flags & EMAGGED)) return @@ -353,7 +353,7 @@ update_appearance() set_opacity(0) operating = FALSE - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) update_freelook_sight() if(autoclose) autoclose_in(DOOR_CLOSE_WAIT) @@ -383,7 +383,7 @@ if(visible && !glass) set_opacity(1) operating = FALSE - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) update_freelook_sight() if(!can_crush) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 3d4779d748e..f314b223636 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -46,7 +46,7 @@ ///The merger_id and merger_typecache variables are used to make rows of firelocks activate at the same time. var/merger_id = "firelocks" var/static/list/merger_typecache - + ///Overlay object for the warning lights. This and some plane settings allows the lights to glow in the dark. var/mutable_appearance/warn_lights @@ -239,7 +239,7 @@ /obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/loc) for(var/dir in GLOB.cardinals) var/turf/checked_turf = get_step(get_turf(loc), dir) - + if(!checked_turf) continue @@ -270,7 +270,7 @@ var/turf/checked_turf = source var/result = check_atmos(checked_turf) - if(result && TURF_SHARES(checked_turf)) + if(result && Adjacent(checked_turf)) issue_turfs |= checked_turf if(!alarm_type) start_activation_process(result) @@ -278,7 +278,7 @@ issue_turfs -= checked_turf if(!length(issue_turfs)) start_deactivation_process() - + /** * Begins activation process of us and our neighbors. diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b6464443065..b989be0dbbf 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -72,8 +72,8 @@ if(atom_integrity == 0) playsound(src, SFX_SHATTER, 70, TRUE) electronics = null - var/turf/floor = get_turf(src) - floor.air_update_turf(TRUE, FALSE) + /*var/turf/floor = get_turf(src) + floor.air_update_turf(TRUE, FALSE)*/ return ..() /obj/machinery/door/window/update_icon_state() @@ -214,7 +214,7 @@ icon_state ="[base_state]open" sleep(10) set_density(FALSE) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) update_freelook_sight() if(operating == 1) //emag again @@ -236,7 +236,7 @@ icon_state = base_state set_density(TRUE) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) update_freelook_sight() sleep(10) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index ab71b554508..99d1e3195f0 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -55,7 +55,7 @@ Buildable meters update() pixel_x += rand(-5, 5) pixel_y += rand(-5, 5) - + //Flipping handled manually due to custom handling for trinary pipes AddComponent(/datum/component/simple_rotation, ROTATION_NO_FLIPPING) return ..() @@ -171,7 +171,7 @@ Buildable meters // See if we would conflict with any of the potentially interacting machines for(var/obj/machinery/atmospherics/machine as anything in potentially_conflicting_machines) // if the pipes have any directions in common, we can't place it that way. - var/our_init_dirs = SSair.get_init_dirs(pipe_type, fixed_dir(), p_init_dir) + var/our_init_dirs = SSzas.get_init_dirs(pipe_type, fixed_dir(), p_init_dir) if(machine.get_init_directions() & our_init_dirs) // We have a conflict! if (length(potentially_conflicting_machines) != 1 || !try_smart_reconfiguration(machine, our_init_dirs, user)) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 17fc788ca5e..eca093c49b7 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -14,16 +14,16 @@ /obj/structure/emergency_shield/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/emergency_shield/Destroy() - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) . = ..() /obj/structure/emergency_shield/Move() var/turf/T = loc - . = ..() - move_update_air(T) + /*. = ..() + move_update_air(T)*/ /obj/structure/emergency_shield/emp_act(severity) . = ..() @@ -101,7 +101,7 @@ */ /obj/structure/emergency_shield/cult/barrier/proc/Toggle() set_density(!density) - air_update_turf(TRUE, !density) + //air_update_turf(TRUE, !density) invisibility = initial(invisibility) if(!density) invisibility = INVISIBILITY_OBSERVER @@ -114,7 +114,7 @@ density = TRUE opacity = FALSE anchored = FALSE - pressure_resistance = 2*ONE_ATMOSPHERE + //pressure_resistance = 2*ONE_ATMOSPHERE req_access = list(ACCESS_ENGINE) max_integrity = 100 var/active = FALSE diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 7233be61c25..3134a41d209 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -48,10 +48,10 @@ if(ispath(cell)) cell = new cell(src) update_appearance() - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) /obj/machinery/space_heater/Destroy() - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) return..() /obj/machinery/space_heater/on_deconstruction() @@ -125,7 +125,7 @@ delta_temperature *= -1 if(delta_temperature) enviroment.temperature += delta_temperature - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) cell.use(required_energy / efficiency) /obj/machinery/space_heater/RefreshParts() @@ -265,7 +265,7 @@ usr.visible_message(span_notice("[usr] switches [on ? "on" : "off"] \the [src]."), span_notice("You switch [on ? "on" : "off"] \the [src].")) update_appearance() if (on) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) ///For use with heating reagents in a ghetto way /obj/machinery/space_heater/improvised_chem_heater diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 5a813c89084..abf34991f33 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -326,7 +326,8 @@ ticks -= releasedelay var/turf/open/T = get_turf(src) if(istype(T)) - T.atmos_spawn_air("o2=5;plasma=5;TEMP=1000") + T.atmos_spawn_air(GAS_OXYGEN, 5, 1000) + T.atmos_spawn_air(GAS_PLASMA, 5, 1000) /obj/effect/anomaly/pyro/detonate() INVOKE_ASYNC(src, .proc/makepyroslime) @@ -334,7 +335,9 @@ /obj/effect/anomaly/pyro/proc/makepyroslime() var/turf/open/T = get_turf(src) if(istype(T)) - T.atmos_spawn_air("o2=500;plasma=500;TEMP=1000") //Make it hot and burny for the new slime + T.atmos_spawn_air(GAS_OXYGEN, 5, 1000) + T.atmos_spawn_air(GAS_PLASMA, 5, 1000) + var/new_colour = pick("red", "orange") var/mob/living/simple_animal/slime/S = new(T, new_colour) S.rabid = TRUE diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a49d1548b38..80a9ab9b5ba 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -45,14 +45,13 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - if(G.gases[/datum/gas/plasma]) - var/plas_amt = min(30,G.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma - G.gases[/datum/gas/plasma][MOLES] -= plas_amt + if(G.get_gas(GAS_PLASMA)) + var/plas_amt = min(30, G.get_gas(GAS_PLASMA)) //Absorb some plasma + G.remove_gas(GAS_PLASMA, plas_amt) absorbed_plasma += plas_amt if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) - G.garbage_collect() - T.air_update_turf(FALSE, FALSE) + //T.air_update_turf(FALSE, FALSE) /obj/effect/particle_effect/foam/firefighting/kill_foam() STOP_PROCESSING(SSfastprocess, src) @@ -283,16 +282,16 @@ /obj/structure/foamedmetal/Initialize(mapload) . = ..() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/foamedmetal/Destroy() - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) . = ..() /obj/structure/foamedmetal/Move() var/turf/T = loc . = ..() - move_update_air(T) + //move_update_air(T) /obj/structure/foamedmetal/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -364,12 +363,12 @@ G.temperature = 293.15 for(var/obj/effect/hotspot/H in O) qdel(H) - var/list/G_gases = G.gases + var/list/G_gases = G.gas for(var/I in G_gases) - if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen) + if(I == GAS_OXYGEN || I == GAS_NITROGEN) continue - G_gases[I][MOLES] = 0 - G.garbage_collect() + G_gases[I] = 0 + G.update_values() for(var/obj/machinery/atmospherics/components/unary/U in O) if(!U.welded) U.welded = TRUE diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 24b1af4ee2a..75308cce91a 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -173,15 +173,12 @@ var/datum/gas_mixture/G = T.air if(!distcheck || get_dist(T, location) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air G.temperature = temperature - T.air_update_turf(FALSE, FALSE) + //T.air_update_turf(FALSE, FALSE) for(var/obj/effect/hotspot/H in T) qdel(H) - var/list/G_gases = G.gases - if(G_gases[/datum/gas/plasma]) - G.assert_gas(/datum/gas/nitrogen) - G_gases[/datum/gas/nitrogen][MOLES] += (G_gases[/datum/gas/plasma][MOLES]) - G_gases[/datum/gas/plasma][MOLES] = 0 - G.garbage_collect() + if(G.get_gas(GAS_PLASMA)) + G.add_gas(GAS_NITROGEN, G.get_gas(GAS_PLASMA)) + G.remove_gas(GAS_PLASMA, G.gas[GAS_PLASMA]) if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e9fb99dd5e8..d32d35ae8dd 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -86,7 +86,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e ///This is used to determine on which slots an item can fit. var/slot_flags = 0 pass_flags = PASSTABLE - pressure_resistance = 4 + //pressure_resistance = 4 /// This var exists as a weird proxy "owner" ref /// It's used in a few places. Stop using it, and optimially replace all uses please var/obj/item/master = null diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 2c9a60067f2..e2f7b63f5c5 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -1005,7 +1005,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) for(var/direction in GLOB.cardinals) var/turf/C = get_step(W, direction) var/list/dupes = checkdupes(C) - if((isspaceturf(C) || TURF_SHARES(C)) && !dupes.len) + if((isspaceturf(C) || C.TryGetNonDenseNeighbour()) && !dupes.len) candidates += C if(!candidates.len) to_chat(user, span_warning("Valid target not found...")) diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index f376c9d6358..cbc9d797ce6 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -510,7 +510,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( for (var/obj/machinery/atmospherics/O in S.nodes) O.atmos_init() O.add_member(src) - SSair.add_to_rebuild_queue(S) + SSzas.add_to_rebuild_queue(S) // Finally, update our internal state - update_pipe_icon also updates dir and connections S.update_pipe_icon() user.visible_message(span_notice("[user] reprograms the \the [S]."),span_notice("You reprogram \the [S].")) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index ec8483d5961..b8740740a76 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -194,7 +194,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn + if(!air || !air.has_gas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn to_chat(user, span_notice("Your [name] needs a source of oxygen to burn.")) return ..() @@ -315,7 +315,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM user?.IgniteMob() if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn + if(!air || !air.has_gas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn extinguish() return diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 905e7fdecab..123e215b394 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -142,7 +142,7 @@ var/delta_temperature = temp_to_give / environment.heat_capacity() if(delta_temperature) environment.temperature += delta_temperature - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) if(admins_warned && internal_heat < max_heat * 0.75) admins_warned = FALSE message_admins("Power sink at ([x],[y],[z] - <A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) has cooled down and will not explode.") diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index cf5316866e9..997d0da6585 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -101,7 +101,7 @@ ui.open() /obj/item/analyzer/ui_static_data(mob/user) - return return_atmos_handbooks() + return //return_atmos_handbooks() /obj/item/analyzer/ui_data(mob/user) LAZYINITLIST(last_gasmix_data) @@ -125,7 +125,7 @@ /** * Outputs a message to the user describing the target's gasmixes. - * + * * Gets called by analyzer_act, which in turn is called by tool_act. * Also used in other chat-based gas scans. */ @@ -133,7 +133,7 @@ var/mixture = target.return_analyzable_air() if(!mixture) return FALSE - + var/icon = target var/message = list() if(!silent && isliving(user)) @@ -157,17 +157,17 @@ if(total_moles > 0) message += span_notice("Moles: [round(total_moles, 0.01)] mol") - - var/list/cached_gases = air.gases + + var/list/cached_gases = air.gas for(var/id in cached_gases) - var/gas_concentration = cached_gases[id][MOLES]/total_moles - message += span_notice("[cached_gases[id][GAS_META][META_GAS_NAME]]: [round(cached_gases[id][MOLES], 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") + var/gas_concentration = air.get_total_moles(gas_id)/total_moles + message += span_notice("[id]: [round(air.get_gas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") message += span_notice("Pressure: [round(pressure, 0.01)] kPa") else message += airs.len > 1 ? span_notice("This node is empty!") : span_notice("[target] is empty!") - + gasmix_data += list(gas_mixture_parser(air, mix_name)) if(istype(tool)) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 730df0413be..c1234098dfd 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -202,9 +202,9 @@ for(var/turf/T in turflist) if(T == previousturf) continue //so we don't burn the tile we be standin on - var/list/turfs_sharing_with_prev = previousturf.get_atmos_adjacent_turfs(alldir=1) + /*var/list/turfs_sharing_with_prev = previousturf.TryGetNonDenseNeighbour() if(!(T in turfs_sharing_with_prev)) - break + break*/ if(igniter) igniter.ignite_turf(src,T) else diff --git a/code/game/objects/items/grenades/atmos_grenades.dm b/code/game/objects/items/grenades/atmos_grenades.dm index 27223969a34..a17fe6e9e32 100644 --- a/code/game/objects/items/grenades/atmos_grenades.dm +++ b/code/game/objects/items/grenades/atmos_grenades.dm @@ -70,6 +70,8 @@ var/distance_from_center = max(get_dist(turf_loc, loc), 1) var/turf/open/floor_loc = turf_loc floor_loc.atmos_spawn_air("n2=[n2_gas_amount / distance_from_center];o2=[o2_gas_amount / distance_from_center];TEMP=273") + floor_loc.atmos_spawn_air(GAS_NITROGEN, n2_gas_amount/distance_from_center, 273) + floor_loc.atmos_spawn_air(GAS_OXYGEN, o2_gas_amount/distance_from_center, 273) qdel(src) /obj/item/grenade/gas_crystal/nitrous_oxide_crystal diff --git a/code/game/objects/items/secret_documents.dm b/code/game/objects/items/secret_documents.dm index 8c5780b1785..3c42f9c9396 100644 --- a/code/game/objects/items/secret_documents.dm +++ b/code/game/objects/items/secret_documents.dm @@ -18,7 +18,7 @@ throw_range = 1 throw_speed = 1 layer = MOB_LAYER - pressure_resistance = 2 + //pressure_resistance = 2 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF ///Nanotrasen documents diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 3e3eb90e583..14fafa34062 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -41,8 +41,7 @@ /obj/item/tank/jetpack/populate_gas() if(gas_type) var/datum/gas_mixture/our_mix = return_air() - our_mix.assert_gas(gas_type) - our_mix.gases[gas_type][MOLES] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) + our_mix.adjust_gas(gas_type, (6*ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) /obj/item/tank/jetpack/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_jetpack)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 093048267da..f2bab55a201 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -17,7 +17,7 @@ slot_flags = ITEM_SLOT_BACK worn_icon = 'icons/mob/clothing/back.dmi' //since these can also get thrown into suit storage slots. if something goes on the belt, set this to null. hitsound = 'sound/weapons/smash.ogg' - pressure_resistance = ONE_ATMOSPHERE * 5 + //pressure_resistance = ONE_ATMOSPHERE * 5 force = 5 throwforce = 10 throw_speed = 1 @@ -89,7 +89,7 @@ AddComponent(/datum/component/atmos_reaction_recorder, reset_criteria = list(COMSIG_GASMIX_MERGING = air_contents, COMSIG_GASMIX_REMOVING = air_contents), target_list = reaction_info) - // This is separate from the reaction recorder. + // This is separate from the reaction recorder. // In this case we are only listening to determine if the tank is overpressurized but not destroyed. RegisterSignal(air_contents, COMSIG_GASMIX_MERGED, .proc/merging_information) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 08773b1cf19..a69ef63a050 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -1,7 +1,7 @@ /// Inert structures, such as girders, machine frames, and crates/lockers. /obj/structure icon = 'icons/obj/structures.dmi' - pressure_resistance = 8 + //pressure_resistance = 8 max_integrity = 300 interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT layer = BELOW_OBJ_LAYER diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index a59bfebb0be..d025218944f 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -68,10 +68,10 @@ /obj/structure/alien/resin/Initialize(mapload) . = ..() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/alien/resin/Destroy() - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) . = ..() /obj/structure/alien/resin/Move() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 2cac5b155ae..971e5b2bd6c 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -31,7 +31,7 @@ var/obj/item/stack/initialized_mineral = new mineral // Okay this kinda sucks. set_custom_materials(initialized_mineral.mats_per_unit, mineral_amount) qdel(initialized_mineral) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/falsewall/attack_hand(mob/user, list/modifiers) if(opening) @@ -55,7 +55,7 @@ set_opacity(density) opening = FALSE update_appearance() - air_update_turf(TRUE, !density) + //air_update_turf(TRUE, !density) /obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open . = ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 8274b934286..fe236a97e8a 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -11,7 +11,7 @@ anchored = TRUE pass_flags_self = PASSGRILLE flags_1 = CONDUCT_1 - pressure_resistance = 5*ONE_ATMOSPHERE + //pressure_resistance = 5*ONE_ATMOSPHERE armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) max_integrity = 50 integrity_failure = 0.4 diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 0e8c5023747..c0f1886ee61 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -106,7 +106,7 @@ . = ..() var/turf/local = get_turf(loc) ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/holosign/barrier/atmos/block_superconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players. return TRUE @@ -114,7 +114,7 @@ /obj/structure/holosign/barrier/atmos/Destroy() var/turf/local = get_turf(loc) REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) return ..() /obj/structure/holosign/barrier/cyborg diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 0f709dcd547..1f49ac6602a 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -33,11 +33,11 @@ var/obj/item/stack/initialized_mineral = new sheetType // Okay this kinda sucks. set_custom_materials(initialized_mineral.mats_per_unit, sheetAmount) qdel(initialized_mineral) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/mineral_door/Destroy() if(!door_opened) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) . = ..() /obj/structure/mineral_door/Move() @@ -104,7 +104,7 @@ set_density(FALSE) door_opened = TRUE layer = OPEN_DOOR_LAYER - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) update_appearance() isSwitchingStates = FALSE @@ -125,7 +125,7 @@ set_opacity(TRUE) door_opened = FALSE layer = initial(layer) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) update_appearance() isSwitchingStates = FALSE @@ -144,7 +144,7 @@ /obj/structure/mineral_door/set_anchored(anchorvalue) //called in default_unfasten_wrench() chain . = ..() set_opacity(anchored ? !door_opened : FALSE) - air_update_turf(TRUE, anchorvalue) + //air_update_turf(TRUE, anchorvalue) /obj/structure/mineral_door/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 8604fd64825..7de6274d8e1 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -35,7 +35,7 @@ return TRUE set_anchored(!anchored) update_atmos_behaviour() - air_update_turf(TRUE) + //air_update_turf(TRUE) to_chat(user, span_notice("You [uraction] the floor.")) return TRUE @@ -113,10 +113,10 @@ /obj/structure/plasticflaps/Initialize(mapload) . = ..() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/plasticflaps/Destroy() var/atom/oldloc = loc . = ..() if (oldloc) - oldloc.air_update_turf(TRUE, FALSE) + oldloc.//air_update_turf(TRUE, FALSE) diff --git a/code/game/objects/structures/tram_walls.dm b/code/game/objects/structures/tram_walls.dm index bb077f16bac..cfbbec9591f 100644 --- a/code/game/objects/structures/tram_walls.dm +++ b/code/game/objects/structures/tram_walls.dm @@ -30,7 +30,7 @@ var/obj/item/stack/initialized_mineral = new mineral set_custom_materials(initialized_mineral.mats_per_unit, mineral_amount) qdel(initialized_mineral) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/tramwall/attackby(obj/item/welder, mob/user, params) if(welder.tool_behaviour == TOOL_WELDER) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 951e1acbee2..64eaf8362c0 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -170,7 +170,7 @@ return var/datum/gas_mixture/floor_mixture = loc.return_air() if(pod.air_contents.equalize(floor_mixture)) //equalize the pod's mix with the tile it's on - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) /obj/structure/transit_tube/station/init_tube_dirs() switch(dir) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 3852bc3267f..ef5b5541cd5 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -33,7 +33,7 @@ . = ..() if(set_dir) setDir(set_dir) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = .proc/on_exit, @@ -44,7 +44,7 @@ /obj/structure/windoor_assembly/Destroy() set_density(FALSE) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) return ..() /obj/structure/windoor_assembly/Move() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4e4e0a2a010..6a787119060 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -4,7 +4,7 @@ icon_state = "window" density = TRUE layer = ABOVE_OBJ_LAYER //Just above doors - pressure_resistance = 4*ONE_ATMOSPHERE + //pressure_resistance = 4*ONE_ATMOSPHERE anchored = TRUE //initially is 0 for tile smoothing flags_1 = ON_BORDER_1 max_integrity = 25 @@ -58,7 +58,7 @@ if(reinf && anchored) state = RWINDOW_SECURE - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) if(fulltile) setDir() @@ -248,7 +248,7 @@ /obj/structure/window/set_anchored(anchorvalue) ..() - air_update_turf(TRUE, anchorvalue) + //air_update_turf(TRUE, anchorvalue) update_nearby_icons() /obj/structure/window/proc/check_state(checked_state) @@ -313,7 +313,7 @@ . += new /obj/item/shard(location) /obj/structure/window/proc/AfterRotation(mob/user, degrees) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) /obj/structure/window/proc/on_painted(obj/structure/window/source, is_dark_color) SIGNAL_HANDLER @@ -324,7 +324,7 @@ /obj/structure/window/Destroy() set_density(FALSE) - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) update_nearby_icons() return ..() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 5e93cc1cf66..32ee69b0d81 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -183,7 +183,7 @@ /turf/open/TakeTemperature(temp) air.temperature += temp - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) /turf/open/proc/freeze_turf() for(var/obj/I in contents) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 36d5d42f270..e4f54355ada 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -127,8 +127,10 @@ GLOBAL_LIST_EMPTY(station_turfs) if(our_area.area_has_base_lighting && always_lit) //Only provide your own lighting if the area doesn't for you add_overlay(GLOB.fullbright_overlay) + /* if(requires_activation) CALCULATE_ADJACENT_TURFS(src, KILL_EXCITED) + */ if (light_power && light_range) update_light() @@ -158,9 +160,10 @@ GLOBAL_LIST_EMPTY(station_turfs) return INITIALIZE_HINT_NORMAL +/* /turf/proc/Initalize_Atmos(times_fired) CALCULATE_ADJACENT_TURFS(src, NORMAL_TURF) - +*/ /turf/Destroy(force) . = QDEL_HINT_IWILLGC if(!changing_turf) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3c7d27283ac..7055901b8d3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -604,7 +604,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) set category = "Debug" if(!check_rights(R_DEBUG)) return - SSair.ui_interact(mob) + //SSair.ui_interact(mob) /client/proc/reload_cards() set name = "Reload Cards" diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index 9dc1cc0f9c7..07bfd96d02e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -16,7 +16,7 @@ if(!owner) return owner.visible_message(span_danger("[owner] vomits a cloud of plasma!")) - var/turf/open/T = get_turf(owner) + var/turf/simulated/open/T = get_turf(owner) if(istype(T)) - T.atmos_spawn_air("plasma=50;TEMP=[T20C]") + T.atmos_spawn_air(GAS_PLASMA, 20, T20C) owner.vomit() diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 4a6aaecda03..66c27170f30 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -282,7 +282,7 @@ verb_exclaim = "roars" verb_yell = "bellows" force_threshold = 10 - pressure_resistance = 50 + //pressure_resistance = 50 mob_size = MOB_SIZE_LARGE hud_type = /datum/hud/living/blobbernaut diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 818d0261a40..7734c3c363d 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -42,7 +42,7 @@ setDir(pick(GLOB.cardinals)) update_appearance() if(atmosblock) - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) ConsumeTile() if(!QDELETED(src)) //Consuming our tile can in rare cases cause us to del AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOB, CELL_VIRUS_TABLE_GENERIC, 2, 2) @@ -69,7 +69,7 @@ /obj/structure/blob/Destroy() if(atmosblock) atmosblock = FALSE - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) if(overmind) overmind.all_blobs -= src overmind.blobs_legit -= src //if it was in the legit blobs list, it isn't now diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index d086050210c..a329a247081 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -32,7 +32,7 @@ . = ..() if(. && atom_integrity > 0) atmosblock = atom_integrity < (max_integrity * 0.5) - air_update_turf(TRUE, atmosblock) + //air_update_turf(TRUE, atmosblock) /obj/structure/blob/shield/update_icon_state() icon_state = "[initial(icon_state)][(atom_integrity < (max_integrity * 0.5)) ? "_damaged" : null]" diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 49020e27a64..35fb5c34620 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -2,67 +2,91 @@ Contains helper procs for airflow, handled in /connection_group. */ -mob/var/tmp/last_airflow_stun = 0 -mob/proc/airflow_stun() +/mob/var/tmp/last_airflow_stun = 0 +/mob/proc/airflow_stun() + return +/mob/living/airflow_stun() if(stat == 2) return 0 - if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 + if(last_airflow_stun > world.time - SSzas.settings.airflow_stun_cooldown) return 0 - if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) + if(!(status_flags & CANSTUN) && !(status_flags & CANKNOCKDOWN)) to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>") return 0 if(buckled) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") return 0 - if(!lying) + if(!body_position == LYING_DOWN) to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") - Weaken(5) + + slip(5, null, GALOSHES_DONT_HELP|SLIDE, 0, TRUE) last_airflow_stun = world.time -mob/living/silicon/airflow_stun() +/mob/living/silicon/airflow_stun() return -mob/living/carbon/slime/airflow_stun() +/mob/living/carbon/slime/airflow_stun() return -mob/living/carbon/human/airflow_stun() +/mob/living/carbon/human/airflow_stun() if(!slip_chance()) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") return 0 ..() -atom/movable/proc/check_airflow_movable(n) +/mob/proc/slip_chance() + return + +/mob/living/carbon/human/slip_chance(prob_slip = 10) + if(stat) + return FALSE + if(buckled) + return FALSE + if(shoes) + var/obj/item/clothing/shoes = shoes + if(shoes.clothing_flags & NOSLIP|NOSLIP_ICE) + return FALSE + + if(m_intent == MOVE_INTENT_RUN) //No running in the halls! + prob_slip *= 2 + + if(HAS_TRAIT(src, TRAIT_NOSLIPALL)) + return + return prob_slip + +/atom/movable/proc/check_airflow_movable(n) if(anchored && !ismob(src)) return 0 - if(!isobj(src) && n < vsc.airflow_dense_pressure) return 0 + if(!isobj(src) && n < SSzas.settings.airflow_dense_pressure) return 0 return 1 -mob/check_airflow_movable(n) - if(n < vsc.airflow_heavy_pressure) +/mob/check_airflow_movable(n) + if(n < SSzas.settings.airflow_heavy_pressure) return 0 return 1 -mob/living/silicon/check_airflow_movable() +/mob/living/silicon/check_airflow_movable() return 0 +/obj/check_airflow_movable(n) + if(n < SSzas.settings.airflow_dense_pressure) return 0 -obj/check_airflow_movable(n) - if(isnull(w_class)) - if(n < vsc.airflow_dense_pressure) return 0 //most non-item objs don't have a w_class yet - else - switch(w_class) - if(1,2) - if(n < vsc.airflow_lightest_pressure) return 0 - if(3) - if(n < vsc.airflow_light_pressure) return 0 - if(4,5) - if(n < vsc.airflow_medium_pressure) return 0 - if(6) - if(n < vsc.airflow_heavy_pressure) return 0 - if(7 to INFINITY) - if(n < vsc.airflow_dense_pressure) return 0 + return ..() + +/obj/item/check_airflow_movable(n) + switch(w_class) + if(1,2) + if(n < SSzas.settings.airflow_lightest_pressure) return 0 + if(3) + if(n < SSzas.settings.airflow_light_pressure) return 0 + if(4,5) + if(n < SSzas.settings.airflow_medium_pressure) return 0 + if(6) + if(n < SSzas.settings.airflow_heavy_pressure) return 0 + if(7 to INFINITY) + if(n < SSzas.settings.airflow_dense_pressure) return 0 return ..() @@ -80,8 +104,8 @@ obj/check_airflow_movable(n) return 0 if(buckled) return 0 - var/obj/item/shoes = get_equipped_item(slot_shoes) - if(istype(shoes) && (shoes.item_flags & ITEM_FLAG_NOSLIP)) + var/obj/item/clothing/shoes = get_item_by_slot(ITEM_SLOT_FEET) + if(istype(shoes) && (shoes.clothing_flags & NOSLIP)) return 0 return 1 @@ -98,52 +122,55 @@ obj/check_airflow_movable(n) airborne_acceleration = 0 . = ..() -atom/movable/proc/airflow_hit(atom/A) +/atom/movable/proc/airflow_hit(atom/A) airflow_speed = 0 airflow_dest = null airborne_acceleration = 0 -mob/airflow_hit(atom/A) +/mob/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) playsound(src.loc, "smash.ogg", 25, 1, -1) var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh - Weaken(weak_amt) . = ..() -obj/airflow_hit(atom/A) +/mob/living/airflow_hit(atom/A) + var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh + Knockdown(weak_amt) + return ..() + +/obj/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) playsound(src.loc, "smash.ogg", 25, 1, -1) . = ..() -obj/item/airflow_hit(atom/A) +/obj/item/airflow_hit(atom/A) airflow_speed = 0 airflow_dest = null -mob/living/carbon/human/airflow_hit(atom/A) -// for(var/mob/M in hearers(src)) -// M.show_message("<span class='danger'>[src] slams into [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) +/mob/living/carbon/human/airflow_hit(atom/A) + for(var/mob/M in hearers(src)) + M.show_message("<span class='danger'>[src] slams into [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) playsound(src.loc, "punch", 25, 1, -1) if (prob(33)) - loc:add_blood(src) - bloody_body(src) - var/b_loss = min(airflow_speed, (airborne_acceleration*2)) * vsc.airflow_damage + var/obj/effect/decal/cleanable/blood/new_splatter = new(loc) + + var/b_loss = min(airflow_speed, (airborne_acceleration*2)) * SSzas.settings.airflow_damage - apply_damage(b_loss/3, BRUTE, BP_HEAD, used_weapon = "Airflow") + apply_damage(b_loss/3, BRUTE, BODY_ZONE_HEAD) - apply_damage(b_loss/3, BRUTE, BP_CHEST, used_weapon = "Airflow") + apply_damage(b_loss/3, BRUTE, BODY_ZONE_CHEST) - apply_damage(b_loss/3, BRUTE, BP_GROIN, used_weapon = "Airflow") if(airflow_speed > 10) - Paralyse(round(airflow_speed * vsc.airflow_stun)) - Stun(paralysis + 3) + Paralyze(round(airflow_speed * SSzas.settings.airflow_stun)) + Stun(round(airflow_speed * SSzas.settings.airflow_stun) + 3) else - Stun(round(airflow_speed * vsc.airflow_stun/2)) - . = ..() + Stun(round(airflow_speed * SSzas.settings.airflow_stun/2)) + return ..() -zone/proc/movables() +/zone/proc/movables() . = list() for(var/turf/T in contents) for(var/atom/movable/A in T) diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index fdf263052e7..1f4b9cf7beb 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -1,36 +1,21 @@ - -/atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) - //Purpose: Determines if the object (or airflow) can pass this atom. - //Called by: Movement, airflow. - //Inputs: The moving atom (optional), target turf, "height" and air group - //Outputs: Boolean if can pass. - - return (!density || !height || air_group) - /turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) - if(!target) return 0 + if(target.blocks_air||blocks_air) + return 0 - if(istype(mover)) // turf/Enter(...) will perform more advanced checks - return !density - - else // Now, doing more detailed checks for air movement and air group formation - if(target.blocks_air||blocks_air) + for(var/obj/obstacle in src) + if(!obstacle.CanPass(mover, target, height, air_group)) return 0 - - for(var/obj/obstacle in src) - if(!obstacle.CanPass(mover, target, height, air_group)) + if(target != src) + for(var/obj/obstacle in target) + if(!obstacle.CanPass(mover, src, height, air_group)) return 0 - if(target != src) - for(var/obj/obstacle in target) - if(!obstacle.CanPass(mover, src, height, air_group)) - return 0 - return 1 + return ..() //Convenience function for atoms to update turfs they occupy /atom/movable/proc/update_nearby_tiles(need_rebuild) for(var/turf/simulated/turf in locs) - SSair.mark_for_update(turf) + SSzas.mark_for_update(turf) return 1 @@ -40,14 +25,14 @@ // AIR_BLOCKED - Blocked // ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. // BLOCKED - Blocked, zone boundaries will not cross even if opened. -atom/proc/c_airblock(turf/other) +/atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) // This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. -turf/c_airblock(turf/other) +/turf/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif @@ -55,5 +40,12 @@ turf/c_airblock(turf/other) . = 0 ATMOS_CANPASS_TURF(., src, other) -/atom/movable - var/atmos_canpass = CANPASS_ALWAYS +/atom/proc/zas_mark_update() + var/turf/local_turf = get_turf(loc) + if(!local_turf) + return + SSzas.mark_for_update(local_turf) + +/atom + var/simulated = TRUE + var/can_atmos_pass = ATMOS_PASS_YES diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 17c8ea16281..c7f33a0aaaf 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -5,7 +5,7 @@ /* Overview: - Connections are made between turfs by SSair.connect(). They represent a single point where two zones converge. + Connections are made between turfs by SSzas.connect(). They represent a single point where two zones converge. Class Vars: A - Always a simulated turf. @@ -60,19 +60,19 @@ Class Procs: /connection/New(turf/simulated/A, turf/simulated/B) #ifdef ZASDBG - ASSERT(SSair.has_valid_zone(A)) - //ASSERT(SSair.has_valid_zone(B)) + ASSERT(SSzas.has_valid_zone(A)) + //ASSERT(SSzas.has_valid_zone(B)) #endif src.A = A src.B = B zoneA = A.zone if(!istype(B)) mark_space() - edge = SSair.get_edge(A.zone,B) + edge = SSzas.get_edge(A.zone,B) edge.add_connection(src) else zoneB = B.zone - edge = SSair.get_edge(A.zone,B.zone) + edge = SSzas.get_edge(A.zone,B.zone) edge.add_connection(src) /connection/proc/mark_direct() @@ -108,7 +108,7 @@ Class Procs: erase() return - var/block_status = SSair.air_blocked(A,B) + var/block_status = SSzas.air_blocked(A,B) if(block_status & AIR_BLOCKED) // log_debug("Blocked connection.") erase() @@ -133,7 +133,7 @@ Class Procs: return else edge.remove_connection(src) - edge = SSair.get_edge(A.zone, B) + edge = SSzas.get_edge(A.zone, B) edge.add_connection(src) zoneA = A.zone @@ -155,7 +155,7 @@ Class Procs: // log_debug("Zones changed, \...") if(A.zone && B.zone) edge.remove_connection(src) - edge = SSair.get_edge(A.zone, B.zone) + edge = SSzas.get_edge(A.zone, B.zone) edge.add_connection(src) zoneA = A.zone zoneB = B.zone @@ -165,4 +165,4 @@ Class Procs: return -// log_debug("valid.") \ No newline at end of file +// log_debug("valid.") diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 17249aae155..caafd283649 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -2,7 +2,7 @@ Overview: These are what handle gas transfers between zones and into space. - They are found in a zone's edges list and in SSair.edges. + They are found in a zone's edges list and in SSzas.edges. Each edge updates every air tick due to their role in gas transfer. They come in two flavors, /connection_edge/zone and /connection_edge/unsimulated. As the type names might suggest, they handle inter-zone and spacelike connections respectively. @@ -49,7 +49,7 @@ Class Procs: flow(list/movable, differential, repelled) Airflow proc causing all objects in movable to be checked against a pressure differential. If repelled is true, the objects move away from any turf in connecting_turfs, otherwise they approach. - A check against vsc.lightest_airflow_pressure should generally be performed before calling this. + A check against SSzas.settings.lightest_airflow_pressure should generally be performed before calling this. get_connected_zone(zone/from) Helper proc that allows getting the other zone of an edge given one of them. @@ -86,7 +86,7 @@ Class Procs: /connection_edge/proc/contains_zone(zone/Z) /connection_edge/proc/erase() - SSair.remove_edge(src) + SSzas.remove_edge(src) // log_debug("[type] Erased.") @@ -99,11 +99,11 @@ Class Procs: var/atom/movable/M = movable[i] //If they're already being tossed, don't do it again. - if(M.last_airflow > world.time - vsc.airflow_delay) continue + if(M.last_airflow > world.time - SSzas.settings.airflow_delay) continue if(M.airflow_speed) continue //Check for knocking people over - if(ismob(M) && differential > vsc.airflow_stun_pressure) + if(ismob(M) && differential > SSzas.settings.airflow_stun_pressure) if(M:status_flags & GODMODE) continue M:airflow_stun() @@ -158,7 +158,7 @@ Class Procs: var/equiv = A.air.share_ratio(B.air, coefficient) var/differential = A.air.return_pressure() - B.air.return_pressure() - if(abs(differential) >= vsc.airflow_lightest_pressure) + if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) var/list/attracted var/list/repelled if(differential > 0) @@ -174,19 +174,19 @@ Class Procs: if(equiv) if(direct) erase() - SSair.merge(A, B) + SSzas.merge(A, B) return else A.air.equalize(B.air) - SSair.mark_edge_sleeping(src) + SSzas.mark_edge_sleeping(src) - SSair.mark_zone_update(A) - SSair.mark_zone_update(B) + SSzas.mark_zone_update(A) + SSzas.mark_zone_update(B) /connection_edge/zone/recheck() if(!A.air.compare(B.air, vacuum_exception = 1)) // Edges with only one side being vacuum need processing no matter how close. - SSair.mark_edge_active(src) + SSzas.mark_edge_active(src) //Helper proc to get connections for a zone. /connection_edge/zone/proc/get_connected_zone(zone/from) @@ -230,24 +230,24 @@ Class Procs: var/equiv = A.air.share_space(air) var/differential = A.air.return_pressure() - air.return_pressure() - if(abs(differential) >= vsc.airflow_lightest_pressure) + if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) var/list/attracted = A.movables() flow(attracted, abs(differential), differential < 0) if(equiv) A.air.copy_from(air) - SSair.mark_edge_sleeping(src) + SSzas.mark_edge_sleeping(src) - SSair.mark_zone_update(A) + SSzas.mark_zone_update(A) /connection_edge/unsimulated/recheck() // Edges with only one side being vacuum need processing no matter how close. // Note: This handles the glaring flaw of a room holding pressure while exposed to space, but // does not specially handle the less common case of a simulated room exposed to an unsimulated pressurized turf. if(!A.air.compare(air, vacuum_exception = 1)) - SSair.mark_edge_active(src) + SSzas.mark_edge_active(src) -proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) +/proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 var/maximum_energy_delta = max(0, min(A.temperature * A.heat_capacity() * A.group_multiplier, B.temperature * B.heat_capacity() * B.group_multiplier)) diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index 6f0a67fd3eb..0022e12c3ed 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -16,5 +16,5 @@ var/image/mark = image('icons/Testing/Zone.dmi', icon_state = "mark") overlays += img dbg_img = img -proc/soft_assert(thing,fail) - if(!thing) message_admins(fail) \ No newline at end of file +/proc/soft_assert(thing,fail) + if(!thing) message_admins(fail) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 4433dfefdd8..40e89108b7d 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -1,4 +1,4 @@ -client/proc/Zone_Info(turf/T as null|turf) +/client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" if(T) if(istype(T,/turf/simulated) && T:zone) @@ -15,9 +15,9 @@ client/proc/Zone_Info(turf/T as null|turf) images -= zone_debug_images[zone] zone_debug_images = null -client/var/list/zone_debug_images +/client/var/list/zone_debug_images -client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) +/client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) set category = "Debug" if(!istype(T)) return @@ -76,7 +76,9 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) else to_chat(mob, "both turfs can merge.") -client/proc/ZASSettings() +/* +/client/proc/ZASSettings() set category = "Debug" - vsc.SetDefault(mob) + SSzas.settings.SetDefault(mob) +*/ diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 477714c2c76..5f539ba0d12 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -11,7 +11,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/var/obj/fire/fire = null //Some legacy definitions so fires can be started. -atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return null /atom/movable/proc/is_burnable() @@ -20,7 +20,7 @@ atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed /mob/is_burnable() return simulated -turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) +/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) /turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) @@ -42,7 +42,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return igniting /zone/proc/process_fire() - var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len) + var/datum/gas_mixture/burn_gas = air.remove_ratio(SSzas.settings.fire_consuption_rate, fire_tiles.len) var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) @@ -64,7 +64,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) fuel_objs.Cut() if(!fire_tiles.len) - SSair.active_fire_zones.Remove(src) + SSzas.active_fire_zones.Remove(src) /zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0) if(!fuel_objs.len) @@ -105,7 +105,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return 1 fire = new(src, fl) - SSair.active_fire_zones |= zone + SSzas.active_fire_zones |= zone var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src zone.fire_tiles |= src @@ -158,7 +158,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) A.fire_act(air_contents, air_contents.temperature, air_contents.volume) //spread - for(var/direction in GLOB.cardinal) + for(var/direction in GLOB.cardinals) var/turf/simulated/enemy_tile = get_step(my_tile, direction) if(istype(enemy_tile)) @@ -179,7 +179,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) continue //Spread the fire. - if(prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && my_tile.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, my_tile, 0,0)) + if(prob( 50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier) ) && my_tile.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, my_tile, 0,0)) enemy_tile.create_fire(firelevel) else @@ -195,17 +195,17 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) qdel(src) return - set_dir(pick(GLOB.cardinal)) + setDir(pick(GLOB.cardinal)) var/datum/gas_mixture/air_contents = loc.return_air() color = fire_color(air_contents.temperature) set_light(0.5, 1, 3, l_color = color) firelevel = fl - SSair.active_hotspots.Add(src) + SSzas.active_hotspots.Add(src) /obj/fire/proc/fire_color(var/env_temperature) - var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature) + var/temperature = max(4000*sqrt(firelevel/SSzas.settings.fire_firelevel_multiplier), env_temperature) return heat2color(temperature) /obj/fire/Destroy() @@ -213,7 +213,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) if (istype(T)) set_light(0) T.fire = null - SSair.active_hotspots.Remove(src) + SSzas.active_hotspots.Remove(src) . = ..() /turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. @@ -238,9 +238,9 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) //*** Get the fuel and oxidizer amounts for(var/g in gas) - if(gas_data.flags[g] & XGM_GAS_FUEL) + if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL) gas_fuel += gas[g] - if(gas_data.flags[g] & XGM_GAS_OXIDIZER) + if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER) total_oxidizers += gas[g] gas_fuel *= group_multiplier total_oxidizers *= group_multiplier @@ -266,12 +266,12 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) - var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / vsc.fire_firelevel_multiplier + var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / SSzas.settings.fire_firelevel_multiplier var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast var/gas_reaction_progress = min(max(min_burn, gas_firelevel*gas_fuel)*FIRE_GAS_BURNRATE_MULT, gas_fuel) //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area. - var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / vsc.fire_firelevel_multiplier + var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / SSzas.settings.fire_firelevel_multiplier var/liquid_reaction_progress = min((liquid_firelevel*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT, liquid_fuel) var/firelevel = (gas_fuel*gas_firelevel + liquid_fuel*liquid_firelevel)/total_fuel @@ -306,13 +306,13 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) var/datum/gas_mixture/burned_fuel = remove_by_flag(XGM_GAS_FUEL, used_gas_fuel) for(var/g in burned_fuel.gas) - adjust_gas(gas_data.burn_product[g], burned_fuel.gas[g]) + adjust_gas(SSzas.gas_data.burn_product[g], burned_fuel.gas[g]) if(zone) zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) //calculate the energy produced by the reaction and then set the new temperature of the mix - temperature = (starting_energy + vsc.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity() + temperature = (starting_energy + SSzas.settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity() update_values() #ifdef FIREDBG @@ -325,10 +325,10 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return firelevel -datum/gas_mixture/proc/check_recombustability(list/fuel_objs) +/datum/gas_mixture/proc/check_recombustability(list/fuel_objs) . = 0 for(var/g in gas) - if(gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) + if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) . = 1 break @@ -340,14 +340,14 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs) . = 0 for(var/g in gas) - if(gas_data.flags[g] & XGM_GAS_FUEL && gas[g] >= 0.1) + if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL && gas[g] >= 0.1) . = 1 break /datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid=null) . = 0 for(var/g in gas) - if(gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1) + if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) . = 1 break @@ -359,11 +359,11 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs) . = 0 for(var/g in gas) - if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1) + if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) . = 1 break -//returns a value between 0 and vsc.fire_firelevel_multiplier +//returns a value between 0 and SSzas.settings.fire_firelevel_multiplier /datum/gas_mixture/proc/calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, gas_volume) //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. var/firelevel = 0 @@ -388,13 +388,13 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs) #endif //toss everything together -- should produce a value between 0 and fire_firelevel_multiplier - firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * damping_multiplier + firelevel = SSzas.settings.fire_firelevel_multiplier * mix_multiplier * damping_multiplier return max( 0, firelevel) /mob/living/proc/FireBurn(var/firelevel, var/last_temperature, var/pressure) - var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + var/mx = 5 * firelevel/SSzas.settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) apply_damage(2.5*mx, BURN) return mx @@ -411,33 +411,27 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs) //Get heat transfer coefficients for clothing. - for(var/obj/item/clothing/C in src) - if(l_hand == C || r_hand == C) - continue - + for(var/obj/item/clothing/C in get_equipped_items()) if( C.max_heat_protection_temperature >= last_temperature ) if(C.body_parts_covered & HEAD) head_exposure = 0 - if(C.body_parts_covered & UPPER_TORSO) + if(C.body_parts_covered & CHEST) chest_exposure = 0 - if(C.body_parts_covered & LOWER_TORSO) - groin_exposure = 0 if(C.body_parts_covered & LEGS) legs_exposure = 0 if(C.body_parts_covered & ARMS) arms_exposure = 0 //minimize this for low-pressure environments - var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + var/mx = 5 * firelevel/SSzas.settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. - apply_damage(0.9*mx*head_exposure, BURN, BP_HEAD, used_weapon = "Fire") - apply_damage(2.5*mx*chest_exposure, BURN, BP_CHEST, used_weapon = "Fire") - apply_damage(2.0*mx*groin_exposure, BURN, BP_GROIN, used_weapon = "Fire") - apply_damage(0.6*mx*legs_exposure, BURN, BP_L_LEG, used_weapon = "Fire") - apply_damage(0.6*mx*legs_exposure, BURN, BP_R_LEG, used_weapon = "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, BP_L_ARM, used_weapon = "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, BP_R_ARM, used_weapon = "Fire") + apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD, used_weapon = "Fire") + apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST, used_weapon = "Fire") + apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG, used_weapon = "Fire") + apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG, used_weapon = "Fire") + apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM, used_weapon = "Fire") + apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_R_ARM, used_weapon = "Fire") //return a truthy value of whether burning actually happened return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index e9543deb18d..a12977966c0 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -1,6 +1,6 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contamination.dmi')) -/pl_control +/datum/pl_control var/plasma_dmg = 3 var/plasma_dmg_name = "Plasma Damage Amount" var/plasma_dmg_desc = "Self Descriptive" @@ -91,7 +91,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat //Burn skin if exposed. if(SSzas.settings.plc.skin_burns) if(!pl_head_protected() || !pl_suit_protected()) - burn_skin(0.75) + //burn_skin(0.75) if(prob(20)) to_chat(src, "<span class='danger'>Your skin burns!</span>") updatehealth() @@ -126,7 +126,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat //Checks if the head is adequately sealed. if(head) if(SSzas.settings.plc.plasmaguard_only) - if(head.item_flags & PLASMAGUARD) + if(head.obj_flags & PLASMAGUARD) return TRUE else if(is_eyes_covered()) return TRUE diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 7166223f43c..a1229d928c8 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -1,8 +1,12 @@ -/turf/simulated/var/zone/zone -/turf/simulated/var/open_directions +/turf/simulated + var/zone/zone + var/open_directions -/turf/var/needs_air_update = 0 -/turf/var/datum/gas_mixture/air +/turf + var/needs_air_update = 0 + var/datum/gas_mixture/air + var/list/initial_gas + var/heat_capacity = 1 /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) @@ -43,7 +47,7 @@ var/turf/simulated/sim = unsim if(TURF_HAS_VALID_ZONE(sim)) - SSair.connect(sim, src) + SSzas.connect(sim, src) // Helper for can_safely_remove_from_zone(). #define GET_ZONE_NEIGHBOURS(T, ret) \ @@ -199,7 +203,7 @@ if(verbose) log_debug("Connecting to [sim.zone]") #endif - SSair.connect(src, sim) + SSzas.connect(src, sim) #ifdef ZASDBG @@ -227,7 +231,7 @@ //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. for(var/turf/T in postponed) - SSair.connect(src, T) + SSzas.connect(src, T) /turf/proc/post_update_air_properties() if(connections) connections.update_all() @@ -270,7 +274,7 @@ /turf/simulated/return_air() if(zone) if(!zone.invalid) - SSair.mark_zone_update(zone) + SSzas.mark_zone_update(zone) return zone.air else if(!air) @@ -293,3 +297,27 @@ if(!air) air = new/datum/gas_mixture air.copy_from(zone.air) air.group_multiplier = 1 + +/turf/simulated/atmos_spawn_air(gas_id, amount, initial_temperature) + var/datum/gas_mixture/new_gas = new + var/datum/gas_mixture/existing_gas = return_air() + + new_gas.adjust_gas_temp(gas_id, amount, initial_temperature) + existing_gas.merge(new_gas) + +/proc/turf_contains_dense_objects(var/turf/T) + return T.contains_dense_objects() + +/turf/proc/contains_dense_objects() + if(density) + return 1 + for(var/atom/movable/A as anything in src) + if(A.density && !(A.atom_flags & ON_BORDER_1)) + return 1 + return 0 + +/turf/proc/TryGetNonDenseNeighbour() + for(var/d in GLOB.cardinals) + var/turf/T = get_step(src, d) + if (T && !turf_contains_dense_objects(T)) + return T diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index dc504b2f7dd..508cec715f6 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -74,8 +74,8 @@ SSzas.gas_data.condensation_points[gas.id] = gas.condensation_point SSzas.gas_data.condensation_products[gas.id] = gas.condensation_product - gas_data.breathed_product[gas.id] = gas.breathed_product - gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + SSzas.gas_data.breathed_product[gas.id] = gas.breathed_product + SSzas.gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex return 1 @@ -85,7 +85,7 @@ icon = 'icons/effects/tile_effects.dmi' icon_state = "generic" layer = FIRE_LAYER - appearance_flags = DEFAULT_APPEARANCE_FLAGS | RESET_COLOR + appearance_flags = RESET_COLOR|PIXEL_SCALE|TILE_BOUND mouse_opacity = 0 var/gas_id diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm new file mode 100644 index 00000000000..af3a25a5f84 --- /dev/null +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -0,0 +1,241 @@ +/datum/xgm_gas/oxygen + id = GAS_OXYGEN + name = "Oxygen" + specific_heat = 20 // J/(mol*K) + molar_mass = 0.032 // kg/mol + flags = XGM_GAS_OXIDIZER | XGM_GAS_FUSION_FUEL + breathed_product = /datum/reagent/oxygen + symbol_html = "O<sub>2</sub>" + symbol = "O2" + + +/datum/xgm_gas/nitrogen + id = GAS_NITROGEN + name = "Nitrogen" + specific_heat = 20 // J/(mol*K) + molar_mass = 0.028 // kg/mol + symbol_html = "N<sub>2</sub>" + symbol = "N2" + +/datum/xgm_gas/carbon_dioxide + id = GAS_CO2 + name = "Carbon Dioxide" + specific_heat = 30 // J/(mol*K) + molar_mass = 0.044 // kg/mol + symbol_html = "CO<sub>2</sub>" + symbol = "CO2" + +/datum/xgm_gas/methyl_bromide + id = GAS_METHYL_BROMIDE + name = "Methyl Bromide" + specific_heat = 42.59 // J/(mol*K) + molar_mass = 0.095 // kg/mol + breathed_product = /datum/reagent/toxin/methyl_bromide + symbol_html = "CH<sub>3</sub>Br" + symbol = "CH3Br" + +/datum/xgm_gas/phoron + id = GAS_PLASMA + name = "Phoron" + + //Note that this has a significant impact on TTV yield. + //Because it is so high, any leftover phoron soaks up a lot of heat and drops the yield pressure. + specific_heat = 200 // J/(mol*K) + + //Hypothetical group 14 (same as carbon), period 8 element. + //Using multiplicity rule, it's atomic number is 162 + //and following a N/Z ratio of 1.5, the molar mass of a monatomic gas is: + molar_mass = 0.405 // kg/mol + + tile_color = "#ff9940" + overlay_limit = 0.7 + flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL + breathed_product = /datum/reagent/toxin/phoron + symbol_html = "Ph" + symbol = "Ph" + +/datum/xgm_gas/sleeping_agent + id = GAS_N2O + name = "Nitrous Oxide" + specific_heat = 40 // J/(mol*K) + molar_mass = 0.044 // kg/mol. N2O + flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer + breathed_product = /datum/reagent/nitrous_oxide + symbol_html = "N<sub>2</sub>O" + symbol = "N2O" + +/datum/xgm_gas/methane + id = GAS_METHANE + name = "Methane" + specific_heat = 30 // J/(mol*K) + molar_mass = 0.016 // kg/mol + flags = XGM_GAS_FUEL + symbol_html = "CH<sub>4</sub>" + symbol = "CH4" + +/datum/xgm_gas/alium + id = GAS_ALIEN + name = "Aliether" + hidden_from_codex = TRUE + symbol_html = "X" + symbol = "X" + +/datum/xgm_gas/alium/New() + var/num = rand(100,999) + name = "Compound #[num]" + specific_heat = rand(1, 400) // J/(mol*K) + molar_mass = rand(20,800)/1000 // kg/mol + if(prob(40)) + flags |= XGM_GAS_FUEL + else if(prob(40)) //it's prooobably a bad idea for gas being oxidizer to itself. + flags |= XGM_GAS_OXIDIZER + if(prob(40)) + flags |= XGM_GAS_CONTAMINANT + if(prob(40)) + flags |= XGM_GAS_FUSION_FUEL + + symbol_html = "X<sup>[num]</sup>" + symbol = "X-[num]" + if(prob(50)) + tile_color = RANDOM_RGB + overlay_limit = 0.5 + +/datum/xgm_gas/hydrogen + id = GAS_HYDROGEN + name = "Hydrogen" + specific_heat = 100 // J/(mol*K) + molar_mass = 0.002 // kg/mol + flags = XGM_GAS_FUEL|XGM_GAS_FUSION_FUEL + burn_product = GAS_STEAM + symbol_html = "H<sub>2</sub>" + symbol = "H2" + +/datum/xgm_gas/hydrogen/deuterium + id = GAS_DEUTERIUM + name = "Deuterium" + symbol_html = "D" + symbol = "D" + +/datum/xgm_gas/hydrogen/tritium + id = GAS_TRITIUM + name = "Tritium" + symbol_html = "T" + symbol = "T" + +/datum/xgm_gas/helium + id = GAS_HELIUM + name = "Helium" + specific_heat = 80 // J/(mol*K) + molar_mass = 0.004 // kg/mol + flags = XGM_GAS_FUSION_FUEL + breathed_product = /datum/reagent/helium + symbol_html = "He" + symbol = "He" + +/datum/xgm_gas/argon + id = GAS_ARGON + name = "Argon" + specific_heat = 10 // J/(mol*K) + molar_mass = 0.018 // kg/mol + symbol_html = "Ar" + symbol = "Ar" + +// If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. +/datum/xgm_gas/krypton + id = GAS_KRYPTON + name = "Krypton" + specific_heat = 5 // J/(mol*K) + molar_mass = 0.036 // kg/mol + symbol_html = "Kr" + symbol = "Kr" + +/datum/xgm_gas/neon + id = GAS_NEON + name = "Neon" + specific_heat = 20 // J/(mol*K) + molar_mass = 0.01 // kg/mol + symbol_html = "Ne" + symbol = "Ne" + +/datum/xgm_gas/xenon + id = GAS_XENON + name = "Xenon" + specific_heat = 3 // J/(mol*K) + molar_mass = 0.054 // kg/mol + breathed_product = /datum/reagent/nitrous_oxide/xenon + symbol_html = "Xe" + symbol = "Xe" + +/datum/xgm_gas/nitrodioxide + id = GAS_NO2 + name = "Nitrogen Dioxide" + tile_color = "#ca6409" + specific_heat = 37 // J/(mol*K) + molar_mass = 0.054 // kg/mol + flags = XGM_GAS_OXIDIZER + breathed_product = /datum/reagent/toxin + symbol_html = "NO<sub>2</sub>" + symbol = "NO2" + +/datum/xgm_gas/nitricoxide + id = GAS_NO + name = "Nitric Oxide" + + specific_heat = 10 // J/(mol*K) + molar_mass = 0.030 // kg/mol + flags = XGM_GAS_OXIDIZER + symbol_html = "NO" + symbol = "NO" + +/datum/xgm_gas/chlorine + id = GAS_CHLORINE + name = "Chlorine" + tile_color = "#c5f72d" + overlay_limit = 0.5 + specific_heat = 5 // J/(mol*K) + molar_mass = 0.017 // kg/mol + flags = XGM_GAS_CONTAMINANT + breathed_product = /datum/reagent/toxin/chlorine + symbol_html = "Cl" + symbol = "Cl" + +/datum/xgm_gas/vapor + id = GAS_STEAM + name = "Steam" + tile_overlay = "generic" + overlay_limit = 0.5 + specific_heat = 30 // J/(mol*K) + molar_mass = 0.020 // kg/mol + breathed_product = /datum/reagent/water + condensation_product = /datum/reagent/water + condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. + symbol_html = "H<sub>2</sub>O" + symbol = "H2O" + +/datum/xgm_gas/sulfurdioxide + id = GAS_SULFUR + name = "Sulfur Dioxide" + + specific_heat = 30 // J/(mol*K) + molar_mass = 0.044 // kg/mol + symbol_html = "SO<sub>2</sub>" + symbol = "SO2" + +/datum/xgm_gas/ammonia + id = GAS_AMMONIA + name = "Ammonia" + + specific_heat = 20 // J/(mol*K) + molar_mass = 0.017 // kg/mol + breathed_product = /datum/reagent/ammonia + symbol_html = "NH<sub>3</sub>" + symbol = "NH3" + +/datum/xgm_gas/carbon_monoxide + id = GAS_CO + name = "Carbon Monoxide" + specific_heat = 30 // J/(mol*K) + molar_mass = 0.028 // kg/mol + breathed_product = /datum/reagent/carbon_monoxide + symbol_html = "CO" + symbol = "CO" diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm new file mode 100644 index 00000000000..331194c445c --- /dev/null +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -0,0 +1,553 @@ +/datum/gas_mixture + //Associative list of gas moles. + //Gases with 0 moles are not tracked and are pruned by update_values() + var/list/gas = list() + //Temperature in Kelvin of this gas mix. + var/temperature = 0 + + //Sum of all the gas moles in this mix. Updated by update_values() + var/total_moles = 0 + //Volume of this mix. + var/volume = CELL_VOLUME + //Size of the group this gas_mixture is representing. 1 for singletons. + var/group_multiplier = 1 + + //List of active tile overlays for this gas_mixture. Updated by check_tile_graphic() + var/list/graphic = list() + //Cache of gas overlay objects + var/list/tile_overlay_cache + +/datum/gas_mixture/New(_volume = CELL_VOLUME, _temperature = 0, _group_multiplier = 1) + volume = _volume + temperature = _temperature + group_multiplier = _group_multiplier + +/datum/gas_mixture/proc/get_gas(gasid) + if(!gas.len) + return 0 //if the list is empty BYOND treats it as a non-associative list, which runtimes + return gas[gasid] * group_multiplier + +/datum/gas_mixture/proc/get_total_moles() + return total_moles * group_multiplier + +//Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. +/datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) + if(moles == 0) + return + + if (group_multiplier != 1) + gas[gasid] += moles/group_multiplier + else + gas[gasid] += moles + + if(update) + update_values() + + +//Same as adjust_gas(), but takes a temperature which is mixed in with the gas. +/datum/gas_mixture/proc/adjust_gas_temp(gasid, moles, temp, update = 1) + if(moles == 0) + return + + if(moles > 0 && abs(temperature - temp) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = SSzas.gas_data.specific_heat[gasid] * moles + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity != 0) + temperature = (temp * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + + if (group_multiplier != 1) + gas[gasid] += moles/group_multiplier + else + gas[gasid] += moles + + if(update) + update_values() + + +//Variadic version of adjust_gas(). Takes any number of gas and mole pairs and applies them. +/datum/gas_mixture/proc/adjust_multi() + ASSERT(!(args.len % 2)) + + for(var/i = 1; i < args.len; i += 2) + adjust_gas(args[i], args[i+1], update = 0) + + update_values() + + +//Variadic version of adjust_gas_temp(). Takes any number of gas, mole and temperature associations and applies them. +/datum/gas_mixture/proc/adjust_multi_temp() + ASSERT(!(args.len % 3)) + + for(var/i = 1; i < args.len; i += 3) + adjust_gas_temp(args[i], args[i + 1], args[i + 2], update = 0) + + update_values() + + +//Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly. +//Does not modify giver in any way. +/datum/gas_mixture/proc/merge(const/datum/gas_mixture/giver) + if(!giver) + return + + if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = giver.heat_capacity() + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity != 0) + temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity + + if((group_multiplier != 1)||(giver.group_multiplier != 1)) + for(var/g in giver.gas) + gas[g] += giver.gas[g] * giver.group_multiplier / group_multiplier + else + for(var/g in giver.gas) + gas[g] += giver.gas[g] + + update_values() + +// Used to equalize the mixture between two zones before sleeping an edge. +/datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) + var/our_heatcap = heat_capacity() + var/share_heatcap = sharer.heat_capacity() + + // Special exception: there isn't enough air around to be worth processing this edge next tick, zap both to zero. + if(total_moles + sharer.total_moles <= MINIMUM_AIR_TO_SUSPEND) + gas.Cut() + sharer.gas.Cut() + + for(var/g in gas|sharer.gas) + var/comb = gas[g] + sharer.gas[g] + comb /= volume + sharer.volume + gas[g] = comb * volume + sharer.gas[g] = comb * sharer.volume + + if(our_heatcap + share_heatcap) + temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) + sharer.temperature = temperature + + update_values() + sharer.update_values() + + return 1 + + +//Returns the heat capacity of the gas mix based on the specific heat of the gases. +/datum/gas_mixture/proc/heat_capacity() + . = 0 + for(var/g in gas) + . += SSzas.gas_data.specific_heat[g] * gas[g] + . *= group_multiplier + + +//Adds or removes thermal energy. Returns the actual thermal energy change, as in the case of removing energy we can't go below TCMB. +/datum/gas_mixture/proc/add_thermal_energy(var/thermal_energy) + + if (total_moles == 0) + return 0 + + var/heat_capacity = heat_capacity() + if (thermal_energy < 0) + if (temperature < TCMB) + return 0 + var/thermal_energy_limit = -(temperature - TCMB)*heat_capacity //ensure temperature does not go below TCMB + thermal_energy = max( thermal_energy, thermal_energy_limit ) //thermal_energy and thermal_energy_limit are negative here. + temperature += thermal_energy/heat_capacity + return thermal_energy + +//Returns the thermal energy change required to get to a new temperature +/datum/gas_mixture/proc/get_thermal_energy_change(var/new_temperature) + return heat_capacity()*(max(new_temperature, 0) - temperature) + + +//Technically vacuum doesn't have a specific entropy. Just use a really big number (infinity would be ideal) here so that it's easy to add gas to vacuum and hard to take gas out. +#define SPECIFIC_ENTROPY_VACUUM 150000 + + +//Returns the ideal gas specific entropy of the whole mix. This is the entropy per mole of /mixed/ gas. +/datum/gas_mixture/proc/specific_entropy() + if (!gas.len || total_moles == 0) + return SPECIFIC_ENTROPY_VACUUM + + . = 0 + for(var/g in gas) + . += gas[g] * specific_entropy_gas(g) + . /= total_moles + + +/* + It's arguable whether this should even be called entropy anymore. It's more "based on" entropy than actually entropy now. + + Returns the ideal gas specific entropy of a specific gas in the mix. This is the entropy due to that gas per mole of /that/ gas in the mixture, not the entropy due to that gas per mole of gas mixture. + + For the purposes of SS13, the specific entropy is just a number that tells you how hard it is to move gas. You can replace this with whatever you want. + Just remember that returning a SMALL number == adding gas to this gas mix is HARD, taking gas away is EASY, and that returning a LARGE number means the opposite (so a vacuum should approach infinity). + + So returning a constant/(partial pressure) would probably do what most players expect. Although the version I have implemented below is a bit more nuanced than simply 1/P in that it scales in a way + which is bit more realistic (natural log), and returns a fairly accurate entropy around room temperatures and pressures. +*/ +/datum/gas_mixture/proc/specific_entropy_gas(var/gasid) + if (!(gasid in gas) || gas[gasid] == 0) + return SPECIFIC_ENTROPY_VACUUM //that gas isn't here + + //group_multiplier gets divided out in volume/gas[gasid] - also, V/(m*T) = R/(partial pressure) + var/molar_mass = SSzas.gas_data.molar_mass[gasid] + var/specific_heat = SSzas.gas_data.specific_heat[gasid] + var/safe_temp = max(temperature, TCMB) // We're about to divide by this. + return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) + + //alternative, simpler equation + //var/partial_pressure = gas[gasid] * R_IDEAL_GAS_EQUATION * temperature / volume + //return R_IDEAL_GAS_EQUATION * ( log (1 + IDEAL_GAS_ENTROPY_CONSTANT/partial_pressure) + 20 ) + + +//Updates the total_moles count and trims any empty gases. +/datum/gas_mixture/proc/update_values() + total_moles = 0 + for(var/g in gas) + if(gas[g] <= 0) + gas -= g + else + total_moles += gas[g] + + +//Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since update_values() has been called. +/datum/gas_mixture/proc/return_pressure() + if(volume) + return total_moles * R_IDEAL_GAS_EQUATION * temperature / volume + return 0 + + +//Removes moles from the gas mixture and returns a gas_mixture containing the removed air. +/datum/gas_mixture/proc/remove(amount) + amount = min(amount, total_moles * group_multiplier) //Can not take more air than the gas mixture has! + if(amount <= 0) + return null + + var/datum/gas_mixture/removed = new + + for(var/g in gas) + removed.gas[g] = QUANTIZE((gas[g] / total_moles) * amount) + gas[g] -= removed.gas[g] / group_multiplier + + removed.temperature = temperature + update_values() + removed.update_values() + + return removed + + +//Removes a ratio of gas from the mixture and returns a gas_mixture containing the removed air. +/datum/gas_mixture/proc/remove_ratio(ratio, out_group_multiplier = 1) + if(ratio <= 0) + return null + out_group_multiplier = clamp(out_group_multiplier, 1, group_multiplier) + + ratio = min(ratio, 1) + + var/datum/gas_mixture/removed = new + removed.group_multiplier = out_group_multiplier + + for(var/g in gas) + removed.gas[g] = (gas[g] * ratio * group_multiplier / out_group_multiplier) + gas[g] = gas[g] * (1 - ratio) + + removed.temperature = temperature + removed.volume = volume * group_multiplier / out_group_multiplier + update_values() + removed.update_values() + + return removed + +//Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume +/datum/gas_mixture/proc/remove_volume(removed_volume) + var/datum/gas_mixture/removed = remove_ratio(removed_volume/(volume*group_multiplier), 1) + removed.volume = removed_volume + return removed + +//Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. +/datum/gas_mixture/proc/remove_by_flag(flag, amount) + var/datum/gas_mixture/removed = new + + if(!flag || amount <= 0) + return removed + + var/sum = 0 + for(var/g in gas) + if(SSzas.gas_data.flags[g] & flag) + sum += gas[g] + + for(var/g in gas) + if(SSzas.gas_data.flags[g] & flag) + removed.gas[g] = QUANTIZE((gas[g] / sum) * amount) + gas[g] -= removed.gas[g] / group_multiplier + + removed.temperature = temperature + update_values() + removed.update_values() + + return removed + +//Returns the amount of gas that has the given flag, in moles +/datum/gas_mixture/proc/get_by_flag(flag) + . = 0 + for(var/g in gas) + if(SSzas.gas_data.flags[g] & flag) + . += gas[g] + +//Copies gas and temperature from another gas_mixture. +/datum/gas_mixture/proc/copy_from(const/datum/gas_mixture/sample) + gas = sample.gas.Copy() + temperature = sample.temperature + + update_values() + + return 1 + + +//Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. +/datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample, var/vacuum_exception = 0) + if(!sample) return 0 + + if(vacuum_exception) + // Special case - If one of the two is zero pressure, the other must also be zero. + // This prevents suspending processing when an air-filled room is next to a vacuum, + // an edge case which is particually obviously wrong to players + if(total_moles == 0 && sample.total_moles != 0 || sample.total_moles == 0 && total_moles != 0) + return 0 + + var/list/marked = list() + for(var/g in gas) + if((abs(gas[g] - sample.gas[g]) > MINIMUM_AIR_TO_SUSPEND) && \ + ((gas[g] < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.gas[g]) || \ + (gas[g] > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.gas[g]))) + return 0 + marked[g] = 1 + + if(abs(return_pressure() - sample.return_pressure()) > MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND) + return 0 + + for(var/g in sample.gas) + if(!marked[g]) + if((abs(gas[g] - sample.gas[g]) > MINIMUM_AIR_TO_SUSPEND) && \ + ((gas[g] < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.gas[g]) || \ + (gas[g] > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.gas[g]))) + return 0 + + if(total_moles > MINIMUM_AIR_TO_SUSPEND) + if((abs(temperature - sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ + ((temperature < (1 - MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || \ + (temperature > (1 + MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) + return 0 + + return 1 + +//Rechecks the gas_mixture and adjusts the graphic list if needed. +//Two lists can be passed by reference if you need know specifically which graphics were added and removed. +/datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) + for(var/obj/effect/gas_overlay/O in graphic) + if(gas[O.gas_id] <= SSzas.gas_data.overlay_limit[O.gas_id]) + LAZYADD(graphic_remove, O) + for(var/g in SSzas.gas_data.overlay_limit) + //Overlay isn't applied for this gas, check if it's valid and needs to be added. + if(gas[g] > SSzas.gas_data.overlay_limit[g]) + var/tile_overlay = get_tile_overlay(g) + if(!(tile_overlay in graphic)) + LAZYADD(graphic_add, tile_overlay) + . = 0 + //Apply changes + if(graphic_add && graphic_add.len) + graphic |= graphic_add + . = 1 + if(graphic_remove && graphic_remove.len) + graphic -= graphic_remove + . = 1 + if(graphic.len) + var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) + for(var/obj/effect/gas_overlay/O in graphic) + var/concentration_mod = clamp(gas[O.gas_id] / total_moles, 0.1, 1) + var/new_alpha = min(230, round(pressure_mod * concentration_mod * 180, 5)) + if(new_alpha != O.alpha) + O.update_alpha_animation(new_alpha) + +/datum/gas_mixture/proc/get_tile_overlay(gas_id) + if(!LAZYACCESS(tile_overlay_cache, gas_id)) + LAZYSET(tile_overlay_cache, gas_id, new/obj/effect/gas_overlay(null, gas_id)) + return tile_overlay_cache[gas_id] + +//Simpler version of merge(), adjusts gas amounts directly and doesn't account for temperature or group_multiplier. +/datum/gas_mixture/proc/add(datum/gas_mixture/right_side) + for(var/g in right_side.gas) + gas[g] += right_side.gas[g] + + update_values() + return 1 + + +//Simpler version of remove(), adjusts gas amounts directly and doesn't account for group_multiplier. +/datum/gas_mixture/proc/subtract(datum/gas_mixture/right_side) + for(var/g in right_side.gas) + gas[g] -= right_side.gas[g] + + update_values() + return 1 + + +//Multiply all gas amounts by a factor. +/datum/gas_mixture/proc/multiply(factor) + for(var/g in gas) + gas[g] *= factor + + update_values() + return 1 + + +//Divide all gas amounts by a factor. +/datum/gas_mixture/proc/divide(factor) + for(var/g in gas) + gas[g] /= factor + + update_values() + return 1 + + +//Shares gas with another gas_mixture based on the amount of connecting tiles and a fixed lookup table. +/datum/gas_mixture/proc/share_ratio(datum/gas_mixture/other, connecting_tiles, share_size = null, one_way = 0) + var/static/list/sharing_lookup_table = list(0.30, 0.40, 0.48, 0.54, 0.60, 0.66) + //Shares a specific ratio of gas between mixtures using simple weighted averages. + var/ratio = sharing_lookup_table[6] + + var/size = max(1, group_multiplier) + if(isnull(share_size)) share_size = max(1, other.group_multiplier) + + var/full_heat_capacity = heat_capacity() + var/s_full_heat_capacity = other.heat_capacity() + + var/list/avg_gas = list() + + for(var/g in gas) + avg_gas[g] += gas[g] * size + + for(var/g in other.gas) + avg_gas[g] += other.gas[g] * share_size + + for(var/g in avg_gas) + avg_gas[g] /= (size + share_size) + + var/temp_avg = 0 + if(full_heat_capacity + s_full_heat_capacity) + temp_avg = (temperature * full_heat_capacity + other.temperature * s_full_heat_capacity) / (full_heat_capacity + s_full_heat_capacity) + + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD. + if(sharing_lookup_table.len >= connecting_tiles) //6 or more interconnecting tiles will max at 42% of air moved per tick. + ratio = sharing_lookup_table[connecting_tiles] + //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD + + for(var/g in avg_gas) + gas[g] = max(0, (gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g]) + if(!one_way) + other.gas[g] = max(0, (other.gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g]) + + temperature = max(0, (temperature - temp_avg) * (1-ratio) + temp_avg) + if(!one_way) + other.temperature = max(0, (other.temperature - temp_avg) * (1-ratio) + temp_avg) + + update_values() + other.update_values() + + return compare(other) + + +//A wrapper around share_ratio for spacing gas at the same rate as if it were going into a large airless room. +/datum/gas_mixture/proc/share_space(datum/gas_mixture/unsim_air) + return share_ratio(unsim_air, unsim_air.group_multiplier, max(1, max(group_multiplier + 3, 1) + unsim_air.group_multiplier), one_way = 1) + +//Equalizes a list of gas mixtures. Used for pipe networks. +/proc/equalize_gases(list/datum/gas_mixture/gases) + //Calculate totals from individual components + var/total_volume = 0 + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + + var/list/total_gas = list() + for(var/datum/gas_mixture/gasmix in gases) + total_volume += gasmix.volume + var/temp_heatcap = gasmix.heat_capacity() + total_thermal_energy += gasmix.temperature * temp_heatcap + total_heat_capacity += temp_heatcap + for(var/g in gasmix.gas) + total_gas[g] += gasmix.gas[g] + + if(total_volume > 0) + var/datum/gas_mixture/combined = new(total_volume) + combined.gas = total_gas + + //Calculate temperature + if(total_heat_capacity > 0) + combined.temperature = total_thermal_energy / total_heat_capacity + combined.update_values() + + //Allow for reactions + combined.react() + + //Average out the gases + for(var/g in combined.gas) + combined.gas[g] /= total_volume + + //Update individual gas_mixtures + for(var/datum/gas_mixture/gasmix in gases) + gasmix.gas = combined.gas.Copy() + gasmix.temperature = combined.temperature + gasmix.multiply(gasmix.volume) + + return 1 + +/datum/gas_mixture/proc/get_mass() + for(var/g in gas) + . += gas[g] * SSzas.gas_data.molar_mass[g] * group_multiplier + +/datum/gas_mixture/proc/specific_mass() + var/M = get_total_moles() + if(M) + return get_mass()/M + +////LINDA COMPATABILITY PROCS//// +/datum/gas_mixture/proc/return_volume() + return max(0, volume) + +/datum/gas_mixture/proc/return_temperature() + return temperature + +/datum/gas_mixture/proc/total_moles() + return total_moles + +/datum/gas_mixture/proc/has_gas(gas_id, required_amount) + var/amt = get_gas(gas_id) + return (amt >= required_amount) + +///THIS PROBABLY WILL NOT BE USED BUUUUT- +/datum/gas_mixture/proc/mingle_with_turf(turf/simulated/target, mingle_volume) + var/datum/gas_mixture/air_sample = remove_ratio(mingle_volume/volume) + air_sample.volume = mingle_volume + + if(istype(target) && target.zone) + //Have to consider preservation of group statuses + var/datum/gas_mixture/turf_copy = new + + turf_copy.copy_from(target.zone.air) + turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group + + equalize_gases(list(air_sample, turf_copy)) + merge(air_sample) + + turf_copy.subtract(target.zone.air) + + target.zone.air.merge(turf_copy) + + else + var/datum/gas_mixture/turf_air = target.return_air() + + equalize_gases(list(air_sample, turf_air)) + merge(air_sample) + //turf_air already modified by equalize_gases() diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm new file mode 100644 index 00000000000..1cf3d2fbee8 --- /dev/null +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -0,0 +1,78 @@ +/datum/zas_controller + var/datum/pl_control/plc + + var/fire_consuption_rate = 0.25 + var/fire_consuption_rate_NAME = "Fire - Air Consumption Ratio" + var/fire_consuption_rate_DESC = "Ratio of air removed and combusted per tick." + + var/fire_firelevel_multiplier = 25 + var/fire_firelevel_multiplier_NAME = "Fire - Firelevel Constant" + var/fire_firelevel_multiplier_DESC = "Multiplied by the equation for firelevel, affects mainly the extingiushing of fires." + + //Note that this parameter and the phoron heat capacity have a significant impact on TTV yield. + var/fire_fuel_energy_release = 866000 //J/mol. Adjusted to compensate for fire energy release being fixed, was 397000 + var/fire_fuel_energy_release_NAME = "Fire - Fuel energy release" + var/fire_fuel_energy_release_DESC = "The energy in joule released when burning one mol of a burnable substance" + + + var/IgnitionLevel = 0.5 + var/IgnitionLevel_DESC = "Determines point at which fire can ignite" + + var/airflow_lightest_pressure = 20 + var/airflow_lightest_pressure_NAME = "Airflow - Small Movement Threshold %" + var/airflow_lightest_pressure_DESC = "Percent of 1 Atm. at which items with the small weight classes will move." + + var/airflow_light_pressure = 35 + var/airflow_light_pressure_NAME = "Airflow - Medium Movement Threshold %" + var/airflow_light_pressure_DESC = "Percent of 1 Atm. at which items with the medium weight classes will move." + + var/airflow_medium_pressure = 50 + var/airflow_medium_pressure_NAME = "Airflow - Heavy Movement Threshold %" + var/airflow_medium_pressure_DESC = "Percent of 1 Atm. at which items with the largest weight classes will move." + + var/airflow_heavy_pressure = 65 + var/airflow_heavy_pressure_NAME = "Airflow - Mob Movement Threshold %" + var/airflow_heavy_pressure_DESC = "Percent of 1 Atm. at which mobs will move." + + var/airflow_dense_pressure = 85 + var/airflow_dense_pressure_NAME = "Airflow - Dense Movement Threshold %" + var/airflow_dense_pressure_DESC = "Percent of 1 Atm. at which items with canisters and closets will move." + + var/airflow_stun_pressure = 60 + var/airflow_stun_pressure_NAME = "Airflow - Mob Stunning Threshold %" + var/airflow_stun_pressure_DESC = "Percent of 1 Atm. at which mobs will be stunned by airflow." + + var/airflow_stun_cooldown = 60 + var/airflow_stun_cooldown_NAME = "Aiflow Stunning - Cooldown" + var/airflow_stun_cooldown_DESC = "How long, in tenths of a second, to wait before stunning them again." + + var/airflow_stun = 1 + var/airflow_stun_NAME = "Airflow Impact - Stunning" + var/airflow_stun_DESC = "How much a mob is stunned when hit by an object." + + var/airflow_damage = 3 + var/airflow_damage_NAME = "Airflow Impact - Damage" + var/airflow_damage_DESC = "Damage from airflow impacts." + + var/airflow_speed_decay = 1.5 + var/airflow_speed_decay_NAME = "Airflow Speed Decay" + var/airflow_speed_decay_DESC = "How rapidly the speed gained from airflow decays." + + var/airflow_delay = 30 + var/airflow_delay_NAME = "Airflow Retrigger Delay" + var/airflow_delay_DESC = "Time in deciseconds before things can be moved by airflow again." + + var/airflow_mob_slowdown = 1 + var/airflow_mob_slowdown_NAME = "Airflow Slowdown" + var/airflow_mob_slowdown_DESC = "Time in tenths of a second to add as a delay to each movement by a mob if they are fighting the pull of the airflow." + + var/connection_insulation = 1 + var/connection_insulation_NAME = "Connections - Insulation" + var/connection_insulation_DESC = "Boolean, should doors forbid heat transfer?" + + var/connection_temperature_delta = 10 + var/connection_temperature_delta_NAME = "Connections - Temperature Difference" + var/connection_temperature_delta_DESC = "The smallest temperature difference which will cause heat to travel through doors." + +/datum/zas_controller/Initalize() + plc = new diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index aff8d23d929..9d20a386d9e 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -54,7 +54,7 @@ Class Procs: var/last_air_temperature = TCMB /zone/New() - SSair.add_zone(src) + SSzas.add_zone(src) air.temperature = TCMB air.group_multiplier = 1 air.volume = CELL_VOLUME @@ -63,7 +63,7 @@ Class Procs: #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) - ASSERT(!SSair.has_valid_zone(T)) + ASSERT(!SSzas.has_valid_zone(T)) #endif var/datum/gas_mixture/turf_air = T.return_air() @@ -73,7 +73,7 @@ Class Procs: if(T.fire) var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T fire_tiles.Add(T) - SSair.active_fire_zones |= src + SSzas.active_fire_zones |= src if(fuel) fuel_objs += fuel T.update_graphic(air.graphic) @@ -116,11 +116,11 @@ Class Procs: if(E.contains_zone(into)) continue //don't need to rebuild this edge for(var/turf/T in E.connecting_turfs) - SSair.mark_for_update(T) + SSzas.mark_for_update(T) /zone/proc/c_invalidate() invalid = 1 - SSair.remove_zone(src) + SSzas.remove_zone(src) #ifdef ZASDBG for(var/turf/simulated/T in contents) T.dbg(invalid_zone) @@ -133,7 +133,7 @@ Class Procs: T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. - SSair.mark_for_update(T) + SSzas.mark_for_update(T) /zone/proc/add_tile_air(datum/gas_mixture/tile_air) //air.volume += CELL_VOLUME @@ -146,10 +146,10 @@ Class Procs: /zone/proc/tick() // Update fires. - if(air.temperature >= PHORON_FLASHPOINT && !(src in SSair.active_fire_zones) && air.check_combustability() && contents.len) + if(air.temperature >= PHORON_FLASHPOINT && !(src in SSzas.active_fire_zones) && air.check_combustability() && contents.len) var/turf/T = pick(contents) if(istype(T)) - T.create_fire(vsc.fire_firelevel_multiplier) + T.create_fire(SSzas.settings.fire_firelevel_multiplier) // Update gas overlays. if(air.check_tile_graphic(graphic_add, graphic_remove)) @@ -165,8 +165,8 @@ Class Procs: // Handle condensation from the air. for(var/g in air.gas) - var/product = gas_data.condensation_products[g] - if(product && air.temperature <= gas_data.condensation_points[g]) + var/product = SSzas.gas_data.condensation_products[g] + if(product && air.temperature <= SSzas.gas_data.condensation_points[g]) var/condensation_area = air.group_multiplier while(condensation_area > 0) condensation_area-- @@ -190,7 +190,7 @@ Class Procs: /zone/proc/dbg_data(mob/M) to_chat(M, name) for(var/g in air.gas) - to_chat(M, "[gas_data.name[g]]: [air.gas[g]]") + to_chat(M, "[SSzas.gas_data.name[g]]: [air.gas[g]]") to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[GAS_NITROGEN] ? air.gas[GAS_OXYGEN]/air.gas[GAS_NITROGEN] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 6403b4417aa..269c5722698 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -95,7 +95,7 @@ temperature = starting_temperature perform_exposure() setDir(pick(GLOB.cardinals)) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, ) diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 28743a43c47..0a1ce419a2c 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -118,7 +118,7 @@ var/turf/local_turf = get_turf(loc) if(!local_turf) return - local_turf.air_update_turf(update, remove) + local_turf./air_update_turf(update, remove) /** * A helper proc for dealing with atmos changes @@ -139,8 +139,8 @@ /atom/movable/proc/move_update_air(turf/target_turf) if(isturf(target_turf)) - target_turf.air_update_turf(TRUE, FALSE) //You're empty now - air_update_turf(TRUE, TRUE) //You aren't + target_turf.//air_update_turf(TRUE, FALSE) //You're empty now + //air_update_turf(TRUE, TRUE) //You aren't /atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires var/turf/open/local_turf = get_turf(src) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 7627bf7c48e..6887aa8ca32 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -80,14 +80,14 @@ return FALSE air.merge(giver) update_visuals() - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) return TRUE /turf/open/remove_air(amount) var/datum/gas_mixture/ours = return_air() var/datum/gas_mixture/removed = ours.remove(amount) update_visuals() - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) return removed /turf/open/proc/copy_air_with_tile(turf/open/target_turf) @@ -374,7 +374,7 @@ /atom/movable ///How much delta pressure is needed for us to move - var/pressure_resistance = 10 + var///pressure_resistance = 10 var/last_high_pressure_movement_air_cycle = 0 /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index acc3b5714f5..5c62143e0a6 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -217,10 +217,10 @@ continue cur_tlv = TLV[gas_id] data["environment_data"] += list(list( - "name" = environment.gases[gas_id][GAS_META][META_GAS_NAME], - "value" = environment.gases[gas_id][MOLES] / total_moles * 100, + "name" = environment.gas[gas_id], + "value" = environment.get_gas(gas_id) / total_moles * 100, "unit" = "%", - "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id][MOLES] * partial_pressure) + "danger_level" = cur_tlv.get_danger_level(environment.get_gas(gas_id)* partial_pressure) )) if(!locked || user.has_unlimited_silicon_privilege) @@ -451,26 +451,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = list( - /datum/gas/carbon_dioxide, - /datum/gas/miasma, - /datum/gas/plasma, - /datum/gas/water_vapor, - /datum/gas/hypernoblium, - /datum/gas/nitrous_oxide, - /datum/gas/nitrium, - /datum/gas/tritium, - /datum/gas/bz, - /datum/gas/pluoxium, - /datum/gas/freon, - /datum/gas/hydrogen, - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/zauker, - /datum/gas/helium, - /datum/gas/antinoblium, - /datum/gas/halon, - ), + "set_filters" = ALL_GASES, "scrubbing" = 1, "widenet" = 1 ), signal_source) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 10759536c12..a6de2e9fef0 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -52,13 +52,13 @@ ///Whether it can be painted var/paintable = TRUE - ///Is the thing being rebuilt by SSair or not. Prevents list bloat + ///Is the thing being rebuilt by SSzas or not. Prevents list bloat var/rebuilding = FALSE ///The bitflag that's being checked on ventcrawling. Default is to allow ventcrawling and seeing pipes. var/vent_movement = VENTCRAWL_ALLOWED | VENTCRAWL_CAN_SEE - - ///keeps the name of the object from being overridden if it's vareditted. + + ///keeps the name of the object from being overridden if it's vareditted. var/override_naming /obj/machinery/atmospherics/LateInitialize() @@ -83,20 +83,20 @@ armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 100, ACID = 70) ..() if(process) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) set_init_directions(init_dir) /obj/machinery/atmospherics/Initialize(mapload) if(mapload && name != initial(name)) override_naming = TRUE - return ..() + return ..() /obj/machinery/atmospherics/Destroy() for(var/i in 1 to device_type) nullify_node(i) - SSair.stop_processing_machine(src) - SSair.rebuild_queue -= src + SSzas.stop_processing_machine(src) + SSzas.rebuild_queue -= src if(pipe_vision_img) qdel(pipe_vision_img) @@ -114,7 +114,7 @@ on = active SEND_SIGNAL(src, COMSIG_ATMOS_MACHINE_SET_ON, on) -/// This should only be called by SSair as part of the rebuild queue. +/// This should only be called by SSzas as part of the rebuild queue. /// Handles rebuilding pipelines after init or they've been changed. /obj/machinery/atmospherics/proc/rebuild_pipes() var/list/targets = get_rebuild_targets() @@ -470,7 +470,7 @@ for(var/obj/machinery/atmospherics/A in nodes) A.atmos_init() A.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) /obj/machinery/atmospherics/update_name() if(!override_naming) diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index 65af7ccd181..4b9a7f12843 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -99,7 +99,7 @@ call_reactions(env) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) if(anchored) return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index f461cbe8988..a482283b9ba 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -28,7 +28,7 @@ var/datum/gas_mixture/internal = airs[1] if(internal.equalize(external)) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) update_parents() /obj/machinery/atmospherics/components/unary/passive_vent/layer2 diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 8692049c791..f25b5df5dc2 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 80, ACID = 50) max_integrity = 250 integrity_failure = 0.4 - pressure_resistance = 7 * ONE_ATMOSPHERE + //pressure_resistance = 7 * ONE_ATMOSPHERE req_access = list() var/icon/canister_overlay_file = 'icons/obj/atmospherics/canisters.dmi' @@ -551,7 +551,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) excited = TRUE if(air_contents.release_gas_to(target_air, release_pressure) && !holding) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) var/our_pressure = air_contents.return_pressure() var/our_temperature = air_contents.return_temperature() diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index c7f922c92f5..dcc57b43165 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -22,12 +22,12 @@ air_contents = new air_contents.volume = volume air_contents.temperature = T20C - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/Destroy() disconnect() air_contents = null - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) return ..() @@ -50,7 +50,7 @@ excited = FALSE /obj/machinery/portable_atmospherics/return_air() - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) return air_contents /obj/machinery/portable_atmospherics/return_analyzable_air() @@ -80,7 +80,7 @@ pixel_x = new_port.pixel_x pixel_y = new_port.pixel_y - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() return TRUE @@ -101,7 +101,7 @@ pixel_x = 0 pixel_y = 0 - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() return TRUE @@ -139,7 +139,7 @@ holding = new_tank RegisterSignal(holding, COMSIG_PARENT_QDELETING, .proc/unregister_holding) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() return TRUE @@ -193,10 +193,10 @@ add_fingerprint(user) return ..() -/// Holding tanks can get to zero integrity and be destroyed without other warnings due to pressure change. +/// Holding tanks can get to zero integrity and be destroyed without other warnings due to pressure change. /// This checks for that case and removes our reference to it. /obj/machinery/portable_atmospherics/proc/unregister_holding() SIGNAL_HANDLER - + UnregisterSignal(holding, COMSIG_PARENT_QDELETING) holding = null diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 7390affc0d1..26dfe3e8651 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -68,7 +68,7 @@ receiving = (holding ? holding.return_air() : air_contents) if(sending.pump_gas_to(receiving, target_pressure) && !holding) - air_update_turf(FALSE, FALSE) // Update the environment if needed. + //air_update_turf(FALSE, FALSE) // Update the environment if needed. return ..() diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 399a35a083d..bbf6ed311c1 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -99,7 +99,7 @@ air_contents.merge(filtered) // Store filtered out gasses. mixture.merge(filtering) // Returned the cleaned gas. if(!holding) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) . = ..() diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index e85a2e346e4..31a4ddc7447 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -16,7 +16,6 @@ /turf/cordon/AfterChange() . = ..() - SSair.high_pressure_delta -= src /turf/cordon/attack_ghost(mob/dead/observer/user) return FALSE diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 7b523f31606..ffbeb476971 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -5,7 +5,7 @@ icon_state = "barrel" density = TRUE anchored = FALSE - pressure_resistance = 2 * ONE_ATMOSPHERE + //pressure_resistance = 2 * ONE_ATMOSPHERE max_integrity = 300 var/open = FALSE var/can_open = TRUE diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 7574ddee5fd..e95bb3ecc9e 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -122,7 +122,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.air_update_turf(TRUE, TRUE) + affected_turf.//air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 53f37e45f13..bb6b5163e95 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -335,7 +335,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) icon = 'icons/obj/objects.dmi' icon_state = "miningbeacon" var/obj/docking_port/stationary/Mport //Linked docking port for the mining shuttle - pressure_resistance = 200 //So it does not get blown into lava. + //pressure_resistance = 200 //So it does not get blown into lava. var/anti_spam_cd = 0 //The linking process might be a bit intensive, so this here to prevent over use. var/console_range = 15 //Wifi range of the beacon to find the aux base console diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 0baefc9041b..36ba0ed593c 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -262,10 +262,10 @@ /obj/structure/fans/Initialize(mapload) . = ..() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) /obj/structure/fans/Destroy() - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) . = ..() //Invisible, indestructible fans /obj/structure/fans/tiny/invisible diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 67cef378df0..b18f588ca86 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -7,7 +7,7 @@ name = "ore box" desc = "A heavy wooden box, which can be filled with a lot of ores." density = TRUE - pressure_resistance = 5*ONE_ATMOSPHERE + //pressure_resistance = 5*ONE_ATMOSPHERE /obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/stack/ore)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 30f8dbaebf2..b2b031b542b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -10,7 +10,7 @@ mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles plane = GAME_PLANE_UPPER_FOV_HIDDEN - pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. + //pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. butcher_results = list(/obj/item/food/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) var/alt_inhands_file = 'icons/mob/alienqueen.dmi' diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 6426cdb8f7f..99eb8cbedc4 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,7 +1,7 @@ /mob/living/carbon blood_volume = BLOOD_VOLUME_NORMAL gender = MALE - pressure_resistance = 15 + //pressure_resistance = 15 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) has_limbs = TRUE held_items = list(null, null) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 102d3475e36..032d9c6180e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -7,7 +7,7 @@ appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) hud_type = /datum/hud/human - pressure_resistance = 25 + //pressure_resistance = 25 can_buckle = TRUE buckle_lying = 0 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 843e37598e8..dc34e8b2802 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -3,7 +3,7 @@ sight = 0 see_in_dark = 2 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) - pressure_resistance = 10 + //pressure_resistance = 10 hud_type = /datum/hud/living diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 7db0ef33636..29dab1be903 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -27,7 +27,7 @@ maxbodytemp = INFINITY healable = 0 faction = list("cult") - pressure_resistance = 100 + //pressure_resistance = 100 unique_name = 1 AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/ectoplasm) diff --git a/code/modules/mob/living/simple_animal/heretic_monsters.dm b/code/modules/mob/living/simple_animal/heretic_monsters.dm index af19683a97f..83fd0b936a7 100644 --- a/code/modules/mob/living/simple_animal/heretic_monsters.dm +++ b/code/modules/mob/living/simple_animal/heretic_monsters.dm @@ -26,7 +26,7 @@ maxbodytemp = INFINITY healable = FALSE movement_type = GROUND - pressure_resistance = 100 + //pressure_resistance = 100 del_on_death = TRUE deathmessage = "implodes into itself." loot = list(/obj/effect/gibspawner/human) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 839af83ffea..92605a8db3e 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -39,7 +39,7 @@ minbodytemp = 0 maxbodytemp = 1500 faction = list("carp") - pressure_resistance = 200 + //pressure_resistance = 200 gold_core_spawnable = HOSTILE_SPAWN /// If the carp uses random coloring var/random_color = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 84ae852cee5..23991e03a5a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -28,7 +28,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - pressure_resistance = 300 + //pressure_resistance = 300 gold_core_spawnable = NO_SPAWN //too spooky for science light_system = MOVABLE_LIGHT light_range = 1 // same glowing as visible player ghosts diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index c7d17ea8c37..15e3cd5e87b 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -66,7 +66,7 @@ minbodytemp = 0 maxbodytemp = 1500 faction = list("carp") - pressure_resistance = 200 + //pressure_resistance = 200 /// Current time since the the last rift was activated. If set to -1, does not increment. var/riftTimer = 0 /// Maximum amount of time which can pass without a rift before Space Dragon despawns. diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4f171e7cdd9..04515064f8d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -13,7 +13,7 @@ plane = GAME_PLANE_FOV_HIDDEN animate_movement = SLIDE_STEPS hud_possible = list(ANTAG_HUD) - pressure_resistance = 8 + //pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 1c373b4de40..066b0235777 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -129,3 +129,8 @@ /datum/movespeed_modifier/auto_wash multiplicative_slowdown = 3 + +/datum/movespeed_modifier/atmos_pressure + multiplicative_slowdown = 3 + id = MOVESPEED_ID_MOB_ATMOS_AFFLICTION + variable = TRUE diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index ef22e798c6a..944f8201c2f 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "folder" w_class = WEIGHT_CLASS_SMALL - pressure_resistance = 2 + //pressure_resistance = 2 resistance_flags = FLAMMABLE /// The background color for tgui in hex (with a `#`) var/bg_color = "#7f7f7f" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 68b3d5dde5e..a7fe41bd0f6 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -26,7 +26,7 @@ w_class = WEIGHT_CLASS_TINY throw_range = 1 throw_speed = 1 - pressure_resistance = 0 + //pressure_resistance = 0 slot_flags = ITEM_SLOT_HEAD body_parts_covered = HEAD resistance_flags = FLAMMABLE diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 720c4acd024..aa71b67c941 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -12,7 +12,7 @@ w_class = WEIGHT_CLASS_NORMAL throw_speed = 3 throw_range = 7 - pressure_resistance = 8 + //pressure_resistance = 8 var/papertype = /obj/item/paper var/total_paper = 30 var/list/papers = list() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 2d9d207ac4f..47f078e3c94 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -23,7 +23,7 @@ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=10) - pressure_resistance = 2 + //pressure_resistance = 2 grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) var/colour = "#000000" //what colour the ink is! var/degrees = 0 @@ -309,7 +309,7 @@ force = 3 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=10, /datum/material/diamond=100, /datum/material/titanium = 10) - pressure_resistance = 2 + //pressure_resistance = 2 grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) tool_behaviour = TOOL_MINING //For the classic "digging out of prison with a spoon but you're in space so this analogy doesn't work" situation. toolspeed = 10 //You will never willingly choose to use one of these over a shovel. diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 2d61ca83c19..561aa52bb3d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -9,7 +9,7 @@ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=60) - pressure_resistance = 2 + //pressure_resistance = 2 attack_verb_continuous = list("stamps") attack_verb_simple = list("stamp") diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index fb9abb17a68..98e31b31286 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -21,7 +21,7 @@ /obj/machinery/field/containment/Initialize(mapload) . = ..() - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) RegisterSignal(src, COMSIG_ATOM_SINGULARITY_TRY_MOVE, .proc/block_singularity) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, @@ -36,7 +36,7 @@ field_gen_2.fields -= src field_gen_2 = null can_atmos_pass = ATMOS_PASS_YES - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) return ..() //ATTACK HAND IGNORING PARENT RETURN VALUE diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index b37775f6610..15c3d10c2e2 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -200,7 +200,7 @@ no power level overlay is currently in the overlays list. /obj/machinery/field/generator/proc/turn_off() active = FG_OFFLINE can_atmos_pass = ATMOS_PASS_YES - air_update_turf(TRUE, FALSE) + //air_update_turf(TRUE, FALSE) INVOKE_ASYNC(src, .proc/cleanup) addtimer(CALLBACK(src, .proc/cool_down), 5 SECONDS) @@ -276,7 +276,7 @@ no power level overlay is currently in the overlays list. return move_resist = INFINITY can_atmos_pass = ATMOS_PASS_NO - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) addtimer(CALLBACK(src, .proc/setup_field, 1), 1) addtimer(CALLBACK(src, .proc/setup_field, 2), 2) addtimer(CALLBACK(src, .proc/setup_field, 4), 3) diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index 3dfc5e0027f..e5f7a0e98d1 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -51,7 +51,7 @@ removed.gases[/datum/gas/oxygen][MOLES] = max(((device_energy + TCMB) - T0C) / OXYGEN_RELEASE_MODIFIER, 0) removed.garbage_collect() env.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) else if(takes_damage) //causing damage @@ -302,7 +302,7 @@ if(produces_gas) removed.garbage_collect() env.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) /obj/machinery/power/supermatter_crystal/proc/psychological_examination() // Defaults to a value less than 1. Over time the psyCoeff goes to 0 if diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index c1a3ad037fe..1d6e9ced35a 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -471,7 +471,7 @@ //the compressor compresses down the gases from 2500 L to 1000 L //the temperature and pressure rises up, you can regulate this to increase/decrease the amount of gas moved in. var/compressor_work = do_calculations(input_turf_mixture, compressor.machine_gasmix, regulated = TRUE) - input_turf.air_update_turf(TRUE) + input_turf.//air_update_turf(TRUE) var/compressor_pressure = max(compressor.machine_gasmix.return_pressure(), 0.01) //the rotor moves the gases that expands from 1000 L to 3000 L, they cool down and both temperature and pressure lowers @@ -496,7 +496,7 @@ add_avail(produced_energy) turbine.machine_gasmix.pump_gas_to(output_turf.air, turbine.machine_gasmix.return_pressure()) - output_turf.air_update_turf(TRUE) + output_turf.//air_update_turf(TRUE) /** * Handles all the calculations needed for the gases, work done, temperature increase/decrease diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 48d88b4654c..0bc8bc897a0 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -5,7 +5,7 @@ icon_state = "water" density = TRUE anchored = FALSE - pressure_resistance = 2*ONE_ATMOSPHERE + //pressure_resistance = 2*ONE_ATMOSPHERE max_integrity = 300 ///In units, how much the dispenser can hold var/tank_volume = 1000 diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index aca55ac9ea2..51ee0c75462 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -444,7 +444,7 @@ //Actually transfer the gas var/datum/gas_mixture/removed = env.remove(transfer_moles) air_contents.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) //if full enough, switch to ready mode if(air_contents.return_pressure() >= SEND_PRESSURE) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 5f24bc63241..56a14772878 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -8,7 +8,7 @@ icon_state = "conpipe" anchored = FALSE density = FALSE - pressure_resistance = 5*ONE_ATMOSPHERE + //pressure_resistance = 5*ONE_ATMOSPHERE max_integrity = 200 var/obj/pipe_type = /obj/structure/disposalpipe/segment var/pipename diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 111b2911c9e..e576126d4dd 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -375,7 +375,7 @@ heat_capacity = 1 removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000) env.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) @@ -421,7 +421,7 @@ heat_capacity = 1 removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity env.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 78904de857c..bd5f34edbb5 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -106,7 +106,7 @@ removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) env.merge(removed) - air_update_turf(FALSE, FALSE) + //air_update_turf(FALSE, FALSE) /proc/fix_noid_research_servers() var/list/no_id_servers = list() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 09c22a92b08..56d2c56a8e9 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -111,7 +111,7 @@ Chilling extracts: G.gases[/datum/gas/plasma][MOLES] = 0 filtered = TRUE G.garbage_collect() - T.air_update_turf(FALSE, FALSE) + T.//air_update_turf(FALSE, FALSE) if(filtered) user.visible_message(span_notice("Cracks spread throughout [src], and some air is sucked in!")) else diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 2ddc73e2527..43a0fd57ad8 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -58,9 +58,9 @@ All ShuttleMove procs go here var/depth = baseturfs.len - shuttle_boundary + 1 newT.CopyOnTop(src, 1, depth, TRUE) newT.blocks_air = TRUE - newT.air_update_turf(TRUE, FALSE) + newT.//air_update_turf(TRUE, FALSE) blocks_air = TRUE - air_update_turf(TRUE, TRUE) + //air_update_turf(TRUE, TRUE) if(isopenturf(newT)) var/turf/open/new_open = newT new_open.copy_air_with_tile(src) @@ -86,9 +86,9 @@ All ShuttleMove procs go here /turf/proc/lateShuttleMove(turf/oldT) blocks_air = initial(blocks_air) - air_update_turf(TRUE, blocks_air) + //air_update_turf(TRUE, blocks_air) oldT.blocks_air = initial(oldT.blocks_air) - oldT.air_update_turf(TRUE, oldT.blocks_air) + oldT.//air_update_turf(TRUE, oldT.blocks_air) ///////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 277680b8651..b88e07c23e5 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -468,8 +468,8 @@ var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) var/transfer_moles = 0 if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + if(tank_air.temperature > 0) + transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) cabin_air.merge(removed) else if(pressure_delta < 0) //cabin pressure higher than release pressure @@ -478,7 +478,7 @@ if(t_air) pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) if(t_air) t_air.merge(removed) @@ -1242,7 +1242,7 @@ ///fetches temp of the gas mixture we are using /obj/vehicle/sealed/mecha/return_temperature() var/datum/gas_mixture/air = return_air() - return air?.return_temperature() + return air?.temperature diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 276138e8b2d..d1b9f463f5f 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -447,7 +447,7 @@ if(!chassis || !chassis.internal_tank) return FALSE var/datum/gas_mixture/our_mix = chassis.internal_tank.return_air() - var/moles = our_mix.total_moles() + var/moles = our_mix.total_moles if(moles < move_cost) our_mix.remove(moles) return FALSE diff --git a/code/modules/wiremod/components/sensors/pressuresensor.dm b/code/modules/wiremod/components/sensors/pressuresensor.dm index 06e45cc688a..c0509aac6f2 100644 --- a/code/modules/wiremod/components/sensors/pressuresensor.dm +++ b/code/modules/wiremod/components/sensors/pressuresensor.dm @@ -24,7 +24,7 @@ return //Get environment info var/datum/gas_mixture/environment = location.return_air() - var/total_moles = environment.total_moles() + var/total_moles = environment.total_moles var/pressure = environment.return_pressure() if(total_moles) //If there's atmos, return pressure diff --git a/code/modules/wiremod/components/sensors/tempsensor.dm b/code/modules/wiremod/components/sensors/tempsensor.dm index e88d5dea1c3..c84282582cb 100644 --- a/code/modules/wiremod/components/sensors/tempsensor.dm +++ b/code/modules/wiremod/components/sensors/tempsensor.dm @@ -24,7 +24,7 @@ return //Get environment info var/datum/gas_mixture/environment = location.return_air() - var/total_moles = environment.total_moles() + var/total_moles = environment.total_moles if(total_moles) //If there's atmos, return temperature result.set_output(round(environment.temperature,1)) diff --git a/tgstation.dme b/tgstation.dme index a0d92e739f5..70c7b2536a0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -194,6 +194,8 @@ #include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\atmospherics\atmos_piping.dm" +#include "code\__DEFINES\atmospherics\ZAS.dm" +#include "code\__DEFINES\atmospherics\ZAS_math.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals\signals_action.dm" @@ -448,6 +450,7 @@ #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\addiction.dm" #include "code\controllers\subsystem\ai_controllers.dm" +#include "code\controllers\subsystem\airflow.dm" //#include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\assets.dm" @@ -1389,7 +1392,7 @@ #include "code\game\objects\effects\effect_system\effects_smoke.dm" #include "code\game\objects\effects\effect_system\effects_sparks.dm" #include "code\game\objects\effects\effect_system\effects_water.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" +//#include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\costume.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\structure.dm" @@ -2343,16 +2346,19 @@ #include "code\modules\atmospherics\ZAS\Connection.dm" #include "code\modules\atmospherics\ZAS\ConnectionGroup.dm" #include "code\modules\atmospherics\ZAS\ConnectionManager.dm" +#include "code\modules\atmospherics\ZAS\ZAS_Settings.dm" #include "code\modules\atmospherics\ZAS\Debug.dm" #include "code\modules\atmospherics\ZAS\Diagnostic.dm" #include "code\modules\atmospherics\ZAS\Fire.dm" #include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" #include "code\modules\atmospherics\ZAS\Turf.dm" +#include "code\modules\atmospherics\ZAS\XGM\gases.dm" #include "code\modules\atmospherics\ZAS\Zone.dm" #include "code\modules\atmospherics\ZAS\_docs.dm" #include "code\modules\atmospherics\ZAS\Airflow.dm" #include "code\modules\atmospherics\ZAS\Atom.dm" #include "code\modules\atmospherics\ZAS\Plasma.dm" +#include "code\modules\atmospherics\ZAS\XGM\xgm_gas_mixture.dm" #include "code\modules\atmospherics\ZAS\XGM\gas_data.dm" #include "code\modules\atmospherics\machinery\portable\canister.dm" #include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" From 7a165cb586ef959e1a7c7f430e4a45c6559bdd10 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 14 Apr 2022 22:19:46 -0400 Subject: [PATCH 003/200] Under 1000 errors --- tgstation.dme | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 70c7b2536a0..ef7f70abfe1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2290,7 +2290,7 @@ */ #include "code\modules\atmospherics\machinery\airalarm.dm" #include "code\modules\atmospherics\machinery\atmosmachinery.dm" -#include "code\modules\atmospherics\machinery\bluespace_vendor.dm" +//#include "code\modules\atmospherics\machinery\bluespace_vendor.dm" #include "code\modules\atmospherics\machinery\datum_pipeline.dm" #include "code\modules\atmospherics\machinery\components\components_base.dm" #include "code\modules\atmospherics\machinery\components\tank.dm" @@ -2305,8 +2305,10 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\thermomachine.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" +/* #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" +*/ /* #include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" #include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" @@ -2337,6 +2339,7 @@ #include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" #include "code\modules\atmospherics\machinery\pipes\mapping.dm" #include "code\modules\atmospherics\machinery\pipes\multiz.dm" +#include "code\modules\atmospherics\ZAS\atmos_primitives.dm" #include "code\modules\atmospherics\machinery\pipes\pipes.dm" #include "code\modules\atmospherics\machinery\pipes\smart.dm" #include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm" From 164fbc39c1a3daa178b8561946164d523bb000d2 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 15 Apr 2022 16:49:02 -0400 Subject: [PATCH 004/200] Checkpoint! --- code/__DEFINES/atmospherics/ZAS.dm | 63 +- code/__DEFINES/atmospherics/atmos_helpers.dm | 4 +- code/__DEFINES/atmospherics/temperature.dm | 22 + code/__DEFINES/flags.dm | 8 +- code/__DEFINES/subsystems.dm | 1 + code/__HELPERS/_logging.dm | 2 +- code/__HELPERS/atmospherics.dm | 2 +- code/__HELPERS/global_lists.dm | 2 +- .../subsystem/processing/processing.dm | 3 +- .../subsystem/processing/temperature.dm | 5 + code/controllers/subsystem/zas.dm | 21 +- code/datums/components/gas_leaker.dm | 4 +- code/game/atoms.dm | 3 + code/game/machinery/computer/arcade/arcade.dm | 2 +- .../effects/effect_system/effects_foam.dm | 2 +- .../effects/effect_system/effects_smoke.dm | 6 +- code/game/objects/effects/glowshroom.dm | 5 +- code/game/objects/items.dm | 2 +- code/game/objects/items/flamethrower.dm | 27 +- code/game/objects/items/tanks/tank_types.dm | 26 +- code/game/objects/items/tanks/tanks.dm | 1 + code/game/objects/objs.dm | 3 + code/game/objects/structures/window.dm | 3 +- code/modules/admin/verbs/fix_air.dm | 69 ++- code/modules/assembly/bomb.dm | 6 +- code/modules/atmospherics/ZAS/Airflow.dm | 3 +- code/modules/atmospherics/ZAS/Fire.dm | 104 ++-- code/modules/atmospherics/ZAS/Plasma.dm | 8 +- code/modules/atmospherics/ZAS/Temperature.dm | 58 ++ code/modules/atmospherics/ZAS/Turf.dm | 8 +- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 48 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 94 +-- code/modules/atmospherics/ZAS/Zone.dm | 15 +- .../atmospherics/ZAS/atmos_primitives.dm | 537 ++++++++++++++++++ .../atmospherics/machinery/airalarm.dm | 39 +- .../components/binary_devices/circulator.dm | 2 +- .../components/binary_devices/passive_gate.dm | 3 +- .../binary_devices/pressure_valve.dm | 3 +- .../components/binary_devices/pump.dm | 4 +- .../binary_devices/temperature_gate.dm | 6 +- .../binary_devices/thermomachine.dm | 2 +- .../machinery/components/components_base.dm | 4 +- .../components/electrolyzer/electrolyzer.dm | 4 +- .../atmospherics/machinery/components/tank.dm | 8 +- .../components/trinary_devices/filter.dm | 13 +- .../components/unary_devices/cryo.dm | 9 +- .../unary_devices/heat_exchanger.dm | 6 +- .../components/unary_devices/vent_scrubber.dm | 53 +- .../atmospherics/machinery/datum_pipeline.dm | 75 +-- .../atmospherics/machinery/other/meter.dm | 8 +- .../atmospherics/machinery/other/miner.dm | 4 +- .../machinery/pipes/layermanifold.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 2 +- .../atmospherics/machinery/portable/pump.dm | 41 +- .../machinery/portable/scrubber.dm | 37 +- code/modules/awaymissions/away_props.dm | 18 - code/modules/cargo/exports/large_objects.dm | 24 +- tgstation.dme | 5 +- 58 files changed, 1067 insertions(+), 472 deletions(-) create mode 100644 code/__DEFINES/atmospherics/temperature.dm create mode 100644 code/controllers/subsystem/processing/temperature.dm create mode 100644 code/modules/atmospherics/ZAS/Temperature.dm create mode 100644 code/modules/atmospherics/ZAS/atmos_primitives.dm diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index b3e9fbcade6..364158806bf 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -202,8 +202,8 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) #define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it #define ATMOSTANK_OXYGEN 50000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. #define ATMOSTANK_CO2 60000 // CO2 is used for the GUP, Charon, and Torch as the primary fuel propellant, and we need lots to stick around. -#define ATMOSTANK_PHORON 25000 -#define ATMOSTANK_PHORON_FUEL 15000 +#define ATMOSTANK_PLASMA 25000 +#define ATMOSTANK_PLASMA_FUEL 15000 #define ATMOSTANK_HYDROGEN 50000 #define ATMOSTANK_HYDROGEN_FUEL 25000 #define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? @@ -235,7 +235,8 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) #define GAS_STEAM "water" #define GAS_PLASMA "phoron" -#define ALL_GASES list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA) +GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) +GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, @@ -244,25 +245,37 @@ GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63 )) -#define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !QDELETED(A) && !(A.atom_flags & ATOM_FLAG_NO_TEMP_CHANGE)) -#define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 -#define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 - -#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ - _atom.temperature = _temp; \ - if(_atom.reagents) { \ - HANDLE_REACTIONS(_atom.reagents); \ - } \ - QUEUE_TEMPERATURE_ATOMS(_atom); - -#define QUEUE_TEMPERATURE_ATOMS(_atoms) \ - if(islist(_atoms)) { \ - for(var/thing in _atoms) { \ - var/atom/A = thing; \ - if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ - SStemperature.processing[A] = TRUE; \ - } \ - } \ - } else if(ATOM_IS_TEMPERATURE_SENSITIVE(_atoms)) { \ - SStemperature.processing[_atoms] = TRUE; \ - } +// The flow rate/effectiveness of various atmos devices is limited by their internal volume, +// so for many atmos devices these will control maximum flow rates in L/s. +#define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters. +#define ATMOS_DEFAULT_VOLUME_FILTER 500 // L. +#define ATMOS_DEFAULT_VOLUME_MIXER 500 // L. +#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. + +// heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ +/proc/heat2color(temp) + return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) + +/proc/heat2color_r(temp) + temp /= 100 + if(temp <= 66) + . = 255 + else + . = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592)) + +/proc/heat2color_g(temp) + temp /= 100 + if(temp <= 66) + . = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661)) + else + . = max(0, min(255, 288.1221695283 * ((temp - 60) ** -0.0755148492))) + +/proc/heat2color_b(temp) + temp /= 100 + if(temp >= 66) + . = 255 + else + if(temp <= 16) + . = 0 + else + . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307)) diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 433ecd3c7f7..20679527175 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -57,7 +57,9 @@ GLOBAL_LIST_INIT(nonoverlaying_gases, typecache_of_gases_with_no_overlays()) var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY];\ out_var += _GAS_OVERLAY[min(TOTAL_VISIBLE_STATES, CEILING(_GAS[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))];\ } - +#define GAS_OVERLAYS(gases, outvar)\ + out_var = list();\ + for(var/_ID in gases) #ifdef TESTING GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) #define CALCULATE_ADJACENT_TURFS(T, state) if (SSair.adjacent_rebuild[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSair.adjacent_rebuild[T] = state} diff --git a/code/__DEFINES/atmospherics/temperature.dm b/code/__DEFINES/atmospherics/temperature.dm new file mode 100644 index 00000000000..d86e844aab9 --- /dev/null +++ b/code/__DEFINES/atmospherics/temperature.dm @@ -0,0 +1,22 @@ +#define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !QDELETED(A) && !(A.flags_2 & NO_TEMP_CHANGE_2)) +#define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 +#define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 + +#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ + _atom.temperature = _temp; \ + if(_atom.reagents) { \ + START_PROCESSING(SSreagents, _atom.reagents); \ + } \ + QUEUE_TEMPERATURE_ATOMS(_atom); + +#define QUEUE_TEMPERATURE_ATOMS(_atoms) \ + if(islist(_atoms)) { \ + for(var/thing in _atoms) { \ + var/atom/A = thing; \ + if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ + START_PROCESSING(SStemperature, A); \ + } \ + } \ + } else if(ATOM_IS_TEMPERATURE_SENSITIVE(_atoms)) { \ + START_PROCESSING(SStemperature, _atoms); \ + } diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 389a4f2681b..b1139fcf476 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -58,8 +58,14 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define IS_PLAYER_COLORABLE_1 (1<<21) /// Whether or not this atom has contextual screentips when hovered OVER #define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<22) + + +//OH YEAH BABY FLAGS_2 HERE WE GO ///Plasma Contamination -#define CONTAMINATED_1 (1<<23) +#define CONTAMINATED_2 (1<<0) +///Temperature does no change +#define NO_TEMP_CHANGE_2 (1<<1) + // Update flags for [/atom/proc/update_appearance] /// Update the atom's name diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 44e17d7c122..75bdba976db 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -174,6 +174,7 @@ #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_DATABASE 16 #define FIRE_PRIORITY_AIRFLOW 17 +#define FIRE_PRIORITY_TEMPERATURE 18 #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index bb72d342457..5c247ef1fc4 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /proc/log_atmos(text, datum/gas_mixture/mix) var/message = text message += "TEMP=[mix.return_temperature()],MOL=[mix.total_moles()],VOL=[mix.volume]" - for(var/key in mix.gas) + for(var/key in mix.get_gases()) message += "[key]=[mix.get_gas(key)];" log_game(message) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 2635c68c148..8dc421e33d7 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -41,7 +41,7 @@ ) if(!gasmix) return - for(var/gas_path in gasmix.gas) + for(var/gas_path in gasmix.get_gases()) .["gases"] += list(list( "[gas_path]", "[gas_path]", diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 3c3bc0ee86c..02fd62bae6d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( /obj/item/radio/intercom, /obj/item/storage/secure/safe, /obj/machinery/airalarm, - /obj/machinery/bluespace_vendor, + ///obj/machinery/bluespace_vendor, /obj/machinery/newscaster, /obj/machinery/button, /obj/machinery/computer/security/telescreen, diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 058645da495..8d59e8318ea 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(processing) var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() + var/const/process_proc = /datum/proc/Process //Francinum is going to KILL ME /datum/controller/subsystem/processing/stat_entry(msg) msg = "[stat_tag]:[length(processing)]" @@ -25,7 +26,7 @@ SUBSYSTEM_DEF(processing) current_run.len-- if(QDELETED(thing)) processing -= thing - else if(thing.process(wait * 0.1) == PROCESS_KILL) + else if(call(thing, process_proc)(wait * 0.1) == PROCESS_KILL) //Fran is REALLY going to kill me // fully stop so that a future START_PROCESSING will work STOP_PROCESSING(src, thing) if (MC_TICK_CHECK) diff --git a/code/controllers/subsystem/processing/temperature.dm b/code/controllers/subsystem/processing/temperature.dm new file mode 100644 index 00000000000..772a2086a57 --- /dev/null +++ b/code/controllers/subsystem/processing/temperature.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(temperature) + name = "Temperature" + priority = FIRE_PRIORITY_TEMPERATURE + wait = 5 SECONDS + process_proc = /atom/proc/ProcessAtomTemperature diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 26a3631b8e0..1e22bff9a18 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -69,8 +69,8 @@ SUBSYSTEM_DEF(zas) //The variable setting controller var/datum/zas_controller/settings - //XGM gas data - var/datum/xgm_gas_data/gas_data + //A reference to the global var + var/datum/xgm_gas_data/gas_data = xgm_gas_data //Geometry lists var/list/zones = list() @@ -80,6 +80,7 @@ SUBSYSTEM_DEF(zas) var/list/networks = list() var/list/rebuild_queue = list() var/list/expansion_queue = list() + var/list/pipe_init_dirs_cache = list() //Atmos Machines var/list/atmos_machinery = list() @@ -170,13 +171,7 @@ SUBSYSTEM_DEF(zas) CHECK_TICK - to_chat(world, span_boldannounce( - {"Total Simulated Turfs: [simulated_turf_count] - Total Zones: [zones.len] - Total Edges: [edges.len] - Total Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"] - Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]"} - )) + to_chat(world, span_boldannounce("Total Simulated Turfs: [simulated_turf_count]\nTotal Zones: [zones.len]\nTotal Edges: [edges.len]\nTotal Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\nTotal Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) to_chat(world, span_boldannounce("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) @@ -293,7 +288,7 @@ SUBSYSTEM_DEF(zas) curr_hotspot = processing_hotspots if(current_process == SSZAS_HOTSPOTS) while (curr_hotspot.len) - var/obj/fire/F = curr_hotspot[curr_hotspot.len] + var/obj/effect/hotspot/F = curr_hotspot[curr_hotspot.len] curr_hotspot.len-- F.Process() @@ -372,6 +367,12 @@ SUBSYSTEM_DEF(zas) new_packet[SSZAS_REBUILD_QUEUE] = list(starting_point) expansion_queue += list(new_packet) +/datum/controller/subsystem/zas/proc/remove_from_expansion(datum/pipeline/line) + for(var/list/packet in expansion_queue) + if(packet[SSZAS_REBUILD_PIPELINE] == line) + expansion_queue -= packet + return + /datum/controller/subsystem/zas/proc/add_zone(zone/z) zones += z z.name = "Zone [next_id++]" diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index b5977d93bd5..f18a8cdd0d8 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -76,9 +76,11 @@ if(current_integrity > master.max_integrity * integrity_leak_percent) return PROCESS_KILL var/turf/location = get_turf(master) + var/datum/gas_mixture/open_air = location.return_air() var/true_rate = (1 - (current_integrity / master.max_integrity)) * leak_rate for(var/datum/gas_mixture/mix as anything in airs) - mix.mingle_with_turf(get_turf(parent), true_rate)//Not sure this is the best way to do this buuuuuut, ZASSED! + mix.leak_to_enviroment(open_air) + #undef PROCESS_OBJ #undef PROCESS_MACHINE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8c5ba744de4..6fb8041ed77 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -17,6 +17,9 @@ ///First atom flags var var/flags_1 = NONE + ///Second atom flags var + var/flags_2 = NONE + ///Intearaction flags var/interaction_flags_atom = NONE diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm index 1f6e3ecb07d..49695564831 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -550,7 +550,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( playsound(loc, 'sound/arcade/win.ogg', 50, TRUE) if(obj_flags & EMAGGED) - new /obj/effect/spawner/newbomb/plasma(loc, /obj/item/assembly/timer) + //new /obj/effect/spawner/newbomb/plasma(loc, /obj/item/assembly/timer) new /obj/item/clothing/head/collectable/petehat(loc) message_admins("[ADMIN_LOOKUPFLW(usr)] has outbombed Cuban Pete and been awarded a bomb.") log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.") diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 80a9ab9b5ba..b4a27778235 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -47,7 +47,7 @@ var/datum/gas_mixture/G = T.air if(G.get_gas(GAS_PLASMA)) var/plas_amt = min(30, G.get_gas(GAS_PLASMA)) //Absorb some plasma - G.remove_gas(GAS_PLASMA, plas_amt) + G.adjust_gas(GAS_PLASMA, -plas_amt) absorbed_plasma += plas_amt if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 75308cce91a..5eb1ba1b59f 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -77,7 +77,7 @@ if(!t_loc) return var/list/newsmokes = list() - for(var/turf/T in t_loc.get_atmos_adjacent_turfs()) + for(var/turf/T in t_loc.get_adjacent_open_turfs()) var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke! if(foundsmoke) continue @@ -177,8 +177,8 @@ for(var/obj/effect/hotspot/H in T) qdel(H) if(G.get_gas(GAS_PLASMA)) - G.add_gas(GAS_NITROGEN, G.get_gas(GAS_PLASMA)) - G.remove_gas(GAS_PLASMA, G.gas[GAS_PLASMA]) + G.adjust_gas(GAS_NITROGEN, G.get_gas(GAS_PLASMA)) + G.adjust_gas(GAS_PLASMA, -G.gas[GAS_PLASMA]) if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 505caab018b..91d64c25c76 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -136,7 +136,8 @@ GLOBAL_VAR_INIT(glowshrooms, 0) /obj/structure/glowshroom/proc/Spread() var/turf/ownturf = get_turf(src) - if(!TURF_SHARES(ownturf)) //If we are in a 1x1 room + var/list/turf/shares = ownturf.get_adjacent_open_turfs() + if(!length(shares)) //If we are in a 1x1 room return //Deal with it not now var/list/possible_locs = list() @@ -146,7 +147,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0) for(var/turf/open/floor/earth in oview(2,src)) if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs)) continue - if(!TURF_SHARES(earth)) + if(!length(earth.get_adjacent_open_turfs())) continue possible_locs += earth diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d32d35ae8dd..d7945bc10a6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -82,7 +82,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e var/stealthy_audio = FALSE ///How large is the object, used for stuff like whether it can fit in backpacks or not - var/w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_NORMAL ///This is used to determine on which slots an item can fit. var/slot_flags = 0 pass_flags = PASSTABLE diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index c1234098dfd..7fb83064e08 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -205,10 +205,7 @@ /*var/list/turfs_sharing_with_prev = previousturf.TryGetNonDenseNeighbour() if(!(T in turfs_sharing_with_prev)) break*/ - if(igniter) - igniter.ignite_turf(src,T) - else - default_ignite(T) + ignite_turf(src,T) sleep(1) previousturf = T operating = FALSE @@ -217,17 +214,17 @@ attack_self(M) -/obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05) +/obj/item/flamethrower/proc/ignite_turf(turf/target, release_amount = 5) //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf - var/datum/gas_mixture/tank_mix = ptank.return_air() - var/datum/gas_mixture/air_transfer = tank_mix.remove_ratio(release_amount) - - if(air_transfer.gases[/datum/gas/plasma]) - air_transfer.gases[/datum/gas/plasma][MOLES] *= 5 //Suffering + var/datum/gas_mixture/air_transfer = ptank.return_air().remove_ratio(release_amount) + //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE + new/obj/effect/decal/cleanable/oil(target,air_transfer.get_by_flag(XGM_GAS_FUEL),get_dir(loc,target)) + air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) target.assume_air(air_transfer) //Burn it based on transfered gas - target.hotspot_expose((tank_mix.temperature*2) + 380,500) + //target.hotspot_expose(part4.air_contents.temperature*2,300) + target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE //location.hotspot_expose(1000,500,1) /obj/item/flamethrower/Initialize(mapload) @@ -257,7 +254,7 @@ owner.visible_message(span_danger("\The [attack_text] hits the fuel tank on [owner]'s [name], rupturing it! What a shot!")) var/turf/target_turf = get_turf(owner) log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]") - igniter.ignite_turf(src,target_turf, release_amount = 100) + ignite_turf(src,target_turf, release_amount = 100) qdel(ptank) return 1 //It hit the flamethrower, not them @@ -265,15 +262,11 @@ /obj/item/assembly/igniter/proc/flamethrower_process(turf/open/location) location.hotspot_expose(heat,2) -/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05) - F.default_ignite(location,release_amount) - /obj/item/flamethrower/proc/instant_refill() SIGNAL_HANDLER if(ptank) var/datum/gas_mixture/tank_mix = ptank.return_air() - tank_mix.assert_gas(/datum/gas/plasma) - tank_mix.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C) + tank_mix.gas[GAS_PLASMA] = (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C) else ptank = new /obj/item/tank/internals/plasma/full(src) update_appearance() diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index cd9eb15add2..4e3a3eab4ed 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -22,8 +22,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.assert_gas(/datum/gas/oxygen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_OXYGEN,(6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/oxygen/yellow @@ -53,9 +52,8 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + air_contents.adjust_gas(GAS_OXYGEN,(3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjust_gas(GAS_NITROGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Plasma @@ -72,8 +70,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/flamethrower)) @@ -89,8 +86,7 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/empty/populate_gas() return @@ -109,12 +105,10 @@ distribute_pressure = TANK_PLASMAMAN_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt @@ -129,8 +123,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt/empty/populate_gas() return @@ -156,8 +149,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.assert_gas(/datum/gas/oxygen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(GAS_OXYGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index f2bab55a201..c69e23ee429 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -222,6 +222,7 @@ return air_contents.remove(amount) /obj/item/tank/return_air() + RETURN_TYPE(/datum/gas_mixture) START_PROCESSING(SSobj, src) return air_contents diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 288ec91c7c3..5742bd4febb 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -30,6 +30,9 @@ vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. + ///How large is the object, used for stuff like whether it can fit in backpacks or not + var/w_class = null + /// Map tag for something. Tired of it being used on snowflake items. Moved here for some semblance of a standard. /// Next pr after the network fix will have me refactor door interactions, so help me god. var/id_tag = null diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6a787119060..3fa1b100076 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -331,8 +331,9 @@ /obj/structure/window/Move() var/turf/T = loc . = ..() + /* if(anchored) - move_update_air(T) + move_update_air(T)*/ /obj/structure/window/can_atmos_pass(turf/T, vertical = FALSE) if(!anchored || !density) diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index d1f535cb0f6..67f0f737e03 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -1,21 +1,50 @@ -// Proc taken from yogstation, credit to nichlas0010 for the original -/client/proc/fix_air(turf/open/T in world) - set name = "Fix Air" - set category = "Admin.Game" - set desc = "Fixes air in specified radius." - - if(!holder) - to_chat(src, "Only administrators may use this command.", confidential = TRUE) +//Lifted 1:1 from Baystation +/client/proc/fixatmos() + set category = "Admin" + set name = "Fix Atmospherics Grief" + + if(!check_rights(R_ADMIN|R_DEBUG)) return + + if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") return - if(check_rights(R_ADMIN,1)) - var/range=input("Enter range:","Num",2) as num - message_admins("[key_name_admin(usr)] fixed air with range [range] in area [T.loc.name]") - log_game("[key_name_admin(usr)] fixed air with range [range] in area [T.loc.name]") - var/datum/gas_mixture/GM = new - for(var/turf/open/F in range(range,T)) - if(F.blocks_air) - //skip walls - continue - GM.parse_gas_string(F.initial_gas_mix) - F.copy_air(GM) - F.update_visuals() + + log_admin("Full atmosphere reset initiated by [usr].") + to_world("<span class = 'danger'>Initiating restart of atmosphere. The server may lag a bit.</span>") + sleep(10) + var/current_time = world.timeofday + + // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. + for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + S.power = 0 + to_chat(usr, "\[1/5\] - Supermatter depowered") + + // Remove all gases from all pipenets + for(var/net in SSmachines.pipenets) + var/datum/pipe_network/PN = net + for(var/datum/gas_mixture/G in PN.gases) + G.gas = list() + G.update_values() + + to_chat(usr, "\[2/5\] - All pipenets purged of gas.") + + // Delete all zones. + for(var/zone/Z in world) + Z.c_invalidate() + + to_chat(usr, "\[3/5\] - All ZAS Zones removed.") + + var/list/unsorted_overlays = list() + for(var/id in gas_data.tile_overlay) + unsorted_overlays |= gas_data.tile_overlay[id] + + for(var/turf/simulated/T in world) + T.air = null + T.overlays.Remove(unsorted_overlays) + T.zone = null + + to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") + + SSair.reboot() + + to_chat(usr, "\[5/5\] - ZAS Rebooted") + to_world("<span class = 'danger'>Atmosphere restart completed in <b>[(world.timeofday - current_time)/10]</b> seconds.</span>") diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index d033f862b88..2c01006f9d0 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -151,10 +151,8 @@ START_PROCESSING(SSobj, src) var/datum/gas_mixture/our_mix = return_air() - our_mix.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) - var/fuel_moles = our_mix.gases[/datum/gas/plasma][MOLES] + our_mix.gases[/datum/gas/oxygen][MOLES]/6 - our_mix.garbage_collect() - var/datum/gas_mixture/bomb_mixture = our_mix.copy() + var/fuel_moles = our_mix.get_gas(GAS_PLASMA) + our_mix.get_gas(GAS_OXYGEN)/6 + var/datum/gas_mixture/bomb_mixture = our_mix.copy_from() var/strength = 1 var/turf/ground_zero = get_turf(loc) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 35fb5c34620..06ea7684d26 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -131,7 +131,6 @@ Contains helper procs for airflow, handled in /connection_group. for(var/mob/M in hearers(src)) M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) playsound(src.loc, "smash.ogg", 25, 1, -1) - var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh . = ..() /mob/living/airflow_hit(atom/A) @@ -154,7 +153,7 @@ Contains helper procs for airflow, handled in /connection_group. M.show_message("<span class='danger'>[src] slams into [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) playsound(src.loc, "punch", 25, 1, -1) if (prob(33)) - var/obj/effect/decal/cleanable/blood/new_splatter = new(loc) + loc.add_blood_DNA(return_blood_DNA()) var/b_loss = min(airflow_speed, (airborne_acceleration*2)) * SSzas.settings.airflow_damage diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 5f539ba0d12..409646fcbd3 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -8,7 +8,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //#define FIREDBG -/turf/var/obj/fire/fire = null +/turf/var/obj/effect/hotspot/fire = null //Some legacy definitions so fires can be started. /atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -26,14 +26,14 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) if(fire_protection > world.time-300) return 0 - if(locate(/obj/fire) in src) + if(locate(/obj/effect/hotspot) in src) return 1 var/datum/gas_mixture/air_contents = return_air() if(!air_contents || exposed_temperature < PHORON_MINIMUM_BURN_TEMPERATURE) return 0 var/igniting = 0 - var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src + var/obj/effect/decal/cleanable/oil/liquid = locate() in src if(air_contents.check_combustability(liquid)) igniting = 1 @@ -53,7 +53,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(T.fire) T.fire.firelevel = firelevel else - var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + var/obj/effect/decal/cleanable/oil/fuel = locate() in T fire_tiles -= T fuel_objs -= fuel else @@ -76,13 +76,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/fuel_to_remove = used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units for(var/O in fuel_objs) - var/obj/effect/decal/cleanable/liquid_fuel/fuel = O + var/obj/effect/decal/cleanable/oil/fuel = O if(!istype(fuel)) fuel_objs -= fuel continue - fuel.amount -= fuel_to_remove - if(fuel.amount <= 0) + fuel.reagent_amount -= fuel_to_remove + if(fuel.reagent_amount <= 0) fuel_objs -= fuel if(remove_fire) var/turf/T = fuel.loc @@ -93,10 +93,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return 0 /turf/simulated/create_fire(fl) - - if(submerged()) - return 1 - if(fire) fire.firelevel = max(fl, fire.firelevel) return 1 @@ -107,32 +103,32 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin fire = new(src, fl) SSzas.active_fire_zones |= zone - var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src + var/obj/effect/decal/cleanable/oil/fuel = locate() in src zone.fire_tiles |= src if(fuel) zone.fuel_objs += fuel return 0 -/obj/fire - //Icon for fire on turfs. - +/obj/effect/hotspot anchored = TRUE - mouse_opacity = 0 - - blend_mode = BLEND_ADD - + mouse_opacity = MOUSE_OPACITY_TRANSPARENT icon = 'icons/effects/fire.dmi' icon_state = "1" - light_color = "#ed9200" - layer = FIRE_LAYER + layer = GASFIRE_LAYER + plane = ABOVE_GAME_PLANE + blend_mode = BLEND_ADD + light_system = MOVABLE_LIGHT + light_range = LIGHT_RANGE_FIRE + light_power = 1 + light_color = LIGHT_COLOR_FIRE var/firelevel = 1 //Calculated by gas_mixture.calculate_firelevel() -/obj/fire/Process() +/obj/effect/hotspot/Process() . = 1 var/turf/simulated/my_tile = loc - if(!istype(my_tile) || !my_tile.zone || my_tile.submerged()) + if(!istype(my_tile) || !my_tile.zone) if(my_tile && my_tile.fire == src) my_tile.fire = null qdel(src) @@ -168,7 +164,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //if(!enemy_tile.zone.fire_tiles.len) TODO - optimize var/datum/gas_mixture/acs = enemy_tile.return_air() - var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in enemy_tile + var/obj/effect/decal/cleanable/oil/liquid = locate() in enemy_tile if(!acs || !acs.check_combustability(liquid)) continue @@ -188,14 +184,14 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin animate(src, color = fire_color(air_contents.temperature), 5) set_light(l_color = color) -/obj/fire/New(newLoc,fl) +/obj/effect/hotspot/New(newLoc,fl) ..() if(!istype(loc, /turf)) qdel(src) return - setDir(pick(GLOB.cardinal)) + setDir(pick(GLOB.cardinals)) var/datum/gas_mixture/air_contents = loc.return_air() color = fire_color(air_contents.temperature) @@ -204,11 +200,11 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin firelevel = fl SSzas.active_hotspots.Add(src) -/obj/fire/proc/fire_color(var/env_temperature) +/obj/effect/hotspot/proc/fire_color(var/env_temperature) var/temperature = max(4000*sqrt(firelevel/SSzas.settings.fire_firelevel_multiplier), env_temperature) return heat2color(temperature) -/obj/fire/Destroy() +/obj/effect/hotspot/Destroy() var/turf/T = loc if (istype(T)) set_light(0) @@ -238,9 +234,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //*** Get the fuel and oxidizer amounts for(var/g in gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL) + if(xgm_gas_data.flags[g] & XGM_GAS_FUEL) gas_fuel += gas[g] - if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER) + if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER) total_oxidizers += gas[g] gas_fuel *= group_multiplier total_oxidizers *= group_multiplier @@ -248,8 +244,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //Liquid Fuel var/fuel_area = 0 if(zone) - for(var/obj/effect/decal/cleanable/liquid_fuel/fuel in zone.fuel_objs) - liquid_fuel += fuel.amount*LIQUIDFUEL_AMOUNT_TO_MOL + for(var/obj/effect/decal/cleanable/oil/fuel in zone.fuel_objs) + liquid_fuel += fuel.reagent_amount*LIQUIDFUEL_AMOUNT_TO_MOL fuel_area++ total_fuel = gas_fuel + liquid_fuel @@ -306,7 +302,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) var/datum/gas_mixture/burned_fuel = remove_by_flag(XGM_GAS_FUEL, used_gas_fuel) for(var/g in burned_fuel.gas) - adjust_gas(SSzas.gas_data.burn_product[g], burned_fuel.gas[g]) + adjust_gas(xgm_gas_data.burn_product[g], burned_fuel.gas[g]) if(zone) zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) @@ -328,7 +324,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /datum/gas_mixture/proc/check_recombustability(list/fuel_objs) . = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) . = 1 break @@ -340,14 +336,14 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin . = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL && gas[g] >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && gas[g] >= 0.1) . = 1 break -/datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid=null) +/datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/oil/liquid) . = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) . = 1 break @@ -359,7 +355,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin . = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) . = 1 break @@ -417,6 +413,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin head_exposure = 0 if(C.body_parts_covered & CHEST) chest_exposure = 0 + if(C.body_parts_covered & GROIN) + groin_exposure = 0 if(C.body_parts_covered & LEGS) legs_exposure = 0 if(C.body_parts_covered & ARMS) @@ -426,12 +424,30 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. - apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD, used_weapon = "Fire") - apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST, used_weapon = "Fire") - apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG, used_weapon = "Fire") - apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG, used_weapon = "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM, used_weapon = "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_R_ARM, used_weapon = "Fire") + apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD) + apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST) + apply_damage(2,0*mx*groin_exposure, BURN, BODY_ZONE_PRECISE_GROIN) + apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG) + apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG) + apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM) + apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_R_ARM) //return a truthy value of whether burning actually happened return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) + +/turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) + return + +/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) + var/dir_to = get_dir(src, adj_turf) + + for(var/obj/structure/window/W in src) + if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile) + W.fire_act(adj_air, adj_temp, adj_volume) + +/*/turf/simulated/wall/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) + burn(adj_temp) + if(adj_temp > material.melting_point) + take_damage(log(Frand(0.9, 1.1) * (adj_temp - material.melting_point)), BURN) + + return ..()*/ diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index a12977966c0..c8eab424a31 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -51,12 +51,12 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat /obj/item/contaminate() //Do a contamination overlay? Temporary measure to keep contamination less deadly than it was. - if(!(flags_1 & CONTAMINATED_1)) - flags_1 |= CONTAMINATED_1 + if(!(flags_2 & CONTAMINATED_2)) + flags_2 |= CONTAMINATED_2 add_overlay(GLOB.contamination_overlay) /obj/item/decontaminate() - flags_1 ~= CONTAMINATED_1 + flags_2 ~= CONTAMINATED_2 cut_overlay(GLOB.contamination_overlay) @@ -171,6 +171,6 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat if(!env) return for(var/g in env.gas) - if(SSzas.gas_data.flags[g] & XGM_GAS_CONTAMINANT && env.gas[g] > SSzas.gas_data.overlay_limit[g] + 1) + if(xgm_gas_data.flags[g] & XGM_GAS_CONTAMINANT && env.gas[g] > xgm_gas_data.overlay_limit[g] + 1) I.contaminate() break diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm new file mode 100644 index 00000000000..6aa01691ad6 --- /dev/null +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -0,0 +1,58 @@ +#define MIN_TEMPERATURE_COEFFICIENT 1 +#define MAX_TEMPERATURE_COEFFICIENT 10 + +/atom/var/temperature = T20C +/atom/var/temperature_coefficient = MAX_TEMPERATURE_COEFFICIENT + +/atom/movable/Entered(var/atom/movable/atom, var/atom/old_loc) + . = ..() + QUEUE_TEMPERATURE_ATOMS(atom) + +/obj/temperature_coefficient = null + +/mob/temperature_coefficient = null + +/turf/temperature_coefficient = MIN_TEMPERATURE_COEFFICIENT + +/obj/Initialize() + . = ..() + temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - w_class, MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient + +/obj/proc/HandleObjectHeating(var/obj/item/heated_by, var/mob/user, var/adjust_temp) + if(ATOM_IS_TEMPERATURE_SENSITIVE(src)) + visible_message(span_notice("\The [user] carefully heats \the [src] with \the [heated_by].")) + var/diff_temp = (adjust_temp - temperature) + if(diff_temp >= 0) + var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) + ADJUST_ATOM_TEMPERATURE(src, min(adjust_temp, altered_temp)) + +/mob/living/Initialize() + . = ..() + temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - FLOOR(mob_size/4, 1), MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient + +/atom/proc/ProcessAtomTemperature() + // Get our location temperature if possible. + // Nullspace is room temperature, clearly. + var/adjust_temp + if(loc) + if(!istype(loc, /turf/simulated)) + adjust_temp = loc.temperature + else + var/turf/simulated/T = loc + if(T.zone && T.zone.air) + adjust_temp = T.zone.air.temperature + else + adjust_temp = T20C + else + adjust_temp = T20C + + var/diff_temp = adjust_temp - temperature + if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) + var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) + ADJUST_ATOM_TEMPERATURE(src, (diff_temp > 0) ? min(adjust_temp, altered_temp) : max(adjust_temp, altered_temp)) + else + temperature = adjust_temp + return PROCESS_KILL + +#undef MIN_TEMPERATURE_COEFFICIENT +#undef MAX_TEMPERATURE_COEFFICIENT diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index a1229d928c8..5ae5dade602 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -301,8 +301,10 @@ /turf/simulated/atmos_spawn_air(gas_id, amount, initial_temperature) var/datum/gas_mixture/new_gas = new var/datum/gas_mixture/existing_gas = return_air() - - new_gas.adjust_gas_temp(gas_id, amount, initial_temperature) + if(isnull(initial_temperature)) + new_gas.adjust_gas(gas_id, amount) + else + new_gas.adjust_gas_temp(gas_id, amount, initial_temperature) existing_gas.merge(new_gas) /proc/turf_contains_dense_objects(var/turf/T) @@ -312,7 +314,7 @@ if(density) return 1 for(var/atom/movable/A as anything in src) - if(A.density && !(A.atom_flags & ON_BORDER_1)) + if(A.density && !(A.flags_1 & ON_BORDER_1)) return 1 return 0 diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 508cec715f6..0906a8623b8 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -1,3 +1,4 @@ +GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) /datum/xgm_gas_data //Simple list of all the gas IDs. var/list/gases = list() @@ -49,33 +50,33 @@ var/symbol_html = "X" var/symbol = "X" -/datum/xgm_gas_data/Initialize() +/datum/xgm_gas_data/New() for(var/p in subtypesof(/datum/xgm_gas)) var/datum/xgm_gas/gas = new p //avoid initial() because of potential New() actions - if(gas.id in SSzas.gas_data.gases) + if(gas.id in xgm_gas_data.gases) stack_trace("Duplicate gas id `[gas.id]` in `[p]`") - SSzas.gas_data.gases += gas.id - SSzas.gas_data.name[gas.id] = gas.name - SSzas.gas_data.specific_heat[gas.id] = gas.specific_heat - SSzas.gas_data.molar_mass[gas.id] = gas.molar_mass + xgm_gas_data.gases += gas.id + xgm_gas_data.name[gas.id] = gas.name + xgm_gas_data.specific_heat[gas.id] = gas.specific_heat + xgm_gas_data.molar_mass[gas.id] = gas.molar_mass if(gas.overlay_limit) - SSzas.gas_data.overlay_limit[gas.id] = gas.overlay_limit - SSzas.gas_data.tile_overlay[gas.id] = gas.tile_overlay - SSzas.gas_data.tile_overlay_color[gas.id] = gas.tile_color - SSzas.gas_data.flags[gas.id] = gas.flags - SSzas.gas_data.burn_product[gas.id] = gas.burn_product + xgm_gas_data.overlay_limit[gas.id] = gas.overlay_limit + xgm_gas_data.tile_overlay[gas.id] = gas.tile_overlay + xgm_gas_data.tile_overlay_color[gas.id] = gas.tile_color + xgm_gas_data.flags[gas.id] = gas.flags + xgm_gas_data.burn_product[gas.id] = gas.burn_product - SSzas.gas_data.symbol_html[gas.id] = gas.symbol_html - SSzas.gas_data.symbol[gas.id] = gas.symbol + xgm_gas_data.symbol_html[gas.id] = gas.symbol_html + xgm_gas_data.symbol[gas.id] = gas.symbol if(!isnull(gas.condensation_product) && !isnull(gas.condensation_point)) - SSzas.gas_data.condensation_points[gas.id] = gas.condensation_point - SSzas.gas_data.condensation_products[gas.id] = gas.condensation_product + xgm_gas_data.condensation_points[gas.id] = gas.condensation_point + xgm_gas_data.condensation_products[gas.id] = gas.condensation_product - SSzas.gas_data.breathed_product[gas.id] = gas.breathed_product - SSzas.gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + xgm_gas_data.breathed_product[gas.id] = gas.breathed_product + xgm_gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex return 1 @@ -98,6 +99,13 @@ /obj/effect/gas_overlay/Initialize(mapload, gas) . = ..() gas_id = gas - if(SSzas.gas_data.tile_overlay[gas_id]) - icon_state = SSzas.gas_data.tile_overlay[gas_id] - color = SSzas.gas_data.tile_overlay_color[gas_id] + if(xgm_gas_data.tile_overlay[gas_id]) + icon_state = xgm_gas_data.tile_overlay[gas_id] + color = xgm_gas_data.tile_overlay_color[gas_id] + +/proc/typecache_of_gases_with_no_overlays() + . = list() + for (var/gastype in subtypesof(/datum/xgm_gas)) + var/datum/xgm_gas/gasvar = gastype + if (!initial(gasvar.tile_overlay)) + .[gastype] = TRUE diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 331194c445c..8dc8599de41 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -51,7 +51,7 @@ if(moles > 0 && abs(temperature - temp) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = SSzas.gas_data.specific_heat[gasid] * moles + var/giver_heat_capacity = xgm_gas_data.specific_heat[gasid] * moles var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity != 0) temperature = (temp * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity @@ -137,7 +137,7 @@ /datum/gas_mixture/proc/heat_capacity() . = 0 for(var/g in gas) - . += SSzas.gas_data.specific_heat[g] * gas[g] + . += xgm_gas_data.specific_heat[g] * gas[g] . *= group_multiplier @@ -192,8 +192,8 @@ return SPECIFIC_ENTROPY_VACUUM //that gas isn't here //group_multiplier gets divided out in volume/gas[gasid] - also, V/(m*T) = R/(partial pressure) - var/molar_mass = SSzas.gas_data.molar_mass[gasid] - var/specific_heat = SSzas.gas_data.specific_heat[gasid] + var/molar_mass = xgm_gas_data.molar_mass[gasid] + var/specific_heat = xgm_gas_data.specific_heat[gasid] var/safe_temp = max(temperature, TCMB) // We're about to divide by this. return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) @@ -221,6 +221,8 @@ //Removes moles from the gas mixture and returns a gas_mixture containing the removed air. /datum/gas_mixture/proc/remove(amount) + RETURN_TYPE(/datum/gas_mixture) + amount = min(amount, total_moles * group_multiplier) //Can not take more air than the gas mixture has! if(amount <= 0) return null @@ -275,11 +277,11 @@ var/sum = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & flag) + if(xgm_gas_data.flags[g] & flag) sum += gas[g] for(var/g in gas) - if(SSzas.gas_data.flags[g] & flag) + if(xgm_gas_data.flags[g] & flag) removed.gas[g] = QUANTIZE((gas[g] / sum) * amount) gas[g] -= removed.gas[g] / group_multiplier @@ -293,7 +295,7 @@ /datum/gas_mixture/proc/get_by_flag(flag) . = 0 for(var/g in gas) - if(SSzas.gas_data.flags[g] & flag) + if(xgm_gas_data.flags[g] & flag) . += gas[g] //Copies gas and temperature from another gas_mixture. @@ -347,11 +349,11 @@ //Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) for(var/obj/effect/gas_overlay/O in graphic) - if(gas[O.gas_id] <= SSzas.gas_data.overlay_limit[O.gas_id]) + if(gas[O.gas_id] <= xgm_gas_data.overlay_limit[O.gas_id]) LAZYADD(graphic_remove, O) - for(var/g in SSzas.gas_data.overlay_limit) + for(var/g in xgm_gas_data.overlay_limit) //Overlay isn't applied for this gas, check if it's valid and needs to be added. - if(gas[g] > SSzas.gas_data.overlay_limit[g]) + if(gas[g] > xgm_gas_data.overlay_limit[g]) var/tile_overlay = get_tile_overlay(g) if(!(tile_overlay in graphic)) LAZYADD(graphic_add, tile_overlay) @@ -463,49 +465,9 @@ /datum/gas_mixture/proc/share_space(datum/gas_mixture/unsim_air) return share_ratio(unsim_air, unsim_air.group_multiplier, max(1, max(group_multiplier + 3, 1) + unsim_air.group_multiplier), one_way = 1) -//Equalizes a list of gas mixtures. Used for pipe networks. -/proc/equalize_gases(list/datum/gas_mixture/gases) - //Calculate totals from individual components - var/total_volume = 0 - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - - var/list/total_gas = list() - for(var/datum/gas_mixture/gasmix in gases) - total_volume += gasmix.volume - var/temp_heatcap = gasmix.heat_capacity() - total_thermal_energy += gasmix.temperature * temp_heatcap - total_heat_capacity += temp_heatcap - for(var/g in gasmix.gas) - total_gas[g] += gasmix.gas[g] - - if(total_volume > 0) - var/datum/gas_mixture/combined = new(total_volume) - combined.gas = total_gas - - //Calculate temperature - if(total_heat_capacity > 0) - combined.temperature = total_thermal_energy / total_heat_capacity - combined.update_values() - - //Allow for reactions - combined.react() - - //Average out the gases - for(var/g in combined.gas) - combined.gas[g] /= total_volume - - //Update individual gas_mixtures - for(var/datum/gas_mixture/gasmix in gases) - gasmix.gas = combined.gas.Copy() - gasmix.temperature = combined.temperature - gasmix.multiply(gasmix.volume) - - return 1 - /datum/gas_mixture/proc/get_mass() for(var/g in gas) - . += gas[g] * SSzas.gas_data.molar_mass[g] * group_multiplier + . += gas[g] * xgm_gas_data.molar_mass[g] * group_multiplier /datum/gas_mixture/proc/specific_mass() var/M = get_total_moles() @@ -526,28 +488,10 @@ var/amt = get_gas(gas_id) return (amt >= required_amount) -///THIS PROBABLY WILL NOT BE USED BUUUUT- -/datum/gas_mixture/proc/mingle_with_turf(turf/simulated/target, mingle_volume) - var/datum/gas_mixture/air_sample = remove_ratio(mingle_volume/volume) - air_sample.volume = mingle_volume - - if(istype(target) && target.zone) - //Have to consider preservation of group statuses - var/datum/gas_mixture/turf_copy = new - - turf_copy.copy_from(target.zone.air) - turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group - - equalize_gases(list(air_sample, turf_copy)) - merge(air_sample) - - turf_copy.subtract(target.zone.air) - - target.zone.air.merge(turf_copy) - - else - var/datum/gas_mixture/turf_air = target.return_air() +/datum/gas_mixture/proc/get_gases() + RETURN_TYPE(/list) + update_values() + return gas - equalize_gases(list(air_sample, turf_air)) - merge(air_sample) - //turf_air already modified by equalize_gases() +/datum/gas_mixture/proc/leak_to_enviroment(datum/gas_mixture/environment) + pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.return_pressure() - environment.return_pressure())) diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 9d20a386d9e..a46df8e036a 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -71,7 +71,7 @@ Class Procs: T.zone = src contents.Add(T) if(T.fire) - var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + var/obj/effect/decal/cleanable/oil/fuel = locate() in T fire_tiles.Add(T) SSzas.active_fire_zones |= src if(fuel) fuel_objs += fuel @@ -87,7 +87,7 @@ Class Procs: contents.Remove(T) fire_tiles.Remove(T) if(T.fire) - var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T + var/obj/effect/decal/cleanable/oil/fuel = locate() in T fuel_objs -= fuel T.zone = null T.update_graphic(graphic_remove = air.graphic) @@ -164,9 +164,10 @@ Class Procs: E.recheck() // Handle condensation from the air. + /* for(var/g in air.gas) - var/product = SSzas.gas_data.condensation_products[g] - if(product && air.temperature <= SSzas.gas_data.condensation_points[g]) + var/product = xgm_gas_data.condensation_products[g] + if(product && air.temperature <= xgm_gas_data.condensation_points[g]) var/condensation_area = air.group_multiplier while(condensation_area > 0) condensation_area-- @@ -176,6 +177,7 @@ Class Procs: break air.adjust_gas(g, -condense_amt) flooding.add_fluid(condense_amt, product) + */ // Update atom temperature. if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) @@ -190,12 +192,11 @@ Class Procs: /zone/proc/dbg_data(mob/M) to_chat(M, name) for(var/g in air.gas) - to_chat(M, "[SSzas.gas_data.name[g]]: [air.gas[g]]") + to_chat(M, "[xgm_gas_data.name[g]]: [air.gas[g]]") to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[GAS_NITROGEN] ? air.gas[GAS_OXYGEN]/air.gas[GAS_NITROGEN] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") -// to_chat(M, "Unsimulated: [unsimulated_contents.len]") -// to_chat(M, "Edges: [edges.len]") + to_chat(M, "Edges: [edges.len]") if(invalid) to_chat(M, "Invalid!") var/zone_edges = 0 var/space_edges = 0 diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm new file mode 100644 index 00000000000..a56ff737f08 --- /dev/null +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -0,0 +1,537 @@ +/* + Atmos processes + + These procs generalize various processes used by atmos machinery, such as pumping, filtering, or scrubbing gas, allowing them to be reused elsewhere. + If no gas was moved/pumped/filtered/whatever, they return a negative number. + Otherwise they return the amount of energy needed to do whatever it is they do (equivalently power if done over 1 second). + In the case of free-flowing gas you can do things with gas and still use 0 power, hence the distinction between negative and non-negative return values. +*/ + +/* +/obj/machinery/atmospherics/var/last_flow_rate = 0 +/obj/machinery/atmospherics/var/last_power_draw = 0 +/obj/machinery/portable_atmospherics/var/last_flow_rate = 0 + +*/ + +// These balance how easy or hard it is to create huge pressure gradients with pumps and filters. +// Lower values means it takes longer to create large pressures differences. +// Has no effect on pumping gasses from high pressure to low, only from low to high. +#define ATMOS_PUMP_EFFICIENCY 2.5 +#define ATMOS_FILTER_EFFICIENCY 2.5 + +// Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. +#define MINIMUM_MOLES_TO_PUMP 0.01 +#define MINIMUM_MOLES_TO_FILTER 0.04 + + +/obj/machinery/atmospherics/var/debug = 0 + +/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in world) + set name = "Toggle Debug Messages" + set category = "Debug" + M.debug = !M.debug + to_chat(usr, "[M]: Debug messages toggled [M.debug? "on" : "off"].") + +//Generalized gas pumping proc. +//Moves gas from one gas_mixture to another and returns the amount of power needed (assuming 1 second), or -1 if no gas was pumped. +//transfer_moles - Limits the amount of moles to transfer. The actual amount of gas moved may also be limited by available_power, if given. +//available_power - the maximum amount of power that may be used when moving gas. If null then the transfer is not limited by power. +/proc/pump_gas(var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/transfer_moles = null, var/available_power = null) + if (source.total_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing + return -1 + + if (isnull(transfer_moles)) + transfer_moles = source.total_moles + else + transfer_moles = min(source.total_moles, transfer_moles) + + //Calculate the amount of energy required and limit transfer_moles based on available power + var/specific_power = calculate_specific_power(source, sink)/ATMOS_PUMP_EFFICIENCY //this has to be calculated before we modify any gas mixtures + if (!isnull(available_power) && specific_power > 0) + transfer_moles = min(transfer_moles, available_power / specific_power) + + if (transfer_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing + return -1 + + /* + //Update flow rate meter + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + + if (A.debug) + A.visible_message("[A]: source entropy: [round(source.specific_entropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specific_entropy(), 0.01)] J/Kmol") + A.visible_message("[A]: specific entropy change = [round(sink.specific_entropy() - source.specific_entropy(), 0.01)] J/Kmol") + A.visible_message("[A]: specific power = [round(specific_power, 0.1)] W/mol") + A.visible_message("[A]: moles transferred = [transfer_moles] mol") + + if (istype(M, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/P = M + P.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + */ + + var/datum/gas_mixture/removed = source.remove(transfer_moles) + if (!removed) //Just in case + return -1 + + var/power_draw = specific_power*transfer_moles + + sink.merge(removed) + + return power_draw + +//Gas 'pumping' proc for the case where the gas flow is passive and driven entirely by pressure differences (but still one-way). +/proc/pump_gas_passive(var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/transfer_moles = null) + if (source.total_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing + return -1 + + if (isnull(transfer_moles)) + transfer_moles = source.total_moles + else + transfer_moles = min(source.total_moles, transfer_moles) + + var/equalize_moles = calculate_equalize_moles(source, sink) + transfer_moles = min(transfer_moles, equalize_moles) + + if (transfer_moles < MINIMUM_MOLES_TO_PUMP) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + /* + //Update flow rate meter + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + if (A.debug) + A.visible_message("[A]: moles transferred = [transfer_moles] mol") + + if (istype(M, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/P = M + P.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + */ + + var/datum/gas_mixture/removed = source.remove(transfer_moles) + if(!removed) //Just in case + return -1 + sink.merge(removed) + + return 0 + +//Generalized gas scrubbing proc. +//Selectively moves specified gasses one gas_mixture to another and returns the amount of power needed (assuming 1 second), or -1 if no gas was filtered. +//filtering - A list of gasids to be scrubbed from source +//total_transfer_moles - Limits the amount of moles to scrub. The actual amount of gas scrubbed may also be limited by available_power, if given. +//available_power - the maximum amount of power that may be used when scrubbing gas. If null then the scrubbing is not limited by power. +/proc/scrub_gas(var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/total_transfer_moles = null, var/available_power = null) + if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + filtering = filtering & source.gas //only filter gasses that are actually there. DO NOT USE &= + + //Determine the specific power of each filterable gas type, and the total amount of filterable gas (gasses selected to be scrubbed) + var/total_filterable_moles = 0 //the total amount of filterable gas + var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type + for (var/g in filtering) + if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) + continue + + var/specific_power = calculate_specific_power_gas(g, source, sink)/ATMOS_FILTER_EFFICIENCY + specific_power_gas[g] = specific_power + total_filterable_moles += source.gas[g] + + if (total_filterable_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + //now that we know the total amount of filterable gas, we can calculate the amount of power needed to scrub one mole of gas + var/total_specific_power = 0 //the power required to remove one mole of filterable gas + for (var/g in filtering) + var/ratio = source.gas[g]/total_filterable_moles //this converts the specific power per mole of pure gas to specific power per mole of scrubbed gas + total_specific_power += specific_power_gas[g]*ratio + + //Figure out how much of each gas to filter + if (isnull(total_transfer_moles)) + total_transfer_moles = total_filterable_moles + else + total_transfer_moles = min(total_transfer_moles, total_filterable_moles) + + //limit transfer_moles based on available power + if (!isnull(available_power) && total_specific_power > 0) + total_transfer_moles = min(total_transfer_moles, available_power/total_specific_power) + + if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + /* + //Update flow rate var + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + if (istype(M, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/P = M + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + */ + + var/power_draw = 0 + for (var/g in filtering) + var/transfer_moles = source.gas[g] + //filter gas in proportion to the mole ratio + transfer_moles = min(transfer_moles, total_transfer_moles*(source.gas[g]/total_filterable_moles)) + + //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. + source.adjust_gas(g, -transfer_moles, update=0) + sink.adjust_gas_temp(g, transfer_moles, source.temperature, update=0) + + power_draw += specific_power_gas[g]*transfer_moles + + //Remix the resulting gases + sink.update_values() + source.update_values() + + return power_draw + +//Generalized gas filtering proc. +//Filtering is a bit different from scrubbing. Instead of selectively moving the targeted gas types from one gas mix to another, filtering splits +//the input gas into two outputs: one that contains /only/ the targeted gas types, and another that completely clean of the targeted gas types. +//filtering - A list of gasids to be filtered. These gasses get moved to sink_filtered, while the other gasses get moved to sink_clean. +//total_transfer_moles - Limits the amount of moles to input. The actual amount of gas filtered may also be limited by available_power, if given. +//available_power - the maximum amount of power that may be used when filtering gas. If null then the filtering is not limited by power. +/proc/filter_gas(var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink_filtered, var/datum/gas_mixture/sink_clean, var/total_transfer_moles = null, var/available_power = null) + if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + filtering = filtering & source.gas //only filter gasses that are actually there. DO NOT USE &= + + var/total_specific_power = 0 //the power required to remove one mole of input gas + var/total_filterable_moles = 0 //the total amount of filterable gas + var/total_unfilterable_moles = 0 //the total amount of non-filterable gas + var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type + for (var/g in source.get_gases()) + if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) + continue + + if (g in filtering) + specific_power_gas[g] = calculate_specific_power_gas(g, source, sink_filtered)/ATMOS_FILTER_EFFICIENCY + total_filterable_moles += source.gas[g] + else + specific_power_gas[g] = calculate_specific_power_gas(g, source, sink_clean)/ATMOS_FILTER_EFFICIENCY + total_unfilterable_moles += source.gas[g] + + var/ratio = source.gas[g]/source.total_moles //converts the specific power per mole of pure gas to specific power per mole of input gas mix + total_specific_power += specific_power_gas[g]*ratio + + //Figure out how much of each gas to filter + if (isnull(total_transfer_moles)) + total_transfer_moles = source.total_moles + else + total_transfer_moles = min(total_transfer_moles, source.total_moles) + + //limit transfer_moles based on available power + if (!isnull(available_power) && total_specific_power > 0) + total_transfer_moles = min(total_transfer_moles, available_power/total_specific_power) + + if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + //Update flow rate var + /* + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + */ + + var/datum/gas_mixture/removed = source.remove(total_transfer_moles) + if (!removed) //Just in case + return -1 + + var/filtered_power_used = 0 //power used to move filterable gas to sink_filtered + var/unfiltered_power_used = 0 //power used to move unfilterable gas to sink_clean + for (var/g in removed.gas) + var/power_used = specific_power_gas[g]*removed.gas[g] + + if (g in filtering) + //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. + sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0) + removed.adjust_gas(g, -removed.gas[g], update=0) + filtered_power_used += power_used + else + unfiltered_power_used += power_used + + sink_filtered.update_values() + removed.update_values() + + sink_clean.merge(removed) + + return filtered_power_used + unfiltered_power_used + +//For omni devices. Instead filtering is an associative list mapping gasids to gas mixtures. +//I don't like the copypasta, but I decided to keep both versions of gas filtering as filter_gas is slightly faster (doesn't create as many temporary lists, doesn't call update_values() as much) +//filter_gas can be removed and replaced with this proc if need be. +/proc/filter_gas_multi(var/obj/machinery/M, var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink_clean, var/total_transfer_moles = null, var/available_power = null) + if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + filtering = filtering & source.gas //only filter gasses that are actually there. DO NOT USE &= + + var/total_specific_power = 0 //the power required to remove one mole of input gas + var/total_filterable_moles = 0 //the total amount of filterable gas + var/total_unfilterable_moles = 0 //the total amount of non-filterable gas + var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type + for (var/g in source.gas) + if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) + continue + + if (g in filtering) + var/datum/gas_mixture/sink_filtered = filtering[g] + specific_power_gas[g] = calculate_specific_power_gas(g, source, sink_filtered)/ATMOS_FILTER_EFFICIENCY + total_filterable_moles += source.gas[g] + else + specific_power_gas[g] = calculate_specific_power_gas(g, source, sink_clean)/ATMOS_FILTER_EFFICIENCY + total_unfilterable_moles += source.gas[g] + + var/ratio = source.gas[g]/source.total_moles //converts the specific power per mole of pure gas to specific power per mole of input gas mix + total_specific_power += specific_power_gas[g]*ratio + + //Figure out how much of each gas to filter + if (isnull(total_transfer_moles)) + total_transfer_moles = source.total_moles + else + total_transfer_moles = min(total_transfer_moles, source.total_moles) + + //limit transfer_moles based on available power + if (!isnull(available_power) && total_specific_power > 0) + total_transfer_moles = min(total_transfer_moles, available_power/total_specific_power) + + if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + /* + //Update Flow Rate var + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + if (istype(M, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/P = M + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + */ + + var/datum/gas_mixture/removed = source.remove(total_transfer_moles) + if (!removed) //Just in case + return -1 + + var/list/filtered_power_used = list() //power used to move filterable gas to the filtered gas mixes + var/unfiltered_power_used = 0 //power used to move unfilterable gas to sink_clean + for (var/g in removed.gas) + var/power_used = specific_power_gas[g]*removed.gas[g] + + if (g in filtering) + var/datum/gas_mixture/sink_filtered = filtering[g] + //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. + sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=1) + removed.adjust_gas(g, -removed.gas[g], update=0) + if (power_used) + filtered_power_used[sink_filtered] = power_used + else + unfiltered_power_used += power_used + + removed.update_values() + + var/power_draw = unfiltered_power_used + for (var/datum/gas_mixture/sink_filtered in filtered_power_used) + power_draw += filtered_power_used[sink_filtered] + + sink_clean.merge(removed) + + return power_draw + +//Similar deal as the other atmos process procs. +//mix_sources maps input gas mixtures to mix ratios. The mix ratios MUST add up to 1. +/proc/mix_gas(var/list/mix_sources, var/datum/gas_mixture/sink, var/total_transfer_moles = null, var/available_power = null) + if (!mix_sources.len) + return -1 + + var/total_specific_power = 0 //the power needed to mix one mole of gas + var/total_mixing_moles = null //the total amount of gas that can be mixed, given our mix ratios + var/total_input_volume = 0 //for flow rate calculation + var/total_input_moles = 0 //for flow rate calculation + var/list/source_specific_power = list() + for (var/datum/gas_mixture/source in mix_sources) + if (source.total_moles < MINIMUM_MOLES_TO_FILTER) + return -1 //either mix at the set ratios or mix no gas at all + + var/mix_ratio = mix_sources[source] + if (!mix_ratio) + continue //this gas is not being mixed in + + //mixing rate is limited by the source with the least amount of available gas + var/this_mixing_moles = source.total_moles/mix_ratio + if (isnull(total_mixing_moles) || total_mixing_moles > this_mixing_moles) + total_mixing_moles = this_mixing_moles + + source_specific_power[source] = calculate_specific_power(source, sink)*mix_ratio/ATMOS_FILTER_EFFICIENCY + total_specific_power += source_specific_power[source] + total_input_volume += source.volume + total_input_moles += source.total_moles + + if (total_mixing_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + if (isnull(total_transfer_moles)) + total_transfer_moles = total_mixing_moles + else + total_transfer_moles = min(total_mixing_moles, total_transfer_moles) + + //limit transfer_moles based on available power + if (!isnull(available_power) && total_specific_power > 0) + total_transfer_moles = min(total_transfer_moles, available_power / total_specific_power) + + if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + return -1 + + /* + //Update flow rate var + if (istype(M, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/A = M + A.last_flow_rate = (total_transfer_moles/total_input_moles)*total_input_volume //group_multiplier gets divided out here + if (istype(M, /obj/machinery/portable_atmospherics)) + var/obj/machinery/portable_atmospherics/P = M + P.last_flow_rate = (total_transfer_moles/total_input_moles)*total_input_volume //group_multiplier gets divided out here + */ + + var/total_power_draw = 0 + for (var/datum/gas_mixture/source in mix_sources) + var/mix_ratio = mix_sources[source] + if (!mix_ratio) + continue + + var/transfer_moles = total_transfer_moles * mix_ratio + + var/datum/gas_mixture/removed = source.remove(transfer_moles) + + var/power_draw = transfer_moles * source_specific_power[source] + total_power_draw += power_draw + + sink.merge(removed) + + return total_power_draw + +/* + Helper procs for various things. +*/ + +//Calculates the amount of power needed to move one mole from source to sink. +/proc/calculate_specific_power(datum/gas_mixture/source, datum/gas_mixture/sink) + //Calculate the amount of energy required + var/air_temperature = (sink.temperature > 0)? sink.temperature : source.temperature + var/specific_entropy = sink.specific_entropy() - source.specific_entropy() //sink is gaining moles, source is loosing + var/specific_power = 0 // W/mol + + //If specific_entropy is < 0 then power is required to move gas + if (specific_entropy < 0) + specific_power = -specific_entropy*air_temperature //how much power we need per mole + + return specific_power + +//Calculates the amount of power needed to move one mole of a certain gas from source to sink. +/proc/calculate_specific_power_gas(var/gasid, datum/gas_mixture/source, datum/gas_mixture/sink) + //Calculate the amount of energy required + var/air_temperature = (sink.temperature > 0)? sink.temperature : source.temperature + var/specific_entropy = sink.specific_entropy_gas(gasid) - source.specific_entropy_gas(gasid) //sink is gaining moles, source is loosing + var/specific_power = 0 // W/mol + + //If specific_entropy is < 0 then power is required to move gas + if (specific_entropy < 0) + specific_power = -specific_entropy*air_temperature //how much power we need per mole + + return specific_power + +//Calculates the APPROXIMATE amount of moles that would need to be transferred to change the pressure of sink by pressure_delta +//If set, sink_volume_mod adjusts the effective output volume used in the calculation. This is useful when the output gas_mixture is +//part of a pipenetwork, and so it's volume isn't representative of the actual volume since the gas will be shared across the pipenetwork when it processes. +/proc/calculate_transfer_moles(datum/gas_mixture/source, datum/gas_mixture/sink, var/pressure_delta, var/sink_volume_mod=0) + if(source.temperature == 0 || source.total_moles == 0) return 0 + + var/output_volume = (sink.volume * sink.group_multiplier) + sink_volume_mod + var/source_total_moles = source.total_moles * source.group_multiplier + + var/air_temperature = source.temperature + if(sink.total_moles > 0 && sink.temperature > 0) + //estimate the final temperature of the sink after transfer + var/estimate_moles = pressure_delta*output_volume/(sink.temperature * R_IDEAL_GAS_EQUATION) + var/sink_heat_capacity = sink.heat_capacity() + var/transfer_heat_capacity = source.heat_capacity()*estimate_moles/source_total_moles + air_temperature = (sink.temperature*sink_heat_capacity + source.temperature*transfer_heat_capacity) / (sink_heat_capacity + transfer_heat_capacity) + + //get the number of moles that would have to be transfered to bring sink to the target pressure + return pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) + +//Calculates the APPROXIMATE amount of moles that would need to be transferred to bring source and sink to the same pressure +/proc/calculate_equalize_moles(datum/gas_mixture/source, datum/gas_mixture/sink) + if(source.temperature == 0) return 0 + + //Make the approximation that the sink temperature is unchanged after transferring gas + var/source_volume = source.volume * source.group_multiplier + var/sink_volume = sink.volume * sink.group_multiplier + + var/source_pressure = source.return_pressure() + var/sink_pressure = sink.return_pressure() + + return (source_pressure - sink_pressure)/(R_IDEAL_GAS_EQUATION * (source.temperature/source_volume + sink.temperature/sink_volume)) + +//Determines if the atmosphere is safe (for humans). Safe atmosphere: +// - Is between 80 and 120kPa +// - Has between 17% and 30% oxygen +// - Has temperature between -10C and 50C +// - Has no or only minimal phoron or N2O +/proc/get_atmosphere_issues(datum/gas_mixture/atmosphere, var/returntext = 0) + var/list/status = list() + if(!atmosphere) + status.Add("No atmosphere present.") + + // Temperature check + if((atmosphere.temperature > (T0C + 50)) || (atmosphere.temperature < (T0C - 10))) + status.Add("Temperature too [atmosphere.temperature > (T0C + 50) ? "high" : "low"].") + + // Pressure check + var/pressure = atmosphere.return_pressure() + if((pressure > 120) || (pressure < 80)) + status.Add("Pressure too [pressure > 120 ? "high" : "low"].") + + // Gas concentration checks + var/oxygen = 0 + var/phoron = 0 + var/carbondioxide = 0 + var/nitrousoxide = 0 + var/hydrogen = 0 + if(atmosphere.total_moles) // Division by zero prevention + oxygen = (atmosphere.gas[GAS_OXYGEN] / atmosphere.total_moles) * 100 // Percentage of the gas + phoron = (atmosphere.gas[GAS_PLASMA] / atmosphere.total_moles) * 100 + carbondioxide = (atmosphere.gas[GAS_CO2] / atmosphere.total_moles) * 100 + nitrousoxide = (atmosphere.gas[GAS_N2O] / atmosphere.total_moles) * 100 + hydrogen = (atmosphere.gas[GAS_HYDROGEN] / atmosphere.total_moles) * 100 + + if(!oxygen) + status.Add("No oxygen.") + else if((oxygen > 30) || (oxygen < 17)) + status.Add("Oxygen too [oxygen > 30 ? "high" : "low"].") + + + + if(phoron > 0.1) // Toxic even in small amounts. + status.Add("Phoron contamination.") + if(nitrousoxide > 0.1) // Probably slightly less dangerous but still. + status.Add("N2O contamination.") + if(hydrogen > 2.5) // Not too dangerous, but flammable. + status.Add("Hydrogen contamination.") + if(carbondioxide > 5) // Not as dangerous until very large amount is present. + status.Add("CO2 concentration high.") + + + if(returntext) + return jointext(status, " ") + else + return status.len + +#undef MINIMUM_MOLES_TO_PUMP +#undef MINIMUM_MOLES_TO_FILTER +#undef ATMOS_PUMP_EFFICIENCY +#undef ATMOS_FILTER_EFFICIENCY diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5c62143e0a6..c82ce10a04c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -96,7 +96,16 @@ var/static/list/atmos_connections = list(COMSIG_TURF_EXPOSE = .proc/check_air_dangerlevel) - var/list/TLV = list( // Breathable air. + var/list/TLV = list( + "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), + "temperature" = new/datum/tlv(BODYTEMP_COLD_WARNING_1, BODYTEMP_COLD_WARNING_1+10, BODYTEMP_HEAT_WARNING_1-27, BODYTEMP_HEAT_WARNING_1), + GAS_OXYGEN = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa + GAS_NITROGEN = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + GAS_PLASMA = new/datum/tlv/dangerous, + GAS_N2O = new/datum/tlv/dangerous, + ) + /* // Breathable air. "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), // kPa. Values are hazard_min, warning_min, warning_max, hazard_max "temperature" = new/datum/tlv(BODYTEMP_COLD_WARNING_1, BODYTEMP_COLD_WARNING_1+10, BODYTEMP_HEAT_WARNING_1-27, BODYTEMP_HEAT_WARNING_1), /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa @@ -119,7 +128,7 @@ /datum/gas/helium = new/datum/tlv/dangerous, /datum/gas/antinoblium = new/datum/tlv/dangerous, /datum/gas/halon = new/datum/tlv/dangerous - ) + )*/ /obj/machinery/airalarm/Initialize(mapload, ndir, nbuild) . = ..() @@ -212,7 +221,7 @@ )) var/total_moles = environment.total_moles() var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume - for(var/gas_id in environment.gases) + for(var/gas_id in environment.get_gases()) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue cur_tlv = TLV[gas_id] @@ -287,11 +296,11 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "warning_max", "selected" = selected.warning_max)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "hazard_max", "selected" = selected.hazard_max)) - for(var/gas_id in GLOB.meta_gas_info) + for(var/gas_id in GLOB.all_gases) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] - thresholds += list(list("name" = GLOB.meta_gas_info[gas_id][META_GAS_NAME], "settings" = list())) + thresholds += list(list("name" = gas_id, "settings" = list())) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "hazard_min", "selected" = selected.hazard_min)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "warning_min", "selected" = selected.warning_min)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "warning_max", "selected" = selected.warning_max)) @@ -437,7 +446,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide), + "set_filters" = list(GAS_CO2), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -451,7 +460,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = ALL_GASES, + "set_filters" = GLOB.all_gases, "scrubbing" = 1, "widenet" = 1 ), signal_source) @@ -478,7 +487,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide), + "set_filters" = list(GAS_CO2), "scrubbing" = 1, "widenet" = 0 ), signal_source) @@ -599,7 +608,7 @@ //cache for sanic speed (lists are references anyways) var/list/cached_tlv = TLV - var/list/env_gases = environment.gases + var/list/env_gases = environment.get_gases() var/partial_pressure = R_IDEAL_GAS_EQUATION * exposed_temperature / environment.volume current_tlv = cached_tlv["pressure"] @@ -614,9 +623,7 @@ if(!(gas_id in cached_tlv)) // We're not interested in this gas, it seems. continue current_tlv = cached_tlv[gas_id] - gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(env_gases[gas_id][MOLES] * partial_pressure)) - - environment.garbage_collect() + gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(env_gases[gas_id] * partial_pressure)) var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) @@ -935,9 +942,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) "Temperature" = "temperature" ) - for(var/gas_id in GLOB.meta_gas_info) - component_options[GLOB.meta_gas_info[gas_id][META_GAS_NAME]] = gas_id2path(gas_id) - + for(var/gas_id in GLOB.common_gases) + //component_options[GLOB.meta_gas_info[gas_id][META_GAS_NAME]] = gas_id2path(gas_id) + component_options |= gas_id air_alarm_options = add_option_port("Air Alarm Options", component_options) options_map = component_options @@ -962,7 +969,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) pressure.set_output(round(environment.return_pressure())) temperature.set_output(round(environment.temperature)) if(ispath(options_map[current_option])) - gas_amount.set_output(round(environment.gases[options_map[current_option]][MOLES])) + gas_amount.set_output(round(environment.get_gases()[options_map[current_option]])) return var/datum/tlv/settings = connected_alarm.TLV[options_map[current_option]] diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index af52c1a78a8..01c3dc5e8e7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -122,7 +122,7 @@ if(node2) node2.atmos_init() node2.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 4c82f903a49..ba50629b708 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -56,7 +56,8 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - if(air1.release_gas_to(air2, target_pressure)) + var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles + if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles)) >= 0)//pump_gas() will return a negative number if no flow occurred update_parents() //Radio remote control diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index c5b3a43dc50..81c1c28c16f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -55,7 +55,8 @@ var/datum/gas_mixture/air2 = airs[2] if(air1.return_pressure() > target_pressure) - if(air1.release_gas_to(air2, air1.return_pressure())) + var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles + if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) update_parents() is_gas_flowing = TRUE else diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 1f372947f6e..c9a98bb535f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -64,8 +64,8 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - - if(air1.pump_gas_to(air2, target_pressure)) + var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles + if(pump_gas(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) update_parents() /** diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm index b9295a4d2cd..a6de5c17fa4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -59,14 +59,16 @@ if(!inverted) if(air1.temperature < target_temperature) - if(air1.release_gas_to(air2, air1.return_pressure())) + var/transfer_moles = (ATMOS_DEFAULT_VOLUME_PUMP/air1.volume)*air1.total_moles + if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) update_parents() is_gas_flowing = TRUE else is_gas_flowing = FALSE else if(air1.temperature > target_temperature) - if(air1.release_gas_to(air2, air1.return_pressure())) + var/transfer_moles = (ATMOS_DEFAULT_VOLUME_PUMP/air1.volume)*air1.total_moles + if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) update_parents() is_gas_flowing = TRUE else diff --git a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm index 253b8195c72..13c03a29c7d 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm @@ -333,7 +333,7 @@ if(node2) node2.atmos_init() node2.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) /obj/machinery/atmospherics/components/binary/thermomachine/proc/disconnect_pipes() var/obj/machinery/atmospherics/node1 = nodes[1] diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index bc98e87f3c6..e7fb23f7e9a 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -197,7 +197,7 @@ * This way gases won't get stuck */ /obj/machinery/atmospherics/components/proc/update_parents() - if(!SSair.initialized) + if(!SSzas.initialized) return if(rebuilding) update_parents_after_rebuild = TRUE @@ -206,7 +206,7 @@ var/datum/pipeline/parent = parents[i] if(!parent) WARNING("Component is missing a pipenet! Rebuilding...") - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) else parent.update = TRUE diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index 4b9a7f12843..02ec0bb294c 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -32,7 +32,7 @@ . = ..() if(ispath(cell)) cell = new cell(src) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() /obj/machinery/electrolyzer/Destroy() @@ -115,8 +115,6 @@ current_reaction.react(loc, env, working_power) - env.garbage_collect() - /obj/machinery/electrolyzer/RefreshParts() var/manipulator = 0 var/cap = 0 diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index ac3ebde272c..b02041cd51c 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -136,9 +136,7 @@ var/pressure_limit = max_pressure * safety_margin var/moles_to_add = (pressure_limit * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.assert_gas(gastype) - air_contents.gases[gastype][MOLES] += moles_to_add - air_contents.archive() + air_contents.adjust_gas(gastype, moles_to_add) /obj/machinery/atmospherics/components/tank/process_atmos() if(air_contents.react(src)) @@ -365,8 +363,8 @@ /obj/machinery/atmospherics/components/tank/air/Initialize(mapload) . = ..() - fill_to_pressure(/datum/gas/oxygen, safety_margin = (O2STANDARD * 0.5)) - fill_to_pressure(/datum/gas/nitrogen, safety_margin = (N2STANDARD * 0.5)) + fill_to_pressure(GAS_OXYGEN, safety_margin = (O2STANDARD * 0.5)) + fill_to_pressure(GAS_NITROGEN, safety_margin = (N2STANDARD * 0.5)) /obj/machinery/atmospherics/components/tank/carbon_dioxide gas_type = /datum/gas/carbon_dioxide diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 6f7af747d85..78fd349b75c 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -99,11 +99,7 @@ // If no filter is set, we just try to forward everything to air3 to avoid gas being outright lost. if(filtering) var/datum/gas_mixture/filtered_out = new - - for(var/gas in removed.gases & filter_type) - var/datum/gas_mixture/removing = removed.remove_specific_ratio(gas, 1) - if(removing) - filtered_out.merge(removing) + filter_gas(filtering, removed, filtered_out, removed, null, INFINITY) // Send things to the side output if we can, return them to the input if we can't. // This means that other gases continue to flow to the main output if the side output is blocked. if (side_output_full) @@ -111,7 +107,6 @@ else air2.merge(filtered_out) // Make sure we don't send any now-empty gas entries to the main output - removed.garbage_collect() // Send things to the main output if we can, return them to the input if we can't. // This lets filtered gases continue to flow to the side output in a manner consistent with the main output behavior. @@ -134,14 +129,14 @@ /obj/machinery/atmospherics/components/trinary/filter/ui_data() var/data = list() + var/static/all_gases = GLOB.all_gases data["on"] = on data["rate"] = round(transfer_rate) data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - data["filter_types"] += list(list("name" = gas[META_GAS_NAME], "gas_id" = gas[META_GAS_ID], "enabled" = (path in filter_type))) + for(var/gas in GLOB.all_gases) + data["filter_types"] += list(list("name" = gas[META_GAS_NAME], "enabled" = (path in filter_type))) return data diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c172844d47c..1abfa24475c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -278,11 +278,13 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/datum/gas_mixture/air1 = airs[1] - if(!nodes[1] || !airs[1] || !air1.gases.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. + /* PARIAH EDIT REMOVAL - HUGBOX BARGAGE + if(!nodes[1] || !airs[1] || !air1.gas.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. var/msg = "Insufficient cryogenic gas, shutting down." radio.talk_into(src, msg, radio_channel) set_on(FALSE) return + */ if(occupant) var/mob/living/mob_occupant = occupant @@ -306,9 +308,6 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/mob/living/carbon/human/humi = mob_occupant humi.adjust_coretemperature(humi.bodytemperature - humi.coretemperature) - - air1.garbage_collect() - if(air1.temperature > 2000) take_damage(clamp((air1.temperature)/200, 10, 20), BURN) @@ -555,7 +554,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics if(node) node.atmos_init() node.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) #undef MAX_TEMPERATURE #undef CRYO_MULTIPLY_FACTOR diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 5c6cacb5518..887bd167a35 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -53,11 +53,11 @@ if(!partner) partner_ref = null return - if(SSair.times_fired <= update_cycle) + if(SSzas.times_fired <= update_cycle) return - update_cycle = SSair.times_fired - partner.update_cycle = SSair.times_fired + update_cycle = SSzas.times_fired + partner.update_cycle = SSzas.times_fired var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/partnerair_contents = partner.airs[1] diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index d2b1d4bfee4..b1d46b02494 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -21,7 +21,7 @@ ///The mode of the scrubber (SCRUBBING or SIPHONING) var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing ///The list of gases we are filtering - var/list/filter_types = list(/datum/gas/carbon_dioxide) + var/list/filter_types = list(GAS_CO2) ///Rate of the scrubber to remove gases from the air var/volume_rate = 200 ///is this scrubber acting on the 3x3 area around it. @@ -47,7 +47,7 @@ for(var/to_filter in filter_types) if(istext(to_filter)) filter_types -= to_filter - filter_types += gas_id2path(to_filter) + filter_types += to_filter /obj/machinery/atmospherics/components/unary/vent_scrubber/Initialize(mapload) . = ..() @@ -69,13 +69,6 @@ if(!islist(filter_or_filters)) filter_or_filters = list(filter_or_filters) - for(var/gas_to_filter in filter_or_filters) - var/translated_gas = istext(gas_to_filter) ? gas_id2path(gas_to_filter) : gas_to_filter - - if(ispath(translated_gas, /datum/gas)) - filter_types |= translated_gas - continue - var/turf/open/our_turf = get_turf(src) if(!isopenturf(our_turf)) @@ -93,12 +86,6 @@ if(!islist(filter_or_filters)) filter_or_filters = list(filter_or_filters) - for(var/gas_to_filter in filter_or_filters) - var/translated_gas = istext(gas_to_filter) ? gas_id2path(gas_to_filter) : gas_to_filter - - if(ispath(translated_gas, /datum/gas)) - filter_types -= translated_gas - continue var/turf/open/our_turf = get_turf(src) var/datum/gas_mixture/turf_gas @@ -117,13 +104,6 @@ filter_or_filters = list(filter_or_filters) for(var/gas_to_filter in filter_or_filters) - var/translated_gas = istext(gas_to_filter) ? gas_id2path(gas_to_filter) : gas_to_filter - - if(ispath(translated_gas, /datum/gas)) - if(translated_gas in filter_types) - filter_types -= translated_gas - else - filter_types |= translated_gas var/turf/open/our_turf = get_turf(src) @@ -172,9 +152,8 @@ return FALSE var/list/f_types = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - f_types += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in filter_types))) + for(var/gas_id in GLOB.common_gases) + f_types += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in filter_types))) var/datum/signal/signal = new(list( "tag" = id_tag, @@ -223,7 +202,7 @@ on = FALSE return FALSE - var/list/changed_gas = air.gases + var/list/changed_gas = air.gas if(!changed_gas) return FALSE @@ -260,38 +239,30 @@ return FALSE var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/air_contents = airs[1] - var/list/env_gases = environment.gases if(air_contents.return_pressure() >= 50 * ONE_ATMOSPHERE) return FALSE if(scrubbing == SCRUBBING) - if(length(env_gases & filter_types)) + if(length(environment.gas & filter_types)) ///contains all of the gas we're sucking out of the tile, gets put into our parent pipenet var/datum/gas_mixture/filtered_out = new - var/list/filtered_gases = filtered_out.gases filtered_out.temperature = environment.temperature ///maximum percentage of the turfs gas we can filter var/removal_ratio = min(1, volume_rate / environment.volume) var/total_moles_to_remove = 0 - for(var/gas in filter_types & env_gases) - total_moles_to_remove += env_gases[gas][MOLES] + for(var/gas in filter_types & environment.get_gases()) + total_moles_to_remove += environment.get_gas(gas) if(total_moles_to_remove == 0)//sometimes this gets non gc'd values - environment.garbage_collect() return FALSE - for(var/gas in filter_types & env_gases) - filtered_out.add_gas(gas) - //take this gases portion of removal_ratio of the turfs air, or all of that gas if less than or equal to MINIMUM_MOLES_TO_SCRUB - var/transfered_moles = max(QUANTIZE(env_gases[gas][MOLES] * removal_ratio * (env_gases[gas][MOLES] / total_moles_to_remove)), min(MINIMUM_MOLES_TO_SCRUB, env_gases[gas][MOLES])) - - filtered_gases[gas][MOLES] = transfered_moles - env_gases[gas][MOLES] -= transfered_moles + //take this gases portion of removal_ratio of the turfs air, or all of that gas if less than or equal to MINIMUM_MOLES_TO_SCRUB + var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles + scrub_gas(filter_types, environment, filtered_out, transfer_moles, INFINITY) - environment.garbage_collect() //Remix the resulting gases air_contents.merge(filtered_out) @@ -315,7 +286,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/check_turfs() adjacent_turfs.Cut() var/turf/local_turf = get_turf(src) - adjacent_turfs = local_turf.get_atmos_adjacent_turfs(alldir = TRUE) + adjacent_turfs = get_adjacent_open_turfs(local_turf) /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index dcb96442951..ff2433045ec 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -14,19 +14,19 @@ other_airs = list() members = list() other_atmos_machines = list() - SSair.networks += src + SSzas.networks += src /datum/pipeline/Destroy() - SSair.networks -= src + SSzas.networks -= src if(building) - SSair.remove_from_expansion(src) + SSzas.remove_from_expansion(src) if(air?.volume) temporarily_store_air() for(var/obj/machinery/atmospherics/pipe/considered_pipe in members) considered_pipe.parent = null if(QDELETED(considered_pipe)) continue - SSair.add_to_rebuild_queue(considered_pipe) + SSzas.add_to_rebuild_queue(considered_pipe) for(var/obj/machinery/atmospherics/components/considered_component in other_atmos_machines) considered_component.nullify_pipenet(src) return ..() @@ -56,7 +56,7 @@ air = new air.volume = volume - SSair.add_to_expansion(src, base) + SSzas.add_to_expansion(src, base) ///Has the same effect as build_pipeline(), but this doesn't queue its work, so overrun abounds. It's useful for the pregame /datum/pipeline/proc/build_pipeline_blocking(obj/machinery/atmospherics/base) @@ -238,33 +238,44 @@ pipeline_list |= atmos_machine.return_pipenets_for_reconcilation(src) gas_mixture_list |= atmos_machine.return_airs_for_reconcilation(src) - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - var/datum/gas_mixture/total_gas_mixture = new(0) - - var/list/total_gases = total_gas_mixture.gases - - for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) - total_gas_mixture.volume += gas_mixture.volume - - // This is sort of a combined merge + heat_capacity calculation + equalize_gases(gas_mixture_list) - var/list/giver_gases = gas_mixture.gases - //gas transfer - for(var/giver_id in giver_gases) - var/giver_gas_data = giver_gases[giver_id] - ASSERT_GAS(giver_id, total_gas_mixture) - total_gases[giver_id][MOLES] += giver_gas_data[MOLES] - total_heat_capacity += giver_gas_data[MOLES] * giver_gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - total_thermal_energy += THERMAL_ENERGY(gas_mixture) - - total_gas_mixture.temperature = total_heat_capacity ? (total_thermal_energy / total_heat_capacity) : 0 - - total_gas_mixture.garbage_collect() +/proc/equalize_gases(list/datum/gas_mixture/gases) + //Calculate totals from individual components + var/total_volume = 0 + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 - if(total_gas_mixture.volume > 0) - //Update individual gas_mixtures by volume ratio - for(var/mixture in gas_mixture_list) - var/datum/gas_mixture/gas_mixture = mixture - gas_mixture.copy_from(total_gas_mixture, gas_mixture.volume / total_gas_mixture.volume) + var/list/total_gas = list() + for(var/datum/gas_mixture/gasmix in gases) + total_volume += gasmix.volume + var/temp_heatcap = gasmix.heat_capacity() + total_thermal_energy += gasmix.temperature * temp_heatcap + total_heat_capacity += temp_heatcap + for(var/g in gasmix.get_gases()) + total_gas[g] += gasmix.gas[g] + + if(total_volume > 0) + var/datum/gas_mixture/combined = new(total_volume) + combined.gas = total_gas + + //Calculate temperature + if(total_heat_capacity > 0) + combined.temperature = total_thermal_energy / total_heat_capacity + combined.update_values() + + //Allow for reactions + combined.react() + + //Average out the gases + for(var/g in combined.get_gases()) + combined.gas[g] /= total_volume + + //Update individual gas_mixtures + for(var/datum/gas_mixture/gasmix in gases) + gasmix.gas = combined.gas.Copy() + gasmix.temperature = combined.temperature + gasmix.multiply(gasmix.volume) + + return 1 diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 192c8ff2458..767fa2534e3 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -18,7 +18,7 @@ var/target_layer = PIPING_LAYER_DEFAULT /obj/machinery/meter/Destroy() - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) target = null return ..() @@ -26,7 +26,7 @@ if(!isnull(new_piping_layer)) target_layer = new_piping_layer - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) if(!target) reattach_to_layer() @@ -50,10 +50,10 @@ /obj/machinery/meter/on_set_is_operational(old_value) if(is_operational) - SSair.start_processing_machine(src)//dont set icon_state here because it will be reset on next process() if it ever happens + SSzas.start_processing_machine(src)//dont set icon_state here because it will be reset on next process() if it ever happens else icon_state = "meter" - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) /obj/machinery/meter/process_atmos() var/datum/gas_mixture/pipe_air = target.return_air() diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 457352b6ab8..f83b314f5df 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -134,9 +134,7 @@ if(!isopenturf(O)) return FALSE var/datum/gas_mixture/merger = new - merger.assert_gas(spawn_id) - merger.gases[spawn_id][MOLES] = spawn_mol * delta_time - merger.temperature = spawn_temp + merger.adjust_gas_temp(spawn_id, spawn_mol * delta_time, spawn_temp) O.assume_air(merger) /obj/machinery/atmospherics/miner/attack_ai(mob/living/silicon/user) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 9a3abdb16c5..74cac69ed1b 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -34,7 +34,7 @@ /obj/machinery/atmospherics/pipe/layer_manifold/proc/nullify_all_nodes() for(var/obj/machinery/atmospherics/node in nodes) node.disconnect(src) - SSair.add_to_rebuild_queue(node) + SSzas.add_to_rebuild_queue(node) front_nodes = null back_nodes = null nodes = list() diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 2f6d7d45297..f0fe7850ab3 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -33,7 +33,7 @@ var/obj/machinery/atmospherics/old_node = nodes[i] . = ..() if(old_node) - SSair.add_to_rebuild_queue(old_node) + SSzas.add_to_rebuild_queue(old_node) /obj/machinery/atmospherics/pipe/destroy_network() QDEL_NULL(parent) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 26dfe3e8651..72945fca32a 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -57,18 +57,33 @@ excited = TRUE + var/pressure_delta + var/output_volume + var/air_temperature var/turf/local_turf = get_turf(src) - var/datum/gas_mixture/sending - var/datum/gas_mixture/receiving - if(direction == PUMP_OUT) // Hook up the internal pump. - sending = (holding ? holding.return_air() : air_contents) - receiving = (holding ? air_contents : local_turf.return_air()) + var/datum/gas_mixture/environment + if(holding) + environment = holding.air_contents + else + environment = loc.return_air() + + if(direction == PUMP_OUT) + pressure_delta = target_pressure - environment.return_pressure() + output_volume = environment.volume * environment.group_multiplier + air_temperature = environment.temperature? environment.temperature : air_contents.temperature else - sending = (holding ? air_contents : local_turf.return_air()) - receiving = (holding ? holding.return_air() : air_contents) + pressure_delta = environment.return_pressure() - target_pressure + output_volume = air_contents.volume * air_contents.group_multiplier + air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature + + var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) - if(sending.pump_gas_to(receiving, target_pressure) && !holding) - //air_update_turf(FALSE, FALSE) // Update the environment if needed. + if (pressure_delta > 0.01) + if (direction == PUMP_OUT) + pump_gas(src, air_contents, environment, transfer_moles) + else + pump_gas(src, environment, air_contents, transfer_moles) + //air_update_turf(FALSE, FALSE) // Update the environment if needed. return ..() @@ -81,7 +96,7 @@ if(prob(50 / severity)) on = !on if(on) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) if(prob(100 / severity)) direction = PUMP_OUT target_pressure = rand(0, 100 * ONE_ATMOSPHERE) @@ -132,10 +147,10 @@ if("power") on = !on if(on) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) if(on && !holding) - var/plasma = air_contents.gases[/datum/gas/plasma] - var/n2o = air_contents.gases[/datum/gas/nitrous_oxide] + var/plasma = air_contents.get_gas(GAS_PLASMA) + var/n2o = air_contents.get_gas(GAS_N2O) if(n2o || plasma) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index bbf6ed311c1..049e69d4ce3 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -17,6 +17,7 @@ var/overpressure_m = 80 ///Should the machine use overlay in update_overlays() when open/close? var/use_overlays = TRUE + var/power_rating = 7500 ///List of gases that can be scrubbed var/list/scrubbing = list( /datum/gas/plasma, @@ -82,24 +83,18 @@ if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) return - var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles() + var/transfer_moles = min(1, volume_rate/mixture.volume)*mixture.total_moles - var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. + var/datum/gas_mixture/gas2scrub = mixture.remove(transfer_moles) // Remove part of the mixture to filter. var/datum/gas_mixture/filtered = new - if(!filtering) + if(!scrubbing) return - filtered.temperature = filtering.temperature - for(var/gas in filtering.gases & scrubbing) - filtered.add_gas(gas) - filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. - filtering.gases[gas][MOLES] = 0 - filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. - - air_contents.merge(filtered) // Store filtered out gasses. - mixture.merge(filtering) // Returned the cleaned gas. + scrub_gas(scrubbing, gas2scrub, air_contents, transfer_moles, power_rating) + /* if(!holding) - //air_update_turf(FALSE, FALSE) + air_update_turf(FALSE, FALSE) + */ /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) . = ..() @@ -109,7 +104,7 @@ if(prob(50 / severity)) on = !on if(on) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() /obj/machinery/portable_atmospherics/scrubber/ui_interact(mob/user, datum/tgui/ui) @@ -126,9 +121,8 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - data["filter_types"] += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in scrubbing))) + for(var/gas_id in GLOB.common_gases) + data["filter_types"] += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in scrubbing))) if(holding) data["holding"] = list() @@ -158,14 +152,14 @@ if("power") on = !on if(on) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) . = TRUE if("eject") if(holding) replace_tank(usr, FALSE) . = TRUE if("toggle_filter") - scrubbing ^= gas_id2path(params["val"]) + scrubbing ^= params["val"] . = TRUE update_appearance() @@ -179,6 +173,7 @@ anchored = TRUE active_power_usage = 500 idle_power_usage = 10 + power_rating = 100000 overpressure_m = 200 volume_rate = 1500 @@ -208,9 +203,7 @@ excited = TRUE if(!holding) - var/turf/T = get_turf(src) - for(var/turf/AT in T.get_atmos_adjacent_turfs(alldir = TRUE)) - scrub(AT.return_air()) + scrub(get_turf(src).return_air()) return ..() diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 71d04598086..077f8abd42a 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -10,24 +10,6 @@ . = ..() return . && (REVERSE_DIR(border_dir) == dir || get_turf(mover) == get_turf(src)) - -/obj/effect/wind - name = "wind effect" - desc = "Creates pressure effect in it's direction. Use sparingly." - icon = 'icons/effects/mapping_helpers.dmi' - icon_state = "field_dir" - invisibility = INVISIBILITY_MAXIMUM - var/strength = 30 - -/obj/effect/wind/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj,src) - -/obj/effect/wind/process() - var/turf/open/T = get_turf(src) - if(istype(T)) - T.consider_pressure_difference(get_step(T,dir),strength) - //Keep these rare due to cost of doing these checks /obj/effect/path_blocker name = "magic barrier" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 422082a060f..885aa0b1a12 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -106,30 +106,12 @@ var/obj/machinery/portable_atmospherics/canister/C = O var/worth = cost var/datum/gas_mixture/canister_mix = C.return_air() - var/canister_gas = canister_mix.gases - var/list/gases_to_check = list( - /datum/gas/bz, - /datum/gas/nitrium, - /datum/gas/hypernoblium, - /datum/gas/miasma, - /datum/gas/tritium, - /datum/gas/pluoxium, - /datum/gas/freon, - /datum/gas/hydrogen, - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/zauker, - /datum/gas/helium, - /datum/gas/antinoblium, - /datum/gas/halon, - ) + var/list/gases_to_check = GLOB.all_gases for(var/gasID in gases_to_check) - canister_mix.assert_gas(gasID) - if(canister_gas[gasID][MOLES] > 0) - worth += get_gas_value(gasID, canister_gas[gasID][MOLES]) + if(canister_mix.get_gas(gasID) > 0) + worth += get_gas_value(gasID, canister_gas.get_gas(gasID)) - canister_mix.garbage_collect() return worth /datum/export/large/gas_canister/proc/get_gas_value(datum/gas/gasType, moles) diff --git a/tgstation.dme b/tgstation.dme index ef7f70abfe1..ec89a81aa47 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -194,6 +194,7 @@ #include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\atmospherics\atmos_piping.dm" +#include "code\__DEFINES\atmospherics\temperature.dm" #include "code\__DEFINES\atmospherics\ZAS.dm" #include "code\__DEFINES\atmospherics\ZAS_math.dm" #include "code\__DEFINES\dcs\flags.dm" @@ -553,6 +554,7 @@ #include "code\controllers\subsystem\processing\quirks.dm" #include "code\controllers\subsystem\processing\reagents.dm" #include "code\controllers\subsystem\processing\singulo.dm" +#include "code\controllers\subsystem\processing\temperature.dm" #include "code\controllers\subsystem\processing\station.dm" #include "code\controllers\subsystem\processing\tramprocess.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" @@ -2323,7 +2325,7 @@ #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\bluespace_sender.dm" +//#include "code\modules\atmospherics\machinery\components\unary_devices\bluespace_sender.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" @@ -2339,6 +2341,7 @@ #include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" #include "code\modules\atmospherics\machinery\pipes\mapping.dm" #include "code\modules\atmospherics\machinery\pipes\multiz.dm" +#include "code\modules\atmospherics\ZAS\Temperature.dm" #include "code\modules\atmospherics\ZAS\atmos_primitives.dm" #include "code\modules\atmospherics\machinery\pipes\pipes.dm" #include "code\modules\atmospherics\machinery\pipes\smart.dm" From dd47faf7783d1a92cb3edf06bbaa84c0df649a43 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 15 Apr 2022 18:13:04 -0400 Subject: [PATCH 005/200] Gonna pull the trigger soon --- code/__DEFINES/atmospherics/ZAS.dm | 13 ++++ code/datums/mutations/actions.dm | 3 +- code/game/objects/effects/mines.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 6 +- .../items/devices/scanners/gas_analyzer.dm | 2 +- code/game/objects/structures/aliens.dm | 6 +- code/game/objects/structures/bonfire.dm | 6 +- .../crates_lockers/closets/bodybag.dm | 5 +- code/game/objects/structures/mineral_doors.dm | 2 + code/game/objects/structures/plasticflaps.dm | 4 +- .../transit_tubes/transit_tube_pod.dm | 5 +- .../objects/structures/windoor_assembly.dm | 4 +- code/game/turfs/change_turf.dm | 66 ++++++++++++++----- code/game/turfs/closed/_closed.dm | 3 +- code/game/turfs/closed/wall/mineral_walls.dm | 2 +- code/game/turfs/closed/walls.dm | 2 +- code/modules/admin/verbs/fix_air.dm | 17 +++-- code/modules/atmospherics/ZAS/Turf.dm | 2 + code/modules/atmospherics/ZAS/XGM/gas_data.dm | 10 +++ .../atmospherics/machinery/airalarm.dm | 1 - code/modules/cargo/bounties/engineering.dm | 4 +- code/modules/cargo/exports/large_objects.dm | 6 +- code/modules/cargo/packs.dm | 13 ++-- code/modules/unit_tests/gas_transfer.dm | 13 ++-- 24 files changed, 127 insertions(+), 72 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 364158806bf..326f7f63016 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -198,6 +198,19 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) #define ZONE_ACTIVE 1 #define ZONE_SLEEPING 0 +//OPEN TURF ATMOS +/// the default air mix that open turfs spawn +#define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN=MOLESO2ATMOS, GAS_NITROGEN=MOLESN2ATMOS) +//#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" +/// -193,15°C telecommunications. also used for xenobiology slime killrooms +//#define TCOMMS_ATMOS "n2=100;TEMP=80" +/// space +#define AIRLESS_ATMOS list() +/// -93.15°C snow and ice turfs +//#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" +/// -14°C kitchen coldroom, just might loss your tail; higher amount of mol to reach about 101.3 kpA +//#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" + // Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) #define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it #define ATMOSTANK_OXYGEN 50000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 8096870697e..5367666877e 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -41,6 +41,7 @@ /obj/effect/proc_holder/spell/targeted/olfaction/cast(list/targets, mob/living/user = usr) //can we sniff? is there miasma in the air? + /* var/datum/gas_mixture/air = user.loc.return_air() var/list/cached_gases = air.gases @@ -48,7 +49,7 @@ user.adjust_disgust(sensitivity * 45) to_chat(user, span_warning("With your overly sensitive nose, you get a whiff of stench and feel sick! Try moving to a cleaner area!")) return - + */. var/atom/sniffed = user.get_active_held_item() if(sniffed) var/old_target = tracking_target diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 0faa180d74f..957717fa2d5 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -113,7 +113,9 @@ var/gas_type = "o2" /obj/effect/mine/gas/mineEffect(mob/victim) - atmos_spawn_air("[gas_type]=[gas_amount]") + if(isopenturf(loc)) + var/turf/open/openloc = loc + openloc.atmos_spawn_air(gas_type, gas_amount) /obj/effect/mine/gas/plasma diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index a2ef23449fc..f91cba16e89 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "Unable to obtain a reading.<br>" else var/datum/gas_mixture/environment = T.return_air() - var/list/env_gases = environment.gases + var/list/env_gases = environment.get_gases() var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() @@ -456,9 +456,9 @@ GLOBAL_LIST_EMPTY(PDAs) if (total_moles) for(var/id in env_gases) - var/gas_level = env_gases[id][MOLES]/total_moles + var/gas_level = environment.get_gas(id)/total_moles if(gas_level > 0) - dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100, 0.01)]%<br>" + dat += "[env_gases[id]]: [round(gas_level*100, 0.01)]%<br>" dat += "Temperature: [round(environment.temperature-T0C)]°C<br>" dat += "<br>" diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 997d0da6585..3f2f88e3f6c 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -160,7 +160,7 @@ var/list/cached_gases = air.gas for(var/id in cached_gases) - var/gas_concentration = air.get_total_moles(gas_id)/total_moles + var/gas_concentration = air.get_gas(id)/total_moles message += span_notice("[id]: [round(air.get_gas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d025218944f..07c969e0739 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -73,12 +73,12 @@ /obj/structure/alien/resin/Destroy() //air_update_turf(TRUE, FALSE) . = ..() - +/* /obj/structure/alien/resin/Move() var/turf/T = loc . = ..() move_update_air(T) - +*/ /obj/structure/alien/resin/wall name = "resin wall" desc = "Thick resin solidified into a wall." @@ -202,7 +202,7 @@ qdel(src) return //lets try to grow in a direction - for(var/turf/check_turf in src_turf.get_atmos_adjacent_turfs()) + for(var/turf/check_turf in src_turf.get_adjacent_open_turfs()) //we cannot grow on blacklisted turfs if(is_type_in_list(check_turf, blacklisted_turfs)) continue diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 6bfb760817f..916c42c01e8 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -98,9 +98,9 @@ /obj/structure/bonfire/proc/check_oxygen() if(isopenturf(loc)) var/turf/open/bonfire_turf = loc - if(bonfire_turf.air) - var/loc_gases = bonfire_turf.air.gases - if(loc_gases[/datum/gas/oxygen] && loc_gases[/datum/gas/oxygen][MOLES] >= 5) + var/datum/gas_mixture/local_gas = bonfire_turf.return_air() + if(local_gas) + if(local_gas.has_gas(GAS_OXYGEN, 5)) return TRUE return FALSE diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 8aa3ce169af..9ee3e118680 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -325,9 +325,8 @@ air_contents = new(50) //liters air_contents.temperature = T20C - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + air_contents.adjust_gas(GAS_OXYGEN, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjust_gas(GAS_N2O, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /obj/structure/closet/body_bag/environmental/prisoner/syndicate/Destroy() if(air_contents) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 1f49ac6602a..5b255b11866 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -43,8 +43,10 @@ /obj/structure/mineral_door/Move() var/turf/T = loc . = ..() + /* if(!door_opened) move_update_air(T) + */ /obj/structure/mineral_door/Bumped(atom/movable/AM) ..() diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 7de6274d8e1..cab6be77908 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -115,8 +115,10 @@ . = ..() //air_update_turf(TRUE, TRUE) +/* /obj/structure/plasticflaps/Destroy() var/atom/oldloc = loc . = ..() if (oldloc) - oldloc.//air_update_turf(TRUE, FALSE) + oldloc./air_update_turf(TRUE, FALSE) +*/ diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 1d1d5028d00..d26ff609d11 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -14,9 +14,8 @@ /obj/structure/transit_tube_pod/Initialize(mapload) . = ..() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD - air_contents.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD + air_contents.adjust_gas(GAS_OXYGEN, MOLES_O2STANDARD) + air_contents.adjust_gas(GAS_NITROGEN, MOLES_N2STANDARD) air_contents.temperature = T20C /obj/structure/transit_tube_pod/Destroy() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index ef5b5541cd5..7354b182b93 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -46,12 +46,12 @@ set_density(FALSE) //air_update_turf(TRUE, FALSE) return ..() - +/* /obj/structure/windoor_assembly/Move() var/turf/T = loc . = ..() move_update_air(T) - +*/ /obj/structure/windoor_assembly/update_icon_state() icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" return ..() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 544ee271a55..1671adb019a 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,8 +15,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - SSair.remove_from_active(newT) - CALCULATE_ADJACENT_TURFS(newT, KILL_EXCITED) + SSzas.mark_for_update(newT) + //CALCULATE_ADJACENT_TURFS(newT, KILL_EXCITED) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -82,6 +82,15 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_bp = blueprint_data blueprint_data = null + if(connections) connections.erase_all() + + if(istype(src,/turf/simulated)) + //Yeah, we're just going to rebuild the whole thing. + //Despite this being called a bunch during explosions, + //the zone will only really do heavy lifting once. + var/turf/simulated/S = src + if(S.zone) S.zone.rebuild() + var/list/old_baseturfs = baseturfs var/old_type = type @@ -95,6 +104,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/old_signal_procs = signal_procs?.Copy() var/turf/W = new path(src) + SSzas.mark_for_update(src) //handle the addition of the new turf. + // WARNING WARNING // Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS // It's possible because turfs are fucked, and if you have one in a list and it's replaced with another one, the list ref points to the new turf @@ -150,32 +161,22 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( return W +/* /turf/open/ChangeTurf(path, list/new_baseturfs, flags) //Resist the temptation to make this default to keeping air. if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) var/datum/gas_mixture/stashed_air = new() stashed_air.copy_from(air) - var/stashed_state = excited - var/datum/excited_group/stashed_group = excited_group . = ..() //If path == type this will return us, don't bank on making a new type if (!.) // changeturf failed or didn't do anything return var/turf/open/newTurf = . newTurf.air.copy_from(stashed_air) - newTurf.excited = stashed_state - newTurf.excited_group = stashed_group - #ifdef VISUALIZE_ACTIVE_TURFS - if(stashed_state) - newTurf.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) - #endif - if(stashed_group) - if(stashed_group.should_display || SSair.display_all_groups) - stashed_group.display_turf(newTurf) + SSzas.mark_for_update(newTurf) else - SSair.remove_from_active(src) //Clean up wall excitement, and refresh excited groups if(ispath(path,/turf/closed) || ispath(path,/turf/cordon)) flags |= CHANGETURF_RECALC_ADJACENT return ..() - +*/ /// Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) if(!amount) @@ -296,12 +297,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags, oldType) //called after a turf has been replaced in ChangeTurf() levelupdate() - if(flags & CHANGETURF_RECALC_ADJACENT) + /*if(flags & CHANGETURF_RECALC_ADJACENT) immediate_calculate_adjacent_turfs() if(ispath(oldType, /turf/closed) && istype(src, /turf/open)) SSair.add_to_active(src) else //In effect, I want closed turfs to make their tile active when sheered, but we need to queue it since they have no adjacent turfs - CALCULATE_ADJACENT_TURFS(src, (!(ispath(oldType, /turf/closed) && istype(src, /turf/open)) ? NORMAL_TURF : MAKE_ACTIVE)) + CALCULATE_ADJACENT_TURFS(src, (!(ispath(oldType, /turf/closed) && istype(src, /turf/open)) ? NORMAL_TURF : MAKE_ACTIVE))*/ //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src for(var/I in turfs_to_check) @@ -318,6 +319,35 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( Assimilate_Air() //////Assimilate Air////// +/turf/open/proc/Assimilate_Air() + var/list/turf/turf_list = get_adjacent_open_turfs() + var/turf_count = LAZYLEN(turf_list) + if(blocks_air || !turf_count) + return + var/datum/gas_mixture/total = new + var/list/total_gases = total.gas + turf_list += src + turf_count += 1 + var/energy = 0 + var/heat_cap = 0 + for(var/turf/T in turf_list) + var/datum/gas_mixture/turf_mix = T.air + var/capacity = turf_mix.heat_capacity() + energy += turf_mix.temperature * capacity + heat_cap += capacity + + var/list/giver_gases = turf_mix.gas + for(var/giver_id in giver_gases) + total_gases[giver_id] = giver_gases[giver_id] + + total.temperature = energy / heat_cap + for(var/id in total_gases) + total_gases[id] /= turf_count + + for(var/turf/T as anything in turf_list) + T.air.copy_from(total) + SSzas.mark_for_update(T) +/* /turf/open/proc/Assimilate_Air() var/turf_count = LAZYLEN(atmos_adjacent_turfs) if(blocks_air || !turf_count) //if there weren't any open turfs, no need to update. @@ -355,7 +385,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( T.air.copy_from(total) T.update_visuals() SSair.add_to_active(T) - +*/ /turf/proc/ReplaceWithLattice() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) new /obj/structure/lattice(locate(x, y, z)) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 7555793bb0c..ab242277f66 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -6,10 +6,11 @@ blocks_air = TRUE rad_insulation = RAD_MEDIUM_INSULATION pass_flags_self = PASSCLOSEDTURF - +/* /turf/closed/AfterChange() . = ..() SSair.high_pressure_delta -= src +*/ /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 67fc5685339..cff9015aa77 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -128,7 +128,7 @@ icon_state = "plasma_wall-0" base_icon_state = "plasma_wall" sheet_type = /obj/item/stack/sheet/mineral/plasma - thermal_conductivity = 0.04 + //thermal_conductivity = 0.04 smoothing_flags = SMOOTH_BITMASK smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS) canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 956fd09768b..d6cfdd3e1b6 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -10,7 +10,7 @@ thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 62500 //a little over 5 cm thick , 62500 for 1 m by 2.5 m by 0.25 m iron wall. also indicates the temperature at wich the wall will melt (currently only able to melt with H/E pipes) - + blocks_air = TRUE baseturfs = /turf/open/floor/plating flags_ricochet = RICOCHET_HARD diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 67f0f737e03..2faf3321614 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -9,19 +9,18 @@ return log_admin("Full atmosphere reset initiated by [usr].") - to_world("<span class = 'danger'>Initiating restart of atmosphere. The server may lag a bit.</span>") + to_chat(world, "<span class = 'danger'>Initiating restart of atmosphere. The server may lag a bit.</span>") sleep(10) var/current_time = world.timeofday // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) S.power = 0 to_chat(usr, "\[1/5\] - Supermatter depowered") // Remove all gases from all pipenets - for(var/net in SSmachines.pipenets) - var/datum/pipe_network/PN = net - for(var/datum/gas_mixture/G in PN.gases) + for(var/datum/pipeline/PN as anything in SSzas.networks) + for(var/datum/gas_mixture/G in PN.air & PN.other_airs) G.gas = list() G.update_values() @@ -34,8 +33,8 @@ to_chat(usr, "\[3/5\] - All ZAS Zones removed.") var/list/unsorted_overlays = list() - for(var/id in gas_data.tile_overlay) - unsorted_overlays |= gas_data.tile_overlay[id] + for(var/id in xgm_gas_data.tile_overlay) + unsorted_overlays |= xgm_gas_data.tile_overlay[id] for(var/turf/simulated/T in world) T.air = null @@ -44,7 +43,7 @@ to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") - SSair.reboot() + SSzas.Reboot() to_chat(usr, "\[5/5\] - ZAS Rebooted") - to_world("<span class = 'danger'>Atmosphere restart completed in <b>[(world.timeofday - current_time)/10]</b> seconds.</span>") + to_chat(world, "<span class = 'danger'>Atmosphere restart completed in <b>[(world.timeofday - current_time)/10]</b> seconds.</span>") diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 5ae5dade602..54c3b091f3c 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -7,6 +7,8 @@ var/datum/gas_mixture/air var/list/initial_gas var/heat_capacity = 1 + var/thermal_conductivity = 0.05 + var/list/initial_gas_mix /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 0906a8623b8..64885c3c810 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -31,6 +31,11 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) var/list/symbol_html = list() var/list/symbol = list() + //Base sell values + var/list/base_value = list() + //Purchasable? + var/list/purchaseable = list() + /datum/xgm_gas var/id = "" var/name = "Unnamed Gas" @@ -49,6 +54,8 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) var/hidden_from_codex var/symbol_html = "X" var/symbol = "X" + var/base_value = 1 + var/purchaseable = FALSE /datum/xgm_gas_data/New() for(var/p in subtypesof(/datum/xgm_gas)) @@ -78,6 +85,9 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) xgm_gas_data.breathed_product[gas.id] = gas.breathed_product xgm_gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + xgm_gas_data.base_value[gas.id] = gas.base_value + xgm_gas_data.purchaseable[gas.id] = gas.purchaseable + return 1 /obj/effect/gas_overlay diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index c82ce10a04c..61edb735bfd 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -916,7 +916,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/datum/port/input/request_data var/datum/port/output/pressure - var/datum/port/output/temperature var/datum/port/output/gas_amount var/obj/machinery/airalarm/connected_alarm diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index c3216543b63..258133aea57 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -11,9 +11,9 @@ return FALSE var/obj/item/tank/T = O var/datum/gas_mixture/our_mix = T.return_air() - if(!our_mix.gases[gas_type]) + if(!our_mix.get_gas(gas_type)) return FALSE - return our_mix.gases[gas_type][MOLES] >= moles_required + return our_mix.get_gas(gas_type) >= moles_required /datum/bounty/item/engineering/gas/nitrium_tank name = "Full Tank of Nitrium" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 885aa0b1a12..e26ec5efd3a 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -110,10 +110,10 @@ for(var/gasID in gases_to_check) if(canister_mix.get_gas(gasID) > 0) - worth += get_gas_value(gasID, canister_gas.get_gas(gasID)) + worth += get_gas_value(gasID, canister_mix.get_gas(gasID)) return worth -/datum/export/large/gas_canister/proc/get_gas_value(datum/gas/gasType, moles) - var/baseValue = initial(gasType.base_value) +/datum/export/large/gas_canister/proc/get_gas_value(gastype, moles) + var/baseValue = xgm_gas_data.base_value[gastype] return round((baseValue/k_elasticity) * (1 - NUM_E**(-1 * k_elasticity * moles))) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index d7a31b3ace2..7370fbc4fb5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1111,25 +1111,24 @@ // This is the amount of moles in a default canister var/moleCount = (initial(fakeCanister.maximum_pressure) * initial(fakeCanister.filled)) * initial(fakeCanister.volume) / (R_IDEAL_GAS_EQUATION * T20C) - for(var/gasType in GLOB.meta_gas_info) - var/datum/gas/gas = gasType - var/name = initial(gas.name) - if(!initial(gas.purchaseable)) + for(var/gasType in xgm_gas_data.gases) + var/name = xgm_gas_data.name[gasType] + if(!xgm_gas_data.purchaseable[gasType]) continue var/datum/supply_pack/materials/pack = new pack.name = "[name] Canister" pack.desc = "Contains a canister of [name]." - if(initial(gas.dangerous)) + if(xgm_gas_data.flags[gasType] & XGM_GAS_FUEL) pack.desc = "[pack.desc] Requires Atmospherics access to open." pack.access = ACCESS_ATMOSPHERICS pack.access_view = ACCESS_ATMOSPHERICS pack.crate_name = "[name] canister crate" pack.id = "[type]([name])" - pack.cost = cost + moleCount * initial(gas.base_value) * 1.6 + pack.cost = cost + moleCount * xgm_gas_data.base_value[gasType] * 1.6 pack.cost = CEILING(pack.cost, 10) - pack.contains = list(GLOB.gas_id_to_canister[initial(gas.id)]) + pack.contains = list(GLOB.gas_id_to_canister[gasType]) pack.crate_type = crate_type diff --git a/code/modules/unit_tests/gas_transfer.dm b/code/modules/unit_tests/gas_transfer.dm index 32f973d7244..097a9a5efdb 100644 --- a/code/modules/unit_tests/gas_transfer.dm +++ b/code/modules/unit_tests/gas_transfer.dm @@ -8,24 +8,21 @@ first_mix.volume = 200 second_mix.volume = 200 - - ASSERT_GAS(/datum/gas/hypernoblium, first_mix) - ASSERT_GAS(/datum/gas/tritium, second_mix) - first_mix.gases[/datum/gas/hypernoblium][MOLES] = tempNmoles - second_mix.gases[/datum/gas/tritium][MOLES] = 200 + first_mix.adjust_gas(GAS_OXYGEN, tempNmoles) + second_mix.adjust_gas(GAS_NITROGEN, 200) first_mix.temperature = tempNmoles second_mix.temperature = T20C var/initial_pressure = second_mix.return_pressure() // A constant value would be nicer but there will be cases when even MOLAR_ACCURACY amounts would far exceed the pressure so we need to scale it somewhat. var/additional_pressure = (tempNmoles / 1000) + 500 - + /* ERROR MARGIN CALCULATION * We calculate how much would the pressure change if MOLAR_ACCURACY amount of hothotgas is imparted on the cold mix. * This number gets really big for very high temperatures so it's somewhat meaningless, but our main goal is to ensure the code doesn't break. - */ + */ var/error_margin = first_mix.gas_pressure_minimum_transfer(second_mix) - initial_pressure - + first_mix.pump_gas_to(second_mix, (initial_pressure + additional_pressure)) var/margin = abs(second_mix.return_pressure() - (initial_pressure+additional_pressure)) From ed898121239309dd976f937be1b8f60ee662d9bb Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 17 Apr 2022 17:45:33 -0400 Subject: [PATCH 006/200] Co-authored-by: Gallyus <francinum@users.noreply.github.com> --- code/__DEFINES/atmospherics/ZAS.dm | 49 ++------ code/__DEFINES/atmospherics/atmos_helpers.dm | 5 +- .../atmospherics/atmos_mapping_helpers.dm | 4 +- code/__HELPERS/zas.dm | 27 +++++ .../subsystem/processing/processing.dm | 2 +- code/datums/components/crafting/recipes.dm | 19 +-- .../circuitboards/machine_circuitboards.dm | 109 +++++++++--------- .../objects/items/grenades/atmos_grenades.dm | 7 +- code/game/turfs/closed/minerals.dm | 16 +-- code/game/turfs/open/_open.dm | 5 +- code/game/turfs/open/asteroid.dm | 4 +- code/game/turfs/open/floor/fancy_floor.dm | 2 +- code/game/turfs/open/floor/iron_floor.dm | 12 +- code/game/turfs/open/floor/misc_floor.dm | 5 +- .../turfs/open/floor/plating/misc_plating.dm | 2 +- code/game/turfs/open/floor/reinf_floor.dm | 23 ++-- code/game/turfs/open/ice.dm | 2 +- code/game/turfs/open/snow.dm | 2 +- code/game/turfs/open/space/space.dm | 4 +- code/game/turfs/turf.dm | 1 - .../traitor/equipment/Malf_Modules.dm | 12 +- code/modules/atmospherics/ZAS/Turf.dm | 6 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 2 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 19 +++ .../environmental/LINDA_system.dm | 2 +- .../atmospherics/machinery/components/tank.dm | 2 +- .../machinery/portable/canister.dm | 62 +++++----- .../machinery/portable/scrubber.dm | 3 +- .../awaymissions/mission_code/snowdin.dm | 4 +- code/modules/clothing/masks/gas_filter.dm | 49 +++----- code/modules/clothing/under/accessories.dm | 3 +- code/modules/events/spacevine.dm | 20 ++-- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/holodeck/area_copy.dm | 3 +- code/modules/holodeck/turfs.dm | 4 +- code/modules/mapping/map_template.dm | 2 +- code/modules/mob/camera/camera.dm | 4 +- code/modules/mob/living/carbon/alien/life.dm | 16 +-- .../carbon/human/species_types/plasmamen.dm | 8 +- code/modules/mob/living/carbon/life.dm | 28 ++--- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 4 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../mob/living/simple_animal/bot/firebot.dm | 2 +- .../mob/living/simple_animal/hostile/tree.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 13 +-- .../mob/living/simple_animal/slime/life.dm | 4 +- code/modules/mob/mob.dm | 7 +- code/modules/mod/modules/modules_timeline.dm | 5 +- .../file_system/programs/atmosscan.dm | 4 +- code/modules/power/generator.dm | 4 +- .../projectile/bullets/revolver.dm | 2 +- code/modules/reagents/chem_splash.dm | 4 +- .../research/ordnance/tank_compressor.dm | 10 +- code/modules/shuttle/on_move.dm | 2 +- code/modules/vehicles/mecha/_mecha.dm | 4 +- tgstation.dme | 1 + 57 files changed, 320 insertions(+), 309 deletions(-) create mode 100644 code/__HELPERS/zas.dm diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 326f7f63016..95bb23b2daf 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -200,9 +200,11 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) //OPEN TURF ATMOS /// the default air mix that open turfs spawn -#define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN=MOLESO2ATMOS, GAS_NITROGEN=MOLESN2ATMOS) +#define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN = MOLES_O2ATMOS, GAS_NITROGEN=MOLES_N2ATMOS) +#define OPENTURF_LOW_PRESSURE list(GAS_OXYGEN = 14, GAS_NITROGEB = 30) //#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" /// -193,15°C telecommunications. also used for xenobiology slime killrooms +#define TCOMMS_ATMOS list(GAS_NITROGEN = 100) //#define TCOMMS_ATMOS "n2=100;TEMP=80" /// space #define AIRLESS_ATMOS list() @@ -212,14 +214,15 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) //#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" // Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) -#define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it -#define ATMOSTANK_OXYGEN 50000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. -#define ATMOSTANK_CO2 60000 // CO2 is used for the GUP, Charon, and Torch as the primary fuel propellant, and we need lots to stick around. -#define ATMOSTANK_PLASMA 25000 -#define ATMOSTANK_PLASMA_FUEL 15000 -#define ATMOSTANK_HYDROGEN 50000 -#define ATMOSTANK_HYDROGEN_FUEL 25000 -#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? +#define ATMOSTANK_NITROGEN list(GAS_NITROGEN = 90000) // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it +#define ATMOSTANK_OXYGEN list(GAS_OXYGEN = 50000) // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. +#define ATMOSTANK_CO2 list(GAS_CO2 = 60000) // CO2 is used for the GUP, Charon, and Torch as the primary fuel propellant, and we need lots to stick around. +#define ATMOSTANK_PLASMA list(GAS_PHORON = 25000) +#define ATMOSTANK_PLASMA_FUEL list(GAS_PHORON = 15000) +#define ATMOSTANK_HYDROGEN list(GAS_HYDROGEN = 50000) +#define ATMOSTANK_HYDROGEN_FUEL list(GAS_HYDROGEN = 25000) +#define ATMOSTANK_NITROUSOXIDE list(GAS_N2O = 10000) // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? +#define ATMOSTANK_AIRMIX list(GAS_OXYGEN = 2644, GAS_NITROGEN = 10580) #define MAX_PUMP_PRESSURE 15000 // Maximal pressure setting for pumps and vents #define MAX_OMNI_PRESSURE 15000 // Maximal output(s) pressure for omni devices (filters/mixers) @@ -264,31 +267,3 @@ GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir #define ATMOS_DEFAULT_VOLUME_FILTER 500 // L. #define ATMOS_DEFAULT_VOLUME_MIXER 500 // L. #define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. - -// heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ -/proc/heat2color(temp) - return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) - -/proc/heat2color_r(temp) - temp /= 100 - if(temp <= 66) - . = 255 - else - . = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592)) - -/proc/heat2color_g(temp) - temp /= 100 - if(temp <= 66) - . = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661)) - else - . = max(0, min(255, 288.1221695283 * ((temp - 60) ** -0.0755148492))) - -/proc/heat2color_b(temp) - temp /= 100 - if(temp >= 66) - . = 255 - else - if(temp <= 16) - . = 0 - else - . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307)) diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 20679527175..1ad834b85eb 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -31,7 +31,7 @@ #define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) ///Directly adds a gas to a gas mixture without checking for its presence beforehand, use only if is certain the absence of said gas -#define ADD_GAS(gas_id, out_list)\ +//#define ADD_GAS(gas_id, out_list)\ var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy(); ///Adds a gas to a gas mixture but checks if is already present, faster than the same proc @@ -57,9 +57,6 @@ GLOBAL_LIST_INIT(nonoverlaying_gases, typecache_of_gases_with_no_overlays()) var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY];\ out_var += _GAS_OVERLAY[min(TOTAL_VISIBLE_STATES, CEILING(_GAS[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))];\ } -#define GAS_OVERLAYS(gases, outvar)\ - out_var = list();\ - for(var/_ID in gases) #ifdef TESTING GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) #define CALCULATE_ADJACENT_TURFS(T, state) if (SSair.adjacent_rebuild[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSair.adjacent_rebuild[T] = state} diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm index 94517b21795..d84e3877269 100644 --- a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -1,4 +1,4 @@ -//OPEN TURF ATMOS +/*//OPEN TURF ATMOS /// the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" #define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" @@ -35,7 +35,7 @@ #define ATMOS_TANK_HELIUM "helium=100000;TEMP=293.15" #define ATMOS_TANK_ANTINOBLIUM "antinoblium=100000;TEMP=293.15" #define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" - +*/ //LAVALAND /// what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 diff --git a/code/__HELPERS/zas.dm b/code/__HELPERS/zas.dm new file mode 100644 index 00000000000..cf159d36c00 --- /dev/null +++ b/code/__HELPERS/zas.dm @@ -0,0 +1,27 @@ +// heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ +/proc/heat2color(temp) + return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) + +/proc/heat2color_r(temp) + temp /= 100 + if(temp <= 66) + . = 255 + else + . = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592)) + +/proc/heat2color_g(temp) + temp /= 100 + if(temp <= 66) + . = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661)) + else + . = max(0, min(255, 288.1221695283 * ((temp - 60) ** -0.0755148492))) + +/proc/heat2color_b(temp) + temp /= 100 + if(temp >= 66) + . = 255 + else + if(temp <= 16) + . = 0 + else + . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307)) diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 8d59e8318ea..665f4915f42 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -9,7 +9,7 @@ SUBSYSTEM_DEF(processing) var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() - var/const/process_proc = /datum/proc/Process //Francinum is going to KILL ME + var/const/process_proc = /datum/proc/process //Francinum is going to FUCK ME (Of course I will~) /datum/controller/subsystem/processing/stat_entry(msg) msg = "[stat_tag]:[length(processing)]" diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index b74eee0faf3..8354f718661 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1228,15 +1228,16 @@ ) category = CAT_MISC -/datum/crafting_recipe/bluespace_vendor_mount - name = "Bluespace Vendor Wall Mount" - result = /obj/item/wallframe/bluespace_vendor_mount - time = 6 SECONDS - reqs = list(/obj/item/stack/sheet/iron = 15, - /obj/item/stack/sheet/glass = 10, - /obj/item/stack/cable_coil = 10, - ) - category = CAT_MISC +//We'll fix you if we're forced to. Nobody will miss you. +// /datum/crafting_recipe/bluespace_vendor_mount +// name = "Bluespace Vendor Wall Mount" +// result = /obj/item/wallframe/bluespace_vendor_mount +// time = 6 SECONDS +// reqs = list(/obj/item/stack/sheet/iron = 15, +// /obj/item/stack/sheet/glass = 10, +// /obj/item/stack/cable_coil = 10, +// ) +// category = CAT_MISC /datum/crafting_recipe/shutters name = "Shutters" diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index a686a22745b..2c46da75401 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -288,60 +288,61 @@ . = ..() . += span_notice("It is set to layer [pipe_layer].") -/obj/item/circuitboard/machine/HFR_fuel_input - name = "HFR Fuel Input (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input - req_components = list( - /obj/item/stack/sheet/plasteel = 5) - -/obj/item/circuitboard/machine/HFR_waste_output - name = "HFR Waste Output (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output - req_components = list( - /obj/item/stack/sheet/plasteel = 5) - -/obj/item/circuitboard/machine/HFR_moderator_input - name = "HFR Moderator Input (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input - req_components = list( - /obj/item/stack/sheet/plasteel = 5) - -/obj/item/circuitboard/machine/HFR_core - name = "HFR core (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/unary/hypertorus/core - req_components = list( - /obj/item/stack/cable_coil = 10, - /obj/item/stack/sheet/glass = 10, - /obj/item/stack/sheet/plasteel = 10) - -/obj/item/circuitboard/machine/HFR_corner - name = "HFR Corner (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/hypertorus/corner - req_components = list( - /obj/item/stack/sheet/plasteel = 5) - -/obj/item/circuitboard/machine/HFR_interface - name = "HFR Interface (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/hypertorus/interface - req_components = list( - /obj/item/stack/cable_coil = 10, - /obj/item/stack/sheet/glass = 10, - /obj/item/stack/sheet/plasteel = 5) - -/obj/item/circuitboard/machine/crystallizer - name = "Crystallizer (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/binary/crystallizer - req_components = list( - /obj/item/stack/cable_coil = 10, - /obj/item/stack/sheet/glass = 10, - /obj/item/stack/sheet/plasteel = 5) +//FIXME: HYPERGARBAGE DONUT CREATION CODE +// /obj/item/circuitboard/machine/HFR_fuel_input +// name = "HFR Fuel Input (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input +// req_components = list( +// /obj/item/stack/sheet/plasteel = 5) + +// /obj/item/circuitboard/machine/HFR_waste_output +// name = "HFR Waste Output (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output +// req_components = list( +// /obj/item/stack/sheet/plasteel = 5) + +// /obj/item/circuitboard/machine/HFR_moderator_input +// name = "HFR Moderator Input (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input +// req_components = list( +// /obj/item/stack/sheet/plasteel = 5) + +// /obj/item/circuitboard/machine/HFR_core +// name = "HFR core (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/atmospherics/components/unary/hypertorus/core +// req_components = list( +// /obj/item/stack/cable_coil = 10, +// /obj/item/stack/sheet/glass = 10, +// /obj/item/stack/sheet/plasteel = 10) + +// /obj/item/circuitboard/machine/HFR_corner +// name = "HFR Corner (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/hypertorus/corner +// req_components = list( +// /obj/item/stack/sheet/plasteel = 5) + +// /obj/item/circuitboard/machine/HFR_interface +// name = "HFR Interface (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/hypertorus/interface +// req_components = list( +// /obj/item/stack/cable_coil = 10, +// /obj/item/stack/sheet/glass = 10, +// /obj/item/stack/sheet/plasteel = 5) + +// /obj/item/circuitboard/machine/crystallizer +// name = "Crystallizer (Machine Board)" +// greyscale_colors = CIRCUIT_COLOR_ENGINEERING +// build_path = /obj/machinery/atmospherics/components/binary/crystallizer +// req_components = list( +// /obj/item/stack/cable_coil = 10, +// /obj/item/stack/sheet/glass = 10, +// /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/bluespace_sender name = "Bluespace Sender (Machine Board)" diff --git a/code/game/objects/items/grenades/atmos_grenades.dm b/code/game/objects/items/grenades/atmos_grenades.dm index a17fe6e9e32..70df29ce9b6 100644 --- a/code/game/objects/items/grenades/atmos_grenades.dm +++ b/code/game/objects/items/grenades/atmos_grenades.dm @@ -39,7 +39,7 @@ playsound(src, 'sound/effects/spray2.ogg', 100, TRUE) var/list/connected_turfs = detect_room(origin = get_turf(src), max_size = fix_range) var/datum/gas_mixture/base_mix = new - base_mix.parse_gas_string(OPENTURF_DEFAULT_ATMOS) + base_mix.gas = OPENTURF_DEFAULT_ATMOS for(var/turf/open/turf_fix in connected_turfs) if(turf_fix.blocks_air) continue @@ -69,7 +69,7 @@ continue var/distance_from_center = max(get_dist(turf_loc, loc), 1) var/turf/open/floor_loc = turf_loc - floor_loc.atmos_spawn_air("n2=[n2_gas_amount / distance_from_center];o2=[o2_gas_amount / distance_from_center];TEMP=273") + //floor_loc.atmos_spawn_air("n2=[n2_gas_amount / distance_from_center];o2=[o2_gas_amount / distance_from_center];TEMP=273") floor_loc.atmos_spawn_air(GAS_NITROGEN, n2_gas_amount/distance_from_center, 273) floor_loc.atmos_spawn_air(GAS_OXYGEN, o2_gas_amount/distance_from_center, 273) qdel(src) @@ -95,7 +95,8 @@ continue var/distance_from_center = max(get_dist(turf_loc, loc), 1) var/turf/open/floor_loc = turf_loc - floor_loc.atmos_spawn_air("n2o=[n2o_gas_amount / distance_from_center];TEMP=273") + //floor_loc.atmos_spawn_air("n2o=[n2o_gas_amount / distance_from_center];TEMP=273") + floor_loc.atmos_spawn_air(GAS_N2O, n2o_gas_amount/distance_from_center, 273) qdel(src) /obj/item/grenade/gas_crystal/crystal_foam diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 1b9815b3827..001b8ff266d 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -134,7 +134,7 @@ var/turf/open/mined = ScrapeAway(null, flags) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction - mined.update_visuals() + //mined.update_visuals() /turf/closed/mineral/attack_animal(mob/living/simple_animal/user, list/modifiers) if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) @@ -357,7 +357,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas_mix = FROZEN_ATMOS + temperature = 180 defer_change = TRUE /turf/closed/mineral/uranium @@ -375,7 +375,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas_mix = FROZEN_ATMOS + temperature = 180 defer_change = TRUE /turf/closed/mineral/gold @@ -412,7 +412,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas_mix = FROZEN_ATMOS + temperature = 180 defer_change = TRUE /turf/closed/mineral/bananium @@ -463,7 +463,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) baseturfs = /turf/open/misc/asteroid/snow - initial_gas_mix = FROZEN_ATMOS + temperature = 180 turf_type = /turf/open/misc/asteroid/snow defer_change = TRUE @@ -601,7 +601,7 @@ flags = CHANGETURF_DEFER_CHANGE var/turf/open/mined = ScrapeAway(null, flags) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) - mined.update_visuals() + //mined.update_visuals() /turf/closed/mineral/gibtonite/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -616,7 +616,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas_mix = FROZEN_ATMOS + temperature = 180 defer_change = TRUE /turf/closed/mineral/gibtonite/ice/icemoon @@ -660,7 +660,7 @@ var/turf/open/mined = ScrapeAway(null, flags) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction - mined.update_visuals() + //mined.update_visuals() H.mind?.adjust_experience(/datum/skill/mining, 100) //yay! /turf/closed/mineral/strong/proc/drop_ores() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 32ee69b0d81..8adc73747e2 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -35,7 +35,7 @@ /turf/open/update_icon() . = ..() - update_visuals() + //update_visuals() /turf/open/indestructible name = "floor" @@ -160,7 +160,7 @@ icon_state = "bluespace" blocks_air = TRUE baseturfs = /turf/open/indestructible/airblock - +/* /turf/open/Initalize_Atmos(times_fired) excited = FALSE update_visuals() @@ -174,6 +174,7 @@ //testing("Active turf found. Return value of compare(): [is_active]") excited = TRUE SSair.active_turfs += src +*/ /turf/open/GetHeatCapacity() . = air.heat_capacity() diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 2a0769a1c24..0b5cff08629 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -158,7 +158,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) icon_state = "snow" base_icon_state = "snow" broken_state = "snow_dug" - initial_gas_mix = FROZEN_ATMOS + temperature = 180 slowdown = 2 flags_1 = NONE planetary_atmos = TRUE @@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) temperature = 180 /turf/open/misc/asteroid/snow/atmosphere - initial_gas_mix = FROZEN_ATMOS + temperature = 180 planetary_atmos = FALSE /turf/open/misc/asteroid/snow/standard_air diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index d0be8a5e753..9757cceb226 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -157,7 +157,7 @@ icon_state = "snow" flags_1 = NONE floor_tile = null - initial_gas_mix = FROZEN_ATMOS + temperature = 180 bullet_bounce_sound = null tiled_dirt = FALSE diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index cafd386c142..af4f1fa0772 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -31,10 +31,11 @@ /turf/open/floor/iron/telecomms initial_gas_mix = TCOMMS_ATMOS + temperature = 80 /turf/open/floor/iron/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS - + temperature = 80 /turf/open/floor/iron/edge icon_state = "floor_edge" base_icon_state = "floor_edge" @@ -150,7 +151,7 @@ /turf/open/floor/iron/dark/telecomms initial_gas_mix = TCOMMS_ATMOS - + temperature = 80 /turf/open/floor/iron/dark/side/airless initial_gas_mix = AIRLESS_ATMOS @@ -230,7 +231,7 @@ /turf/open/floor/iron/white/telecomms initial_gas_mix = TCOMMS_ATMOS - + temperature = 80 /turf/open/floor/iron/white/side/airless initial_gas_mix = AIRLESS_ATMOS @@ -306,10 +307,7 @@ /turf/open/floor/iron/kitchen_coldroom name = "cold room floor" - -/turf/open/floor/iron/kitchen_coldroom/Initialize(mapload) - initial_gas_mix = KITCHEN_COLDROOM_ATMOS - return ..() + temperature = COLD_ROOM_TEMP /turf/open/floor/iron/kitchen_coldroom/freezerfloor icon_state = "freezerfloor" diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index bb65ee31383..d92d26dd145 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -38,6 +38,7 @@ /turf/open/floor/circuit/telecomms initial_gas_mix = TCOMMS_ATMOS + temperature = 80 /turf/open/floor/circuit/telecomms/mainframe name = "mainframe base" @@ -65,6 +66,7 @@ /turf/open/floor/circuit/green/telecomms initial_gas_mix = TCOMMS_ATMOS + temperature = 80 /turf/open/floor/circuit/green/telecomms/mainframe name = "mainframe base" @@ -89,6 +91,7 @@ /turf/open/floor/circuit/red/telecomms initial_gas_mix = TCOMMS_ATMOS + temperature = 80 /turf/open/floor/pod name = "pod floor" @@ -213,7 +216,7 @@ AddElement(/datum/element/rust) /turf/open/floor/plating/plasma - initial_gas_mix = ATMOS_TANK_PLASMA + initial_gas_mix = ATMOSTANK_PLASMA /turf/open/floor/plating/plasma/rust/Initialize(mapload) . = ..() diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index cad8d5d3c35..e3e2ba87426 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -44,7 +44,7 @@ icon = 'icons/turf/snow.dmi' icon_state = "snowplating" base_icon_state = "snowplating" - initial_gas_mix = FROZEN_ATMOS + temperature = 180 temperature = 180 attachment_holes = FALSE planetary_atmos = TRUE diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm index b5c1c3cd71e..4b08509ec6c 100644 --- a/code/game/turfs/open/floor/reinf_floor.dm +++ b/code/game/turfs/open/floor/reinf_floor.dm @@ -100,26 +100,27 @@ /turf/open/floor/engine/n2o article = "an" name = "\improper N2O floor" - initial_gas_mix = ATMOS_TANK_N2O + initial_gas_mix = ATMOSTANK_NITROUSOXIDE /turf/open/floor/engine/co2 name = "\improper CO2 floor" - initial_gas_mix = ATMOS_TANK_CO2 + initial_gas_mix = ATMOSTANK_CO2 /turf/open/floor/engine/plasma name = "plasma floor" - initial_gas_mix = ATMOS_TANK_PLASMA + initial_gas_mix = ATMOSTANK_PLASMA /turf/open/floor/engine/o2 name = "\improper O2 floor" - initial_gas_mix = ATMOS_TANK_O2 + initial_gas_mix = ATMOSTANK_OXYGEN /turf/open/floor/engine/n2 article = "an" name = "\improper N2 floor" - initial_gas_mix = ATMOS_TANK_N2 + initial_gas_mix = ATMOSTANK_NITROGEN -/turf/open/floor/engine/bz + +/*/turf/open/floor/engine/bz name = "\improper BZ floor" initial_gas_mix = ATMOS_TANK_BZ @@ -134,12 +135,13 @@ /turf/open/floor/engine/healium name = "\improper Healium floor" initial_gas_mix = ATMOS_TANK_HEALIUM - +*/ /turf/open/floor/engine/h2 article = "an" name = "\improper H2 floor" - initial_gas_mix = ATMOS_TANK_H2 + initial_gas_mix = ATMOSTANK_HYDROGEN +/* /turf/open/floor/engine/hypernoblium name = "\improper Hypernoblium floor" initial_gas_mix = ATMOS_TANK_HYPERNOBLIUM @@ -180,10 +182,10 @@ /turf/open/floor/engine/antinoblium name = "\improper Antinoblium floor" initial_gas_mix = ATMOS_TANK_ANTINOBLIUM - +*/ /turf/open/floor/engine/air name = "air floor" - initial_gas_mix = ATMOS_TANK_AIRMIX + initial_gas_mix = ATMOSTANK_AIRMIX @@ -223,3 +225,4 @@ /turf/open/floor/engine/telecomms initial_gas_mix = TCOMMS_ATMOS + temperature = 80 diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index 4a9a55b53da..da29593d3a8 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -4,7 +4,7 @@ icon = 'icons/turf/floors/ice_turf.dmi' icon_state = "ice_turf-0" base_icon_state = "ice_turf-0" - initial_gas_mix = FROZEN_ATMOS + temperature = 180 temperature = 180 planetary_atmos = TRUE baseturfs = /turf/open/misc/ice diff --git a/code/game/turfs/open/snow.dm b/code/game/turfs/open/snow.dm index 4017240e3fd..66d1bfc571a 100644 --- a/code/game/turfs/open/snow.dm +++ b/code/game/turfs/open/snow.dm @@ -5,7 +5,7 @@ desc = "Looks cold." icon_state = "snow" planetary_atmos = TRUE - initial_gas_mix = FROZEN_ATMOS + temperature = 180 slowdown = 2 bullet_sizzle = TRUE footstep = FOOTSTEP_SAND diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 1a81515e940..866590ed64e 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -14,7 +14,7 @@ var/destination_y var/static/datum/gas_mixture/immutable/space/space_gas = new - run_later = TRUE + // run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 @@ -55,8 +55,10 @@ if(our_area.area_has_base_lighting && always_lit) //Only provide your own lighting if the area doesn't for you add_overlay(GLOB.fullbright_overlay) + /* if(requires_activation) SSair.add_to_active(src, TRUE) + */ if (light_system == STATIC_LIGHT && light_power && light_range) update_light() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e4f54355ada..64d4c935819 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -21,7 +21,6 @@ GLOBAL_LIST_EMPTY(station_turfs) // This shouldn't be modified directly, use the helper procs. var/list/baseturfs = /turf/baseturf_bottom - var/temperature = T20C ///Used for fire, if a melting temperature was reached, it will be destroyed var/to_be_destroyed = 0 ///The max temperature of the fire which it was subjected to diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index cb331aac9e8..9c84efd5524 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -29,12 +29,12 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/atmospherics/components/unary/portables_connector, /obj/machinery/atmospherics/components/unary/passive_vent, /obj/machinery/atmospherics/components/unary/heat_exchanger, - /obj/machinery/atmospherics/components/unary/hypertorus/core, - /obj/machinery/atmospherics/components/unary/hypertorus/waste_output, - /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input, - /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input, - /obj/machinery/hypertorus/interface, - /obj/machinery/hypertorus/corner, + // /obj/machinery/atmospherics/components/unary/hypertorus/core, + // /obj/machinery/atmospherics/components/unary/hypertorus/waste_output, + // /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input, + // /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input, + // /obj/machinery/hypertorus/interface, + // /obj/machinery/hypertorus/corner, /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/portable_atmospherics/canister, ))) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 54c3b091f3c..22f9e45529b 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -9,6 +9,10 @@ var/heat_capacity = 1 var/thermal_conductivity = 0.05 var/list/initial_gas_mix + var/planetary_atmos //Let's just let this exist for now. + +#warn !!TEMPORARY PROCDEF!! +/turf/open/proc/atmos_spawn_air(...) /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) @@ -300,7 +304,7 @@ air.copy_from(zone.air) air.group_multiplier = 1 -/turf/simulated/atmos_spawn_air(gas_id, amount, initial_temperature) +/turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) var/datum/gas_mixture/new_gas = new var/datum/gas_mixture/existing_gas = return_air() if(isnull(initial_temperature)) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index af3a25a5f84..ec311df2592 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -50,7 +50,7 @@ tile_color = "#ff9940" overlay_limit = 0.7 flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL - breathed_product = /datum/reagent/toxin/phoron + breathed_product = /datum/reagent/toxin/plasma symbol_html = "Ph" symbol = "Ph" diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 8dc8599de41..aa85da6b36f 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -495,3 +495,22 @@ /datum/gas_mixture/proc/leak_to_enviroment(datum/gas_mixture/environment) pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.return_pressure() - environment.return_pressure())) + +/** + * Takes the amount of the gas you want to PP as an argument + * So I don't have to do some hacky switches/defines/magic strings + * eg: + * Plas_PP = get_partial_pressure(gas_mixture.plasma) + * O2_PP = get_partial_pressure(gas_mixture.oxygen) + * get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp + * get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + * + * 10/20*5 = 2.5 + * 10 = 2.5/5*20 + */ + +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) + return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME +///inverse +/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) + return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 0a1ce419a2c..27fa67895fa 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -118,7 +118,7 @@ var/turf/local_turf = get_turf(loc) if(!local_turf) return - local_turf./air_update_turf(update, remove) + //local_turf.air_update_turf(update, remove) /** * A helper proc for dealing with atmos changes diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index b02041cd51c..8613c267306 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -190,7 +190,7 @@ continue node.atmos_init() node.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) update_parents() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index f25b5df5dc2..968dc8f08f0 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/filled = 0.5 ///Maximum pressure allowed on initialize inside the canister, multiplied by the filled var var/maximum_pressure = 90 * ONE_ATMOSPHERE - ///Stores the path of the gas for mapped canisters + ///Stores the id of the gas for mapped canisters var/gas_type ///Player controlled var that set the release pressure of the canister var/release_pressure = ONE_ATMOSPHERE @@ -100,8 +100,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) else create_gas() - if(ispath(gas_type, /datum/gas)) - desc = "[GLOB.meta_gas_info[gas_type][META_GAS_NAME]]. [GLOB.meta_gas_info[gas_type][META_GAS_DESC]]" + desc = "[xgm_gas_data.name[gas_type]]." update_window() @@ -272,7 +271,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) heat_limit = 1e12 pressure_limit = 1e14 mode = CANISTER_TIER_3 - +/* /obj/machinery/portable_atmospherics/canister/fusion_test/create_gas() air_contents.add_gases(/datum/gas/hydrogen, /datum/gas/tritium) air_contents.gases[/datum/gas/hydrogen][MOLES] = 300 @@ -285,12 +284,11 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) desc = "A mixture of N2O and Oxygen" greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9fba6c#3d4680" - +*/ /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - SSair.start_processing_machine(src) + air_contents.add(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.add(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + SSzas.start_processing_machine(src) /** * Getter for the amount of time left in the timer of prototype canisters @@ -363,17 +361,15 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(!gas_type) return - air_contents.add_gas(gas_type) if(starter_temp) air_contents.temperature = starter_temp - air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - SSair.start_processing_machine(src) + air_contents.add(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - SSair.start_processing_machine(src) + air_contents.add(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.add(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon_state() if(machine_stat & BROKEN) @@ -425,10 +421,10 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) cut_overlay(window) window = image(icon, icon_state="window-base", layer=FLOAT_LAYER) var/list/window_overlays = list() - for(var/visual in air_contents.return_visuals()) + /*for(var/visual in air_contents.return_visuals()) var/image/new_visual = image(visual, layer=FLOAT_LAYER) new_visual.filters = alpha_filter - window_overlays += new_visual + window_overlays += new_visual*/ window.overlays = window_overlays add_overlay(window) @@ -497,7 +493,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(!. || QDELETED(src)) return - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/atom_break(damage_flag) . = ..() @@ -547,10 +543,20 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) // Handle gas transfer. if(valve_open) var/turf/location = get_turf(src) - var/datum/gas_mixture/target_air = holding?.return_air() || location.return_air() - excited = TRUE + var/datum/gas_mixture/environment + if(holding) + environment = holding.air_contents + else + environment = location.return_air() + + var/env_pressure = environment.return_pressure() + var/pressure_delta = release_pressure - env_pressure + + if((air_contents.temperature > 0) && (pressure_delta > 0)) + var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) + transfer_moles = min(transfer_moles, (ATMOS_DEFAULT_VOLUME_PUMP/air_contents.volume)*air_contents.total_moles) //flow rate limit - if(air_contents.release_gas_to(target_air, release_pressure) && !holding) + var/returnval = pump_gas_passive(air_contents, environment, transfer_moles) //air_update_turf(FALSE, FALSE) var/our_pressure = air_contents.return_pressure() @@ -667,17 +673,15 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/n = 0 valve_open = !valve_open if(valve_open) - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) logmsg = "Valve was <b>opened</b> by [key_name(usr)], starting a transfer into \the [holding || "air"].<br>" if(!holding) var/list/gaseslog = list() //list for logging all gases in canister - for(var/id in air_contents.gases) - var/gas = air_contents.gases[id] - gaseslog[gas[GAS_META][META_GAS_NAME]] = gas[MOLES] //adds gases to gaseslog - if(!gas[GAS_META][META_GAS_DANGER]) + for(var/gas in air_contents.gas) + gaseslog[xgm_gas_data.name[gas]] = air_contents.get_gas(gas) //adds gases to gaseslog + if(!xgm_gas_data.flags[gas] & XGM_GAS_CONTAMINANT|XGM_GAS_FUEL) continue - if(gas[MOLES] > (gas[GAS_META][META_GAS_MOLES_VISIBLE] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility - danger = TRUE //at least 1 danger gas + danger = TRUE //at least 1 danger gas logmsg = "[key_name(usr)] <b>opened</b> a canister that contains the following:" admin_msg = "[key_name(usr)] <b>opened</b> a canister that contains the following at [ADMIN_VERBOSEJMP(src)]:" for(var/name in gaseslog) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 049e69d4ce3..9e62a111907 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -203,7 +203,8 @@ excited = TRUE if(!holding) - scrub(get_turf(src).return_air()) + var/turf/muhturf = get_turf(src) + scrub(muhturf.return_air()) return ..() diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index a7d07884a71..551d8ca3596 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -6,7 +6,7 @@ requires_power = FALSE static_lighting = FALSE base_lighting_alpha = 255 - + /area/awaymission/snowdin/outside name = "Snowdin Tundra Plains" icon_state = "awaycontent25" @@ -157,7 +157,7 @@ //liquid plasma!!!!!!// /turf/open/floor/iron/dark/snowdin - initial_gas_mix = FROZEN_ATMOS + temperature = 180 planetary_atmos = 1 temperature = 180 diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index 09dafd7e415..5b5d2d7e96f 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -29,25 +29,14 @@ ///List of gases with high filter priority var/list/high_filtering_gases = list( - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrous_oxide - ) + GAS_PLASMA, + GAS_CO2, + GAS_N2O + ) ///List of gases with medium filter priority - var/list/mid_filtering_gases = list( - /datum/gas/nitrium, - /datum/gas/freon, - /datum/gas/hypernoblium, - /datum/gas/bz - ) + var/list/mid_filtering_gases = list() ///List of gases with low filter priority - var/list/low_filtering_gases = list( - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/halon, - /datum/gas/tritium, - /datum/gas/zauker - ) + var/list/low_filtering_gases = list() /obj/item/gas_filter/examine(mob/user) . = ..() @@ -65,29 +54,29 @@ var/danger_points = 0 - for(var/gas_id in breath.gases) + for(var/gas_id in breath.gas) if(gas_id in high_filtering_gases) - if(breath.gases[gas_id][MOLES] > HIGH_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.get_gas(gas_id) > HIGH_FILTERING_MOLES) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.5 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.05 continue if(gas_id in mid_filtering_gases) - if(breath.gases[gas_id][MOLES] > MID_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.get_gas(gas_id) > MID_FILTERING_MOLES) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id)- filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.75 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.15 continue if(gas_id in low_filtering_gases) - if(breath.gases[gas_id][MOLES] > LOW_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.get_gas(gas_id)> LOW_FILTERING_MOLES) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 1 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.5 continue @@ -106,7 +95,7 @@ /obj/item/gas_filter/plasmaman name = "plasmaman atmospheric gas filter" high_filtering_gases = list( - /datum/gas/oxygen, - /datum/gas/carbon_dioxide, - /datum/gas/nitrous_oxide + GAS_OXYGEN, + GAS_CO2, + GAS_N2O ) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index da8b23ac5a8..8612cae4cb2 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -269,7 +269,8 @@ return exposed_temperature > 300 /obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) - atmos_spawn_air("plasma=20;TEMP=[exposed_temperature]") + var/open/turf/turfloc = get_turf(src) + turfloc.atmos_spawn_air(GAS_PLASMA, 20, exposed_temperature) visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) qdel(src) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 91dd2ef8cb1..fec5b4a45a8 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -265,10 +265,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/oxygen]) + if(!gas_mix.get_gas(GAS_OXYGEN)) return - gas_mix.gases[/datum/gas/oxygen][MOLES] = max(gas_mix.gases[/datum/gas/oxygen][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) - gas_mix.garbage_collect() + gas_mix.gas[GAS_OXYGEN] = max(gas_mix.get_gas(GAS_OXYGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/nitro_eater name = "Nitrogen consuming" @@ -280,10 +279,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/nitrogen]) + if(!gas_mix.get_gas(GAS_NITROGEN)) return - gas_mix.gases[/datum/gas/nitrogen][MOLES] = max(gas_mix.gases[/datum/gas/nitrogen][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) - gas_mix.garbage_collect() + gas_mix.gas[GAS_NITROGEN] = max(gas_mix.get_gas(GAS_NITROGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -295,10 +293,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/carbon_dioxide]) + if(!gas_mix.get_gas(GAS_OXYGEN)) return - gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] = max(gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) - gas_mix.garbage_collect() + gas_mix.gas[GAS_CO2] = max(gas_mix.get_gas(GAS_CO2) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/plasma_eater name = "Plasma consuming" @@ -310,10 +307,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/plasma]) + if(!gas_mix.get_gas(GAS_PLASMA)) return - gas_mix.gases[/datum/gas/plasma][MOLES] = max(gas_mix.gases[/datum/gas/plasma][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) - gas_mix.garbage_collect() + gas_mix.gas[GAS_PLASMA] = max(gas_mix.get_gas(GAS_PLASMA) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/thorns name = "Thorny" diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 204ed0792d2..c3706114a6e 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinals) var/turf/T = get_step(FT, dir) - if((T in flood_turfs) || !TURFS_CAN_SHARE(T, FT) || isspaceturf(T)) //If we've gottem already, or if they're not alright to spread with. + if((T in flood_turfs) /*|| !TURFS_CAN_SHARE(T, FT)*/ || isspaceturf(T)) //If we've gottem already, or if they're not alright to spread with. continue var/obj/effect/plasma_image_holder/pih = new(T) var/image/new_plasma = image(image_icon, pih, image_state, FLY_LAYER) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 054f5d59abc..e413cf7438c 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -140,8 +140,9 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( B.vars[V] = T.vars[V] toupdate += B - if(toupdate.len) + /*if(toupdate.len) for(var/turf/T1 in toupdate) CALCULATE_ADJACENT_TURFS(T1, KILL_EXCITED) + */ return copiedobjs diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index e6df49e2a9f..a78fb3f85e4 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -47,8 +47,8 @@ /turf/open/floor/holofloor/plating/burnmix name = "burn-mix floor" - initial_gas_mix = BURNMIX_ATMOS - + // initial_gas_mix = BURNMIX_ATMOS + //TODO: cause warcrimes later /turf/open/floor/holofloor/grass gender = PLURAL name = "lush grass" diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index e95bb3ecc9e..08f872c3072 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -122,7 +122,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.//air_update_turf(TRUE, TRUE) + //affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 2d1ea422c7a..70474c2753d 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -14,10 +14,10 @@ /mob/camera/Initialize(mapload) . = ..() SSpoints_of_interest.make_point_of_interest(src) - +/* /mob/camera/experience_pressure_difference() return - +*/ /mob/camera/canUseStorage() return FALSE diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 19e6a17ac30..67fe76feebc 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -16,28 +16,22 @@ var/plasma_used = 0 var/plas_detect_threshold = 0.02 var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/list/breath_gases = breath.gases - - breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) //Partial pressure of the plasma in our breath - var/Plasma_pp = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure + var/Plasma_pp = (breath.get_gas(GAS_PLASMA)/breath.total_moles())*breath_pressure if(Plasma_pp > plas_detect_threshold) // Detect plasma in air - adjustPlasma(breath_gases[/datum/gas/plasma][MOLES]*250) + adjustPlasma(breath.get_gas(GAS_PLASMA)*250) throw_alert(ALERT_XENO_PLASMA, /atom/movable/screen/alert/alien_plas) - plasma_used = breath_gases[/datum/gas/plasma][MOLES] + plasma_used = breath.get_gas(GAS_PLASMA) else clear_alert(ALERT_XENO_PLASMA) //Breathe in plasma and out oxygen - breath_gases[/datum/gas/plasma][MOLES] -= plasma_used - breath_gases[/datum/gas/oxygen][MOLES] += plasma_used - - breath.garbage_collect() - + breath.adjust_gas(GAS_PLASMA, -plasma_used) + breath.adjust_gas(GAS_OXYGEN, plasma_used) //BREATH TEMPERATURE handle_breath_temperature(breath) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 5d34c91b2b3..1f16739d278 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -73,11 +73,11 @@ if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves))) var/datum/gas_mixture/environment = H.loc.return_air() if(environment?.total_moles()) - if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) + /*if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) if(H.on_fire && H.fire_stacks > 0) - H.adjust_fire_stacks(-10 * delta_time) - else if(!HAS_TRAIT(H, TRAIT_NOFIRE) && !HAS_TRAIT(H, TRAIT_NOSELFIGNITION)) - if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire + H.adjust_fire_stacks(-10 * delta_time)*/ + if(!HAS_TRAIT(H, TRAIT_NOFIRE) && !HAS_TRAIT(H, TRAIT_NOSELFIGNITION)) + if(environment.has_gas(GAS_OXYGEN, 1)) //Same threshhold that extinguishes fire H.adjust_fire_stacks(0.25 * delta_time) if(!H.on_fire && H.fire_stacks > 0) H.visible_message(span_danger("[H]'s body reacts with the atmosphere and bursts into flames!"),span_userdanger("Your body reacts with the atmosphere and bursts into flame!")) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 74062b0efa5..33fef9d52f5 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -158,11 +158,9 @@ var/oxygen_used = 0 var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/list/breath_gases = breath.gases - breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz) - var/O2_partialpressure = (breath_gases[/datum/gas/oxygen][MOLES]/breath.total_moles())*breath_pressure - var/Plasma_partialpressure = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure - var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide][MOLES]/breath.total_moles())*breath_pressure + var/O2_partialpressure = (breath.get_gas(GAS_OXYGEN)/breath.total_moles())*breath_pressure + var/Plasma_partialpressure = (breath.get_gas(GAS_OXYGEN)/breath.total_moles())*breath_pressure + var/CO2_partialpressure = (breath.get_gas(GAS_CO2)/breath.total_moles())*breath_pressure //OXYGEN @@ -173,7 +171,7 @@ var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) failed_last_breath = TRUE - oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]*ratio + oxygen_used = breath.get_gas(GAS_OXYGEN)*ratio else adjustOxyLoss(3) failed_last_breath = TRUE @@ -183,11 +181,11 @@ failed_last_breath = FALSE if(health >= crit_threshold) adjustOxyLoss(-5) - oxygen_used = breath_gases[/datum/gas/oxygen][MOLES] + oxygen_used = breath.get_gas(GAS_OXYGEN) clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used - breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used + breath.adjust_gas(GAS_OXYGEN, -oxygen_used) + breath.adjust_gas(GAS_CO2, oxygen_used) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -206,15 +204,15 @@ //PLASMA if(Plasma_partialpressure > safe_plas_max) - var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_plas_max) * 10 + var/ratio = breath.get_gas(GAS_PLASMA)/safe_plas_max * 10 adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) else clear_alert(ALERT_TOO_MUCH_PLASMA) //NITROUS OXIDE - if(breath_gases[/datum/gas/nitrous_oxide]) - var/SA_partialpressure = (breath_gases[/datum/gas/nitrous_oxide][MOLES]/breath.total_moles())*breath_pressure + if(breath.get_gas(GAS_N2O)) + var/SA_partialpressure = (breath.get_gas(GAS_N2O)/breath.total_moles())*breath_pressure if(SA_partialpressure > SA_para_min) throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") @@ -234,14 +232,16 @@ clear_alert(ALERT_TOO_MUCH_N2O) //BZ (Facepunch port of their Agent B) + /* if(breath_gases[/datum/gas/bz]) var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.total_moles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) hallucination += 5 - + */ //NITRIUM + /* if(breath_gases[/datum/gas/nitrium]) var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.total_moles())*breath_pressure if(nitrium_partialpressure > 0.5) @@ -295,7 +295,7 @@ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") breath.garbage_collect() - + */ //BREATH TEMPERATURE handle_breath_temperature(breath) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 3f8447ade8c..49b16216520 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ extinguish_mob() return TRUE //mob was put out, on_fire = FALSE via extinguish_mob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(!G.gases[/datum/gas/oxygen] || G.gases[/datum/gas/oxygen][MOLES] < 1) + if(!G.has_gas(GAS_OXYGEN, 1)) extinguish_mob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 36c2f1f3b7d..9a6fe5c5460 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -958,7 +958,7 @@ return pick("ltrails_1", "ltrails_2") else return pick("trails_1", "trails_2") - +/* /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) if(buckled || mob_negates_gravity()) @@ -988,7 +988,7 @@ pressure_resistance_prob_delta -= 20 break ..(pressure_difference, direction, pressure_resistance_prob_delta) - +*/ /mob/living/can_resist() if(next_move > world.time) return FALSE diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index f21ebabf39e..4cef50b5668 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -496,7 +496,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/turf/T = get_turf(src) if(!T) return - var/list/adjacent = T.get_atmos_adjacent_turfs(1) + var/list/adjacent = T.get_adjacent_open_turfs() if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way adjacent = shuffle(adjacent) shuffle = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 9ffc4680868..acfc70af4f6 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -153,7 +153,7 @@ else if(isturf(target)) var/turf/open/T = target - if(T.active_hotspot) + if(T.fire) return TRUE return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index e982b5bfc38..e9bcf6f4fc6 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -56,14 +56,14 @@ if(!is_tree || !isopenturf(loc)) return var/turf/open/T = src.loc - if(!T.air || !T.air.gases[/datum/gas/carbon_dioxide]) + if(!T.air || !T.air.has_gas(GAS_CO2)) return - var/co2 = T.air.gases[/datum/gas/carbon_dioxide][MOLES] + var/co2 = T.air.get_gas(GAS_CO2) if(co2 > 0 && DT_PROB(13, delta_time)) var/amt = min(co2, 9) - T.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt - T.atmos_spawn_air("o2=[amt]") + T.air.adjust_gas(GAS_CO2, -amt) + T.atmos_spawn_air(GAS_OXYGEN, amt) /mob/living/simple_animal/hostile/tree/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8ccb075e757..92608dcab13 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -317,15 +317,12 @@ if(isturf(loc) && isopenturf(loc)) var/turf/open/ST = loc if(ST.air) - var/ST_gases = ST.air.gases - ST.air.assert_gases(arglist(GLOB.hardcoded_gases)) + var/datum/gas_mixture/muhair = ST.return_air() - var/plas = ST_gases[/datum/gas/plasma][MOLES] - var/oxy = ST_gases[/datum/gas/oxygen][MOLES] - var/n2 = ST_gases[/datum/gas/nitrogen][MOLES] - var/co2 = ST_gases[/datum/gas/carbon_dioxide][MOLES] - - ST.air.garbage_collect() + var/plas = muhair.get_gas(GAS_PLASMA) + var/oxy = muhair.get_gas(GAS_OXYGEN) + var/n2 = muhair.get_gas(GAS_NITROGEN) + var/co2 = muhair.get_gas(GAS_CO2) if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 5afb8ac74a0..1e544408ae6 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -141,7 +141,7 @@ adjustBruteLoss(round(sqrt(bodytemperature)) * delta_time) else REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - + /* if(stat != DEAD) var/bz_percentage =0 if(environment.gases[/datum/gas/bz]) @@ -161,7 +161,7 @@ to_chat(src, span_notice("You wake up from the stasis.")) set_stat(CONSCIOUS) regenerate_icons() - + */ updatehealth() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b1a55366fbb..87631e7d383 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -126,10 +126,9 @@ var/t = "[span_notice("Coordinates: [x],[y] ")]\n" t += "[span_danger("Temperature: [environment.temperature] ")]\n" - for(var/id in environment.gases) - var/gas = environment.gases[id] - if(gas[MOLES]) - t+="[span_notice("[gas[GAS_META][META_GAS_NAME]]: [gas[MOLES]] ")]\n" + for(var/id in environment.gas) + if(gas[id]) + t+="[span_notice("[gas]: [gas[MOLES]] ")]\n" to_chat(usr, t) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 69bcbe667c2..40f9be53009 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -411,9 +411,8 @@ /obj/structure/chrono_field/return_air() //we always have nominal air and temperature var/datum/gas_mixture/fresh_air = new - fresh_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - fresh_air.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD - fresh_air.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD + fresh_air.gas[GAS_OXYGEN] = MOLES_O2STANDARD + fresh_air.gas[GAS_NITROGEN] = MOLES_N2STANDARD fresh_air.temperature = T20C return fresh_air diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index fe09b4b971e..fe744c72ecf 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -16,7 +16,7 @@ to_chat(user, span_warning("\The [computer] flashes an error: \"hardware\\sensorpackage\\startup.bin -- file not found\".")) /datum/computer_file/program/atmosscan/ui_static_data(mob/user) - return return_atmos_handbooks() + return //return_atmos_handbooks() /datum/computer_file/program/atmosscan/ui_data(mob/user) var/list/data = get_header_data() @@ -27,7 +27,7 @@ if(!air_sensor) data["gasmixes"] = list(gas_mixture_parser(null, "No Sensors Detected!")) return data - + data["gasmixes"] = list(gas_mixture_parser(air, "Sensor Reading")) //Null air wont cause errors, don't worry. return data diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index e3e84e04511..d5b7e185874 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -20,12 +20,12 @@ AddComponent(/datum/component/simple_rotation) find_circs() connect_to_network() - SSair.start_processing_machine(src) + SSzas.start_processing_machine(src) update_appearance() /obj/machinery/power/generator/Destroy() kill_circs() - SSair.stop_processing_machine(src) + SSzas.stop_processing_machine(src) return ..() /obj/machinery/power/generator/update_overlays() diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 8a0b0ca51a5..14bef9e7193 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -93,7 +93,7 @@ /obj/projectile/bullet/c38/iceblox //see /obj/projectile/temp for the original code name = ".38 Iceblox bullet" damage = 20 - var/temperature = 100 + temperature = 100 ricochets_max = 0 /obj/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index 4b4a95809ab..b731da461c9 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -97,8 +97,8 @@ for(var/turf/T in turflist) if(accessible[T]) continue - for(var/thing in T.get_atmos_adjacent_turfs(alldir = TRUE)) - var/turf/NT = thing + //for(var/thing in T.get_atmos_adjacent_turfs(alldir = TRUE)) + for(var/turf/NT as anything in T.get_adjacent_open_turfs()) if(!(NT in accessible)) continue if(!(get_dir(T,NT) in GLOB.cardinals)) diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index a94c28316a0..75070f324f2 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -86,7 +86,7 @@ return FALSE update_appearance() return TRUE - + /obj/machinery/atmospherics/components/binary/tank_compressor/crowbar_act(mob/living/user, obj/item/tool) if(active || inserted_tank) return FALSE @@ -119,7 +119,7 @@ if(nodes[2]) nodes[2].atmos_init() nodes[2].add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) update_appearance() /// Glorified volume pump. @@ -172,7 +172,7 @@ return COMSIG_CANCEL_EXPLOSION /** - * Everytime a tank is destroyed or a new tank is inserted, our buffer is flushed. + * Everytime a tank is destroyed or a new tank is inserted, our buffer is flushed. * Mole requirements in experiments are tracked by buffer data. */ /obj/machinery/atmospherics/components/binary/tank_compressor/proc/flush_buffer() @@ -194,7 +194,7 @@ new_record.timestamp = station_time_timestamp() for(var/gas_path in leaked_gas_buffer.gases) new_record.gas_data[gas_path] = leaked_gas_buffer.gases[gas_path][MOLES] - + compressor_record += new_record record_number += 1 say("Buffer data stored.") @@ -207,7 +207,7 @@ if(experiment.required_gas in gas_data) if(gas_data[experiment.required_gas] > MINIMUM_MOLE_COUNT) passed_experiments += list(experiment.type = gas_data[experiment.required_gas]) - + return passed_experiments /obj/machinery/atmospherics/components/binary/tank_compressor/proc/print(mob/user, datum/data/compressor_record/record) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 43a0fd57ad8..f72f19c96ad 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -58,7 +58,7 @@ All ShuttleMove procs go here var/depth = baseturfs.len - shuttle_boundary + 1 newT.CopyOnTop(src, 1, depth, TRUE) newT.blocks_air = TRUE - newT.//air_update_turf(TRUE, FALSE) + //newT.air_update_turf(TRUE, FALSE) blocks_air = TRUE //air_update_turf(TRUE, TRUE) if(isopenturf(newT)) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index b88e07c23e5..ab3145e92da 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -215,9 +215,7 @@ cabin_air = new cabin_air.volume = 200 cabin_air.temperature = T20C - cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - cabin_air.gases[/datum/gas/oxygen][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.gases[/datum/gas/nitrogen][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.adjust_multi(GAS_OXYGEN, (O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)), GAS_NITROGEN, (N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature))) add_cell() add_scanmod() diff --git a/tgstation.dme b/tgstation.dme index ec89a81aa47..bcf59cab7ec 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -355,6 +355,7 @@ #include "code\__HELPERS\verbs.dm" #include "code\__HELPERS\view.dm" #include "code\__HELPERS\weakref.dm" +//#include "code\__HELPERS\zas.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" From 9001e9902e67d3f77eff00689acf9200aae64912 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 17 Apr 2022 18:19:45 -0400 Subject: [PATCH 007/200] adds immutable mixtures --- .../ZAS/XGM/xgm_immutable_gas_mixture.dm | 58 +++++++++++++++++++ tgstation.dme | 1 + 2 files changed, 59 insertions(+) create mode 100644 code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm new file mode 100644 index 00000000000..efbdc276daf --- /dev/null +++ b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm @@ -0,0 +1,58 @@ +/datum/gas_mixture/immutable + temperature = TCMB + var/initial_temperature = TCMB + +/datum/gas_mixture/immutable/update_values() + temperature = initial_temperature + return ..() + +/datum/gas_mixture/immutable/adjust_gas() + return + +/datum/gas_mixture/immutable/remove() + return new type + +/datum/gas_mixture/immutable/add() + return TRUE + +/datum/gas_mixture/immutable/subtract() + return TRUE + +/datum/gas_mixture/immutable/divide() + return TRUE + +/datum/gas_mixture/immutable/multiply() + return TRUE + +/datum/gas_mixture/immutable/adjust_gas_temp() + return + +/datum/gas_mixture/immutable/adjust_multi() + return + +/datum/gas_mixture/immutable/adjust_multi_temp() + return + +/datum/gas_mixture/immutable/merge() + return + +/datum/gas_mixture/immutable/copy_from() + return + +/datum/gas_mixture/immutable/heat_capacity() + return HEAT_CAPACITY_VACUUM + +/datum/gas_mixture/immutable/remove_ratio() + return new type + +/datum/gas_mixture/immutable/remove_volume() + return new type + +/datum/gas_mixture/immutable/remove_by_flag() + return new type + +/datum/gas_mixture/immutable/share_ratio(datum/gas_mixture/other, connecting_tiles, share_size, one_way) + . = ..() + temperature = initial_temperature + + diff --git a/tgstation.dme b/tgstation.dme index bcf59cab7ec..e3a64ff6816 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2360,6 +2360,7 @@ #include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" #include "code\modules\atmospherics\ZAS\Turf.dm" #include "code\modules\atmospherics\ZAS\XGM\gases.dm" +#include "code\modules\atmospherics\ZAS\XGM\xgm_immutable_gas_mixture.dm" #include "code\modules\atmospherics\ZAS\Zone.dm" #include "code\modules\atmospherics\ZAS\_docs.dm" #include "code\modules\atmospherics\ZAS\Airflow.dm" From 5f3b937fadc0d7672e944f388a0fe08594e57633 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 17 Apr 2022 19:31:36 -0400 Subject: [PATCH 008/200] !!!/SIMULATED/ REMOVAL!!! --- code/__DEFINES/atmospherics/ZAS.dm | 3 +- code/__DEFINES/atmospherics/atmos_helpers.dm | 6 +- code/__DEFINES/wounds.dm | 1 - code/__HELPERS/maths.dm | 3 + code/controllers/subsystem/zas.dm | 10 ++- code/game/turfs/change_turf.dm | 6 +- code/game/turfs/open/space/space.dm | 1 + code/modules/admin/verbs/fix_air.dm | 5 +- .../abductor/equipment/glands/plasma.dm | 2 +- code/modules/atmospherics/ZAS/Atom.dm | 5 +- code/modules/atmospherics/ZAS/Connection.dm | 14 +++-- code/modules/atmospherics/ZAS/Diagnostic.dm | 9 +-- code/modules/atmospherics/ZAS/Fire.dm | 40 +++++++----- code/modules/atmospherics/ZAS/Temperature.dm | 5 +- code/modules/atmospherics/ZAS/Turf.dm | 63 ++++++++++++------- code/modules/atmospherics/ZAS/Zone.dm | 22 +++++-- 16 files changed, 130 insertions(+), 65 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 95bb23b2daf..367469bb075 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -21,8 +21,9 @@ #define SOUTHDOWN (SOUTH|DOWN) #define WESTDOWN (WEST|DOWN) -#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) +//#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) ZASTURF +#define TURF_HAS_VALID_ZONE(T) (!istype(T, /turf/open/space) && T:zone && !T:zone:invalid) #ifdef MULTIZAS var/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 1ad834b85eb..6ac20c153a3 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -31,8 +31,10 @@ #define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) ///Directly adds a gas to a gas mixture without checking for its presence beforehand, use only if is certain the absence of said gas -//#define ADD_GAS(gas_id, out_list)\ - var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy(); +/* +#define ADD_GAS(gas_id, out_list)\ + var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id];out_list[gas_id] = tmp_gaslist.Copy(); +*/ ///Adds a gas to a gas mixture but checks if is already present, faster than the same proc #define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) }; diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index f30947c0362..7e7ba8abd8e 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -60,7 +60,6 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu /datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate, /datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)) - // ~burn wound infection defines // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse /// below this has no ill effects from infection diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 49cab9bf273..41b2532999c 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -133,3 +133,6 @@ return "centuple" else //It gets too tedious to use latin prefixes from here. return "[number]-tuple" + +/// A random real number between low and high inclusive +#define Frand(low, high) ( rand() * ((high) - (low)) + (low) ) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 1e22bff9a18..ff50915b87b 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -165,7 +165,10 @@ SUBSYSTEM_DEF(zas) to_chat(world, span_boldannounce("Processing Geometry...")) var/simulated_turf_count = 0 - for(var/turf/simulated/S) + //for(var/turf/simulated/S) ZASTURF + for(var/turf/S) + if(istype(S, /turf/open/space)) + continue simulated_turf_count++ S.update_air_properties() @@ -411,7 +414,8 @@ SUBSYSTEM_DEF(zas) B.c_merge(A) mark_zone_update(A) -/datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) +//datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) //ZASTURF +/datum/controller/subsystem/zas/proc/connect(turf/A, turf/B) #ifdef ZASDBG ASSERT(istype(A)) ASSERT(isturf(B)) @@ -425,7 +429,7 @@ SUBSYSTEM_DEF(zas) if(block & AIR_BLOCKED) return var/direct = !(block & ZONE_BLOCKED) - var/space = !istype(B) + var/space = istype(B, /turf/open/space) if(!space) if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 1671adb019a..4e402941ffa 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -83,13 +83,17 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( blueprint_data = null if(connections) connections.erase_all() - + /* ZASTURF if(istype(src,/turf/simulated)) //Yeah, we're just going to rebuild the whole thing. //Despite this being called a bunch during explosions, //the zone will only really do heavy lifting once. var/turf/simulated/S = src if(S.zone) S.zone.rebuild() + */ + + if(simulated && zone) + zone.rebuild() var/list/old_baseturfs = baseturfs var/old_type = type diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 866590ed64e..9fbc6d1c1f2 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -8,6 +8,7 @@ temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 + simulated = FALSE var/destination_z var/destination_x diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 2faf3321614..0098317ce9f 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -36,7 +36,10 @@ for(var/id in xgm_gas_data.tile_overlay) unsorted_overlays |= xgm_gas_data.tile_overlay[id] - for(var/turf/simulated/T in world) + //for(var/turf/simulated/T in world) ZASTURF + for(var/turf/T in world) + if(!T.simulated) + continue T.air = null T.overlays.Remove(unsorted_overlays) T.zone = null diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index 07bfd96d02e..41377d2db17 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -16,7 +16,7 @@ if(!owner) return owner.visible_message(span_danger("[owner] vomits a cloud of plasma!")) - var/turf/simulated/open/T = get_turf(owner) + var/turf/open/T = get_turf(owner) if(istype(T)) T.atmos_spawn_air(GAS_PLASMA, 20, T20C) owner.vomit() diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 1f4b9cf7beb..56cb4d0c0a4 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -14,7 +14,10 @@ //Convenience function for atoms to update turfs they occupy /atom/movable/proc/update_nearby_tiles(need_rebuild) - for(var/turf/simulated/turf in locs) + //for(var/turf/simulated/turf in locs) ZASTURF + for(var/turf/turf in locs) + if(istype(turf, /turf/open/space)) + continue SSzas.mark_for_update(turf) return 1 diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index c7f33a0aaaf..55721a9e347 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -48,9 +48,12 @@ Class Procs: Makes numerous checks to decide whether the connection is still valid. Erases it automatically if not. */ - +/* ZASTURF /connection/var/turf/simulated/A /connection/var/turf/simulated/B +*/ +/connection/var/turf/A +/connection/var/turf/B /connection/var/zone/zoneA /connection/var/zone/zoneB @@ -58,7 +61,8 @@ Class Procs: /connection/var/state = 0 -/connection/New(turf/simulated/A, turf/simulated/B) +//connection/New(turf/simulated/A, turf/simulated/B) ZASTURF +/connection/New(turf/A, turf/B) #ifdef ZASDBG ASSERT(SSzas.has_valid_zone(A)) //ASSERT(SSzas.has_valid_zone(B)) @@ -66,7 +70,7 @@ Class Procs: src.A = A src.B = B zoneA = A.zone - if(!istype(B)) + if(istype(B /turf/open/space)) mark_space() edge = SSzas.get_edge(A.zone,B) edge.add_connection(src) @@ -103,7 +107,7 @@ Class Procs: /connection/proc/update() // log_debug("Updated, \...") - if(!istype(A,/turf/simulated)) + if(istype(A,/turf/open/space)) // log_debug("Invalid A.") erase() return @@ -118,7 +122,7 @@ Class Procs: else mark_direct() - var/b_is_space = !istype(B,/turf/simulated) + var/b_is_space = istype(B,/turf/open/space) if(state & CONNECTION_SPACE) if(!b_is_space) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 40e89108b7d..785b83078bb 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -17,9 +17,9 @@ /client/var/list/zone_debug_images -/client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) +/client/proc/Test_ZAS_Connection(var/turf/T as turf) //ZASTURF set category = "Debug" - if(!istype(T)) + if(istype(T, /turf/open/space)) //ZASTURF return var/direction_list = list(\ @@ -43,8 +43,9 @@ to_chat(mob, "No air passage :x") return - var/turf/simulated/other_turf = get_step(T, direction_list[direction]) - if(!istype(other_turf)) + //var/turf/simulated/other_turf = get_step(T, direction_list[direction]) ZASTURF + var/turf/other_turf = get_step(T, direction_list[direction]) + if(istype(other_turf, /turf/open/space)) return var/t_block = T.c_airblock(other_turf) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 409646fcbd3..1037a7a5b3e 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -57,7 +57,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin fire_tiles -= T fuel_objs -= fuel else - for(var/turf/simulated/T in fire_tiles) + //for(var/turf/simulated/T in fire_tiles) ZASTURF + for(var/turf/T in fire_tiles) if(istype(T.fire)) qdel(T.fire) fire_tiles.Cut() @@ -92,7 +93,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/proc/create_fire(fl) return 0 -/turf/simulated/create_fire(fl) +//turf/simulated/create_fire(fl) ZASTURF +/turf/create_fire(fl) if(fire) fire.firelevel = max(fl, fire.firelevel) return 1 @@ -109,6 +111,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return 0 +/turf/open/space/create_fire() + return + /obj/effect/hotspot anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -127,8 +132,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /obj/effect/hotspot/Process() . = 1 - var/turf/simulated/my_tile = loc - if(!istype(my_tile) || !my_tile.zone) + //var/turf/simulated/my_tile = loc ZASTURF + var/turf/my_tile = loc + if(istype(my_tile, /turf/open/space) || !my_tile.zone) if(my_tile && my_tile.fire == src) my_tile.fire = null qdel(src) @@ -155,9 +161,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //spread for(var/direction in GLOB.cardinals) - var/turf/simulated/enemy_tile = get_step(my_tile, direction) - - if(istype(enemy_tile)) + //var/turf/simulated/enemy_tile = get_step(my_tile, direction) ZASTURF + var/turf/enemy_tile = get_step(my_tile, direction) + if(!istype(enemy_tile, /turf/open/space)) if(my_tile.open_directions & direction) //Grab all valid bordering tiles if(!enemy_tile.zone || enemy_tile.fire) continue @@ -212,10 +218,15 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin SSzas.active_hotspots.Remove(src) . = ..() -/turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. +//turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. ZASTURF +/turf/var/fire_protection = 0 /turf/proc/apply_fire_protection() -/turf/simulated/apply_fire_protection() fire_protection = world.time +/*/turf/simulated/apply_fire_protection() ZASTURF + fire_protection = world.time*/ + +/turf/open/space/apply_fire_protection() + return //Returns the firelevel /datum/gas_mixture/proc/react(zone/zone, force_burn, no_check = 0) @@ -438,16 +449,17 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) return -/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) +//turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) ZASTURF +/turf/open/floor/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) var/dir_to = get_dir(src, adj_turf) for(var/obj/structure/window/W in src) if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile) W.fire_act(adj_air, adj_temp, adj_volume) -/*/turf/simulated/wall/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) +/turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) burn(adj_temp) - if(adj_temp > material.melting_point) - take_damage(log(Frand(0.9, 1.1) * (adj_temp - material.melting_point)), BURN) + if(adj_temp > heat_capacity) + take_damage(log(Frand(0.9, 1.1) * (adj_temp - heat_capacity)), BURN) - return ..()*/ + return ..() diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 6aa01691ad6..6d502cbebbb 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -35,10 +35,11 @@ // Nullspace is room temperature, clearly. var/adjust_temp if(loc) - if(!istype(loc, /turf/simulated)) + if(!loc.simulated) adjust_temp = loc.temperature else - var/turf/simulated/T = loc + //var/turf/simulated/T = loc + var/turf/T = loc if(T.zone && T.zone.air) adjust_temp = T.zone.air.temperature else diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 22f9e45529b..ac359e9e743 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -1,4 +1,4 @@ -/turf/simulated +/turf var/zone/zone var/open_directions @@ -11,10 +11,8 @@ var/list/initial_gas_mix var/planetary_atmos //Let's just let this exist for now. -#warn !!TEMPORARY PROCDEF!! -/turf/open/proc/atmos_spawn_air(...) - -/turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) +///turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) ZASTURF +/turf/open/proc/update_graphic(list/graphic_add = null, list/graphic_null = null) if(graphic_add && graphic_add.len) vis_contents += graphic_add if(graphic_remove && graphic_remove.len) @@ -49,19 +47,20 @@ if(r_block & AIR_BLOCKED) continue - if(istype(unsim, /turf/simulated)) - - var/turf/simulated/sim = unsim + //if(istype(unsim, /turf/simulated)) ZASTURF + if(unsim.simulated) + //var/turf/simulated/sim = unsim if(TURF_HAS_VALID_ZONE(sim)) SSzas.connect(sim, src) // Helper for can_safely_remove_from_zone(). +//ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT #define GET_ZONE_NEIGHBOURS(T, ret) \ ret = 0; \ if (T.zone) { \ for (var/_gzn_dir in gzn_check) { \ - var/turf/simulated/other = get_step(T, _gzn_dir); \ - if (istype(other) && other.zone == T.zone) { \ + var/turf/other = get_step(T, _gzn_dir); \ + if (!istype(other, /turf/open/space) && other.zone == T.zone) { \ var/block; \ ATMOS_CANPASS_TURF(block, other, T); \ if (!(block & AIR_BLOCKED)) { \ @@ -77,7 +76,8 @@ This implementation may produce false negatives but it (hopefully) will not produce any false postiives. */ -/turf/simulated/proc/can_safely_remove_from_zone() +///turf/simulated/proc/can_safely_remove_from_zone() ZASTURF +/turf/proc/can_safely_remove_from_zone() if(!zone) return 1 @@ -88,8 +88,10 @@ //for each pair of "adjacent" cardinals (e.g. NORTH and WEST, but not NORTH and SOUTH) if((dir & check_dirs) == dir) //check that they are connected by the corner turf - var/turf/simulated/T = get_step(src, dir) - if (!istype(T)) + //var/turf/simulated/T = get_step(src, dir) ZASTURF + var/turf/T = get_step(src, dir) + //if (!istype(T)) ZASTURF + if (istype(T, /turf/open/space)) . &= ~dir continue @@ -101,7 +103,8 @@ //it is safe to remove src from the zone if all cardinals are connected by corner turfs . = !. -/turf/simulated/update_air_properties() +//turf/simulated/update_air_properties() ZAS +/turf/open/update_air_properties() if(zone && zone.invalid) //this turf's zone is in the process of being rebuilt c_copy_air() //not very efficient :( @@ -160,8 +163,9 @@ //Check that our zone hasn't been cut off recently. //This happens when windows move or are constructed. We need to rebuild. - if((previously_open & d) && istype(unsim, /turf/simulated)) - var/turf/simulated/sim = unsim + //if((previously_open & d) && istype(unsim, /turf/simulated)) ZAS + if((previously_open & d) && !istype(unsim, /turf/open/space)) + var/turf/sim = unsim if(zone && sim.zone == zone) zone.rebuild() return @@ -170,9 +174,10 @@ open_directions |= d - if(istype(unsim, /turf/simulated)) + //if(istype(unsim, /turf/simulated)) ZASTURF + if(!istype(unsim, /turf/open/space)) - var/turf/simulated/sim = unsim + var/turf/sim = unsim sim.open_directions |= GLOB.reverse_dir[d] if(TURF_HAS_VALID_ZONE(sim)) @@ -263,11 +268,13 @@ var/datum/gas_mixture/GM = return_air() return GM.remove(amount) -/turf/simulated/assume_air(datum/gas_mixture/giver) +///turf/simulated/assume_air(datum/gas_mixture/giver) ZASTURF +/turf/proc/assume_air(datum/gas_mixture/giver) var/datum/gas_mixture/my_air = return_air() my_air.merge(giver) -/turf/simulated/assume_gas(gasid, moles, temp = null) +//turf/simulated/assume_gas(gasid, moles, temp = null) ZASTURF +/turf/proc/assume_gas(gasid, moles, temp = null) var/datum/gas_mixture/my_air = return_air() if(isnull(temp)) @@ -277,7 +284,8 @@ return 1 -/turf/simulated/return_air() +//turf/simulated/return_air() ZASTURF +/turf/proc/return_air() if(zone) if(!zone.invalid) SSzas.mark_zone_update(zone) @@ -299,12 +307,18 @@ air.gas = initial_gas.Copy() air.update_values() -/turf/simulated/proc/c_copy_air() +//turf/simulated/proc/c_copy_air() ZASTURF +/turf/proc/c_copy_air() if(!air) air = new/datum/gas_mixture air.copy_from(zone.air) air.group_multiplier = 1 -/turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) +/*/turf/open/space/c_copy_air() + return +*/ + +//turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) ZASTURF +/turf/proc/atmos_spawn_air(gas_id, amount, initial_temperature) var/datum/gas_mixture/new_gas = new var/datum/gas_mixture/existing_gas = return_air() if(isnull(initial_temperature)) @@ -313,6 +327,9 @@ new_gas.adjust_gas_temp(gas_id, amount, initial_temperature) existing_gas.merge(new_gas) +/turf/open/space/atmos_spawn_air() + return + /proc/turf_contains_dense_objects(var/turf/T) return T.contains_dense_objects() diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index a46df8e036a..b56ea3e74d5 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -104,7 +104,10 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() - for(var/turf/simulated/T in contents) + //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) + if(istype(T, /turf/open/space)) + continue into.add(T) T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG @@ -122,14 +125,19 @@ Class Procs: invalid = 1 SSzas.remove_zone(src) #ifdef ZASDBG - for(var/turf/simulated/T in contents) - T.dbg(invalid_zone) + //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) + if(!istype(T, /turf/open/space)) + T.dbg(invalid_zone) #endif /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. c_invalidate() - for(var/turf/simulated/T in contents) + //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) + if(istype(T, /turf/open/space)) + continue T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. @@ -153,7 +161,8 @@ Class Procs: // Update gas overlays. if(air.check_tile_graphic(graphic_add, graphic_remove)) - for(var/turf/simulated/T in contents) + //for(var/turf/simulated/T in contents) + for(var/turf/T in contents) T.update_graphic(graphic_add, graphic_remove) graphic_add.len = 0 graphic_remove.len = 0 @@ -182,7 +191,8 @@ Class Procs: // Update atom temperature. if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) last_air_temperature = air.temperature - for(var/turf/simulated/T in contents) + //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) for(var/check_atom in T.contents) var/atom/checking = check_atom if(checking.simulated) From ca43d37e34b53d7e5600625f7c9448ea34000fef Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 02:02:47 -0400 Subject: [PATCH 009/200] ITS TIME --- code/controllers/subsystem/zas.dm | 14 +++ code/game/gamemodes/objective_items.dm | 2 +- code/game/objects/effects/countdown.dm | 4 +- code/game/objects/items/melee/misc.dm | 6 +- .../objects/items/stacks/sheets/mineral.dm | 3 +- code/game/objects/structures/bonfire.dm | 4 +- code/game/turfs/open/space/space.dm | 4 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/verbs/fix_air.dm | 4 +- .../traitor/equipment/Malf_Modules.dm | 2 +- code/modules/atmospherics/ZAS/Connection.dm | 2 +- code/modules/atmospherics/ZAS/Fire.dm | 10 +- code/modules/atmospherics/ZAS/Turf.dm | 15 +-- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 18 ++++ .../ZAS/XGM/xgm_immutable_gas_mixture.dm | 4 +- .../atmospherics/machinery/airalarm.dm | 5 +- .../atmospherics/machinery/components/tank.dm | 2 +- .../components/trinary_devices/filter.dm | 43 ++++---- .../atmospherics/machinery/other/meter.dm | 6 +- .../machinery/portable/canister.dm | 2 +- code/modules/clothing/under/accessories.dm | 2 +- .../kitchen_machinery/smartfridge.dm | 3 +- .../modules/hydroponics/unique_plant_genes.dm | 5 +- code/modules/mapping/map_template.dm | 7 +- .../living/simple_animal/hostile/regalrat.dm | 4 +- code/modules/mob/mob.dm | 4 +- .../computers/item/tablet_presets.dm | 4 +- .../computers/machinery/console_presets.dm | 2 +- code/modules/power/lighting/light_items.dm | 3 +- code/modules/power/singularity/singularity.dm | 3 +- .../mapGeneratorModules/helpers.dm | 3 +- .../mapGenerators/repair.dm | 2 +- .../projectile/special/temperature.dm | 8 +- .../chemistry/reagents/toxin_reagents.dm | 4 +- .../chemistry/recipes/slime_extracts.dm | 5 +- .../research/ordnance/doppler_array.dm | 4 +- .../research/ordnance/tank_compressor.dm | 7 +- .../xenobiology/crossbreeding/chilling.dm | 8 +- .../ruins/lavalandruin_code/syndicate_base.dm | 3 +- code/modules/shuttle/on_move.dm | 4 +- code/modules/surgery/organs/lungs.dm | 101 +++++++++--------- code/modules/unit_tests/breath.dm | 4 +- code/modules/unit_tests/gas_transfer.dm | 2 + tgstation.dme | 8 +- 44 files changed, 206 insertions(+), 146 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index ff50915b87b..aeb1e6ba1a8 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -555,3 +555,17 @@ SUBSYSTEM_DEF(zas) qdel(temp) return pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] + +/datum/controller/subsystem/zas/proc/setup_template_machinery(list/atmos_machines) + var/obj/machinery/atmospherics/AM + for(var/A in 1 to atmos_machines.len) + AM = atmos_machines[A] + AM.atmos_init() + CHECK_TICK + + for(var/A in 1 to atmos_machines.len) + AM = atmos_machines[A] + var/list/targets = AM.get_rebuild_targets() + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline_blocking(AM) + CHECK_TICK diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 4c66c5e301d..771eb72ce5b 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -283,7 +283,7 @@ ..() /datum/objective_item/steal/supermatter/TargetExists() - return GLOB.main_supermatter_engine != null + return //GLOB.main_supermatter_engine != null //Items with special checks! /datum/objective_item/steal/plasma diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index e5be8ffc0c0..9106e88ed11 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -93,10 +93,12 @@ color = "#00ff80" /obj/effect/countdown/supermatter/get_value() - var/obj/machinery/power/supermatter_crystal/S = attached_to +/* + /var/obj/machinery/power/supermatter_crystal/S = attached_to if(!istype(S)) return return "<div align='center' valign='middle' style='position:relative; top:0px; left:0px'>[round(S.get_integrity_percent(), 1)]%</div>" + */ /obj/effect/countdown/transformer name = "transformer countdown" diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 371a2eeb34f..12a78e769d0 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -171,6 +171,7 @@ playsound(get_turf(src), hitsound, 75, TRUE, -1) return TOXLOSS +/* /obj/item/melee/supermatter_sword name = "supermatter sword" desc = "In a station full of bad ideas, this might just be the worst." @@ -272,7 +273,7 @@ /obj/item/melee/supermatter_sword/add_blood_DNA(list/blood_dna) return FALSE - +*/ /obj/item/melee/curator_whip name = "curator's whip" desc = "Somewhat eccentric and outdated, it still stings like hell to be hit by." @@ -294,7 +295,7 @@ var/mob/living/carbon/human/human_target = target human_target.drop_all_held_items() human_target.visible_message(span_danger("[user] disarms [human_target]!"), span_userdanger("[user] disarmed you!")) - +/* /obj/item/melee/roastingstick name = "advanced roasting stick" desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits." @@ -413,6 +414,7 @@ QDEL_NULL(beam) playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) to_chat(user, span_notice("You put [src] away.")) +*/ /obj/item/melee/cleric_mace name = "cleric mace" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 66372fcc4eb..d85f33be32b 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -457,7 +457,8 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ return ..() /obj/item/stack/sheet/mineral/coal/fire_act(exposed_temperature, exposed_volume) - atmos_spawn_air("co2=[amount*10];TEMP=[exposed_temperature]") + var/turf/muhturf = get_turf(src) + muhturf.atmos_spawn_air(GAS_CO2, amount*10, exposed_temperature) qdel(src) /obj/item/stack/sheet/mineral/coal/five diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 916c42c01e8..327dcf0b93a 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -61,6 +61,7 @@ return ..() if(used_item.get_temperature()) start_burning() + /* if(grill) if(istype(used_item, /obj/item/melee/roastingstick)) return FALSE @@ -75,7 +76,8 @@ used_item.pixel_x = used_item.base_pixel_x + clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) used_item.pixel_y = used_item.base_pixel_y + clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) else - return ..() + return ..()*/ + return ..() /obj/structure/bonfire/attack_hand(mob/user, list/modifiers) diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 9fbc6d1c1f2..2c044d922b3 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -14,7 +14,7 @@ var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space/space_gas = new + var/static/datum/gas_mixture/immutable/space_gas = new // run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER @@ -94,7 +94,7 @@ /turf/open/space/AfterChange() ..() - atmos_overlay_types = null + //atmos_overlay_types = null /turf/open/space/Assimilate_Air() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7055901b8d3..3f04ef1b941 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -19,7 +19,7 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/mark_datum_mapview, /client/proc/tag_datum_mapview, /client/proc/debugstatpanel, - /client/proc/fix_air, /*resets air in designated radius to its default atmos composition*/ + /client/proc/fixatmos, /*resets air in designated radius to its default atmos composition*/ /client/proc/requests ) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 0098317ce9f..8762e7edeea 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -14,8 +14,8 @@ var/current_time = world.timeofday // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) - S.power = 0 + /*for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) + S.power = 0*/ to_chat(usr, "\[1/5\] - Supermatter depowered") // Remove all gases from all pipenets diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 9c84efd5524..8386386f162 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/field/containment, - /obj/machinery/power/supermatter_crystal, + //obj/machinery/power/supermatter_crystal, /obj/machinery/doomsday_device, /obj/machinery/nuclearbomb, /obj/machinery/nuclearbomb/selfdestruct, diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 55721a9e347..674c6265dd6 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -70,7 +70,7 @@ Class Procs: src.A = A src.B = B zoneA = A.zone - if(istype(B /turf/open/space)) + if(istype(B, /turf/open/space)) mark_space() edge = SSzas.get_edge(A.zone,B) edge.add_connection(src) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 1037a7a5b3e..33968da3bed 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -446,7 +446,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //return a truthy value of whether burning actually happened return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) -/turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) +//turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) +/turf/proc/adjacent_fire_act(turf/source, exposed_temperature, exposed_volume) return //turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) ZASTURF @@ -458,8 +459,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin W.fire_act(adj_air, adj_temp, adj_volume) /turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - burn(adj_temp) + //burn(adj_temp) if(adj_temp > heat_capacity) take_damage(log(Frand(0.9, 1.1) * (adj_temp - heat_capacity)), BURN) return ..() + +/obj/effect/dummy/lighting_obj/moblight/fire + name = "fire" + light_color = LIGHT_COLOR_FIRE + light_range = LIGHT_RANGE_FIRE diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index ac359e9e743..2c223d56dba 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -12,7 +12,7 @@ var/planetary_atmos //Let's just let this exist for now. ///turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) ZASTURF -/turf/open/proc/update_graphic(list/graphic_add = null, list/graphic_null = null) +/turf/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) vis_contents += graphic_add if(graphic_remove && graphic_remove.len) @@ -50,8 +50,8 @@ //if(istype(unsim, /turf/simulated)) ZASTURF if(unsim.simulated) //var/turf/simulated/sim = unsim - if(TURF_HAS_VALID_ZONE(sim)) - SSzas.connect(sim, src) + if(TURF_HAS_VALID_ZONE(unsim)) + SSzas.connect(unsim, src) // Helper for can_safely_remove_from_zone(). //ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT @@ -246,14 +246,15 @@ /turf/proc/post_update_air_properties() if(connections) connections.update_all() - +/* /turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - return 0 + return 0*/ -/turf/proc/assume_gas(gasid, moles, temp = 0) - return 0 +/*/turf/proc/assume_gas(gasid, moles, temp = 0) + return 0*/ /turf/return_air() + RETURN_TYPE(/datum/gas_mixture) //Create gas mixture to hold data for passing var/datum/gas_mixture/GM = new diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index aa85da6b36f..bb115cccdd8 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -493,6 +493,24 @@ update_values() return gas +/datum/gas_mixture/proc/return_visuals() + update_values() + check_tile_graphic() + return graphic + +/datum/gas_mixture/proc/copy() + RETURN_TYPE(/datum/gas_mixture) + var/datum/gas_mixture/new_gas = new + update_values() + new_gas.gas = src.gas + new_gas.temperature = src.temperature + new_gas.total_moles = src.total_moles + return new_gas + +/turf/open/proc/copy_air_with_tile(turf/open/target_turf) + if(istype(target_turf)) + air.copy_from(target_turf.air) + /datum/gas_mixture/proc/leak_to_enviroment(datum/gas_mixture/environment) pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.return_pressure() - environment.return_pressure())) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm index efbdc276daf..f1fb6daff8b 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm @@ -6,7 +6,7 @@ temperature = initial_temperature return ..() -/datum/gas_mixture/immutable/adjust_gas() +/datum/gas_mixture/immutable/adjust_gas(gasid, moles, update = 1) return /datum/gas_mixture/immutable/remove() @@ -24,7 +24,7 @@ /datum/gas_mixture/immutable/multiply() return TRUE -/datum/gas_mixture/immutable/adjust_gas_temp() +/datum/gas_mixture/immutable/adjust_gas_temp(gasid, moles, temp, update = 1) return /datum/gas_mixture/immutable/adjust_multi() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 61edb735bfd..39e7ecefdcb 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -917,6 +917,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/datum/port/output/pressure var/datum/port/output/gas_amount + var/datum/port/output/my_temperature var/obj/machinery/airalarm/connected_alarm var/list/options_map @@ -929,7 +930,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) request_data = add_input_port("Request Atmosphere Data", PORT_TYPE_SIGNAL) pressure = add_output_port("Pressure", PORT_TYPE_NUMBER) - temperature = add_output_port("Temperature", PORT_TYPE_NUMBER) + my_temperature = add_output_port("Temperature", PORT_TYPE_NUMBER) gas_amount = add_output_port("Chosen Gas Amount", PORT_TYPE_NUMBER) /obj/item/circuit_component/air_alarm/populate_options() @@ -966,7 +967,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) var/turf/alarm_turf = get_turf(connected_alarm) var/datum/gas_mixture/environment = alarm_turf.return_air() pressure.set_output(round(environment.return_pressure())) - temperature.set_output(round(environment.temperature)) + my_temperature.set_output(round(environment.temperature)) if(ispath(options_map[current_option])) gas_amount.set_output(round(environment.get_gases()[options_map[current_option]])) return diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 8613c267306..951134dc6d8 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -268,7 +268,7 @@ window = image(icon, icon_state = "window-bg", layer = FLOAT_LAYER) var/list/new_underlays = list() - for(var/obj/effect/overlay/gas/gas as anything in air_contents.return_visuals()) + for(var/obj/effect/gas_overlay/gas as anything in air_contents.return_visuals()) var/image/new_underlay = image(gas.icon, icon_state = gas.icon_state, layer = FLOAT_LAYER) new_underlay.filters = alpha_mask_filter(icon = icon(icon, icon_state = "window-bg")) new_underlays += new_underlay diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 78fd349b75c..a565712f11f 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -136,7 +136,7 @@ data["filter_types"] = list() for(var/gas in GLOB.all_gases) - data["filter_types"] += list(list("name" = gas[META_GAS_NAME], "enabled" = (path in filter_type))) + data["filter_types"] += list(list("name" = xgm_gas_data[gas], "enabled" = (gas in filter_type))) return data @@ -161,15 +161,15 @@ transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) if("toggle_filter") - if(!gas_id2path(params["val"])) + if(!params["val"]) return TRUE - filter_type ^= gas_id2path(params["val"]) + filter_type ^= params["val"] var/change - if(gas_id2path(params["val"]) in filter_type) + if(params["val"] in filter_type) change = "added" else change = "removed" - var/gas_name = GLOB.meta_gas_info[gas_id2path(params["val"])][META_GAS_NAME] + var/gas_name = xgm_gas_data.name[params["val"]] investigate_log("[key_name(usr)] [change] [gas_name] from the filter type.", INVESTIGATE_ATMOS) . = TRUE update_appearance() @@ -227,19 +227,20 @@ icon_state = "filter_on-0" /obj/machinery/atmospherics/components/trinary/filter/atmos/n2 name = "nitrogen filter" - filter_type = list(/datum/gas/nitrogen) + filter_type = list(GAS_N2O) /obj/machinery/atmospherics/components/trinary/filter/atmos/o2 name = "oxygen filter" - filter_type = list(/datum/gas/oxygen) + filter_type = list(GAS_OXYGEN) /obj/machinery/atmospherics/components/trinary/filter/atmos/co2 name = "carbon dioxide filter" - filter_type = list(/datum/gas/carbon_dioxide) + filter_type = list(GAS_CO2) /obj/machinery/atmospherics/components/trinary/filter/atmos/n2o name = "nitrous oxide filter" - filter_type = list(/datum/gas/nitrous_oxide) + filter_type = list(GAS_N2O) /obj/machinery/atmospherics/components/trinary/filter/atmos/plasma name = "plasma filter" - filter_type = list(/datum/gas/plasma) + filter_type = list(GAS_PLASMA) +/* /obj/machinery/atmospherics/components/trinary/filter/atmos/bz name = "bz filter" filter_type = list(/datum/gas/bz) @@ -252,9 +253,11 @@ /obj/machinery/atmospherics/components/trinary/filter/atmos/healium name = "healium filter" filter_type = list(/datum/gas/healium) +*/ /obj/machinery/atmospherics/components/trinary/filter/atmos/h2 name = "hydrogen filter" - filter_type = list(/datum/gas/hydrogen) + filter_type = list(GAS_HYDROGEN) +/* /obj/machinery/atmospherics/components/trinary/filter/atmos/hypernoblium name = "hypernoblium filter" filter_type = list(/datum/gas/hypernoblium) @@ -287,25 +290,26 @@ /obj/machinery/atmospherics/components/trinary/filter/atmos/antinoblium name = "antinoblium filter" filter_type = list(/datum/gas/antinoblium) - +*/ /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped //This feels wrong, I know icon_state = "filter_on-0_f" flipped = TRUE /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2 name = "nitrogen filter" - filter_type = list(/datum/gas/nitrogen) + filter_type = list(GAS_NITROGEN) /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2 name = "oxygen filter" - filter_type = list(/datum/gas/oxygen) + filter_type = list(GAS_OXYGEN) /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2 name = "carbon dioxide filter" - filter_type = list(/datum/gas/carbon_dioxide) + filter_type = list(GAS_CO2) /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o name = "nitrous oxide filter" - filter_type = list(/datum/gas/nitrous_oxide) + filter_type = list(GAS_N2O) /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma name = "plasma filter" - filter_type = list(/datum/gas/plasma) + filter_type = list(GAS_PLASMA) + /* /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/bz name = "bz filter" filter_type = list(/datum/gas/bz) @@ -318,9 +322,11 @@ /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/healium name = "healium filter" filter_type = list(/datum/gas/healium) +*/ /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2 name = "hydrogen filter" - filter_type = list(/datum/gas/hydrogen) + filter_type = list(GAS_HYDROGEN) +/* /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/hypernoblium name = "hypernoblium filter" filter_type = list(/datum/gas/hypernoblium) @@ -351,6 +357,7 @@ /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/antinoblium name = "antinoblium filter" filter_type = list(/datum/gas/antinoblium) +*/ // These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event. diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 767fa2534e3..b40d85073c1 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -154,7 +154,7 @@ ///Pressure of the pipenet var/datum/port/output/pressure ///Temperature of the pipenet - var/datum/port/output/temperature + var/datum/port/output/net_temperature ///The component parent object var/obj/machinery/meter/connected_meter @@ -163,7 +163,7 @@ request_data = add_input_port("Request Meter Data", PORT_TYPE_SIGNAL, trigger = .proc/request_meter_data) pressure = add_output_port("Pressure", PORT_TYPE_NUMBER) - temperature = add_output_port("Temperature", PORT_TYPE_NUMBER) + net_temperature = add_output_port("Temperature", PORT_TYPE_NUMBER) /obj/item/circuit_component/atmos_meter/register_usb_parent(atom/movable/shell) . = ..() @@ -180,7 +180,7 @@ return var/datum/gas_mixture/environment = connected_meter.target.return_air() pressure.set_output(environment.return_pressure()) - temperature.set_output(environment.temperature) + net_temperature.set_output(environment.temperature) // TURF METER - REPORTS A TILE'S AIR CONTENTS // why are you yelling? diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 968dc8f08f0..961929d52ed 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -679,7 +679,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/list/gaseslog = list() //list for logging all gases in canister for(var/gas in air_contents.gas) gaseslog[xgm_gas_data.name[gas]] = air_contents.get_gas(gas) //adds gases to gaseslog - if(!xgm_gas_data.flags[gas] & XGM_GAS_CONTAMINANT|XGM_GAS_FUEL) + if(!(xgm_gas_data.flags[gas] & XGM_GAS_CONTAMINANT|XGM_GAS_FUEL)) continue danger = TRUE //at least 1 danger gas logmsg = "[key_name(usr)] <b>opened</b> a canister that contains the following:" diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 8612cae4cb2..632348c29d5 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -269,7 +269,7 @@ return exposed_temperature > 300 /obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) - var/open/turf/turfloc = get_turf(src) + var/turf/turfloc = get_turf(src) turfloc.atmos_spawn_air(GAS_PLASMA, 20, exposed_temperature) visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) qdel(src) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 8ecf86d9684..fde566b6c08 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -370,7 +370,8 @@ . = ..() if(. & EMP_PROTECT_SELF) return - atmos_spawn_air("TEMP=1000") + var/turf/T = get_turf(src) + T.atmos_spawn_air(GAS_OXYGEN, 1, 1000) // ---------------------------- diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index a53924cf2f3..225eef969fe 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -621,13 +621,12 @@ stop_gas() return - var/turf/open/tray_turf = get_turf(tray) + var/turf/tray_turf = get_turf(tray) if(abs(ONE_ATMOSPHERE - tray_turf.return_air().return_pressure()) > (seed.potency / 10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos return var/datum/gas_mixture/stank = new - ADD_GAS(/datum/gas/miasma, stank.gases) - stank.gases[/datum/gas/miasma][MOLES] = (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + stank.adjust_gas(GAS_METHANE, (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier tray_turf.assume_air(stank) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 08f872c3072..00497473f12 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -105,7 +105,7 @@ // NOTE, now that Initialize and LateInitialize run correctly, do we really // need these two below? SSmachines.setup_template_powernets(cables) - SSair.setup_template_machinery(atmos_machines) + SSzas.setup_template_machinery(atmos_machines) SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border @@ -156,11 +156,13 @@ var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z)) + /* for(var/L in border) var/turf/turf_to_disable = L SSair.remove_from_active(turf_to_disable) //stop processing turfs along the border to prevent runtimes, we return it in initTemplateBounds() turf_to_disable.atmos_adjacent_turfs?.Cut() - + */ + SSzas.can_fire = FALSE // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. var/datum/parsed_map/parsed = cached_map || new(file(mappath)) @@ -187,6 +189,7 @@ generate_ceiling(affected_turfs) log_game("[name] loaded at [T.x],[T.y],[T.z]") + SSzas.can_fire = TRUE return bounds /datum/map_template/proc/generate_ceiling(affected_turfs) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 4bc3466dfc8..d556498e188 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -113,9 +113,9 @@ /mob/living/simple_animal/hostile/regalrat/handle_environment(datum/gas_mixture/environment) . = ..() - if(stat == DEAD || !environment || !environment.gases[/datum/gas/miasma]) + if(stat == DEAD || !environment || !environment.get_gas(GAS_METHANE)) return - var/miasma_percentage = environment.gases[/datum/gas/miasma][MOLES] / environment.total_moles() + var/miasma_percentage = environment.gas[GAS_METHANE] / environment.total_moles() if(miasma_percentage>=0.25) heal_bodypart_damage(1) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 87631e7d383..7191222d288 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -127,8 +127,8 @@ var/t = "[span_notice("Coordinates: [x],[y] ")]\n" t += "[span_danger("Temperature: [environment.temperature] ")]\n" for(var/id in environment.gas) - if(gas[id]) - t+="[span_notice("[gas]: [gas[MOLES]] ")]\n" + if(!environment.get_gas(id)) + t+="[span_notice("[xgm_gas_data.name[environment.gas]]: [environment.get_gas(id)] ")]\n" to_chat(usr, t) diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index bbde8533364..acd31b0135b 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -73,7 +73,7 @@ . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/alarm_monitor) - hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) + //hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) /obj/item/modular_computer/tablet/preset/advanced/security/Initialize(mapload) . = ..() @@ -93,7 +93,7 @@ . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/alarm_monitor) - hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) + //hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) /// Given to Nuke Ops members. /obj/item/modular_computer/tablet/nukeops/Initialize(mapload) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index e2e79eed7d0..3263088816b 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -36,7 +36,7 @@ var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/power_monitor()) hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) - hard_drive.store_file(new/datum/computer_file/program/supermatter_monitor()) + //hard_drive.store_file(new/datum/computer_file/program/supermatter_monitor()) // ===== RESEARCH CONSOLE ===== /obj/machinery/modular_computer/console/preset/research diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm index c9a39ba40fc..58856a46ba9 100644 --- a/code/modules/power/lighting/light_items.dm +++ b/code/modules/power/lighting/light_items.dm @@ -135,5 +135,6 @@ force = 5 playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) if(rigged) - atmos_spawn_air("plasma=5") //5u of plasma are required to rig a light bulb/tube + var/turf/T = get_turf(src) + T.atmos_spawn_air(GAS_PLASMA, 5) //5u of plasma are required to rig a light bulb/tube update() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 5636cac5203..76d358296e4 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -290,11 +290,12 @@ /obj/singularity/proc/consume(atom/thing) var/gain = thing.singularity_act(current_size, src) energy += gain - if(istype(thing, /obj/machinery/power/supermatter_crystal) && !consumed_supermatter) + /*if(istype(thing, /obj/machinery/power/supermatter_crystal) && !consumed_supermatter) desc = "[initial(desc)] It glows fiercely with inner fire." name = "supermatter-charged [initial(name)]" consumed_supermatter = TRUE set_light(10) + */ /obj/singularity/proc/check_cardinals_range(steps, retry_with_move = FALSE) . = length(GLOB.cardinals) //Should be 4. diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 844b41c05c7..6f82e45a4bf 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -9,6 +9,7 @@ /datum/map_generator_module/bottom_layer/repressurize/generate() if(!mother) return + /* var/list/map = mother.map for(var/turf/T in map) SSair.remove_from_active(T) @@ -16,7 +17,7 @@ if(T.air) T.air.copy_from_turf(T) SSair.add_to_active(T, TRUE) - +*/ /datum/map_generator_module/bottom_layer/massdelete spawnableAtoms = list() spawnableTurfs = list() diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index b305ac2c438..21789898daa 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -51,7 +51,7 @@ SSatoms.InitializeAtoms(atoms) SSmachines.setup_template_powernets(cables) - SSair.setup_template_machinery(atmos_machines) + SSzas.setup_template_machinery(atmos_machines) GLOB.reloading_map = FALSE /datum/map_generator/repair diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 6f6e39004e5..a3db79507f4 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -5,22 +5,22 @@ damage_type = BURN nodamage = FALSE armor_flag = ENERGY - var/temperature = -50 // reduce the body temperature by 50 points + var/adj_temperature = -50 // reduce the body temperature by 50 points /obj/projectile/temp/on_hit(atom/target, blocked = 0) . = ..() if(iscarbon(target)) var/mob/living/carbon/hit_mob = target - var/thermal_protection = 1 - hit_mob.get_insulation_protection(hit_mob.bodytemperature + temperature) + var/thermal_protection = 1 - hit_mob.get_insulation_protection(hit_mob.bodytemperature + adj_temperature) // The new body temperature is adjusted by the bullet's effect temperature // Reduce the amount of the effect temperature change based on the amount of insulation the mob is wearing - hit_mob.adjust_bodytemperature((thermal_protection * temperature) + temperature) + hit_mob.adjust_bodytemperature((thermal_protection * adj_temperature) + adj_temperature) else if(isliving(target)) var/mob/living/L = target // the new body temperature is adjusted by the bullet's effect temperature - L.adjust_bodytemperature((1 - blocked) * temperature) + L.adjust_bodytemperature((1 - blocked) * adj_temperature) /obj/projectile/temp/hot name = "heat beam" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 5cbd3f2d9d1..bb1805373f3 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -107,8 +107,8 @@ if(!holder.my_atom) return - var/atom/A = holder.my_atom - A.atmos_spawn_air("plasma=[volume];TEMP=[holder.chem_temp]") + var/turf/T = get_turf(holder.my_atom) + T.atmos_spawn_air(GAS_PLASMA, volume, holder.chem_temp) holder.del_reagent(type) /datum/reagent/toxin/plasma/expose_turf(turf/open/exposed_turf, reac_volume) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 331a8431dac..9996cf5e216 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -210,10 +210,9 @@ /datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder) if(holder?.my_atom) - var/turf/open/T = get_turf(holder.my_atom) + var/turf/T = get_turf(holder.my_atom) if(istype(T)) - var/datum/gas/gastype = /datum/gas/nitrogen - T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7") + T.atmos_spawn_air(GAS_NITROGEN, 50, 2.7) /datum/chemical_reaction/slime/slimefireproof required_reagents = list(/datum/reagent/water = 1) diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index 56c93fbbe79..08103972c0e 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -284,8 +284,8 @@ // Make sure the list is indexed first. if(reaction_data.len) for (var/path in reaction_data[TANK_RESULTS_REACTION]) - var/datum/gas_reaction/reaction_path = path - record_data["reaction_results"] += initial(reaction_path.name) + //var/datum/gas_reaction/reaction_path = path + record_data["reaction_results"] += "UNIMPLIMENTED - GAS REACTIONS" if(TANK_MERGE_OVERPRESSURE in reaction_data[TANK_RESULTS_MISC]) record_data["reaction_results"] += "Tank overpressurized before reaction" diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 75070f324f2..824c7437c80 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -192,8 +192,8 @@ new_record.name = "Log Recording #[record_number]" new_record.experiment_source = inserted_tank.name new_record.timestamp = station_time_timestamp() - for(var/gas_path in leaked_gas_buffer.gases) - new_record.gas_data[gas_path] = leaked_gas_buffer.gases[gas_path][MOLES] + for(var/gas_path in leaked_gas_buffer.gas) + new_record.gas_data[gas_path] = leaked_gas_buffer.gas[gas_path] compressor_record += new_record record_number += 1 @@ -358,7 +358,6 @@ "gases" = list() ) for (var/path in record.gas_data) - var/datum/gas/gas_path = path - single_record_data["gases"] += list(initial(gas_path.name) = record.gas_data[gas_path]) + single_record_data["gases"] += list(path = record.gas_data[path]) data["records"] += list(single_record_data) return data diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 56d2c56a8e9..d649701840c 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -104,14 +104,12 @@ Chilling extracts: to_chat(user, span_warning("[src] can't affect such a large area.")) return var/filtered = FALSE - for(var/turf/open/T in A) + for(var/turf/T in A) var/datum/gas_mixture/G = T.air if(istype(G)) - G.assert_gas(/datum/gas/plasma) - G.gases[/datum/gas/plasma][MOLES] = 0 + G.gas[GAS_PLASMA] = 0 filtered = TRUE - G.garbage_collect() - T.//air_update_turf(FALSE, FALSE) + //T.air_update_turf(FALSE, FALSE) if(filtered) user.visible_message(span_notice("Cracks spread throughout [src], and some air is sucked in!")) else diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm index 1fd36f7a7d1..55c6bb5fc5d 100644 --- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm @@ -45,7 +45,7 @@ new /obj/item/organ/tongue/tied(src) new /obj/item/autosurgeon/organ/syndicate/commsagent(src) new /obj/item/clothing/gloves/radio(src) - +/* /obj/machinery/power/supermatter_crystal/shard/syndicate name = "syndicate supermatter shard" desc = "Your benefactors conveinently neglected to mention it's already assembled." @@ -61,3 +61,4 @@ return else . = ..() +*/ diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index f72f19c96ad..17659877f5b 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -88,7 +88,7 @@ All ShuttleMove procs go here blocks_air = initial(blocks_air) //air_update_turf(TRUE, blocks_air) oldT.blocks_air = initial(oldT.blocks_air) - oldT.//air_update_turf(TRUE, oldT.blocks_air) + //oldT.air_update_turf(TRUE, oldT.blocks_air) ///////////////////////////////////////////////////////////////////////////////////// @@ -254,7 +254,7 @@ All ShuttleMove procs go here A.atmos_init() if(A.return_pipenet()) A.add_member(src) - SSair.add_to_rebuild_queue(src) + SSzas.add_to_rebuild_queue(src) else // atmos_init() calls update_appearance(), so we don't need to call it update_appearance() diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 7f7889f7f1f..cb1f8f01062 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -110,34 +110,35 @@ breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) return FALSE - for(var/gas_id in GLOB.meta_gas_info) - breath.assert_gas(gas_id) - if(istype(breather.wear_mask) && (breather.wear_mask.clothing_flags & GAS_FILTERING) && breather.wear_mask.has_filter) breath = breather.wear_mask.consume_filter(breath) var/gas_breathed = 0 - var/list/breath_gases = breath.gases + //var/list/breath_gases = breath.gases + //Handle subtypes' breath processing + handle_gas_override(breather, breath, gas_breathed) //Partial pressures in our breath - var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES])) - var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES]) - var/Plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) - var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) + var/O2_moles = breath.get_gas(GAS_OXYGEN) + var/N2_moles = breath.get_gas(GAS_NITROGEN) + var/plasma_moles = breath.get_gas(GAS_PLASMA) + var/CO2_moles = breath.get_gas(GAS_CO2) + + var/O2_pp = breath.get_breath_partial_pressure(O2_moles)//+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES])) + var/N2_pp = breath.get_breath_partial_pressure(N2_moles) + var/Plasma_pp = breath.get_breath_partial_pressure(plasma_moles) + var/CO2_pp = breath.get_breath_partial_pressure(CO2_moles) //Vars for n2o and healium induced euphorias. var/n2o_euphoria = EUPHORIA_LAST_FLAG var/healium_euphoria = EUPHORIA_LAST_FLAG - //Handle subtypes' breath processing - handle_gas_override(breather,breath_gases, gas_breathed) - //-- OXY --// //Too much oxygen! //Yes, some species may not like it. if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) - var/ratio = (breath_gases[/datum/gas/oxygen][MOLES]/safe_oxygen_max) * 10 + var/ratio = (O2_moles/safe_oxygen_max) * 10 breather.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) breather.throw_alert(ALERT_TOO_MUCH_OXYGEN, /atom/movable/screen/alert/too_much_oxy) else @@ -146,18 +147,18 @@ //Too little oxygen! if(safe_oxygen_min) if(O2_pp < safe_oxygen_min) - gas_breathed = handle_too_little_breath(breather, O2_pp, safe_oxygen_min, breath_gases[/datum/gas/oxygen][MOLES]) + gas_breathed = handle_too_little_breath(breather, O2_pp, safe_oxygen_min, O2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) breather.adjustOxyLoss(-5) - gas_breathed = breath_gases[/datum/gas/oxygen][MOLES] + gas_breathed = O2_moles breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) //Exhale - breath_gases[/datum/gas/oxygen][MOLES] -= gas_breathed - breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed + breath.adjust_gas(GAS_OXYGEN, -gas_breathed) + breath.adjust_gas(GAS_CO2, gas_breathed) gas_breathed = 0 //-- Nitrogen --// @@ -165,7 +166,7 @@ //Too much nitrogen! if(safe_nitro_max) if(N2_pp > safe_nitro_max) - var/ratio = (breath_gases[/datum/gas/nitrogen][MOLES]/safe_nitro_max) * 10 + var/ratio = (N2_moles/safe_nitro_max) * 10 breather.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) breather.throw_alert(ALERT_TOO_MUCH_NITRO, /atom/movable/screen/alert/too_much_nitro) else @@ -174,18 +175,18 @@ //Too little nitrogen! if(safe_nitro_min) if(N2_pp < safe_nitro_min) - gas_breathed = handle_too_little_breath(breather, N2_pp, safe_nitro_min, breath_gases[/datum/gas/nitrogen][MOLES]) + gas_breathed = handle_too_little_breath(breather, N2_pp, safe_nitro_min, N2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) breather.adjustOxyLoss(-5) - gas_breathed = breath_gases[/datum/gas/nitrogen][MOLES] + gas_breathed = N2_moles breather.clear_alert(ALERT_NOT_ENOUGH_NITRO) //Exhale - breath_gases[/datum/gas/nitrogen][MOLES] -= gas_breathed - breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed + breath.adjust_gas(GAS_NITROGEN, -gas_breathed) + breath.adjust_gas(GAS_CO2, gas_breathed) gas_breathed = 0 //-- CO2 --// @@ -211,18 +212,18 @@ //Too little CO2! if(safe_co2_min) if(CO2_pp < safe_co2_min) - gas_breathed = handle_too_little_breath(breather, CO2_pp, safe_co2_min, breath_gases[/datum/gas/carbon_dioxide][MOLES]) + gas_breathed = handle_too_little_breath(breather, CO2_pp, safe_co2_min, CO2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_CO2, /atom/movable/screen/alert/not_enough_co2) else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) breather.adjustOxyLoss(-5) - gas_breathed = breath_gases[/datum/gas/carbon_dioxide][MOLES] + gas_breathed = CO2_moles breather.clear_alert(ALERT_NOT_ENOUGH_CO2) //Exhale - breath_gases[/datum/gas/carbon_dioxide][MOLES] -= gas_breathed - breath_gases[/datum/gas/oxygen][MOLES] += gas_breathed + breath.adjust_gas(GAS_CO2, -gas_breathed) + breath.adjust_gas(GAS_OXYGEN, gas_breathed) gas_breathed = 0 @@ -231,7 +232,7 @@ //Too much plasma! if(safe_plasma_max) if(Plasma_pp > safe_plasma_max) - var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_plasma_max) * 10 + var/ratio = (plasma_moles/safe_plasma_max) * 10 breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) breather.throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) else @@ -241,18 +242,18 @@ //Too little plasma! if(safe_plasma_min) if(Plasma_pp < safe_plasma_min) - gas_breathed = handle_too_little_breath(breather, Plasma_pp, safe_plasma_min, breath_gases[/datum/gas/plasma][MOLES]) + gas_breathed = handle_too_little_breath(breather, Plasma_pp, safe_plasma_min, plasma_moles) breather.throw_alert(ALERT_NOT_ENOUGH_PLASMA, /atom/movable/screen/alert/not_enough_plas) else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) breather.adjustOxyLoss(-5) - gas_breathed = breath_gases[/datum/gas/plasma][MOLES] + gas_breathed = plasma_moles breather.clear_alert(ALERT_NOT_ENOUGH_PLASMA) //Exhale - breath_gases[/datum/gas/plasma][MOLES] -= gas_breathed - breath_gases[/datum/gas/carbon_dioxide][MOLES] += gas_breathed + breath.adjust_gas(GAS_PLASMA, -gas_breathed) + breath.adjust_gas(GAS_CO2, gas_breathed) gas_breathed = 0 @@ -261,8 +262,8 @@ if(breath) // If there's some other shit in the air lets deal with it here. // N2O - - var/SA_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrous_oxide][MOLES]) + var/n2o_moles = breath.get_gas(GAS_N2O) + var/SA_pp = breath.get_breath_partial_pressure(n2o_moles) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) breather.Unconscious(60) // 60 gives them one second to wake up and run away a bit! @@ -277,7 +278,7 @@ n2o_euphoria = EUPHORIA_INACTIVE breather.clear_alert(ALERT_TOO_MUCH_N2O) - + /* // BZ var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) @@ -428,6 +429,7 @@ // Clear out moods when no miasma at all else SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") + */ if (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) @@ -436,12 +438,12 @@ // Activate mood on first flag, remove on second, do nothing on third. handle_breath_temperature(breath, breather) - breath.garbage_collect() + breath.update_values() return TRUE ///override this for breath handling unique to lung subtypes, breath_gas is the list of gas in the breath while gas breathed is just what is being added or removed from that list, just as they are when this is called in check_breath() -/obj/item/organ/lungs/proc/handle_gas_override(mob/living/carbon/human/breather, list/breath_gas, gas_breathed) +/obj/item/organ/lungs/proc/handle_gas_override(mob/living/carbon/human/breather, datum/gas_mixture/breath, gas_breathed) return /obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0) @@ -524,8 +526,8 @@ /obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) . = ..() - if (breath?.gases[/datum/gas/plasma]) - var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma][MOLES]) + if (breath.get_gas(GAS_PLASMA)) + var/plasma_pp = breath.get_breath_partial_pressure(breath.get_gas(GAS_PLASMA)) owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/cybernetic @@ -578,7 +580,7 @@ // Normal oxygen is 21 kPa partial pressure, but SS13 humans can tolerate down // to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules. #define GAS_TOLERANCE 5 - +/* /obj/item/organ/lungs/ashwalker/Initialize(mapload) . = ..() @@ -590,23 +592,14 @@ // Take a "breath" of the air var/datum/gas_mixture/breath = mix.remove(mix.total_moles() * BREATH_PERCENTAGE) - var/list/breath_gases = breath.gases - - breath.assert_gases( - /datum/gas/oxygen, - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrogen, - /datum/gas/bz, - /datum/gas/miasma, - ) - var/oxygen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES]) var/nitrogen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES]) var/plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) var/carbon_dioxide_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) + /* var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma][MOLES]) + */ safe_oxygen_min = max(0, oxygen_pp - GAS_TOLERANCE) safe_nitro_min = max(0, nitrogen_pp - GAS_TOLERANCE) @@ -621,13 +614,16 @@ safe_co2_max = carbon_dioxide_pp + GAS_TOLERANCE * 2 // The lung tolerance against BZ is also increased the amount of BZ in the base air + /* BZ_trip_balls_min += bz_pp BZ_brain_damage_min += bz_pp + */ // Lungs adapted to a high miasma atmosphere do not process it, and breathe it back out - if(miasma_pp) - suffers_miasma = FALSE + //if(miasma_pp) + //suffers_miasma = FALSE +*/ #undef GAS_TOLERANCE /obj/item/organ/lungs/ethereal @@ -638,10 +634,11 @@ heat_level_2_threshold = 473 heat_level_3_threshold = 1073 - +/* /obj/item/organ/lungs/ethereal/handle_gas_override(mob/living/carbon/human/breather, list/breath_gases, gas_breathed) // H2O electrolysis gas_breathed = breath_gases[/datum/gas/water_vapor][MOLES] breath_gases[/datum/gas/oxygen][MOLES] += gas_breathed breath_gases[/datum/gas/hydrogen][MOLES] += gas_breathed*2 breath_gases[/datum/gas/water_vapor][MOLES] -= gas_breathed +*/ diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index d564b291a60..4a88ca40646 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -26,7 +26,7 @@ //Prep the floor to_fill.initial_gas_mix = OPENTURF_DEFAULT_ATMOS to_fill.air = new - to_fill.air.copy_from_turf(to_fill) + to_fill.air.copy_from(to_fill.return_air()) lab_rat.breathe() @@ -66,7 +66,7 @@ //Prep the floor to_fill.initial_gas_mix = LAVALAND_DEFAULT_ATMOS to_fill.air = new - to_fill.air.copy_from_turf(to_fill) + to_fill.air.copy_from(to_fill.return_air()) lab_rat.breathe() diff --git a/code/modules/unit_tests/gas_transfer.dm b/code/modules/unit_tests/gas_transfer.dm index 097a9a5efdb..9a7b4a78d62 100644 --- a/code/modules/unit_tests/gas_transfer.dm +++ b/code/modules/unit_tests/gas_transfer.dm @@ -2,6 +2,7 @@ /datum/unit_test/atmospheric_gas_transfer /datum/unit_test/atmospheric_gas_transfer/Run() + /* for (var/tempNmoles in list(1e4, 1e6, 1e8, 1e10, 1e12)) var/datum/gas_mixture/first_mix = allocate(/datum/gas_mixture) var/datum/gas_mixture/second_mix = allocate(/datum/gas_mixture) @@ -27,3 +28,4 @@ var/margin = abs(second_mix.return_pressure() - (initial_pressure+additional_pressure)) TEST_ASSERT(margin<=error_margin, "Gas pressure pumping test failed for [tempNmoles]. Expected pressure = [initial_pressure+additional_pressure] +/- [error_margin]. Got [second_mix.return_pressure()].") + */ diff --git a/tgstation.dme b/tgstation.dme index e3a64ff6816..e28066aea52 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -355,7 +355,7 @@ #include "code\__HELPERS\verbs.dm" #include "code\__HELPERS\view.dm" #include "code\__HELPERS\weakref.dm" -//#include "code\__HELPERS\zas.dm" +#include "code\__HELPERS\zas.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -3574,7 +3574,7 @@ #include "code\modules\modular_computers\file_system\programs\secureye.dm" #include "code\modules\modular_computers\file_system\programs\signaler.dm" #include "code\modules\modular_computers\file_system\programs\skill_tracker.dm" -#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" +//#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\techweb.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" @@ -3693,15 +3693,19 @@ #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\narsie.dm" #include "code\modules\power\singularity\singularity.dm" +/* #include "code\modules\power\supermatter\supermatter.dm" #include "code\modules\power\supermatter\supermatter_hit_procs.dm" #include "code\modules\power\supermatter\supermatter_process.dm" #include "code\modules\power\supermatter\supermatter_radiation.dm" +*/ #include "code\modules\power\tesla\coil.dm" #include "code\modules\power\tesla\energy_ball.dm" +/* #include "code\modules\power\turbine\turbine.dm" #include "code\modules\power\turbine\turbine_computer.dm" #include "code\modules\power\turbine\turbine_parts.dm" +*/ #include "code\modules\procedural_mapping\mapGenerator.dm" #include "code\modules\procedural_mapping\mapGeneratorModule.dm" #include "code\modules\procedural_mapping\mapGeneratorObj.dm" From 05c5e8ac1edb79ddbc04bb098f4d4daf4607841e Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Mon, 18 Apr 2022 02:41:27 -0400 Subject: [PATCH 010/200] ZAS HELL --- _maps/atmostest.json | 6 + _maps/map_files/debug/atmos_mintest.dmm | 1193 +++++++++++++++++++++++ 2 files changed, 1199 insertions(+) create mode 100644 _maps/atmostest.json create mode 100644 _maps/map_files/debug/atmos_mintest.dmm diff --git a/_maps/atmostest.json b/_maps/atmostest.json new file mode 100644 index 00000000000..7fdd314ba1e --- /dev/null +++ b/_maps/atmostest.json @@ -0,0 +1,6 @@ +{ + "version": 1, + "map_name": "ZAS HELL", + "map_path": "map_files/debug", + "map_file": "atmos_mintest.dmm", +} diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm new file mode 100644 index 00000000000..5628c573064 --- /dev/null +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -0,0 +1,1193 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"b" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"c" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating, +/area/hallway/primary/central) +"d" = ( +/obj/machinery/door/poddoor{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"e" = ( +/obj/machinery/door/poddoor{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"f" = ( +/obj/machinery/door/poddoor{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"g" = ( +/turf/open/floor/iron, +/area/hallway/primary/central) +"h" = ( +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"i" = ( +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"j" = ( +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"k" = ( +/obj/item/card/id/advanced/debug, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"l" = ( +/obj/machinery/power/rtg/debug, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"m" = ( +/obj/machinery/door/poddoor{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"n" = ( +/obj/machinery/door/poddoor{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"o" = ( +/obj/effect/landmark/latejoin, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"p" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"q" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"r" = ( +/obj/machinery/atmospherics/miner/plasma, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"s" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"t" = ( +/obj/effect/landmark/observer_start, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"u" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"v" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"w" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"x" = ( +/obj/effect/turf_decal/bot_red, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/hallway/primary/central) +"y" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"z" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"A" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"B" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"C" = ( +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"D" = ( +/obj/machinery/button/door{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"E" = ( +/obj/machinery/button/door{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"F" = ( +/obj/machinery/button/door{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"G" = ( +/obj/machinery/button/door{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"H" = ( +/obj/machinery/button/door{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"I" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"J" = ( +/obj/item/pipe_dispenser, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/hallway/primary/central) +"K" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/hallway/primary/central) +"L" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"M" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"N" = ( +/obj/machinery/door/airlock/public, +/turf/open/floor/iron, +/area/hallway/primary/central) +"O" = ( +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"P" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron, +/area/hallway/primary/central) +"Q" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"R" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"S" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/hallway/primary/central) +"T" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public, +/turf/open/floor/iron, +/area/hallway/primary/central) +"U" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"V" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"W" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +c +c +c +b +b +b +c +b +b +b +c +c +c +c +c +c +c +c +b +b +b +c +c +c +b +b +a +"} +(3,1,1) = {" +a +b +g +g +g +g +g +b +g +g +g +b +g +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(4,1,1) = {" +a +c +g +l +p +l +g +c +g +I +g +c +g +q +g +g +q +g +g +g +q +g +c +g +g +q +g +g +c +a +"} +(5,1,1) = {" +a +c +g +g +q +p +p +T +p +p +g +c +g +g +g +g +g +g +g +g +g +g +N +g +g +P +g +g +c +a +"} +(6,1,1) = {" +a +c +g +l +p +l +g +c +g +p +g +c +g +g +g +g +g +g +g +g +g +g +c +g +g +g +g +g +c +a +"} +(7,1,1) = {" +a +b +g +g +g +p +y +b +g +p +g +c +g +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(8,1,1) = {" +a +b +b +c +c +c +b +b +g +p +g +c +g +g +g +g +g +g +g +g +g +g +b +b +c +N +c +b +b +a +"} +(9,1,1) = {" +a +b +h +h +h +h +h +b +g +p +g +c +g +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(10,1,1) = {" +a +d +h +h +h +h +h +c +g +p +g +c +g +q +g +g +q +g +g +g +q +g +c +g +g +g +g +g +c +a +"} +(11,1,1) = {" +a +d +h +U +r +u +z +c +F +I +g +c +g +g +g +g +g +g +g +g +g +g +c +g +g +g +g +g +c +a +"} +(12,1,1) = {" +a +d +h +h +h +h +h +c +g +p +g +c +g +g +g +g +g +g +g +g +g +g +N +g +g +P +g +g +c +a +"} +(13,1,1) = {" +a +b +h +h +h +h +h +b +g +p +g +c +g +g +g +g +g +g +g +g +g +g +c +g +g +q +g +g +c +a +"} +(14,1,1) = {" +a +b +b +m +m +m +b +D +g +p +g +b +g +g +g +g +g +g +g +g +g +g +c +g +g +g +g +g +c +a +"} +(15,1,1) = {" +a +b +i +i +i +i +i +b +g +p +g +N +g +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(16,1,1) = {" +a +e +i +i +i +v +i +c +g +p +g +N +g +q +g +g +q +g +g +g +q +g +b +b +c +N +c +b +b +a +"} +(17,1,1) = {" +a +e +i +V +i +i +A +c +G +I +g +N +g +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(18,1,1) = {" +a +e +i +i +i +v +i +c +g +p +g +b +J +g +g +g +g +g +g +g +g +g +c +g +g +g +g +g +c +a +"} +(19,1,1) = {" +a +b +i +i +i +i +i +b +g +p +g +c +K +g +g +g +g +g +g +g +g +g +N +g +g +q +g +g +c +a +"} +(20,1,1) = {" +a +b +b +n +n +n +b +E +g +p +g +c +K +g +g +g +g +g +g +g +g +g +c +g +g +P +g +g +c +a +"} +(21,1,1) = {" +a +b +j +j +j +j +j +b +g +p +g +c +K +q +g +g +q +g +g +g +q +g +c +g +g +g +g +g +c +a +"} +(22,1,1) = {" +a +f +j +j +j +w +j +c +g +p +g +c +L +g +g +g +g +g +g +g +g +g +b +g +g +g +g +g +b +a +"} +(23,1,1) = {" +a +f +j +W +s +w +B +c +H +I +g +c +L +g +g +g +g +g +g +g +g +g +b +b +c +N +c +b +b +a +"} +(24,1,1) = {" +a +f +j +j +j +w +j +c +g +p +g +c +L +g +g +g +g +g +g +g +g +g +b +O +O +O +O +O +b +a +"} +(25,1,1) = {" +a +b +j +j +j +j +j +b +g +p +g +c +M +g +g +g +g +g +g +g +g +g +c +O +O +O +O +O +c +a +"} +(26,1,1) = {" +a +b +b +c +c +c +b +b +g +p +g +c +M +g +g +g +g +g +g +g +g +g +N +O +O +Q +O +O +S +a +"} +(27,1,1) = {" +a +c +k +o +t +x +C +c +g +q +g +c +M +q +g +g +q +g +g +g +q +g +c +O +O +R +O +O +c +a +"} +(28,1,1) = {" +a +b +g +g +q +g +g +N +g +g +g +b +g +g +g +g +g +g +g +g +g +g +b +O +O +O +O +O +b +a +"} +(29,1,1) = {" +a +b +b +c +c +c +b +b +b +c +b +b +b +c +c +c +c +c +c +c +c +b +b +b +c +S +c +b +b +a +"} +(30,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} From a1444e745e2f882d04d96b39c0bbb4bda2100966 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 04:02:35 -0400 Subject: [PATCH 011/200] it compiles --- code/__HELPERS/atmospherics.dm | 4 +- .../subsystem/processing/processing.dm | 2 +- code/controllers/subsystem/zas.dm | 6 +- code/datums/atmosphere/planetary.dm | 34 +++++----- code/datums/components/gas_leaker.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- .../effects/effect_system/effects_smoke.dm | 2 +- code/game/objects/effects/glowshroom.dm | 4 +- .../circuitboards/computer_circuitboards.dm | 2 +- .../circuitboards/machine_circuitboards.dm | 10 +-- code/game/objects/items/powerfist.dm | 4 +- code/game/objects/items/tanks/jetpack.dm | 4 +- code/game/objects/structures/aliens.dm | 2 +- .../objects/structures/industrial_lift.dm | 2 +- .../structures/transit_tubes/station.dm | 5 +- .../objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 4 +- code/game/turfs/open/space/space.dm | 3 +- .../antagonists/blob/structures/_blob.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 7 +- code/modules/atmospherics/ZAS/Atom.dm | 6 +- code/modules/atmospherics/ZAS/Debug.dm | 16 ++--- code/modules/atmospherics/ZAS/Fire.dm | 2 +- code/modules/atmospherics/ZAS/Plasma.dm | 6 +- code/modules/atmospherics/ZAS/Turf.dm | 7 +- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 4 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 10 +-- code/modules/atmospherics/ZAS/ZAS_Settings.dm | 5 +- .../atmospherics/machinery/airalarm.dm | 30 ++++----- .../atmospherics/machinery/components/tank.dm | 13 ++-- .../atmospherics/machinery/other/miner.dm | 40 +++++------ .../machinery/portable/canister.dm | 63 +++++++++--------- .../machinery/portable/scrubber.dm | 19 ++---- code/modules/cargo/bounties/engineering.dm | 12 ++-- code/modules/cargo/exports/large_objects.dm | 2 +- code/modules/cargo/packs.dm | 6 +- code/modules/clothing/masks/gas_filter.dm | 3 +- .../experisci/experiment/experiments.dm | 12 ++-- code/modules/mining/equipment/survival_pod.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- code/modules/reagents/chem_splash.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- .../research/designs/machine_designs.dm | 14 ++-- code/modules/research/designs/misc_designs.dm | 2 +- .../modules/research/designs/power_designs.dm | 6 +- .../icons/effects/contamination.dmi | Bin 0 -> 709 bytes .../icons/effects/tile_effects.dmi | Bin 0 -> 1514 bytes .../master_files/icons/testing/Zone.dmi | Bin 0 -> 955 bytes .../master_files/icons/testing/air_meter.dmi | Bin 0 -> 463 bytes .../icons/testing/atmos_testing.dmi | Bin 0 -> 390 bytes .../icons/testing/turf_analysis.dmi | Bin 0 -> 1144 bytes 53 files changed, 198 insertions(+), 195 deletions(-) create mode 100644 modular_pariah/master_files/icons/effects/contamination.dmi create mode 100644 modular_pariah/master_files/icons/effects/tile_effects.dmi create mode 100644 modular_pariah/master_files/icons/testing/Zone.dmi create mode 100644 modular_pariah/master_files/icons/testing/air_meter.dmi create mode 100644 modular_pariah/master_files/icons/testing/atmos_testing.dmi create mode 100644 modular_pariah/master_files/icons/testing/turf_analysis.dmi diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 8dc421e33d7..ca0c2fc006a 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -1,11 +1,11 @@ -/proc/molar_cmp_less_than(a,b,epsilon = MAXIMUM_ERROR_GAS_REMOVAL) +/*/proc/molar_cmp_less_than(a,b,epsilon = MAXIMUM_ERROR_GAS_REMOVAL) return (a < (b + epsilon)) /proc/molar_cmp_greater_than(a,b,epsilon = MAXIMUM_ERROR_GAS_REMOVAL) return ((a + epsilon) > b) /proc/molar_cmp_equals(a,b,epsilon = MAXIMUM_ERROR_GAS_REMOVAL) - return (((a + epsilon) > b) && ((a - epsilon) < b)) + return (((a + epsilon) > b) && ((a - epsilon) < b))*/ /** A simple rudimentary gasmix to information list converter. Can be used for UIs. * Args: diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 665f4915f42..8f7380198bd 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -9,7 +9,7 @@ SUBSYSTEM_DEF(processing) var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() - var/const/process_proc = /datum/proc/process //Francinum is going to FUCK ME (Of course I will~) + var/process_proc = /datum/proc/process //Francinum is going to FUCK ME (Of course I will~) /datum/controller/subsystem/processing/stat_entry(msg) msg = "[stat_tag]:[length(processing)]" diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index aeb1e6ba1a8..d593c053d63 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -70,7 +70,7 @@ SUBSYSTEM_DEF(zas) //The variable setting controller var/datum/zas_controller/settings //A reference to the global var - var/datum/xgm_gas_data/gas_data = xgm_gas_data + var/datum/xgm_gas_data/gas_data //Geometry lists var/list/zones = list() @@ -160,7 +160,7 @@ SUBSYSTEM_DEF(zas) var/starttime = REALTIMEOFDAY settings = new - gas_data = new + gas_data = xgm_gas_data to_chat(world, span_boldannounce("Processing Geometry...")) @@ -294,7 +294,7 @@ SUBSYSTEM_DEF(zas) var/obj/effect/hotspot/F = curr_hotspot[curr_hotspot.len] curr_hotspot.len-- - F.Process() + F.process() if (MC_TICK_CHECK) return diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm index 83596399b71..da84dcf888c 100644 --- a/code/datums/atmosphere/planetary.dm +++ b/code/datums/atmosphere/planetary.dm @@ -3,19 +3,19 @@ id = LAVALAND_DEFAULT_ATMOS base_gases = list( - /datum/gas/oxygen=5, - /datum/gas/nitrogen=10, + GAS_OXYGEN = 5, + GAS_NITROGEN = 10, ) normal_gases = list( - /datum/gas/oxygen=10, - /datum/gas/nitrogen=10, - /datum/gas/carbon_dioxide=10, + GAS_OXYGEN = 10, + GAS_NITROGEN = 10, + GAS_CO2 = 10, ) restricted_gases = list( - /datum/gas/plasma=0.1, - /datum/gas/bz=1.2, - /datum/gas/miasma=1.2, - /datum/gas/water_vapor=0.1, + GAS_PLASMA =0.1, + ///datum/gas/bz=1.2, + ///datum/gas/miasma=1.2, + ///datum/gas/water_vapor=0.1, ) restricted_chance = 30 @@ -29,18 +29,18 @@ id = ICEMOON_DEFAULT_ATMOS base_gases = list( - /datum/gas/oxygen=5, - /datum/gas/nitrogen=10, + GAS_OXYGEN = 5, + GAS_NITROGEN = 10, ) normal_gases = list( - /datum/gas/oxygen=10, - /datum/gas/nitrogen=10, - /datum/gas/carbon_dioxide=10, + GAS_OXYGEN = 10, + GAS_NITROGEN = 10, + GAS_CO2 = 10, ) restricted_gases = list( - /datum/gas/plasma=0.1, - /datum/gas/water_vapor=0.1, - /datum/gas/miasma=1.2, + GAS_PLASMA=0.1, + ///datum/gas/water_vapor=0.1, + ///datum/gas/miasma=1.2, ) restricted_chance = 20 diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index f18a8cdd0d8..eaf24de0001 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -77,7 +77,7 @@ return PROCESS_KILL var/turf/location = get_turf(master) var/datum/gas_mixture/open_air = location.return_air() - var/true_rate = (1 - (current_integrity / master.max_integrity)) * leak_rate + //var/true_rate = (1 - (current_integrity / master.max_integrity)) * leak_rate for(var/datum/gas_mixture/mix as anything in airs) mix.leak_to_enviroment(open_air) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8e9b2fc379f..0cbee448c4a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -167,7 +167,7 @@ return /obj/machinery/door/Move() - var/turf/T = loc + //var/turf/T = loc . = ..() /*if(density) //Gotta be closed my friend move_update_air(T)*/ diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index f314b223636..8c2b1ab3bcb 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -659,7 +659,7 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/machinery/door/firedoor/border_only/can_atmos_pass(turf/T, vertical = FALSE) +/obj/machinery/door/firedoor/border_only/c_block(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b989be0dbbf..89f43331e89 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -173,7 +173,7 @@ return TRUE -/obj/machinery/door/window/can_atmos_pass(turf/T, vertical = FALSE) +/obj/machinery/door/window/c_block(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 5eb1ba1b59f..bc15a1782cb 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -77,7 +77,7 @@ if(!t_loc) return var/list/newsmokes = list() - for(var/turf/T in t_loc.get_adjacent_open_turfs()) + for(var/turf/T in get_adjacent_open_turfs(t_loc)) var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke! if(foundsmoke) continue diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 91d64c25c76..2c87da4834f 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -136,7 +136,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0) /obj/structure/glowshroom/proc/Spread() var/turf/ownturf = get_turf(src) - var/list/turf/shares = ownturf.get_adjacent_open_turfs() + var/list/turf/shares = get_adjacent_open_turfs(ownturf) if(!length(shares)) //If we are in a 1x1 room return //Deal with it not now @@ -147,7 +147,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0) for(var/turf/open/floor/earth in oview(2,src)) if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs)) continue - if(!length(earth.get_adjacent_open_turfs())) + if(!length(get_adjacent_open_turfs(earth))) continue possible_locs += earth diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index dd22f011c53..39274306b89 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -222,7 +222,7 @@ /obj/item/circuitboard/computer/turbine_computer name = "Turbine Computer (Computer Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/computer/turbine_computer + //build_path = /obj/machinery/computer/turbine_computer //Generic diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 2c46da75401..b1625a5e1ef 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -201,7 +201,7 @@ /obj/item/circuitboard/machine/turbine_compressor name = "Turbine - Inlet Compressor (Machine Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/inlet_compressor/constructed + //build_path = /obj/machinery/power/turbine/inlet_compressor/constructed req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -209,7 +209,7 @@ /obj/item/circuitboard/machine/turbine_rotor name = "Turbine - Core Rotor (Machine Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/core_rotor/constructed + //build_path = /obj/machinery/power/turbine/core_rotor/constructed req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -217,7 +217,7 @@ /obj/item/circuitboard/machine/turbine_stator name = "Turbine - Turbine Outlet (Machine Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/turbine_outlet/constructed + //build_path = /obj/machinery/power/turbine/turbine_outlet/constructed req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -347,7 +347,7 @@ /obj/item/circuitboard/machine/bluespace_sender name = "Bluespace Sender (Machine Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/atmospherics/components/unary/bluespace_sender + //build_path = /obj/machinery/atmospherics/components/unary/bluespace_sender req_components = list( /obj/item/stack/cable_coil = 10, /obj/item/stack/sheet/glass = 10, @@ -483,7 +483,7 @@ /obj/item/circuitboard/machine/electrolyzer name = "Electrolyzer (Machine Board)" greyscale_colors = CIRCUIT_COLOR_GENERIC - build_path = /obj/machinery/electrolyzer + //build_path = /obj/machinery/electrolyzer req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/capacitor = 2, diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index e4bb53e9841..4cd66ae96e0 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -92,14 +92,14 @@ target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punches you!")) return - if(!molar_cmp_equals(gasused.total_moles(), gasperfist * fisto_setting)) + /*if(!molar_cmp_equals(gasused.total_moles(), gasperfist * fisto_setting)) to_chat(user, span_warning("\The [src]'s piston-ram lets out a weak hiss, it needs more gas!")) playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE) target.apply_damage((force / 2), BRUTE) target.visible_message(span_danger("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punch strikes with force!")) return - + */ target.apply_damage(force * fisto_setting, BRUTE, wound_bonus = CANT_WOUND) target.visible_message(span_danger("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("You cry out in pain as [user]'s punch flings you backwards!")) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 14fafa34062..40e1586635c 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_BULKY distribute_pressure = ONE_ATMOSPHERE * O2STANDARD actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) - var/gas_type = /datum/gas/oxygen + var/gas_type = GAS_OXYGEN var/on = FALSE var/stabilizers = FALSE var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not @@ -209,4 +209,4 @@ icon_state = "jetpack-black" inhand_icon_state = "jetpack-black" distribute_pressure = 0 - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 07c969e0739..d9eaf40ce12 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -202,7 +202,7 @@ qdel(src) return //lets try to grow in a direction - for(var/turf/check_turf in src_turf.get_adjacent_open_turfs()) + for(var/turf/check_turf in get_adjacent_open_turfs(src_turf)) //we cannot grow on blacklisted turfs if(is_type_in_list(check_turf, blacklisted_turfs)) continue diff --git a/code/game/objects/structures/industrial_lift.dm b/code/game/objects/structures/industrial_lift.dm index 9d8d3c14539..3a0326f56aa 100644 --- a/code/game/objects/structures/industrial_lift.dm +++ b/code/game/objects/structures/industrial_lift.dm @@ -8,7 +8,7 @@ var/list/lift_platforms /// Typepath list of what to ignore smashing through, controls all lifts var/list/ignored_smashthroughs = list( - /obj/machinery/power/supermatter_crystal, + //obj/machinery/power/supermatter_crystal, /obj/structure/holosign ) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 64eaf8362c0..1072a24a227 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -169,8 +169,9 @@ if(QDELETED(pod)) return var/datum/gas_mixture/floor_mixture = loc.return_air() - if(pod.air_contents.equalize(floor_mixture)) //equalize the pod's mix with the tile it's on - //air_update_turf(FALSE, FALSE) + /*if(pod.air_contents.equalize(floor_mixture)) //equalize the pod's mix with the tile it's on + air_update_turf(FALSE, FALSE) + */ /obj/structure/transit_tube/station/init_tube_dirs() switch(dir) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 7354b182b93..9cb53c83a5f 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -69,7 +69,7 @@ if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) return valid_window_location(loc, mover.dir, is_fulltile = FALSE) -/obj/structure/windoor_assembly/can_atmos_pass(turf/T, vertical = FALSE) +/obj/structure/windoor_assembly/c_block(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) return !density else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 3fa1b100076..b10ec13e00a 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -329,13 +329,13 @@ return ..() /obj/structure/window/Move() - var/turf/T = loc + //var/turf/T = loc . = ..() /* if(anchored) move_update_air(T)*/ -/obj/structure/window/can_atmos_pass(turf/T, vertical = FALSE) +/obj/structure/window/c_block(turf/T, vertical = FALSE) if(!anchored || !density) return TRUE return !(fulltile || dir == get_dir(loc, T)) diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 2c044d922b3..86d4c46115d 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -84,9 +84,10 @@ var/turf/T = locate(destination_x, destination_y, destination_z) user.forceMove(T) +/* /turf/open/space/Initalize_Atmos(times_fired) return - +*/ /turf/open/space/TakeTemperature(temp) /turf/open/space/RemoveLattice() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 7734c3c363d..7e7c9947c04 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -98,7 +98,7 @@ /obj/structure/blob/block_superconductivity() return atmosblock -/obj/structure/blob/can_atmos_pass(turf/T, vertical = FALSE) +/obj/structure/blob/c_block(turf/T, vertical = FALSE) return !atmosblock /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 06ea7684d26..a085b95e0ef 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -34,6 +34,9 @@ Contains helper procs for airflow, handled in /connection_group. return 0 ..() +/atom/movable/proc/experience_pressure_difference() + return + /mob/proc/slip_chance() return @@ -43,8 +46,8 @@ Contains helper procs for airflow, handled in /connection_group. if(buckled) return FALSE if(shoes) - var/obj/item/clothing/shoes = shoes - if(shoes.clothing_flags & NOSLIP|NOSLIP_ICE) + var/obj/item/clothing/myshoes = shoes + if(myshoes.clothing_flags & NOSLIP|NOSLIP_ICE) return FALSE if(m_intent == MOVE_INTENT_RUN) //No running in the halls! diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 56cb4d0c0a4..8beaf560c01 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -1,4 +1,4 @@ -/turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) +/*/turf/CanPass(atom/movable/mover, , height=1.5,air_group=0) if(target.blocks_air||blocks_air) return 0 @@ -11,6 +11,7 @@ return 0 return ..() +*/ //Convenience function for atoms to update turfs they occupy /atom/movable/proc/update_nearby_tiles(need_rebuild) @@ -52,3 +53,6 @@ /atom var/simulated = TRUE var/can_atmos_pass = ATMOS_PASS_YES + +/atom/proc/c_block(turf/target_turf, vertical = FALSE) + return diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index 0022e12c3ed..6fc387fc79e 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -1,11 +1,11 @@ -var/image/assigned = image('icons/Testing/Zone.dmi', icon_state = "assigned") -var/image/created = image('icons/Testing/Zone.dmi', icon_state = "created") -var/image/merged = image('icons/Testing/Zone.dmi', icon_state = "merged") -var/image/invalid_zone = image('icons/Testing/Zone.dmi', icon_state = "invalid") -var/image/air_blocked = image('icons/Testing/Zone.dmi', icon_state = "block") -var/image/zone_blocked = image('icons/Testing/Zone.dmi', icon_state = "zoneblock") -var/image/blocked = image('icons/Testing/Zone.dmi', icon_state = "fullblock") -var/image/mark = image('icons/Testing/Zone.dmi', icon_state = "mark") +var/image/assigned = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") +var/image/created = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") +var/image/merged = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") +var/image/invalid_zone = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") +var/image/air_blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") +var/image/zone_blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") +var/image/blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") +var/image/mark = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") /connection_edge/var/dbg_out = 0 diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 33968da3bed..8b138ef620a 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -129,7 +129,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/firelevel = 1 //Calculated by gas_mixture.calculate_firelevel() -/obj/effect/hotspot/Process() +/obj/effect/hotspot/process() . = 1 //var/turf/simulated/my_tile = loc ZASTURF diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index c8eab424a31..64f28ec787d 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -1,4 +1,4 @@ -GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contamination.dmi')) +GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_files/icons/effects/contamination.dmi')) /datum/pl_control var/plasma_dmg = 3 @@ -56,7 +56,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat add_overlay(GLOB.contamination_overlay) /obj/item/decontaminate() - flags_2 ~= CONTAMINATED_2 + flags_2 &= ~CONTAMINATED_2 cut_overlay(GLOB.contamination_overlay) @@ -166,7 +166,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('icons/effects/contaminat /turf/Entered(obj/item/I) . = ..() //Items that are in plasma, but not on a mob, can still be contaminated. - if(istype(I) && SSzas && SSzas.settings.plc.cloth_contamination && I.can_contaminate()) + if(istype(I) && SSzas && SSzas.settings?.plc.cloth_contamination && I.can_contaminate()) var/datum/gas_mixture/env = return_air(1) if(!env) return diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 2c223d56dba..bfe223bb8f3 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -252,6 +252,8 @@ /*/turf/proc/assume_gas(gasid, moles, temp = 0) return 0*/ +/atom/movable/proc/block_superconductivity() + return /turf/return_air() RETURN_TYPE(/datum/gas_mixture) @@ -270,7 +272,7 @@ return GM.remove(amount) ///turf/simulated/assume_air(datum/gas_mixture/giver) ZASTURF -/turf/proc/assume_air(datum/gas_mixture/giver) +/turf/assume_air(datum/gas_mixture/giver) var/datum/gas_mixture/my_air = return_air() my_air.merge(giver) @@ -286,7 +288,8 @@ return 1 //turf/simulated/return_air() ZASTURF -/turf/proc/return_air() +/turf/return_air() + RETURN_TYPE(/datum/gas_mixture) if(zone) if(!zone.invalid) SSzas.mark_zone_update(zone) diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 64885c3c810..bd5a51db51f 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -1,4 +1,4 @@ -GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) +GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new /datum/xgm_gas_data //Simple list of all the gas IDs. var/list/gases = list() @@ -93,7 +93,7 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) /obj/effect/gas_overlay name = "gas" desc = "You shouldn't be clicking this." - icon = 'icons/effects/tile_effects.dmi' + icon = 'modular_pariah/master_files/icons/effects/tile_effects.dmi' icon_state = "generic" layer = FIRE_LAYER appearance_flags = RESET_COLOR|PIXEL_SCALE|TILE_BOUND diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index ec311df2592..1f38fa75453 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -30,7 +30,7 @@ name = "Methyl Bromide" specific_heat = 42.59 // J/(mol*K) molar_mass = 0.095 // kg/mol - breathed_product = /datum/reagent/toxin/methyl_bromide + //breathed_product = /datum/reagent/toxin/methyl_bromide symbol_html = "CH<sub>3</sub>Br" symbol = "CH3Br" @@ -128,7 +128,7 @@ specific_heat = 80 // J/(mol*K) molar_mass = 0.004 // kg/mol flags = XGM_GAS_FUSION_FUEL - breathed_product = /datum/reagent/helium + //breathed_product = /datum/reagent/helium symbol_html = "He" symbol = "He" @@ -162,7 +162,7 @@ name = "Xenon" specific_heat = 3 // J/(mol*K) molar_mass = 0.054 // kg/mol - breathed_product = /datum/reagent/nitrous_oxide/xenon + //breathed_product = /datum/reagent/nitrous_oxide/xenon symbol_html = "Xe" symbol = "Xe" @@ -195,7 +195,7 @@ specific_heat = 5 // J/(mol*K) molar_mass = 0.017 // kg/mol flags = XGM_GAS_CONTAMINANT - breathed_product = /datum/reagent/toxin/chlorine + //breathed_product = /datum/reagent/toxin/chlorine symbol_html = "Cl" symbol = "Cl" @@ -236,6 +236,6 @@ name = "Carbon Monoxide" specific_heat = 30 // J/(mol*K) molar_mass = 0.028 // kg/mol - breathed_product = /datum/reagent/carbon_monoxide + //breathed_product = /datum/reagent/carbon_monoxide symbol_html = "CO" symbol = "CO" diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm index 1cf3d2fbee8..430d48f9d49 100644 --- a/code/modules/atmospherics/ZAS/ZAS_Settings.dm +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -1,5 +1,5 @@ /datum/zas_controller - var/datum/pl_control/plc + var/datum/pl_control/plc = new var/fire_consuption_rate = 0.25 var/fire_consuption_rate_NAME = "Fire - Air Consumption Ratio" @@ -73,6 +73,3 @@ var/connection_temperature_delta = 10 var/connection_temperature_delta_NAME = "Connections - Temperature Difference" var/connection_temperature_delta_DESC = "The smallest temperature difference which will cause heat to travel through doors." - -/datum/zas_controller/Initalize() - plc = new diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 39e7ecefdcb..657444209d1 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -824,13 +824,13 @@ TLV = list( "pressure" = new/datum/tlv/no_checks, "temperature" = new/datum/tlv/no_checks, - /datum/gas/oxygen = new/datum/tlv/no_checks, - /datum/gas/nitrogen = new/datum/tlv/no_checks, - /datum/gas/carbon_dioxide = new/datum/tlv/no_checks, - /datum/gas/miasma = new/datum/tlv/no_checks, - /datum/gas/plasma = new/datum/tlv/no_checks, - /datum/gas/nitrous_oxide = new/datum/tlv/no_checks, - /datum/gas/bz = new/datum/tlv/no_checks, + GAS_OXYGEN = new/datum/tlv/no_checks, + GAS_NITROGEN = new/datum/tlv/no_checks, + GAS_CO2 = new/datum/tlv/no_checks, + //datum/gas/miasma = new/datum/tlv/no_checks, + GAS_PLASMA = new/datum/tlv/no_checks, + GAS_N2O = new/datum/tlv/no_checks, + /*/datum/gas/bz = new/datum/tlv/no_checks, /datum/gas/hypernoblium = new/datum/tlv/no_checks, /datum/gas/water_vapor = new/datum/tlv/no_checks, /datum/gas/tritium = new/datum/tlv/no_checks, @@ -843,19 +843,19 @@ /datum/gas/zauker = new/datum/tlv/dangerous, /datum/gas/helium = new/datum/tlv/dangerous, /datum/gas/antinoblium = new/datum/tlv/dangerous, - /datum/gas/halon = new/datum/tlv/dangerous, + /datum/gas/halon = new/datum/tlv/dangerous,*/ ) /obj/machinery/airalarm/kitchen_cold_room // Kitchen cold rooms start off at -14°C or 259.15K. TLV = list( "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE * 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(COLD_ROOM_TEMP-40, COLD_ROOM_TEMP-20, COLD_ROOM_TEMP+20, COLD_ROOM_TEMP+40), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, + GAS_OXYGEN = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa + GAS_NITROGEN = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + //datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), + GAS_PLASMA = new/datum/tlv/dangerous, + /*/datum/gas/nitrous_oxide = new/datum/tlv/dangerous, /datum/gas/bz = new/datum/tlv/dangerous, /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic /datum/gas/water_vapor = new/datum/tlv/dangerous, @@ -869,7 +869,7 @@ /datum/gas/zauker = new/datum/tlv/dangerous, /datum/gas/helium = new/datum/tlv/dangerous, /datum/gas/antinoblium = new/datum/tlv/dangerous, - /datum/gas/halon = new/datum/tlv/dangerous, + /datum/gas/halon = new/datum/tlv/dangerous,*/ ) /obj/machinery/airalarm/unlocked diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 951134dc6d8..4d7981e0086 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -367,21 +367,21 @@ fill_to_pressure(GAS_NITROGEN, safety_margin = (N2STANDARD * 0.5)) /obj/machinery/atmospherics/components/tank/carbon_dioxide - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/machinery/atmospherics/components/tank/plasma - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA /obj/machinery/atmospherics/components/tank/nitrogen - gas_type = /datum/gas/nitrogen + gas_type = GAS_NITROGEN /obj/machinery/atmospherics/components/tank/oxygen - gas_type = /datum/gas/oxygen + gas_type = GAS_OXYGEN /obj/machinery/atmospherics/components/tank/nitrous - gas_type = /datum/gas/nitrous_oxide + gas_type = GAS_N2O -/obj/machinery/atmospherics/components/tank/bz +/*ics/components/tank/bz gas_type = /datum/gas/bz /obj/machinery/atmospherics/components/tank/freon @@ -425,6 +425,7 @@ /obj/machinery/atmospherics/components/tank/antinoblium gas_type = /datum/gas/antinoblium +*/ /////////////////////////////////////////////////////////////////// // Tank Frame Structure diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index f83b314f5df..0577b44b910 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -145,99 +145,99 @@ /obj/machinery/atmospherics/miner/n2o name = "\improper N2O Gas Miner" overlay_color = "#FFCCCC" - spawn_id = /datum/gas/nitrous_oxide + //spawn_id = /datum/gas/nitrous_oxide /obj/machinery/atmospherics/miner/nitrogen name = "\improper N2 Gas Miner" overlay_color = "#CCFFCC" - spawn_id = /datum/gas/nitrogen + //spawn_id = /datum/gas/nitrogen /obj/machinery/atmospherics/miner/oxygen name = "\improper O2 Gas Miner" overlay_color = "#007FFF" - spawn_id = /datum/gas/oxygen + //spawn_id = /datum/gas/oxygen /obj/machinery/atmospherics/miner/plasma name = "\improper Plasma Gas Miner" overlay_color = "#FF0000" - spawn_id = /datum/gas/plasma + //spawn_id = /datum/gas/plasma /obj/machinery/atmospherics/miner/carbon_dioxide name = "\improper CO2 Gas Miner" overlay_color = "#CDCDCD" - spawn_id = /datum/gas/carbon_dioxide + //spawn_id = /datum/gas/carbon_dioxide /obj/machinery/atmospherics/miner/bz name = "\improper BZ Gas Miner" overlay_color = "#FAFF00" - spawn_id = /datum/gas/bz + //spawn_id = /datum/gas/bz /obj/machinery/atmospherics/miner/water_vapor name = "\improper Water Vapor Gas Miner" overlay_color = "#99928E" - spawn_id = /datum/gas/water_vapor + //spawn_id = /datum/gas/water_vapor /obj/machinery/atmospherics/miner/freon name = "\improper Freon Gas Miner" overlay_color = "#61edff" - spawn_id = /datum/gas/freon + //spawn_id = /datum/gas/freon /obj/machinery/atmospherics/miner/halon name = "\improper Halon Gas Miner" overlay_color = "#5f0085" - spawn_id = /datum/gas/halon + //spawn_id = /datum/gas/halon /obj/machinery/atmospherics/miner/healium name = "\improper Healium Gas Miner" overlay_color = "#da4646" - spawn_id = /datum/gas/healium + //spawn_id = /datum/gas/healium /obj/machinery/atmospherics/miner/hydrogen name = "\improper Hydrogen Gas Miner" overlay_color = "#ffffff" - spawn_id = /datum/gas/hydrogen + //spawn_id = /datum/gas/hydrogen /obj/machinery/atmospherics/miner/hypernoblium name = "\improper Hypernoblium Gas Miner" overlay_color = "#00f7ff" - spawn_id = /datum/gas/hypernoblium + //spawn_id = /datum/gas/hypernoblium /obj/machinery/atmospherics/miner/miasma name = "\improper Miasma Gas Miner" overlay_color = "#395806" - spawn_id = /datum/gas/miasma + //spawn_id = /datum/gas/miasma /obj/machinery/atmospherics/miner/nitrium name = "\improper Nitrium Gas Miner" overlay_color = "#752b00" - spawn_id = /datum/gas/nitrium + //spawn_id = /datum/gas/nitrium /obj/machinery/atmospherics/miner/pluoxium name = "\improper Pluoxium Gas Miner" overlay_color = "#4b54a3" - spawn_id = /datum/gas/pluoxium + //spawn_id = /datum/gas/pluoxium /obj/machinery/atmospherics/miner/proto_nitrate name = "\improper Proto-Nitrate Gas Miner" overlay_color = "#00571d" - spawn_id = /datum/gas/proto_nitrate + //spawn_id = /datum/gas/proto_nitrate /obj/machinery/atmospherics/miner/tritium name = "\improper Tritium Gas Miner" overlay_color = "#15ff00" - spawn_id = /datum/gas/tritium + //spawn_id = /datum/gas/tritium /obj/machinery/atmospherics/miner/zauker name = "\improper Zauker Gas Miner" overlay_color = "#022e00" - spawn_id = /datum/gas/zauker + //spawn_id = /datum/gas/zauker /obj/machinery/atmospherics/miner/helium name = "\improper Helium Gas Miner" overlay_color = "#022e00" - spawn_id = /datum/gas/helium + //spawn_id = /datum/gas/helium /obj/machinery/atmospherics/miner/antinoblium name = "\improper Antinoblium Gas Miner" overlay_color = "#022e00" - spawn_id = /datum/gas/antinoblium + //spawn_id = /datum/gas/antinoblium diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 961929d52ed..f8149762cf4 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -10,12 +10,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /proc/init_gas_id_to_canister() return sort_list(list( - "n2" = /obj/machinery/portable_atmospherics/canister/nitrogen, - "o2" = /obj/machinery/portable_atmospherics/canister/oxygen, - "co2" = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, - "plasma" = /obj/machinery/portable_atmospherics/canister/plasma, - "n2o" = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, - "nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, + GAS_NITROGEN = /obj/machinery/portable_atmospherics/canister/nitrogen, + GAS_OXYGEN = /obj/machinery/portable_atmospherics/canister/oxygen, + GAS_CO2 = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, + GAS_PLASMA = /obj/machinery/portable_atmospherics/canister/plasma, + GAS_N2O = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, + /*"nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, "bz" = /obj/machinery/portable_atmospherics/canister/bz, "air" = /obj/machinery/portable_atmospherics/canister/air, "water_vapor" = /obj/machinery/portable_atmospherics/canister/water_vapor, @@ -31,9 +31,10 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) "zauker" = /obj/machinery/portable_atmospherics/canister/zauker, "helium" = /obj/machinery/portable_atmospherics/canister/helium, "antinoblium" = /obj/machinery/portable_atmospherics/canister/antinoblium, - "halon" = /obj/machinery/portable_atmospherics/canister/halon + "halon" = /obj/machinery/portable_atmospherics/canister/halon*/ )) + /obj/machinery/portable_atmospherics/canister name = "canister" desc = "A canister for the storage of gas." @@ -132,7 +133,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) desc = "Pre-mixed air." greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#c6c0b5" - +/* /obj/machinery/portable_atmospherics/canister/antinoblium name = "Antinoblium canister" gas_type = /datum/gas/antinoblium @@ -145,13 +146,13 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = /datum/gas/bz greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9b5d7f#d0d2a0" - +*/ /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "Carbon dioxide canister" - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#4e4c48" - +/* /obj/machinery/portable_atmospherics/canister/freon name = "Freon canister" gas_type = /datum/gas/freon @@ -179,10 +180,11 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9b5d7f#368bff" - +*/ +/* /obj/machinery/portable_atmospherics/canister/hydrogen name = "Hydrogen canister" - gas_type = /datum/gas/hydrogen + gas_type = GAS_HYDROGEN filled = 1 greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#bdc2c0#ffffff" @@ -193,19 +195,19 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#009823#f7d5d3" - +*/ /obj/machinery/portable_atmospherics/canister/nitrogen name = "Nitrogen canister" - gas_type = /datum/gas/nitrogen + gas_type = GAS_NITROGEN greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#d41010" /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "Nitrous oxide canister" - gas_type = /datum/gas/nitrous_oxide + gas_type = GAS_N2O greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#c63e3b#f7d5d3" - +/* /obj/machinery/portable_atmospherics/canister/nitrium name = "Nitrium canister" gas_type = /datum/gas/nitrium @@ -217,13 +219,14 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = /datum/gas/hypernoblium greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#6399fc#b2b2b2" +*/ /obj/machinery/portable_atmospherics/canister/oxygen name = "Oxygen canister" - gas_type = /datum/gas/oxygen + gas_type = GAS_OXYGEN greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#2786e5#e8fefe" - +/* /obj/machinery/portable_atmospherics/canister/pluoxium name = "Pluoxium canister" gas_type = /datum/gas/pluoxium @@ -236,13 +239,13 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#008200#33cc33" - +*/ /obj/machinery/portable_atmospherics/canister/plasma name = "Plasma canister" - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#f62800#000000" - +/* /obj/machinery/portable_atmospherics/canister/tritium name = "Tritium canister" gas_type = /datum/gas/tritium @@ -262,7 +265,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#009a00#006600" - +*/ // Special canisters below here /obj/machinery/portable_atmospherics/canister/fusion_test @@ -286,8 +289,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) greyscale_colors = "#9fba6c#3d4680" */ /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() - air_contents.add(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - air_contents.add(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSzas.start_processing_machine(src) /** @@ -327,7 +330,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/proto/default/oxygen name = "prototype canister" desc = "A prototype canister for a prototype bike, what could go wrong?" - gas_type = /datum/gas/oxygen + gas_type = GAS_OXYGEN filled = 1 release_pressure = ONE_ATMOSPHERE*2 @@ -363,12 +366,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return if(starter_temp) air_contents.temperature = starter_temp - air_contents.add(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.add(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - air_contents.add(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSzas.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon_state() @@ -556,7 +559,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) transfer_moles = min(transfer_moles, (ATMOS_DEFAULT_VOLUME_PUMP/air_contents.volume)*air_contents.total_moles) //flow rate limit - var/returnval = pump_gas_passive(air_contents, environment, transfer_moles) + pump_gas_passive(air_contents, environment, transfer_moles) //air_update_turf(FALSE, FALSE) var/our_pressure = air_contents.return_pressure() diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 9e62a111907..22cd1108322 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -20,20 +20,9 @@ var/power_rating = 7500 ///List of gases that can be scrubbed var/list/scrubbing = list( - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrous_oxide, - /datum/gas/bz, - /datum/gas/nitrium, - /datum/gas/tritium, - /datum/gas/hypernoblium, - /datum/gas/water_vapor, - /datum/gas/freon, - /datum/gas/hydrogen, - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/zauker, - /datum/gas/halon, + GAS_PLASMA, + GAS_CO2, + GAS_N2O, ) /obj/machinery/portable_atmospherics/scrubber/Destroy() @@ -86,7 +75,7 @@ var/transfer_moles = min(1, volume_rate/mixture.volume)*mixture.total_moles var/datum/gas_mixture/gas2scrub = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - var/datum/gas_mixture/filtered = new + //var/datum/gas_mixture/filtered = new if(!scrubbing) return diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 258133aea57..4ed14e40d11 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -4,7 +4,7 @@ reward = CARGO_CRATE_VALUE * 15 wanted_types = list(/obj/item/tank = TRUE) var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = /datum/gas/pluoxium + var/gas_type /datum/bounty/item/engineering/gas/applies_to(obj/O) if(!..()) @@ -18,28 +18,28 @@ /datum/bounty/item/engineering/gas/nitrium_tank name = "Full Tank of Nitrium" description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitrium so they can get started. (20 Moles)" - gas_type = /datum/gas/nitrium +// gas_type = /datum/gas/nitrium /datum/bounty/item/engineering/gas/freon_tank name = "Full Tank of Freon" description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it! (20 Moles)" - gas_type = /datum/gas/freon + //gas_type = /datum/gas/freon /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium. (20 Moles)" - gas_type = /datum/gas/tritium + //gas_type = /datum/gas/tritium /datum/bounty/item/engineering/gas/hydrogen_tank name = "Full Tank of Hydrogen" description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it. (20 Moles)" - gas_type = /datum/gas/hydrogen + //gas_type = /datum/gas/hydrogen /datum/bounty/item/engineering/gas/zauker_tank name = "Full Tank of Zauker" description = "The main planet of \[REDACTED] has been chosen as testing grounds for the new weapon that uses Zauker gas. Ship us a tank full of it. (20 Moles)" reward = CARGO_CRATE_VALUE * 20 - gas_type = /datum/gas/zauker + //gas_type = /datum/gas/zauker /datum/bounty/item/engineering/emitter name = "Emitter" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index e26ec5efd3a..cc0948b1902 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -79,7 +79,7 @@ /datum/export/large/supermatter cost = CARGO_CRATE_VALUE * 16 unit_name = "supermatter shard" - export_types = list(/obj/machinery/power/supermatter_crystal/shard) + //export_types = list(/obj/machinery/power/supermatter_crystal/shard) /datum/export/large/grounding_rod cost = CARGO_CRATE_VALUE * 1.2 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 7370fbc4fb5..514e1eaa7bd 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -953,7 +953,7 @@ desc = "The power of the heavens condensed into a single crystal. Requires CE access to open." cost = CARGO_CRATE_VALUE * 20 access = ACCESS_CE - contains = list(/obj/machinery/power/supermatter_crystal/shard) + //contains = list(/obj/machinery/power/supermatter_crystal/shard) crate_name = "supermatter shard crate" crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE @@ -974,7 +974,7 @@ desc = "The new and improved fusion reactor. Requires CE access to open." cost = CARGO_CRATE_VALUE * 23 access = ACCESS_CE - contains = list(/obj/item/hfr_box/corner, + /*contains = list(/obj/item/hfr_box/corner, /obj/item/hfr_box/corner, /obj/item/hfr_box/corner, /obj/item/hfr_box/corner, @@ -982,7 +982,7 @@ /obj/item/hfr_box/body/moderator_input, /obj/item/hfr_box/body/waste_output, /obj/item/hfr_box/body/interface, - /obj/item/hfr_box/core) + /obj/item/hfr_box/core)*/ crate_name = "HFR crate" crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index 5b5d2d7e96f..6aa40cb46c2 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -51,7 +51,7 @@ * */ /obj/item/gas_filter/proc/reduce_filter_status(datum/gas_mixture/breath) - +/* var/danger_points = 0 for(var/gas_id in breath.gas) @@ -82,6 +82,7 @@ filter_status = max(filter_status - danger_points - FILTERS_CONSTANT_WEAR, 0) return breath +*/ /obj/item/gas_filter/damaged name = "damaged gas filter" diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index c3c4e8b4180..2455708bf28 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -82,7 +82,7 @@ sanitized_misc = TRUE sanitized_reactions = TRUE require_all = FALSE - required_reactions = list(/datum/gas_reaction/h2fire, /datum/gas_reaction/tritfire) + //required_reactions = list(/datum/gas_reaction/h2fire, /datum/gas_reaction/tritfire) /datum/experiment/ordnance/explosive/nobliumbomb name = "Noblium Explosives" @@ -92,7 +92,7 @@ experiment_proper = TRUE sanitized_misc = TRUE sanitized_reactions = TRUE - required_reactions = list(/datum/gas_reaction/nobliumformation) + //required_reactions = list(/datum/gas_reaction/nobliumformation) /datum/experiment/ordnance/explosive/pressurebomb name = "Reactionless Explosives" @@ -109,7 +109,7 @@ gain = list(20,60,120) target_amount = list(20,120,500) experiment_proper = TRUE - required_gas = /datum/gas/nitrium + //required_gas = /datum/gas/nitrium /datum/experiment/ordnance/gaseous/bz name = "BZ Gas Shells" @@ -117,7 +117,7 @@ gain = list(25,50) target_amount = list(200,600) experiment_proper = TRUE - required_gas = /datum/gas/bz + //required_gas = /datum/gas/bz /datum/experiment/ordnance/gaseous/noblium name = "Noblium Gas Shells" @@ -125,7 +125,7 @@ gain = list(10,40,80) target_amount = list(15,55,250) experiment_proper = TRUE - required_gas = /datum/gas/hypernoblium + //required_gas = /datum/gas/hypernoblium /datum/experiment/ordnance/gaseous/halon name = "Halon Gas Shells" @@ -133,7 +133,7 @@ gain = list(10,30,60) target_amount = list(15,55,250) experiment_proper = TRUE - required_gas = /datum/gas/halon + //required_gas = /datum/gas/halon /datum/experiment/scanning/random/material/meat name = "Biological Material Scanning Experiment" diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 36ba0ed593c..57bd0bb9579 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -290,7 +290,7 @@ /obj/item/ship_in_a_bottle, /obj/item/gun/energy/pulse, /obj/item/book/granter/martial/carp, - /obj/item/melee/supermatter_sword, + //obj/item/melee/supermatter_sword, /obj/item/shield/changeling, /obj/item/lava_staff, /obj/item/energy_katana, diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 4cef50b5668..f34469e17e6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -496,7 +496,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/turf/T = get_turf(src) if(!T) return - var/list/adjacent = T.get_adjacent_open_turfs() + var/list/adjacent = get_adjacent_open_turfs(T) if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way adjacent = shuffle(adjacent) shuffle = FALSE diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index b731da461c9..9393c64761d 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -98,7 +98,7 @@ if(accessible[T]) continue //for(var/thing in T.get_atmos_adjacent_turfs(alldir = TRUE)) - for(var/turf/NT as anything in T.get_adjacent_open_turfs()) + for(var/turf/NT as anything in get_adjacent_open_turfs(T)) if(!(NT in accessible)) continue if(!(get_dir(T,NT) in GLOB.cardinals)) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 51ee0c75462..acde57a3028 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -76,7 +76,7 @@ /obj/machinery/disposal/LateInitialize() //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it - var/atom/L = loc + var/turf/L = loc var/datum/gas_mixture/env = new env.copy_from(L.return_air()) var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 40c7d7b112f..0b070ddfa50 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -689,7 +689,7 @@ name = "Machine Design (HFR Core)" desc = "The circuit board for an HFR Core." id = "HFR_core" - build_path = /obj/item/circuitboard/machine/HFR_core + //build_path = /obj/item/circuitboard/machine/HFR_core category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -697,7 +697,7 @@ name = "Machine Design (HFR fuel input)" desc = "The circuit board for an HFR fuel input." id = "HFR_fuel_input" - build_path = /obj/item/circuitboard/machine/HFR_fuel_input + //build_path = /obj/item/circuitboard/machine/HFR_fuel_input category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -705,7 +705,7 @@ name = "Machine Design (HFR waste output)" desc = "The circuit board for an HFR waste output." id = "HFR_waste_output" - build_path = /obj/item/circuitboard/machine/HFR_waste_output + //build_path = /obj/item/circuitboard/machine/HFR_waste_output category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -713,7 +713,7 @@ name = "Machine Design (HFR moderator input)" desc = "The circuit board for an HFR moderator input." id = "HFR_moderator_input" - build_path = /obj/item/circuitboard/machine/HFR_moderator_input + //build_path = /obj/item/circuitboard/machine/HFR_moderator_input category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -721,7 +721,7 @@ name = "Machine Design (HFR corner)" desc = "The circuit board for an HFR corner." id = "HFR_corner" - build_path = /obj/item/circuitboard/machine/HFR_corner + //build_path = /obj/item/circuitboard/machine/HFR_corner category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -729,7 +729,7 @@ name = "Machine Design (HFR interface)" desc = "The circuit board for an HFR interface." id = "HFR_interface" - build_path = /obj/item/circuitboard/machine/HFR_interface + //build_path = /obj/item/circuitboard/machine/HFR_interface category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING @@ -737,7 +737,7 @@ name = "Machine Design (Crystallizer)" desc = "The circuit board for a crystallizer." id = "crystallizer" - build_path = /obj/item/circuitboard/machine/crystallizer + //build_path = /obj/item/circuitboard/machine/crystallizer category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 89a9280a677..6b31f2247e2 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -233,7 +233,7 @@ id = "roastingstick" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) - build_path = /obj/item/melee/roastingstick + //build_path = /obj/item/melee/roastingstick category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 8fb730f544a..aa1b0d9ee7f 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -88,7 +88,7 @@ build_type = PROTOLATHE | AUTOLATHE materials = list(/datum/material/iron = 500) construction_time = 100 - build_path = /obj/item/turbine_parts/compressor + //build_path = /obj/item/turbine_parts/compressor category = list("Misc","Power Designs","Machinery","initial") /datum/design/turbine_part_rotor @@ -98,7 +98,7 @@ build_type = PROTOLATHE | AUTOLATHE materials = list(/datum/material/iron = 500) construction_time = 100 - build_path = /obj/item/turbine_parts/rotor + //build_path = /obj/item/turbine_parts/rotor category = list("Misc","Power Designs","Machinery","initial") /datum/design/turbine_part_stator @@ -108,5 +108,5 @@ build_type = PROTOLATHE | AUTOLATHE materials = list(/datum/material/iron = 500) construction_time = 100 - build_path = /obj/item/turbine_parts/stator + //build_path = /obj/item/turbine_parts/stator category = list("Misc","Power Designs","Machinery","initial") diff --git a/modular_pariah/master_files/icons/effects/contamination.dmi b/modular_pariah/master_files/icons/effects/contamination.dmi new file mode 100644 index 0000000000000000000000000000000000000000..367394213be967bd895459f2bfa2c14fa443c5cf GIT binary patch literal 709 zcmV;$0y_PPP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80001KdQ@0+L}hbh za%pgMX>V=-0C=1w$Gr-GAQT4B+4~e9x<`MjODN%>?;vRDP=QLleuLXN0-N5AgR+L+ zSZaQ5NUXz1?8~7gNGvn46!V!{Pi?+MNN`Rp<WeCq5j%>%Vz+>H3d$P#0h+fM3zl+5 zLI3~)7fD1xR9J=WR<VleKomXq@k$FTA+R41*uozW{R0t%Y3yE#AXzNZuSK@E5JXbM z&Som{3k>)Jsn!oz5K`Oc6?$bhPBMw?V&hct=H{F;ckVq7?RGmna{YNI`%}PE0D!-B zKL|&IWxvw^0BrXs0D$`2U2n#9@M=|n$=i!VW{Kb$w?u&U;t=&a4TPh?vJNIy^#PSU z@oZ9eTlUVhYE{4zL8K#a*PHQne?sEfq*ms~1n>@9J@L<!+v<s|&QVlu!u-z42rLl* zd%qHH?I~bzcRu?rXyV_9{1pMMp2*xe=qRV(;_iHgR!?Mg@r+Xtjt0vj@WitT0NRVg z&AT*~6i$5OG?X?WlQ+A=DDiAcW4X$c=bzJ9QsUWkuGGxfjD-T296<K@_Uc?*&q-r> z&DrixS2w(nuQ;A~HZ{A$$Rwh)0?qC)I?5?2B-v3;iM>D-l6W>9<<tQXaqRQ$)iL#j zRzNr!EZ>u_>&|uO$o`*y=B1j`d-9bPRiUyIy6eq2ocLskAOp^g*Y7mI77U!7GMxBM zoj;^P0cyjQiKs%Z!{SvqhFmfoARmz$`)I#VQEm|qU^oI@2P@NoG?tXclB(nutx_js z*HeMnl+swPE?o}*m$}DEmkaoG1I{0oIbo3tGP!yqvP7WEGrD0VE7pyf?m|+QbGHB{ r$j9=)RdVhY@SE%5*Yc-;hYR=*Heq6+wrW&r00000NkvXXu0mjf7gI{B literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/effects/tile_effects.dmi b/modular_pariah/master_files/icons/effects/tile_effects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a1b92ff11dcb9f2167baf28d9daae8187d078c01 GIT binary patch literal 1514 zcmV<G1r_><P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0001XdQ@0+L}hbh za%pgMX>V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#H!Q}a@bGLx0KI8!o<iWO`X47oVdiV|~EA#Aw1cmfKQ6<qyX z6kL2gxd8NrCc=Qv(!2lw1uscNK~!jgwOPw@<2Vd#kaC>)|IeJm9>=joVGin+T3kEH zidj~rM2i#}1o2K}=5MTH0&oFv1rRunw7J%10C#?K!Rzth`h(xxNJBIyKCAKY9sEX` zlhJrKX0Fft=I;0tfXGZlM9s_^5y;E~frtY?)d(~lA~U1gCpr>NM8ss@YP0Z5W|k-T zt)p9v#=?WuPw*w2hzRFBw3uY9MMTj~5|HGOnNvh0e+O3SgF?7P#Je3vhzEWE+;ZjA z-z6DaB4X+AtAxzUk<deYQ3&^lc>4zay~mHt{D(g#+ZdU7A!AKaw!?!0XnYSo->_@Q zj+{A1#2?PZSbg%n<4?Shh5L#f9^_@=d+>R|t|5-!BI2XNF94Qe`#u27nc1-3ifksy zoNRc>qmDNF`@=o6t%I~KoCClw?B=8K0MIgXA%5cllgx^r9)GdF597u08+gIQzjFWj zk~ajb_C8TcNv0&VjW9I>I65b3$Bl=TMm=nwv_$h*$*1hR(H99{<_DUGOhgygUqoPa zauarqnr)x7MDvhjU1i+q>DH#qluZguw>)9J(TPBFW<CHsGE=nW{NA`eXJ+AhS8E9Y zMq3UV{07*~LV~>VnOL=G#;(m_!oG05kyb4LCf?|jnPL|93=)EQXjidH!RU~Ph?bcT z-l8;C^sbyQShc0{Ml11qpAa+)$6pM;=rD%AP^%qZ^e&t)0PaN+AtTjpSszvRrZfe2 zbS)xo*nI^+8@3zhHEg1%uUKt*0Z<eQ{cwEm_;P%DxkSVryRQ(w==S(6A}aAq;Q`<H z@jG^J+dPg(gzQ@CxY-}4cdTmHGb@v-COCJJg<-g0H4%CK#Wja}D%Kl+hCdt6jxUoc zCb&(5Wxu48LA8NN4`e6=+QrwVZ?tAkb7PKs4sn{}I*7l#z+Vg>ukfWZ6?^_6J1Q0l z-ar+z2%vFDQ+bHVOsS{q-dUWKPw*8&h3_Wv3cs2u{fjQ&HvkctdBagPlTvz+u?c(r zyk&q4U9N^<hpX779oTQ#Yk--wt~jcu@MpeP4kCPo#^njVCq<6GrQ?R*0L-#0EzFsD z<wpX$n}j_tI3(;~G%$}oQ60n7a=Qua1&ZhPjTxx$Rq$wdUeM#KmMEOpFYqgX=H9en z4T)}G@~jue*2<edIJ=Jc1mF@8!LYW9zAIF)J0iF9`T~DqL@B)a_6dH~IljPOLo1UO zt$LLP?B4oebNAq0Syj9)r=N{yC2o%|A<Z`T9K`WuuFuNpm-xyAdqy;r-TlHEBByR& zcF)hivfHQHp+ArhWp`KXh1O5uF91F!u&I#e>v^f**?z)MJ#YA@`U%R#N9uVcDQEi$ zL-joOo$e=iKj3UVuW`1Ypz82cJ#X7i^%J(V7vuH(*?z)MJ#XVwKcQfE4%%?*1n{su z6?^Ke3J?sD3EDg9D~p`Dz6si5xH~5?eD4G>+n$0wsZx>z37xbZU-f}#FF2;oTTMPv z&yV&KhU$3?_7jw~jnwm_{e+=<9)taag7JEOw4X3k&ttHkP=Mij{-^p0r|NkO_7fDp zN9y^}e!@^akHLO|qQHiq=j!>N?k9Y^p0{(n!vD0Nu>Ft&A%m4dkgdy0`~UIYJLb2w z%zVcl*8}V)kU?oypX`J&SS+=c_us-Ec6E3BZ7nn3h_6ELVffOlaHhrhnR@=G`U$7% zc?|XwioFo=v-SK>^%MS6J#YA@`U#QizsLWtdj3281ZmKzdj1RiFZ&690cia=`?d<| QRsaA107*qoM6N<$f;TbqKmY&$ literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/testing/Zone.dmi b/modular_pariah/master_files/icons/testing/Zone.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1d8ab8516693cc287bfae96341b7294a28458047 GIT binary patch literal 955 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSi>g8*N?cNllZ!G7N;32F7#J$% z^qxJ-b;v+~<w5Z$5$|g8`l_?8L0)`st&fz=)>+1>va!kk{Xzw;rk!UG9QWaUzAc#f zMBGQw<V6o09X8)CE?ce{El^-pls2*FY_w-&It$}fiNN$ZTIbZdI9X&YW-pE_IIX`t zSm`nMgQklj2A@`!g%~V<{8fL~4ugFwpKY&V=}#@%XZc;#etvcaJLjhGKb$w$Wy^E% zp5Dp8z;wma#WAE}&f7aD3vWA!FkIvpS1Pg;wPtNkxbJayiHHc3WcOU5nt(!M&qPIo z`UCIECxxt%3cM`QbYs@K*ZbTSsogVf?|*mx{FRT7qu+gqFKQ1rV{R~Ju%HUDqilce z@7X`u-x#s?cT{xh7617AY^$d2v+vXIAHRO5?$3kpQ}&7bE4BYUDqU$?6If-mY0>4S z+x~~oi#{e4BV5k(kcZ(M!vivjOYeEC_6Hg=|2?-Lnc?2*<5%1&rt3vsKKk-s#jm0t zZ|ZXF!+zfVw&mb%VUBc$f|v7|Hpxyqs`LDGAzL_u#UHK-ds)+pS;+_r@BLac>SF86 z!Wnja5pCE9HDyQI_Db8j;@AH^E|rxN4E}YKrM+-A$Cu~;Q*DQn>8z>t(^sgyWSo=# zQ&sI*4bS|JAV&tlr%DB%)`to@9Qh<@@pF5qu)~oeAme+esKb#zK*s#ldJP>vfogt- zN;({Q3=}yWBJFVG3&)&44_EOiB-OC^{j<2rE?{WGq+Y)#lttj8eB)&Mvsp|XJ3x%P ztALEY11IaxyaF<8FZ%s6S<U0{IWm=@*1AzDuaxo6|9SDhs+!U_uVQ%j_JicXlGU6G z^7HR=EQ@qyaJGLXd9dOtyTP~OeS$r~r3}IRpCk?zTxI+4LeNfGV%aH%XI6W%S^lo# zPI#C6+wH^7RZJ1Dj`RuM3HN32o`2Q2>Gmp)1y?j<m3K^&b9njrr(1!hZA0^<=b!hM bJ$NGjT2$c-qeK)aYchDc`njxgN@xNA=?{z~ literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/testing/air_meter.dmi b/modular_pariah/master_files/icons/testing/air_meter.dmi new file mode 100644 index 0000000000000000000000000000000000000000..56d1ff18a59fe713829890d2473e15d812725fdd GIT binary patch literal 463 zcmV;=0WkiFP)<h;3K|Lk000e1NJLTq00IC2001Ba0{{R3mSx@60000IP)t-sz`(!& z00930Gynh0007JY|Nk;w&Kv*$00DGTPE!Ct=GbNc004)2R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryMDlSPZNd>Z%l(;xkGK-3VOhYctw4%h^ zR0tccAhoC{zlfkJ1A;0H392w6sKS__3KN1VObMzmBdEfhpb86uDl7?y7!iR=I8+S@ z2dg2@a8*`t^>YCy9{_Y7n2TBb(m4PC0N6=HK~!jg?U}&|!!Qg*?SlvK2o-dIk_ieK zASwL)S1G2KG%Ynnj-^=A?c>vX*s_d6@G2E^&X#kCM3<j=nr^D|Jl{Fl1)NR*6W9f~ zfU^l`3|tX_SH^)r$^|SXC%Xa?O2%>^kT7tq2Vf<-V!LikKmyTr1DF#K@Oaw*!vR+X zBw+muU^D>{=sO3P6CeyMe+0A(Xx;>s0r$TKl>zr3gp>gvKME@Y{K&f_-~KTq4agM0 ze-29n@&tUzg8{n$7r+%D4a5X?0WM%KK-p(y_s>zg^#n*2I#_hWzXAXN002ovPDHLk FV1l&Ftup`s literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/testing/atmos_testing.dmi b/modular_pariah/master_files/icons/testing/atmos_testing.dmi new file mode 100644 index 0000000000000000000000000000000000000000..142bd4cbb1a4e3ed36b08be40fe05379ea402280 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^3xHUGgAGVdtuOuxq_V3*B1&9Ri<65o3raHc^B5Q^ z<^+co6qSDe5?t`{>k}<+U9EFx&IfM@HMnT}Kugb4$1`+8Xuv67ol}0gMj?+L`JB|z z3IobMdE}$*b;h@K!^JC-f-BF>@F-Pdx%x0@!I}rJo-cav==DifhDRUmE;&v95e~HW znx~6nNX4ADHw^g>83?dm%-0jU-&tI+{Od`l#sHomCugIxd$=Yx>AJmsFl|jXUr2A+ zmp?h)`{mD>zdCqs`<KT*-4=fSD*sv3=6>&=!jlZGMh**k0yLOKPJx+Gp%;xgwtTs6 z`*6ki-v{=-|9_Tug-Ue6{rTsgv0ce4NYCGYgm*>G!m|fs1>=(%X6fu*AKv=?nV?R8 zLgBL?ZlSXm?|yW?gHem~^S|j8EZoo7pvEHEfSozdtJTHHcB<!opbr^5UHx3vIVCg! E03RZ$`~Uy| literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/testing/turf_analysis.dmi b/modular_pariah/master_files/icons/testing/turf_analysis.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e3aac1ebd05b8bc12b1be6e6cb2ab5f2325cae37 GIT binary patch literal 1144 zcmV-;1c&>HP)<h;3K|Lk000e1NJLTq00O`O001Be1^@s69Q4ja0001^dQ@0+L}hbh za%pgMX>V=-0C=30%&`i>Fc5&@xp|7C-NkAgvq+0%XkQ^j?g9Z#%B8KZ?;z+R_T2vA z<8R>HU+f6oVAV=oVoqQ{@Aj(9ekL$b*Q&zE1q`&R3heLn>Nki9;~H`CH<#0<E=!px zA>m)&5H@*Et;D!%W+WESgT%;pM~RW|w8Y4FCy9~nJac}0l>V-m(EXGR^kWCzVAT`5 z^}wWWGIzfK00WRoL_t(|obBDgaoac;fKhN~uc;#iBzLKeG>`_UGROjw2GWLfUsvM- zm`gItp+$+5DEuJ#-pS+f7?5Sj-(X;%YMQ1?flhTDIsEQ*)z9cD#QL%C$6tMai=INP zD)j9yT-WXU_y2PFTt&|Ti1Baq1X4<=tG<SeTXp}Xlv4VVV%`Ja(w{%RQE$P8{Oxa> z_mFYx)2EPehuZgVA>-Dceua!X)U-{=xTpFQGVV~*v?1f3PGu}Uv~AGqzb@nT55y=U zfK&QEMspcP_gm%~{1Dx_W3;e!kK8dD72RWU$7ob^kI5aQQPDjncZ^0w_n6!<8Wr73 zIv(pTrIgO+wy<||aya~X{x6>Yhy4>h0RUjSzwtZ#n0+|(p7Vp}|6u|c09N8!@QUF5 zxE8!3_%Q+)09N2u=!)R&yA`@3cs>CP0EO!ZZhzlz|6>unUH!oA@B8h4EQ03|zyMIN zvG~3AIT5@)WAS_Kb0T;;0So{$9glUFJ2r2f_~0~%ybi~@%N?7yPJD10#C!r6017uH za7FNTO$l5PJWny_00RIY%?aBQBKY2xja=VjE9Qi42@!m6%SNv6agP;X0AMlC?nxHE z>-OxP<Q(yvk^lw(7WQZai{EW{G=g)*Z%P6f0C<795iEYUWo`uLjNg<5FaYo(QzKaX zZqw8V&K<ug`6oC4;EGoq^L9Me-7s*6<196<kbcf9j(IyA>uwmh!*P}x_g+X_0R{kI zSF8X703R&1f;#0UJ6j;iv(#3EDL2_gY=N)>3;?{u)Ub7(^EOQl+lcF&1uy`xxVfvk zB6wTouIlEFU;zvOEb7rM4I+3O9^KNAGlB&$0I-;6_w$P2b$fO{Z>|XTPjCQm!?mNk zmiXGOTH^7S^fSD6bk`DJyH!g(eivZ?Kmq37WX874y~&L7319%2VCqd~Ih@aJRnjWy z9!$N-EQiavt@ggs{44<s05{y*lj;oHZM(N8HR23go+p3-;Eu5f7Qg#27Qy0oy#z1- zOfdB#2exVIMGmZk00w}G#;)>>m<#!hUF91w7oH=40bquH@QUC4=?Aa)U9V!!0q&}= zq2qr^!N0>he+jkCd-N1SweR1erx2=Xo9HQoYMM5B3ZdF|eXoDvyKlmG{i>#ELeH%` z)pg|XyVq4eqo)w-$G#tb_5Ce+3bCqvAKTe=`~LmETt15!*s0%R>)aAGmE$G=0000< KMNUMnLSTZF(=i$V literal 0 HcmV?d00001 From bb27b18eb2d68eb485a1de55e57b3dbabb6f7f97 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 04:14:39 -0400 Subject: [PATCH 012/200] atmostest --- _maps/atmostest.json | 4 ++-- code/controllers/master.dm | 3 ++- code/modules/admin/verbs/fix_air.dm | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/_maps/atmostest.json b/_maps/atmostest.json index 7fdd314ba1e..3435e944864 100644 --- a/_maps/atmostest.json +++ b/_maps/atmostest.json @@ -2,5 +2,5 @@ "version": 1, "map_name": "ZAS HELL", "map_path": "map_files/debug", - "map_file": "atmos_mintest.dmm", -} + "map_file": "atmos_mintest.dmm" +} \ No newline at end of file diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 88dadb8b52e..33b8f24cfdc 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -109,7 +109,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new for(var/global_var in global.vars) if (istype(global.vars[global_var], /datum/controller/subsystem)) existing_subsystems += global.vars[global_var] - + //Either init a new SS or if an existing one was found use that for(var/I in subsystem_types) var/ss_idx = existing_subsystems.Find(I) @@ -221,6 +221,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (SS.flags & SS_NO_INIT || SS.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized continue current_initializing_subsystem = SS + to_chat(world, span_blue(span_boldannounce("Initializing [SS.name]..."))) SS.Initialize(REALTIMEOFDAY) CHECK_TICK current_initializing_subsystem = null diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 8762e7edeea..d4d7c0a4bda 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -7,7 +7,10 @@ if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") return + if(!fix_atmos_grief()) + to_chat(world, span_danger("Atmospherics reboot failed!")) +/proc/fix_atmos_grief() log_admin("Full atmosphere reset initiated by [usr].") to_chat(world, "<span class = 'danger'>Initiating restart of atmosphere. The server may lag a bit.</span>") sleep(10) @@ -50,3 +53,4 @@ to_chat(usr, "\[5/5\] - ZAS Rebooted") to_chat(world, "<span class = 'danger'>Atmosphere restart completed in <b>[(world.timeofday - current_time)/10]</b> seconds.</span>") + return TRUE From a0fb535185d1d7d6030890e25d54e7c5d3f24eaa Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Mon, 18 Apr 2022 04:12:07 -0400 Subject: [PATCH 013/200] cummies --- code/controllers/master.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 33b8f24cfdc..b54d8e2727b 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -221,7 +221,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (SS.flags & SS_NO_INIT || SS.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized continue current_initializing_subsystem = SS - to_chat(world, span_blue(span_boldannounce("Initializing [SS.name]..."))) + to_chat(world, span_blue(span_bold("Initializing [SS.name]..."))) SS.Initialize(REALTIMEOFDAY) CHECK_TICK current_initializing_subsystem = null From 7d53e70122d37a4a52fe4064bf69a908308bfc99 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 20:11:20 -0400 Subject: [PATCH 014/200] AMONG US --- _maps/map_files/generic/CentCom.dmm | 8 ++-- code/__DEFINES/atmospherics/ZAS.dm | 6 ++- code/controllers/subsystem/zas.dm | 4 +- code/game/atoms.dm | 4 +- code/game/atoms_movable.dm | 4 +- code/game/machinery/doors/door.dm | 24 ++++++++---- code/game/machinery/doors/firedoor.dm | 8 ++-- code/game/machinery/doors/poddoor.dm | 1 + code/game/machinery/doors/windowdoor.dm | 9 +++-- code/game/machinery/shieldgen.dm | 4 +- .../effects/effect_system/effects_foam.dm | 7 ++-- code/game/objects/effects/forcefields.dm | 4 +- code/game/objects/effects/spiderwebs.dm | 2 +- .../items/devices/forcefieldprojector.dm | 2 +- code/game/objects/structures/aliens.dm | 2 +- code/game/objects/structures/false_walls.dm | 10 +++-- code/game/objects/structures/holosign.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/plasticflaps.dm | 4 +- code/game/objects/structures/tram_walls.dm | 2 +- .../objects/structures/windoor_assembly.dm | 11 +++--- code/game/objects/structures/window.dm | 14 +++---- code/game/shuttle_engines.dm | 2 +- code/game/turfs/change_turf.dm | 11 ++---- code/game/turfs/closed/walls.dm | 3 +- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/turf.dm | 6 ++- code/modules/admin/verbs/fix_air.dm | 2 +- .../antagonists/blob/structures/_blob.dm | 4 +- code/modules/art/statues.dm | 2 +- code/modules/atmospherics/ZAS/Atom.dm | 17 ++++++--- code/modules/atmospherics/ZAS/Connection.dm | 32 ++++++++-------- .../atmospherics/ZAS/ConnectionGroup.dm | 10 ++--- code/modules/atmospherics/ZAS/Fire.dm | 22 +++++------ code/modules/atmospherics/ZAS/Temperature.dm | 4 +- code/modules/atmospherics/ZAS/Turf.dm | 16 ++++---- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 38 +++++++++---------- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 1 - code/modules/atmospherics/ZAS/Zone.dm | 6 +-- code/modules/error_handler/error_viewer.dm | 2 +- code/modules/mining/equipment/survival_pod.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 2 +- .../power/singularity/containment_field.dm | 4 +- .../power/singularity/field_generator.dm | 6 +-- code/modules/power/turbine/turbine.dm | 2 +- .../xenobiology/crossbreeding/_misc.dm | 2 +- .../modules/large_doors/code/large_doors.dm | 2 +- 47 files changed, 179 insertions(+), 155 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 008b149633a..0684d3dc817 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5273,7 +5273,7 @@ /area/syndicate_mothership/control) "sm" = ( /obj/structure/window/paperframe{ - can_atmos_pass = 0 + can_atmos_pass = 4 }, /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -11365,7 +11365,7 @@ /area/centcom/prison) "Qu" = ( /obj/structure/window/paperframe{ - can_atmos_pass = 0 + can_atmos_pass = 4 }, /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -11659,7 +11659,7 @@ /area/centcom/supplypod) "Rv" = ( /obj/structure/window/paperframe{ - can_atmos_pass = 0 + can_atmos_pass = 4 }, /turf/open/floor/wood/tile, /area/centcom/holding) @@ -14013,7 +14013,7 @@ dir = 4 }, /obj/structure/window/paperframe{ - can_atmos_pass = 0 + can_atmos_pass = 4 }, /turf/open/floor/sepia, /area/centcom/holding) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 367469bb075..64bea7e4b0f 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,6 +1,7 @@ -//#define ZASDBG +#define ZASDBG //#define MULTIZAS +#define AIR_ALLOWED 0 #define AIR_BLOCKED 1 #define ZONE_BLOCKED 2 #define BLOCKED 3 @@ -109,7 +110,8 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) #endif - +//#define ATMOS_CANPASS(A, O) ( A.can_atmos_pass == CANPASS_PROC ? A.c_airblock(O) : ( A.can_atmos_pass == CANPASS_DENSITY? !A.density : A.can_atmos_pass)) +#define ATMOS_CANPASS_NOTTURF(A) (A.can_atmos_pass == CANPASS_DENSITY ? !A.density : A.can_atmos_pass) #define CELL_VOLUME 2500 // Liters in a cell. #define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index d593c053d63..d678d9885f5 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -235,7 +235,7 @@ SUBSYSTEM_DEF(zas) T.needs_air_update = 0 #ifdef ZASDBG T.overlays -= mark - updated++ + //updated++ #endif if (MC_TICK_CHECK) @@ -253,7 +253,7 @@ SUBSYSTEM_DEF(zas) T.needs_air_update = 0 #ifdef ZASDBG T.overlays -= mark - updated++ + //updated++ #endif if (MC_TICK_CHECK) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6fb8041ed77..6f7bae3f3f7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -337,9 +337,11 @@ return TRUE /// Whether the mover object can avoid being blocked by this atom, while arriving from (or leaving through) the border_dir. -/atom/proc/CanPass(atom/movable/mover, border_dir) +/atom/proc/CanPass(atom/movable/mover, border_dir, air_group) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) + if(!mover) + return FALSE if(mover.movement_type & PHASING) return TRUE . = CanAllowThrough(mover, border_dir) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index bdaa6a41803..0579c638246 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -114,8 +114,8 @@ if(loc) //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) - if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) - can_atmos_pass = ATMOS_PASS_YES + if(((can_atmos_pass == CANPASS_DENSITY && density) || can_atmos_pass == CANPASS_NEVER) && isturf(loc)) + can_atmos_pass = CANPASS_ALWAYS //air_update_turf(TRUE, FALSE) loc.handle_atom_del(src) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0cbee448c4a..6967aa1e5cf 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -13,7 +13,7 @@ pass_flags_self = PASSDOORS max_integrity = 350 armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 80, ACID = 70) - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_PROC flags_1 = PREVENT_CLICK_UNDER_1 receive_ricochet_chance_mod = 0.8 damage_deflection = 10 @@ -42,6 +42,8 @@ var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access var/can_crush = TRUE /// Whether or not the door can crush mobs. var/can_open_with_hands = TRUE /// Whether or not the door can be opened by hand (used for blast doors and shutters) + ///If set, air zones cannot merge across the door even when it is opened. + var/block_air_zones = TRUE /obj/machinery/door/Initialize(mapload) . = ..() @@ -57,6 +59,7 @@ else flags_1 &= ~PREVENT_CLICK_UNDER_1 + update_nearby_tiles(TRUE) //doors only block while dense though so we have to use the proc real_explosion_block = explosion_block explosion_block = EXPLOSION_BLOCK_PROC @@ -101,9 +104,14 @@ if(spark_system) qdel(spark_system) spark_system = null - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() return ..() +/obj/machinery/door/c_airblock(turf/other) + if(block_air_zones) + return density ? AIR_BLOCKED : ZONE_BLOCKED + return density ? AIR_BLOCKED : AIR_ALLOWED + /** * Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level * @@ -167,13 +175,13 @@ return /obj/machinery/door/Move() - //var/turf/T = loc + update_nearby_tiles(TRUE) . = ..() - /*if(density) //Gotta be closed my friend - move_update_air(T)*/ -/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) + +/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir, air_group) . = ..() + if(air_group) return !block_air_zones if(.) return // Snowflake handling for PASSGLASS. @@ -353,7 +361,7 @@ update_appearance() set_opacity(0) operating = FALSE - //air_update_turf(TRUE, FALSE) + update_nearby_tiles(TRUE) update_freelook_sight() if(autoclose) autoclose_in(DOOR_CLOSE_WAIT) @@ -383,7 +391,7 @@ if(visible && !glass) set_opacity(1) operating = FALSE - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) update_freelook_sight() if(!can_crush) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 8c2b1ab3bcb..e1e85fd8c33 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -611,7 +611,7 @@ icon = 'icons/obj/doors/edge_Doorfire.dmi' can_crush = FALSE flags_1 = ON_BORDER_1 - can_atmos_pass = ATMOS_PASS_PROC + can_atmos_pass = CANPASS_PROC /obj/machinery/door/firedoor/border_only/closed icon_state = "door_closed" @@ -659,11 +659,11 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/machinery/door/firedoor/border_only/c_block(turf/T, vertical = FALSE) +/obj/machinery/door/firedoor/border_only/c_airblock(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) - return !density + return density ? AIR_BLOCKED : ZONE_BLOCKED else - return TRUE + return AIR_ALLOWED /obj/machinery/door/firedoor/heavy name = "heavy firelock" diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 4941064217f..59356ad6b28 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -14,6 +14,7 @@ resistance_flags = FIRE_PROOF damage_deflection = 70 can_open_with_hands = FALSE + block_air_zones = FALSE var/datum/crafting_recipe/recipe_type = /datum/crafting_recipe/blast_doors var/deconstruction = BLASTDOOR_FINISHED // deconstruction step var/id = 1 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 89f43331e89..ee6f874ec15 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -14,7 +14,7 @@ flags_1 = ON_BORDER_1 opacity = FALSE pass_flags_self = PASSGLASS - can_atmos_pass = ATMOS_PASS_PROC + can_atmos_pass = CANPASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN network_id = NETWORK_DOOR_AIRLOCKS set_dir_on_move = FALSE @@ -61,6 +61,7 @@ AddElement(/datum/element/connect_loc, loc_connections) AddElement(/datum/element/atmos_sensitive, mapload) + update_nearby_tiles(TRUE) /obj/machinery/door/window/ComponentInitialize() . = ..() @@ -173,11 +174,11 @@ return TRUE -/obj/machinery/door/window/c_block(turf/T, vertical = FALSE) +/obj/machinery/door/window/c_airblock(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) - return !density + return density ? AIR_BLOCKED : ZONE_BLOCKED else - return TRUE + return ZONE_BLOCKED //used in the AStar algorithm to determinate if the turf the door is on is passable /obj/machinery/door/window/CanAStarPass(obj/item/card/id/ID, to_dir) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index eca093c49b7..6261ae09e41 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -9,7 +9,7 @@ anchored = TRUE resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY /obj/structure/emergency_shield/Initialize(mapload) . = ..() @@ -73,7 +73,7 @@ /obj/structure/emergency_shield/cult/barrier density = FALSE //toggled on right away by the parent rune - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY ///The rune that created the shield itself. Used to delete the rune when the shield is destroyed. var/obj/effect/rune/parent_rune diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index b4a27778235..b12c4b91580 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -276,16 +276,17 @@ desc = "A lightweight foamed metal wall that can be used as base to construct a wall." gender = PLURAL max_integrity = 20 - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_NEVER ///Var used to prevent spamming of the construction sound var/next_beep = 0 /obj/structure/foamedmetal/Initialize(mapload) . = ..() - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) /obj/structure/foamedmetal/Destroy() - //air_update_turf(TRUE, FALSE) + set_density(0) + update_nearby_tiles(TRUE) . = ..() /obj/structure/foamedmetal/Move() diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 9c41da052a8..5fc593ba9f6 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -5,7 +5,7 @@ anchored = TRUE opacity = FALSE density = TRUE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) /obj/effect/forcefield/Initialize(mapload) @@ -21,7 +21,7 @@ name = "glowing wall" icon = 'icons/effects/cult/effects.dmi' icon_state = "cultshield" - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER timeleft = 200 /// A form of the cult forcefield that lasts permanently. diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index 8ec5ec113c5..fcb6096eb50 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -77,7 +77,7 @@ desc = "A solid thick wall of web, airtight enough to block air flow." icon_state = "sealedweb" sealed = TRUE - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER /obj/structure/spider/stickyweb/genetic //for the spider genes in genetics genetic = TRUE diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 0a46b63e6cc..53a88c6febb 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -103,7 +103,7 @@ density = TRUE mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_NEVER armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, FIRE = 100, ACID = 100) var/obj/item/forcefield_projector/generator diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d9eaf40ce12..38f4e3a2871 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -63,7 +63,7 @@ canSmoothWith = list(SMOOTH_GROUP_ALIEN_RESIN) max_integrity = 200 var/resintype = null - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY /obj/structure/alien/resin/Initialize(mapload) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 971e5b2bd6c..27ecc8d49a4 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -16,7 +16,7 @@ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) canSmoothWith = list(SMOOTH_GROUP_WALLS) can_be_unanchored = FALSE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_PROC rad_insulation = RAD_MEDIUM_INSULATION material_flags = MATERIAL_EFFECTS var/mineral = /obj/item/stack/sheet/iron @@ -31,7 +31,8 @@ var/obj/item/stack/initialized_mineral = new mineral // Okay this kinda sucks. set_custom_materials(initialized_mineral.mats_per_unit, mineral_amount) qdel(initialized_mineral) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) + /obj/structure/falsewall/attack_hand(mob/user, list/modifiers) if(opening) @@ -55,7 +56,10 @@ set_opacity(density) opening = FALSE update_appearance() - //air_update_turf(TRUE, !density) + update_nearby_tiles(TRUE) + +/obj/structure/falsewall/c_airblock(turf/other) + return density ? ZONE_BLOCKED : AIR_BLOCKED /obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open . = ..() diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index c0f1886ee61..62daaf3102a 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -94,7 +94,7 @@ icon_state = "holo_firelock" density = FALSE anchored = TRUE - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER alpha = 150 rad_insulation = RAD_LIGHT_INSULATION diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 5b255b11866..ab9b1f7a944 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -13,7 +13,7 @@ icon_state = "metal" max_integrity = 200 armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 50, ACID = 50) - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION material_flags = MATERIAL_EFFECTS material_modifier = 0.25 diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index cab6be77908..587e1c90f79 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -7,7 +7,7 @@ armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 50, ACID = 50) density = FALSE anchored = TRUE - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER /obj/structure/plasticflaps/opaque opacity = TRUE @@ -41,7 +41,7 @@ ///Update the flaps behaviour to gases, if not anchored will let air pass through /obj/structure/plasticflaps/proc/update_atmos_behaviour() - can_atmos_pass = anchored ? ATMOS_PASS_YES : ATMOS_PASS_NO + can_atmos_pass = anchored ? CANPASS_ALWAYS : CANPASS_NEVER /obj/structure/plasticflaps/wirecutter_act(mob/living/user, obj/item/W) . = ..() diff --git a/code/game/objects/structures/tram_walls.dm b/code/game/objects/structures/tram_walls.dm index cfbbec9591f..ff1df4f5dd2 100644 --- a/code/game/objects/structures/tram_walls.dm +++ b/code/game/objects/structures/tram_walls.dm @@ -16,7 +16,7 @@ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) canSmoothWith = list(SMOOTH_GROUP_WALLS) can_be_unanchored = FALSE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION material_flags = MATERIAL_EFFECTS var/mineral = /obj/item/stack/sheet/iron diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 9cb53c83a5f..027caa35524 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -27,7 +27,7 @@ var/facing = "l" //Does the windoor open to the left or right? var/secure = FALSE //Whether or not this creates a secure windoor var/state = "01" //How far the door assembly has progressed - can_atmos_pass = ATMOS_PASS_PROC + can_atmos_pass = CANPASS_PROC /obj/structure/windoor_assembly/Initialize(mapload, loc, set_dir) . = ..() @@ -41,10 +41,11 @@ AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) + update_nearby_tiles(TRUE) /obj/structure/windoor_assembly/Destroy() set_density(FALSE) - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() return ..() /* /obj/structure/windoor_assembly/Move() @@ -69,11 +70,11 @@ if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) return valid_window_location(loc, mover.dir, is_fulltile = FALSE) -/obj/structure/windoor_assembly/c_block(turf/T, vertical = FALSE) +/obj/structure/windoor_assembly/c_airblock(turf/T, vertical = FALSE) if(get_dir(loc, T) == dir) - return !density + return density ? AIR_BLOCKED : ZONE_BLOCKED else - return TRUE + return ZONE_BLOCKED /obj/structure/windoor_assembly/proc/on_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index b10ec13e00a..2ee0237f9fb 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -11,7 +11,7 @@ can_be_unanchored = TRUE resistance_flags = ACID_PROOF armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) - can_atmos_pass = ATMOS_PASS_PROC + can_atmos_pass = CANPASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION pass_flags_self = PASSGLASS set_dir_on_move = FALSE @@ -313,7 +313,7 @@ . += new /obj/item/shard(location) /obj/structure/window/proc/AfterRotation(mob/user, degrees) - //air_update_turf(TRUE, FALSE) + update_nearby_tiles(TRUE) /obj/structure/window/proc/on_painted(obj/structure/window/source, is_dark_color) SIGNAL_HANDLER @@ -329,16 +329,16 @@ return ..() /obj/structure/window/Move() - //var/turf/T = loc + update_nearby_tiles() . = ..() /* if(anchored) move_update_air(T)*/ -/obj/structure/window/c_block(turf/T, vertical = FALSE) +/obj/structure/window/c_airblock(turf/T, vertical = FALSE) if(!anchored || !density) - return TRUE - return !(fulltile || dir == get_dir(loc, T)) + return ZONE_BLOCKED + return (fulltile || dir == get_dir(loc, T)) ? AIR_BLOCKED : ZONE_BLOCKED //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() @@ -739,7 +739,7 @@ glass_type = /obj/item/stack/sheet/paperframes heat_resistance = 233 decon_speed = 10 - can_atmos_pass = ATMOS_PASS_YES + can_atmos_pass = CANPASS_ALWAYS resistance_flags = FLAMMABLE armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) knock_sound = SFX_PAGE_TURN diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index eba89bf0bc0..e508198fb0d 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -10,7 +10,7 @@ smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS) max_integrity = 500 armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) //default + ignores melee - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY /obj/structure/shuttle/engine name = "engine" diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 4e402941ffa..8a5988300a9 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -40,8 +40,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) WF.InheritComponent(slip) if (copy_air) - var/turf/open/openTurf = T - openTurf.air.copy_from(air) + var/turf/openTurf = T + T.air.copy_from(air) //wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself /turf/proc/TerraformTurf(path, new_baseturf, flags) @@ -83,17 +83,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( blueprint_data = null if(connections) connections.erase_all() - /* ZASTURF if(istype(src,/turf/simulated)) //Yeah, we're just going to rebuild the whole thing. //Despite this being called a bunch during explosions, //the zone will only really do heavy lifting once. var/turf/simulated/S = src if(S.zone) S.zone.rebuild() - */ - - if(simulated && zone) - zone.rebuild() var/list/old_baseturfs = baseturfs var/old_type = type @@ -324,7 +319,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //////Assimilate Air////// /turf/open/proc/Assimilate_Air() - var/list/turf/turf_list = get_adjacent_open_turfs() + var/list/turf/turf_list = get_adjacent_open_turfs(src) var/turf_count = LAZYLEN(turf_list) if(blocks_air || !turf_count) return diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index d6cfdd3e1b6..3dc68a83fa0 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -7,10 +7,9 @@ icon_state = "wall-0" base_icon_state = "wall" explosion_block = 1 - + blocks_air = AIR_BLOCKED thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 62500 //a little over 5 cm thick , 62500 for 1 m by 2.5 m by 0.25 m iron wall. also indicates the temperature at wich the wall will melt (currently only able to melt with H/E pipes) - blocks_air = TRUE baseturfs = /turf/open/floor/plating flags_ricochet = RICOCHET_HARD diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 8adc73747e2..5f12102a624 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -148,7 +148,7 @@ /turf/open/indestructible/binary name = "tear in the fabric of reality" - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER baseturfs = /turf/open/indestructible/binary icon_state = "binary" footstep = null diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 64d4c935819..4f680b91b90 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY(station_turfs) ///The max temperature of the fire which it was subjected to var/max_fire_temperature_sustained = 0 - var/blocks_air = FALSE + var/blocks_air = AIR_ALLOWED var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes @@ -99,6 +99,10 @@ GLOBAL_LIST_EMPTY(station_turfs) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + if(!blocks_air || !simulated) + air = new + air.copy_from(src.return_air()) + // by default, vis_contents is inherited from the turf that was here before vis_contents.Cut() diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index d4d7c0a4bda..78edeb5893a 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -23,7 +23,7 @@ // Remove all gases from all pipenets for(var/datum/pipeline/PN as anything in SSzas.networks) - for(var/datum/gas_mixture/G in PN.air & PN.other_airs) + for(var/datum/gas_mixture/G in list(PN.air) & PN.other_airs) G.gas = list() G.update_values() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 7e7c9947c04..b5c383f9f66 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -9,7 +9,7 @@ anchored = TRUE layer = BELOW_MOB_LAYER pass_flags_self = PASSBLOB - can_atmos_pass = ATMOS_PASS_PROC + can_atmos_pass = CANPASS_PROC obj_flags = CAN_BE_HIT|BLOCK_Z_OUT_DOWN // stops blob mobs from falling on multiz. /// How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. var/point_return = 0 @@ -98,7 +98,7 @@ /obj/structure/blob/block_superconductivity() return atmosblock -/obj/structure/blob/c_block(turf/T, vertical = FALSE) +/obj/structure/blob/c_airblock(turf/T, vertical = FALSE) return !atmosblock /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 06327591c95..e5d2b0ae346 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -6,7 +6,7 @@ density = TRUE anchored = FALSE max_integrity = 100 - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY material_modifier = 0.5 material_flags = MATERIAL_EFFECTS | MATERIAL_AFFECT_STATISTICS blocks_emissive = EMISSIVE_BLOCK_UNIQUE diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 8beaf560c01..2834b6c0860 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -1,4 +1,4 @@ -/*/turf/CanPass(atom/movable/mover, , height=1.5,air_group=0) +/*/turf/CanPass(atom/movable/mover, border_dir, height=1.5,air_group=0) if(target.blocks_air||blocks_air) return 0 @@ -33,7 +33,12 @@ #ifdef ZASDBG ASSERT(isturf(other)) #endif - return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) + if(can_atmos_pass == CANPASS_PROC) + CRASH("Atmos pass assigned proc when proc doesn't exist.") + //var/direction = get_dir(src, other) + //return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) + //return (AIR_BLOCKED*!CanPass(other, direction, 0))|(ZONE_BLOCKED*!CanPass(other, direction, 1)) + return (AIR_BLOCKED*!ATMOS_CANPASS_NOTTURF(src)) // This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. /turf/c_airblock(turf/other) @@ -52,7 +57,7 @@ /atom var/simulated = TRUE - var/can_atmos_pass = ATMOS_PASS_YES - -/atom/proc/c_block(turf/target_turf, vertical = FALSE) - return + var/can_atmos_pass = CANPASS_ALWAYS +#ifdef ZASDBG + var/verbose = FALSE +#endif diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 674c6265dd6..11506523110 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -64,7 +64,7 @@ Class Procs: //connection/New(turf/simulated/A, turf/simulated/B) ZASTURF /connection/New(turf/A, turf/B) #ifdef ZASDBG - ASSERT(SSzas.has_valid_zone(A)) + //ASSERT(TURF_HAS_VALID_ZONE(A)) //ASSERT(SSzas.has_valid_zone(B)) #endif src.A = A @@ -83,13 +83,13 @@ Class Procs: if(!direct()) state |= CONNECTION_DIRECT edge.direct++ -// log_debug("Marked direct.") +// log_admin("Marked direct.") /connection/proc/mark_indirect() if(direct()) state &= ~CONNECTION_DIRECT edge.direct-- -// log_debug("Marked indirect.") +// log_admin("Marked indirect.") /connection/proc/mark_space() state |= CONNECTION_SPACE @@ -103,18 +103,18 @@ Class Procs: /connection/proc/erase() edge.remove_connection(src) state |= CONNECTION_INVALID -// log_debug("Connection Erased: [state]") +// log_admin("Connection Erased: [state]") /connection/proc/update() -// log_debug("Updated, \...") +// log_admin("Updated, \...") if(istype(A,/turf/open/space)) -// log_debug("Invalid A.") +// log_admin("Invalid A.") erase() return var/block_status = SSzas.air_blocked(A,B) if(block_status & AIR_BLOCKED) -// log_debug("Blocked connection.") +// log_admin("Blocked connection.") erase() return else if(block_status & ZONE_BLOCKED) @@ -126,14 +126,14 @@ Class Procs: if(state & CONNECTION_SPACE) if(!b_is_space) -// log_debug("Invalid B.") +// log_admin("Invalid B.") erase() return if(A.zone != zoneA) -// log_debug("Zone changed, \...") +// log_admin("Zone changed, \...") if(!A.zone) erase() -// log_debug("erased.") +// log_admin("erased.") return else edge.remove_connection(src) @@ -141,22 +141,22 @@ Class Procs: edge.add_connection(src) zoneA = A.zone -// log_debug("valid.") +// log_admin("valid.") return else if(b_is_space) -// log_debug("Invalid B.") +// log_admin("Invalid B.") erase() return if(A.zone == B.zone) -// log_debug("A == B") +// log_admin("A == B") erase() return if(A.zone != zoneA || (zoneB && (B.zone != zoneB))) -// log_debug("Zones changed, \...") +// log_admin("Zones changed, \...") if(A.zone && B.zone) edge.remove_connection(src) edge = SSzas.get_edge(A.zone, B.zone) @@ -164,9 +164,9 @@ Class Procs: zoneA = A.zone zoneB = B.zone else -// log_debug("erased.") +// log_admin("erased.") erase() return -// log_debug("valid.") +// log_admin("valid.") diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index caafd283649..66b88abfc1e 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -72,11 +72,11 @@ Class Procs: /connection_edge/proc/add_connection(connection/c) coefficient++ if(c.direct()) direct++ -// log_debug("Connection added: [type] Coefficient: [coefficient]") +// log_admin("Connection added: [type] Coefficient: [coefficient]") /connection_edge/proc/remove_connection(connection/c) -// log_debug("Connection removed: [type] Coefficient: [coefficient-1]") +// log_admin("Connection removed: [type] Coefficient: [coefficient-1]") coefficient-- if(coefficient <= 0) @@ -87,7 +87,7 @@ Class Procs: /connection_edge/proc/erase() SSzas.remove_edge(src) -// log_debug("[type] Erased.") +// log_admin("[type] Erased.") /connection_edge/proc/tick() @@ -131,7 +131,7 @@ Class Procs: A.edges.Add(src) B.edges.Add(src) //id = edge_id(A,B) -// log_debug("New edge between [A] and [B]") +// log_admin("New edge between [A] and [B]") /connection_edge/zone/add_connection(connection/c) @@ -202,7 +202,7 @@ Class Procs: A.edges.Add(src) air = B.return_air() //id = 52*A.id -// log_debug("New edge from [A] to [B].") +// log_admin("New edge from [A] to [B].") /connection_edge/unsimulated/add_connection(connection/c) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 8b138ef620a..95d2cc6c467 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -234,8 +234,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null))) #ifdef FIREDBG - log_debug("***************** FIREDBG *****************") - log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!") + log_admin("***************** FIREDBG *****************") + log_admin("Burning [zone? zone.name : "zoneless gas_mixture"]!") #endif var/gas_fuel = 0 @@ -288,13 +288,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) #ifdef FIREDBG - log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]") - log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]") - log_debug("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])") - log_debug("liquid_reaction_progress = [liquid_reaction_progress]") - log_debug("gas_reaction_progress = [gas_reaction_progress]") - log_debug("total_reaction_progress = [total_reaction_progress]") - log_debug("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") + log_admin("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]") + log_admin("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]") + log_admin("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])") + log_admin("liquid_reaction_progress = [liquid_reaction_progress]") + log_admin("gas_reaction_progress = [gas_reaction_progress]") + log_admin("total_reaction_progress = [total_reaction_progress]") + log_admin("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") #endif //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out @@ -323,8 +323,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin update_values() #ifdef FIREDBG - log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") - log_debug("new temperature = [temperature]; new pressure = [return_pressure()]") + log_admin("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") + log_admin("new temperature = [temperature]; new pressure = [return_pressure()]") #endif if (temperature<220) diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 6d502cbebbb..4dd66a56b9c 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -39,7 +39,9 @@ adjust_temp = loc.temperature else //var/turf/simulated/T = loc - var/turf/T = loc + var/turf/T = get_turf(loc) + if(!istype(T)) + return if(T.zone && T.zone.air) adjust_temp = T.zone.air.temperature else diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index bfe223bb8f3..afbe60689b3 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -114,7 +114,7 @@ ATMOS_CANPASS_TURF(s_block, src, src) if(s_block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("Self-blocked.") + //if(verbose) log_admin("Self-blocked.") //dbg(blocked) #endif if(zone) @@ -147,7 +147,7 @@ if(block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("[d] is blocked.") + if(verbose) log_admin("[d] is blocked.") //unsim.dbg(air_blocked, turn(180,d)) #endif @@ -157,7 +157,7 @@ if(r_block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("[d] is blocked.") + if(verbose) log_admin("[d] is blocked.") //dbg(air_blocked, d) #endif @@ -190,7 +190,7 @@ // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG - if(verbose) log_debug("[d] is zone blocked.") + if(verbose) log_admin("[d] is zone blocked.") //dbg(zone_blocked, d) #endif @@ -205,22 +205,22 @@ #ifdef ZASDBG dbg(assigned) - if(verbose) log_debug("Added to [zone]") + if(verbose) log_admin("Added to [zone]") #endif else if(sim.zone != zone) #ifdef ZASDBG - if(verbose) log_debug("Connecting to [sim.zone]") + if(verbose) log_admin("Connecting to [sim.zone]") #endif SSzas.connect(src, sim) #ifdef ZASDBG - else if(verbose) log_debug("[d] has same zone.") + else if(verbose) log_admin("[d] has same zone.") - else if(verbose) log_debug("[d] has invalid zone.") + else if(verbose) log_admin("[d] has invalid zone.") #endif else diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index bd5a51db51f..532ce87360c 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -61,32 +61,32 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new for(var/p in subtypesof(/datum/xgm_gas)) var/datum/xgm_gas/gas = new p //avoid initial() because of potential New() actions - if(gas.id in xgm_gas_data.gases) - stack_trace("Duplicate gas id `[gas.id]` in `[p]`") + //if(gas.id in xgm_gas_data.gases) + //stack_trace("Duplicate gas id `[gas.id]` in `[p]`") - xgm_gas_data.gases += gas.id - xgm_gas_data.name[gas.id] = gas.name - xgm_gas_data.specific_heat[gas.id] = gas.specific_heat - xgm_gas_data.molar_mass[gas.id] = gas.molar_mass + gases += gas.id + name[gas.id] = gas.name + specific_heat[gas.id] = gas.specific_heat + molar_mass[gas.id] = gas.molar_mass if(gas.overlay_limit) - xgm_gas_data.overlay_limit[gas.id] = gas.overlay_limit - xgm_gas_data.tile_overlay[gas.id] = gas.tile_overlay - xgm_gas_data.tile_overlay_color[gas.id] = gas.tile_color - xgm_gas_data.flags[gas.id] = gas.flags - xgm_gas_data.burn_product[gas.id] = gas.burn_product + overlay_limit[gas.id] = gas.overlay_limit + tile_overlay[gas.id] = gas.tile_overlay + tile_overlay_color[gas.id] = gas.tile_color + flags[gas.id] = gas.flags + burn_product[gas.id] = gas.burn_product - xgm_gas_data.symbol_html[gas.id] = gas.symbol_html - xgm_gas_data.symbol[gas.id] = gas.symbol + symbol_html[gas.id] = gas.symbol_html + symbol[gas.id] = gas.symbol if(!isnull(gas.condensation_product) && !isnull(gas.condensation_point)) - xgm_gas_data.condensation_points[gas.id] = gas.condensation_point - xgm_gas_data.condensation_products[gas.id] = gas.condensation_product + condensation_points[gas.id] = gas.condensation_point + condensation_products[gas.id] = gas.condensation_product - xgm_gas_data.breathed_product[gas.id] = gas.breathed_product - xgm_gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + breathed_product[gas.id] = gas.breathed_product + hidden_from_codex[gas.id] = gas.hidden_from_codex - xgm_gas_data.base_value[gas.id] = gas.base_value - xgm_gas_data.purchaseable[gas.id] = gas.purchaseable + base_value[gas.id] = gas.base_value + purchaseable[gas.id] = gas.purchaseable return 1 diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index bb115cccdd8..0ea9c9697f9 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -304,7 +304,6 @@ temperature = sample.temperature update_values() - return 1 diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index b56ea3e74d5..cb183465d3a 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -59,11 +59,11 @@ Class Procs: air.group_multiplier = 1 air.volume = CELL_VOLUME -/zone/proc/add(turf/simulated/T) +/zone/proc/add(turf/T) #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) - ASSERT(!SSzas.has_valid_zone(T)) + ASSERT(!TURF_HAS_VALID_ZONE(T)) #endif var/datum/gas_mixture/turf_air = T.return_air() @@ -77,7 +77,7 @@ Class Procs: if(fuel) fuel_objs += fuel T.update_graphic(air.graphic) -/zone/proc/remove(turf/simulated/T) +/zone/proc/remove(turf/T) #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index fbaa0ca3fae..56c5a082c09 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -116,7 +116,7 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) // from the same source hasn't been shown too recently if (error_source.next_message_at <= world.time) var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly - //log_debug("Runtime in <b>[e.file]</b>, line <b>[e.line]</b>: <b>[html_encode(e.name)]</b> [error_entry.make_link(viewtext)]") + //log_admin("Runtime in <b>[e.file]</b>, line <b>[e.line]</b>: <b>[html_encode(e.name)]</b> [error_entry.make_link(viewtext)]") var/err_msg_delay if(config?.loaded) err_msg_delay = CONFIG_GET(number/error_msg_delay) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 57bd0bb9579..510e942ac7a 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -233,7 +233,7 @@ density = TRUE var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 5 - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER /obj/structure/fans/deconstruct() if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 51d2a3a4736..756ffc9cd74 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -285,7 +285,7 @@ anchored = TRUE opacity = FALSE density = TRUE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY duration = 82 color = COLOR_DARK_ORANGE diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 98e31b31286..a0a004e1ad6 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -11,7 +11,7 @@ use_power = NO_POWER_USE interaction_flags_atom = NONE interaction_flags_machine = NONE - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER light_range = 4 layer = ABOVE_OBJ_LAYER ///First of the generators producing the containment field @@ -35,7 +35,7 @@ if(field_gen_2) field_gen_2.fields -= src field_gen_2 = null - can_atmos_pass = ATMOS_PASS_YES + can_atmos_pass = CANPASS_ALWAYS //air_update_turf(TRUE, FALSE) return ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 15c3d10c2e2..7e3a4b06481 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -32,7 +32,7 @@ no power level overlay is currently in the overlays list. density = TRUE use_power = NO_POWER_USE max_integrity = 500 - can_atmos_pass = ATMOS_PASS_YES + can_atmos_pass = CANPASS_ALWAYS //100% immune to lasers and energy projectiles since it absorbs their energy. armor = list(MELEE = 25, BULLET = 10, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) ///Amount of energy stored, used for visual overlays (over 9000?) @@ -199,7 +199,7 @@ no power level overlay is currently in the overlays list. /obj/machinery/field/generator/proc/turn_off() active = FG_OFFLINE - can_atmos_pass = ATMOS_PASS_YES + can_atmos_pass = CANPASS_ALWAYS //air_update_turf(TRUE, FALSE) INVOKE_ASYNC(src, .proc/cleanup) addtimer(CALLBACK(src, .proc/cool_down), 5 SECONDS) @@ -275,7 +275,7 @@ no power level overlay is currently in the overlays list. turn_off() return move_resist = INFINITY - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER //air_update_turf(TRUE, TRUE) addtimer(CALLBACK(src, .proc/setup_field, 1), 1) addtimer(CALLBACK(src, .proc/setup_field, 2), 2) diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 1d6e9ced35a..3155d9a7c6f 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -1,7 +1,7 @@ /obj/machinery/power/turbine density = TRUE resistance_flags = FIRE_PROOF - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY ///Theoretical volume of gas that's moving through the turbine, it expands the further it goes var/gas_theoretical_volume = 0 diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 8ca7afff9ba..a9a7c578af1 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -134,7 +134,7 @@ Slimecrossing Items desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!" icon = 'icons/obj/slimecrossing.dmi' icon_state = "slimebarrier_thick" - can_atmos_pass = ATMOS_PASS_NO + can_atmos_pass = CANPASS_NEVER opacity = TRUE timeleft = 100 diff --git a/modular_pariah/modules/large_doors/code/large_doors.dm b/modular_pariah/modules/large_doors/code/large_doors.dm index 7b161926250..f4ce1ee62a1 100644 --- a/modular_pariah/modules/large_doors/code/large_doors.dm +++ b/modular_pariah/modules/large_doors/code/large_doors.dm @@ -61,7 +61,7 @@ density = TRUE opacity = TRUE anchored = TRUE - can_atmos_pass = ATMOS_PASS_DENSITY + can_atmos_pass = CANPASS_DENSITY var/parent_airlock /obj/airlock_filler_object/CanAllowThrough(atom/movable/mover, turf/target) From e0e920af2b163783d30edf5ee3094275c6e982f9 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 21:26:29 -0400 Subject: [PATCH 015/200] SSzas refactor + initial gas stuff --- .../IceRuins/icemoon_surface_asteroid.dmm | 10 +- ...cemoon_underground_abandoned_homestead.dmm | 54 +-- ..._underground_abandoned_plasma_facility.dmm | 70 +-- .../icemoon_underground_frozen_comms.dmm | 44 +- .../IceRuins/icemoon_underground_lavaland.dmm | 8 +- .../IceRuins/icemoon_underground_library.dmm | 96 ++--- .../icemoon_underground_wendigo_cave.dmm | 6 +- .../lavaland_surface_biodome_winter.dmm | 6 +- .../LavaRuins/lavaland_surface_cultaltar.dmm | 16 +- .../LavaRuins/lavaland_surface_hermit.dmm | 2 +- .../LavaRuins/lavaland_surface_pizzaparty.dmm | 72 ++-- .../LavaRuins/lavaland_surface_ufo_crash.dmm | 26 +- _maps/RandomRuins/SpaceRuins/TheDerelict.dmm | 10 +- .../RandomRuins/SpaceRuins/caravanambush.dmm | 22 +- .../SpaceRuins/hilbertshoteltestingsite.dmm | 6 +- .../RandomRuins/SpaceRuins/thelizardsgas.dmm | 12 +- _maps/RandomRuins/SpaceRuins/vaporwave.dmm | 12 +- _maps/RandomZLevels/caves.dmm | 406 +++++++++--------- _maps/RandomZLevels/challenge.dmm | 10 +- _maps/RandomZLevels/moonoutpost19.dmm | 338 +++++++-------- _maps/RandomZLevels/snowdin.dmm | 36 +- _maps/RandomZLevels/undergroundoutpost45.dmm | 98 ++--- _maps/RandomZLevels/wildwest.dmm | 6 +- .../map_files/Deltastation/DeltaStation2.dmm | 4 +- .../IcemoonUnderground_Above.dmm | 24 +- _maps/map_files/MetaStation/MetaStation.dmm | 6 +- _maps/map_files/generic/CentCom.dmm | 36 +- .../maintenance_miningsolar_3.dmm | 2 +- _maps/shuttles/ruin_caravan_victim.dmm | 38 +- _maps/templates/battlecruiser_starfury.dmm | 6 +- .../templates/heretic_sacrifice_template.dmm | 40 +- code/controllers/subsystem/zas.dm | 369 ++++++++++++---- code/game/turfs/closed/minerals.dm | 32 +- code/game/turfs/open/_open.dm | 12 +- code/game/turfs/open/ashplanet.dm | 2 +- code/game/turfs/open/asteroid.dm | 22 +- code/game/turfs/open/basalt.dm | 2 +- code/game/turfs/open/chasm.dm | 6 +- code/game/turfs/open/floor/fancy_floor.dm | 80 ++-- code/game/turfs/open/floor/hull.dm | 2 +- code/game/turfs/open/floor/iron_floor.dm | 32 +- code/game/turfs/open/floor/mineral_floor.dm | 26 +- code/game/turfs/open/floor/misc_floor.dm | 20 +- .../turfs/open/floor/plating/misc_plating.dm | 14 +- code/game/turfs/open/floor/reinf_floor.dm | 50 +-- code/game/turfs/open/glass.dm | 2 +- code/game/turfs/open/grass.dm | 2 +- code/game/turfs/open/ice.dm | 2 +- code/game/turfs/open/lava.dm | 6 +- code/game/turfs/open/openspace.dm | 4 +- code/game/turfs/open/planet.dm | 6 +- code/game/turfs/open/snow.dm | 2 +- code/game/turfs/open/water.dm | 6 +- code/modules/atmospherics/ZAS/Turf.dm | 3 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 1 + .../environmental/LINDA_turf_tile.dm | 14 +- .../atmospherics/gasmixtures/gas_mixture.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 4 +- code/modules/holodeck/turfs.dm | 4 +- .../ruins/icemoonruin_code/hotsprings.dm | 2 +- .../lavalandruin_code/elephantgraveyard.dm | 2 +- code/modules/unit_tests/breath.dm | 12 +- 62 files changed, 1240 insertions(+), 1025 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm index 42ca9e3a167..26856fe193f 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm @@ -12,7 +12,7 @@ /obj/item/clothing/shoes/bronze, /obj/item/clothing/head/bronze, /turf/open/floor/bronze{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/icemoon/surface) "m" = ( @@ -20,12 +20,12 @@ name = "empowered bronze spear" }, /turf/open/floor/bronze{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/icemoon/surface) "o" = ( /turf/open/floor/bronze{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/icemoon/surface) "A" = ( @@ -66,7 +66,7 @@ "L" = ( /mob/living/simple_animal/hostile/megafauna/clockwork_defender, /turf/open/floor/bronze{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/icemoon/surface) "M" = ( @@ -95,7 +95,7 @@ }, /obj/item/pen, /turf/open/floor/bronze{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/icemoon/surface) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm index 035d091871c..9fc33f694ed 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm @@ -6,7 +6,7 @@ "cP" = ( /mob/living/simple_animal/hostile/asteroid/polarbear, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "dy" = ( @@ -27,7 +27,7 @@ }, /obj/item/plate, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "ht" = ( @@ -38,7 +38,7 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "kj" = ( @@ -58,7 +58,7 @@ /area/icemoon/underground/explored) "ng" = ( /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "nq" = ( @@ -78,7 +78,7 @@ dir = 8 }, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "qd" = ( @@ -103,14 +103,14 @@ pixel_y = 11 }, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "uA" = ( /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "uG" = ( @@ -128,7 +128,7 @@ /obj/item/ammo_casing/shotgun/buckshot, /obj/item/ammo_casing/shotgun/buckshot, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "vk" = ( @@ -153,7 +153,7 @@ pixel_y = 3 }, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "wl" = ( @@ -163,7 +163,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/mineral_door/wood, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "wN" = ( @@ -174,7 +174,7 @@ dir = 4 }, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "yO" = ( @@ -190,13 +190,13 @@ "zT" = ( /obj/structure/bed/dogbed, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Cv" = ( /obj/structure/bookcase/random/religion, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Ea" = ( @@ -212,7 +212,7 @@ pixel_y = 5 }, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "El" = ( @@ -221,7 +221,7 @@ }, /obj/item/flashlight/lantern, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Ez" = ( @@ -249,14 +249,14 @@ dir = 8 }, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Hy" = ( /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "HF" = ( @@ -268,7 +268,7 @@ pixel_y = -8 }, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Iz" = ( @@ -280,7 +280,7 @@ pixel_y = -7 }, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Mf" = ( @@ -294,7 +294,7 @@ /obj/structure/bed, /obj/item/bedsheet/patriot, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "NP" = ( @@ -312,12 +312,12 @@ /obj/item/seeds/coffee, /obj/item/seeds/coffee, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "QI" = ( /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Rf" = ( @@ -336,7 +336,7 @@ /obj/structure/mineral_door/wood, /obj/item/assembly/mousetrap/armed, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Sv" = ( @@ -365,14 +365,14 @@ /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Vf" = ( /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "VV" = ( @@ -384,7 +384,7 @@ dir = 8 }, /turf/open/floor/stone{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Zg" = ( @@ -394,7 +394,7 @@ }, /obj/structure/mineral_door/wood, /turf/open/floor/wood/large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index c322b7c33d0..3d95d429115 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -307,7 +307,7 @@ /obj/item/storage/toolbox/electrical, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "dY" = ( @@ -450,7 +450,7 @@ dir = 8 }, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "gD" = ( @@ -501,7 +501,7 @@ /obj/item/pickaxe, /obj/item/clothing/head/hardhat/weldhat/orange, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "hd" = ( @@ -509,7 +509,7 @@ /obj/structure/closet/crate, /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "hr" = ( @@ -651,7 +651,7 @@ }, /obj/structure/plasticflaps, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "ja" = ( @@ -679,7 +679,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/west, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "jN" = ( @@ -719,7 +719,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "ku" = ( @@ -801,7 +801,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "lG" = ( @@ -851,7 +851,7 @@ /obj/item/flashlight/lantern, /obj/machinery/light/small/built/directional/west, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "ms" = ( @@ -876,7 +876,7 @@ "mA" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "mG" = ( @@ -969,7 +969,7 @@ name = "Interior Access" }, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "oc" = ( @@ -1005,7 +1005,7 @@ dir = 8 }, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "oE" = ( @@ -1141,7 +1141,7 @@ /obj/machinery/atmospherics/components/tank/plasma, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "qP" = ( @@ -1226,7 +1226,7 @@ }, /obj/item/stack/sheet/mineral/plasma/thirty, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "sq" = ( @@ -1376,7 +1376,7 @@ }, /mob/living/simple_animal/hostile/asteroid/wolf, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "uq" = ( @@ -1414,7 +1414,7 @@ /obj/item/tank/internals/emergency_oxygen/empty, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "ve" = ( @@ -1447,7 +1447,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "wc" = ( @@ -1469,7 +1469,7 @@ /obj/machinery/atmospherics/components/tank/air, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "wu" = ( @@ -1615,7 +1615,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Ae" = ( @@ -1698,7 +1698,7 @@ dir = 8 }, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "BJ" = ( @@ -1781,14 +1781,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "CJ" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "CU" = ( @@ -2034,7 +2034,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Id" = ( @@ -2101,7 +2101,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/built/directional/west, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "Jp" = ( @@ -2138,7 +2138,7 @@ /mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Jy" = ( @@ -2360,7 +2360,7 @@ /obj/machinery/power/smes/engineering, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "MU" = ( @@ -2442,7 +2442,7 @@ /obj/machinery/light/small/directional/north, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Ny" = ( @@ -2516,7 +2516,7 @@ "OF" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "OJ" = ( @@ -2526,7 +2526,7 @@ }, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "OM" = ( @@ -2564,7 +2564,7 @@ dir = 1 }, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Px" = ( @@ -2648,7 +2648,7 @@ /obj/machinery/door/airlock/external/glass/ruin, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "Qn" = ( @@ -2696,7 +2696,7 @@ /obj/structure/rack, /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Rf" = ( @@ -2970,7 +2970,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "Xj" = ( @@ -2984,7 +2984,7 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) "XC" = ( @@ -2992,7 +2992,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/commons) "XI" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index b737262d596..e23841cab79 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -19,7 +19,7 @@ /obj/structure/table/reinforced/rglass, /obj/item/radio/intercom, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "cO" = ( @@ -40,7 +40,7 @@ }, /obj/machinery/door/airlock/external/glass/ruin, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "gz" = ( @@ -57,7 +57,7 @@ /area/icemoon/underground/unexplored/rivers) "kr" = ( /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "oj" = ( @@ -65,18 +65,18 @@ /obj/structure/bed, /obj/item/bedsheet/dorms, /turf/open/floor/iron/grimy{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "oD" = ( /mob/living/simple_animal/hostile/asteroid/wolf, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "oT" = ( /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "qS" = ( @@ -89,13 +89,13 @@ pixel_y = 7 }, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "rm" = ( /obj/structure/table/reinforced/rglass, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "rn" = ( @@ -110,7 +110,7 @@ "st" = ( /obj/machinery/door/airlock/public, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "sM" = ( @@ -132,13 +132,13 @@ "uz" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "vh" = ( /obj/item/chair/plastic, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "wg" = ( @@ -152,7 +152,7 @@ pixel_y = 20 }, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "wP" = ( @@ -166,7 +166,7 @@ /obj/structure/closet/wardrobe/grey, /obj/item/clothing/gloves/color/plasmaman, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "yW" = ( @@ -185,7 +185,7 @@ /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/mask/breath, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "zk" = ( @@ -220,7 +220,7 @@ /obj/item/toy/crayon/spraycan, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Cu" = ( @@ -265,7 +265,7 @@ /obj/structure/dresser, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/iron/grimy{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "GH" = ( @@ -286,7 +286,7 @@ /obj/structure/closet/wardrobe/grey, /obj/effect/spawner/random/maintenance/three, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Jh" = ( @@ -330,13 +330,13 @@ /obj/effect/turf_decal/siding/wood, /obj/machinery/door/airlock/shuttle, /turf/open/floor/iron/grimy{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "NO" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Oi" = ( @@ -379,7 +379,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/door/airlock/external/ruin, /turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "SR" = ( @@ -412,14 +412,14 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Ws" = ( /obj/structure/closet/wardrobe/grey, /obj/item/clothing/under/plasmaman, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) "Zd" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm index cc8a6ae371f..7746d05bf10 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm @@ -12,7 +12,7 @@ }, /obj/item/pen, /turf/open/misc/asteroid{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/icemoon/underground) "q" = ( @@ -34,7 +34,7 @@ "A" = ( /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/icemoon/underground) "E" = ( @@ -56,12 +56,12 @@ "V" = ( /obj/item/storage/toolbox/mechanical/old/clean, /turf/open/misc/asteroid{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/icemoon/underground) "Z" = ( /turf/open/misc/asteroid{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/icemoon/underground) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index 4124628eafa..357144bca96 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -16,25 +16,25 @@ /area/icemoon/underground/unexplored) "ae" = ( /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "af" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ag" = ( /obj/item/feather, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ah" = ( /obj/structure/bookcase/random, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ai" = ( @@ -64,21 +64,21 @@ "ao" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ap" = ( /obj/item/stack/sheet/mineral/wood, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aq" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ar" = ( @@ -87,7 +87,7 @@ "at" = ( /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "au" = ( @@ -108,7 +108,7 @@ "az" = ( /obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aA" = ( @@ -118,7 +118,7 @@ "aB" = ( /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aC" = ( @@ -127,28 +127,28 @@ /area/ruin/unpowered/buried_library) "aD" = ( /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aE" = ( /obj/item/stack/sheet/mineral/wood, /obj/item/book/manual/random, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aG" = ( /obj/structure/table/bronze, /obj/item/stack/ore/slag, /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aH" = ( /obj/structure/table/bronze, /obj/item/statuebust/hippocratic, /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aI" = ( @@ -169,7 +169,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aM" = ( @@ -180,13 +180,13 @@ "aN" = ( /obj/structure/statue/sandstone/venus, /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aO" = ( /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aP" = ( @@ -197,13 +197,13 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aR" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aS" = ( @@ -219,7 +219,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aU" = ( @@ -230,7 +230,7 @@ /obj/item/stack/sheet/mineral/wood, /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "aW" = ( @@ -250,7 +250,7 @@ /obj/structure/fluff/paper/stack, /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "ba" = ( @@ -268,7 +268,7 @@ dir = 1 }, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bd" = ( @@ -278,7 +278,7 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "be" = ( @@ -286,7 +286,7 @@ dir = 5 }, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bf" = ( @@ -295,7 +295,7 @@ dir = 4 }, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bg" = ( @@ -306,7 +306,7 @@ /obj/effect/decal/cleanable/dirt/dust, /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bi" = ( @@ -321,7 +321,7 @@ /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bl" = ( @@ -345,7 +345,7 @@ /obj/structure/mineral_door/wood, /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "br" = ( @@ -368,26 +368,26 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bw" = ( /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bx" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "by" = ( /obj/structure/statue/bronze/marx, /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bz" = ( @@ -403,7 +403,7 @@ "bB" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/carpet/black{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bC" = ( @@ -413,34 +413,34 @@ }, /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bD" = ( /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bE" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bF" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bG" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bH" = ( @@ -448,28 +448,28 @@ /obj/structure/fluff/paper, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bI" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bJ" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken2"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bK" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bL" = ( @@ -478,7 +478,7 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bM" = ( @@ -487,7 +487,7 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bN" = ( @@ -495,20 +495,20 @@ /obj/structure/fluff/paper, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bP" = ( /obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) "bQ" = ( /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm index 910598c44b4..e58ad558b34 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -15,7 +15,7 @@ "q" = ( /mob/living/simple_animal/hostile/megafauna/wendigo, /turf/open/indestructible/necropolis{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "z" = ( @@ -23,7 +23,7 @@ id = "wendigo arena" }, /turf/open/indestructible/necropolis{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "K" = ( @@ -34,7 +34,7 @@ /area/icemoon/underground/unexplored) "N" = ( /turf/open/indestructible/necropolis{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "U" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index e381d3dc0e0..cd6d52fab41 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -204,7 +204,7 @@ dir = 1 }, /turf/open/floor/wood{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas = "o2=22;n2=82;TEMP=180"; name = "bridge" }, /area/ruin/powered/snow_biodome) @@ -276,7 +276,7 @@ /obj/machinery/light/built/directional/north, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/powered/snow_biodome) "og" = ( @@ -423,7 +423,7 @@ "PM" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas = "o2=22;n2=82;TEMP=180"; name = "bridge" }, /area/ruin/powered/snow_biodome) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index a2b3d227d5d..553b09f55fc 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "c" = ( @@ -24,21 +24,21 @@ "g" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "i" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "k" = ( /obj/effect/decal/remains/human, /obj/item/melee/cultblade, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "l" = ( @@ -46,13 +46,13 @@ /obj/item/clothing/shoes/cult, /obj/item/clothing/suit/hooded/cultrobes, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "m" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "o" = ( @@ -74,7 +74,7 @@ name = "ohfuck" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "q" = ( @@ -83,7 +83,7 @@ /obj/item/clothing/suit/hooded/cultrobes, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered/cultaltar) "s" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 8ce56831f6b..5ec32d26957 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -164,7 +164,7 @@ "J" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/powered) "L" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index ba0c6f9a672..1bb066f4c07 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -15,14 +15,14 @@ "e" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "f" = ( /obj/structure/table/wood, /obj/item/storage/box/cups, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "g" = ( @@ -32,27 +32,27 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "h" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "i" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "j" = ( /obj/item/food/pizzaslice/mushroom, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "k" = ( @@ -60,7 +60,7 @@ /obj/effect/spawner/random/food_or_drink/pizzaparty, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "l" = ( @@ -70,42 +70,42 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "m" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "n" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "o" = ( /obj/item/plate, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "p" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "q" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "r" = ( @@ -116,25 +116,25 @@ name = "party hat" }, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "s" = ( /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "t" = ( /obj/structure/chair/wood/wings, /obj/effect/decal/remains/human, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "u" = ( /obj/structure/glowshroom/single, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "v" = ( @@ -146,21 +146,21 @@ /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "x" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/pizzaparty, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "y" = ( /obj/structure/table/wood, /obj/item/plate, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "z" = ( @@ -168,7 +168,7 @@ /obj/structure/glowshroom/single, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "A" = ( @@ -176,7 +176,7 @@ /obj/item/plate, /obj/item/kitchen/fork, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "C" = ( @@ -185,7 +185,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "D" = ( @@ -193,47 +193,47 @@ /obj/item/food/pizzaslice/margherita, /obj/item/plate, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "E" = ( /obj/structure/table/wood, /obj/item/food/pizzaslice/meat, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "F" = ( /obj/structure/table/wood, /obj/item/food/cake/birthday, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "G" = ( /obj/structure/table/wood, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "H" = ( /obj/item/chair/wood/wings, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "I" = ( /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "J" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "K" = ( @@ -243,21 +243,21 @@ /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "L" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "M" = ( /obj/effect/decal/cleanable/dirt, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "N" = ( @@ -269,19 +269,19 @@ /obj/item/knife/kitchen, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "P" = ( /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "Q" = ( /turf/open/floor/plating{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 372731e7223..e06a4ff91d2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -16,12 +16,12 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "k" = ( /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "l" = ( @@ -29,59 +29,59 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "o" = ( /obj/item/hemostat/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "p" = ( /obj/effect/mob_spawn/corpse/human/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "q" = ( /obj/structure/closet/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "s" = ( /obj/structure/table/optable/abductor, /obj/item/cautery/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "t" = ( /obj/structure/table/abductor, /obj/item/storage/box/alienhandcuffs, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "v" = ( /obj/item/scalpel/alien, /obj/item/surgical_drapes, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "w" = ( /obj/item/retractor/alien, /obj/item/paper/guides/antag/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "y" = ( /obj/machinery/abductor/gland_dispenser, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "z" = ( @@ -89,13 +89,13 @@ /obj/item/surgicaldrill/alien, /obj/item/circular_saw/alien, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) "A" = ( /obj/structure/bed/abductor, /turf/open/floor/plating/abductor{ - initial_gas_mix = "LAVALAND_ATMOS" + initial_gas = "LAVALAND_ATMOS" }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 37862ff0d6e..638fa459a2b 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -2443,7 +2443,7 @@ "lw" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/engine/air{ - initial_gas_mix = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = "o2=20000;n2=80000;TEMP=293.15" }, /area/ruin/space/derelict/atmospherics) "lx" = ( @@ -2519,7 +2519,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas_mix = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = "o2=20000;n2=80000;TEMP=293.15" }, /area/ruin/space/derelict/atmospherics) "lO" = ( @@ -2527,7 +2527,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas_mix = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = "o2=20000;n2=80000;TEMP=293.15" }, /area/ruin/space/derelict/atmospherics) "lP" = ( @@ -2666,7 +2666,7 @@ "mq" = ( /turf/open/floor/iron{ icon_state = "damaged2"; - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/space/derelict/atmospherics) "mr" = ( @@ -3157,7 +3157,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas_mix = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = "o2=20000;n2=80000;TEMP=293.15" }, /area/ruin/space/derelict/atmospherics) "rC" = ( diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 0f8fa5f5f77..269f8102e67 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -112,7 +112,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "aD" = ( @@ -132,7 +132,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "aI" = ( @@ -148,14 +148,14 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "aM" = ( /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "aN" = ( @@ -193,7 +193,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "aR" = ( @@ -486,7 +486,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "gY" = ( @@ -513,7 +513,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "hm" = ( @@ -610,7 +610,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "hB" = ( @@ -813,7 +813,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter2) "ix" = ( @@ -883,7 +883,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter3) "iT" = ( @@ -923,7 +923,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter2) "ja" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm index b73909ba583..1e7ece5606b 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm @@ -223,7 +223,7 @@ /area/ruin/unpowered/no_grav) "K" = ( /turf/open/floor/iron/stairs/right{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "Q" = ( @@ -237,12 +237,12 @@ /area/ruin/space/has_grav/hilbertresearchfacility) "U" = ( /turf/open/floor/iron/stairs/medium{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "X" = ( /turf/open/floor/iron/stairs/left{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index 58a0bfafca9..74dee33ca80 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -118,7 +118,7 @@ chamber_id = "lizardgas" }, /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "mN" = ( @@ -298,7 +298,7 @@ /area/template_noop) "DG" = ( /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "Es" = ( @@ -423,7 +423,7 @@ "OQ" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "Pb" = ( @@ -457,7 +457,7 @@ name = "Zingo" }, /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "RB" = ( @@ -499,7 +499,7 @@ dir = 4 }, /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "Um" = ( @@ -549,7 +549,7 @@ chamber_id = "lizardgas" }, /turf/open/floor/engine/plasma{ - initial_gas_mix = "plasma=35000;TEMP=293.15" + initial_gas = "plasma=35000;TEMP=293.15" }, /area/ruin/space/has_grav/thelizardsgas) "Ys" = ( diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index e988f85602b..f20af636567 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -118,13 +118,13 @@ /obj/effect/turf_decal/sand, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "B" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "C" = ( @@ -135,7 +135,7 @@ }, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "D" = ( @@ -155,14 +155,14 @@ }, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "G" = ( /obj/effect/turf_decal/stripes/asteroid/line, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) "H" = ( @@ -216,7 +216,7 @@ /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/ruin/unpowered/no_grav) diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 65506463dd4..ba60d17af25 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -11,14 +11,14 @@ "ad" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) "ah" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_three) @@ -27,25 +27,25 @@ /area/awaymission/caves/bmp_asteroid/level_three) "ao" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "ap" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "ar" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "as" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "au" = ( @@ -58,7 +58,7 @@ /obj/item/clothing/mask/gas/clown_hat, /obj/item/organ/heart/demon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "av" = ( @@ -67,13 +67,13 @@ name = "shock rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aw" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "ax" = ( @@ -87,39 +87,39 @@ }, /obj/item/coin/antagtoken, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "az" = ( /obj/structure/constructshell, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aA" = ( /obj/structure/girder/cult, /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aB" = ( /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aC" = ( /obj/structure/bed, /obj/item/bedsheet/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aD" = ( /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aE" = ( @@ -132,7 +132,7 @@ name = "\proper an extremely flamboyant book" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aF" = ( @@ -143,13 +143,13 @@ name = "weak forcefield" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aG" = ( /obj/item/ectoplasm, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aH" = ( @@ -158,7 +158,7 @@ "aI" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "aJ" = ( @@ -166,7 +166,7 @@ /area/awaymission/caves/bmp_asteroid/level_three) "aK" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "aM" = ( @@ -175,7 +175,7 @@ id = "minedeep" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "aP" = ( @@ -185,33 +185,33 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aR" = ( /obj/effect/forcefield/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aS" = ( /obj/structure/girder/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "aV" = ( /obj/effect/forcefield/cult, /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) "aW" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "aX" = ( @@ -225,7 +225,7 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "aZ" = ( @@ -234,26 +234,26 @@ name = "flame rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "ba" = ( /obj/structure/destructible/cult/item_dispenser/altar, /obj/item/book/granter/martial/plasma_fist/nobomb, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bf" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bl" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "bm" = ( @@ -261,7 +261,7 @@ calibrated = 0 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bn" = ( @@ -272,14 +272,14 @@ /obj/effect/decal/cleanable/blood, /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bz" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bA" = ( @@ -287,25 +287,25 @@ /obj/item/necromantic_stone, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bC" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "bD" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "bE" = ( /obj/structure/destructible/cult/pylon, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "bF" = ( @@ -315,7 +315,7 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "bK" = ( @@ -327,7 +327,7 @@ "bM" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid) @@ -337,7 +337,7 @@ "bO" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_two) @@ -350,12 +350,12 @@ "bS" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "bT" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "bU" = ( @@ -369,19 +369,19 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "bY" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "ca" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "ce" = ( @@ -390,12 +390,12 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "cf" = ( /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "cg" = ( @@ -407,7 +407,7 @@ "cl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "cm" = ( @@ -415,24 +415,24 @@ /area/awaymission/caves/bmp_asteroid/level_two) "cn" = ( /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cp" = ( /obj/structure/table, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cr" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cs" = ( /obj/item/shard, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "ct" = ( @@ -440,36 +440,36 @@ /obj/item/stack/rods, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cu" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cv" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cw" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cx" = ( /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "cA" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cB" = ( @@ -478,7 +478,7 @@ }, /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cC" = ( @@ -486,13 +486,13 @@ /obj/item/restraints/handcuffs/cable, /obj/item/restraints/handcuffs/cable, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cD" = ( /obj/effect/decal/remains/human, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cE" = ( @@ -502,19 +502,19 @@ }, /obj/item/stack/rods, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cH" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "cK" = ( @@ -528,7 +528,7 @@ /obj/machinery/door/window/left/directional/east, /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cO" = ( @@ -537,19 +537,19 @@ }, /obj/machinery/door/window/left/directional/east, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cP" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cR" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cS" = ( @@ -559,7 +559,7 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cT" = ( @@ -570,13 +570,13 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cV" = ( /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cW" = ( @@ -584,20 +584,20 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cX" = ( /obj/structure/table, /obj/item/melee/baton/security, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cY" = ( /obj/structure/glowshroom/single, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cZ" = ( @@ -606,7 +606,7 @@ pixel_x = 32 }, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "db" = ( @@ -614,13 +614,13 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dd" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "df" = ( @@ -631,7 +631,7 @@ /obj/item/grenade/syndieminibomb/concussion, /obj/item/grenade/syndieminibomb/concussion, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dg" = ( @@ -645,7 +645,7 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "dh" = ( @@ -832,20 +832,20 @@ /area/awaymission/caves/northblock) "ec" = ( /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ed" = ( /obj/structure/bed, /obj/effect/landmark/awaystart, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ee" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eg" = ( @@ -882,24 +882,24 @@ "em" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "en" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eo" = ( /obj/item/stack/rods, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ep" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "er" = ( @@ -917,7 +917,7 @@ "et" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ev" = ( @@ -1076,18 +1076,18 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "fy" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "fz" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "fA" = ( @@ -1131,7 +1131,7 @@ /area/awaymission/caves/bmp_asteroid) "fQ" = ( /turf/open/floor/plating/elevatorshaft{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; name = "elevator flooring" }, /area/awaymission/caves/bmp_asteroid) @@ -1142,14 +1142,14 @@ "fU" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating/elevatorshaft{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; name = "elevator flooring" }, /area/awaymission/caves/bmp_asteroid) "fW" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "fY" = ( @@ -1163,7 +1163,7 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gb" = ( @@ -1173,7 +1173,7 @@ "gc" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gf" = ( @@ -1185,20 +1185,20 @@ /obj/structure/table/reinforced, /obj/item/storage/box/donkpockets, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gh" = ( /obj/structure/table/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gi" = ( /obj/structure/table/reinforced, /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gj" = ( @@ -1218,13 +1218,13 @@ "go" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gp" = ( /obj/structure/table_frame, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gq" = ( @@ -1272,7 +1272,7 @@ "gB" = ( /obj/machinery/mech_bay_recharge_port, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gC" = ( @@ -1284,7 +1284,7 @@ /obj/item/storage/toolbox/mechanical, /obj/item/clothing/glasses/material, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gG" = ( @@ -1300,12 +1300,12 @@ "gI" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gJ" = ( /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gK" = ( @@ -1323,19 +1323,19 @@ "gN" = ( /obj/structure/holohoop, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gO" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gP" = ( /obj/item/toy/beach_ball/holoball, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gU" = ( @@ -1343,7 +1343,7 @@ dir = 1 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "gX" = ( @@ -1354,7 +1354,7 @@ /obj/effect/baseturf_helper/lava, /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas_mix = "n2=23;o2=14;TEMP=2.7"; + initial_gas = "n2=23;o2=14;TEMP=2.7"; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) @@ -1372,19 +1372,19 @@ /area/awaymission/caves/northblock) "hq" = ( /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "hr" = ( /obj/structure/spider/stickyweb, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "hw" = ( /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "hQ" = ( @@ -1394,19 +1394,19 @@ "hT" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "jH" = ( /obj/structure/spawner/mining/basilisk, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "jU" = ( /obj/structure/spawner/mining/basilisk, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "ki" = ( @@ -1418,7 +1418,7 @@ /obj/item/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "kw" = ( @@ -1426,7 +1426,7 @@ pixel_y = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( @@ -1447,13 +1447,13 @@ "ml" = ( /mob/living/simple_animal/hostile/asteroid/fugu, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "ms" = ( /obj/structure/spawner/mining/goliath, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "mX" = ( @@ -1461,7 +1461,7 @@ name = "Mining cart" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "nw" = ( @@ -1475,18 +1475,18 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "nY" = ( /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "oI" = ( /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "pc" = ( @@ -1498,13 +1498,13 @@ /obj/item/mjollnir, /mob/living/simple_animal/hostile/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "qD" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "qE" = ( @@ -1514,7 +1514,7 @@ "ra" = ( /obj/structure/glowshroom/single, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "rl" = ( @@ -1525,12 +1525,12 @@ amount = 12 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "rv" = ( /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "rF" = ( @@ -1540,7 +1540,7 @@ "sl" = ( /obj/structure/spawner/mining/hivelord, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "sw" = ( @@ -1550,19 +1550,19 @@ "sE" = ( /obj/item/greentext, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "sI" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "sT" = ( /obj/structure/spawner/mining/hivelord, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "tz" = ( @@ -1573,7 +1573,7 @@ "tU" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "uN" = ( @@ -1593,13 +1593,13 @@ "vX" = ( /obj/effect/forcefield/cult, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "wl" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "ww" = ( @@ -1608,13 +1608,13 @@ "wT" = ( /obj/structure/destructible/cult/pylon, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "xs" = ( /obj/item/bedsheet/patriot, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "yS" = ( @@ -1630,50 +1630,50 @@ /obj/item/slimepotion/fireproof, /obj/item/clothing/glasses/thermal, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "yV" = ( /obj/structure/flora/rock, /obj/item/soulstone/anybody, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "zn" = ( /obj/effect/landmark/awaystart, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "zH" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "zN" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "zR" = ( /obj/effect/decal/cleanable/ash, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "zS" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Aj" = ( /obj/structure/grille, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "AN" = ( @@ -1682,13 +1682,13 @@ name = "shock rune" }, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "AZ" = ( /obj/structure/girder, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Bd" = ( @@ -1697,54 +1697,54 @@ name = "flame rune" }, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "Bo" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Bs" = ( /obj/effect/landmark/awaystart, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( /mob/living/simple_animal/hostile/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "BH" = ( /obj/structure/spawner/skeleton, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "BK" = ( /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "BL" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "BQ" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Cc" = ( /obj/item/gun/energy/laser/captain/scattershot, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "CB" = ( @@ -1753,7 +1753,7 @@ name = "Cave Bat" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Ds" = ( @@ -1761,7 +1761,7 @@ pixel_x = 5 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "DH" = ( @@ -1772,7 +1772,7 @@ pixel_x = 5 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "DO" = ( @@ -1783,7 +1783,7 @@ }, /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Fj" = ( @@ -1792,13 +1792,13 @@ desc = "It's a beachball with a face crudely drawn onto it with some soot." }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "FI" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "FS" = ( @@ -1810,7 +1810,7 @@ "FV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Gt" = ( @@ -1824,31 +1824,31 @@ "HK" = ( /obj/structure/destructible/cult/pylon, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "Ik" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "IN" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "IY" = ( /obj/structure/spider/cocoon, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "IZ" = ( /obj/item/clothing/head/collectable/wizard, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "Jp" = ( @@ -1859,26 +1859,26 @@ pixel_x = 32 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "JD" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "Kh" = ( /obj/machinery/light/small/built/directional/west, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "KY" = ( /obj/structure/table, /obj/item/paper/crumpled/awaymissions/caves/unsafe_area, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Ls" = ( @@ -1886,7 +1886,7 @@ pixel_x = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Ly" = ( @@ -1900,7 +1900,7 @@ amount = 15 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Mk" = ( @@ -1910,19 +1910,19 @@ "Mq" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Mw" = ( /obj/item/shard, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "MB" = ( /obj/item/grown/log, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "MC" = ( @@ -1935,7 +1935,7 @@ "MM" = ( /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Np" = ( @@ -1944,7 +1944,7 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "NO" = ( @@ -1952,25 +1952,25 @@ /obj/structure/filingcabinet, /obj/item/paper/fluff/awaymissions/caves/omega, /turf/open/floor/iron{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "NX" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "OA" = ( /obj/item/gun/ballistic/automatic/pistol/deagle/gold, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "OE" = ( /obj/machinery/light/directional/west, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "OJ" = ( @@ -1979,7 +1979,7 @@ name = "Cave Bat" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "OX" = ( @@ -2001,7 +2001,7 @@ "Rm" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "Rp" = ( @@ -2012,38 +2012,38 @@ }, /obj/machinery/light/small/built/directional/east, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Ry" = ( /obj/structure/grille, /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "RJ" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "SV" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "Tj" = ( /obj/item/assembly/igniter, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "TT" = ( /obj/item/ectoplasm, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "Uu" = ( @@ -2056,7 +2056,7 @@ /obj/effect/decal/remains/human, /obj/item/clothing/under/misc/patriotsuit, /turf/open/misc/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_four) "VK" = ( @@ -2064,7 +2064,7 @@ name = "spooky skeleton remains" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Wj" = ( @@ -2086,13 +2086,13 @@ pixel_x = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "Xs" = ( /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "XG" = ( @@ -2101,44 +2101,44 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "XN" = ( /obj/item/grenade/syndieminibomb/concussion, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "YG" = ( /obj/item/organ/brain/alien, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "YZ" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) "Zj" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid) "ZS" = ( /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" + initial_gas = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/bmp_asteroid/level_three) diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/challenge.dmm index 6189d9d5e58..dc8acaa83f5 100644 --- a/_maps/RandomZLevels/challenge.dmm +++ b/_maps/RandomZLevels/challenge.dmm @@ -450,18 +450,18 @@ /area/awaymission/challenge/main) "bF" = ( /turf/open/floor/iron/white/corner{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/challenge/main) "bG" = ( /turf/open/floor/iron/white/side{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/challenge/main) "bH" = ( /turf/open/floor/iron/white/corner{ dir = 8; - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/challenge/main) "bI" = ( @@ -529,7 +529,7 @@ "bQ" = ( /obj/item/gun/ballistic/revolver/russian, /turf/open/floor/iron/white/side{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/challenge/main) "bR" = ( @@ -560,7 +560,7 @@ "bU" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/challenge/main) "bV" = ( diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 3d405d7d6ae..0687985225b 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -549,7 +549,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -563,7 +563,7 @@ /obj/structure/alien/weeds, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "bZ" = ( @@ -576,7 +576,7 @@ /obj/structure/alien/weeds, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -584,7 +584,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -597,7 +597,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -611,7 +611,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -626,7 +626,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -640,7 +640,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -652,7 +652,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -665,7 +665,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -678,7 +678,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -748,14 +748,14 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cp" = ( /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "cq" = ( @@ -765,7 +765,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -783,7 +783,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "cs" = ( @@ -795,7 +795,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -803,7 +803,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "cu" = ( @@ -811,7 +811,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -823,7 +823,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -880,7 +880,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -897,7 +897,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -909,7 +909,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -921,7 +921,7 @@ /obj/structure/alien/weeds, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "cH" = ( @@ -934,7 +934,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -946,7 +946,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -957,7 +957,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -975,7 +975,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -990,7 +990,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1045,7 +1045,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1054,7 +1054,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1071,7 +1071,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1088,7 +1088,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "cU" = ( @@ -1107,7 +1107,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1116,7 +1116,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1125,7 +1125,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1142,7 +1142,7 @@ /turf/open/floor/iron{ dir = 1; heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1161,14 +1161,14 @@ }, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "da" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "db" = ( @@ -1200,7 +1200,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1222,7 +1222,7 @@ /turf/open/floor/iron{ dir = 1; heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1236,14 +1236,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "di" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "dj" = ( @@ -1268,7 +1268,7 @@ /obj/structure/alien/weeds, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1279,7 +1279,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1289,7 +1289,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1298,7 +1298,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1312,7 +1312,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1325,7 +1325,7 @@ }, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "dr" = ( @@ -1337,7 +1337,7 @@ /obj/item/suppressor, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "ds" = ( @@ -1374,7 +1374,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "dw" = ( @@ -1387,7 +1387,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1395,7 +1395,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) "dy" = ( @@ -1409,7 +1409,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1428,7 +1428,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1436,7 +1436,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1448,7 +1448,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1467,7 +1467,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1476,7 +1476,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1484,7 +1484,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -1840,7 +1840,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/research) "fc" = ( @@ -2306,7 +2306,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "gf" = ( @@ -3611,7 +3611,7 @@ /obj/item/shard, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "iU" = ( @@ -3886,7 +3886,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -3894,14 +3894,14 @@ /obj/structure/grille, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "jC" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "jD" = ( @@ -4105,7 +4105,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4115,7 +4115,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4125,7 +4125,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4135,7 +4135,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4145,7 +4145,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4154,7 +4154,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4164,7 +4164,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4329,14 +4329,14 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kC" = ( /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "kD" = ( @@ -4348,7 +4348,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4356,7 +4356,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4365,7 +4365,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4374,7 +4374,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4455,7 +4455,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "kQ" = ( @@ -4464,7 +4464,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4618,7 +4618,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4630,7 +4630,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4770,7 +4770,7 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4804,7 +4804,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4814,7 +4814,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4943,7 +4943,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5084,7 +5084,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5226,7 +5226,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5240,7 +5240,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5311,7 +5311,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5366,7 +5366,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5376,7 +5376,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5407,7 +5407,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "no" = ( @@ -5432,7 +5432,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5463,7 +5463,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5471,7 +5471,7 @@ /obj/item/pickaxe/drill, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "nw" = ( @@ -5484,7 +5484,7 @@ }, /turf/open/floor/iron/cafeteria{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5506,7 +5506,7 @@ }, /turf/open/floor/iron/cafeteria{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5519,7 +5519,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5555,7 +5555,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5568,7 +5568,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5581,7 +5581,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5594,7 +5594,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5659,7 +5659,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5670,7 +5670,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5714,7 +5714,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5749,7 +5749,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5761,7 +5761,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5771,7 +5771,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5784,7 +5784,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5792,7 +5792,7 @@ /obj/structure/chair/comfy/black, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "ob" = ( @@ -5806,7 +5806,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5818,7 +5818,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5830,7 +5830,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "oz" = ( @@ -5838,7 +5838,7 @@ /obj/structure/alien/egg/burst, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "oJ" = ( @@ -5848,7 +5848,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "oT" = ( @@ -5886,7 +5886,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "qw" = ( @@ -5897,7 +5897,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "qD" = ( @@ -5907,7 +5907,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "qK" = ( @@ -5915,7 +5915,7 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5929,7 +5929,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "rk" = ( @@ -5943,7 +5943,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5953,14 +5953,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "rD" = ( /obj/item/trash/candy, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "sb" = ( @@ -5970,7 +5970,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "si" = ( @@ -5978,7 +5978,7 @@ /mob/living/simple_animal/hostile/alien/sentinel, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "sy" = ( @@ -5988,7 +5988,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "sM" = ( @@ -5998,7 +5998,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "tb" = ( @@ -6006,7 +6006,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "tK" = ( @@ -6019,7 +6019,7 @@ /obj/item/clothing/glasses/night, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "uf" = ( @@ -6033,14 +6033,14 @@ /obj/structure/alien/egg, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "uR" = ( /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "vm" = ( @@ -6048,7 +6048,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "vJ" = ( @@ -6058,7 +6058,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6073,7 +6073,7 @@ /obj/item/clothing/mask/facehugger/impregnated, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "vV" = ( @@ -6088,7 +6088,7 @@ "wq" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "wx" = ( @@ -6097,7 +6097,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "wT" = ( @@ -6107,14 +6107,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "xI" = ( /obj/item/storage/bag/ore, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "yz" = ( @@ -6123,7 +6123,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "zp" = ( @@ -6132,7 +6132,7 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "zF" = ( @@ -6154,7 +6154,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "BH" = ( @@ -6162,7 +6162,7 @@ /obj/structure/bed/nest, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "CY" = ( @@ -6170,7 +6170,7 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "DF" = ( @@ -6187,7 +6187,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6225,7 +6225,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6243,7 +6243,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6256,7 +6256,7 @@ /obj/item/mining_scanner, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "Ku" = ( @@ -6264,7 +6264,7 @@ /mob/living/simple_animal/hostile/alien, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "KG" = ( @@ -6275,7 +6275,7 @@ /obj/item/gun/ballistic/automatic/pistol, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "Li" = ( @@ -6315,7 +6315,7 @@ /obj/item/clothing/head/helmet, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "OO" = ( @@ -6323,7 +6323,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "Pn" = ( @@ -6348,14 +6348,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "PS" = ( /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "Rm" = ( @@ -6369,14 +6369,14 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "Sg" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "SE" = ( @@ -6390,7 +6390,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6406,7 +6406,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "Uq" = ( @@ -6414,14 +6414,14 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "UY" = ( /obj/structure/alien/weeds/node, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "VE" = ( @@ -6432,7 +6432,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -6440,7 +6440,7 @@ /obj/structure/alien/weeds/node, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) "Wf" = ( @@ -6457,7 +6457,7 @@ /mob/living/simple_animal/hostile/alien, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "Yn" = ( @@ -6467,7 +6467,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6477,7 +6477,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) "Zf" = ( @@ -6487,7 +6487,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6514,14 +6514,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "Zz" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) "ZZ" = ( @@ -6531,7 +6531,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 7b90f38797a..123f4959e96 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -2083,7 +2083,7 @@ /area/awaymission/snowdin/outside) "gc" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -2379,14 +2379,14 @@ "gU" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -2611,7 +2611,7 @@ "hF" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -2873,7 +2873,7 @@ max_mobs = 5 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -2883,7 +2883,7 @@ name = "Caleb Reed" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -3594,7 +3594,7 @@ name = "Jacob Ullman" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -6002,7 +6002,7 @@ "qg" = ( /obj/structure/flora/rock/pile/icy, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -7165,7 +7165,7 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear_strong, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -7516,7 +7516,7 @@ /area/awaymission/snowdin/cave) "xl" = ( /turf/open/floor/plating/elevatorshaft{ - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas = "o2=22;n2=82;TEMP=180" }, /area/awaymission/snowdin/cave) "xn" = ( @@ -7688,7 +7688,7 @@ width = 6 }, /turf/open/floor/plating/elevatorshaft{ - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas = "o2=22;n2=82;TEMP=180" }, /area/awaymission/snowdin/cave) "xL" = ( @@ -8481,7 +8481,7 @@ /area/awaymission/snowdin/outside) "AD" = ( /turf/open/floor/plating{ - initial_gas_mix = "o2=22;n2=82;TEMP=180" + initial_gas = "o2=22;n2=82;TEMP=180" }, /area/awaymission/snowdin/outside) "AE" = ( @@ -9404,7 +9404,7 @@ state_open = 1 }, /turf/open/floor/mineral/plastitanium{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; temperature = 180 }, @@ -9416,7 +9416,7 @@ /obj/effect/turf_decal/weather/snow, /obj/machinery/suit_storage_unit/syndicate, /turf/open/floor/mineral/plastitanium{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; temperature = 180 }, @@ -9430,7 +9430,7 @@ state_open = 1 }, /turf/open/floor/mineral/plastitanium{ - initial_gas_mix = "o2=22;n2=82;TEMP=180"; + initial_gas = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; temperature = 180 }, @@ -11157,7 +11157,7 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -11452,7 +11452,7 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear_weak, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) @@ -13465,7 +13465,7 @@ "XP" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_gas = "n2=82;plasma=24;TEMP=120"; temperature = 120 }, /area/awaymission/snowdin/cave/cavern) diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index ebf98cfda57..1f0f9c58969 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -29,7 +29,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -827,7 +827,7 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -4187,7 +4187,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11484,7 +11484,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11492,7 +11492,7 @@ "zq" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11522,7 +11522,7 @@ /obj/structure/bed/nest, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11531,7 +11531,7 @@ /obj/effect/decal/cleanable/blood/gibs/up, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11566,7 +11566,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11598,7 +11598,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11618,7 +11618,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11629,7 +11629,7 @@ /obj/effect/decal/cleanable/blood/gibs/down, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11638,7 +11638,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11656,7 +11656,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11702,7 +11702,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11723,7 +11723,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -11787,7 +11787,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11798,7 +11798,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11816,7 +11816,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11825,7 +11825,7 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11862,7 +11862,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11892,7 +11892,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11932,7 +11932,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11941,7 +11941,7 @@ /obj/structure/closet/crate, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11958,7 +11958,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11968,7 +11968,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -11976,7 +11976,7 @@ "Lz" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 351.9 }, @@ -11991,7 +11991,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12014,7 +12014,7 @@ /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12023,7 +12023,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12032,7 +12032,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12041,7 +12041,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12086,7 +12086,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12095,7 +12095,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12127,7 +12127,7 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -12191,7 +12191,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12226,7 +12226,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12256,7 +12256,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12268,7 +12268,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12284,7 +12284,7 @@ /obj/structure/alien/resin/membrane, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12301,7 +12301,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12311,7 +12311,7 @@ /obj/effect/decal/cleanable/blood/gibs/down, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12323,7 +12323,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -12332,7 +12332,7 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12353,7 +12353,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 351.9 }, @@ -12376,7 +12376,7 @@ /obj/structure/ore_box, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12407,7 +12407,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12418,7 +12418,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12458,7 +12458,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, @@ -12468,7 +12468,7 @@ /obj/effect/decal/cleanable/blood/gibs/core, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; temperature = 363.9 }, diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm index 9a56772f448..ee8a08708c7 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/wildwest.dmm @@ -52,7 +52,7 @@ /area/awaymission/wildwest/vault) "an" = ( /turf/open/floor/cult{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/wildwest/vault) "ao" = ( @@ -131,7 +131,7 @@ "aL" = ( /obj/item/paper/fluff/awaymissions/wildwest/grinder, /turf/open/floor/cult{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/wildwest/vault) "aM" = ( @@ -143,7 +143,7 @@ "aO" = ( /obj/effect/mob_spawn/corpse/human/syndicatecommando, /turf/open/floor/cult{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/awaymission/wildwest/vault) "aP" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ec58427dbd3..65c82e57c34 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -4066,7 +4066,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_gas = "o2=0.01;n2=0.01;TEMP=2.7"; luminosity = 2; temperature = 2.7 }, @@ -4323,7 +4323,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_gas = "o2=0.01;n2=0.01;TEMP=2.7"; luminosity = 2; temperature = 2.7 }, diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm index 61c914cfd8e..d7d11e59677 100644 --- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm +++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm @@ -471,7 +471,7 @@ /area/medical/virology) "bE" = ( /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "bF" = ( @@ -1246,7 +1246,7 @@ dir = 9 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "dP" = ( @@ -2194,7 +2194,7 @@ "gv" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "gw" = ( @@ -4768,7 +4768,7 @@ /area/medical/virology) "nB" = ( /turf/open/misc/dirt/dark{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "nC" = ( @@ -5720,7 +5720,7 @@ dir = 8 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "qq" = ( @@ -5776,7 +5776,7 @@ dir = 6 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "qy" = ( @@ -7268,7 +7268,7 @@ dir = 5 }, /turf/open/misc/dirt/dark{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "ux" = ( @@ -9524,7 +9524,7 @@ dir = 4 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "Bv" = ( @@ -9562,7 +9562,7 @@ "BA" = ( /obj/structure/closet/crate/grave, /turf/open/misc/dirt/dark{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "BB" = ( @@ -13350,7 +13350,7 @@ dir = 10 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "LO" = ( @@ -14362,7 +14362,7 @@ "ON" = ( /obj/structure/closet/crate/grave, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "OO" = ( @@ -17211,7 +17211,7 @@ pixel_y = 32 }, /turf/open/misc/dirt{ - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) "Wt" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 991d082eb75..25d0e048ad4 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -17790,7 +17790,7 @@ "ffP" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating/foam{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/space/nearstation) "ffR" = ( @@ -31103,7 +31103,7 @@ "kiE" = ( /obj/item/book/manual/nuclear, /turf/open/floor/plating/foam{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/space/nearstation) "kiM" = ( @@ -51852,7 +51852,7 @@ /area/security/checkpoint/supply) "rLv" = ( /turf/open/floor/plating/foam{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/space/nearstation) "rLz" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 0684d3dc817..d1a641f467a 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -170,7 +170,7 @@ "aU" = ( /obj/structure/flora/tree/dead, /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "aV" = ( @@ -1540,7 +1540,7 @@ invisibility = 100 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, /area/awaymission/errorroom) @@ -2031,7 +2031,7 @@ /area/centcom/briefing) "hs" = ( /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "ht" = ( @@ -2295,7 +2295,7 @@ /area/tdome/administration) "ik" = ( /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, /area/awaymission/errorroom) @@ -4403,7 +4403,7 @@ pixel_y = 4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "pi" = ( @@ -4667,7 +4667,7 @@ /area/tdome/administration) "qe" = ( /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "qf" = ( @@ -7395,7 +7395,7 @@ "zi" = ( /obj/item/rupee, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, /area/awaymission/errorroom) @@ -7750,7 +7750,7 @@ pixel_y = -4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "Am" = ( @@ -9226,7 +9226,7 @@ dir = 8 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "Hj" = ( @@ -9679,7 +9679,7 @@ /obj/item/flashlight/lantern, /turf/open/misc/ironsand{ color = "#525252"; - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "Kd" = ( @@ -9843,7 +9843,7 @@ pixel_y = -3 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "KU" = ( @@ -10536,7 +10536,7 @@ "NS" = ( /turf/open/misc/ironsand{ color = "#525252"; - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "NU" = ( @@ -10795,7 +10795,7 @@ "OC" = ( /obj/structure/flora/rock/pile, /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "OD" = ( @@ -11022,7 +11022,7 @@ pixel_y = -4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "Pq" = ( @@ -11647,7 +11647,7 @@ /area/centcom/evacuation) "Rt" = ( /turf/open/water{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "Ru" = ( @@ -12585,7 +12585,7 @@ pixel_y = 4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = "o2=22;n2=82;TEMP=293.15" }, /area/centcom/holding) "UM" = ( @@ -12696,7 +12696,7 @@ /obj/structure/flora/rock/pile, /turf/open/misc/ironsand{ color = "#525252"; - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/centcom/holding) "Vg" = ( @@ -14020,7 +14020,7 @@ "ZE" = ( /obj/effect/landmark/error, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, /area/awaymission/errorroom) diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm index 58060d7c320..79b829540f0 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm @@ -35,7 +35,7 @@ "z" = ( /obj/structure/mecha_wreckage/ripley, /turf/open/floor/iron/recharge_floor/asteroid{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/mine/explored) "B" = ( diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 9d1d6a721f8..8cc0f305110 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -79,7 +79,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "ct" = ( @@ -98,7 +98,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "cX" = ( @@ -108,7 +108,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "ec" = ( @@ -170,7 +170,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "gw" = ( @@ -182,7 +182,7 @@ /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "gH" = ( @@ -207,7 +207,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "kv" = ( @@ -282,7 +282,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "mZ" = ( @@ -300,7 +300,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "od" = ( @@ -355,7 +355,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "qp" = ( @@ -366,7 +366,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "qM" = ( @@ -504,7 +504,7 @@ specialfunctions = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "zd" = ( @@ -596,7 +596,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "DQ" = ( @@ -625,7 +625,7 @@ }, /mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "EQ" = ( @@ -640,7 +640,7 @@ }, /mob/living/simple_animal/hostile/syndicate/ranged/smg/space, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "EW" = ( @@ -657,7 +657,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "Fv" = ( @@ -727,7 +727,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "Ko" = ( @@ -739,7 +739,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "KC" = ( @@ -817,7 +817,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "Ov" = ( @@ -839,7 +839,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "TEMP=2.7" + initial_gas = "TEMP=2.7" }, /area/shuttle/caravan/freighter1) "OK" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 260ca72400d..90095876f35 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -34,7 +34,7 @@ }, /obj/machinery/computer/med_data/syndie, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=100;TEMP=80"; + initial_gas = "n2=100;TEMP=80"; temperature = 80 }, /area/shuttle/sbc_starfury) @@ -158,7 +158,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=100;TEMP=80"; + initial_gas = "n2=100;TEMP=80"; temperature = 80 }, /area/shuttle/sbc_starfury) @@ -2054,7 +2054,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark{ - initial_gas_mix = "n2=100;TEMP=80"; + initial_gas = "n2=100;TEMP=80"; temperature = 80 }, /area/shuttle/sbc_starfury) diff --git a/_maps/templates/heretic_sacrifice_template.dmm b/_maps/templates/heretic_sacrifice_template.dmm index 5c58d7d3aa6..c11ea116bc0 100644 --- a/_maps/templates/heretic_sacrifice_template.dmm +++ b/_maps/templates/heretic_sacrifice_template.dmm @@ -25,7 +25,7 @@ "dX" = ( /obj/effect/decal/cleanable/oil, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -63,7 +63,7 @@ "lz" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -106,7 +106,7 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -141,7 +141,7 @@ }, /obj/effect/decal/cleanable/oil, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -153,7 +153,7 @@ "qu" = ( /obj/effect/turf_decal/weather/dirt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -165,7 +165,7 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -178,7 +178,7 @@ "sb" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -188,7 +188,7 @@ dir = 9 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -220,7 +220,7 @@ dir = 4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -262,7 +262,7 @@ /obj/structure/stone_tile/slab, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -294,7 +294,7 @@ /area/heretic_sacrifice/rust) "Bw" = ( /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -351,7 +351,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -378,7 +378,7 @@ }, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -388,7 +388,7 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -402,7 +402,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -440,7 +440,7 @@ "KP" = ( /obj/structure/stone_tile/surrounding_tile, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -476,7 +476,7 @@ "NA" = ( /obj/structure/stone_tile/burnt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -486,7 +486,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -503,7 +503,7 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, @@ -513,7 +513,7 @@ dir = 6 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; + initial_gas = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0; slowdown = 0 }, diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index d678d9885f5..f3b847cab8f 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -66,6 +66,10 @@ SUBSYSTEM_DEF(zas) priority = FIRE_PRIORITY_AIR init_order = INIT_ORDER_AIR flags = SS_POST_FIRE_TIMING + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 0.5 SECONDS + + var/cached_cost = 0 //The variable setting controller var/datum/zas_controller/settings @@ -101,17 +105,8 @@ SUBSYSTEM_DEF(zas) var/tmp/list/processing_zones //Currently processing - var/list/curr_tiles - var/list/curr_defer - var/list/curr_edges - var/list/curr_fire - var/list/curr_hotspot - var/list/curr_zones - var/list/curr_machines - var/list/curr_atoms - - - var/current_process = SSZAS_TILES + var/list/currentrun = list() + var/current_process = SSZAS_PIPENETS var/active_zones = 0 var/next_id = 1 @@ -189,64 +184,270 @@ SUBSYSTEM_DEF(zas) ..(timeofday) /datum/controller/subsystem/zas/fire(resumed = FALSE) + var/timer = TICK_USAGE_REAL if (!resumed) processing_edges = active_edges.Copy() processing_fires = active_fire_zones.Copy() processing_hotspots = active_hotspots.Copy() + // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call + // and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best. + if(length(rebuild_queue) || length(expansion_queue)) + timer = TICK_USAGE_REAL + process_rebuilds() + //This does mean that the apperent rebuild costs fluctuate very quickly, this is just the cost of having them always process, no matter what + if(state != SS_RUNNING) + return + + if(current_process == SSZAS_PIPENETS || !resumed) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_pipenets(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_MACHINES - curr_machines = atmos_machinery if(current_process == SSZAS_MACHINES) - while (curr_machines.len) - var/obj/machinery/atmospherics/current_machine = curr_machines[curr_machines.len] - curr_machines.len-- + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_atmos_machinery(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_TILES + + if(current_process == SSZAS_TILES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_tiles(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_DEFERED_TILES + + if(current_process == SSZAS_DEFERED_TILES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_deferred_tiles(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_EDGES - if(!current_machine) - atmos_machinery -= current_machine - if(current_machine.process_atmos() == PROCESS_KILL) - stop_processing_machine(current_machine) + if(current_process == SSZAS_EDGES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_edges(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_FIRES - if(MC_TICK_CHECK) - return + if(current_process == SSZAS_FIRES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_fires(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_HOTSPOTS - current_process = SSZAS_TILES - curr_tiles = tiles_to_update - if(current_process == SSZAS_TILES || !resumed) - while (curr_tiles.len) - var/turf/T = curr_tiles[curr_tiles.len] - curr_tiles.len-- + if(current_process == SSZAS_HOTSPOTS) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_hotspots(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_ZONES - if (!T) - if (MC_TICK_CHECK) - return + if(current_process == SSZAS_ZONES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_zones(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSZAS_ATOMS + + if(current_process == SSZAS_ATOMS) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_atoms(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + + + current_process = SSZAS_PIPENETS + +/datum/controller/subsystem/zas/proc/process_rebuilds() + //Yes this does mean rebuilding pipenets can freeze up the subsystem forever, but if we're in that situation something else is very wrong + var/list/currentrun = rebuild_queue + while(currentrun.len || length(expansion_queue)) + while(currentrun.len && !length(expansion_queue)) //If we found anything, process that first + var/obj/machinery/atmospherics/remake = currentrun[currentrun.len] + currentrun.len-- + if (!remake) continue + remake.rebuild_pipes() + if (MC_TICK_CHECK) + return - //check if the turf is self-zone-blocked - var/c_airblock - ATMOS_CANPASS_TURF(c_airblock, T, T) - if(c_airblock & ZONE_BLOCKED) - deferred += T - if (MC_TICK_CHECK) - return + var/list/queue = expansion_queue + while(queue.len) + var/list/pack = queue[queue.len] + //We operate directly with the pipeline like this because we can trust any rebuilds to remake it properly + var/datum/pipeline/linepipe = pack[SSAIR_REBUILD_PIPELINE] + var/list/border = pack[SSAIR_REBUILD_QUEUE] + expand_pipeline(linepipe, border) + if(state != SS_RUNNING) //expand_pipeline can fail a tick check, we shouldn't let things get too fucky here + return + + linepipe.building = FALSE + queue.len-- + if (MC_TICK_CHECK) + return + +///Rebuilds a pipeline by expanding outwards, while yielding when sane +/datum/controller/subsystem/zas/proc/expand_pipeline(datum/pipeline/net, list/border) + while(border.len) + var/obj/machinery/atmospherics/borderline = border[border.len] + border.len-- + + var/list/result = borderline.pipeline_expansion(net) + if(!length(result)) + continue + for(var/obj/machinery/atmospherics/considered_device in result) + if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) + considered_device.set_pipenet(net, borderline) + net.add_machinery_member(considered_device) continue + var/obj/machinery/atmospherics/pipe/item = considered_device + if(net.members.Find(item)) + continue + if(item.parent) + var/static/pipenetwarnings = 10 + if(pipenetwarnings > 0) + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") + pipenetwarnings-- + if(pipenetwarnings == 0) + log_mapping("build_pipeline(): further messages about pipenets will be suppressed") - T.update_air_properties() - T.post_update_air_properties() - T.needs_air_update = 0 - #ifdef ZASDBG - T.overlays -= mark - //updated++ - #endif + net.members += item + border += item + + net.air.volume += item.volume + item.parent = net + + if(item.air_temporary) + net.air.merge(item.air_temporary) + item.air_temporary = null + + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/zas/proc/process_pipenets(resumed = FALSE) + if (!resumed) + src.currentrun = networks.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/thing = currentrun[currentrun.len] + currentrun.len-- + if(thing) + thing.process() + else + networks.Remove(thing) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/zas/proc/process_atmos_machinery(resumed = FALSE) + if (!resumed) + src.currentrun = atmos_machinery.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/machinery/M = currentrun[currentrun.len] + currentrun.len-- + if(!M) + atmos_machinery -= M + if(M.process_atmos() == PROCESS_KILL) + stop_processing_machine(M) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/zas/proc/process_tiles(resumed = FALSE) + if(!resumed) + src.currentrun = tiles_to_update.Copy() + + var/list/currentrun = src.currentrun + while (currentrun.len) + var/turf/T = currentrun[currentrun.len] + currentrun.len-- + + if (!T) + if (MC_TICK_CHECK) + return + continue + //check if the turf is self-zone-blocked + var/c_airblock + ATMOS_CANPASS_TURF(c_airblock, T, T) + if(c_airblock & ZONE_BLOCKED) + deferred += T if (MC_TICK_CHECK) return + continue + + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + //updated++ + #endif + + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/zas/proc/process_deferred_tiles(resumed) + if(!resumed) + src.currentrun = deferred.Copy() + var/list/currentrun = src.currentrun - current_process = SSZAS_DEFERED_TILES - curr_defer = deferred if(current_process == SSZAS_DEFERED_TILES) - while (curr_defer.len) - var/turf/T = curr_defer[curr_defer.len] - curr_defer.len-- + while (currentrun.len) + var/turf/T = currentrun[currentrun.len] + currentrun.len-- T.update_air_properties() T.post_update_air_properties() @@ -259,12 +460,15 @@ SUBSYSTEM_DEF(zas) if (MC_TICK_CHECK) return - current_process = SSZAS_EDGES - curr_edges = processing_edges +/datum/controller/subsystem/zas/proc/process_edges(resumed) + if(!resumed) + src.currentrun = active_edges.Copy() + var/list/currentrun = src.currentrun + if(current_process == SSZAS_EDGES) - while (curr_edges.len) - var/connection_edge/edge = curr_edges[curr_edges.len] - curr_edges.len-- + while (currentrun.len) + var/connection_edge/edge = currentrun[currentrun.len] + currentrun.len-- if (!edge) if (MC_TICK_CHECK) @@ -275,36 +479,45 @@ SUBSYSTEM_DEF(zas) if (MC_TICK_CHECK) return - current_process = SSZAS_FIRES - curr_fire = processing_fires +/datum/controller/subsystem/zas/proc/process_fires(resumed) + if(!resumed) + src.currentrun = active_fire_zones.Copy() + var/list/currentrun = src.currentrun + if(current_process == SSZAS_FIRES) - while (curr_fire.len) - var/zone/Z = curr_fire[curr_fire.len] - curr_fire.len-- + while (currentrun.len) + var/zone/Z = currentrun[currentrun.len] + currentrun.len-- Z.process_fire() if (MC_TICK_CHECK) return - current_process = SSZAS_HOTSPOTS - curr_hotspot = processing_hotspots +/datum/controller/subsystem/zas/proc/process_hotspots(resumed) + if(!resumed) + src.currentrun = active_hotspots.Copy() + var/list/currentrun = src.currentrun + if(current_process == SSZAS_HOTSPOTS) - while (curr_hotspot.len) - var/obj/effect/hotspot/F = curr_hotspot[curr_hotspot.len] - curr_hotspot.len-- + while (currentrun.len) + var/obj/effect/hotspot/F = currentrun[currentrun.len] + currentrun.len-- F.process() if (MC_TICK_CHECK) return - current_process = SSZAS_ZONES - curr_zones = processing_zones +/datum/controller/subsystem/zas/proc/process_zones(resumed) + if(!resumed) + src.currentrun = zones_to_update.Copy() + var/list/currentrun = src.currentrun + if(current_process == SSZAS_ZONES) - while (curr_zones.len) - var/zone/Z = curr_zones[curr_zones.len] - curr_zones.len-- + while (currentrun.len) + var/zone/Z = currentrun[currentrun.len] + currentrun.len-- Z.tick() Z.needs_update = FALSE @@ -312,20 +525,22 @@ SUBSYSTEM_DEF(zas) if (MC_TICK_CHECK) return - current_process = SSZAS_ATOMS - curr_atoms = atom_process +/datum/controller/subsystem/zas/proc/process_atoms(resumed) + if(!resumed) + src.currentrun = atom_process.Copy() + + var/list/currentrun = src.currentrun + if(current_process == SSZAS_ATOMS) - while(curr_atoms.len) - var/atom/talk_to = curr_atoms[curr_atoms.len] - curr_atoms.len-- + while(currentrun.len) + var/atom/talk_to = currentrun[currentrun.len] + currentrun.len-- if(!talk_to) return talk_to.process_exposure() if(MC_TICK_CHECK) return - current_process = SSZAS_MACHINES - /** * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. * @@ -357,7 +572,7 @@ SUBSYSTEM_DEF(zas) // the currentrun list, which is a cache of atmos_machinery. Remove it from that list // as well to prevent processing qdeleted objects in the cache. if(current_process == SSZAS_MACHINES) - curr_machines -= machine + currentrun -= machine /datum/controller/subsystem/zas/proc/add_to_rebuild_queue(obj/machinery/atmospherics/atmos_machine) if(istype(atmos_machine, /obj/machinery/atmospherics) && !atmos_machine.rebuilding) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 001b8ff266d..a300002430b 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -10,7 +10,7 @@ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_MINERAL_WALLS) canSmoothWith = list(SMOOTH_GROUP_MINERAL_WALLS) baseturfs = /turf/open/misc/asteroid/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS opacity = TRUE density = TRUE layer = EDGED_TURF_LAYER @@ -224,7 +224,7 @@ /turf/closed/mineral/random/high_chance/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE mineralSpawnChanceList = list( /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, @@ -249,7 +249,7 @@ /turf/closed/mineral/random/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE mineralChance = 10 @@ -269,7 +269,7 @@ defer_change = TRUE turf_type = /turf/open/misc/asteroid/snow/icemoon baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS weak_turf = TRUE /turf/closed/mineral/random/snow/Change_Ore(ore_type, random = 0) @@ -311,7 +311,7 @@ /turf/closed/mineral/random/labormineral/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE mineralSpawnChanceList = list( /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, @@ -330,7 +330,7 @@ defer_change = TRUE turf_type = /turf/open/misc/asteroid/snow/icemoon baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS defer_change = TRUE mineralSpawnChanceList = list( /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, @@ -385,7 +385,7 @@ /turf/closed/mineral/gold/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE /turf/closed/mineral/silver @@ -395,7 +395,7 @@ /turf/closed/mineral/silver/ice/icemoon turf_type = /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium @@ -428,13 +428,13 @@ /turf/closed/mineral/bscrystal/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE /turf/closed/mineral/volcanic turf_type = /turf/open/misc/asteroid/basalt baseturfs = /turf/open/misc/asteroid/basalt - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS /turf/closed/mineral/volcanic/lava_land_surface turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -450,7 +450,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) baseturfs = /turf/open/misc/ashplanet/wateryrock - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE turf_type = /turf/open/misc/ashplanet/rocky defer_change = TRUE @@ -470,7 +470,7 @@ /turf/closed/mineral/snowmountain/icemoon turf_type = /turf/open/misc/asteroid/snow/icemoon baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/snowmountain/cavern name = "ice cavern rock" @@ -485,7 +485,7 @@ /turf/closed/mineral/snowmountain/cavern/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon turf_type = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS //yoo RED ROCK RED ROCK @@ -606,7 +606,7 @@ /turf/closed/mineral/gibtonite/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = TRUE /turf/closed/mineral/gibtonite/ice @@ -622,14 +622,14 @@ /turf/closed/mineral/gibtonite/ice/icemoon turf_type = /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/strong name = "Very strong rock" desc = "Seems to be stronger than the other rocks in the area. Only a master of mining techniques could destroy this." turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS defer_change = 1 smooth_icon = 'icons/turf/walls/rock_wall.dmi' base_icon_state = "rock_wall" diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 5f12102a624..3a7e3da9931 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -1,7 +1,7 @@ /turf/open plane = FLOOR_PLANE var/slowdown = 0 //negative for faster, positive for slower - + initial_gas = OPENTURF_DEFAULT_ATMOS var/footstep = null var/barefootstep = null var/clawfootstep = null @@ -97,7 +97,7 @@ icon = 'icons/turf/floors.dmi' icon_state = "necro1" baseturfs = /turf/open/indestructible/necropolis - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS footstep = FOOTSTEP_LAVA barefootstep = FOOTSTEP_LAVA clawfootstep = FOOTSTEP_LAVA @@ -110,7 +110,7 @@ icon_state = "necro[rand(2,3)]" /turf/open/indestructible/necropolis/air - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open/indestructible/boss //you put stone tiles on this and use it as a base name = "necropolis floor" @@ -118,15 +118,15 @@ icon_state = "boss" baseturfs = /turf/open/indestructible/boss planetary_atmos = TRUE - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/boss/air - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open/indestructible/hierophant icon = 'icons/turf/floors/hierophant_floor.dmi' planetary_atmos = TRUE - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant smoothing_flags = SMOOTH_CORNERS tiled_dirt = FALSE diff --git a/code/game/turfs/open/ashplanet.dm b/code/game/turfs/open/ashplanet.dm index 920728f1cf9..a83fd860e3f 100644 --- a/code/game/turfs/open/ashplanet.dm +++ b/code/game/turfs/open/ashplanet.dm @@ -7,7 +7,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/misc/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE footstep = FOOTSTEP_SAND diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 0b5cff08629..054f171f03c 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) baseturfs = /turf/open/lava/smooth /turf/open/misc/asteroid/basalt/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/misc/asteroid/basalt/Initialize(mapload) . = ..() @@ -135,17 +135,17 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) ///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground. /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/misc/asteroid/lowpressure - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/misc/asteroid/lowpressure turf_type = /turf/open/misc/asteroid/lowpressure /turf/open/misc/asteroid/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS baseturfs = /turf/open/misc/asteroid/airless turf_type = /turf/open/misc/asteroid/airless @@ -178,11 +178,11 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/icemoon baseturfs = /turf/open/openspace/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS slowdown = 0 /turf/open/lava/plasma/ice_moon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS baseturfs = /turf/open/lava/plasma/ice_moon planetary_atmos = TRUE @@ -190,7 +190,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) name = "icy snow" desc = "Looks colder." baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas_mix = "n2=82;plasma=24;TEMP=120" + initial_gas = "n2=82;plasma=24;TEMP=120" floor_variance = 0 icon_state = "snow-ice" base_icon_state = "snow-ice" @@ -204,7 +204,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS planetary_atmos = TRUE slowdown = 0 @@ -212,10 +212,10 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) return FALSE /turf/open/misc/asteroid/snow/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/misc/asteroid/snow/temperatre - initial_gas_mix = "o2=22;n2=82;TEMP=255.37" + initial_gas = "o2=22;n2=82;TEMP=255.37" //Used in SnowCabin.dm /turf/open/misc/asteroid/snow/snow_cabin @@ -226,5 +226,5 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) planetary_atmos = FALSE /turf/open/misc/asteroid/snow/standard_air - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS planetary_atmos = FALSE diff --git a/code/game/turfs/open/basalt.dm b/code/game/turfs/open/basalt.dm index ce1b547fdcc..fd4f2f327cf 100644 --- a/code/game/turfs/open/basalt.dm +++ b/code/game/turfs/open/basalt.dm @@ -4,7 +4,7 @@ desc = "Rough volcanic floor that can be dug up for basalt." icon = 'icons/turf/floors.dmi' icon_state = "basalt" - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE /turf/open/misc/basalt/Initialize(mapload) . = ..() diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 7fbc2a0e82d..693a5965a68 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -77,7 +77,7 @@ // Chasms for Lavaland, with planetary atmos and lava glow /turf/open/chasm/lavaland - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/chasm/lavaland light_range = 1.9 //slightly less range than lava @@ -89,7 +89,7 @@ icon = 'icons/turf/floors/icechasms.dmi' icon_state = "icechasms-255" base_icon_state = "icechasms" - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/chasm/icemoon light_range = 1.9 @@ -101,7 +101,7 @@ icon = 'icons/turf/floors/junglechasm.dmi' icon_state = "junglechasm-255" base_icon_state = "junglechasm" - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE planetary_atmos = TRUE baseturfs = /turf/open/chasm/jungle diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 9757cceb226..b0f342ff46d 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -72,7 +72,7 @@ temperature = 180 /turf/open/floor/wood/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/wood/tile icon_state = "wood_tile" @@ -353,34 +353,34 @@ //*****Airless versions of all of the above.***** /turf/open/floor/carpet/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/black/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/blue/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/cyan/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/green/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/orange/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/purple/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/red/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/royalblack/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/royalblue/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) @@ -670,91 +670,91 @@ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS) /turf/open/floor/carpet/neon/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/white/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/black/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/red/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/orange/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/yellow/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/lime/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/green/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/teal/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/cyan/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/blue/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/purple/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/violet/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/pink/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/white/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/black/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/red/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/orange/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/yellow/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/lime/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/green/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/teal/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/cyan/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/blue/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/purple/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/violet/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/carpet/neon/simple/pink/nodots/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." diff --git a/code/game/turfs/open/floor/hull.dm b/code/game/turfs/open/floor/hull.dm index de34e3a2d7f..c65e96f6ad6 100644 --- a/code/game/turfs/open/floor/hull.dm +++ b/code/game/turfs/open/floor/hull.dm @@ -3,7 +3,7 @@ name = "exterior hull plating" desc = "Sturdy exterior hull plating that separates you from the uncaring vacuum of space." icon_state = "regular_hull" - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS temperature = TCMB /turf/open/floor/engine/hull/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) //no rcd destroying this flooring diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index af4f1fa0772..af92db181a7 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -27,14 +27,14 @@ /turf/open/floor/iron/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/iron/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS temperature = 80 /turf/open/floor/iron/edge icon_state = "floor_edge" @@ -147,19 +147,19 @@ floor_tile = /obj/item/stack/tile/iron/dark/textured_large /turf/open/floor/iron/dark/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/dark/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/iron/dark/side/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/dark/corner/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/checker/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/white icon_state = "white" @@ -227,19 +227,19 @@ floor_tile = /obj/item/stack/tile/iron/white/textured_large /turf/open/floor/iron/white/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/white/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/iron/white/side/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/white/corner/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/cafeteria/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/recharge_floor icon_state = "recharge_floor" @@ -286,7 +286,7 @@ floor_tile = /obj/item/stack/tile/iron/showroomfloor /turf/open/floor/iron/showroomfloor/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/solarpanel icon_state = "solarpanel" @@ -294,7 +294,7 @@ floor_tile = /obj/item/stack/tile/iron/solarpanel /turf/open/floor/iron/solarpanel/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/freezer @@ -303,7 +303,7 @@ floor_tile = /obj/item/stack/tile/iron/freezer /turf/open/floor/iron/freezer/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/iron/kitchen_coldroom name = "cold room floor" diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index d816680006f..8157fce2dc2 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -77,35 +77,35 @@ return // titanium does not rust /turf/open/floor/mineral/titanium/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/yellow icon_state = "titanium_yellow" floor_tile = /obj/item/stack/tile/mineral/titanium/yellow /turf/open/floor/mineral/titanium/yellow/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/blue icon_state = "titanium_blue" floor_tile = /obj/item/stack/tile/mineral/titanium/blue /turf/open/floor/mineral/titanium/blue/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/white icon_state = "titanium_white" floor_tile = /obj/item/stack/tile/mineral/titanium/white /turf/open/floor/mineral/titanium/white/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/purple icon_state = "titanium_purple" floor_tile = /obj/item/stack/tile/mineral/titanium/purple /turf/open/floor/mineral/titanium/purple/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS // OLD TITANIUM (titanium floor tiles before PR #50454) /turf/open/floor/mineral/titanium/tiled @@ -117,35 +117,35 @@ return list("titanium_dam1_old","titanium_dam2_old","titanium_dam3_old","titanium_dam4_old","titanium_dam5_old") /turf/open/floor/mineral/titanium/tiled/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/tiled/yellow icon_state = "titanium_tiled_yellow" floor_tile = /obj/item/stack/tile/mineral/titanium/tiled/yellow /turf/open/floor/mineral/titanium/tiled/yellow/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/tiled/blue icon_state = "titanium_tiled_blue" floor_tile = /obj/item/stack/tile/mineral/titanium/tiled/blue /turf/open/floor/mineral/titanium/tiled/blue/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/tiled/white icon_state = "titanium_tiled_white" floor_tile = /obj/item/stack/tile/mineral/titanium/tiled/white /turf/open/floor/mineral/titanium/tiled/white/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/titanium/tiled/purple icon_state = "titanium_tiled_purple" floor_tile = /obj/item/stack/tile/mineral/titanium/tiled/purple /turf/open/floor/mineral/titanium/tiled/purple/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS //PLASTITANIUM (syndieshuttle) /turf/open/floor/mineral/plastitanium @@ -161,14 +161,14 @@ return // plastitanium does not rust /turf/open/floor/mineral/plastitanium/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/mineral/plastitanium/red icon_state = "plastitanium_red" floor_tile = /obj/item/stack/tile/mineral/plastitanium/red /turf/open/floor/mineral/plastitanium/red/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS //Used in SnowCabin.dm /turf/open/floor/mineral/plastitanium/red/snow_cabin @@ -221,7 +221,7 @@ sound_cooldown = world.time + 10 /turf/open/floor/mineral/bananium/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS //DIAMOND diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index d92d26dd145..3879144366b 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -34,10 +34,10 @@ on = FALSE /turf/open/floor/circuit/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/circuit/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/circuit/telecomms/mainframe @@ -62,10 +62,10 @@ floor_tile = /obj/item/stack/tile/circuit/green/anim /turf/open/floor/circuit/green/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/circuit/green/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/circuit/green/telecomms/mainframe @@ -87,10 +87,10 @@ floor_tile = /obj/item/stack/tile/circuit/red/anim /turf/open/floor/circuit/red/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/circuit/red/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 /turf/open/floor/pod @@ -157,11 +157,11 @@ /turf/open/floor/bronze/filled/lavaland planetary_atmos = TRUE - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS /turf/open/floor/bronze/filled/icemoon planetary_atmos = TRUE - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/white name = "white floor" @@ -216,7 +216,7 @@ AddElement(/datum/element/rust) /turf/open/floor/plating/plasma - initial_gas_mix = ATMOSTANK_PLASMA + initial_gas = ATMOSTANK_PLASMA /turf/open/floor/plating/plasma/rust/Initialize(mapload) . = ..() @@ -266,4 +266,4 @@ return /turf/open/floor/cult/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index e3e2ba87426..c0b6e9cb9d6 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -1,14 +1,14 @@ /turf/open/floor/plating/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/plating/lowpressure - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/floor/plating/lowpressure /turf/open/floor/plating/icemoon icon_state = "plating" - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/abductor name = "alien floor" @@ -54,10 +54,10 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/plating/snowed/cavern - initial_gas_mix = "n2=82;plasma=24;TEMP=120" + initial_gas = "n2=82;plasma=24;TEMP=120" /turf/open/floor/plating/snowed/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/snowed/smoothed icon = 'icons/turf/floors/snow_turf.dmi' @@ -76,12 +76,12 @@ temperature = 180 /turf/open/floor/plating/snowed/smoothed/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/lavaland_atmos planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS /turf/open/floor/plating/elevatorshaft name = "elevator shaft" diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm index 4b08509ec6c..0b9c2394b3c 100644 --- a/code/game/turfs/open/floor/reinf_floor.dm +++ b/code/game/turfs/open/floor/reinf_floor.dm @@ -19,7 +19,7 @@ . += span_notice("The reinforcement rods are <b>wrenched</b> firmly in place.") /turf/open/floor/engine/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/engine/break_tile() return //unbreakable @@ -100,92 +100,92 @@ /turf/open/floor/engine/n2o article = "an" name = "\improper N2O floor" - initial_gas_mix = ATMOSTANK_NITROUSOXIDE + initial_gas = ATMOSTANK_NITROUSOXIDE /turf/open/floor/engine/co2 name = "\improper CO2 floor" - initial_gas_mix = ATMOSTANK_CO2 + initial_gas = ATMOSTANK_CO2 /turf/open/floor/engine/plasma name = "plasma floor" - initial_gas_mix = ATMOSTANK_PLASMA + initial_gas = ATMOSTANK_PLASMA /turf/open/floor/engine/o2 name = "\improper O2 floor" - initial_gas_mix = ATMOSTANK_OXYGEN + initial_gas = ATMOSTANK_OXYGEN /turf/open/floor/engine/n2 article = "an" name = "\improper N2 floor" - initial_gas_mix = ATMOSTANK_NITROGEN + initial_gas = ATMOSTANK_NITROGEN /*/turf/open/floor/engine/bz name = "\improper BZ floor" - initial_gas_mix = ATMOS_TANK_BZ + initial_gas = ATMOS_TANK_BZ /turf/open/floor/engine/freon name = "\improper Freon floor" - initial_gas_mix = ATMOS_TANK_FREON + initial_gas = ATMOS_TANK_FREON /turf/open/floor/engine/halon name = "\improper Halon floor" - initial_gas_mix = ATMOS_TANK_HALON + initial_gas = ATMOS_TANK_HALON /turf/open/floor/engine/healium name = "\improper Healium floor" - initial_gas_mix = ATMOS_TANK_HEALIUM + initial_gas = ATMOS_TANK_HEALIUM */ /turf/open/floor/engine/h2 article = "an" name = "\improper H2 floor" - initial_gas_mix = ATMOSTANK_HYDROGEN + initial_gas = ATMOSTANK_HYDROGEN /* /turf/open/floor/engine/hypernoblium name = "\improper Hypernoblium floor" - initial_gas_mix = ATMOS_TANK_HYPERNOBLIUM + initial_gas = ATMOS_TANK_HYPERNOBLIUM /turf/open/floor/engine/miasma name = "\improper Miasma floor" - initial_gas_mix = ATMOS_TANK_MIASMA + initial_gas = ATMOS_TANK_MIASMA /turf/open/floor/engine/nitrium name = "\improper nitrium floor" - initial_gas_mix = ATMOS_TANK_NITRIUM + initial_gas = ATMOS_TANK_NITRIUM /turf/open/floor/engine/pluoxium name = "\improper Pluoxium floor" - initial_gas_mix = ATMOS_TANK_PLUOXIUM + initial_gas = ATMOS_TANK_PLUOXIUM /turf/open/floor/engine/proto_nitrate name = "\improper Proto-Nitrate floor" - initial_gas_mix = ATMOS_TANK_PROTO_NITRATE + initial_gas = ATMOS_TANK_PROTO_NITRATE /turf/open/floor/engine/tritium name = "\improper Tritium floor" - initial_gas_mix = ATMOS_TANK_TRITIUM + initial_gas = ATMOS_TANK_TRITIUM /turf/open/floor/engine/h2o article = "an" name = "\improper H2O floor" - initial_gas_mix = ATMOS_TANK_H2O + initial_gas = ATMOS_TANK_H2O /turf/open/floor/engine/zauker name = "\improper Zauker floor" - initial_gas_mix = ATMOS_TANK_ZAUKER + initial_gas = ATMOS_TANK_ZAUKER /turf/open/floor/engine/helium name = "\improper Helium floor" - initial_gas_mix = ATMOS_TANK_HELIUM + initial_gas = ATMOS_TANK_HELIUM /turf/open/floor/engine/antinoblium name = "\improper Antinoblium floor" - initial_gas_mix = ATMOS_TANK_ANTINOBLIUM + initial_gas = ATMOS_TANK_ANTINOBLIUM */ /turf/open/floor/engine/air name = "air floor" - initial_gas_mix = ATMOSTANK_AIRMIX + initial_gas = ATMOSTANK_AIRMIX @@ -217,12 +217,12 @@ QDEL_NULL(realappearance) /turf/open/floor/engine/cult/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/engine/vacuum name = "vacuum floor" - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/floor/engine/telecomms - initial_gas_mix = TCOMMS_ATMOS + initial_gas = TCOMMS_ATMOS temperature = 80 diff --git a/code/game/turfs/open/glass.dm b/code/game/turfs/open/glass.dm index 30af15393c9..cfb6b2a0c4d 100644 --- a/code/game/turfs/open/glass.dm +++ b/code/game/turfs/open/glass.dm @@ -42,7 +42,7 @@ icon_state = "reinf_glass-0" base_icon_state = "reinf_glass" floor_tile = /obj/item/stack/tile/rglass - initial_gas_mix = "ICEMOON_ATMOS" + initial_gas = "ICEMOON_ATMOS" /turf/open/floor/glass/reinforced/setup_broken_states() return list("reinf_glass-damaged1", "reinf_glass-damaged2", "reinf_glass-damaged3") diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index b1ecd34165d..1f65573db01 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -29,4 +29,4 @@ icon = smooth_icon /turf/open/misc/grass/lavaland - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index da29593d3a8..8cd466fcefb 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -34,7 +34,7 @@ /turf/open/misc/ice/icemoon baseturfs = /turf/open/openspace/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS slowdown = 0 /turf/open/misc/ice/icemoon/no_planet_atmos diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 5c82669420f..37c2f2b7815 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -44,7 +44,7 @@ return /turf/open/lava/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/lava/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) if(burn_stuff(arrived)) @@ -233,9 +233,9 @@ canSmoothWith = list(SMOOTH_GROUP_FLOOR_LAVA) /turf/open/lava/smooth/lava_land_surface - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/lava/smooth/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index f2d890b5c63..154e956b95f 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -24,7 +24,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr var/can_build_on = TRUE /turf/open/openspace/airless - initial_gas_mix = AIRLESS_ATMOS + initial_gas = AIRLESS_ATMOS /turf/open/openspace/airless/planetary planetary_atmos = TRUE @@ -166,7 +166,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr /turf/open/openspace/icemoon name = "ice chasm" baseturfs = /turf/open/openspace/icemoon - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS planetary_atmos = TRUE var/replacement_turf = /turf/open/misc/asteroid/snow/icemoon /// Replaces itself with replacement_turf if the turf below this one is in a no ruins allowed area (usually ruins themselves) diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index 6c1ae311ae9..30e7a430020 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -6,7 +6,7 @@ icon_state = "dirt" base_icon_state = "dirt" baseturfs = /turf/open/chasm/jungle - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE planetary_atmos = TRUE footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND @@ -20,7 +20,7 @@ /turf/open/misc/dirt/jungle slowdown = 0.5 - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open/misc/dirt/jungle/dark icon_state = "greenerdirt" @@ -46,7 +46,7 @@ /turf/open/misc/grass/jungle name = "jungle grass" - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/misc/dirt desc = "Greener on the other side." diff --git a/code/game/turfs/open/snow.dm b/code/game/turfs/open/snow.dm index 66d1bfc571a..c1504c049cd 100644 --- a/code/game/turfs/open/snow.dm +++ b/code/game/turfs/open/snow.dm @@ -24,4 +24,4 @@ /turf/open/misc/snow/actually_safe slowdown = 0 planetary_atmos = FALSE - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 02e19e94890..37003cc214d 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -4,7 +4,7 @@ icon = 'icons/turf/floors.dmi' icon_state = "riverwater_motion" baseturfs = /turf/open/chasm/lavaland - initial_gas_mix = OPENTURF_LOW_PRESSURE + initial_gas = OPENTURF_LOW_PRESSURE planetary_atmos = TRUE slowdown = 1 bullet_sizzle = TRUE @@ -17,7 +17,7 @@ heavyfootstep = FOOTSTEP_WATER /turf/open/water/jungle - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open/water/beach planetary_atmos = FALSE @@ -30,4 +30,4 @@ //Same turf, but instead used in the Beach Biodome /turf/open/water/beach/biodome - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index afbe60689b3..09799615bdd 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -5,10 +5,9 @@ /turf var/needs_air_update = 0 var/datum/gas_mixture/air - var/list/initial_gas var/heat_capacity = 1 var/thermal_conductivity = 0.05 - var/list/initial_gas_mix + var/list/initial_gas var/planetary_atmos //Let's just let this exist for now. ///turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) ZASTURF diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 0ea9c9697f9..1d520237b4b 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -481,6 +481,7 @@ return temperature /datum/gas_mixture/proc/total_moles() + update_values() return total_moles /datum/gas_mixture/proc/has_gas(gas_id, required_amount) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 6887aa8ca32..be85db9b29a 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -23,7 +23,7 @@ * approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings * If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that. **/ - var/initial_gas_mix = OPENTURF_DEFAULT_ATMOS + var/initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open //used for spacewind @@ -41,7 +41,7 @@ ///If there is an active hotspot on us store a reference to it here var/obj/effect/hotspot/active_hotspot - /// air will slowly revert to initial_gas_mix + /// air will slowly revert to initial_gas var/planetary_atmos = FALSE /// once our paired turfs are finished with all other shares, do one 100% share /// exists so things like space can ask to take 100% of a tile's gas @@ -59,10 +59,10 @@ air = new air.copy_from_turf(src) if(planetary_atmos) - if(!SSair.planetary[initial_gas_mix]) + if(!SSair.planetary[initial_gas]) var/datum/gas_mixture/immutable/planetary/mix = new - mix.parse_string_immutable(initial_gas_mix) - SSair.planetary[initial_gas_mix] = mix + mix.parse_string_immutable(initial_gas) + SSair.planetary[initial_gas] = mix . = ..() /turf/open/Destroy() @@ -317,7 +317,7 @@ /******************* GROUP HANDLING FINISH *********************************************************************/ if (planetary_atmos) //share our air with the "atmosphere" "above" the turf - var/datum/gas_mixture/planetary_mix = SSair.planetary[initial_gas_mix] + var/datum/gas_mixture/planetary_mix = SSair.planetary[initial_gas] // archive ourself again so we don't accidentally share more gas than we currently have LINDA_CYCLE_ARCHIVE(src) if(our_air.compare(planetary_mix)) @@ -484,7 +484,7 @@ for(var/turf/open/group_member as anything in turf_list) if(group_member.planetary_atmos) //We do this as a hack to try and minimize unneeded excited group spread over planetary turfs - group_member.air.copy_from(SSair.planetary[group_member.initial_gas_mix]) //Comes with a cost of "slower" drains, but it's worth it + group_member.air.copy_from(SSair.planetary[group_member.initial_gas]) //Comes with a cost of "slower" drains, but it's worth it else group_member.air.copy_from(shared_mix) //Otherwise just set the mix to a copy of our equalized mix group_member.update_visuals() diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index c7d96d7c721..7e8146e6a88 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -307,7 +307,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) ///Copies all gas info from the turf into the gas list along with temperature ///Returns: TRUE if we are mutable, FALSE otherwise /datum/gas_mixture/proc/copy_from_turf(turf/model) - parse_gas_string(model.initial_gas_mix) + parse_gas_string(model.initial_gas) //acounts for changes in temperature var/turf/model_parent = model.parent_type diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 551d8ca3596..126a92bd4f7 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -165,7 +165,7 @@ name = "liquid plasma" desc = "A flowing stream of chilled liquid plasma. You probably shouldn't get in." icon_state = "liquidplasma" - initial_gas_mix = "n2=82;plasma=24;TEMP=120" + initial_gas = "n2=82;plasma=24;TEMP=120" baseturfs = /turf/open/lava/plasma light_range = 3 @@ -226,7 +226,7 @@ //mafia specific tame happy plasma (normal atmos, no slowdown) /turf/open/lava/plasma/mafia - initial_gas_mix = OPENTURF_DEFAULT_ATMOS + initial_gas = OPENTURF_DEFAULT_ATMOS baseturfs = /turf/open/lava/plasma/mafia slowdown = 0 diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index a78fb3f85e4..3e10c363752 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -47,7 +47,7 @@ /turf/open/floor/holofloor/plating/burnmix name = "burn-mix floor" - // initial_gas_mix = BURNMIX_ATMOS + // initial_gas = BURNMIX_ATMOS //TODO: cause warcrimes later /turf/open/floor/holofloor/grass gender = PLURAL @@ -167,7 +167,7 @@ tiled_dirt = FALSE /turf/open/floor/holofloor/snow/cold - initial_gas_mix = "nob=7500;TEMP=2.7" + initial_gas = "nob=7500;TEMP=2.7" /turf/open/floor/holofloor/dark icon_state = "darkfull" diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm index e396f872980..af9be4f5989 100644 --- a/code/modules/ruins/icemoonruin_code/hotsprings.dm +++ b/code/modules/ruins/icemoonruin_code/hotsprings.dm @@ -13,7 +13,7 @@ /turf/open/water/cursed_spring baseturfs = /turf/open/water/cursed_spring planetary_atmos = TRUE - initial_gas_mix = ICEMOON_DEFAULT_ATMOS + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/water/cursed_spring/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm index 88a6560770d..cb457ecab3e 100644 --- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm @@ -37,7 +37,7 @@ base_icon_state = "wasteland" baseturfs = /turf/open/misc/asteroid/basalt/wasteland digResult = /obj/item/stack/ore/glass/basalt - initial_gas_mix = LAVALAND_DEFAULT_ATMOS + initial_gas = LAVALAND_DEFAULT_ATMOS slowdown = 0.5 floor_variance = 30 diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index 4a88ca40646..02224722411 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -24,13 +24,13 @@ var/turf/open/to_fill = run_loc_floor_bottom_left //Prep the floor - to_fill.initial_gas_mix = OPENTURF_DEFAULT_ATMOS + to_fill.initial_gas = OPENTURF_DEFAULT_ATMOS to_fill.air = new to_fill.air.copy_from(to_fill.return_air()) lab_rat.breathe() - TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Humans can't get a full breath from the standard initial_gas_mix on a turf") + TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Humans can't get a full breath from the standard initial_gas on a turf") /// Tests to make sure plasmaman can breath from their internal tanks /datum/unit_test/breath_sanity_plasmamen @@ -64,16 +64,16 @@ var/turf/open/to_fill = run_loc_floor_bottom_left //Prep the floor - to_fill.initial_gas_mix = LAVALAND_DEFAULT_ATMOS + to_fill.initial_gas = LAVALAND_DEFAULT_ATMOS to_fill.air = new to_fill.air.copy_from(to_fill.return_air()) lab_rat.breathe() - TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Ashwalkers can't get a full breath from the Lavaland's initial_gas_mix on a turf") + TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Ashwalkers can't get a full breath from the Lavaland's initial_gas on a turf") /datum/unit_test/breath_sanity_ashwalker/Destroy() - //Reset initial_gas_mix to avoid future issues on other tests + //Reset initial_gas to avoid future issues on other tests var/turf/open/to_fill = run_loc_floor_bottom_left - to_fill.initial_gas_mix = OPENTURF_DEFAULT_ATMOS + to_fill.initial_gas = OPENTURF_DEFAULT_ATMOS return ..() From bccff85f2f7ac55f0485126f803eb40df79d3676 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 18 Apr 2022 22:18:45 -0400 Subject: [PATCH 016/200] Space wind tweaks --- code/__DEFINES/atmospherics/temperature.dm | 6 +++- code/controllers/subsystem/zas.dm | 30 +++++++++--------- .../atmospherics/ZAS/ConnectionGroup.dm | 1 + code/modules/atmospherics/ZAS/Turf.dm | 22 +++++++++---- .../master_files/sound/effects/space_wind.ogg | Bin 0 -> 22791 bytes .../sound/effects/space_wind_big.ogg | Bin 0 -> 37047 bytes 6 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 modular_pariah/master_files/sound/effects/space_wind.ogg create mode 100644 modular_pariah/master_files/sound/effects/space_wind_big.ogg diff --git a/code/__DEFINES/atmospherics/temperature.dm b/code/__DEFINES/atmospherics/temperature.dm index d86e844aab9..bac65da5b79 100644 --- a/code/__DEFINES/atmospherics/temperature.dm +++ b/code/__DEFINES/atmospherics/temperature.dm @@ -2,11 +2,15 @@ #define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 #define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 -#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ +/*#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ _atom.temperature = _temp; \ if(_atom.reagents) { \ START_PROCESSING(SSreagents, _atom.reagents); \ } \ + QUEUE_TEMPERATURE_ATOMS(_atom);*/ + +#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ + _atom.temperature = _temp; \ QUEUE_TEMPERATURE_ATOMS(_atom); #define QUEUE_TEMPERATURE_ATOMS(_atoms) \ diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index f3b847cab8f..04e57f1353a 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -144,10 +144,10 @@ SUBSYSTEM_DEF(zas) if(!can_fire) msg += "REBOOTING..." else - msg += "TtU: [length(tiles_to_update)]" - msg += "ZtU: [length(zones_to_update)]" - msg += "AFZ: [length(active_fire_zones)]" - msg += "AH: [length(active_hotspots)]" + msg += "TtU: [length(tiles_to_update)] " + msg += "ZtU: [length(zones_to_update)] " + msg += "AFZ: [length(active_fire_zones)] " + msg += "AH: [length(active_hotspots)] " msg += "AE: [length(active_edges)]" return ..() @@ -407,7 +407,7 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/proc/process_tiles(resumed = FALSE) if(!resumed) - src.currentrun = tiles_to_update.Copy() + src.currentrun = tiles_to_update var/list/currentrun = src.currentrun while (currentrun.len) @@ -441,7 +441,7 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/proc/process_deferred_tiles(resumed) if(!resumed) - src.currentrun = deferred.Copy() + src.currentrun = deferred var/list/currentrun = src.currentrun if(current_process == SSZAS_DEFERED_TILES) @@ -511,7 +511,7 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/proc/process_zones(resumed) if(!resumed) - src.currentrun = zones_to_update.Copy() + src.currentrun = zones_to_update var/list/currentrun = src.currentrun if(current_process == SSZAS_ZONES) @@ -527,19 +527,19 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/proc/process_atoms(resumed) if(!resumed) - src.currentrun = atom_process.Copy() + src.currentrun = atom_process var/list/currentrun = src.currentrun if(current_process == SSZAS_ATOMS) while(currentrun.len) - var/atom/talk_to = currentrun[currentrun.len] - currentrun.len-- - if(!talk_to) - return - talk_to.process_exposure() - if(MC_TICK_CHECK) - return + var/atom/talk_to = currentrun[currentrun.len] + currentrun.len-- + if(!talk_to) + return + talk_to.process_exposure() + if(MC_TICK_CHECK) + return /** * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 66b88abfc1e..fcc71024f78 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -168,6 +168,7 @@ Class Procs: attracted = B.movables() repelled = A.movables() + playsound(pick(connecting_turfs), 'modular_pariah/master_files/sound/effects/space_wind_big.ogg', 100, TRUE, null, pressure_affected = FALSE) flow(attracted, abs(differential), 0) flow(repelled, abs(differential), 1) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 09799615bdd..ecd4a9cf8d6 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -257,14 +257,22 @@ /turf/return_air() RETURN_TYPE(/datum/gas_mixture) //Create gas mixture to hold data for passing - var/datum/gas_mixture/GM = new - - if(initial_gas) - GM.gas = initial_gas.Copy() - GM.temperature = temperature - GM.update_values() + if(zone) + if(!zone.invalid) + SSzas.mark_zone_update(zone) + return zone.air + else + if(!air) + make_air() + c_copy_air() + return air + else + if(!air) + make_air() + return air - return GM +/turf/open/space/return_air() + return air /turf/remove_air(amount as num) var/datum/gas_mixture/GM = return_air() diff --git a/modular_pariah/master_files/sound/effects/space_wind.ogg b/modular_pariah/master_files/sound/effects/space_wind.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3709cdb05575345259e84a219111f6ffd8cdbd38 GIT binary patch literal 22791 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 D;Syu- literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/sound/effects/space_wind_big.ogg b/modular_pariah/master_files/sound/effects/space_wind_big.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6e8934bb6038cee722bccb22b8a07ee62e55d6f6 GIT binary patch literal 37047 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 literal 0 HcmV?d00001 From ab82d9e8d9872168aed18dd01ce704cf9dd2abec Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Mon, 18 Apr 2022 23:41:42 -0400 Subject: [PATCH 017/200] Initial Gas Mixture fixes, Admin Debug Verbs --- _maps/map_files/generic/CentCom.dmm | 8 ++++---- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/modules/admin/admin_verbs.dm | 3 +++ code/modules/atmospherics/ZAS/Diagnostic.dm | 8 ++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index c9a12495dae..c001e9016ce 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -183,7 +183,7 @@ dir = 6 }, /turf/open/floor/catwalk_floor/iron_smooth{ - initial_gas_mix = "TEMP=2.7" + temperature = 2.7 }, /area/syndicate_mothership) "aJ" = ( @@ -11247,7 +11247,7 @@ /obj/structure/railing, /turf/open/floor/iron/stairs/old{ dir = 8; - initial_gas_mix = "TEMP=2.7" + temperature = 2.7 }, /area/syndicate_mothership) "GS" = ( @@ -14270,7 +14270,7 @@ dir = 4 }, /turf/open/floor/catwalk_floor/iron_smooth{ - initial_gas_mix = "TEMP=2.7" + temperature = 2.7 }, /area/syndicate_mothership) "PV" = ( @@ -17503,7 +17503,7 @@ "YG" = ( /obj/structure/railing, /turf/open/floor/catwalk_floor/iron_smooth{ - initial_gas_mix = "TEMP=2.7" + temperature = 2.7 }, /area/syndicate_mothership) "YI" = ( diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 64bea7e4b0f..16f2c26141e 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -203,7 +203,7 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) //OPEN TURF ATMOS /// the default air mix that open turfs spawn -#define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN = MOLES_O2ATMOS, GAS_NITROGEN=MOLES_N2ATMOS) +#define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN=MOLES_N2STANDARD) #define OPENTURF_LOW_PRESSURE list(GAS_OXYGEN = 14, GAS_NITROGEB = 30) //#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" /// -193,15°C telecommunications. also used for xenobiology slime killrooms diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3f04ef1b941..1b7f52bdddc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -196,6 +196,9 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/cmd_admin_toggle_fov, /client/proc/cmd_admin_debug_traitor_objectives, /client/proc/spawn_debug_full_crew, + //ZAS Debug Verbs + /client/proc/Zone_Info, //Right-Click Gas Debug Info + /client/proc/Test_ZAS_Connection, //ZAS Connection Test ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) GLOBAL_PROTECT(admin_verbs_possess) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 785b83078bb..d67fec39512 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -1,14 +1,14 @@ /client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" if(T) - if(istype(T,/turf/simulated) && T:zone) + if(!istype(T,/turf/open/space) && T:zone) //ZASTURF T:zone:dbg_data(src) else - to_chat(mob, "No zone here.") + to_chat(mob, span_admin("ZASDBG:No zone here.")) var/datum/gas_mixture/mix = T.return_air() - to_chat(mob, "[mix.return_pressure()] kPa [mix.temperature]C") + to_chat(mob,span_admin( "ZASDBG_MAIN:[mix.return_pressure()] kPa [mix.temperature]C")) for(var/g in mix.gas) - to_chat(mob, "[g]: [mix.gas[g]]\n") + to_chat(mob, span_admin("ZASDBG_GAS:[g]: [mix.gas[g]]\n")) else if(zone_debug_images) for(var/zone in zone_debug_images) From 3a052cbc257d1b2a474967fc60b3223300dc32f3 Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Tue, 19 Apr 2022 00:09:40 -0400 Subject: [PATCH 018/200] :screm: --- code/game/turfs/turf.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4f680b91b90..1e7179cd9b8 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -99,9 +99,9 @@ GLOBAL_LIST_EMPTY(station_turfs) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 - if(!blocks_air || !simulated) - air = new - air.copy_from(src.return_air()) + // if(!blocks_air || !simulated) + // air = new + // air.copy_from(src.return_air()) // by default, vis_contents is inherited from the turf that was here before vis_contents.Cut() From 2640b9fa7ddf6221297fbe2b6692a275f49ce3be Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 00:10:19 -0400 Subject: [PATCH 019/200] Firedoors should no longer cause zone rebuilds --- code/game/machinery/doors/firedoor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 634aea1d191..8981744bb98 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -663,7 +663,7 @@ if(get_dir(loc, T) == dir) return density ? AIR_BLOCKED : ZONE_BLOCKED else - return AIR_ALLOWED + return ZONE_BLOCKED /obj/machinery/door/firedoor/heavy name = "heavy firelock" From c51eec03ee5d65661837010f44188c47bf08faaa Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 01:05:55 -0400 Subject: [PATCH 020/200] Misc fixes --- code/game/objects/structures/girders.dm | 1 + code/game/objects/structures/grille.dm | 1 + code/game/objects/structures/window.dm | 2 +- code/game/turfs/change_turf.dm | 17 ++++++++++------- code/modules/atmospherics/ZAS/Airflow.dm | 3 ++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 88a9f6edfc8..417c547bbd4 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -6,6 +6,7 @@ density = TRUE max_integrity = 200 rad_insulation = RAD_VERY_LIGHT_INSULATION + can_atmos_pass = CANPASS_ALWAYS var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index fe236a97e8a..026a9f4cbc4 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -10,6 +10,7 @@ density = TRUE anchored = TRUE pass_flags_self = PASSGRILLE + can_atmos_pass = CANPASS_ALWAYS flags_1 = CONDUCT_1 //pressure_resistance = 5*ONE_ATMOSPHERE armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2ee0237f9fb..352d7bed1be 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -324,7 +324,7 @@ /obj/structure/window/Destroy() set_density(FALSE) - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() update_nearby_icons() return ..() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 8a5988300a9..88fb3bd7602 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -82,13 +82,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_bp = blueprint_data blueprint_data = null - if(connections) connections.erase_all() - if(istype(src,/turf/simulated)) - //Yeah, we're just going to rebuild the whole thing. - //Despite this being called a bunch during explosions, - //the zone will only really do heavy lifting once. - var/turf/simulated/S = src - if(S.zone) S.zone.rebuild() + var/list/old_baseturfs = baseturfs var/old_type = type @@ -97,6 +91,15 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) changing_turf = TRUE + + if(connections) connections.erase_all() + if(!istype(src, /turf/open/space)) + //Yeah, we're just going to rebuild the whole thing. + //Despite this being called a bunch during explosions, + //the zone will only really do heavy lifting once. + var/turf/S = src + if(S.zone) S.zone.rebuild() + qdel(src) //Just get the side effects and call Destroy //We do this here so anything that doesn't want to persist can clear itself var/list/old_comp_lookup = comp_lookup?.Copy() diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index a085b95e0ef..3b8ca8a0734 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -55,7 +55,8 @@ Contains helper procs for airflow, handled in /connection_group. if(HAS_TRAIT(src, TRAIT_NOSLIPALL)) return - return prob_slip + + return prob(prob_slip) /atom/movable/proc/check_airflow_movable(n) From 628bd84d60bb67ba2ad67b219b66ddf2b6de4b3c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 12:50:08 -0400 Subject: [PATCH 021/200] Updates c_airblock to check QDELETED --- code/controllers/subsystem/airflow.dm | 2 +- code/game/atoms_movable.dm | 3 ++- code/game/machinery/doors/airlock.dm | 6 +++--- code/game/machinery/doors/door.dm | 7 ++++--- code/game/machinery/doors/firedoor.dm | 2 ++ code/game/machinery/doors/windowdoor.dm | 2 ++ code/game/objects/structures/false_walls.dm | 2 ++ code/game/objects/structures/windoor_assembly.dm | 2 ++ code/game/objects/structures/window.dm | 7 +++++-- code/modules/antagonists/blob/structures/_blob.dm | 4 +++- code/modules/atmospherics/ZAS/Airflow.dm | 4 ++-- code/modules/atmospherics/ZAS/ConnectionGroup.dm | 6 +++++- 12 files changed, 33 insertions(+), 14 deletions(-) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 31407e67fa9..3c0ddf21127 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -92,7 +92,7 @@ SUBSYSTEM_DEF(airflow) if (ismob(target)) var/mob/M = target M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, SSzas.settings.airflow_mob_slowdown) - addtimer(CALLBACK(M, /mob/proc/remove_movespeed_modifier, /datum/movespeed_modifier/atmos_pressure, TRUE)) + addtimer(CALLBACK(M, /mob/proc/remove_movespeed_modifier, /datum/movespeed_modifier/atmos_pressure, TRUE), 3 SECONDS, flags = TIMER_DELETE_ME) if (MC_TICK_CHECK) current.Cut(i) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0579c638246..dd12cd6064d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -116,7 +116,8 @@ //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) if(((can_atmos_pass == CANPASS_DENSITY && density) || can_atmos_pass == CANPASS_NEVER) && isturf(loc)) can_atmos_pass = CANPASS_ALWAYS - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() + loc.handle_atom_del(src) if(opacity) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9e15c38656a..3374f1637ee 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1220,7 +1220,7 @@ filler.set_density(FALSE) //PARIAH STATION EDIT END flags_1 &= ~PREVENT_CLICK_UNDER_1 - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() sleep(1) layer = OPEN_DOOR_LAYER update_icon(ALL, AIRLOCK_OPEN, TRUE) @@ -1270,7 +1270,7 @@ if(multi_tile) filler.density = TRUE //PARIAH STATION EDIT END - //air_update_turf(TRUE, TRUE) + update_nearby_tiles() sleep(1) if(!air_tight) set_density(TRUE) @@ -1279,7 +1279,7 @@ if(multi_tile) filler.density = TRUE //PARIAH STATION EDIT END - //air_update_turf(TRUE, TRUE) + update_nearby_tiles() sleep(4) if(dangerous_close) crush() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 6967aa1e5cf..d2dee6db26c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -49,7 +49,6 @@ . = ..() set_init_door_layer() update_freelook_sight() - //air_update_turf(TRUE, TRUE) register_context() GLOB.airlocks += src spark_system = new /datum/effect_system/spark_spread @@ -108,6 +107,8 @@ return ..() /obj/machinery/door/c_airblock(turf/other) + if(QDELETED(src)) + return AIR_ALLOWED if(block_air_zones) return density ? AIR_BLOCKED : ZONE_BLOCKED return density ? AIR_BLOCKED : AIR_ALLOWED @@ -361,7 +362,7 @@ update_appearance() set_opacity(0) operating = FALSE - update_nearby_tiles(TRUE) + update_nearby_tiles() update_freelook_sight() if(autoclose) autoclose_in(DOOR_CLOSE_WAIT) @@ -391,7 +392,7 @@ if(visible && !glass) set_opacity(1) operating = FALSE - update_nearby_tiles(TRUE) + update_nearby_tiles() update_freelook_sight() if(!can_crush) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 8981744bb98..6260ddfd1fd 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -660,6 +660,8 @@ return COMPONENT_ATOM_BLOCK_EXIT /obj/machinery/door/firedoor/border_only/c_airblock(turf/T, vertical = FALSE) + if(QDELETED(src)) + return AIR_ALLOWED if(get_dir(loc, T) == dir) return density ? AIR_BLOCKED : ZONE_BLOCKED else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ee6f874ec15..a67a5436690 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -175,6 +175,8 @@ return TRUE /obj/machinery/door/window/c_airblock(turf/T, vertical = FALSE) + if(QDELETED(src)) + return AIR_ALLOWED if(get_dir(loc, T) == dir) return density ? AIR_BLOCKED : ZONE_BLOCKED else diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 27ecc8d49a4..c05e9838c0d 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -59,6 +59,8 @@ update_nearby_tiles(TRUE) /obj/structure/falsewall/c_airblock(turf/other) + if(QDELETED(src)) + return AIR_ALLOWED return density ? ZONE_BLOCKED : AIR_BLOCKED /obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 027caa35524..a71ddb6ade2 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -71,6 +71,8 @@ return valid_window_location(loc, mover.dir, is_fulltile = FALSE) /obj/structure/windoor_assembly/c_airblock(turf/T, vertical = FALSE) + if(QDELETED(src)) + return AIR_ALLOWED if(get_dir(loc, T) == dir) return density ? AIR_BLOCKED : ZONE_BLOCKED else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 352d7bed1be..514aa9be0b3 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -324,9 +324,10 @@ /obj/structure/window/Destroy() set_density(FALSE) - update_nearby_tiles() update_nearby_icons() - return ..() + can_atmos_pass = CANPASS_ALWAYS //hacky-sacky + update_nearby_tiles() + . = ..() /obj/structure/window/Move() update_nearby_tiles() @@ -336,6 +337,8 @@ move_update_air(T)*/ /obj/structure/window/c_airblock(turf/T, vertical = FALSE) + if(QDELETED(src)) + return AIR_ALLOWED if(!anchored || !density) return ZONE_BLOCKED return (fulltile || dir == get_dir(loc, T)) ? AIR_BLOCKED : ZONE_BLOCKED diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index b5c383f9f66..332c595e7c2 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -99,7 +99,9 @@ return atmosblock /obj/structure/blob/c_airblock(turf/T, vertical = FALSE) - return !atmosblock + if(QDELETED(src)) + return AIR_ALLOWED + return atmosblock ? AIR_BLOCKED : AIR_ALLOWED /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. . = ..() diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 3b8ca8a0734..9f3e413af37 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -19,7 +19,7 @@ Contains helper procs for airflow, handled in /connection_group. if(!body_position == LYING_DOWN) to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") - slip(5, null, GALOSHES_DONT_HELP|SLIDE, 0, TRUE) + Knockdown(5) last_airflow_stun = world.time /mob/living/silicon/airflow_stun() @@ -40,7 +40,7 @@ Contains helper procs for airflow, handled in /connection_group. /mob/proc/slip_chance() return -/mob/living/carbon/human/slip_chance(prob_slip = 10) +/mob/living/carbon/human/slip_chance(prob_slip = 50) if(stat) return FALSE if(buckled) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index fcc71024f78..c2ddf83d0b7 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -123,6 +123,7 @@ Class Procs: /connection_edge/zone/var/zone/B +/connection_edge/zone/var/last_woosh /connection_edge/zone/New(zone/A, zone/B) @@ -168,7 +169,10 @@ Class Procs: attracted = B.movables() repelled = A.movables() - playsound(pick(connecting_turfs), 'modular_pariah/master_files/sound/effects/space_wind_big.ogg', 100, TRUE, null, pressure_affected = FALSE) + if(REALTIMEOFDAY > last_woosh + 2 SECONDS) + playsound(pick(connecting_turfs), 'modular_pariah/master_files/sound/effects/space_wind_big.ogg', 100, TRUE, null, pressure_affected = FALSE) + last_woosh = REALTIMEOFDAY + flow(attracted, abs(differential), 0) flow(repelled, abs(differential), 1) From 62f333599c1a12632eff85a809f5d819feb2e2a6 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 18:15:49 -0400 Subject: [PATCH 022/200] Fire stuff - spreading is scuffed --- code/controllers/subsystem/zas.dm | 10 +++++----- code/game/objects/items/flamethrower.dm | 7 ++++--- code/modules/atmospherics/ZAS/Fire.dm | 12 ++++++++---- code/modules/atmospherics/ZAS/Turf.dm | 7 +++++++ .../atmospherics/environmental/LINDA_system.dm | 3 ++- .../atmospherics/machinery/portable/canister.dm | 4 +++- 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 04e57f1353a..8c3b0af6f30 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -157,7 +157,7 @@ SUBSYSTEM_DEF(zas) settings = new gas_data = xgm_gas_data - to_chat(world, span_boldannounce("Processing Geometry...")) + to_chat(world, span_boldannounce("ZAS: Processing Geometry...")) var/simulated_turf_count = 0 //for(var/turf/simulated/S) ZASTURF @@ -169,17 +169,17 @@ SUBSYSTEM_DEF(zas) CHECK_TICK - to_chat(world, span_boldannounce("Total Simulated Turfs: [simulated_turf_count]\nTotal Zones: [zones.len]\nTotal Edges: [edges.len]\nTotal Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\nTotal Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) + to_chat(world, span_boldannounce("ZAS: Total Simulated Turfs: [simulated_turf_count]\nTotal Zones: [zones.len]\nTotal Edges: [edges.len]\nTotal Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\nTotal Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) - to_chat(world, span_boldannounce("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_boldannounce("ZAS: Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) if (simulate) - to_chat(world, span_boldannounce("Settling air...")) + to_chat(world, span_boldannounce("ZAS: Firing once...")) starttime = REALTIMEOFDAY fire(FALSE, TRUE) - to_chat(world, span_boldannounce("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_boldannounce("ZAS: Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) ..(timeofday) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 7fb83064e08..d1cb070521e 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -205,7 +205,7 @@ /*var/list/turfs_sharing_with_prev = previousturf.TryGetNonDenseNeighbour() if(!(T in turfs_sharing_with_prev)) break*/ - ignite_turf(src,T) + ignite_turf(T) sleep(1) previousturf = T operating = FALSE @@ -217,7 +217,8 @@ /obj/item/flamethrower/proc/ignite_turf(turf/target, release_amount = 5) //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf - var/datum/gas_mixture/air_transfer = ptank.return_air().remove_ratio(release_amount) + var/datum/gas_mixture/ptank_mix = ptank.return_air() + var/datum/gas_mixture/air_transfer = ptank_mix.remove_ratio(release_amount) //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE new/obj/effect/decal/cleanable/oil(target,air_transfer.get_by_flag(XGM_GAS_FUEL),get_dir(loc,target)) air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) @@ -254,7 +255,7 @@ owner.visible_message(span_danger("\The [attack_text] hits the fuel tank on [owner]'s [name], rupturing it! What a shot!")) var/turf/target_turf = get_turf(owner) log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]") - ignite_turf(src,target_turf, release_amount = 100) + ignite_turf(target_turf, release_amount = 100) qdel(ptank) return 1 //It hit the flamethrower, not them diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 95d2cc6c467..c33d1bbcd29 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -6,7 +6,7 @@ The more pressure, the more boom. If it gains pressure too slowly, it may leak or just rupture instead of exploding. */ -//#define FIREDBG +#define FIREDBG /turf/var/obj/effect/hotspot/fire = null @@ -23,7 +23,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) -/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) +/turf/hotspot_expose(exposed_temperature, exposed_volume, soh) + if(!simulated) + return 0 if(fire_protection > world.time-300) return 0 if(locate(/obj/effect/hotspot) in src) @@ -181,7 +183,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin continue //Spread the fire. - if(prob( 50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier) ) && my_tile.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, my_tile, 0,0)) + var/canpassturf + ATMOS_CANPASS_TURF(canpassturf, my_tile, enemy_tile) + if(prob( 50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier) ) && canpassturf) enemy_tile.create_fire(firelevel) else @@ -447,7 +451,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) //turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) -/turf/proc/adjacent_fire_act(turf/source, exposed_temperature, exposed_volume) +/turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adjt_temp) return //turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) ZASTURF diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index ecd4a9cf8d6..f57d8a69cd5 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -357,3 +357,10 @@ var/turf/T = get_step(src, d) if (T && !turf_contains_dense_objects(T)) return T + +/turf/proc/get_atmos_adjacent_turfs() + var/list/adjacent_turfs = list() + for(var/dir in GLOB.cardinals) + if(open_directions & dir) + adjacent_turfs += get_step(src, dir) + return length(adjacent_turfs) ? adjacent_turfs : null diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 27fa67895fa..298be57fbbd 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -82,6 +82,7 @@ * alldir includes adjacent diagonal tiles that can share * air with both of the related adjacent cardinal tiles **/ +/* /turf/proc/get_atmos_adjacent_turfs(alldir = 0) var/adjacent_turfs if (atmos_adjacent_turfs) @@ -113,7 +114,7 @@ break return adjacent_turfs - +*/ /atom/proc/air_update_turf(update = FALSE, remove = FALSE) var/turf/local_turf = get_turf(loc) if(!local_turf) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index f8149762cf4..4e8c281129b 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -557,11 +557,13 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if((air_contents.temperature > 0) && (pressure_delta > 0)) var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) - transfer_moles = min(transfer_moles, (ATMOS_DEFAULT_VOLUME_PUMP/air_contents.volume)*air_contents.total_moles) //flow rate limit + transfer_moles = min(transfer_moles, (release_pressure/air_contents.volume)*air_contents.total_moles) //flow rate limit pump_gas_passive(air_contents, environment, transfer_moles) //air_update_turf(FALSE, FALSE) + air_contents.react() + var/our_pressure = air_contents.return_pressure() var/our_temperature = air_contents.return_temperature() From b6670ba2858bbbcf71147e0a76bff479d79e300d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 19:27:26 -0400 Subject: [PATCH 023/200] FIRE WOOORKSSSS --- code/game/turfs/open/floor/plating.dm | 1 + code/modules/atmospherics/ZAS/Fire.dm | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 893436ced76..e2dcd57ef4c 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -19,6 +19,7 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + var/attachment_holes = TRUE /turf/open/floor/plating/setup_broken_states() diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index c33d1bbcd29..a4dc7bdf399 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -183,9 +183,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin continue //Spread the fire. - var/canpassturf - ATMOS_CANPASS_TURF(canpassturf, my_tile, enemy_tile) - if(prob( 50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier) ) && canpassturf) + //Atmos Canpass probably needs to be checked here + if(prob(50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier))) enemy_tile.create_fire(firelevel) else From 05a872f4a5f46495d8f8d1955c794e7407dd86c0 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 19:47:10 -0400 Subject: [PATCH 024/200] Returns ZAS wait to 2 seconds (sadness) --- code/controllers/subsystem/zas.dm | 2 +- code/modules/atmospherics/ZAS/Fire.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 8c3b0af6f30..e6d82f1f552 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -67,7 +67,7 @@ SUBSYSTEM_DEF(zas) init_order = INIT_ORDER_AIR flags = SS_POST_FIRE_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - wait = 0.5 SECONDS + wait = 2 SECONDS var/cached_cost = 0 diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index a4dc7bdf399..399d70437d6 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -6,7 +6,7 @@ The more pressure, the more boom. If it gains pressure too slowly, it may leak or just rupture instead of exploding. */ -#define FIREDBG +//#define FIREDBG /turf/var/obj/effect/hotspot/fire = null From 96eb465d05e654fa120353f0a07c125bcab3630d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 19 Apr 2022 21:18:21 -0400 Subject: [PATCH 025/200] Updates SSzas and Fire --- code/controllers/subsystem/zas.dm | 16 ++++++++-------- code/modules/atmospherics/ZAS/Fire.dm | 2 +- .../master_files/icons/effects/fire.dmi | Bin 0 -> 323434 bytes 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 modular_pariah/master_files/icons/effects/fire.dmi diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index e6d82f1f552..8b892468dad 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -211,7 +211,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_MACHINES - if(current_process == SSZAS_MACHINES) + if(current_process == SSZAS_MACHINES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -223,7 +223,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_TILES - if(current_process == SSZAS_TILES) + if(current_process == SSZAS_TILES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -235,7 +235,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_DEFERED_TILES - if(current_process == SSZAS_DEFERED_TILES) + if(current_process == SSZAS_DEFERED_TILES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -247,7 +247,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_EDGES - if(current_process == SSZAS_EDGES) + if(current_process == SSZAS_EDGES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -259,7 +259,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_FIRES - if(current_process == SSZAS_FIRES) + if(current_process == SSZAS_FIRES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -271,7 +271,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_HOTSPOTS - if(current_process == SSZAS_HOTSPOTS) + if(current_process == SSZAS_HOTSPOTS || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -283,7 +283,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_ZONES - if(current_process == SSZAS_ZONES) + if(current_process == SSZAS_ZONES || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -295,7 +295,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_ATOMS - if(current_process == SSZAS_ATOMS) + if(current_process == SSZAS_ATOMS || !resumed) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 399d70437d6..4c6f8ec0e69 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -119,7 +119,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /obj/effect/hotspot anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT - icon = 'icons/effects/fire.dmi' + icon = 'modular_pariah/master_files/icons/effects/fire.dmi' icon_state = "1" layer = GASFIRE_LAYER plane = ABOVE_GAME_PLANE diff --git a/modular_pariah/master_files/icons/effects/fire.dmi b/modular_pariah/master_files/icons/effects/fire.dmi new file mode 100644 index 0000000000000000000000000000000000000000..90e3bb4125991d19ab8a3e249e386a1e378efbe1 GIT binary patch literal 323434 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࿓S54v5HLH$>~t zXajVJL=mAsVOs3+hS@mf(EjW15ftmY{Q24fV5s!hum4_Octg4}kDZNlc$EOV^Lak- z*E&lZEKEVI&D)s(UJ-=oz7quaJ2|Pt#4Ee=9-28KY7%g_a4GW*yi5U5q4vf2;fW(J z3B4l7EPI5R<%{Eswp*J$;TTmy^R?q^)<(YS(v!uZJnj6vJY)!lO9|<oUR-uMpm1Xt zOf{GY^9$41dbjqzE-~WfJ~AVz5CV;c7MG}vYkq$Dwu;XF?PtW8;yazWw|*B<@Vy~( zTK+Sio|dPG2-S?PxMxV??a!BPe7;18a`U@otNzg7E>;Opxur~d_9p)$VF*aOd-1kk zTE(&nLemV@zWfE1lIXe8Pd|up)yCz@m2J56aV%ZWsw6U<7-tF%7z6Q)I2fot@cXI3 za0A|q)SwEIHx}M`2l)(KV8)0ze4v9kc~~mL%F5b3G*l2$0Xe(MmSDxT&Gbl(iMiay z0gcEBMimkMjg#c&<rW2pxJ4|`k*bNH(gK~aKf)F}b#*ZZcX$UIcBuBVm2KCLy?E&o zw)&}KfMDnxU#2qIeuw(F;-$rF65%S`=k9c?H;*22vHK+n?blbH>Ob`0hKT%3G&>NW za{Y%Qck}R5KByL8Oss=g6P=+wxJMOTL{DHmtaU4eq+KXZZ+bGWv^Km5f)4+MMjjNQ zKg&TI*Zv_oU^}q%#)nf2yHTQ`kx8M8qlq{y$y%)B{}jG3>IqO7xY>vWK3P`OJoh2= z*%D!?q7^^j<+3qkFK3Se4<3wG&e0jbD*ctS&dSQl(Q5xjx1!yv9UO!_XDfncpcQs_ z`AID3jIHhcoe%CBR?)T7Fv!%N$}q{5nByrg_z4VrJUyF4tlUP+g+Eb&NVp6cS2_)J z4FTJ=Uz_fD7l=M&E-(1^r;f<T12u*2)y$^b+!O*Nyp$Ks(1F5JFtXQ*P;a{p$BMwP zon68D#F0w=7u%&1AH&9tZU9e$Hxa>yRzdfMclF*1es=rXRVs`hP`XSQbt`G@QirGx zlPe)s8<&GjV!%apXMdVlP&M3DKhgn-77}a+0J-t2F9+NQa{(?A;$L`uAgp|pkwJ|U zhM&xU`>TH3dnsu@vJr4!7?cp(0CqnZitP0Ke1nqvcyj@LWdiG%*1oSNO2AMzt1)N- zvC$BYs~H>1G_tX22ZkXSsdx%UmQeYy4x*a@i;aIkze3mZ6|!s~!niWw?Zes%Z4`O& z_-&US_)E10VzMIcNko}OqxsT3b0+n8#MOP2YfdBVVINyAXBymKy$pc_NEpbHz*t3j z0jT^BPMxDNpHLVOPip+FA3^)x@}tR`C$8a~%JEu!O3_e<f&*XCxxEl3U{dV(#MnVW zDvgqo$#D%>A+Wjc7V%>`?n^B|i?RQK*i=;1ug8zYK?3JVYvjz8Ug+0$n>cjb!T{Rl z;f=Ln+F<4+1fq-*|C`wEM9g*NkJ6j8%jkLXcKvVSmmVWMD=b7aZ+?@k)=2s7R~gE; zkZIaxFPEN`MTe}ax+4^7;S*8GlY}p|3QtvsYj-iNwjz&|2$5_;Rc`Syw%+kT3jGcR z-p%=gTNuJ@o&ZC_!y|m|zpnQ(YI!s4uYUuqd#Rg??1XEOYhGg~%Q4fSn>k;GhW-tz zE@SAHyapw9AH&rSut7w}Sh%~>-1iwFOhph2a`m6Nngdn?5y3zEyi|+H26zM1p#<3g zE1b@&`D$vx<R^H38#{yL6AcXvv`M1pl4Ces=wPqCm<Tb1DQ9%A^C^DsA^gIBHovP{ zGNoi?o3JSQ`kRgQzi!5uzH;vZ$>^_Z(hxT86VNoX)=l5;Tm<1$-@|auc0}RzUpF_8 zZ`c%}$5|zd64~Orrwrtr#eU4}D8gD;SP!k}k$>}A8H`oZ#-Twx_e3KeK81`6_6K6P zQ+A<#2_Z|buyG{rJPiiUGlj$VcWWMJ<I(y(fXH1F?q?}3btYo1Inj1%5DCUvxn_xO ziW%k#kd3&hR@S2Ig$oY!H{lEUKNs1Hm7hO;IG`;9a<8Hf2-~3LLw7gTje2U#Ye$ZF zHCZ<YU>Os91-@Tz9}MRl9vIMo(*~`6&(P2w2int4n_tUcS=ep-8fHMaBuwTAYm@3l z{)BQC1ce~x2cZfl51gItm;5{4sPhCP5DW;!cCG(n-{?cr;~4IxFjjwD>qDYlU^GyK zHvLcU-)B4Q`2?8nezHIU{Ab~z_EKyj{jdW-)`IBWFQlm*A>F_az;>HJ$$HC-K>@b} zYN~<cFL0j@0)HI2s|tQu6uC+J=fP0RMmIhI<sZ_sV4OnhWwiG;4n6T+5$9(!E?{Jo zShk@y+<gn7&;^s$jSc7p2oS8J2<;(Y)P}*q<e|?m$Q<LF)YEYB?!Y<zGZMCylNs*1 z|3J%e8^R0$`(6H%x|sKys<qZXM|i5rxFas<&xCAH-U>Zc#>*`Xw4i6{!oCW|y4{27 z%jRt8XnD8S<65bFlrTE0cjpHVWb^~a*U}7w^eCRjI1mRCH?+#4TF|-x8a<QK9O^xl z{@At&3PQHwfZ8r<7aJS&RbrP#JL2mD>xTYJog7f;S7Bq!-EZycBy13}lRue(BN`%Y z`#9QN<?dX>*QrBdH%fsvm2k~JNjZNOurPdHbw}rIDLZdyW(fDIrPdkIeI0@ykvJQe zP1ubR?%f;3er=u`?U!DjMU$~PZLU>eV0ichnPyD{PV(eN)1=04U~C$hMMP7N=Y-}+ zl%D&0fRi~-3~J2VAV@lTQN6=kb0i{mFoz0DIv{Sb3E;ugGp`>9ofATAqc7sVmJZD? zU&7ssa<%>Pn+)z<Vl4uSxCMBDFRq_ez06w3O!^|)LoAeqJo4^=_?B=&tMihC^=Guq z9ebR@dwKhS1_i2~{iDRTx1cVUHRDj++udb*ALK($BKF@_uW*vh(C}~*9409KM2<$7 znu?0qlbG&<2!4pzR5&bPtFSwxXoqeRPwzveYpCB4gTG4~&$Ek|f<8L^$OMGJ#9N9- zk^!#hRw|aL!j#tD*(scQ{1K!nCHKKzZfWQ1Bt%9SZ9ng}lJ%Dypm~&)uw78{3GO+A zD#!h+@aQ@MXG3Rn*fqZoV$P2$s>+|MgY2lKwZ(yMBGUxB<nrrwtAuG$upl!3Uh~-_ zQzs!&i1R~?>#3jiubj|ZwTFY;Cmbl=-|k!3U;X4&BA?PhK+C)obfuwhuFyI*gWr2) zVZB)?gDz3uH$e-tJWPOgU6okY)bzDSavt_stbcyIIv+t||CR4yJ~65HjQ+-Qdpsg| zLO=buuOSWD$b;ti9j5%Msh*WkyAZ8%VWFk0z@M)qVL&5h{M6lSYu<}S2%`|CWN%l2 zIRt>{PVx1ZL#j&ESoe^uh6i^3cf;===+};H{PTi`lZiuV``Abz;v!KCG=Iw3NAv9( z(mu~NuKov<HRq{UA6EjfuHnf<>)dp&u^N|3co&0?kZS4!&>7|Yke$d^a2{W1*()@C zdt=MRp{!7RGPhTRC!m*FR!Sw;`x%T}2xGH2^h=1%+3*9la5c#WF0jBmI)bz*)2KS| ziU=7&Pi>DB?+>RhpU>4U*(yDx`Gt+i?`j){u^By98>>Ul#+>-9I{S98vJT{rvFP7e zz^dQ>3RDB+`V(cjlfD#Or46A14+Sih%KwaH4{sm*7HA|)O_(MhNlK=5wFw)C?c(BZ z7+_yBTvOq(r*iWydfy8(N5>)W?+>?|G#Q1<^kzr7pgZfC8lf~4#ke0}!F-}8nyE~a zVTbAA=7+D8ru@hzt1<>90g<Z25e+}}@*YzijidXdFF)RQFENp&Nn>&M--3ra5EAWx zlU1b$;SRr+mS(O^)YXd?VP-_T%5voB1lOnILu^U3h8@b;9g6*+gNewB>AAW7$rkI) zrY*!w097@POqDdU!-M`aQj<N+qsZQK8#t#dpOCR!gwO#r<b=>0y26{RWgkD<9)=be zW4-G=yk$@r6IdIWC%GRs-ggB^NFrV}J<$>0q%1B*I*7)uV3*KnA3T4j4y)1=@i|3r zNi-V%0)OH)bW0>%c3!Sry8n}&<2xE>!mED0eJ*J)t{F1tXdf_%7)Rw9?MrTMq43{z zVv!UdE?JAe%aa``t?ZrWO5AS8ANRwAsK9^lIQbkY2x1u>+KB+M=P7Q57)%2q>lm${ z3PB7bH%?jcpJi61*vMRSCa+r3>_rn1b?e#o+}cKZ<WydlsW~w^V<*-fo}qk#$)du5 zjPa@A-Xf=xd*EmF?RD)>*>k<_sj}qslCsq^o-pt)XzS{H+`7fW4>#QL%~y@_$=t}A zl6%FT<8~Q-&@UFRuklrhRygDSoIaMJ;bi9K{kj_KSn>L`biHu#+j0LZ^*{ycqAy>* zY?yj9oF&F0@ONFtAJF4S=a!m886|8)zkhrJWpv8iciZPq4G;17p4V+5d)~)IT<yW! zE-4_n=i|^2Cv#+urEshM0DV;_^(521r>pq?Od|%Q#s}}WIQ{x(_SVo<NIxrLZUO+* zsWl9ja;95XU#WUc{#PYqoZ19)n_rgg^Dise^Fo40DuCSMw=A-;=@<sHdnmUbR#vWs zDHPxD^I(K}bi+P?Lj28PVrD{0^>5wHRd3%_0ro-n1Ay^B`V*_nYMkjcZB>gIpnpR3 zATTD(-GiqA^%7U<ujN-ZGDyR!aaEjkZSUnhc-Hnm>2W@I1neY@9WGzq3LxT@osIfO zN5my?u&*K<#P#CE_fz(2pB;;9zAiA{AtLV}F~WZ#f<4ygl$y`8+K_!*m0lZ=8!ah{ zCr67-FkpNbYmvJHs|D%I$zvrar8hgw%+2u_#?)xrLV`|oM>aOv&{p78rt^8!Iu7y* z&Oj;uX`k#nk1z(HP`R0t$z(@t_ynF!&(+8bN&_`rMY70Va(o7aKbI{iNstHcViQ^) zYkm~;UbDI2>NDmw=JVQnb?OwBzdqZai+e&x;EKGBKmJyFIXaVsj`m9oD{7pAMXybu zfKRf3F6?2wK;-E?+!?k2HEC?h*G&T3xqbBYqZfm|&CYiB_0ip^4*~WHsz{O}{GLA~ zI_?Lyqot&Z<n)Za(rA4N4#vT5EDx09T5Ko18T|a&lHUYaZf4K)t}RQQPV(r7buz{< zuD*lo@Jb7N%TdYATo8|Y$}M*F(&?14Y86sTeEe)L=PKm<I+(+wOygt9W2?k~>r}qj zE>0x#q@?+Y^`*QnZ*-JoUYfk^n7a&-f@UL$<4=0eXmcugbZ1R}#+bm};;zBIzHn_} zq4yjcm2!O#>*bP<>Yd)R*-{o=G_2A(^h<t~rz8NN?~fS`YkmR^A?-JOOQl8ACAfmk zw?~~r_b6Zf`DbSQF$Xf%wDf!2%Vi$%WQAcN=72r_I5W?Ux?7Pz5OH-f{W%)zpd|2t zZ4vx1KEJD*8-m}tG)m=8B>gC<Q)T)6HE%bpFcx}89mw?FgAbMG>0ZORrFt7K5#X%N z=}ld2|F&dCgtP_9R&$j7JlR50-RbZ$FEb<I-rhZ9yh>Aem}?AqAHFU~NJQ-9UcGp- z5m`3hfBeXJ`SQfwSqNZL{lw!<P5Xw1Zeei^vBMqkZ`|eZIfyDt*tiIt2HpU~br5F4 zZg#5tH*kjlRm4tKA#)-x0LliCLE~;N7yi?&09ZK!b(_4vyJK_9e~GlyBms^W7<NS` z@Nq3!y4*^~Afa#+DBjT-&vWkxYIy#LwIUoTaCvDd`IED(={!oNT!cp{aCLQYxq!-I zp^T5y0Z9fjt)qRS^-|KXx+%@3kN*aMTDB$$3d9a81XUqT1?ws&p0z4$vQ5kBTt9(n z6Cc3I7k1)}e_b25P*7pVcRlLtjD(_1I|YsdBOe1gfj=a_=;VY)d2<ot&xa>Q2R{Ay zExqtda{rbHP3E2q`an3XQ3+I*z!rQZ{323TIL*Ld$0;Oe8cRR(zSZPb{oGC{^X&dL z+D$joR!uhZ*s6(k1;6{$-(h|d(&44{4_1g#fRRv^G(j(}^;?dFKU3en#$it}oGZO< zvS|GAr!9@Iv_p|Q`*%{|pB7~gZ~4M262JR1s>H&2UsahmOwlh{SXj(HvlT<t3t$;z zg_Jgpeu~AOD;yF6w&vfes;gypvTbU3$O3Y=RnXhlSK=v_!D#8|L=4{Z-+&z@e+fA~ zSRm*2co{oLV8n6z_z5);kfm_n3bYTQ*O!0h<=9S(PNhEx+o)4c!QwB>+eN^T;oXUr zA+)A^PXK_z1&P!b<O^Ja8X%hEmaYgsT@PAUFTrXeRR_w@N3UM-qq#ceN@7oep`Ga| zTonj(IORVxpUr%8j-?~L!OJB3DDd+j_;EcedjD!C9El%8hRB5Daq)O4iM8Z-8|>EJ z+s!CmkWV7`L&$<Kt7{cXm6?G;b%4k2#8{Huy`1%tTG}Q3fm6^F-N0^jVr`-RQ{6Lr zIpTBaFT1*$Oo~;^_FV=7kO6=Na|Hb1ppI$)Fkx94kkL~+@XdRb|9hpnhJ%6)By5<R zgnw@fZ2D3Hy9434gNc214gnzdX%_*SU_5lJEIHA2Bk5-Jp=&><1G)Ljd@GNWYb`09 zuC`~p5&}LVhAf003DEOU*tF*Ai7~@A_W6wDIV5E%Hk><7LzQh(97SYhaQ~Geai8eu z9r=DUrvmuszxCznL{6xGHFNgro;tOM8?Ic8fzyA5+lgPiC^)j%*U<XKu~?9eF&*NX zoFin%a`hhnqa4}wqw3z?rJSw_+KY#>GaKN!<lQ{mr>SaSX?ahDrf-ole*9`1+(M`9 zBPjIG|5VIyouh}eB!4!CZyzUf1`xbPy4w2>d9dgN8Cv)b!K3O+cQyCGBD$aZAdz!H zya&YE5@;RIIa*xD)Rp&f)F{W}twt?1%WigeL_-3#Az~ZQ(>VZU1B9>_!97RxZ|&t~ zLF4;k1^D+>Z}0N~4qvF|y}#XzID<D;@S*$uIO=<PqV{j3y8h*>dN0m?zVvcD*5X2} zIyPm4BNxt*<RPOnUq6t2J>vT^-1;n%9T9{W88ijH52)A6<-6ANRRfTbgdeo>#Z@0H z{sEHPvO0|XW&kW>V8aRI96h7dEcQw?wWYKDwq;U!^ze=s`zrHEKD+&0Bl#re@hp7X zb%@}G1;JB?eNQt_j6JgOZUDc=fOE65PD4aN?9xy<HU1{hND$MMO2APyXlgNHBi1#R zPeQQlcKFdEz)2F>XxFZB{bN;cEz~5h;m9F5vuAkt4$u<)7du!tVH~d^^<97c`4VAY z_|2?d5)N7s)!<~I6&ejdq_*9)>VibdJ@MimSA@bAJq*0#ObqqTtQ4%K-NVg-&;_~{ zk-MR5m(h*`40C{$fBAK6m-B%X%kGQr?o`2g>A1oNUtr3H0RrSE`j7&RA3zYkV0#@A z#)1?y$PLN!BMlziEyJKY@ndkEv1#&kM4#61>(^CNGPSY2yGS9tnZXiqdU}-y6coZ> zd@343<|V^-bpL+U_~3|0x&c}z1HBlLN{xJuKIg#dYFAo(8f~CiK)|oMeYLrQ6)4ci z5(C}w);CDwC5Ek0igG_*y-J%q)KM<SCk%!5!Nfg+I*rB@@?%$5*KU&sv4sG4p|oK^ zkPpFEUb-YRmWO(dy>jPkr^Z&XD?%@M7z%MyS#-99ffn;O-s>&@K{(*oBgze4zlBO; zobHoYg7dy>ig9{q%%;;SI26v@JnYVzjz)3**Nk~7A7gS#TAHjQ6W8Le-WkRJOM2LO z3;jLgF?I5hEn+}1J>+iGXD~;t6Z|sZn$))+je{VGAks;x1-B?)Wo4IE?^HR{30NAG zHK1tIG_s{Xo{8VLp^@mtz3mF=U7?TJ$JBghg?ukvz52p+WDUja@b>Q{!u*I&j*>~Z z6CQQ~Atyqx5)!x>>Fi6+Ft{94R7^+OM+&!eYMsb|2_i@^|1nmSLSGw+)3s#<`6~#| z#LFks&Y;#iIXU@qlGr065~nw^Yhz*85~XEjqfB*6=YVUl^pHLL1qjg0=G$g$s@f<w zjGn<B@{I(2{)0(dYIstHf~Y)AjtXxZ-S&s{fTP2lh|<vHz0*_-+yoEz#mkq390z&d z*3T_U@pTC;$-hnb)(m`v8g^7<P=!m2dt9l_R11zh=$Hk&@PyCg>N{LMU{G|#k6`PQ z4yr!UY#%?2#uQ4k!J>gDIR=H@%I)T-Rd*r~R7#i~s-LgxYkwW1Qy)G={i~Vql(b(5 zb85D_u;v`;hmIIoF)*Hi>WJ{pD<}v@yf9Q7e;Yb}qju644!G+A0s{{Nl#ZD8kn(48 zWlc;5U=a<_MX3)Y{&Y%G4r5sX0u%re0CV>^Pxtj#(mf$*$4tLyG5cwTJBCz!X_Jo7 zywLB2>W@%^8X3T;fj53{XmC%do_H5lO+eZ~^n5<@RCO#SnS=fPH%3PtpouYfX*{#* zy(H#|x(RvL#!D}s$lGrPs63Xov64ouu6lj8q@`qP{#mSxG5JWw86eEbIrFXn<5`gV z4TKjED?W7w^i3Ft@n%}QGDV&O+VPeeksVr|5;Kl0jX!+qF>L_f$1Xb0N>o9-dN?Ya zXdm3TOr?$<R(W!uitgDYpNF8{A(dl3ecg9%->!8(06o5haY)Q|OTIVE6i$GWw|v5r zx2-p(H5S~^eDM=xdqbHr#1)`Zpx{W~vW%pNi*fIw!-DQKg`st*ouZ7QX1;q>;?k<h z63M#HX!5-(3sq~0?|x%K>WL+x(D#jc@FJ+s65ZI*ri1dAm|VXull}NyS}KBZq|Qs= zg`eroF|)yv9Z1pa5rFYx2o6txRmv1Jp8!GnPK~@}$4-M_4+2mkQ66);>@k6Q6#Lnz z0-%Ax4L`e3Qn&;zpyLp_QzFunWQ_Q5adB}IsP^$iEG(=HOh@59kL>^Ue%WYoHsx{^ z)06j7%B%4H0k*NfmT<#tKM(5-G`b-Oz`XdeAx+@~kh6MhK1bIts5Nro8Ph?N<edW_ zb_xhs9Ew}~4E4;D>6Qskh+V+S)j*#GrtcP}157>+7cLlTxvZv^e__w4p9;w-M|%K~ zF;r_KKVA;wOr}JBh~RXl5|*2H+^4>)7f#?1@Q}ELaX;HmhV^<Pyy<C~0a%!w>*%i_ z>DNovw%&1#Z?O-EEo`NPHQs{SxDuAC$sC)X^40R}(e~&DB+TQtQnjGNi&1gBQg^J< z%i&H;z<0#xNl3h%xmq_x5&EAm24B72!rhK@F`T<Cj^O2ra;b(F1~0Y}Gxm+kK;#y9 z6o5OHGb)&2Uh`drL=hSUZsQGPr5{>{<mEUwp;aOh0-z{ex`!8Hf<KG$;2aF9HxX2` zB5`LPMi7N95D78XU`PT571dzS`1Z>evXNbZ%7z7*nnx_LEt^F9If;PZQS_c)OIm7E zXN5GGx0dkwElXVf_Txt*s7id>sApM&eqgIh^&n9y&L);%;BJHv9m70`QuNel(o0P~ zYJ&6Ty7C<7AE*y*3te#6i+g-4lU)e)Gjt|Me&JL$n3|j%_kl}-pzp47<`j+m9Y1fv zR(o|Hpm!+mwJmKiRG@Mzejfs$sR-G@-Nlbyu*NX&o)R~-UO-9)&RW7#ODik!*zMNJ z7REome;>i{f@=zQBfzQ?ZH*YjXzt#d!1Nir2@*myzN-}xVIQDH!0Qtoi|JD|g7x~` z&{ddqmQryQ5?OF4Odwq$DyX|%6x03j<4MISP(mEP1%l6=#VZ96E!koIusEw)Vp~i9 zSw;SAC%URgIkTHaO-jY`4UsQjyg(FyCDSF&!ub{FjSZAbD9<tZ-?d5IeSX!DNJ2%Z zBnC>xgPomJR1;ZPAknHd0cFX(HvxYSfPf^DHd`JJv?`8!R;WIChDf<-Ro3F%R-vvp zn4qFuY@5w@-+KnIApH@PRp?v-_O1Ba*8WiRF<m~kME~SknL%zrx)JjqevK_QR%YQJ zu^fXK5fA`ZAjA+d|JY0KA$D&2jQ-a;8-H;(qAn6`GaMhw6(swt;YYJ%QZ*>4+bb*E zZ`hO=S^toT7FY|Md5YTrRhSUJEAv<$Hd@NOb^FkfO*e_N9^s+!h&tQkr9a+ZU_?lO zJ_{)yhHU;Ku1UW6u}rMweetK)Apoycd=uVAQ_)>3G6JXMjYF(92<61<bEhB4l_U-n zsjbZz$J|mG>K+&zDXy9~$myji{(<=_`nZey=f@Ew?&`H4m-oA7Q&#QPC+vtINszgR zS<r3Kv>$_GnS0fZ%;0i?iqp=(Oymladv+?BY@k<5FU}ov-U9$t-lISewkSJa{3*xq zvG%zuiDt1&q;!CM=ejZ%(#Ao!6I!s#fQ#6_fb~z0lDm|YEx&I!-(0&KcK8Pt9_I8) zmM3H1I5EQE3qaj;J+Ad%2hzzNz5%@MMtc4O1@pxp`E%YVM7A;D|A{YYx9S!)Uqr|K zngd?Mi!%1K0b!j`!$rK7@qY{slb{9=2~sjm8gp^3#fn@RyBo-y?&-#L2D~Y=E_1#D zJJ?m$&}a!m0|39~K#Tja-@ks1Ait+o1o%tR;4PefLIcwB8o(5i%p#QI#w~2Ookea? z=?dg-HNQ}(g#?-l1S|hr{Qykh@_ajjm<fjl93hqskmhPIDTc8{x8<+bZ&m9vE$u#h z8e2KQALE-1xRN!Ak9eL#;*FWC!Xe4wv9^Y<A{0BkqPP#ZtLhj_HOYq;Y9mZzwOJ@3 zj%p-4NUWVFruv;F7dc_vR#eOq;_R?bxN5c+)mB_!-<kV)7Won$m2#c2bef(v7}*lu zHkv;`TpqSHGDO-4Mlb!R`v_R{iJ<!=2BT6(c@D~E;x$5%B6O>1=yAh`7^*tW)1&W% zh~FxbZZ`*}C(~+fzrW3C_ZZ#B5<E3LlRf+&xH|3rm~qLh7lfY|b}ZYwM)k|P=#~He zuF#bRy#9b7{~#bu%8Bul0sd7!1zBCWbDcC{H(5H1BpR2no}mT)RUIK^A|^o-(hgt~ zEjw9Cgdr>dZA3UCj}a^fw4-KDtjENb6_T8&#@zQL88N^6fIQ2<!_J{V)*9?^gF~Ki z{S_#Gc-S+)!_=_(^=FykHkiTIQ}fd?>Q|6wif%VLvYQb&5r6sfC@Pt$%MUfMw8Ypi zkiS3b(1=l(f?nVqWJjRW)gX~7*o2V?>eoMTz*9*8docz%(NZ~?J!*+tzLhUumMxJm za?Sjt_BQ{ceMf@0kA)1)<DOy6tI1}<w#rAq3(!YmGtD9u@*wMe_(;b-#sRzgk;s+! z{vD&=6T|xawCMAAE#z$Pxdd90RrK#AWJ9sMMd;#z)7uOqv{crw-BQS+jk9uRxY7H* zEyNJGVu6)3inpfL)7Fw|DdRMyF=XpYnm-U}yKf-D`A#rO(&(2Cs2BM9S$^x5G=uGi zH5Yc<NAczk512lGI?<s}?nb6L&F!B7Ad^_rs=qy<>FYN0h@TX=DxsXA4rb^E+X$Ee z2|YKk1~UX1KU~h*Y(AUR{Z^lhTifh64$BdsVz=lveQ1!4gfs*bWsC~OBw$e1QBF1z zhhP!IvwpNE^h9fcmxl02aRm?&AP6`FK~bf%GK~hKsI*k9ohmI45$8Tk()O!vU{Fn6 zE7A0#0V#3mLVtS&ihTq#(Gjr;N)Jrci|cS#lb^tu1yI4>-d??K6GMkwOrma=uPQ49 zD>LGAo6;mNSsC#tBpF3DUU<u<Lq$zRrLV1F;fSVOXC@RH@FQW!Lx3vyLXE*TYHI&I z!624EP(g08$ccNnPkg*Y0d_4ypC?Fil>PpdavhpIZQwb?&Y|Zh2<+E^bV+Te3qFv5 zYEI3Z$9W3F5g}=d>QwJyKm8f@oc26^zcb`lZ4*+nJRGlEhr`^W>kMdv^QA{F6e{Kg zfc7HHSSRcPh(4t<9n&OUYQi&z4U941B=i4ylYU!BSIQV~0Cik7`o0l|4bHMt5>AZ> zof<=zX>bKlZvFr89nhpmDX8V5`o(TOaRpKv<QukFvV4+y7VqNmUNr*Bo0@M+24Pir zL5M^P+~-GCQa^NkRSji4d*q3c^jGnAzD*N_NFc;d0nnf8?Mu`<$PLtig-22#deE3s zocAN~+vHB4#C~k}PrKJJ^0@I8Hy%KGB*sT@jZin_YkI4sVn-mnqwy!Q@fQ5wuD-hh z(2$RQzBU}uajt%JG~>7v+9_LsCPRrGA)f7BBVN!*5fM%{GCAfuNai5*r5pjhViT62 zvh)I%Xzrq7+Z=iUPWU2FEQYyUqzbS&V0d^~Hk`3vgsht9eN83xl-4u_4o=N3o@5Tv zVCG=+x24S2uTMATH9FRgk7sE!7Q9j35Frz`2E)eqDxhtMutDDN!poq)FHdP<`a&;C zoH;H}<OkGs!U({}WNq{RxO(q+touHE_%stLAuB~iMv9P?RiQ{WQL?hqvMQ@6sgQ=5 zvS+A-mh4$}LP*(r&ur&&e6Ra?p4aR5yI<EI_ch`?zu(VzzmNAZf=`Cm+5VTk48s0N zl%=oJU9;v^fhG}u^Ls)?A9s0~t6_}nL&MA({e}T&z&X!)1yGebEE6`-6+-}r=BJuX zT}b-h7cr<Eo|sUD;)40npBpc$Fc8}v+&a*XJnakqsSPww{<(^KEgi>{BUjpeUK2jl z2$T8w@!5=)-w#j=&+*{MkXzA}Exyv7G03SCy!6$b9v&KV?nJ~G5py$GQIVp<l?TIV zY?OtZw7nP4Kl(!V@}l6Sq=tL9-Ede!N08Jsa$tbi%lo*u60BihlYsE`3{OQ~1^px? zC8b=~>dKxjhU)FP)3fE6XBqrqO)$V<h%n4v%w=-^cBW!#@$yDxslN#WI9jwa*NV#n zu=R!BJr@v{o8xR4cFqkwTe3{KiMSRC^x!*dBUmK6((^~AENZUecLEjo&1j#%Cl0>H zh2E!_k6@049O#ezZMK7Xl*)5ounBFPaweJ^8{^qD5u?83)3v24oiBWr^+eoGN0WRh zaCYvay?7^;2cIQ%_03@1LB#rCvCG?BQLuYfk}a?TjzgJO1~8lbgTa5SZwwcy+8bFp z$4yyjOF?>&z&RSt)dJxp4!=DSd5n~)&B2D<7#jc;{z&Ka*>3d#RX5->=r>DZmwtBQ zr?iaJ*FT9nb9SH|0Is$z-KOK*^*_%Sr-uaYae7y)#oMq}C*5V>8C1*TTM}n^6?SvK zB_&U+KmAS|zQ^I~1DD$))K_7kT)zQg0J!vk+9Rrn(CCI(C3d~2w@0~V>2r97$8FBT z$(I#xoc_G5jLaA3|Hf=>Tlvr10)oOZ4RR(l+Qg6pHp~Y7VqSjl?1XdN8hmQ>V}XDF z{24qb8Re%FPKYtlh~h7>CF)8L78>^Y+f+ESae6bpCc(1?xK41&Um!!CJ^`eQzy)ZM z2dR}-+Z!CgDF*p-)U%t&b7L7rl2!R2*Y4fF7K>m5W)<+{T+DBV?e&lA`Sy3<u6S;- z{AO+{>2k~?ru28O&tc8zcU%HtOsNP(_U#*$ear*3U4j31uF3=SS)WDy4#OY`V+DK+ z5c(=W1@zjE6Zc#!d>MfK_1w&ZqxqgsEL}6`%pi>*^4K=^DV9NG#BqhCLngE4zxSE? z1Sis#<=2uFg|;ov=1MQDV#tX09eh!Q&bxu$gP0y_t%T$LqG~-|3Rod#3;4ldZvTuj z7BuA7F)-jPC7m+K!Gj@ai=cA!t3#-LbsmvTE7?(5tO=<moaf*E+RMEE?TX~i8H4Gs z?zCs?^t<gOUe(Ddkcu<C*Dq6SMkcIB?3LEF$y-H)DWV8lAlq`O&-H)5;0g<nC3G`1 zdNW9lVrZ<rJ1{nAvi9_QQ(S*=d@m>~Vf)-6Ke+9D2?h)BUD6rltb7y`9Sxj<ATVuE zlZaQP6p$(}+yt#RtbiQhezD^?Fa)r$VbTD?8$rx?q1xOE3V9qLO&}MlNE1TFIp}3O zWPSoCg<D=6vbpxDU*6LhRjJ@S2a;P1)wQ@QX`pz&E@+3o3%BLtr%zAcZUO^bnOBE( z`PAYx(3ECj9DuD=F>a6kmvS5uSJtC*{^f(ufXk%BW)|-%ldk8_JaG2zLjNWEhC$*K z5DaUke(rm3tw>9w8JTE!--K`&I%wXe;w5XrSpx??p(jJ8nqFjYc_i_*fxF<u;Ml!8 z{BwVxXrT`vF!&p=n(eQSd=b7Qu;Tu~fo|F_^1?{}BWOWk@4KcRwm2BBmdr5kI_<vm zsT8_qy+>mCexYg_FEE{<p*`^D2>g`@N>sELNHLHLt+ZpbOqiQNxgs-Ry}82bFp>GB z<15O&ImIj2xFzJPdKC2mN7A`rXpruF$<Ke&>CDUYY%SDV8}?%I6t01@IZlTFm=SU& zR<(G>XRlg8y8^NeizotXQVs!Ew9(-DpD%Y|X^%+?#tS>13ob81dIiiu&=aZUq1*ie z1(Gw-Z$m;_=nuZMTR~^S9`+I!=tA(O%Q4CdWiO$5)<)9P#IjN$!9F&-1Zg6j1I5M4 zjeFJlSUe{IDWmEZZ-o;!QRlj?PJGsdco4e6I@w|R{h4;)3exppbb84yzRwd3X6y+( z;NPTWFXs?=yuq{LC++uQ@a+sfP@ogCz=?#X!$l%Sju`af#PJY#y_G6Xc^^sdNlSBc zx1G|eiEf-OSU=U(0k)eUo&p28ngL^PP{&seE$1UEGMX2zcf=R%p|xWs<bajHO%M7| ztHLJmpbzvxC}hr&s=kTx)otCfrRqZkllv$8<v&>LX@=kF<vAENH0q_`2Fy}Ah|Y{C zlAhHJurl_+Xscle)#qK@XYs>nAB#YV86<4(+@`xrq@{`hr^F8d)xUvwZu4*8A;B8Z zQj!a~Oa5riFjKXFNMR>0h5sKCp@#qYGlA`Jhb~UzbD`~DW8i=ZR~mWQ&^JG$*IK>T zTSq_WtV}w}1pK~?`>tXX+zgnx(<MpPz7)*p(^8oq$17@nNPXzQ42p7vP}k;JONzL7 zeyX5Lr@?{@-MZUnys6(o;^({R7it@uWTigb)1N8(L}5qiXF~1T3f#&9jn1IZA?vLV zPq3c){ob81Iq;U3SN^cEdVswpPqdJ#TA$5s<dK6~8m+0YHV2rBAPJ!F@JK?5O!O_t zUit1VdCh6N;P{xHjSUpQP}Zz_RqF_CNB2XSIK!dA$=kyF;bTr%nQ&y6lCQ-V+3C4= zz-ll+^R07}H@iP-p+>>32k*Fj+qHM2Q5K8TT)Bfe(2Wl%;YDy3W%vbU;t{1$AX&Xt z`XwlB`ZeJSRt7sCOwV?xXzln3K!9M0-{dcDfQa0<o)q)B>&{NhnbpK2S-(bHJI_Wl ze`%T;Uxh|!Y;y7ef*75mj`5;V`2G0H>&1lyp*3G-1Ny@_FYo!tjQ9J$bMzs@xdPs* zo3DKWwg(P^7yL%_eq;Pjq#=dm{K92$Kp##1t?RfqkdlR|430%iy5eu9Hw=LwZs37S zmIn|lT9%oO)v1e+el<8i_qf>$TH^MtB*}<AE7e}%++_^jiJ3Txt<qF{r7+898p+d0 zaI!!upW;(&%^inTa+(;B2PV>g2B_M(&sTI6J^yKTCgIkJe~U(hcn~iCufXxc93qie zrB1BLO?|_a`o0gOI^nPO!3Q->;m*x`zyZ@R$Q={jQAT{-0679Skr**<_9HB=aSu^2 zBsRVtWWkzn3PZFt>}y$CA`5x-<2%DcW=2OHCe|>@dCYB8m^ATxOZm1ayp9y8Oa9LU z6jZXeWjyHV)Db)T4VP-aUGu-8Id?-d?paKXb#x!jA8<4(Hgm_UmG&jL;rK;_t^)QO z&?A1d&si@Ccy#jotGX0_C7b7rDe?V*Cmc6wF_ug>$4i8J+(C;!F!$kA-NaLlBZ=ZF z#-fy&KqbZG<kB6olapzHiaOuhy=zyMSSh_vt<!E@3i}yRMni#H51t8Cu0jk#5H$(9 z^7{~r?`K}kF?3$vTKvT%=<(y>HtpGc=GkbI>aH4>{G_Rur<N04K8i*~NaYpT?8{-j zn3_9I(04g|_`49`AcSarx4ga0C&!N~8o*l$7A>>OUX5K15ip>0b*9qcGLzvpI?W%c znE*GlV|)heNZAQUqf$<113&eO+`=po%ivK^Js_w_e=+vuPPs4v^aFb}U`K;4$Di(h zT9nM2B8R_o|8ag~%JEA}{}phq-V>c{Mcd?lK)ubTBuu)b*-NV&dbC4T-X!}cZ2ff@ zo~ITQ(t-*chibYV{g`loWQOwoSrZw8v_OZ87x$rB0xal+tDMBNuiD|G@Tqjn{ZR)b zymSr%?#XPl4>CUhVa`JU{<f5Kc}^+R`L#L3?_9x;!?oWfM{U<hBSZ;c<g!rU1;nD6 z2=xh@3~!&fU@Qr$Q?4&u*WjMPuVUf3hN1GxILK9MzY}xqv$MBRQ@Slp??LrHJqpJL z9V4R$_@n^4EpFaq!|qJD{!{n#Ucsk7-bg~-0xUvtWq4mMdoGLkse8Apam%2s&NvsB z5xPwsJv_h{+Dx!$dye3U2X^+z!GpH#rJyDY?0(sr9`Pw<cQe$TEZ;(;+rr@fsNxyJ z&>LvAizjX}JUrb+*<<M?E8CKqhx`c*N-*jV{(IhjrE+7VP)h$Ni)<^V;fI2+IJ4}1 znxb=8_3UA7Eleq29((4x;;{ONlA=31xlFLIbdTVHG3X+obCShUK5Dpt$OML5l*6yt zU7(VplKOWQUTioL7Cdv<&*83wfi4gm2de)3hjfD&V;o-3HOby_7Lq^=hIh~e0~i=7 zIuQC*Z=G6M@}$|7)y9und?bc2G#GeLyqH489)U#d7PPL!8k!wY-|WM*8Ms3vw_gL- z!$;ipRL?Gkj$9RaOd2*TfKkqDk>lhE&V5DRz2{ypPEAbgu<aO{yJRut#;N;VG9TIm zaObObf-^$QM)84q0?|}B`w5Zx`k(JFM&AN@(ntYeSzMvnJ_HPuu-?8YXc>l!n<%4E z@nJA&`_xMb6MIC1d?aBN0O><Tukqy=Bg4aV_zvylHw+9d%}Jeft0Jd*Mb9<>%s~+W zMn93+2&P1@yHkM`g9zp_s2Z>vKwH)`-WGd0#Rs-(-ADnHd+QXZgbejk(Sc56J)jDB z4Oc)=EdusaE^FdfFl=h9$Az!*qg4GL&S!iQqT@$pbY_JiBrmus>A1KXYtpaSFvjHD z{Wsr_USuQj$74Q#Is$>$DA4r3u7gsJL!F?ko<E<llwVMw;8d9A|MXiQ1l5@6{M!Cp z!MpGju!WNn^)$l=EN<B5wDWbnNl!m6#?jo1;q!+*&qGcy?`zprO9k&Q?>Dh^b%$8# zd%%3IK#mCpYyy|s5YE<b55N+|kg)TU?4V;pho-h48N_X?;WO(|AkMG5d_toaXQOj& z&6TrAfe(~*<P1K(DtlfZu0&$*kYIqy<KU0AC;*5kgzT?eVQqe*8;<XS<^zjDT%mp9 zreOzhBtBvGKP@1|pNSTkD`hq}u{p@YeNbJWnJcgY2&mK8uY;;Log1lmha?%OJN1p? z@mOEp#cT!^_}i}+t$%v_+^?(+>^B<=Fl}V3FM0g#>{R1p)-{hz=c?a<g9^N+<Q{4L zayMttc1w2<%soRbe)bLn3>q<8s(`7&#>N!c%qcn49o_V6x=UBDR@B#TC8lzyR3#r; ztqtSJeCTd^UMv3)g%*%ELDom91)z1nNR9B*pnCx5`0$msCvm#|24~*w^W%O8+m{j+ zqVUI{WXxJi#U1h>?jn3ic;<dX`4GrqEAr@3Chr4ZNoqL{NLBY`QA!*Z<Qd{>Mwfx# z!fA*ZHa-JE_5dJ*kKF?{`7s&paAh0Rq`tnssCG(<i%B@iZrp4C`!}qc(63^mgbEZz zEoS+ygSb6Gq3Ho>S&u4vM^!j`*CN>7h2EA28dP@pL$lr$B?^06wNV=j`KSE($ieK7 zT}yu5bB2$ZVCC1@5+p7>3&NFcbv00CFJnmR?&#YGyR(^Z1I+}Xj9?Ee)1La00o^o( zA5W;B;3p`XG=5;^sN107LlJ^z`9IMlyVH+1FCLY~od{q50bJ(b;C*MOZV+hT=ZWOU z#Mq+GpEm)TF%b3xEeAD#`W5w=B-1e0W9j!~#znCDEpA@FE{c`)K^9gUoR8fQ)G)R> zsCGha1C=-11|Hh32=BE%o|>NOCKHVNFqdUcaGP?;tr1lDqz!Qww9W5~wg#PnylV3D zAr;j9Sc~*rxezim8)3bl6JcP7rNsjj6~JK#BNEVRfB`;Z=f@U72P#OFAc)E)`Itax z2J|!s#RDt$I+0=%G07;9!7V}zll)5Ko+dH*QJBW4(cL|uVoA8lY_+NONGr5j1C{CJ zBuia5W8zSEL}hY7KtKXbB*R{k(1X_wiC*DXGl4;@UtvRjUBd8kqIFx3BO$gGczzsa zW*0$+haMFUrG{Ch&z50pAI*A@E%1&V?DJxr-ksb|5$m1s42TkcH?iLan)+stx~JzI zQ;|?%1y46oP+;KG^ZS|g0Ce43P;gn<WUcqRMJB>hVZS}sy2_QR>D8XvkQ@k>?<TNm z%0-7W#igZf#xRo*bRwdcU$CdL<`@5YNrNp}2absZ)Y<AE7=|84=$`4($nBb;)Q&=z z2DzZqN}0|8SVW8#E*n8o$!L}-O&)p>zx}xfn5XMkv524STslW1E+a!28h+Y-;VBAx z5^TKF9@_vj_x*}7m<?HN?{*MV7#tRd?)PN*VIvI0cQf9fNW|W{O3!V8j)m>-)8mR; zPwZQ|p#Rkkc0=(pHt!9r*K;lGG1wF@o^fHiRT~gUM<aXzGHvLsiBzSB+js~}RNyn9 zHR9a_?lAAg%zKMm`=%lPfriaxz%Rg$4?cGbG&e0ZZS@`@ZXf!O00E%6rnjoR3{oi( zz%mmOyQZ>p7in3RUV_4nzULOXNRlxqHiXJm?cr=c(Z}O+u3vc5w)}2xL-z*wVadEa zwoKqLj#!`JI|b(OX5zOcE?L2~WsG4+6*nZuD~#6Hk0$q{XTyuG0Lt(_JNq68aYT}O z)Gd5PlU>gzO}pA>rL$kE^D&RMKF^_4&XXb;(lp1<RlqI;3JD=7x1RR&^d!8H+iJ)V zDT`tM(rk?=avttM>`7P$;Wv6;Lq&ttq9GaZtxpdD%j4fUDu0CIKafY5HHsF=5?n5r zq|lA3zH8XnP{jS@c0yjfDL)%2_9%qYVab^xhh!WA$|&ESkRr_%D5UdH9N7m#IWMZL zkAtcM*_dG#(jTnw%ut&wp@}@p83K3N;O&v1`oq5AI6QJ^m*p`LZv;#53H@p>puVN? zoQCGo#1e!!skcbz{>4TeU8fY3YuD|pW>3YU*5qZQljnC5tT8TuSQU^0iU6cQfLddT z{3eVXD=5!PNtRJWw2T7)LX`E=bJOY|z@%mho?CgqLqQxU#LqLJ(eg3-Cj><Xs^NOv zf1+=T^xhR6qPm4ww=UeG^yN5L|AN1aepiO-!3fgTPh8b_P~K!xuOAD;F))SD<`L3f zOpX1L3=ANSas@<xVlMqSxA>f(+xB)++_1OZ(J8{H1XflUv%qT(I&5<kltzo|w~AJG zfx@cS3p@(z6B8jC5Ed}Bo!jY7|2P<WZruDhk_c3LPM@Pjon_BJXTIis7GP)PlK|3t z<+oEs!zx8wd~X(AiG#H|=z`z9t;IOR5bDAR;o;u;M#y-Hj^9`$<(^N^<ovjfDKP;C zwFTx6gbAoNytH_km_7r`+=VXs)Q+T*83}k0%T~x<Ps&+CXp7v1#%CB^J-{ZwsaSJq z!d1@iSNHpuJ=&7F2+*rLIdSu7=bhE7sFtewjbH!k&0BMb*|cmG`ix624b%`O0GdmA zMXN`vXyIv1WWgjp!5jptko0rH9BsQ3&h<fSAx;Yj0L}&Hw@Q6=gOQS?2r^;eEme8` zdI3%M&ww+V_8%GilLY=3fV8Bxp64+hR|@lC!y&Z@yg~O!8b1-4iC0TJoa5@LO&HSn zKo<>$)ujaJu6I)I<9Pb?DP*OOk&Vj@db4;MK`pp)g%Q1if_m`5lWJ-o;#t*L!I8f# zbN19W>yMYDUOm@JZLuOM1ylhL82zW5C?l-@TU!O#4>$^0CeJ?Nd@C=9^9acZAnj^o z<fBkU?T`<PwCUA#xTO%e<(q@1-(q_a26{_lMH`n%=9gR2?pgg4JR>yYwzgB#EBzLj z*tn*`de(%sk*>go4sZ7HdtQn|1Eu2~hamd47VkmB;!s6m%JK6Z!x6i1jY7~S9V`>L z^^CiBUrv%V=Z#503)M2Usj$93`S&3Bc1xdNkEWwnfKCRsp?;k|%1Tuu9>{|KN;o+D z=SKq+l;$50;zJP`ua6jf*^Ws-d`1QX4D?X>5)ccX2od273+~fh+vi@&&UMpjG+A24 zP`aG>LeXffx@!YWpnRf@CuCXlNf4%iA%)_I1z2pUyN+5UCP*NG!&4^?yb(IiYhpMM zs_A+va{F<6GwLGdlSoDP-L%ahu5rBjpTNjxQa^P{ZiuBW_k-4!mNW;<x4@WF!Egp; z5kRj!JU`%#ri&bp$<4W{2G4YPr$Jl>U2C&;ozWx+J(%PFFAWiHlY1myg3k*&Jw_4z z2_SR=g&Qrw3B8s|o{ydX>-eaCwKVq+em$$=MQfg_iJN`bHwLehly6#ha%8q<{QYGw z*&9)`maIk9pY}`_M%edx1{rd{euaFFa4(1A9n5GDKxhn8&8#kf0igqiJsKAR%(!*y zGJ%RiV?qQvu-z<dHlRB!d0$WTUa2uZ%Z4EaO8)W-{jiz)Zj;k4@`iL^1_<RiO`0dk zS_Tquur>(pEhrsf3g8L{;IIKxs?^~l{jCebj<ze2;5LApjM6BH+G^~<L;!}ehtF_K zd}q;w$g8n;oAQVqCYvA-$|X-*_VX@5pAi*}rVz11BdldooBCvyf5KM)ZQrP8+}&rs zWZb_<!9Hbg4$2tkKGH`8<4FA-$JLI;9<Db7PpbS^B=!SlE7{v%)bE6JBV2D)hwDFa zoM*%7*K!_X!40ekvxCE4T3_fI>g&^Q;Pib0L!Zd^##LGCCn5#U3**9T|Cnz~170~q zsF>4tLv)6dt{6jMetLds$^_btSy8fH!vM}%jPR+DG1s%w+#D*E2oBR58o6@WoP9Lm zROh#v<fhG9*U&%|49>fd9B6;K^A_MzW4ryyb=idZ2{FoVv{%7x^ZWO2M?iuV+h$|L zb)Vfg{dsKUccC{~5nl^YSxkWyuGQ4MY}!2);RL{mW{a>8h(pl5y>)h#TM=65Fr&&L zU)drYn_(~f(oBef@uf?5fx4dxA~=u{RgMNb8_DI@=zT*mv8j+jnD=v`3?MCYnrzy@ zx3TbXDkM+=-_Nj5dj5D$7!07N)EDZZ0%!HYg|GMX7jQK2;$))hYgqR0km6Q8ydz-8 zPngEEn9q9@1l%|<F6;4MJn190Q{f7`?BLWCe%yD(<W320s>UbH+7HVt7d8ZU4QzkL zAd^Fl4fEgl7Q%Gd9AM3Rb=m4AP@3zB=J+${R}d7LdzG8~%MPo(e}1C0Pn`V`pcNwg z6nLMyUGwwR|1U^qH{R}5&VNzfi+NpD>bpQ7hGDJuCuHhfZj7wG*$%f<RR8zYW1#<# zi)QQJ{AGL!R_VQ%@ew9_Fr)|3hL;w}zhREFt?w?twX^Y3wY_91idA?c(h~YBVo{ds zp))pL>t$Ch;YY_O%-SZ!0rTTS5g~SW8Md&01ruejD8=e;Q`fc!f~Jgsp=qCuUuyFE z3r#F4;|fmai&^bgtQJ8d1i@c*SN7Lr*Ju4E*GB!kV(}{?mjw?mxXC-1eEjgi{&3R2 zSFPY)CD{4)j7OEB=_kZS?~!6rQR$qo*$K`Vdf2Z5<wu{T6=A>;dPC}!Dj?ROSnnrT z;_#LNUlBK-&`zYo9~gZvrfmsT@@t2!LTP+X-~v1>0|?RV|7`KzL<lBDaIwQI6*UWp zFpU?E%E>irX!0==e%3IAoMvMUgV7fD;*L#z6CY5b5<HCwibLA|sN&p)qHpn0$BXj8 zfm%kpk8{W{s>>;*giQ+oAFL)T3^2gxRh?PPbLvyuet<|jGQYE&{3`)nMKmnXI{4Wv zR{5i~kfV1grR-KdY!nWv#pt;w6n^;v8#Yx;kAV<XEL(Lvxq8Iv@X~H<%=A+tLPEL^ z{2>${WH`V!dQ}NoVu)q;zkQ}t1O80b>fAchW%>`1^UWXaBEubQ1#%!!LE_#3X9(Nw z?6y#IE4gT+kEaE9nCwZ5pb%r+9zXtsA+=$stg-RAsk_$;nGeY`!mkQy-`<8i|40;n z-YcpamA$&I&3G^%i6B~+;2E$=K7MfkAEx7x=#J?HUVpVC$QA~ALQoN5`T$6#bTxSQ zcg212+91=HP9PcwI?dDKr$eO-sm9N{#8n1F&z_(?3DqV;EwUri8gxxe{2>T9#r#ci zZ{k*2$3(`U>ifs<Z#uA#8O6&4MrvT_E8L!SA+dfuYp=Z5efyUvB`}*uvf-_cO#{92 zW(dmA%+@jC_`uFhD7_yzMVPhSU_S5Q#~vn#{gS?m#Jtt9uuQ)m;^pG2jCt))&W69- z?u&odH8eUZjC%^BK#?6RHn&~Bz%1iZR*z34=MPi)s>)t0(EGspf!+alCB#K%XG-i= zFckz38+Z&ly>iSN&_&mVs%(X(fQUPU5zh7?R9sL=DT6TurhI=Jn63`DbgeY5*L8O8 zR@_*+SP&=~`ZKo!gh!MSb@$y?23<~X7N0tXKM<pMJALXGj2U2xgpSi{<QcuDYi(7P z|2e(ZOmpblPfBtb-X8+8#c^If8q>nJC-GHmWj1b$c)Zx6dC^9ULj}qi5czQ<5kx># zo)zIKiYroW|EvfC_GTQJ%p%W%L6vI62o~2T=tR9M3u6FB9wL_&4zt#OO&?yWOuQ0# z`EYWa2qpR<%OsnfU*tU;?{;T(VDvpIjp+auHYNol1DzcmA(BA$wQpZAIzfVHB)PEV ze}cZz$w{`hpjL3+7vl7zkMD8^EDHq@tw{N1$5diy^VECoA`!?Y?*7B+^oj+-f@HW6 zS!EP61(e3Hae7{Pvk1GfVlzH6y26#NwwK@nhOa&Q_7C_E+Kwt%!)_yz2XL$qqWEpQ z<%=<B148%V7}OtC2BqvT5ANr3aJ#oB4{ioqFr4enhzJYY0}vaWR`NvAy7U5DnuIN# zj$$nPZeNkzasnusZm9glce)H;i(QJbnUBOzxgL|`f+VRm%`fFEzCKvw(ISK#2t1Wh z%jC9Szfy83%;h`nj1)9=tg@8#O`si8Jy~XgO^r_H#=QB33oT{lbjtmz(|bHK{)jE- zEHkobseNL)x}@1I{9(pLr>6D-Z52zFvy&4AsDowUEe@)nwgUaRR}xpwfF4Yvh_Z0E z;;eznP3DaHqP3c$aunu%=p#m&M(k6$g8F{}_(O|;Ht74Q4=9ar&OyyoVj<QI2AB9A zW}#x5qsZwTJjKG?VOSoHVl=vNNx>y%*ipv73+E_~UYyp^u8*GV@qRQY1C;k4;|?no zwf7oDU%n^{vIbjbgXP6B0RH=_+zOKysOT_;=EkUl2Ma{l3e%G#?7d<Ti%`Od3CUvM zUSs5S60W}(EP(PsILb)M7O_M2BTsjYiLd>q%9wNReXV%zS5^#ro1wA%o$lwpo9~F@ z%+UIfm<KihsZf!^v1fnO<KK2j-sy*$AnOhuC?TA|9SsP%bZW6i;hWoMNF0E*T}tKL zz59@yZE$R<7^jg0-Zt(IVrnt(FUpW%=zP!KMbx^|#qLRk)o9B<i0t5M)HH>k1i%T( z-X3fMy>K)oh|hRb4Gq`97&u!I%C7VVfD|YuVK~1q<WtjU4<&YR6(8(4TiAL|{DoRK z>a6fqO#29j=sjQXRjl80SI_ZVIIw5fJ<!wnt@=l5$6>Sy1!qXXGU7`quucL&Q}3VS z9FG4VwzYwqFT45@-r|t0L3fT~5xBFnP<?IfnlA6IND=u)P@hLts?MZMH#qtrF@|-d zivF=0Z;a&9th1T&!)5r?5q>tyh#a$Pv`e&Zx*|oSWuefPG^ke^-bu{UaA&@gdfaFq z`h#LguJ}Ryb*PKrKev}>lZm|F2P4HI?n>19mY$wF;U~K?g~a>2C`C;X)s4;VZz!*@ z)?&UMwsB}L55_OBE4a@LxWL(W)}X8+{Eu6(Lhj*d$#3u7onLV5$^+nXCio3+{eX-_ zjkS1nkL|EJP9?Z9g9fqSh2dXrOMzLY6!N~$Nw!|Lw|^GeHsTuax%}2TB$CH5)eL>) z_g?ML%kokkg|?241KhZcbmL2#Xf`$D;Q%CW+^=%y2ZC7#PoTKQl|zWFA+05RC#w25 zP0N<=fe`ZTUTP2o0w5hNo5G|5*R-X0BtcYx9x%O$;3j~Qg!c~vv5RQ=u+6Nl9DeA# zM;-{47^Ivy8B1rxO#+l2eG9tsPu$?;!EG7=7~?}Rvj0dee)~Bk`Cq`T0TfbV#&9B{ zx#k(&r;w#mM|K!<fq&aONcg^uUUYhHclptiTuh1K@KC|;%mSeNkaM6Oh06UoNC3~7 za3@^FO$rPd$P9rO&A`FV;rmah9id)CGY9yq7g)gmpM|tH*rzNSV#a-88kUGcKbeh0 z1hg%A3MTw-^f(R$Hw@vM-ZupEwO4|IiSpjWu9zfa|He(q4DLO>+PQ)($z}uo0wL;{ zX%pjzgI|>ZNblg!NClV<emgqF;ZPQTm1dSf$5}KiB~q9Hif_Z<0M!u|DKDxR#p1v! zQ*QZevX(4=+Dnp(Ib3%l&c>rTq?^!ORTQlrS{jP<e2;D%QzQf7<i1tHS+-_?Z?yvv zy_gF@{ng3deL3wC2nBA3-psa>3Ckde78)Cdj;fuMJu)b-PKs!w|C;9M;bHOdoXwmx zS5PoBrJ%UO%&yMP&Prs?Vnq=Rx7iACFxLL#w-qF02}T*1rqJ<0@D&I15JYgS&q8JR zKM7b|eEhMUyq*&V+2FpHfEr!2C!z+p*(E`E4`(!SOZZe#^tpVeyvqPVgNTLkGD;bB z1=+U!NBtW_TTac(Zee5;yo<UAjL9v`PLBWJ^qnO66^-}TJ)z=ryS7qOg38G3=!}Un z`T;B2JG9qIp|-+|2!*Hf7UYK@gXx~x!I<A*l@aN%$XtM0Nk{_6=*M=HeHtw)6}*AK z`3r2U2I_kDT)5<_#r9K_)1uVdE;ev<i;>{Cr;AhXwVK#t%V&GSJUDMxUfdHh#%WP! zodG3PpYJwBh?$Qdmj?+uL|qisfPGB!g578U`VM$>8x+0yvBSjB&<`W@fVNvsPVtK5 zjg5_Dvws6l5?n#)1(sqQlHd39M5PO(kHe4wK}*~io;7(u$_rqUSRF%6Vhax9+s*9} z!rU4<EqUh~I_MlGT6GuOQok&*M0a3YQ0g7m(4pN)?+1EP1xxC?7$)icZy-i7r&Zq> zlu#-D?e0~cl=o2MshcW?`n5QO_4*r}EPRBkn_z>+$;NK(?8BZREGID(7pDTzst-IM z`~kfrbo>BHO0Ipre5yX;3473;a`_~^w7mjSsw9GG1~@y^$Y8ruR)SjeOXpsdFYfI1 zwi>5TH^S~uBWUV`B{`gZQxhcCb7GmT#2gR``O{H4OS>wq4x`%h3w?iP5S*%_qNnI% z4~oq<619#ec<EsG+`Y5u(>k)D<0?J1-DeTmhb}AWtiZ?6vKAB~XdRJpg4<%DtvzOs z+TGnGhd#7@z)FJfb|5eOK38HDLgf(Sv7GbWbZ<T6()4klxFSU9MgsB+PC3Mk3#C{b zqRwF&9v2;#(n%_2<B*mQtVnpn%vB5|&=I!!b+WJXfoebq5qj@=rKlo;Dz;(p=%Aj` zu1l|ZXQ!PuINdOi1e4ECv`+~dYun?rz7!7tzz>={H#aqXG*oA1*F$-xbpO+<BuQ=t zYRVOt<`~4-5H=Hp!8Uk3ZoSsmajn7xiy5>eg3e{ri%!sxA6#g@v%B0o|FfzJ=HA-K zsum-2AqW6e?@Khl$)}v&pSUIFc^wWyz3xqKzkQGtx1m3O2u}eGS+74;gdy|-r9g== z&zXT>n3&^fvQUnJ821203x!X%POg)<%KgA2>|XmdW@reY8?ZE<5K@xfsDipm4?e)x zc1Ur_cX3gp_Pao(#jMRhb%E}b=aC=DkbtTwZff$oE8ZL?p)-g9aaZ>UgyNRhF;G!` zFOS;u&mV3A&UsMHC>ej&H%?hi@ZFm?ghS*`S9H4H_(G~)i?w%jlo2NSJ6J-m6uz{Z zc8Ft`V{FTq8Xs3NF^QBM@N=ifS`23S)!giLBC&y^0>dka!MyhUNO7cqQF-az_XC!a zY@2>RW3Hlkv9nYO(I6U~XCBD6D@k4|c+7RAyTPrcwRMOb6^k&O{)Uycsi~=buj-hK zm!~msbVn-rI*m_{vB<w$Y=OxUJ4NlZfZMpUq4{v$-6W_XYi}6?72s}Ii4Xy3@8FyL z0=_mxVhzevAXPK@kp>NY)CW8Ld?m7bIgfo0ly|}&2EZ^=&LFzm*JJ>@k!T742ZW4_ zuTJMLSCDmLmf+w8&Q(|?K<bC^scoDEa9%N|RZu&|zx5s?pBe+(Y`M_tid2k@w82X& z%y(?I0%(DKrp`_Q&<`xv55e(YWd7vZ;g~PL&xi)n^v!p-T0WK08*cyLxy1fcYD7c< z$2|%c_-f%!UEpQes>Uw3!#uR!>BJ;}C`4s~RZMNw(bo2iFT_t7qJ{0VD>r5tmpqHE z#gsmU(Q?A#z4aSkg8)tW*!52lh_AzHqX|7J_Vzzc<R%dll<riebs^AG2@?!7ayWWn zFAFJZnQhL<(4CFtp(PhHzmW^YiyLd~7)rOJgidU6_y{XAPM=otn!ie~Oqj+5S5PIq zVy}))Pfu%sZof`uZcrj&dI4_0n)w#mvbT^UdgA;h<7s^&Ys*D%qyh&g_kmC~z*CcB zabPxClpo0;PvM~a4~3c`ZCwBI+|ZG(uvE+H0cXO#1{90!4X=JyT<>#7lYF{J<A6IN z9NOAAd@|j8liY(7b%(qA@0~n!bfMDAzfiQ{)wTBHF)~3~T@@^L$xHt_t~1D~9#Y@a z&;cz{W*touUaHiqExD$XJLR3Af5x$W`1S^eb`(c9Zs>%%=g!KLz1{&sb+z}&8(rk1 z8*|<p4Wt0~UdDey{r(a<_eK+^YI0IX0#0t=Orxf}3vZWPj@bs%v&Lj>l9RV%<Sy;L z=(!hCpEuvqA#V{fbij=V*K4lfJkvwVCXeO@8oZ<BeKQ7yn9NJ3l9*~RYrY@D+u`SL z#9fMmrqo)Th*7CcLv0Z94OP&c6oh>>KNHSTT3mP;s{{%VTL#`71n+s8`}Iw{y}dgf zK5_w0+oIGzS5)h=lnE>IWk8B#*)R=5I6H2`?jc`CgV41`UYH{@(|<;^P3+Xj$g(%c z(i7;)*U%a^ptvJn#w+StoS!$?$dV6)9=23I=;>p%J~IFFQ){u9L5-m>j@in{xRwb! zvcKLU+GR^{g~z^w<15nTV944m_W0fLZs(pAMR}+0Y}HbxO9`o9)R_eio$=f9aS4dg z*UjDm0`*(&TMinGzQ5h=DhDf4c<Qfji9vqAIrE1Cs9_Gh5f|kex<l9SN`3|mpW6qt zqhc2gV`NSo#6OGK?pto7^KEOsqIRsQ_b0EV$Ar5ES{_SqPquVtm!3mzqdKOOY}mf= zs-eNNxj~i{OgSCltGsngR;0k;KVKE}klo&1DTpzKs%bmDAM0;Q<(DoARm*Q?@2_I8 zASe?Rc%bEA(wFSs{h!twZr}bkL>7(L87^Y=+8{f7czkufc{3cIyPoK%wDZlTtPVvS z&F+{`_br*850dUQ1}uAYc~7ho6P<iM#3wCHO*uD!^1iCDl7$>aF{Em~0r$sgGF1%u zp>2*k`_jK5^1vkluxM75Jmq8X&t%V?J<DEgElxg=*}6)uwHD_I>6*Xl&Q{#&&NbsE zAJZ`8X_eL1&@?hnew&gqNS<6=9fO5x+59)R&e{x={}qFS`_Ync2lBBx3xJSukn-4V zcI`j5IfR2Fo2yX@@-`_ytTV+(^IvAP=bd_ayGW^m#T>ej4rEe%Mx^a0<vk5YV;k6W zADKr8m~m_^+o{s`49w`Q8y#+)q4%MVAgjm7c(-EHc@J*uX>W>-s<Z7`T!qHyU2Rhl z647x+VqDcTw~R2A{TIApaS5G<!6B0M`0_%gcM#x8q96s+HT5pUZigpj88hF#3#TnW zEF}_Co@lvXfu60Fz+oU<tq-n_T*ZupH~crHIacJCb~*X>#f4LOu{oe@CAv94LQyqX zWhep4mDb9XzOQdl-no|?>9CVofE>ks<~mI*+4A)18fB?hS2tM*F0GOEONKJxiN%dg z^&4){Ch!=OqnsuKQrQho&sv`M(nD|iJIl+WBx{gS+U+G@k~qxP*KosOhEP9g^7hx& zoOV;VKK~4@85m{pFGm{kNbxqTksADa@_h9i;Y{tt*u5UH_^+;Xh@8wN9Hx<+F2Yvh zuCA`$G%_;sF=E3{8tZT)6I>b8E5fPp>XHNH&a*H%*`~=tY;6kXCaA4z-e}Uvq9igN zGWj#H|4x-@?`e27zS)WgDs$q7gBJn8!li$ldJ}3Rvye%&E=1h#ezY94&_SzijqFkp z<=(yF9l1IubFzLlpZ#|F`yKSkmYcZ#lDG<{{^q>5dvIdQ=RKD+68KFLLXCq5_ya;h z{_s_w35{~u>mCx#a`I+)2*{*u{?b)X4!S=-SjDFPyll@y32v=h+KZY~!?a&1TrYMp zc(yDj&UpH9K4(=Q+WmLMYyP2%6Rqg<ue`N84Rg1JYyU_bK3pP+Fs6IayZwiDG13xk z>i2A~r$(lUjbeH{M@|FNWYC48_de(%^1JP_o`3LRPTWMwNr%gB@BB#9u&W#pu*K<o zbt8?ZZ);du?IpiB_E73G{b^uH4SMPZe^&%4`}Q1oG;}6a+`|%A2&Mz|u4M)(foh42 zMaQZSg5Gm8uWn^ee`oRo&gVPlmgV!RgUx$}haXkx8yZ&NI+__yeA?Tbrq7tE9C#I+ z`qQEX_w~}sU1tpR5`Vkpw3ka4EuXnLIy^8!)upffDB%%)o>Vr*zu&VVc&#tA3vRc` zF#(Vy55vF5OzKCBNsKkeT&iqyU@-=AKxoOQ;ZZ^bXe?6cu@z!Ei~@liUy<<6k*5-G z*?iB3f&CEt0g3dArwac#Br0`-IZ3wNBL)AO)>1n;(}tlMz1*))OG>-w7Go#P92^q7 z{D|+X^{-XrFH|vF;v6EpkF$)etB>fiPC4b0#bQ5mdLIi;YX8jPy;J#%j-ZzU2jd2E zcj~B^XpT)+XN&xMtW=Pb<APH42ppr%w>T^ue$w~u-;=IupUn@3X$;Z(-Ahk*$T7=| zr4*A;RNQFjvf4P=H?ws8#*nuYuJdHO4W*8wWP*KkB7EQ*Nj|1#AZ7gyd47FP3HHb? zE_26@F%6R1SXG@c)#zAST55o|RVS0`j6PIvhZ7r@zTN*qDvYqx6=W3yQvgKf>2yAI zZ$m*=uWXT`triyyTg;De1s%3ZL7*dor??<$oVdAKuB#om1QtA>I+Ux$)6-%&ex`a} zFx`8ReX8pA$!%4lRj(IT#xkj7HfO}K&_@Rghta3E2)oMd!T=v6C(yopaSVaDXFIuP z5Ot+RCB4;omZq0+rww?nNpd~2;RK{d7#Lx$gkq4hBj(wc=CM<J%#5Wf19wp;u?DK< zPu-rn_?ZNkARWPSHpkL0%+|snX~In&gQMEZ%E`Rq@6Zh4uV3RE&v}-&gX)63$R5Of z*f@)Q-E5d)NLWt%y=JSN*5Y9Q@!aDst1M$<{j^4VjK6|uKK^*?`}lmM<^z*XsM1%1 z-~gqYW&oy!A38Qbm`3OJYTp$Mz^Am{+L#*SK@VpL(0%dCiMX7=Nop;vM4sjEC)@6M zgC~Nu%yz&dKF#&`)*j#`kb$6ah`yAl-m5;i2csddPWNw0&OIU{^S$)O@pz^~7rvG! z`FIrU#)Htjl_^LMG#`0PNSu3$uJpL{+Nof^59ba-GpLr5+~sO-|A=#ju6xKi*SI!O zq-N>g=b|7-nOauUuBA$8V_T`9#p&s1VFmaT2UIBp&d%$nYGs|j^492tB$thXuQG4( zpzPs~J|P`~2dA}CL#kem{5w-rvCcfs^RG!_L(*ponRYGsGYSau5XgI9nrJV%!h>pm zBgsHG?XGfMi@hXQwn!dElwBjP^^{BAfV0-=zB%dLT60KkQb$mV8DQ;>%eW74Bk%P& zy%^;EuEX*6&5IZNTA+DtXdPQH{&?=lnCn;Xe{6HH-lJ)$u;2y)-7N~3XdrLSJNqb^ zY#ctIwEW|tBDF5-HVRE>yVj1S8LZS?ky@=OUK}Jt3y77@9$2B>>hRGYOv(Gabat+C ze+4caIt#}LMOHd$vv;jy4!lfD%NAnarM4Lw9)=kf9zEu*pn*8-4;dMQzjR{jnD^%v zhjkvVput91mPsh{yYKS}xe?|qDnDhG1VzvxlGx?LKA-#j_3dI`T3fgA#z-GgNA~7+ zI_l2wA$Xvfxck2A_`n1*4I@gzG8TdR5;Wg_r1iaZ>jZE~>WmpWvw!DXqd=&=3lC~X zRVx~Vqz)lYMC4Cz!E`=ZPJYH^sJ`HG%sS-GSzo?<e=*^GA*Qg-HgD6?$4{RsM}JdK zB#1fx%)p)czW<Avw3uT;@g7ssx=Tn^`EhHrJIgjV$C6%kdDcn9x&M7duX?TL*2`37 zVR4V)Pba1r2KF<VJ6KxY-Lq}KfB;J4>9x5AiJ@^Y{hSs?4FN~*38{i?x)(WlehGqC zw3@o+$lDrj_jTzQwiv!OicU{2jBm6z`(P|mcRYT&<50xqM%$eAHb}qhvW&U8zumTX zcAlNG5sxgI!A~|nYj{I7v2p${!VH>rDMeIS-!scxWNA=b9lw_#_&|E6w{X~sfh1P} zI1Ve@XpXsIL?WHtK0W|7%G(wP-OnAjHwu@PP~9zYl9V7Tn+}wVo_t(oE&NxStmKf> ze&>znzF*-Q{AjX^41~kJtPXi=$5fO-PB+`t0V~ZDCgBaE3oBjyGLzDVhU-M1bw-5k z)lIo*9-7Iz9FlQN<(+t)rA;Ka)TZUJ1VOW(V+-oKtmMr-^9U2X_RT75?{tCumY91T zRpmbbi)tj_19l6ZPs))Z&qX4cnouqLl85yE&3+|Zw}r;PEv-$|(hN$mBpD*(GiuOK z;y>g37_ubix^ibScZd|#yi(O23V96>S16HlJPt%2gNB#*Vc<T0YEzv5abi4FRp17_ z{GN&`{COMz)6r925ATj??r&0fwe4{5FdrGvqj)=euKvhrm`dP$#9cj3UGKyVFZ-V( z^9oN&Fci-RK)LkmbD`fUzEUauuQ9>gTEToqWBU@>ID-Nz_R{-NVkaB#7bJz>QLRmI zlzH50=D8(3U7Wue3w^Z?-hiN1QGM8ckxr(4UcFjFm@~K}_yS66F$s<!U#_>*X8VL~ z_J>$b>a28vHi3THX=BYDScDk!-aW}xl`$I0koMQSTn*i%`DV#Br|NYo>4nIPYf<-j zl`~sU;IphMxePK|o7ld%R;vGl;(^D(`L2=8)RedeFcD+S1%d|>DCZGZ47NQAV))NN zUvw(?J}&HTAaa=n|G4nr(EOsqXuS5h{ZDFkPo#uhTNDl@s7x@;!2c0sr3d!{Kat3` z`gpElZB4$f!wYN%)ii^9tz$L{6y4TMiMyLS6rL*1K7zR8Y5v&X-sla_#UL`Yx9hp= zW^R^u`@YzrQ)|MsL|Q>%ePm{4hC!iEy1Z{jC$UlHf*>p9og(sPlW-m&hN=Z-WbcNC zhRmDauCGD`d-S|;7?PmRHti~+S5BT8TUgl~QL~_}k^D1&PaUCGvzOt3VV`9j1JQ@k zlfK$>Z$JG$O2)&lwVlg{#D?x36Q&u-pI?yCmp(n4Vd&d2VFm@wQm9eJ`thkX7`j^J za^K_CWXZ<<Azu!xU~aURw2T?r#B*n<C(Sk|*FuZ~<!NR1i%Vx-Mn^9sLmBn)+`74q z$;NXGIbZF5`psJEl}+B?jX59+XS)^)7Zp%++)-endw(J#+^v)Q+hP5Pj)_8n>8O{c zpl!YJKP9mDrTu*V4sCf5aQbH6-#_F`6MW^ZUfO$)e|`+?2m-wiCIg#6eCrrqAn-HB z)TXNWu6|Aag2@xx6sQv$zf0z%r)QTqNWPrv8wkk_YF1OJ;5+Ii9CnXSod^WOO^A1! zxc%pey6IMP?_JkEzsh<BJ|&g;E=-Q$=?OC5;&i#d{{6Td@daN5*n!oTS+pUy`_7W( zudy$1LaL8ZsPQ=1&$QL=_>Zv#ECJl<ei`87X2ngQkcaIKvIlc$4<=h~uX9HEf5!b^ z5_`%N-b1#a(r*>~Y~zrZg?8PZ^0$L4<+!)9C85<aS=%FY_PYg5_wIW(yi68%#S;XN zXS9^s<{XxUsL$??Yq0;%MYU>y>a66ice0Gj!DQ;AT7YZ8wv()?1P^<@REL>uCiTCn zQZKX@hL9S`%y2!fGW{@bhkFB(n)i$QL#iy0IJQl3sawHimWpSoSV2wFBbJ~b6csgC z*xvsP$p44EB$Mj)8Mi2*LOd>5<N?a847Gb}!~nn%Q^+X|nt80}*P<74XP;<ZoU$#0 z!+)3bMr!OGF2CbF+E=7Ho>FwfjG^f0hA0v?H;^OcRoUaX_6zH~XyS?Y`@F1c(Q-FN z7e^Pqrv1G}HW6f9NoXA#@T?U5eC}=H<kD?Gy{<Cc(4mB5_k(G&h>%R!Rq$5Mt(`^1 zd1y|aEP+ik98Df^U1@NO@h-O(w_$~63fAvmSh0GUWVU*5_DOHFFQg;2I2<X=%9`<% zdNm<%H2TR@-5?oHk3mH4)+9Gvt@^xSw6PQ0!vVoA)j4qww|)rqi*IotA2LLCZ~1dR z^+}I{cN~ll2*#B6Ub@oHBron_KBq>MpKiVG8R^wr52;@#=vSeD#c}nrZhxX~aJH}J zMekhzlC`@S8eR>#he!YRJntqEBjY6fNI*-pJ#WB0LWBQTb7D-f=YYSyPbK~Vd!Xv6 z;Q1K$Ui4O$RCkyfVy4SP^QS2@j_UglWY#nZWD8xb%{6`U_nn9LiP(m3*(M{ayl1Ut zxNS$1QT?hNrP2C1fG>o%DW<5n6-6L`Q*cV)*0mUAr#yQB&=~|SNE9tHB2206ZZjX} z5ez6*VJ%iKbM^9y+RXntG_}zl)HTPI`Agw@4j(>z_rTeAVjMelFTmOf+RYa_y_*yY z0ymDDw0V-1rmV}{Ud?1&7vB)oI&)^7A*WqlB%rrp{&5i$H)OC=OsRd2WwdOpm6xjw zSBD+gq|kTPCD-&CASpis;f23yiO(^jahO^|wFWgN60Y2DySOwtE>8Y+&-;7lZlBDS zI<i{g3_mIQc)UfQd*=^_kJPC5R&rg2Hfpe#*kKON?m1Z0<?vDQrB-UuFA1`D?yZd? zUwMWQ9C7)EF@89Tr`)t-D$BG|UE+*Iq<&BQ+d^VV)~hlXWZl^BQ_?BFWpW_G+^FmE z(3$4K^PjKv#6R2(!OF$QA<nsvaV=wp$Cjj3%NwAW7b_4`XWPEFsfH!BVjj)Ug}MAA zTw9=NX|ieBuR@!)>fVd7z?+>~@=kIiMLT1p7u1IRHcjJ=rWuSLbnhfhKG(e|w=1;9 zW?H^MFasFtl)u0oIKjiO!&*G@R$Y#0m<B9gfXgiozw82^x<4<87s!4o*6V=`p@4hf z2H2MFZJ><4gEK2HS@%N^gJ^y+cYL(gCiIJhMol=(in#~>87n<a6gEO;n4R*OiwRbR z9r83J#wV}Sg_}HwoModFZ@;YD7rX$^d)k9ZaS7;q_ebyxayaUB!X^d5aBreiVqaY| zKHFKAw(*wj->tkQs^Wc5<r4~hXS{{Dg6`m66jcvSLIJ*FEiQZPbvQg9TD%m=rxOI7 zA-msB-P1=3hYP8<VzgGELZ7HmKz7S6GBwHH!$Oh_7;=PdZB8q7F0szmrKfP2oUD;N z8;SolT$X%kX=s?i{SAWaAfy&Y;Wy|9^F_C}w=e$$SjnC@N7e>L@BQW|S(@h9i=<_5 zR5t*_AH3r2JbOJxHMPmoWd%XZD8?f3X86XbOE{)#nsne&u|ZeNL-FFO)T=P(+_f_} zR5B6-?>zc)@?5Wbh{1N5!#Pa7#;tY5$zz+oIX&asjGF)x9($=*0E9)RquIJZFG7cj zw}+?4bywNvSPQCMh#^WT>qi1k)4q83B<$F)$szZqt-l>UqQ>An@R0ihIxaA*U?qV+ zFjKBhbHeF4tKKoETj=b77+|_*lUk4F&FE%8g%!NlKrAIIxE^0|dA<3}_DAJZspM@} zjrjT!Lj^oM+&e!|%=ZTP3!kEuAUzgP6ca06qbp}o!ZEh0p#G!{Tznh@|CS5PMEia- zH6W>E^s4*6#g4_1_&ann^8lDJ3uW5+FjDf#pDcr~2f{Rfw1~7CCpN<5O5)>|BLSNi zl;aRqj;~$9-Dc1Sm628MTUO7LH}t;pb28GV1jolbfR+n6U~i2szArs4z3raHf&To* z-}>NsS^<1t-%2)G3rqv?p%n-dYqa53h~F_@R5V+C0B^7O;!}mn(qld$KRKP8zPqXn z0|cpIv<zL<Ni*Px2(UVOI+=Oy13WTvx`4JFOKtj_IPNLU9~be?w8#FgcaHN9Pm{F~ zm%q{*=0>ao?WTvM)%$REn0^+{(#>qW{;A{YE5U#w-kMn!R9KK;52@;|ogo$JWwx5{ zpzaC8h7-lw30w^7vijUn6=jW&*CkDM$>k;tQC#J`w=Wegi{_cWYXA!~C_R0Jj-<bM zb4@v;MUK)@KR9U_#{p{I#ai;y`C77n=d!lTLsst#WWx_e8OIVE8G|igZ$d`8(s|G& zV$+N=M6sMlG?JaqB{oi%Q*z<;?hlD)R&1E_+N^9EZsWQ4xtpe8i#BMG>xHPgnCf;M zV)lPsK9@qv5_y3n*0fo@PcC|EMu=WD`}!ugMR}*3cCT#>uU^M3&gJ7#9e6uGn-32w zF&P;*ZQJ5?96J}9$8N9%D7SW@%`6g#k=}DXjm>m;PzWU@&vybNE;*^RqKkPmwhSRj zb$5>}=$^RwYNj$Rcf&~jdZ``L&sS1k%+fj_Qs@j809xI}(y#&HpA0hP6s*e^OPjnQ zJb?KF?C0Ald<@R<T~A8YOB0g{<)vd(=)CqBW^?szq65yHb+#<X!GJ&BHzER+k(RR* z{8ovxH#1s1I^=z^qdg02I_0UX7Feq03;Kmz&F4LJgppyHT;9l_0Ceg$|IX1&0+0wz zZa6E##<`bLX5?EwlGeuAjyd;f?w@;S;duSikD}HJ9->KT;gP%(t@RC|wUb5mAAcW> z);gKmI#ws&APsrp`UdRm9(q>B!kN|lwSn+cqN~pjnZYdOmIQfQddujJw?=txtN$j> z+to)^JxXv399m9F5ZrdNCQ%7J{_26S>Q3+q?)|-X9f<Lt9yo6W^G!528=MQbfl<oG z3%Sm!E<L3*H-98A^F00LJ=WdrgVFRFyq1n*J|jWe_14JqAJEUlY>`axW5~IX;bD|* zi1%Nl8dF(A5<y7x`D_vI?^ap0Xl-A;ii$E2()OJia1V+6-Zvw5LA;<F9sZ>+X*VzD zwDYPnpMR#JYmIjv&!R2Qy|oN*HIH_b<5pC|J7`;Kxgk+rS>ZSo#wt7?DJZ69Xb7+- z{FcU90n&I5NkC-Y?Ar4Anfy!7-49@f!zN7SlV#hvS=;N{wXGN`;Ss%AlfVh%FwtxZ z3a-MX=4ts8PK)WV-BLcITZ-({$?V@Q1!msoW0pL7+F2-IDak;ZbP6dvAEWquw>q-` zU8#a>$-IJo^-r{Ymv06p(7~z^?IWS(DBk=a$@EZ;#S*Y5$OlYwo&6#iJXwC;(TOPm zQE<-x*+ZXMMvt;votI-M>jciNk;ML-ynbN?Cd8COfRT0H8gVML!nk&7F^5`y<xkSf z#M!63bW>G~H@&sHGjo=x-126y`yU4+e33eObk+SyU*XRYS3SAt`fqb<;GBtsY3>*O zD}5)TtY=9ZO%}_P>)Mp_#wH3v=s;e^n|=xblvnuBa*(me;E+4AB_!|ciPY3W3eTx5 z<F&V7Y#w0?<fr#5<@sv*E^}mI<rP%o-U))$e{bgfP1@K)!LwP<eV{rl7B=v!nt%hq z@SU;AY#oEka}K(l*t3QU&ygb6b<W(Jyo&QGTQDG^Q$#y)^_?Q4#qrdpg57k~gVe{0 zlTSw&j4ELtI6{g$G2q@5__?5<Zgj)-!XAC*=<Z9|A&Pm@iJ`pOAM$=q+|}x*Hr*E^ zJ@I9J{#W6Y_i+DTdr4yqzyy&WoK4H8&|C}8fWn6YT8A!*r#^3rkjmFfqXr^^V?{>f z!y|CUK_EnqB?pfCBXBY3c8}rbS(q)y?J*^LBt-KAyTEC#0bmu7sC*jMvFd<wxJKvi zpFj5n14JatMqIPaww}485wkZ&#;+p+ccrWg?S-5zHQbW}?fU*gY=MW%+VF;f09@Xy zL|&VNaF)>y!m}4E0d6Y^f@pZ+jYW`GbN??ruwAV35H7GVOusnZjiiCS-~lCOgKaXp z*SCv%;^<nJEucT5s%tEMAzAM(pSl}HD3M)YrDvVra&;8115G*<rxcDqQ*juN`y@2l zx5>vvJup4A817DwiSnU{z=apX7r1usMu?kT(FGX7K-nV~T?s8W*jOjLe@wNFNyp8A z!JWh00m=N>I=C<?)(PH4Mj2UpTtSP`|45VGlh^5rB5(-d12;=^k~PFQ)@Y)&ZmBWd ze~}=#U<4s;QptHNpj|OT(yXfPZr<KqP`4B<nSBGg**URx78UzO5wQfiregcuH)7@S zV2TD8JTm3DpP2W`OfJVPXQBZa0J2FI46v%S&AI)?SY#9`Gu!Hc*(DrCAbn*ye-I3C zoA}tOBODgM7C2yGY1zY$)G9UIP^N}CT2<Yb@(oC69ZbXB)&OeuZ<R4-cOi5v=cO6^ zC|RT+aR7w89wQ%w74fcV<h4>Q%`^^vIPTYSsEKgWhs3LE2XgUu=&&7b<iYg=4Wf$f zeXx5A%y0tQC~=d*ZGJGEY8qQuvb^TQdQ83Rpx;gXErrq{6fz~w`YHB@A}-R(Rm-^L z3~khfN}U&GSrcPd)>G5n7h(3Zvn!hN>~PLA{YY!q#ix0<viJ(OMdy1`8G`Hh=i1`7 z8&qC_G~KI|SM9U*9$bNCfL5$xP|+kMIAOCV{*p`&MXZ#WlDhiV$O^iwqE6h>knzqZ z<4so(2uGdmQP*5kaw1$WK$2Gk?q2B*R>!t&#OP>|ZIciAo0RfZ#n_X4%$AK;lAPoC zqEVUXq<qk!>?(Vu_cmN|nbq`d)5wdC$9*!`ir~1t$;?b_v=>8uhp{zB7vNt(PgiFe zt^PB(`C$4o{`Fc;I{>8iOOfwxL92s-mXLvm3q9Q*6@jZS<@px)m{ZgeEyu?J<R_)D z1^SItdAchXFSd0W9OB)vne#jS-?fVY4&zr}gfz{=s~NR@zCdD_BF{G`6jBz7lq-3- z^V+W;AAln~4ekYyBGgL84Re3&&<W;)Hdow66H_icC={vjg7jruFw6SH1OlL1Y*LbN zbwzS*%gwwkIFhZh9>M9j*IyvU;!hmVI*nvX;3&+IXm7!dCEV{3+6>Nc`1>1}JDhu4 z$@SIRVBg3^Fgl=bQ8;z=7?Uy6Z5RS!B7+@JC>rJ0Cv)Z6wS>RdV6akVEe>L$ggJu{ zzu?I|DC!a$<NjXjLpMkWGU2Max+>IgH$g8G7=wmqa~sA~f^30UbA*Tw{~GlVh!TA2 zR-12WD=e@=YXl$^$^j9!GPtxrI{A=*aiFXPl4B!`-MRl4h@w|c?A`PU2LfRK7aTs1 zy>N+2$PVYtY@Sz~_w1CuGp4VtaOA8Y>tkYCt0O3{C&+pQFU`E$T@ie+`EtmVhi>Lc z19;a>ZQ4?ZU`)NV`MzMj_4Zdm-gb6F1+`>tl!2n1(&V!p6E}Zc``i&w(OUw6Y^*n) zq$0N9B;-f1UU;9PmxcwiuN6R|rQ?+=kKY<*i^PKHu`;zkBrUYcS_1^-A|%_GZR+lG z-=K&YDq;z&7$jP!x@(_7HE;n0i{|*E%LF>km>*!bm(elI@5W_5omsddEO8x33jL>R zVuz2M0gWF?Hj-RhAn@ZP^T>>B`%wznEbttT(NEGzZm>MYeNzdA-|q=2yjbJz?;+ZX z{up<OJ6zI_v*7AZQq)QnJ;tOnoYJ|Ik#^8)AkThKE42&}vmdF8r+?fJp!ET!fRFI! z`+RVS6(uRdbIeulS7=hq2@KsdIZVR$)QJ0@+ddzt_Y*8GW4>Jj0y;tuB!`=+Q+~3N ze%0X105%=}rF_F>CF+CB$btu^1BX>%Ds?|SopBpQlw>=djpfI4k^LBA?y${?<cx)? zo8cIR7Ms!63othl7sb_h7w&aA?bbT7SiVqC)I^9<kya;hVqdNuag}?p6DDORb4?#4 z2tLlEiuz-QX9dvjG6{VrmSYxG*}CNk>R;$AHP8L7DMVheZPxuzzEAJp7suT%t~%%+ zdXf56(yK8<XJR~W?7Oiczlr`8Cl8Mu<3VR{W~mq1F$l3?QOA!(VoKlhle>wUrLQ%$ z>C*p0(sjU7-M{T4Gbt(w36-pbWF<R1j${)O5h}?__9~<7Y?4hv2uYHaBr8dh5VDd@ zGBV!l{NLyEj6OZ$ob&sR`@YtVbAc)`>%#qc?l?6{?0T@GZT_D;Te(|!o1OFQRe0~Z zF7=x&`Buo@{g+n3ylqbsE5O10ZvZFNnx%;Qm+PXlm_N7D%GPw*$k0&oEMVd7=7}XC zFzm~>-fxTeA+hex?EJg~B4$T^cNdt<tqxjl72K5{8bgIUh+#-_a^m8D(|$B=2#qhT zndJk>D!sOKlk7!`#>5iA=PWawo#urLd5BM1LP7?p$G<6PX%Q#dYh}b9Yvn!*fuWg! z{<1D~VqG@n5xB5E&8>JsD$|WaPD=o-xl?8TATrQ=RbP3n_k&ak$xJs9MD%G&##W_u zSso@$yq}nhQ;<s0c(bwCI>_UnO&Po>HmRq<*l5ba#V3J98l#}&?yo@_6ob_nCg+UG znfq$i{>WxaiyXG-#bt3z;`o2RlmBtFoZ`$oOb816yXMvQhtf+(5>k7(0Ul~AdTMs+ z8K6DKSux%5L^;v&IbI4T^H@)_M~r9*CXiwZfPO*X%L$7NRueL0;DC4A{x{fRI|c(1 z$svT0pA%zRPfur@yneJZcpbjcA;~@1bkpL>tj<8taH@iMNH;DleU}69%+vB=Y=BEG zos)yZ{6EWw&WkvuEOj)a6=13smg0-EHgz96fEG;p@3*T0T?wgPvK>P{1Vg*uC@4+~ zYfJM``o;Xdt8oJ`QQIe#if^Fn?oGHqk<1dg+caXHy9hTQtS`uA|N1z$fxhzX<jX}D zO|E_Q&@i%l{DOCms=vnjP&8LPs?jt$7x;b<F~%AWBLX$)jPMDCZQ!&W!*ZdC;KAfv zD*wBkiaTTfyK!5uCe!t*uWwpC72kfSnWrx2`TZyw{%4w84?($i%))<FBiBSekf65I ziD9QoS=?-<RKmA}nKdf<Zf#-RnUQTs7{y<!68X?sM7KEjd9_MS@D2)$z9f)Gw&E*X z#Pt&(JOTf5AR(=qH$-k>&$#b6Ot@y`-x9bcNoLUuojlRb_QPlJD1G&ddt&Z!dacG? zG-W|eY*I{@_;7&BzxvM9SLEqtS8kEyKxVk~Hfa5lXI%Q=n)XqMAL9Y-wlvUpes3Kb z!}k{v?~SCdkw&x-a{9Yo-@aJhHxoX4(H?#M<9O#UsPOQ?2&@+&-T=@(8ZLm^joi_F z(P3Jm%^zqE&;}-6PTQbxsY)4p`B|TyaQ3cNw1EH<m=GK<N>u~aV~iDj?LX(hex0M{ zz}#lEVM~l>0wyO5z58rQjt|e@f1<fcKGV%t%aUg#c!oPv`;Kp_NP>y+R+0Sq<KbRx z)rTy@&@&{BhOILwm1I*Uv!)@hs4eh9t}coKTk%k*%C;5*$k9*=12=eTQ1C2PNg@j+ z_RBSf{zzuIY|%_9o>Mm-I1t5P0@J!8!IGg`0&g53rnys!0N4TT_m}O2g#Xkr#*<sl z<ec_|xTm}{_kD`pq(8nPXOuO|)0^FS0UpxnuZoB2(A>z#i${zYGV-(B<t0CsqEYro z_z_OVzVF}PLdVy~I!se3znKipZ9Judl(&>{6xSUH0&aY6ZdQLU64U(UCI#q}XPWX` zex}D5D9dmI#+!(Xh>+k(re(EN#t`dGg${b-A>W6ZLxrh0=Z2EQwnHrgqPZrc0LpEU zja<YCVTvpA3;|@dgSC2s3AK88dOqc@8<%^X;wIM2oT>&!*qSy;ZPNmBWbec@$NqJb z-kv&}v<(&LE|o0D3k(6Wgfy8uzx767bxMm+I=XFbZeD-6xJQmFB=b#0#RP(feqP^# zChy;pUX47>@)cp#G1KxxgHp$dpS{X@zreWTz_#L*u=53f>!MI_=7&4mTfVUTEpz;M zM{{vj?Clx0J;8Dq6$>Q9@EIwk>YqFwSW+>1GR!l&i{9<@ZczeN!#)Z!bj%cnidmiV zu=A2wZ%Cp5u)ur*$vG0-gDG!aD>HI=<hilXbn5>nQQ^*NKsEsQ#*obajc^NYM4Bue zRl`bs;nN6BVQ!;%P+XY2(D11Pfj|{@0~WdYz=^+}=S-CnyWKJ-0?Z0143svXY{gmZ z5?YwCzVZ6RN_a2+MZq}ObXzmG>)94Y&Ne5C1|+&omoyoY2dC=f1pw2Ba0ONo{9WS2 zn8J<v1gAcA?O>!jHz~Fa_>jSRr%gHCGZiBW=pLSZ`7h@+oJT=D;6K&*;#9dfLyoqx zL3xB)>sdt>FYV22D4wX<-3W*g7G-xEA`8-|@*7+YA0%`vp$oGe_S#(TA?2xKiJ*kR zp**xW)(Siyn5U)2S1{lJtQw}4OJjtZ2S0eq*U)};LnrP(;SPHfX?!VnOz>erI6=X0 zFe;PsQqE5=x=GWWUHBO)R4PsB#2gdw2ay&6`^hEGw82bq%E-Z<ooeh1sv)NL_$0|5 zTQXyx48ceSD*;YT;N`eEU=*cx_*{^lirLcU*5@8g=m}=MA4I2zVuJjewgy>uqkC!- zR={l1HT#t}U0s`=eALzV7eW!TvP%AbTL--!@ExC=uE{Xb<O>iLvH@qP#eZeLoZXt; z=s*sGFQzH1oo%;X(k3*bj7-$X^*mSHv)!X~bOCUA%^#PgTAe&;v<o^o5#J2h%>mM^ zy}kZtGVS+A-`#|N_8af*>E@;Fr&G4yZB4f8vaqn!V<s5KlC&mom=O9I#pvwQC5E;d z#XT$N@5G|dRrJlI8x$Ol$GJ-|E!N}jh*!($b(TtDVPgw0C}<pOP3Vq_ii&QwH2yI- zXofg!-s-LODSpjm=b?b&#hR7sNU=CnOs%QmN=I=9TWVZ+ZTu-X>GdR@LU;EyYikDD zKw*T{TbGe8NWzt(4!CcQGKE3|&2jA5F@efZCOVzIhic~vx=VF;q!<%bzE3)nlujPi zAMN&F1US|dGJ7n}R6<iB0>%tZA;aDPb>(-uxoty8lx5=eadZ2?_TJKny6(kFwKOT0 z#pJc~<OTOxMqzKL0bG`(JpT$nLWS1m^j@+nA1~P`9;Bs&;W0~(|J0AYw_bu0>9vi& z#eg3Lx*m`=$-s%CaTjaei>Dmqk7E^iD?{F})CKoGsJkuQQFiIj022~nNKs_4wfvdM zR)!h)YHE;iVGzdFViF&=@{#2BpS9a7+aH;gm3HL_AE-8^hvDWwc6SP3zH|pm-@Iv4 zH~6zd_pld?hge_)4UK`=+ZU26xQJ~GRDKz`d3(R17$?{RWP|k&o2l*9owY@)mwP|k zEA5^DrnI`b<r+I7uN{$12yPk)Gky(wC~i0CiRM~KiKSP|7jY~Ddx;mI>QBDbdDivU zN>1Nb7=@PtHqs{s;$42saL?~~Zw8@DitCxJgtA`Sel$=ojAz^lm!i2ELC$gz9{i1{ zJ-Z#Qk=rFEEIhAm6mL&>byJjeo6;`{{tO-}|08XV{jP4Q7k^l9`C8zHRVK8CWNvIh z1MGucS#!4MOU0w@KU>S=dCvdtuyri0jOIZN=XC>LdXYb_B~_qx`+~l{9{&L}k;y$% zn?1Pxj}XEEafITNLdERPrE0_+r5XUIe*_|gTiGKg9R2Huo_5<jj@P0@+%*;H5HZ+B zxB@;U1OR|y77+T1IgjN%rv3u0l6d<6<_Qk7{bvw*S*8ne*J^*1o7B6ljO+5R6`@7= zTKC6Innb2mnm~Un;EU$<;aJ<a6Y1+Qqs}i*8}mF+!UF)&orC`KK8Fu;-A*@tg!m(5 z3btPaTD$$qxIh2>X7Mo2sxV`gU?qld6*M?mp(t^|a$pb`;x-=;r4R&lJ8s97UHeY0 z9w)v<^LW;~bMkI<r$-tr_tvIa37|GJ3<{1!sa`=?|3N{MEBSlMdfVQLVo(AUGl>6O z5_?#+RymQ{fIp0S&bW{%>t6KfgM^#RU9Eb&j8GytEc{ePWeG2jCs%@=Y?*PPz^V`W z$%Sj|?xTBgV&nJ$)9dMTFyu6_4#Yj7o|q2Yq0wf7ZwOI+18Ut}M{u(~v`V^BLA3Tj z8X%~a5%8TBhYlWA;Y}XW-2S7vP*3l}kfReU7MQ1g&Pi>b(5D-Jw#G%OSCyELpP9ie zi0#@S(4RIT&u4C27$3*?;8ilFrMpxiLE3TR<6#INgIv>1$&YYA2y|{g!?|WlkyAUJ z>{Ce>WAAQvd;mCraZzbsoUC*jYgq|jXis(3?U_4Cy_tRu^w-IzIhU#qa$zhavy#4< zgFbbu+c5&IPi)H9_oL4Sa9@O6V|Sc%9T*G|2|||#ur3d!!fF(<%Ig2g25~2}RwG{e zt8U(xZ7u!fi@@&9b99KHemcHR-NAIRxcguOpN3vce8@F9ERnRmW!HOr>BF(e4JFsD zgXnJVqUM0k(=|`;^Pi8~1_gmoFoh>=a}nQ?hCBT{$Fcq?^3Fs8T(u)mRFL|uM%a+h z$-;2_Z_wn8n>HUKtx1WY^sjhIo+7i_EvW7^eN76wKVozu9I#d(+vh$~lCTAYn(ZJY zsO8k56U6F20A$#9p?lJqBs38;eM2)uQGraZ9o42C0@K+mxhI};(%|HL3%h7nOV<vV zNDRHZElT=zCEBga&<p`P0pYfy+VzWTKW(7l$s~t%y??n=`|pf%koJ>H1}g_4NV*0} z7_`-wyi}<*N^anwqANc{L-CET=HRwE{TT*?>N?;_wtf7#LsI)7#FnL$nG*B{@mAa^ z+4p~ccTP@!rLJ~58Oc3Z4xa9lEy<W(<5c<0-a<Ut5%Fmq#J?MBO9a1*rtX2m&k^E$ zlVm_f@}#+k$D_FLr?EMm*9}i@`ed;?INhr;GX_k400wvwx`mNQxd>1Kz!-4oIj~V< znIND5T{W(5VLo1hOV>V%yE(1emlGV2PH~W=j=*e7?2d1f$*PG^grXinb{&cibb6#p znp)ml0CMh3ZrEK&vl&S8p<_k`-Jr~%_=e5+9-@_0EOKJ1>#xWQFkO`iMU(r9m*Um2 zoxFTem@k*rTZ5~S#H>S&gNzOIuI%1_wEs@v-WAFH4MLNO@Jv&wB(>al_y25)zu1L# zE$_fuQ%HJ_nLmdGz{30}+dJ+1wd=a*m(+#gLv%rt|8aOTLUWh~;^=9!WhpSCR#3qy zwQdU*`|I9b3frClp7IIutUFQzhX~dHaa0PrYfwKqWKC(mhUos>p8E}IBh>Os+noD? zUlBGSpA5Sp`shCpo;(o7d_@iN&91`Uxp%{nu)VkL9r7Yq$;WFKS4ScTG1$cykdzQ` z;LATHHBeS??U?*wXKJ8-hX~cTlD2fLl~F<d?-7y->^-CvQc!JWc<#4*XHoKQb=9q? z^ZKi~AJzZ*QAd<FTQ2hO)fXLFzJye&vrrEF@Ti`Jk|s8|?#G$b5y|*<CFw~3MjG@T zGAnFn&ASxO^PT7FgzlH5YKF-N#|Bicq=VeWg6Ebbi<O7Jn5pmP9hW#EM%wAWB&H`m zX`bPoRK|L8!|)X=NZamVH<dM#Ab3BzA<r<6{9fenk~B~tDcZI!gvNACT(vn~`m^iY z_sbrtNlKw|4vNRTG1H~@UT<=wJli^e50ox8<t^eW{JXTe9^0|Ost#NV*Tu>zInFJ> zjJO&Qk2lhLKAHk<17vuNpuAMSG-xZH<mmzKA&&4t^;}CaY2U-iySmB@Xw8~ioX|Fn zgX`O?UkrrDe*{q1e9L>I$6sQ5g+GNDO;Oy_s<yA1TZ~`Rd*-IuIoR4UMH_l|k~*7F znXPFUD6C)Wn8hYZe1Zm}j7u~`GkY*ZxZ@9+3E(tAr8VwL+`966uK<)Odm)MJHK+$L zWnlzJJzN#A3|Jjm{9<MdP|J$vyVozEp!@os^Tn5%7MBH-;*v`YB#HeDXqWMJsr;Y0 zYwpuup8!%oe6^E8_4rBtxCQCR%F0U5mQb!;TjsJdBfg}`J6n-}veF>*Hz@1fxRjs2 zbuwaPE3{)`3I)qD^wLdrmm++TPq#@;P!mty<S7*}gV4g%DBd^a9VPITT|TvgwEd)t zm>yvj!F%qH<RS>R7OJ!D8dPY9Fb;v^mME()ie~|WwUrTsHviKA$ZhQzmotOXad2Z? zf+OC_T}fYmU~{P!a2dNtu4F`OqWTkoCP#V{w@oc$r9bcrEV*MUp(xuL1(;(~Y4R~I ze?6Q;oM4L1RuiaFN2o4!0fxDmn`hjf{CpgO>H@)pDb6JIt>K=UzvX>kj6FP`{1J30 z6)5<l{Nt4)IUw5U00r~U7+_*4H~^`OCnMja^P?o6r)KhYFM!yfCUf!NIwaTRNH?`n zM@}yfE6ic(JWflaAcF#BkP3Vnfr?}(e37Y(!cX1ckt&yA$~2l0>5kKPG=$~?Jdkfe zkAZYx+3!N{7bJvbZYV&7f1~Nc1WT8~$VLkRm509{0_z5?J|r1I`BC>qAXg+#Jz!|l zOP$*qhxRx3gINP=nK<r+v}t^*AaWBie?d0wJ{OVBS!Ilj)&)_7r0`(KHL%QMPV9RX zwn$0(BYVRhw!@5(Di^uM5=byAG#LMKe3~FOMkFfcP9jRzq{fQ{fxx)ELDKU@c|>t6 zdmKhNhXePD4Dat_<$a_8Z3RYU#J`nNGD}w8_^cq$K=JnspGjc4adrExqt$;~E<kO8 zdIT=tKBWhDl@*rsbR4S&rmLc@SV|1(E*6<6`1;DB`MUiVd61+~Mf83U5)7_?t(YH; z(JVc4-X|G=2~82cI!-OHe*Hltx?Tt<J13nH(ua=nTX;f?3r=GoeAiNUNrgqVRu{05 zzN;<=z$$DN{}IW@P#@m+Ax8v-He@hTjI^7(l(ql5r>2n!>lXK11rzUtCj|iW7Bp!x zQL0{Fh8><em;ZaeU8<4$ZvwS2liyLls&Hs`mpwKw;@qj7HyD9I(EjW;QcH@}qW?g( zI*LZ_Uy0##SpAhmn9^_CpWg0<egtNl`x9$Hro}zD6;m>KP3AUM+@!I2t8XujLDS+5 zaFH6Nax?_F>6Pa~@-S;BtaWUiwPR_J{m`LZ-BZh<&`!B4YyY?ixPzkZ$4nACT8bao z9;0nZrxgkf{vCt$AOWS(@$^G;p71Ze^w+MIVhy*z!6jzJm!3Q#iE8DprCJ@aF!6UO zKB^{I|0N^Nfy@dz_4;TGTQf!n+f|$n#{mz`!?jRmBKJ-y<i=7!h*@aR`eF#5Ftmu2 zW;je-?r|?`*uOYRpo-6GM1hJxS5oJ<E_pW%93h%264!9q^VY51gIj+q_zLffMNTq8 zRH0pHK+>jv4a?^K2<JD>T?z$=Z7e=sh$i2s7Zxi8wKkwUy1Vj&aZu#R(s`(Umw>?n zMKwm|)?E=6en$%8yBVuf{YWDP4*^dfUysQJP>u$1(vUQT=nHzQP^aE#24??zSqjxy z1X?;&6(l7Ix{8Nf!KYl{RC(ApW1UI%*5ctQT1mc+&fRy}9wA?Ex&q&A_4mcvmOb2c z!Q&V%;MZ(Lyf)_`na)dFPzi#Y$)*gkAc`4vc9&5|;m0E!<Jp#4Y7oMOhH?^2-(s4_ zP4#HnTW}Od%C5uX^cF!|AWlglaUNQ+41p_;Jh4bp-<S=JI?KT|1&Xa`49gFo5>hsR zo=i)CWO>%9QGEcJ(g<C7^Y{Br0q*B3FORi~T-}2yq^12dP?vOgZZvqj9`OY;P)x=< zFP(<bnt@PaoAnP2$OyGAUWD^$v)p(FqPzWo8wo$0H&A$fj{Ii(@|ZSb2U+5{<ZN1x zjo5Zy_%?Ohb|22j7y@fZra*k_n0<b}lue1@_z#P%f@m%X=uD&;X`2T+^00X`Azj)_ z=-*sQqoASaG`Vys%e0_SkADCF(n{N;-D(_D-2+e@-|Fk@c@Qvm*v|yuFN6}L&`@IC z2$pn}DAH2UINZUiRo2%RYA$U%>QN3tjs&l_8-z%3U63(q2Yr)tv$#TIZfVW%SVeI$ zM%1u1vjrFYbda3w6qcK>BVXY%jmi(?e$r@R{!w;l^t*M5;X}-|!TdIqlP-_4ADj5s z6Yv>c7j5a!(;LZcyq5~B{r&Wj#7B)5^(6gT?Zc7S33t-c5Ezxlg!Jj&GW++Zui0dQ z7zGCL*SoVYFJWQ}z6oj)9f`v>%VvGk=RI@gQ&r4x34Xx6&pRH*CX7=?oXs$H<MbB| zw;2poBt|Fh%hBT}K?v~WJhN86-~n%q&g-X>Dr4g78p|FsAj~kt3dPVj#R6Vhbf>pn zKbOa-1+g`i1WGW_kVJY;JTjJFGNaj!+eK}qs=F!K3&g2OdasLK@`5%(x9`)6##*=Y z`JA=Y&*z26B%6=3Gc#X#Scw-t&M+sYcc*t6MOp*Evm(>#7TJ|e_dPi}lkC}dAUHoH zv24Iw7&gAYdmh~^YSwQG!3-w>!iQ!5c9u#yhIy%RhiySD;`JG_2bvaNo2x)<793xo zCy-s7T->rvFFUZ%ho!ObHgFfT7V1!8VTRJ$o549><>+iq;+tlU1*VaSKOURU^Ygb) zvh9(R0{l?G9(heBp>=byFWlGBabafMSCt`PkRW`cte0w6;M-yhGTPiil9I>P=bZDu zliRkz>s<;~vgoxaF+rW%0AVFLTzh}c+lz0vj)?&5I32ydxplwF*Ox-l+&5712ps=r z$n5X%sQ!WKG1?S=flsK1RU0vs7^$JPkD|T?h_M@}TOeB?Z$%*<qp0a=ICdZxT!17S zm8OPPbd~luTH-e#uPFVWqnE&yNFpz5sxx`%7ViM^MV}&#RoGUlah+fkZ=@wPxO)>j znC{YROjg3BHKbnc+y=mm6eS89ULvwBL7O851^0L2KL6<A598_z!pO=Uc1S$s<q`Fj zz-*?H+jT0t4x%=O$fn_C4;GR5L{XGtDBapVYf5ks)Z57(ODZ%g#bTY8mp9JW)HP3{ zeH4*FJOKY8dz|M+G?s=(Qt5Kaq2LU9J}$Xu#s!7_p=Vzdh&M<;3zENJ{U%v#z*wK! zz_7T${QMPBx@H+QK~pJ5yv2+GyTPmTt=44_)4(A27I7neCOA%^zFs*g2=$<t!p@`% zf>-#<v}J`mmIP$N#Hm_@y~pA%$}dW!PMi`Ed8>B%wcW3?o9qBKd}`CI2!DQx@venC ze}*=e1Z|($hZlw87U{@=aDakGA9j#rprg_jOh}3hu=yQO`Q*Yb$-SpOounhQHmBcj zx%y=(Q&rB1t?P-3ZxNJ7^jEE{0^6;sO-UJ3;@hY#q37(q5N78nx(x-%$27SPiXC!o zxo5X9;Qn8QtBVV}UAgfOb?y-fW;$O{5s}3kNC045_V)R-dKt2ykyp1Oo0i0g(Oc$% z3ICF`cw^nG7PkG??BQOOE3K%I_?EKG@!6()+Xcy{n`BFAo-u2_lkMZa!pxQ$4g__U zyq>9A%tEP6@3sL{Oc>e)Ck-}|M!XdYuWx~XUs>SUi&JYX%Ku%7M%l_Fw~J+RE{ZES z>EvXcsst|t@Qbyze?Fhb3X+tRl$T1eKAr+70=>@&WQ15e4G6mmhuIJW<#Se%jwJ;8 z2+Th3ntZNu;EWG8aSXwu+7vwlGOkdDq4h0Mm60mc-XB@?fpK?l=v$00m1`+__2M>v z$UT7jpyshK?^C`2&{=ZAU?r5oK_@=HXKKiu9WLFA#iq*8$CMl6-?dF8bbew)M2xTu z$Go9gS!zT2(+DkwDWLMJ;p<2d38^-nTUi)I>kpX0)NPnDNbreoBx?^vNY*6;5d@eP zlQ4Bs_zx_zB)*$HRVMBuDuq7AyZia(kZd8dR{h5bFCNMIq3+Z$p`7j1or%p3M6Lkd z`c;<NfUD^psVMvGDjdh#Sf0GYZDVL`tO$+KzFxFMn4l`cGl!LmrNGi^jZiZb&AbV% z(+0+QdWJiaGI`Z=KwLsL+-WP`JASj=_z1LSh7n<5!V&aiG`f`qkfB*yQ=zJ$Q~Ixc zu%h)gXOEcoL~P8bOM4KuYO#?Iu{D*NG)~{vXs~85fmzvk{5+1>QZS%+PYDYzdHr`t zp6M(qE<Uy|xc|29%%+#zbnaOnctOYDENOygOAdFmukfi;8NrPfas@q8;d2%nbEqRb z&Zd04O|WL$({v3|5Py4#t?lNeL16AOrz9j+wyp^OBCp#_U(>wF)!zD}Qtbe<vi5AV zE^^$(LmNvC1rwU!3Jpiw@;H;%tJ-t|A3{<GbT=d#994>XOG@k5^A|7PjlTR2We>ap z+%wsa{(*oxA@r&Fu}#0FZAKTA1C8YL(sfLe;3$Ecpdm(BG%0}}Zg(J6C<L)la%7=D z3F*GNn~EG&-nU>%g6>67Hl+poSZWB*sQ_s;LLrDh%kDXSN`;G3Lzv-(p#lGam#dH> zft-1NKf{TRtlvYs4a9-^apf3dPk1`UOW@*|9*nVKfvji2pJYH1e~GI)$Tt1bIeQ~+ z5c(*m(0%}<B^{#~T7KX)x(hC5bWI|B`J18=Pb9*h51{j;3)SLfG`x@^NhCGs3f$;j zqV{8GWR?i5k!8;;*UKhpHPR*4w;#^=Jx!NQizHs>n|pPU8-~1g=Xpp9Amf1VNxl4> zEQO*7fCevQzNv7>)RVx{b6K53B~9#CX-jatZ?I(Y{sgvdeq@>AU*^HQ3Nm$`IcKT% zM_qdNC^X)B!*Iz-vjawiM4JLF-t?|XVP6HD&pG_B>!TXnP#r_Xbv%=7uyr}7;XJmx z4JR!XG_KE@iDSn^UW7+R!rF*<aMVdu-20XH;-wBZSs9V!JUHGWPha~;kUX=j!;+vx zH}_@d#&#=Kn&Xu#L$^Dx|FMGG;XTOs+8x3?#Lu||RV=f|P$agN+WO><<eGll&R**P z-#NLu`c0>x`<1K6HkMuQ(ZNIWhyVb=h|kqfN${{?u}NiSlvOV?4Fv!{L)v47o`m^u zdoQenU2rtq<9sf=FD@n3cgr18ZwDwaf9L7uq6CX-9jg)23Y?xnikuAm3JI-av-J#J z30ei+&nqgLH1uH)4cg_MR4RaToDx}pkndQB>Pt|Cd!J$yO>4I%iOMyaSi^%-+WKb1 z&u$tN=m%Y#b(T{9`U(zqbl}Kcj=u5E%yUKzAbDFyN7=z=D<MB@#rK9bCK5-s3>68Z zHCHRx-^%J5>@d&Ga~Xtk3>7+(m~d-@k^D+C;m!`x&X`k@SSjDsD@gmq_Y?jeMlv4k zk7b_;DYD0+XaMWsoEcj7FsglbMHn&qC8=cH@t$`!N%+y47mn&@!Nh3?Wo_o0|1nUg zXp1JdhrN`-O7dW%7{h8tx6BN&DU=1(%q_07-e^enAI2__niO8Yf!`fG-F=!EuYTyX zpQoXgbHmY{r{=3aXxZ%8cb*7%=<wkZA1xs*gkHZvhQ7e_OF$W1g-^wxjh{-6>I{_? zI;`};m*BUoqIySh&$Ws^Fgy)*QjHc-)i+~x)vfftyFK7jcDih#1Kkx#NP;5~Eyc?M z-WK$j-j-#(BT(gs@P=glIgD(?C-YOAAFGZR9>(NvDt-Mk5hKi6bOcBlSh6G6c>z`d z3p~$2p&y;yJm<4grKMl~2Oat>NQg3MAkn3PbelV_nTaCac4nNS_EM^E6})&#+M<qZ zO?p-<9gVJ!cog<6)M}(Qn(=7<M6Eq1+VK<P5P#+TTM~Fd;eXVw9Y$r{j;Hw{7z&1~ zqO$Y)C_xq2=h2X(|HVAgc$3L1B0Y<%<l8|6t$5LUh0&=%^#Pia&m0*MH+>Ks3|{io z*e)xpeX~i=8PNIweE`T}{@vC11*i<L=nEvm(|iYh#nK(6VGdNm{UEAH$q0YQ%#d7* z;%gp>ZO}88-8>tojb{cB7?G(PKHJ1MtW8)Rrza10FF|mR@FkRKaHnDjcW)3-Zf4i} zOdGI=KS@18<RFs6L^m6igj?Bx%~jKc`_^NE1N`ytqb}+nK&!jbZ~N=(%G+H+Ln9p9 zk|T85s+1>f7$wgMj_C0>YV=Y3Jhmcn!A|NjlzCs@d1EN)!WUi55)ZNPNJ(|Z)pPBa zBbypZ!}v54Mx$Ru{iR?$PWT49qYrqmgUV6I8XJH!>hg7-Gn`S(Af#yAM;A>JXQKiG z*#)x`7^9QbrfC=zg5iDFb42J*z6D@~>hAF4r|&s}m0q&#`A<HY>t&1<5h*AoK`^(Q zkEtQH8m75ZUzR{Y`t7Gad!%TxDs%TZbPdq7u8YwU++AH0B$C@LdV-6wY3qj_9>eJ* z`lRN%D6KZ5(aun{*y=;KT|b^6)X)vxChTBqV)?!7Q58zO_}caaRQJ~pg{$Ot+e||A zkJKp;`8<jlpMZpz!7a96R^`&p6t2>Q<9xWwwPASv*QHUSUTCAm;_N_GgMBoQBO0m+ zz#wM0Y``HU_z*g3$DE}ikzRuCjt(3WZIfdIoUO%g7HP-MI1~CQ2}n2@ypgJOu~Hx8 z<2s7`%RRTd94k%46d2m%csn3Q7%h(DQCONgJZfa(Q6|0X7K(VB?G7kI3{KCiEs)8} zpkPzW(HTS+oQq{OfdDROhHjuPcp}E5djY!K-m+`GqdB^wftMmtapVBMy4o&dW72t^ zt5pQ5+vab2NVW$M@Xt&3qpf(B7VmR{-BFIudG{?->VhvNyy(VJl^}Ro5zDiucIytH zxg^Ixbaf#xsX@s7Rm*cc=^FFCyEXLpg7@a8FgZ)j+=(i}ZH#!4fC0Pv=--yTk(rC@ z>7G8|Hn5<ip76_Y2<Qx;BgMYKJ^D)NXuU}6RZIf+S-)XDp2>YgtPzoMB-{q=4$dv$ zXtdBj`2;{cvA@r*f>d8%HNjU*ok+fdIGzD5Scsw6MOh{xZ2Sdt^8iB3?Uc(MVjJTs znqU9$K@|oBFLeeA6b)}7h*@1tbo^#zq=J?-G+m$-eGYJWU@!vx_r9nCbHe*ZH3~!w zy@+`#xi;fJkRz}iv<zJEyv*3>i@qUs#65LN?4EX)(7s?;J}n#_qlQaR$B_hqP3)d@ z<;E9~({^dk{i`|*0UFQ~KFH)n+QY@N-f3ld6H15Rq9N9B?x(zJHKxU(r2^*|0?uhO z%0TS$DfCe8r4fjd!P%msitNIV9doK?qN7R!dUp&aKb(8`L9e{lL_ACKOw<U{$?XQz z4lvG<H?+$3KkL-=?5DABKX9bX5K_OrbXrr&{jppWe`pG6_4Q-Bx@%NF^%?6KgPx zZ{aVP!}A26y?%!LabeM1H;@s&e3?B_L|VEZTuaN)Q2LJao$20S>yXl70x<07!s_Ej zi%y*77x5CWEv>x?{!s}_RHCQ*x?a}o;&Zxat|VB{UlM*j)|e1>Q2d~$f2Sz9Vz}J6 zFc%jIPB%=*Xjl}0!4#b-f);iGS|X$i(Cn};H%{rc={{Gnkt!W5M%YbwX<X>y=H<oq zt33uTuWJ==p(cg<UGISMBr;`rU{CmtdvV#RQu-NaZo7&>CW?AOdRG2#=`kZ*xz;b9 z!DXcRb-?Q@Aq?Qo)E%kIy3kxAM(J6Ao0}UAAd}UAuqs9y4w%PSsjgU80^2XK5@8`f z>;tiRt72+mBH<vCeUXogIBQHe=xQG2_dEZB?1gb*HRiA#gs*E7)J@0bDwhkKm9R>a zoE@ZvE`v0Tv;z3RdTn3QlRfxqQ{E1wjKor)Nh76AwJ5$ggE!FtCx49U+%6BaDp;W} zVYi4HoYSPeC;WEl4M0xl3Lji{{6(dhs~%ncc@NH&l8TD^h?%7-%KGjAoqAU1mEmQy zxa$=NLAZ(*w?oV0Vb4?}1~y&(>X&ILnt%AO$W@4KHhgMNC$!Fh#%dp4aKm7wCdJN4 z>fZx1H_KUT7UPOZP!vkP<NEq&|FfiE?0~eR#z9g5Ez48f9%%_yYq9lLRz=5lI8WU} z@vbbDGS2%gcS@z5CH(yqcslX`(ew^CTsYE8ZKrV#kQhyviy)OX>RL^@mTI1Ze4q%V z_`6k`B7Syo$)h@rot^zX>{~eA5L%4swC!v!UOYu}<LZfIw~nO^_wQjuR`t6A&itjl zw$Id+tdQ+`59JsVfD*U=XkC5S=5F~1b}RIzkRycj&Df=>ml>Sb*9S-`LH<pUDU__B z+lE4;<zP1FqokxLGw)^nH7F8FA>m^A;~~Q`6OE|xg3jwM19q-Fn4gR%OYRr9=Oif? z7q1`XB{P4fp};IM?IL}quX3CNA;04x@GIxoafq_8^}sPj+LVW&K-8(hJPXu>Q^?|! z{z5lxabI77p@<mmT&BnG4Kd8-S!8TDhO1nqOqY|E{$f*Z{Bdg83H3l+<Z8@(QV+Js zOVi@MU4e>Kkb8Zb`THArAuf4(Qhm2ie5abHB-HK$yrhwP8eQ`stUcLkIhn_gT`M<6 z-ab6Vwo9|Whr6L}V)6TNMff^khJA?Sw5vGVytMH&leZVESS+oBer?m|r1^h8xHU7Y zpFihxl{y^WF>$(@nEK8bS+4tn1Fk{l=w_CxT&2Y;s*@K>WNh?zleTlMG{LJ$XNzpQ z1>E>8uuMJuoXX>9BM&Wmcsty>brLy)LIVjroiG@2!kxsZoae}vOAdUZ+#3be4nJzc z)WGQlH>Dx!2_xs$sse%y!IJP&mCIuA$B#YL{?frgydkhuXP;mSP5rkhz)x_Z@~_8} zp|g*>R!`E8VL0?vUxyWHA7ma@WB;m_tDQli|91GfsFakAI|`OFsS^uB{`5bgTYu&V z!@e1U80C5!i?$SG)3&pKf{Y2Fgkpls54S{8_hCsgh0fje6H5vV6ffm*L^IL`MsN{v zFaA};p>zhcjb+t<Y&Ry-iqLf4NEUx+QL=g#Ui;IasnDKc$7zOSuJ%Jyg9U++Tg(j) zSTWd#1#KaQUh*}UZeT*gEPbG27DzN>lrk_AK*=UT{uPID1Mw3*N)c@k?@6s=E<k5t z=lKT!J4cI`BBU{s_R8?qg$SmT%G&d}zU#Rl+O}OFet^fN+OVM87F^*dvRxv<#%q@K zN~5|`iD@1Mr@f<NN$==QxQw51(ijo8u!B2YcaoAVdK{d*uL%`5TfT)~7VuS)2Yj`- zz(|E>-Qk#K3e+ixaDYDtV+Q~#_|_m(>N~EZnuT!EMD1wz1Fu6XzYj2+$?wLpp)$<6 zw6Dn#cW2l<O*;A@H^eSOHWWCK>M1C5<_zDLsbzxIu1`Ve0}WpvI#~y{um?QgM;y&} zwT=+<lH0!`v!oqo)0n%DN_4g+NY?X+u;PHy=*c`zd^y2{))d4ryujXMXJe!I5G*Sz z8{t&x1pw0YHx*|brjC=QiK8OG%?*AN94JD~z}z8q$7r+4glXLA$-~3ZJ9O79us~1C z$Q&jYj%~LttQP!hD}G6YnT`WXX&XWYIg4`RVlua<FuffLrz%Fa1HhLeT+aXvp4}xr zQNcY6js&E%4xr6ErK9G!D}Ocfq{VvNKK<H=t{d7|1ONpB9|3`Xl93_1XUfPuLV6d# z5C@C{8yvh=UCoo~mU&eq>1%SkwHiafPJR6p9J2a(dZoh--;hxlfD>dN%8zI+VE7_i zzV@jUWXrFUm7Q?%pb|(G)U4Gn=#IEq{{0b5rScuFlm*?!`ubuZQtx9>G_E33h%{N~ zg3e(%6!V7M-@^=zA}X0%DH;_9Fd!ir<LN(B%kMKUfi9akNwOJfGu~orGCC7+dQrM~ zs-4N5$DL`}BgM)GRUsT+KLOXhAY(>|3O<S3h(detc%qI-zl;)!m_@1J2Sp2tn~MeA zZGZp1v~zO$e4<qZmFNdehyI?P1lV7Wp{9`^oPdZ2Q8BG$XlrFm1TWgtWqh}**yc~s zX!WSBAtzwSsk0;-IRsQV5c^3E{?Uh!u=#P)08YEf)-+=*5Kq4-?YrL(-Y(Lk7lgtt z3vz=8(%4ZD*+60Q^&OYLc0$ZnUw-~L7`Pfd<TC72XKD8BF97?7fMNVMd*-wLiUq<Y z-b)~b*dVJ@tLpEnSuXd^jH^T@BmTI=MpINy`S~i4b%jnkdsOM<eZUTffSBvDAf!?c z5XoP<UqJb-Sn`F;Fxg*AYa|gtnl9s*cc7yAf7-E@5SP_r=<dd?N1#mtk7S~-#T&=O z#8X%XNJ#%D!`|`p(<d!#Wg}d!k0;g=$To)4w%5{pk=8%{Z+#s@*wrBGt2V9OIpm7& z;U;c&WB!EJTB;%IYEzD1mp1?s6l_D(g`sMtHJUJ#LJ^M8!Gh43R-984(aodV_}E$z zSmvAi;k*r}jVLR>P~2s~o<{<$RiMA~VoGLEQ=IWHH$DkGR5IeKJ2`=~)rnR<uXS1i zjC3U09N?nZq%S+QXqq5Zh7T~wOCzf@48*XgyWSrUZy(H!f+8N<0cQK(wFy?0v_ls~ zS=;I6WiI<vNW_XHw@VSu0V2FB=v=e}y}}FpG`zIqg$Czq_V4sdY#n1x&c`EU{{qul zM#Hcw)Q&IV5`|uoQTYZEWMINFH^ufK!y^VYrjhG^pWWjFQWa7FX{+fpg1%nCb8-@8 z9Ya}tyW3{jA2UKd2pxI_`Z3Lx>smQFYyB8pb(w)eIezRrCimewAd$gTgjlZT>%z>= z(j8|{GPS1Qp)yHE#Q4n-?_gglYsXfBmgKn2M)Kx$;B38xXj<^8=;Uvz=#Ww)FhU~N zwxaKBu0{%IsDpT7Atr*k!|pzIckV1ZA&4O~^EzBsQVI-<nY`lwuH912+!NgQolKp$ zBqQyOEIN<-4X5V0-I=&kG$i_CuAS<)73bk1dc3t2_x$znQw&dMn9@;~<aY5d_$9ut zx1(bTC=L-Mxa`0nTbqhLDIHJT*Nxwyk4h*vzO|4tYUJD<wuHU|<Y*`|6^{&ESmOGQ zk8j#pssaWY1=o~OBn<*<a<6h{Vu@_(`ZaF!ry4AziZ)}6eZsYjJCbaGQQqNNCsOy} zlcYvr?MX_!dkgcg1T?Exuli3}S%1=qg*Kn&?R{l!=?Q14V;<E$1bMVEO^a(AO9-Mn zT8Jp$Yy6Q=A+#|EQ2Y|lwnyTUJ>qcJBE3eBnQ1eQMOlihy=oYyfmR~IG8CgS)L*;8 z01A0Nvc&H|ah*o_5O(i=Uo@Dud3rWa!2a%Oa!fnLOy`E*`ZjvpXIIiNzU~f+QgM8! z3vO?SEq77epkO*o2v^Jy-WS;vj!GD^>_J;mR(hbp{~fHJMhg{z$`PF^UQ$}}qem?Z z(sTSwq5kidkibI6AwQS_!xmD@Pv_^qL;|C)G`l@U@iajqSI}s&@CvD>X^$SUp7s3u zEc`?C0I%Aua^r5aP%U+Jb@m|WEpl|+zfLW0b$QA9dLYWQX*bomHk)#vuvnh#MUvT} zr?6)V*KYliH2OQjhDM2@3B1f^R9c9peih$tT?>wHAU6#xAwAL$)Bt{GGyq`nnE04- zHC$zh2h_wkl+B|Jgdp&iQ<!Ikl1q;2@k5>F<^B^Z`0ix1WsxdbLC#XQIG<6(@uH+a z91Cd}Jv2Tq7ZAk{Q215z39w#BYI%m%WX7rTH^doc=z+H@yKM>)9f-^~-+pAHEgB^3 z`S+-AX6r0GPMFY@9^?$e=*_;Fmw1yRcj$@g2pc~_vqK|Aic*2$=>|0+lZ!Z(l*AI} z#Ee>9Cb=ERMD8s>Wh`(2@$4E&N=uW#&L%8hwkS#bd|h-ao;L)y(<ZmRex;pVgSeke zOfw^<ivIIfV5o80+E~+pmY~8=pcsnWN>rc_&ncE0kNtXXDa>3NlF0^lb*(02BO(u= ztx-+Q2MqJF+vf0#UR&QeSayVy)C;Z4_@Zxq$D8p{FE`e=G%CU*?&MUD-+cZWxdrb> z9LqqI5ML6#PwDg?pry>x$i0azl7w-GeK^r$AN7Gv#B~pSlLgD}FUiPV3`pLy4{jM! zNGZ6I%d);(UJt(**~ec4Ydzas#-Lm>yX+B4coSd`VEreiNIq~79(Yo7&<`BJvjL?- zPbG?gTff@NpbNQO?al<LlZ5>b(ynVQGc+-=omg5^$<aBbor)Y;$GW){YRH%{4I9rf zkp+STO(-Z)2^a%BOn|cV@^m|jr(YQG!vgcD{i3uG9$yQxurO?m&ZSBwv14Mp%~rhX zfbuC*NUN}+S4NHIEo=DV)Ut2b1!ppE4N=RjmU0oBVGI}pa)3Ab`r3T<BEk$HTwcLJ zNUfy(hI}YOC5sQLQjR4U>)7b1I`AP?N2_xAp!(iK=30quxiS5(QC9>_L0F6a&SsC( znA2KWNG2WZbed#tR~#HZA<Oie656q6&FZ6#v%%?!s$7qyJMR1bz2^IOg;CjPF9m5D zPRUnKtDLS148TNRyJ~|ItjcZS=rxffS}YVtg8q<_h9RVP-XcjG=$2+4vKHa@&tftO zXlDSzBsmA6LNNKiF?U&<s=oh<w|*DD4OGmyjrN-Rc$;;Zz$-|aqbL8Ha*)ghqwxxL zy9(YXDM*H67oz7dim3d$s10!Sf+Y3vJcwaXj6#BN2FAg{|1h;G3Q4gtLd4IJ=mSrn zy$b7^d_fOTLTkJvlUD-Shdn^IPzBBR-|i@pPcEujCT4ZMLS-YjjKt_I3sg+71^Os! z%cAmABAh2g$EhhJ0L6;>p4~@(JV29QEx$j9WQwAg2283IGdk#A{loq+2M0+X8dgj3 z_?0MWs`oMW$Sj>a5;^4GI)+r^D?;Q%A-TULk(Uor4BsStI~n#?9#oJ^RW%hR^co<c zc^PzF96Y>$zIfsHxQ^q^RkKHnF|af-E&Y<s!5>c$0ijkk@Kxt~vPN#}&U>GXjg6&Z zxo*G}ZRZUdnmeDT$x+Gh&JG%~PtB!a&?F*4oCYeI9c0u*7UkS(P4C~jwz}ZG5pHm) zb84ASn~~?4K>=27Bx2c+Iwph)fBQ6hWbuxt2#<_`abwb^+y+U0<!;hjyKu*FSM&}1 z`2O8y5cxDo@349dq*DIk$7?`|zowIiy)E7xzMhR<8fnOz0M6e-stg49BI;*Rz`yv} zEeM9%HMNt<-$XXeJ~Y$NMUrjZR=faU!)}P&S^F=qNuF49Id6{ZD<#iF@Ft#B+n0A} z#sxGpt5n}YllI!aN8JYK7Zo8a*B9rIHo>K(>}k&w?h{E_S%d>LAsGM}o2WBH#6(4v zj-NwRPZ1cm;$nJ|(hcn($xQ3A$gLEf$!h>TkiGZRC8d3m2#Ean`(|;qi~JCRL_O(s zjw0$C_!em*0oT4tIZyzT&Q3VjiEpXY%%^L1B_Z3Gq9%a{K0M|74JGKMn~p|(aO)XO zeAaDq0YCqY_qsD6tvJ?j6*Els0GeVzhI8X4+|>VY?*l<80387(JJvVOaLFhJ4mP&u z42!epZ6P@~0VQ99wKoLkhCP%);VSePP+Blx7m9in0#H6f!UIAJ!H3EZkwm5-e|snt z+<dDBigv6PanfujcV6F^fU(AG%&9W%%<b{EYh;qVJqe>axUkL&Fw&mI*{O-KY~QLv zcjofa;?x2P48C4~X%{3Dpfhl~Ay?xy0_pL&);!^D3F?}B2FX}2Y+N!M^9^QCB4nE! zaqg=ZshaLUA|W2X845cXijZ41t4~lNT)oHXfP-y20kX*f47l6|a=C$IQZz*cSy-AD zS)Fw!ir?G=89|cHkf{B=_92;n$lOMOcWDr#`7!1x6R6|zqsmn8zeZnGj~RHboFZce zlcr0lFa$DS;(X5M+k|nrhg@+VC~1!(rt!9=rKNoQ7--tcpUzTg{k^@8h=RTbkrXhi zU!W?W?1wgc8kPKER#rureZjX1Vgd>s5Fitbc6|F*QA0cSfU-6%dLVbC@pb^}$%Sns zjIfRwFaPZxBpDgot!MEnKV!)-MO(R_*N%ND&`Rq!g){FwLLT;04EGura-+QQ`nf+X z{qrHUoakq~YFJSwFAW8<aO|NZ(8qyu2+;ygy((FEp;F@w`Hbd-v?%cdUd|&P6qy!F zC}hzCoQzVnY_q-%JNp#yJ=`>ar`Gd|N*muhvJF<xKoA-B@KinmH8<hpu0Xwy_z#25 zF{jJOa$UcYq4mnV#PB0}lNQ1{g#yEwi2X|18`X*#oM23Eml%4n);WnMr-&uDzs7w7 za6eY<xPPO?POXtNk7ESHp&FBb^KP3UTXDb;IWG3>MSxf{8-_{EF`(daIa%4%Bm{6? z^QrZvt6ReOl(e>qCEv7>SO4t~4lswR6>s?y@&y5NPa=)va8d`O@<M=O25E$Z($T2O z`uh5l7Sn{)1BBO#8R-yN*dT)6oOC+ciqp4_IhiA(KD*l{IQuWY!{erry%1uBM04c< zys;5x7I<wUNSYsaDNhebNh|p$ysa6G(s2DdZNwXL4+;hn6*gwz8g5@e7)J#Aeic}8 zT4H#SCEbG_A|LlmLyk_~o7b<6X{r3l2_n#FEr7OZ04BvH77rLLZUW6%At#L|o^Y<m zpDijvD(YI?E>~bE%cCKCW0a~i0@R@&dEv6q^TcxT0Uz&w**Bw)eiE0AC!9*V>Xh7> zqPd0_nm902V-L(<2>Ql^J1EaAwHcRy5kPkmbi5izIGSgdDw67=h@62@xnywwIeGj! zN6wia)E$J!Vl!N&0Zq{|3eR{z@8}BCx+ZO(=<w-QNc_H0(U+>qrNf38->{M*)!}#4 zS^`WcZy|Gm$FXqX-zEw2yu{1+3ghIQr8aXQEP_V-bs3^k>48C{F&=`#Kqr+Q$~pRj zw3Nr0>3-ms3xFKiIXKK>t=4jY<q+m2Ky<wWt4IE+(s6_eR1%^G))<^nyguV?DQmRY z3-LrhCL^7`3!)t#ILYXvv4;SCz(#M{CJWZi8(aim;bBta+IJ(ZqlY3L6PNcAbaHeY zAJzv&zfj!?<PLRmqgu{Sv|D9{0_;FFk)ZMjA84iB!&Xgv%dLQ3TRS`mX17#~8R)kt zk;J)*zYOyVJToT<tB|UV#Hk(U3HiATr4Le8$Z;@Px}aH8zp0t~9Zyk*$I+l5Zi-4* zt|u<mC)2c;S|q8hSR(lX<WP<?E|;1d`~Sh6Fb$9u@s2tM1$PoA+)ol#wzg{InCWQY z+Zy@u7+@-F=N3oKLgcn(w+utyiH+%wt?3g~{=+Uuqg2(Roe?Rvja3!~zZYt~?*ju? zTbLnXfC>@wJ=i}U2yN6((YOX>`dS$7-wP0V6P~L+lpo608(CVz$iY2gtQVkj{_A?g zi0`o~?Kw;(X@pr5P-7S;%}K&`(u8|$qXi4KA5^GNZCpXdHMCoS?bcJtNl7<gm$+JO zY6e99qeThtB22}0T(`niVyNa_#aP=Xp!aOTYJaGa+q;t1IwpG}#G)3I{Ta3hZzwDe z;=<s7Cg0aLPY<PjyIQm*I*FrxCkS*Hg@f4q?dz^4%7|La;%%XB-rV`P-vzVH!%6(N z*QE6=F8J``HFA?tE3LGYKFdkI-#Yf%P9$mTC~LR|URVc-l<~gD`RC60g9$S1kp%_? z-bVV}Ff(ppjM>cxnTGH+dkH4!@-`idQmq?yP)CGrjZWSb$h7eDGplyyfn}3Q>$pkg z0Fy;KdXi}iH50=3Qh}bQ_0RHuOQ7L#C2Sna>U@gpv>d6#T6_tuzA+=Oe1AJgvLmJa zwU_K5D;wJ=XtwhDE1y((R*Va&a28va?S#_?x5Zux1#;n3pHpmmE_p6;eSzUHJ3s#@ zK{Yyd!K3=M-GR4Q0VbHhGdVRC3LFY|bp<I@tEku31z>I;c4`A5U%KN^Rnh8eja-Bn z#$c*OOh!DEa_AyHBnjdzm7L`X;f^8hxRP=BolQ9tD8^=-f4A8n+aWOTqS#RY@N4U) z*+1h2e~t}KzzJLcVGum6c<;JoM3>CMyZzva=ycEZKSh~mY+~Y!-Fs6);W=6QD~Mbt z)moO&ogw!lq5cXlsGjPs$#(#p(E&@jRCy1~xSXX>_ynNod{6q<Q>@|Z5YsWyVP+>u zGk+aGw=ZiQQKr?R<hjQIf*^b3RUaQ8gcx#nEXnN|x`{(S@-QH_kiofaij*r*NyPA> zlr+`v#$4a`tw`GQCT!&cG6+$@2b$?7$hK$Ov7meX5h@Fqbddd4%KD0nc$H9t%XJfz zcLBIUy<aj<)FFNn5YZ$?2cRuLzIHNZC>bTUyCgPSx?D6ckOm@YNH!k_&(!~7ny&(s zRj7My&Ga;1tz2ap<|t}7;d`bqCZQ{xljbo%_UUPX6s7G<oxEq@n!>TmH$@1b5G61q z<*uGG^r)o1nw_1hW63ym0z3A_trA1izyCJxBE|%YC^5YTu!h))ZWz3lS43YmP}2q2 zbQ4m*?c=Q?KovdPt<whKug6-;R+w;0UD4-{qtw?w49AEZ5EtKfOB<|y@tM5nEH@bZ zIx&C-4jSlg5GpjdqzH%s<tJty+amP+8fu(R@EyfBS~!9^(AH)I3Gq&Xb@#`S1x&P! zJd=r11rmt}+%LX(O$Q)cwZq^`z7P>4&B?)vRct5_uk2r6N4N_F*>HA$H4$#`JHM=M zOQpE#>5C1I#;;8goC&fO<>i#A6Bw-Z1)<ldKDJQcz&{ON<pyS)j-p?|$AWpZ@)=qf zqzt)b7rtok<*WPSD5{h$>Bo;b2{0X+nwyij6VqwidEHr2n-OV(DBmY=e}XoH42q^1 z&(;&tuSbM7azc}17lwXQX|T3m&Y_05NP(O8-j8bNo1mv+0undrQdN#4+eRem&FHcR zTt330qJQe)U8IL>6*S}O1$Y@y{r5vsp~)Ar7^jn`<Xsq{k$VDH<7MQ0xJ$E_p!nD0 zM-T_`_QKCbgWN8RmoSR>J=%F)Z*qKUaiEUN6WJYt2@N>hPeCe&*=tBAj!BQASBrkZ z*(!pXmn*HK!VG{u7Q%?LRG(Bzk(GGz0dSY-c^(V2b|XTK7Lemlw^U4t?t?P;?(A;b zB=z^#EBX#~+vqbXYrpYYTQo(ddO^O4-uu@%15}#m67;JS<F@2EA0lfvvosC-+a9v( zHsz0U_4uuvr7mY7#i66E&E(6ZGqfZ*46~-u*%q7(L%{s+dx-+T#clHz@G=5`0Il00 zE)c=mIT-c0^k<y-%lUPKQ{`hS2im&5eg!xh4GOxs@rr9ri|t{0+XghfjKQk1QSH`7 z$NDCgk_dFVsf{R(k>ZB26!hrzFb20{2lGDVy`+6lqEMX%Ek%g1wJvhyLn)`rXw^IH z5I|6ZD5M&4dc1sbB&xn?7<Txzy#7?6wd``mZN&CWV<4pDn331S*+Cewwu4>b?x}-+ z^!{6x7Eb;F#gayk?Vn5cI5!Y7e^w9K7*Dl$-O#JM=4E8&^ZO@h-`0*F`wz+rUmT=c zGjM17aS?@fJVyhXfOtDOJQ3fM39V<I3aVTv$3owIzX5Bu1ZN_~@sQN^c&*LnaK`$7 z-237LYxqydlW^04`SC^sG%~}sgn&*2p$XdtX8;v|Z`-iLQ`6#vIB&n0@y|$KLKpfR zDIV^~qVxihNe-??0K|xiU=Px%%@G2i`tTq+kfsC5EQ9_18~(F*hY;&^6Aj!~0n9dq z63&t^EWp&Nil}>{0)q;gEg=M?b|yMYL2y8_a42SIHB2nUL5=T=nn)zTvFG|rEFNDc z%nk?5p`{;po@-w!Noc2uaJ`Q>DsFQ!FaT(b1Qyeaaiz2!OJWvJwVs@0aRPw~#WcD( zY4(mentSuu<btW{+|<aZ(*rbvzIY8eJfq^wbZqAPAC#Yq3XtwtL3WZR3iMFfw7C^b zOF4-C!54^(SrttBBj5(Xn3@NHvTAy>QxrN047(vGJRa~^zkyj3Pmyi{lVYCd=gdbo z=L@=L@nnj1_%cG@e1+8IEMoAm<=xeCPB78}15(P<6Uhh_PbYtmR-8iNm9;RlEIz67 z{Cp=+oG2{pMUrHpzYRwQ5_k^WQ?H<0I*TV(NGiM!DDT`cMA&FW-1rG(`u89O3Nl24 zZEpF)GNU%LM<WXFaWbQtL5AfU7>gni0*0}BCdd+Ufj|a}8%ZRM8X=Y**>xPzR6vGp zaCSdI;?<o>6KLc7U=7ydRq|LFpPsf2HxwtNcV2&l=+&tOH)fG~i;^LXGw27i)C38F z81B!*C;jsDTJ}aZZKC8v30d52gQDaexWMhNw&EO@%*<S&+RZQ#oJvSYNJFD^lQsMa zj3*e}h1oNoSTKZ^=Hm0$uk+n8URx9SbtQePJwFn7O3>rA5^6p!Z6HIx1;cNgCFHWv zfA!q1e0-WIG#rWt34C}zdU_-hKujMB52E%%cQhj7&P4KHSNd$OUm7ERVcT;bLJ6DM z))-zU+Q4$u%<)!6wPj`d$+R%Idn-VobtFIE8eoJOdh$CyKBm+0&oBXimE_L4n#s#O z*HQLLNb{#WqcR#Rk(E*6D&fzaC9aTen>gxE<L+CG8Xg>HLH8U;>u}{Heog{{g`s0? z5_bJVW*(C{A3*JtR##s}>3F)@D3uaX{qvAGUh(xc+a0J#jl5%Jh5&nLMxAk+z*{VV zcHtuGdwVP=WMa#VI!O8?IlRMB_X@`6*X8G5^xeV)Cq(fcjZ@nMo^%I|y&N<RxhM$E zV;aOxWo;ip*6>HFK{rYaksnJ`YMT8~ed2T8G{!sDf$J=5t1vzpS7#pUW+s?`c}?fe zypz(`_Xd^m46QhvA#KntYeKU43E<-dNUXU7p~^w&nB3j~G3wS&p{*Tg?!k<2k;a?- zCuCN`7Rxn>{3?$KJ+;f@p;-fVktmp(jSH;_1ZC}y{2>+~6#1JOJWt0|CCB4`r~P#Q zfzgVu;6p@tNf2NNQn&tJT#XB!pSL+Q+kZ(x2+hsSwb&Mwn7d_o6o?OL=Tr@-NTqy* zQX3eomugn$hDo78vJY}^n@%US1;Q2Dj4}>+T4$WnqJ2{Pt09rcsrDR%%CO|DFGyn_ zz4$R*usUhdQc@nD0bxVQFpCs6^PRV#UjwQFr49qdU9iJCfCQj$rUc|vYe*U@;bIEu z_T%Ma9BZl`mX_Iig$Adjq*@Gl5Ylif0FMptvhCO>O0uov8owLhf@CB3iYJrQ|Ikd7 zzIh{n$JUOC;n57Z9!NENCU0p_I)sDy8FuMG3i|pH>Fx<aW<gv;3A`7%B0c`cu)82E z2|DA|M3KWd&Zb@d@nMaKA$I!L%D)N(5n+jR*X$f(kncv?!N@ztKWUT-br388l}8_X z;#6mSu-=`^Vmgg8F0P1<f~@fa7K)+3L{)U(1e$&WU|i=#py+`GtBt(D(PRm!k1(71 zRs%dUMndP3v>601wC22+2c$%3!IcuD{*bVU;WnSfw7Y?Eo4aOkP=5MvlMh*x$ksv~ zQ2J~XjtTt2Nj9xx!a?#qWb1vy4iAhAzal>d;g+>%dOm{caHUXq7}J~`5<^w_6k1`; z!C{A3bQR;OY@cRMeN0w=5|N*uOQ67#ECup|3~<r$i3!)kd+y^4Ujf0wD6*1fOC4M* z9>UDh)8fYM&@{fESSp0G;q<jFpoSo_8q_}x3p3DgNk-`6doOaw@QtthE5KATokD|1 z*j~C|HhVif{{XUjVzlL$q#ae=ab<0ah!LN#kyrHi0#a%gVhM(D1xmiIzZ1no7rcWo ziQ2;Paa<-p3RAKs$FH+qiku9RT8zhOImedPLJ0Xn)qg&Z!?pMNO-;?LI@dlE*M<p@ zf;>P%F;>gWRVt<G7wtai>7kZBh2{c#i2;3e2q}g~x&yC|M=0dyEy7QbcYON#+rOa+ z^U%xcRENEI5cF<7Z^$-E%bQ1|NU0q(my42jAb{@eE8ZEGDiR@=h3?n8sM}^Y2AY|` zlE{{_3Wtp-tI=fyF!^XfOphT2R=XR8zuUgViVK=O-><E&f9?!{@yUQbnL{S;B9tXp z@sHfDx~j6WV~~EC0is4#kxrS&dW@8E2JTS~Bbs2|83s0mY89vwN_!qqt(e%hlG$qu zqv9K&RJa@II+nJ1{Epyg`ZBWMkS$A^^Z++iwdu7lNW5-NYPU9^;&d>Dn-V4f?lN>* z=mV~1bux3Xvu}x&_4Z?Lov6R!&^G4O%cwlO)A}V+-9F!YZFoJjb*vOX7lusJV53KK z5p}rs4bzz6cwv@PE$#sg(E!L?z)?Z~@pRYO(189$Lsz7e$C=PdvZuD4kr5YvUuQSE z8@<lUr1tUqC}H+1FJO;KVv!dEQ+Y$diFhCMZ&U|qDAFOE@n);jhk^_$@C-fv`ni>u zuF4%l9c1qas5Mn9IzSn~$G017MO~{<Z5Y5rIMnJ!7Dn~-y%8|r`%vD(`4M;r5Mv6Q z4A*zwO9u|Y$!Unudyfa~IslT3li#g#fh5cy(NMnJG>Ry^??KQgn+6q~bjK3xJGZO< zDQ;nmXDp-gWFYm{S!HcgcwImFZcdri3QI^dIWSR3aM4rxMssnal}^KKH~6yPp+G>v zVG;rgPy=qOK0*-6Ro@ZGh=a;|K@DsJ_q~@}6;)7w<vFT{7YO_n$Kr;3_Q5?)V0`JQ z>(ya7Vnri0{4T4ZYo>MB;ZK(W7ki`-(pOID>tlBVrgsG72tg|MV^o;x7{Mq>Q#)u6 z#^PS1#qh5V0QI$)YbOi)$`rOEUR*XDx(e}D<yyQCvOi2M{<(yf##6F##vGBImT7gt z`-EU~+f^zMc|Mw?BgbIEXaMv3(S(qv3*iY5JBZ?pz3T4X3pBtEky`YwO9HPjJo})s zHoCz}Kp$|~{6<txBAHIS6{19RBv|(cE1?I=1StYIAimXVkNhEdaA9m7(y4nRMxJ2@ zqT!__Si=Ye=I5$LibfAaY{94-qq&-Q)Il~%jbT%yz*D5Nlf|i7g-@(;S}_V?2zza9 z?R&?^B|Ms$oJ1W4NxrkFYM^?5hR^66q1#fV7eRCa??)B_A$|jxctVNdRz=^VwY4?v zYEwC+`E31$ejhNr7K|2}%(hvbG`Fw<IBDRV970>L`r*R|P3yAWH(iroYEVtw`ahDc zJD%#k?;j%}AtaR~S(k)RW=2MoV?{+~k&&#By%Nz-WUrEuQ<0UGl_E*fsgR7KB-=5w zp7*(*`*r<sKhND2j^FS5{e0fDe!$>m^oHe=FMN+l&RCRin7fP!=A->A0)ev1DJT`Z z3S5Kkm8sZv<@Kc@mSIz1p-|a6%66M7r05+h>XHdf`{FEQqDI%Shv49sxq)hfjXM8Y z*Ze+Sd8f=HX+&(XaIv{wz1juAIp*S&M-O%n(wCpOd&E44DL~C~5s57j=7#KIVW>xj z1Rb`OF|gG4K6b+hfn!vIpn_7W!x$V-!C#E1AY8&O$~jd+o_`SL6yMyLZ6HVZ>jcmp z?j`bw;bsN~7Nn-_$GW{es>uk%XEvT5><vKXk(4lW-B+0pNjy^ic^xA|p`0f!!i4~P zwwc(+{(e3PT$7F7OfAY(h$x(sNnu(1!4{IN-i>=9<&Z19kRVmWFIBZ!c6#u3bx>X! z7;$;q*zg}<3^x(wN)6|ikG`c72(FL#=f+6@oABac|4+`!ipmy!U9oesRDtM;=K<d& zoInVG?(r1lSndURNr&bPr10ZU-xbt_G*F3}X}YrZx3Mt{+q<s-KR%k@uY@Bg_<0dS zSC8(e{qQjOGc;Ji@&L;=-XBP>S@Cj(2UVXqi1*|x7TrkCo9H-sK%$0=H{+z$h|Brh zqOx#kR?Y?~d+5qC5;Qf<ZEwkiJSCjpF)aSvEA;<vA^a26l}57{e+MN4<0&HW@xHL) z>mlNlZ|A$uhz++ym;@(|^y4Ms6o-z?UqF=(CAB%#Q8K39;)zcLgNj1M7ws2^E|sU| znLoo(y^kXr9vA>u03yx<T7{p8x5dac3iW06P|b}{yYc)6Bjm_hmndFwx#F%sL!XgI z06x-tQDH>to#-F;QrwVWXDlnSswL%LeQ;pED}F6o2>0<~Lz`SmXZz&K37>uXS253) z^-iGttsd0f&iUn$tR2wp@4^p(_}EG)naOt2+iR3J5QaA2N?3q0eVXd2T^R3~!Oxon z<zJkAPd-VELIxa&C_cvUP`tl_1-V%NG0`Svi?%6uAYD5!ax%}3LFxu)ghsHFQ^9|2 zo}wvwljyxibgf~Mp72RPYtIcOn6&)Gpg+7)Zhm`tJCJn}!Hc(L)PI)Q1$)_qYm>sk zwh~NZJy<yz2{Ij&n+Yd=9Y*w4l||v9%#k!??CxQ%dA#dF@mVi$juCDHbs0Dvx8PR6 zG=0OidfvOd&$SCzb$*XaDtcPwa56XI;ut^x230+T1@c_3adFRtPxCMz&~fOjSF%YY zBNQA1_Ao#U2{-B3kLd=c{nuzm!s2z5k**+ZjVA{-a-5#Fr9JQhU4azg$gbN0p|`R{ zhX@~h49={C^DFD*GLohy$H%2)HTl{3PqSQwog$Kwk(qh1`y4zno>eUB?2u#zvfX}u ziE~3=uAb5b6)HCDQopNAA&LZvPobQB2y-ho++3ZBNRYgnm^_}|0&NKy56_hwY7j~c zr732(=9@pe1Epk;tLtPER4g0(@vXec?Y~n_KRFC+%bT|a_NYN%mALK2=TO{n9$kG6 zOr*qjtnlzXObUxH`HCV+o=n6GJ?Edb^4jzxKj2|Nt=|@|WC&cSnQh1bg}C_&?iyDd zVD4a@9He)uk4B!4p9(du2f4dt8L6jO<r{~Gb65ru!(nxhi@69(`Z-L~cOYr3=b(S+ z1JWCr2)gCo-z@CR7U-6a^Tp;vl{AJC!`z6Am{W~g<wQRD2Mv!-G<hp!U7m0OLbp`C zypIhHp*tEVh<`%93(UucT$}!Pufk{WK=hpr`m-=%NP@PszAIP&$a%?2@fmW__CEM0 z-R>urhM5XIHi+AnCOIx9p3fyLV-x~3>jb_MAZB-MUBzl}NKKCm2r<klz|Sm_n%@P~ zT0J6>5R119k+A4|I0IREIzM9~@@UnjW_-`?6pL>a1=);~NzmXmIJcFjc)i6xlwbNc zj9|=VaBN<;(>>r>f7&%h+lR^%2P3RZ3lz|(BZ)~#d!faJv@G@CjB`1O;K<Fq>F6GT z>YFeB<7K@Rq+$&S>@3nbc_#JM$#ZjF;=HV}c;nLgT=#;y=(Lj_h1@cY`{tXTQLpd# z0J)90HZxy8)_bwko8aj0yN<dIE;NvQJ;gRWJ^ftHARC@^#ACNbXZx1o!2pU`51`&_ zcOfsqQtnR>@X7qt_KWzDZr}!C$|oy$dwIz&9`WOT26K}O1l}*sJv&`uA)!j7QH#m; zLXX-)opLnH-$lrA;RrniI(}PJ(~rr->kOcfPZV|Gk6(H<LK)@KIz(_wbvTrDA{V5r zAy&^8EI_emjlSs#(>?0!PESq-j`gEP`%!Tf@Pm8yRniIyDKCJ?K@YG^$jJ1I2<G_^ ziL4H5gtNM+8*w2p&Riu+^3Lts{~bxYJ%Eldco6B;3EmBo7L}nE5-s5lH&Tc?KU|Kq z`M~7336E@Qwx|+>gH&xm7tQJ{$f&)aoeyh>a`{((aW?yJiB7(AlEa>Z&^A=w<MO_b zL=uBHrTZ22mDQ%_(%Oa%7PtBYs2YSXnPco?hxhU4{{QY#eXFq<Iw^MXNrKUDx;h<B zac#oQ{4imZLCf5|dY=8<<A4MHcSn}5BLKNLfVLT!<p6!CYtLvr!6HX=6b7f^Q=}(g z^R;ya7iaJuQl+I}t`U=1Qb(syRx@215dI&%dMJs6*H64Gd{?rU3}OheP(Rh<V5EQB z{*I`x&m0jqnfbgs3n)>_sBl{QtD%_(H?7oQdwNV#WE{LFVP3syFi5$>8UVx3&!0aJ zLfi^?2hksxD?#7lE!-a4atecJJ9bf+zVeV6UwD(7unWIe<fOi5{5qj^wx*(c5rw2{ z!4gR_L?SWh)6h&MYD)uRJVm&<xs~xp0jS{>2|1ql>uJkSBlw?FaQ+oy=QJXGM`97A zN!{sC;EZb$#YC&Oo-&63oAy6sgAi{F$<s6>fcnK+Y_PJneuhgc8cVo2UTvoE>8qGS zk)L8y+SA~{3n2+6_orCNs)~zIyF6hU+j0Q_R9W}V>e*w>+0`gJPHq2vG*IZtml!N; zGz0{#qjy6C<H<V=36LigK~AiKOl~&6%n|suQmI9=|DSb=k6i+=UdW#r-$^gIFK)Ol zob$;A2syce42~OPllz)sNQ@<%g$)fgwUPKup=Zq$0|bYfBQ(Ol-Q`O_NijBnJ2(n> zDP@vYUVroZv*H&KBO(2f7Lpe$tXl|c(gx_)jX@-y@yY!rXzBLFoEJ{fBcWOf8ZgAB zn_<7l!}ga(^GenCe<vkt%aEvi7Tz|rLiu0fXMc`c>^?qAbc$XFvf;?j{_*P0^C_s} z?7F>M&d1*Dg*$H-L?19~;43Yi07%(3iUceDe}Q!><~5bB&D9Xr;M}w&99PLI+Rhr4 zf#H1X1E7ni!qgfNy19lXssKpn7GZ}%=*VtNr<X%9eWCYP3g&A>oZ*`LGwxFZ^88o; z)Vz4abJ1%>SzblSp2F6_HQtuP$YMl~N_vg^k5{VPS~CvF@l6+v>DWvgwsDaA=GqZx zm7sPf!FaM6JnAo;0^)76W+h9UH&ZQ|EJb*?2;u}jKNBsuGM=gbKa%G3lTCm(#A0UO zgRP%B5F<V5StYDx#HEBetkv!;lP1RQ;|Drb;Qa#xzySNQ@3P6rSe5^wetb1j+pl+! zvSKVZh5J|^pXCVRJiu$4CX9Wh-}(AUfQHRyZD+>=G2wc`8o8U;%}U6lq5niIH?aX5 zX?p{4B1Q*XrFW3>^5@tHb@$y$fbU6Riw&^-OK&fywAx7_P7K!a)3p1)d*m7$X*^_K zq()?(qJ6}11FOT%m$hD|=iAXGcm8NGKi8chMTTn+=^w=F2}8STc3kM0gwA9I#QP)+ zBi;y*F#%W2dfD}}5|RMkx2Z?UYZ(D3HFc2UdF`s3Pp2k<SXi)6koQ4*(do%6*V)Ht zrtFYUHbNLToJj=$-*po0O9gec35kd+3LLsEx66cfG_!gcQb&YPYwzFm0DR(v%Mm3p z##d)hg0x0n4qTrCha!0Z<kvCekZA#s`>Y3>5nW%qIHWUYaI4<{+01xYy@$4JP+MRd zmU`g1&DS3eWW8nsYlYhMY!oMMZoqrXXL0uIb1<7K1XU2GhcA{cx0Q%Hj85gJt~E5M z=_URu0tMCqlNy-LOw9G&1DLLs3w>(wcyGObM^0Y;t-l7?Q)HQA6Ei!=eG<ATHdvoC z3U^<FXhn6(v#PFv63C_Y2m1VhIQ!-NKZ`h|>83T|2KfZM=Vhy1>gMST95I<`X)6{* zeg?oX5>7Y~${^YSwL#5arADA_UJk4SoO}Yzmc6g<SsXRYBoa5xFzTYtV@gKi{*{M@ zjx)*wc=r&19*!j&LuAYu%RN8}AQRmQ!4K^~`xQ*ZETP@)+d5Ip_XOL0BqVqDpoWpd z#@dfDA1hz)o5s&@)`s`Fjy%O>i3lO6&b0`T3Af;1pmJ;fns4vU*3Z8Qp<S~#vXn$Z zuK|EWcSo$Z+vOz2_m9b=B)~~1OA;rXWrwr_p!~P7_0wl6Dk@YVRxIz!)IbILjlT8~ z0fM7!>TG|%6%r5~X#N0&zJ;5<8neLnt%=f0fps@dKPfk6Gd_@+vwswsg%BB*xm~!> zWGR-QkGGY|5rZ}P;9S0bzsH3&MK2G}>helVHV;N8J)`>t_|E{2|3Wyo_G0gr6Vmkr zY%qwqh#+OfHW2^5?D=zo=K{wm9l!%;#icc1(GkO(4r;0j&m=%Ts>m2P{Dp^xgBV_5 z@6I)D1a2CC<;$2iT4EX;Wj*^Ec9x&KI}8g8WacSM4oLnbE@?kfPt!Qf9&u)9##e|h zHVKjk21t$WjQCj#+?)3Las<{GD$IZ36FD0#z?M*S0<ihfw0HeEaKkDHNvKdmgKkRr z_xJdQ0B)l~cvA#O7zm57-@teK5>2BK*;2@~>zTa$^EjrbC>5o{3I#pi*IYkCz|0(a z!7FVLMl|rdW>W!V$dGsAAB06<b}_r5WJz|q_c!z7Vdai`S{v(p^3i9Vj?Gw4j|&xf zDIPt@_)4xOt+UAJSo$X+U*myR*NW0%5Y36m)P>4&Jm=puj&v8?UsXT}&<>8ibV=v( zZ)bMjZoY(gm&58py2lDkenNoRrKq@Xtw6cs01j1StWcNq^GoN~7wZQ!%{o-F3~JEF zO=olSBL*g{hvnI#FFuXVZFJg?$;#geFo7zjYh0&34YCyzh`{2L?3|pK&~S_etUdnF zvrDr8`x<a_Rg*`@ku`CT_W`0Dz~Kp|R{F!laMChzOU)k0LJ)@KhAp16gK`c?RL`b3 zb&#*L59KjaedIKefMmazTIv8|4*Q!-iXIMB@$kEqh9~5{JVn+&oZ9~%tlt6ymkPwq z%R;)&Sa7cT`~RaulhQLK5yke4WElAD71atzG00Z_2Uf<V#ZGz;HtSeqkkm-4s)pPf zs@yxj9H^5|h6!Y;o@s?5s#`*-=6re4_2T63->!92liT=y6uVVvp0+=IdOL}^{4RgP z_6OScKi+>FmMHTqQ8W6l!coC<sock(?Vn@Go$NezMCi88u}8vcH?q}epKcQ8GBm3) zk+^rS*p2VUN?mGI)icWRB^e>vw2W)2f4Rh7HGLnioeCPLtv?4&2%MpDfgs{W+DpW7 zh84rVXjN3PJGLdC5Mh?MM<L?_Aa6^{E(02RBKbWUMw*NZymGt7_ArGH0@TA6f77by zc-(?^nA(H#(o)Lo`}cY}ae_6(Hi|OCH5!~vd3kwwII<xywBccZRtdJYHAHYtUE9ny zIOD62A&NV;#ac;0!2<*LGEx}u-f<J+JUBKtfb9*pH=}@BP<XhV9tKtZUAL|FwcfC6 zPqQPr<7P$}A9HO@&CSwM8Ft;t*R~d4y@L*B=#Ry7_kVkIJodA%veiYiue!k-m@K=d z7K8BIVx$Op;PlOa_AOo|Bxk*nZP&OnbP=PPZ;9@;U~~%Fq~<|$6@jDG0*Y@)5+dx) z?z9Yfj6g-BvOFA5MHD1kJj9x$EKN<LB5hw@;EB98R4GDrzRS5*1oTPW>VS3I9U2Re zXb2V<e>4g5w{E%J?dOlCC?3`*8#C@vuWuLs#+wwh?hQ|}@^|v0{BCbT%!f6Efgf^n zbDu=oYQpD56vI7?@Tv$nOMPmH-;}RG`~?D$AzJelqIM=!0~W@+rxw{5GZO}HDBRHi z&i>GlKggF^&D``$*Qo*%>NK;(EOA3Z%V+>!cyG|Z(fmFr^v7Ba^!3LZ>@kZUkL5$z z5@vH7WxkW}Q#-_DmmMa`=;#SX8w=)h7;oa#YIc<Ux8E!g1xU>ca(7w4l8uQcwS5)5 z+pM0fkyE`s-Ne?a*9ZtkSwTU;e`9SigtE3cu(2QJu8U?1NjMay7W|L0Gw~T+VTsc4 zG&o3>oe1NJ{-c*`3|s_5DK`o+$g8`T1B3IeirQp}X*s_H8DDJ~nps-J*@x*&TZ)Gl zS}PMI2T1e9hAdVDk5x<$Hqt5C1qob1YR6eEL~~dbAvFs9szR<j+M4VUewJN33Hjn} z>q2cM>)GOMAs#T^p3pxWX=}J+#|{)F<-xICkGHT+{_x>1FqB}G;UmlLL8z_ozqx`< zHZDAo>fZ+mdi4X6GAtTU`J*sFNl5p^SLefBZ{A#|pa!B1A)9N#d#^RBZP)Ucp8nA^ zv%IVz-d5t#%*jTJ<~cr<K*ux5XmOcZJOC5uzhPMy{ZDO~i{UR7m+wsMJon_wu_s?< z2}>RXRffSsp;stzIx(68hk^mB+oHS5NtEjq4q2UJ7I(8BcW?@bsx#j8A+N3~<G#IQ zmKgt@U#CADnzr}v|5xULSMz4xXvd&&*!%#^(iZHsNnjV;Jb4%M5y?kUb}JSS;Aafq ziR|F9`SG1dDGfu|=4uaYYkVvWRiIQ+D7nF8D?<F%LI}OoRT!4%)L-&++o5D+%4}SD z-F++1sX1pYp5{3hnh7$qvR1q-2e4&ebrmN5c4ukgfd=v@zWE+pdgIoXmgV>eh&O0+ zCU!Glr^f%_m4kBE^WWu9vVHgL6=s)aE;y!M#A^<pRU&Q?6LxwzBAMirI)|J*0i52u z>8~{&BD^i(Wf;Vh@+(lKUi0%QxY`?pikBdQ^63<g5x_9tgJgj%4Z?kKUv~@3^F-R_ zy|i-MMu4&YW{G$Wu#S>EC*@FQtaTlf4^$S_XTlsTskK{0?+5^QNKUw$q)6gzF@<9| z&5}UYgRh~vU?toF08})_v%%y0CwF;Gq$AQr+6JfE^4OJ{$z<q18kmA7xE6Bp$xEpV z1@>mPG1>G@QaPBZE+A2{7guBbH%D2-B<XH~qpiFS-{wXKvcnK-jSw-c?}(Fr9-XWi zGm@;S4RJ<1fS6dYjJ*g-fe+A{nr1DL1XE4Pwf&5}0vyqf$RV`M>R9}*Ny-`xiuE{+ z45$(psB$Nn!>7qsMOQQUc`zts=p(Z(x^*-DqMuDsZ2KWmmQz*T@C2i5^{7+SJaId+ zkFxM!lw^zcJIbE8cVEKP6#X((iUTgAXHe;KM!#-C4}~~8<9B`Gcq-xv8;uHv&|tK! zGs_Zt|K>+WGvnjKTj~hEX$*N3UU#eS$PmvK{dOpIXeJrrM<3b!OeRR$QU`kpftsd~ z3x3;mPN|Q;fIMs&T4oJ>laP>51e__xhF3>=dy5A)s}jsnN-Rz3O1yVQp`^ZVzw`RB z#!04@^M|}@EMxMVYWBRLtU~TIg?2wbNR2g-xY|L9h?=DmX@5blHcU-S1WEF;hJ2my zQC)tuqi)*X(_H@OQK62A{7y&tV-N36+`4GygSTL^Q+7?EqId19W*t*jhePQjh#8}2 zHz(SA%=jw5^Y}jS&?%KEs!4(@>&Nl^C=bi?;^KXD4?r^<cmG()^0N|=0|!7<Li>80 zlk|HaD>HK)@KfyOYhjR@<>FRxKsu_WW&7Pzy*L@5exKmPLpZEyj+Lzm51xW$mrTyU zxuUKX0<C^NCsrlbFw0v1FRt}O7LVlT*9nNPYGJ0QePbvZfjCviRBZ%75sggeM;&Fq z@#~|2nJ8NO;@>6dGjxQxl_10d9nvxqZ<6BbF%;fl9h%|c9HxurTYEwXenK7<*L%r> zD9!=cn*J^asvP2Cc8bXkWNL^%_Ru}yZ6#h>3v$^KeUJ;ZQPxw7D;t0MYXi<&Sw#*^ zRZvQ4P`@A#*Kx<x;?4Ls9*{Njfr=z}Jv2-PJ{sqgS`O7Zgj=7-it6iR4>gz5tKWE@ zH1psqn*UgF&8OKW1AcqL%Y0pSQ7{lC-AbxyJo-B$5wj|w8_^FPyNT&M?9hU=VGV_O zPP@h1K7fd##=rR}O&~@CzrV})5eM)zUC(oxK_o~n>94Q!T}Z1-WN45lj|+2snr(v} z@7>#rrI_EOh~$%B!|bH1+Dpb2-E{>%*hw4U{KlI?A9^)7SOukaA8@(&m-eJXFz&}3 ziZkh{letA)&NZ;2o*o{^sNxv(3&v0f`M|fs&>kboD>cu<)6>&QivI+xlyh4-yh>_n z&M7M^zuZEA)3;vHk5B|r<p!>wE_bIe+$imUoHtSn$JmJE*LXN>nr>sWqb3jOBD_pb zxL(&pB0`<=Qih|_C6=1)^Z43_6S)GJc$ChdotDovH7^?IEc~*oy@<S04p?A;NfA{V z>pdO83u~AbE=Sr%UO%P|!ET5&N;F;U?cZET70%MnpC}^**T=%bxU~DOAQLs$6d_u$ z@GSJ<I~Qt_T4%!@(S?s73Gm3CNZY!LsTUI-o4$3x7;@Ks=g>?yhgLD-G}h6fwssD( zQ21X@q~_&vX)W)C?5zW1H4w|Rb*T7UB;hM!h5q@L_M^GcQDhr1AS84A<;4<4C0<rg z{5UhQ)I)WA0mlbUKs*X4qnm;OI>ZCN3;b^CVGCJ>z4>vU>#5he#L1)g9)c|wi}8$u zdvwA^O8%Z;E1tBszdSL@P)%?Zy$ibZ4ZGYGlJlJYO`|7l3|RxLwvQH9g5a9G3R4<n ze|)tl=DZFMDlCNm{$hp$DmXs4gj@|sI_-FxQC0JA{q^QB|60Dem9?w`No^pp8xS>u z{F#GErl#9Dt?m%R;O?PqlB(F+<XhF_B5ilAZG>Xi{F*4RWny|3aGU?7OKpe#3$)>h z1l9fwujqslNGW1I858P>0OR>}AtNrh?hnBBm+mVU)9F~Y)#Ae$h+kh+S1Yn!KQ?2a zvTS$9WRUZUAPy&29)``UhI3;0mY`}8jS(X_T9Wq8_)75v!b>!UQJamQ$>K#JKI122 z|I$gMkPlKU)IP9*DHzwCKx3j5QzYuxzEXs$d~wF`u|K{QC<s$hbNQjet@ivoh~yWs zQR)3PeG(`%+|cJ|U$Q4`h*-SnmH=^H#~IsVX4$m|2RkBY+JPBCOoigLkXMvIk58;6 z5UH#1#ct>r-S5ShIx>32&u?dmIP|-XvhDwwCDvq%vYMK{*}K-c7kXIcP)H6T<XT_~ zx1qJsBL~tx;ACMKf$R-Xojqw_N)@-naR>t3`d>Ox`)7KdoGJQ*Jz=%8^B&i2?QNj$ z#S*5`%aJ`W)hokDpq@ufKcJ=l@aD~%rvp>eWCUkdR|yn`UQ5k0%keHl2-5jt#){sf zU%hKhC6WxFnO^|7UMJG#smjjiyK!<JK_SraGyuPhfJYdY%CvGUOjAIh`hByVQk9qW z{2{;~oUi=;(YtTU;LSWI{bKRmEKyBR3jjuI8m+G5U|~212_Bj?8Vf|<J##Lv-ot$T z9Tr>G2SsE4&agFc9Xp)VW?B!o?k|=GSz>y6I<<F$S>Y9e7A3uF`a%xq8k@66%taWj zu_1vBm5giFmhha{0Qe-0{li>;6<jRx-q!!7xz*|Z3qwA(AH<XX@H*WB&7T7C$!@5; z?u-w5zGB%JcTn9z&?Kw4@icD)`S^Tw-Bv7qQu=KDJ4#?Ai#5&JJg3w2>fLenRn&42 zb5J47QB5p_$h^_F*u*~JOxX2C>OI@hVMNy8)29wVMDnogthqS%N-pM-q*%mDaz6hy zfS8)ePRIK&>k3?Z1T<1?^T|Ye@Y@SOr4MybZkLyr<8^eXUrwuEp8fRc6N@?_{`Elt zEuwHdJ(stg+1HvpCvGGirm~#YeRE0wSQisZY^6VrMl5Vne6hKx3Ix^^oHVlBi~;-P zTJXm9`hmT*p1)#nHhRFGm{y@b8&qp0DH@ZF_(RMmf!bVeo;#%m5oocZ=BUO%Kk~{N zm-Yut78->5+Pb>+OBjSMG)bic48g<#6KYKMSsd0Qae{qlY}F#m=0hD0MCQ7kG!sE^ z?t&CAD;p4V{O|z@;;iBPgZNfr;pnTtqjw(a+H<(8F~ULVdDp(@JkQ0G<gy|_*c}iS zOH!1lKFYS^&>Mv`Jh}4zz8Hai|FMHjQY;tIVX1i!3U25zzE>AY>R;S;*3vQ;UP+{K z{ReP^g`TzyDnUdC?vKg7mMxkk-Ud=@B364p{@VZ}JuQVxE2s_y#FsBWlhie~PW<I7 zaBr|>s2HM?01}A-X$DSa+?bx6nxxpHHIYWkhFE1pfc(UASU+&}Mz%bG9Ye__F0EQ6 z+buzx8r%p=BDgQNprxjTU?|>Z4CKUjX?oxCYM!9(8a|?ut}&`tLvE%IB8)vrBAFqy zgHzHhGHzzvu%KcUw7mN#{=o{<-wPt_jEvQV$2~^h1;3ZNHN3b&COjaK_URhyV;B2* zhzSzdYmE;Mw0V9jdFl_9cGR(lmo)F_8IHq9bA)=_x)Y9pLEqO_GLj$sH=kg`pf>gM zXZZVD5a@lAC0e6LX$N#+-Y67|-K%Of;iY&IqkTM%Cv3UIE#YeS-Gf2Apysi{)^X}3 zg<AX7c(qBEh&zW3_@`l9&JtFqlAfoAMO~Yc+TH*y3P!opHza&y7ml&cejrYY>;^ml z!ncr(;aURT>1R%<S8yVF%kE+l+)!j^)M06o4?DSG`u}Z4f@=N$F@~Q@w5R4IXa17^ zkf;+fw0q!B`-cy~mw-|djXoO~yo&6$k-C9@0v0E$4z{I24rp&`+JgM8r%tKlp&3nx z=rZu6_P`loXU2^a6@^uG!Sx1PqclF|Y(Jlx*It-8SIh~eZpb<I2(AJynpI#Z^*E={ z^EYkXDLawvq=;#)9`S&|vwk1$@H3vkOZy8;dze#d2>AI?Y<3&jPT!`Ui=V^QWS%AJ zk*s?o01`ZeNq3Ai0nq|wSX^E0j98@7KG$=|-I-|3-Uy)ndq5+h-42DcZESE*Enx0X zC-f`9@TZ=zF*|}AJkKe$i|`&ghe~13iY9QGHPwY0iT1r23OmbQ&~R<nsxlHwD71v} z=SW)#Y{!8Rg;c<Fwgw19X5W?b_;tcoAiK-<lXH(WvGmK-Vu<uToz?jn-_;R>6dkCa zJ6S*6VJ8hRN4xkeHL@SyF>)r5iiiM5K4srfXx8X89^Or|?{U);^yMa!xm!G-%6nrY zMfJJZNIicdGiZExK3;V>{_D4I=0tLt19UeTdcqd~_5myIbCtsYel23B#*xJ6R61GW zes)GfWcD>uR@0yhgaLQJlq(kk46V71wcvp}WoahmKcLQsMx%8XYm~laR|vdyYj=7l zgb$^05&B0cZ;0eM>~sD|u{+rI3eyndX$#XY$>h;MEpk~m>SyrYO#0Mp#~%Zra|y+& zUH5c`PeSepF?1pL^G8fPW7qs^*9SnhWx0V#=tboZ3quBL)U_!uMd2o?G7<@J8fYGN zdRt`T;QOSuygoktWHWCI*a^5HyIs=pUc*t{wY*#f?Vdd1QXt4KO|-9t7J6e14ws)_ zy)#gm>Rj4m0$0mMqAgFBNJ~&fZ#xv>wy=F*@MKELqO(Eoa)xcPB>}$zVU0fk^e5mu zAJSDj#ihm!-vwJ6Wp#wcZo5{>=4sWGJij0*p63lhDnnS%p@}G}`zHpm){}cWubKD@ zF{?=NRQhGg@kH+Q;FSX(5oGc6?nbUH4@Gk%OGi+rm!ZM_fFpu*>1$qU7~OZ1=l!|5 z`cj#fbqCEYd$V9u2=b;DA%6b`lkjD;uN5#F?9=_U<J*J}bV<4;;z`icxZV2+yZF!8 z^*^!h$kt4>M>Y)Xd5C94y1H;`UJs;NwXNdsdZrd1z1{~56Tfpe>>BZTP9e`upTfgA z1Kob;h~M#ivY8X!eK?wiEidpi!z1_^A@bDzHEJJU^ANbaBQ7k=MDk(6gs*acU1g;_ zxMBwPo|0|!jR)Fh&7XYn44LaZ?$Gq(<A-bv=-SGBBQ&da#b;$fh6Lm}0nHLYsSDO4 z6h7`omS3X%m+HRBrPg>6Rjx=teaZxuK~G^wa>i>=lL&kq*NMu;a>pq^9!N|g8gb!m ztUUe1i1SuJynW9>SQDUmB*PU>g?D9SN_WM!$RKQM`M*Sap{S;P1pX^*Nun``8;~$l z`!2|B+%<2lBrm^Y4%Gt(y{(?n=c`0=4#CFN_0BYD8*3E)(b6*dghd2Hw?TC4Ybh3F zo@sP>H<mnoD5zT-%`$x+&#y6bi80x}-r>?J5QHF;rj7=;DH0Vcb_yra4?2R?Imh+J zin^cYY@eOOteyccc5uC00qL6}0{T+&MloI$rQ|8Vi_1%>L)WteK8K)BSFNqAs5#r8 z-n`ia4?ISL>45r0D*Zp`w=O{>4<O3}^8A%5M_K<%@RwSl6%IO<azs>xEKS=EAb$b3 z7~YkbY#VuAa{>wQ-i85Q*+mpb^O>54XdB({fQjndyno*g=Ifa-`q!c{fEvJzP7bkz z@r7+h-Ci|)x13U+;0V4<$ik5MT4=SEwK|Js^JPV}Z8id7DFErnMo(J-)Fjq9)klj< zs~+#0%D+F4>I0_wkM{0K?-;q<B0~dl!%=15>ClPAmCPu%y)PV7*O59;^5l&|1_DA@ z_w%w2{YtWKMo<JTz}ZemK_t#xDC#;1iPm{}-t`1``Bf|7_~o(q_GsF>pJXTOfz88T z8uHht2KMOl_fGH;0J^nNUdE63y{dSqm~p3&<b1{1`5pe(uK+j5818&2?Q#(0FSVc& zXD?xTd}3m)MvZ^^yeQXSXwK2j97vv8JOvCKsNfwOB7w85B9$Q<Dki4S5DR1s|KO3d zKA$QJEO^`>Iy#=gkRPvO43*ap&ni)Z3qQL%N@*8YR|A1sIwBYmvU>O6dh7Jm)SsAD zpk@P_<f2UmhT1kZ{~OJAx3u@$dw3Y>3Uc7h+(p>hAc;Q!*Pf9V9H7HEFP(NAB9Th^ zTz5dd@M84Cs24{kjY!OSHUchZ;A=>0-Ab0lqZ&ocN<~q@9@gU*<$1-z)YO37b9GP* zOikAohFW5^2(m_Y_ZF<g62jYli6Q0oPHB%gwdv>P8~Dx7)(?bS&W>9#N@|-IGE1y~ zN+O}VNg?zvCgkstw!T3s1MRvoUq%2Q2gSQTe!|kUDnroR?oAu&IEA3-P9(yNA6Gy$ z1jFDXr(JnY*jV=Oy1fhYl~2xN5&*^$0Pbcdh2wFwTLIJ|VOQjdY}9&WB+&CrhUE&1 z%_h@7Zb7-<vo(<`@wjs95x!bLN)1?<sMrG}`#519(#aaF_a)<qK_MX;P9Ri=fGDvK z7vbQ4_3G6DWH_bc6=?62twnWtGTI+;JKCJTn}Pg|SI7~#EG#6SR9joS)v^nl)%bIg zg+vs%Mt5EjiGv4gHw}u2<kL<;TWK6`_;h+6Noa3NUY3=W*>%jBm~Pi2+Y!`^?)TtS z@-6(O!eEGN`9bu4m)U77m%x_-t-0Rd7W_Ke_WId|8hK7`uWGQ1L79*)$6;bXS$X;V zB4PCdKFi>hnW2^uOq!6N5#CMCD66(hy@x64AKKyNw`=*qn6eZC{G*QJwsw7Ui8!7! zms?HHtM|KBti<vibq0nz1ZU*>=;-K_H71J(Rz(!tg^%DB!9y@$X>Ly2;xPp3+797o z0r*T<V8kC71ETdG_s!ZwJ>k7DIp`x`0#pu9Bu#3b8)9K4p`M4*<`p$9Yohl?%MgfT z)kydy1htEaWZBL9=Tn6d18W&+`}Z{w`sSJO9vRHU%t<pIU9j-$k>|R=I`{nYoS`aX z2au0!jWuUCzUA8JvMo(N*xl;aUaZYp)dxd+!V4r|*1xu1i#%6FB3aW-kK&ewB3Znm zck8R1l+;vOg1|#T5m{)XTvGB<R@w(v+a<}eL8eArBeS!!)uJ&kQg4j-DS7ROaaxK6 zwutX9{W#%OoY}8ByC3}p>)}qRRj@ytNVLZ{3B?k-_otl8gU~8dKv-~&UKR$VQvs8@ z8^-}v0xWy^g1WN<RaaW1Su_Hy7#J<I6@$^+Svo%=-lhml;<)J-m|Qm_!sYa{(_q=D zkW?PRKX=1SMn^zuHFZgJqgUraW{?W(YHN6^3ZU7>!~Z_vz!~7CVF%6>HvIBDi1qgy z_Ci<eR$?(fKVh>14!bKgPnV_XyJW%%f=&GcVC2}YB1mYjO@C;pgUKH+Pd^;c78Vv~ zBP#t+=lop!<f8x43dkg|+LwWD!0N2TL9hNrmIw%DiaKxJO@se0aOS3U8KoEnCL3H( zFar_AD#%XXsGYF7KDDv_to7q|@QW%baNASiSao*npzTmd7qB!vh8{iBx%@BkgVv!) z$T*S9LwLcJY^M&XKG2o}_@CdkwlW=(b|%awzZb;oy=gb3@RLZ_P6)0?6vDrGXm6k9 zIjO&@bl}n68{3j;Bc%gh10=r41i^i`sH@IEz$XL=&9GGj4lR~Sy<ZRzy>gU|>z!Cg zEF3$Ie#X0bm_csybWqX-b+5I=?!AJ!3_!y>kMz5(cJu`FAZz0SgdBZ$o|7v(`4{F* zWPRE?+zTs&<4Jxkxc*ev{C{916bKISTfgCpJ;RGLdsDLRF#~Ow>OH~H6>J@~aG-*7 zy0kDi$EDnH4t{o|;+N?%G>XJze}=XJ=&Eq5=MKQ~OKZWzIKjIwJuSOXfgAxcmpTx! z@hL;vSF9vmU5E_-TUtiEbV-zKJSf<E_6&J)pWn^cI+*36a$9>p2Hb31!x$6@HuEb% zZBvWZ7ir_8R1k6;1Hei5+;D+-TMC=X5<&IfBh`Q81|fS79Q5^_j^YR)Yk*mB01w=$ zsk#*jE3}}1ifKZeK5Ri?uQ~sGROP1s@i1F-6v$|iGz$g7b(x^x;Pt7I-@k*QxEA1H zLFCC0p1X74OW-Tu{ghPo60h}X$J7r5<VIAS!Jwv!S?+CoBaZFrrXPl<3hv_tkQ}Bg zznz<#!-TY&1(f=>iI^5mC6h&DHUv1mtOmDuG=*lA|22$If;wRpY8aW@f-#X3BIW(M zaX*&>GgD0(P+TpzeB8p)5<P;{g81W@&9;e%CqS`ke>M>~<>fRKrQ;~4g)by(e%^b9 z3k7b4&&5{|X5#kGV13wNef9V6i;nWVFGT!k6`G{NW3oeSlSi(EQ8Pv1n254B8~7+Y z5dv*rY7eaTfGtiDRI#sPT&<gb=C+L_WcCrpA%_}2k**Mo5MV1B&lnec)|cJ2#z7>H zf(H2B+k2&^Z*nlAi(`D=KT9&H4bo2B&B~$W$Up7rIk~w$&k6sp?=Tp&Q34m2md*zJ zxV~e0xRtZ_<qo)lK=z@E?ojAIjLX8jtcYDCR~K$Pfm%NSVJrZG^8oU~r?T?*NfBbn zb0j1sLneRzJP-eB0Op*pkoa$HlCnVjr-@2dMMh@4))7r|nLET5^M;~jm8GTEDgdg; z^RQSQRZ`lG?Nch8{}y3dyzQG&F!(_namYr5-S4X`(RZ=$>MtfM1Z&d_hd@VzDI%Od z)RqSkvL*0=Vg}0E5<ZQP)kQBUo}3#R8SooDky2-lKyOv$7w7-LwQC8m({!73!hNuJ z7auYz5V=u=BDw7#Z?Z*kVJzU~XeoJ0jm5)KIGQEHLV<-koo?EakX0_eg)cTLbiScP zygztl;s%LS2!U2~Qq(&;X^0L>?9CoV?_$Tf0b3ol&)c?*{i6+5bAEP0la!t^9|$BN ziHUwBVw~-oPl9Sx{!XbbAzPFi8rQ_Vx3!DnmZ5G14+RC$B;M=WII8ehqh0kXcnWEu zw%IMRL?oB=BV8gR(f&5PUT4U%7&X!E@bl+H#X#M|F+~HiY=6+AWg5SQIQPuYo08B% z1tWB{UeSmR+vGL^FB@<I%F)ab1+&C+m>_9G6L7aUgZ9g@Dyq5B<MwmYC#r&`aI63@ zhAi<E9&<#s>oYXwV-&>1XMp_ogrUk?qA~bRabo!x$t|a;8F6K*1jV4n4*2V4Ha=P5 zdsPK^<X2xwuF^t`Pg@C;A8mrSaKw0i3q>R<ZW82?T;BUZbK)22i?f6gm%3S^J*-Z> zIj}jYnp<0M4!wG?jd`qky@IjaAWl$_BN~_M0mA>51|2~TT<cVSkBt!QsUA>=QYcp( zQzKCVttxZ)a6*n#wJndf8M!PuTeSXd$#@HL8ZMJ%XEujSZ^rsluOcUR6`qm}kZ-fp zT)>}x>n-54pi!cBsc#9ti=|#7H4oZloV#=G^55a{I7k?ckLNsePv`E!v3q%=ZZ^hW zRO|n!`c5}o{KVOsp`gnQE&*)s>x>gtCe$W2DIP<h4B9(EA`OWI{}iF>9Ps*|gzeZG z8n*i_L+YhH5rt!5bRvXaOWm5-L<ofg7YQn1ffr}bgZu!Xt-<x?2LK@WK!OlJy%AnG zb_UKNMvds_v2TCl$q%l<j}eGKVP9pmYJG!zc%>F98t^nA=y#twYL*@%I<}M0DCP#D z@ZHqn4j7d9xtL8M8vzb60@qmJv(u&V?-_5Gn~3#D_wTUsr2)7KF(jT2faj{Nvb*dn zdV_{Q+zBx8d)D-!-o(&!JMzog0d@(5!U*zfzW@yZmq1WHd3hPSy_;cbgJ=b~y1AhZ z<%ZB8l_5+4Fprk;lN*OVO0mE%wzRf>&z5JGmeD+BSpO;uWZ<RyVVilg*dM?K!%OQg zPe{f&Jry&=wTzxciz|xhetNeuRX@d_nSeZ4B~x9pY~0PuC&Lkj40c8S&hBaDjWR>g zC9}kKND#xmUlQ2&MfSEy-O%}B9e6Fij!?V@0;X!4VMBzr6Va{ZBVL@R9$kJZz|nUi z*Ha|n1VSzw5r80N#BPQihm&4?0_t5^ViD5#9ax%tzx;4tm3yt(?Oc9ibsJ05-S#a& zjqX?p88-cJr&=X7wt|lr)QtmUETJ36!+ag+W8D;H$D^>oqtv!=3@QLI$U4751OIw# zUJ)5df!K2c*YgSKG1<>!vJH{p@%zu8w>}0}Yb=pDO@B?jR~|_l4@F}Hbd4#~(|0is z#~@;jOg;q&J%>E%jJ(Y!q*Thvn!YC+qIAaFl{umjGG!B&YA?ACr$0@9AcdHA6K)GC zKXU%LCh~PUK74oqJ98kY1>iL4c}{#_fK9{_ZsT*UsdY*f{_x?0O{%c`9i@-nM^S>d zfUH*`-Rd_bPuFUqpRV9G<Ig&iJWOlw@jyAglNkFRN1&*{MbMK5eDyLep}hf<mSG(u zXfGn^#>pOFq!rXv#HWeCByq^!vEd<VeFuyC=vTxYOG%!JQju9!XyekF*tUA05jWp$ z>wUxZI)a|9_cM8%Nnc2NM3L>|?&%p0eG3FA*?CTr$$34dTyGQ=6{}B6BoW(6Tvy+B ztg@(c+h9-FahNz}U|?_@^W@p6rbd|bUi&KhKrUJitdA;|D?;LsBxh+H`V@=L-U8h3 z_^9&%V|PrpC|)?Z4hl8S<98AS)W~zdd^ohldWjYlsxbOYG(Hv7<+tU6oCYtz7Rb&d z{#5I4)AWFJ5e|MliAaif-Kd4f-ua>712`Y?f8TLAa!JX$9yc}yeEciN*y#fSCGlIU z6hvgz3!5?C!AsW&O@b?arMC*l$T)TZR|eBW-$}3Z2OHA?e-=<JuA5qb>lSgVWqdCO z#`{QGxLE?S8%e<&Hi+$uU=PPU<VF=JZnc33_{EKNKY#yS@msfHXMy@aLg1}b!jOD; zz74h?2x(_J@d-IF{Y>MT<vZ$6uNybL(Cbz+)mO6vl8GVQ_caqg=lyMYBD-YULvZ-) z1+5C7iXu`Os^Q-xNL@b`hD=m0CJ|s3f9CxkIPJo4kLei0au{NrXOu(6pfLV~LF)%b zz2Cs>!Ge+}e7r$gb$K7POTC!e<MP1)sAc^?KFoE`XbkZXe}~Ey?*_ZpHk?C*=QTB# zvSi<%<angwrw-PHXdpIa%`kn5z%AUQjIx#RY<GS0P+TwTxLfMG#@@Kgzb?PjwLXv; zi|Je^E<*Pwr)W$y@wY>*6<hJy_sBt4Bw!0fW|)D&@SXZ2Xef?<YpnG2Wv3(Ny@%${ zoI!5vMZ6Q1zkQ&X?*J^|J*2+}A8w~(_vE7PN%cpfBp^$fhcTk@GakSOiX8q6*BV1b z=d+=^TZMsqydUYE2KqG}L!~tmNhblZtmBMURZ?o>aO}sbp=nfBtD1BD1X&i@d7_yk z1&HqZ8Ea-`1z2&BU>N-t+aSIb0bbVL)Ih?Kq?_rXz|0VFg2Bmo<(5uSFrrmA?FCa= z$P;M<49X!|Q=r4+I}4Ev;)4#G5vrz&iJ6?0LO>N!@3D+y|6)<srA^n=E#m~6$L4X% zJp5n6)DQfMd{>tafzX3?9C-GgXw74H?G+FnPR(i~z<1*dJ{6O69XdJ(_%oT~dK;u} zmEsZ?zT0vWT52$Kr^OOx5mh*YeSh{o5R`+o7i3tPRNlp@k0YB2Yd@&p@xNsj64c2G z!k}Z~+@&<<BVv!8T}P{%&K^}*I_pvCw}ALv|7WMiB+(WDh05A9kh#yrZ%&15tl+lC z<!ZyzjOqdyBrpPSA)-6i7;2I?6?O9m1AiT`ZWMgRf`a#tGPt-s0t5B*#du;{fG}cM z0Dz6wI3$)J-4R=Rm>L0!Kk$J_Rl?e6wYsvVLJc0uN>9)6tonZNQ<iW^n{zp{mJtT* zC}djB__|2GinQg2!g9iAe^$q}5kKs({P%Ra8UOBG9o!6`9<^y$il@v^XZRuXlf`nm zu(xBVxud;b@t%$$fPD<C6F$8!$gnq_OM#Ca|6qE-_X-F$!w5Z_IAqqBVmEl)>XwDY z+g`cL3*PhMXWl%>AxVWxsZh2p4`dl9gWu*H_Jn&Zt~<g;icy_CSadGpc?b$hCPERN zgKW04(&W~e9R!c|(}#&qAjdVp&jzYf2F1b9NxJ*^M9K{Wa>^1PA&C%%WGvIc^?R{4 zV>6HrUH$qsaX$}>gg!UjDYEP+5`{$DJVW!GE;>0y?~|&BfEvlAw{B+N@T_t{j5h|5 z#U3nS2Qc~`7|w)h4-u=k3CV<XPMPhH7@X?zt{#};EPJ8S+0#Zy2j$0os(_0Vh|ndT z<_~~DV{n+XUPMw4w&3xtAfeIej3FP#9d1BCJLjHh$K>K`UC`0F#2E^}rUg(!h4>cE z@=i(6DvQYPoDb~1@jUy}XxY)B<n&Y^O<miyTJ>_8e*u8NQ?q(yrDKui<+o8ULg?G= zX(i%qfKL$k2;~EHW<d(ohoYc~OH0LjR}SH3W#{asikd0Q(_hcI(Ihb^Pr$suA0vRx z0Ksv6*mxI|%tg6w9BaO~7%~+w0C{kA`!xZ+{UuCfS<Bx3{slVs67icZM^0Yk^qn50 zu?n2gf@(mm%NqbH4w)a+J2dSpBrG5^sKggqV%dj8ew-)jl|fwc1$^v+e=R^uNFfe` z2}RV4gas=G&_cL2(P$>11xH<*_X#5tgp_GQfsS_r7}o-BtbFe#DR{bT(Ehf?hI^?) z*OOCj{(`A#5h4ptf#p6jH<O!WbqsRUco74}>^1rZLMS3kj=)a=rOio~tF=}YSWOC) zT}~g}$qrQQCEA<`5|`g=%AGW1up658uf;coS+COb7c;;KdiCdK6j`Di#P=#y0gHtL zvhAR(1@fG#ah~7C3zTRN$Ls@9W|$RlRN$}vLDN_wj;o4V%1h;5JVXWfVtdy^5n{!( zB|SoSa4~pl(S2p%a!q?F1R&I*#9SzT21&zL2ZDA$eZJ6vEf%vBWIR6GIhe1zT-aRD zpraiMEs5@7MOD>`+(bZ#$vQ8PzdAEt6tc&9_2-U>0NuDppGJ{b#va{*VWj~dz8*P( zL~^gPIPx{6>iv)MDvbz}cNAr4adZX)VSaL#r~knpgo_%djW2Lp&<L2sGLC5<8As3^ zWsIq`)<UAUo2ldnaw(CP74UG;zjmQBiD&YE-A3rfMH;8iWr{NN1~xVSp%RTzAwCeY z)$7skXtFj|M<%*;r6bbc{#ARr#;J9mNlisXB@g&x0LKnzzgjE2fzmjuz<Ed!IaBkt z`SnARyljDL7I1BWkbmc+8+cNfBl`Ta)4gv;C}UW$U+C8viarJeik%h@!u!^X&;>Gr zA=kHBqLuJo*x-nl%^xXZl51Xf_{1s@<Q4bn_x}niZFv}EiKW)TO;QaW>9=i!*T$Hv z1i-Z*(2Pj;z|QOirGV*Cl*OaYKT+}~9hYer!0!I?sj<Ynb<?gmWPL@*WzUuHcP}I^ z@C5*HdO&i13WgHEFpfpYynN^WY=eCO0|H!b_!VFb!0!T&d1TW*O(Vp4Rl-$?$AgNz z(b+wk_pkMxs$GO$p5C$xp#@aMF;t?x-MOMMw|A=IY(1wUxXB%@yWrUdR{9swm_~h7 zabr?lD%2Mu*BDzBxVZm8OCf92c3tS2)XB2RdC_>=l)8^{G2dG(>xY*hewyT8KTrWR z1sIMWjn_6qo&m@OhJ_{A>JaYWx}%Rv>s~rL>e0U-jc)v$TkZAJPwcOnLPN5E)%%}~ z)RKNh?{+)0U~hCul1M+<Hm2E%0k&5>wl{<3vI{%2snLDoDvM0ib83Lcd*Za~G4}3D zD1d+4_0hFrqCX9z3z%HmM0@I29C8+M-jz*X{9iH-8@zDPN<lgQ8f-a+bG%K|DKn%s zCmh(c?`UokV;NJNV2`AT*{TSa(n=T_x8J;ff2%!TB%dxO+a;hP&*{iHFc1x3Tji4H zrl2Kf+xkPt+$5ijDV?rK3U_F^49nZLW9#)8U<eW#hB`c~9h4VG>hXjdpNz{m5F>yj zDq&qqA1Zww^h#iSkEa+^&(Aq?-oC=g=w(@PbO-$@y&L&CTdB8;ae>{F+h9bfKarLZ z6*ETv7+Ds-%kdRersFN}?qW(XDll=m>?_F8cttNrsWT=paifGtWATFVY@*ix(#;uK zJQhad=u6s4ZUHR?^n^<C?n%3BLwsez&UbkJcJDmKZ^zQq{p?7Sl*_dpEgs##T&Y0x z)Z*T>JU{R3h{xaow*nI4byuJyy9lsRmq5Rm?AK6SmLiV}7Bj;c-@toz|6wVuNvJF< z(_DW)W4G_BF_-;4V(6dotc}3`wFY-vb>BF5-%gfYT&|~~HJd2-vbwPM%72z!mu2{! zRFCG@y+Yl<KF0lKYPw;^zyBkQpXUDWF`?VeGA0`{^Mf%(fOa>+Zkv#E5{`eiD-j>U z*ri(5!|tM}W%Ob$Ww3J~WFrWt2ryaPKmm@rkCSnqf)ibEx$bL=@DvC;E(^8Wt%m}7 zJ|Y0%4f)`3-mU@iID>9A;(kbu2@>Q=?j1WW?^Nm;eoI-L8$A_p0eN;w<C{W$>c7}F zO$}sIP}moZAOj|NK>AI<-%ZIZyB<hj2G>Y6_)IP0cLX~RbW@j49MmnZsjTFG<K>23 z5#=M8KM_vH^tBNLT<3((1oxhu)A7{g%#VkOyRlM+Av+;X(9EupAR!~)y5sl*hu2G9 zu*3~}Dq!vT7U=7#m!XqBjj-{%3rrx~al?*B#eV+|X)ChysV$Oqhw!V4nmvSJ)AHb_ zc*3@l89fFu8?&z$f3j;Z`T2s;$I&*y3}G7ds!D6EvP3W<H6>dau1T>pHSbg1I4>PP zIPF?-Q&WJ()D)=%sQ4LQ(IU;DfaA<U4hajn&jHOu`+#ZEm?9Rsdpd$(h#^(V5Yi*d z&Mv>Sd=syhf~-jmjdLZTyCY}n?9C1tadpusk1wu-=?F@nB+p6ytzI7^k-nKuUD>{0 z=Pq;>@I{vF`7|u>bRB76x-a?d%oxJF?!D-`(&V|Klq*W2Q==dBU3btg>${3_pMyj) zV$F-Is-i(p^f<YLH+VtYQX-Bs>Ox4!fVM;Y$kg=o$NpjAT6gHA(=#(Ma$dkDN8L!M zvxHK@Z94-C&`$#!>x<NLW(;m$R-B*kr{KM>oj$~JVK<5z>5(W$O)MIi+KW(`o><lO z<hAc3DpAOF0~uVCt8t^W%7PUnD8{~z!V2GUp)})&`CmMeg~cGI6yK4It2l13uI!lK z_?e0IviD#I8nj|tG+ud=fQ_j%#y!9c3E?Q_x@K&6sqJ|gK_?#<N3>asbK}#6ZsP_v zvlYP#>LT~Jb!wo$zZpB)Znu}VZZ4We+O&5VM~}p}c29w>E-OW_v#cQ1ZW!J%Qd-a$ z&l&dbPv?HPjLpDo{DUVg7Yco(y1B;hTg^H6`1-MZo3)HeoKj1ge&DL<9HBFv{&Z5Z zN9rY5D@>2nNs>zos@L$x?r)W5@It`Xo(%CBz1k+V`~JZ(*^il&jqp&MkWQHcm2+-e zf_^^JC)zxx^8zj9I|eZLv#GAKW1jFaI&NM8)B;|XQiDSs8O@*j`ub?Jj9k%p`*(4L z%V-m^|L7@lStGiwQgj3ZkvCfxvQc-?*2>zti^hv4g2oGw+rLH|Lv;G}h!|wLLj~h= z{VU$K#TE25;@xsa0Q>C9T4!)QyzIq`AC#svMXuTO>cFl6J+fsA%7v(CM8?(r;>*8s zjhRrH`?YtVK4dTcJ488?Rq<~&;(iBIX~e}i$nFYz-p!<vV)Am>c0b+0l2-iO-6@Y= zYigNu(dVjJiAmo`HJQr5V*r5-^Kf#Z=)09LH5-I$Fu?66At5m?x%MvMK!gM9U`c}J zI=83izMHroQ3F`E<AgCy92W`(!9USNHPIy6BS#c(<<^+&ROOBq;akFYx%L^ij!^uP z^Qu~<Sme}q(?ierbnM@8Y<60S_8ZrsfZx_6#aAMpM&o|dzNZKxV!Z;B>g_BH$biEh z1jA49%a<+{yD~e7QY>_AdsPI7wF%E-$AE5fB^~nP2t5x8ElS)GNGu7FUg2o<9pH{I zwEl-Au&nu&wM|5_>sr*t^xkp5MkM+<Z+wS6?gy67BR{`Mu|P<ON9rLq{;~OQJg^Ey zAsmnEq2XKYOX8A}&}(`r?m>bJl5Ow@!t+Ld!=!th>&<efV+0C6HvyLb-x|g71KKBW zm;M0(X+bz;UGgVj4e@Jkj<mgxpXerdBAm$p(BqnZ@FcYT3N0LCJ<l)jWoJQP>+?bY z#PGl3uUZb|qlz5ypFtP`q0~bRr34BQ*a&NI8Bzhuctb%<_IsYc_V}*D9+BazJc)mA z21%SSlHh<?gRY9Ib3$#9*Re$Vk)EEE_IM6@8W8MMPZ?NdH)s{RKp$Cu8yMIK{V0l5 zVaL>F(2F|xHkeZlGL>lvrexXFA$df~em<ES2RTO!t{?cC^MZB>7sq4q<-Tc41(Tk# zv0qkH=)sEz+H>an_w-*gzIsMnQGm?g0{j6+1UG$ZUX(164LFJn4~swQ01;BpmgGnK z{)!*%LbO$vH`w`a2Te+TD<9u|_-vv#o=u+W!bKoY$4kY>YJ=AlufRshN<g@h5<DT& zyKei3^W$dm(^*CP3<6RrAfFn=X3&Db4R3JB$cnuUYI_Bln`O%F2-Dt7O9Q|xfI?$a zk<YkzfG-xAf)$5}r-aWY1Y-x0VHx6A-e?`kLoBWQAxV`i5gX^!i-ugebbt2p@x6l) z3CZ|$geKVebL`C$G3Pm<h8aKXF|rpJNWN^*e}pB18d>&<q3GFn_BwKU<j>z-ui7J^ zUuPw1{6VW72Xxq}NBM=-hjC`myU*d*V}p4WC|u^Yw<RtzpVs0-J;D>VYi+Bt_`vt~ z>zFs@4@=W8WQgG5T)>%&og5quPs5nUfjp4NVh7kmO#ZL=pp%1Vnu4EfXNz(~UO z`&pIlBg)=kcenvnl75P&D&Q;FG+wSP^lC~Y{mzcf;YQI<s?V<IE=yFF>YaGQor9j! zN_?@uaEk3QOFV398m*d5nHwd$A@S4}kU(|eg@Axw)|b>7_)wz&J%UWcFq=FkiJ2wN zs~(8ShHeG+Z%PM(tVXGs$9cL(o@8y;nt^N+juU!jv?ffXG*FJ)daB}aLqL5{)_*bK zg1T5#FB2U4T+bMqdIM8lgmksA&vgsh76<3%Oh)7<A#R%~9bPOIze&X?p!q0ExCkEQ zgJUpIDqPth!@}KyDQW+k&f!$nxSWN{eK8DTYXqa>3*D|34%>?t3-n>6t+Kh5)w(KJ z$qk?4vw|vY&`>-k#o#f8#3J_1c@cOpHh!nMiHWx@h)DJ}c`4Q+VC{k@Zw0<LSDt1W zvMd_{v-4qcDIz&v1-kqPSyxSG#i`8#N^3a7p&|HF4T$$9!Y+E>E`kOXU}scgj~G(p zm%<ibjITpGO^?b_N(O97LrARob|nQX2n1RWJ4Tewm>veCok&1uF2~o;Ohob{=*M8g z$;Kcg&k@b_)&WWvY~7euk3&MwMnDzQRn!w7T=_6U@p%$$5$|A0=T0IyyLn2hR{PKY zJxi8FHvp_6Nam*gB3YV}3EHi8pC&s>#kVB2ZHjF{QQbAjdrwzc@Lg5hgXhFel#4@T zP#S+>0Vc#~T-OKL8CiBlwqD^qvx7biJGBE%*~wgE;2#EhWMu$zL4-V{K`8TW?x27U z;=d_jX49@~JTUA=qLbe|jUE$LsI%R$-JsEhn}Al%Bp9)N;X+vhpm)*R`!EDStuD@b zWG_Irx>)Kh)!B!yU%!5jM4HE!{{>mm;kFV*h$EnS+zqXY*7R;W3QFb@5TdUw$Weet z79CF2c}~Kil@PY0&I|hG>Yb4fVZ}Kbf=DcJ!jxcA4c3`n;4zc&d|wX`Xb1#dO?49} zO6CZGuS&+xq_nmALURxR=V81p&+pDh$MYdp4u{hmVZ}!g$X#GUg8V;A-+Y^dg|tQk z<>ixssTM}#BiuJL{#Ms{`}=>BS5kVy%0PFk<$|*R+}p|d$Yc9(@E|z^NKfbk0VMF$ z?luVL*P-Qxne(U)2#Z%(K&TqQKh>^;$J5FK72-E-(vE{Ls6CN8+jxc34@~FYU9?bF z@b1~uGjV4m>b~X%5+5)H*r8a(f#>(a`g&a;^zM7wN-FUnLo4OV6G@Gp03g}@orB{W zO}Fxu8czm^5xNdj9-oeMi;l$_JUe)57wYlYiNJ7g4$xheNXE4S;X7QX3wv0jcp2%Z zuc$6wfkF4IwROvg%A&%`lHQR_;DSBi`-LDpK~&p0EXp)ZQoO}y$Av7r+=#>1t@E9B zfm`>{q<x;ig=rEB!@9L>u(4FYW~zQe1^RugbT}LjJoT&!eAG1-J>j#GJX8sn39<{d zkh*(P2041RJk9VXsCdcqBB0?a&3B<)OH9Hv)rCXD!>?6T!024Sg$Wq7tI(2a$cF|p zMD*DGp~_c?obvVdPSA0fI3>hXakZu|`A?p0>Tjh;+f{$e38<i=&aw#N<S#f6u#pV6 zK@YsLa3f0-PvHPOh_fueL>z}26hhZqxU?)8!=)~morXae<3J0<U^B3hx$tO%n&Rt+ zFBTslsPD?FQ+yaj5gG*;&k7~*R7W56q&kjH!gnBJ<r7X&v&)Y|+KWhxd?$0Mq_$^p zTvuW20$mvxDRar}G*m2+Oy&w{?b!%x9GjPblBWlTDBoOTTYIxSkagcVH$@+fpbi+c zKw68Uv*n+S{VO^b|G@wJALve+Anuz;ZboiVKG|tuB`7R!^rN6%6fl%v>9femqu(Fa zX!8K(XTWa28b3m-cpcCK)+d2PDcpZ`RaK*bcSd4yFjZ$A4d4c1eg^i|TKqyl>(HsQ zS31i6#U7d&9WL&PyH*mDRa*%M%=ZMvXwCDht1J0V-`HwHU^l{S+yuWjc;%ght!9Y_ z37ydvFCp+biPIDL-f4tC+K(Dl0v2w8!e&sLr58oH2`Uh1%o3Xt?Xk+m+M8XZDh(Y| zzrs}uD|t4QeZq|4QDr3}6shB43C4bzs=z;+LGYLZ<b;Z_=253kW=6)QCaI_5Z5ozc zmk@dZRzw@;7`s*{R4u1bEr*m?=wBhYq=3ZEqGhB_re(j#Ba9phdx8uAk0&MK2H=QQ zFY_=UCCNbJ;m0P(2^OKoysMQWY6p{N<1n-=DyF6hw9}8WML*!ohiKt4oN&$O51rF` zO?i3Q1x5v}XQ!Kf{>%=V+yCKIMel8Qd6&&^<BzoC*}-ZprF+;Jx?~?<E`quN7_K(q zr?=<%UF4j)FaoE~WjO(}*Ejwf#*_Nu8+~Y>k_u=NiKNmAGK45k5psa~*jFXuM>wKa zfvbuE7yl{GV07}$kO%MrriO(aX<mXaZ?t9|j;|?XoPD6w$6DlAY7K`B(?GqDfn#FJ z;7O>^@bKpMAsbPVhlMpz#o7y6Rd3z6805Ery2FQd`ZN0;8IOYobG5KxP2ub4(HaHU zo)y1?fkU-R_A*!?h`K*D*ta1W^qVAu?oK2JyfD6Qn;aFBogUd_tNF+%Ao-FRH&8yB zCrFbNKbQCmV%qincZL?6QeE}*6v%OcdmfYiu|a`z^XlaH|Bx9PF5dRXrv}g23pE?# z+n}bru<P#z;23!IYK6Rv40%s%3t(qpu^6bq4I*RhAS1rPIrVb$grj`0`OpYoX752G z2$xpah#$xG<)g6p`$K7+3m&j$0(t&H=_hjak<W%kc4shT>$*Sqp|<rx02{E2EYSFm zN#=M^MnQ1A6pdL%iicKAw)Ci1DkPG>us&=GsO_iyp#)td^u`GC4(K+BECr*41iu6x zOuEj%J2Nmqq@Ku?hT}FMIQUMZP3R8mz-`t`uXZ%!!+|_0$3$%3uG@--iIi;~h#*pE z|38w>1**n%Z{Kf(5LyZ$gj5JgQaTACN<t|lQIuU2(m^UkDTh`?R4PJ|bBH8KNJ5J# zA*m!u(g_`O_+Rt;@3F@>_88w<)SU18Jio(zUw3tLHC5bK^UgQs_SE7rrkjLQ7g8tf zrUI5R8Yd%4aE_&_Zd%Gj428uDO*2Qm(YIA@>~G{vdx@uKuacA5>t81^?9RYew`*7O zl1PWu(T|s&3OkXI&^uS1kCbiR)zt3<T|Z_~fhp+>y|g$Q0Dt$9<92>A>uhYUN9Lb3 zvDSj=!|AV(tFGofRjuIjPTN6?A|G)NwZTh~-IP`{U3jxdDH1<o%iqo(0)g<6jyB_k z*={=DlvB1fb=hY596LYc1xKm_@egdO(o<7OZtx`*4JX~DOPADzhZqn<E?Ob}ts(y3 z*gLx4F4}To>+Lw$EBHtmL>ix49;&ye{Y`dO)+p3#{W-`^B|G~?JJy&a1T>@d=iUeF zF%bq65U-Im!LKzBM=MR#keA-T<<ph3{z1=wk?dPtSgFU8{`}E{6m~Cf5GSB!<U#wR zf`v>hZsz{Ln%=cW$iahIDJYsmhTK*7xrKqdDd0zhxDk-Q$hgO}Tbk)P?e?8J@Axcl z$QhqTwG1P!SY6tA?kcrjK{=MT#Tj@22HSk0@-blbn}7MrmDR#cW)S&xyEb$4&qi;w zHTG+7GZD_7^rLje;MD3V;a5!zOAETOx1eI;tAz{CSn%`xV{D;<tEsx>ZwLg|GJVJ} z+5RkGt(oMm3!d2*h$?9SQo;5vA2n?5EXoYHxkEWFWS5Ums+qZYCiXxc6vk0meZLsT z-%PtduzbqZ;=k95wq(&=cdxi^{f2Dwx!5;WL9Fa9|MqQ>qE{ay88=_wL&&%O)fzlp z)!f17HC8%tA^M&JCo11}*WeSjy=1DjU%~)o`>>LcEhbOeRdrq6gN*Kw8j<hvQ2me? z){}%i{hU`qJ!*jv-rvh}6qo&{IpuzKc6Ujjq8jbO8VU;N`bODhl#k5zqEjO){IwO7 zw*-oa9!4Vjs;H<)YzofhzFRQ$_!$N#=jryuQ9L;u{TO$dS+6vb;Xs~wuD1ObwhbT+ zGmR~t6U0sV5Nt1B9qsrc(ni`%$7Ou#WHZq~aDB#>mMBRl#8+w~c6kbx?_z4|L-&sh zOSgKmhlg%_miHS`l8vQhujQtoo`9jv(lpx<pQPG}eKFbj0~kQ`fnv^7%}#c=y&0Hr zq^#z(A4QTXrQpaDC%bU?tOclqu=^uk!HcP3PMWKcoS`P`b)@p+cgNnh3=9qJ_$>!S zJ6`3fTpg(dsDmk{uFc`~dGx>`aK|@U?jg+8N^R)OtHp6lyQTD|6|kLPm7Oy6cr71v z_bc^7We5dfDA?fOU48*x34^4<`4)OB<f?$CZl{qQIBH;?J@;-+%U_8jl>_Nx<b-t= za%+rus{b`rCN$hDL2L(p$s^%nkeI>^6H<9+`|T1j6pEO^U#Rr%(os&3nk(LOxWH=H zG?N|U-*J8Su3cI*!b|t(R#YJ8?|o{Zq7TXhK}uzC-^113&9s^?Z{3>7xGFd85^~hK z|HXdgh}O$<SFk97g(<W7npy#S4gBK9V+?%1jUQ{lv|xDXd<3C4jHVuMzL5I8t<tb- zV<o!At$hOnc4dw_r}_-cFEW{XVM%UhA9y!?>8n;Sf~oQ42`0<uTgYM6!BHDdoE%lH z|F~b}^1(H=cV801eP2{_0;p4@cY>$Hzf^26-Etz{F2yrRCYaJ-3l;AIy!SlVtkHTh z&l9_ZuGD5BbrEDn9bVvS6CKZYJXWNMv$7v)kF*zw2a?`_x@rql4f|xOTzNuLa#T$6 z`y}VP=bU3V$UiZ^yY|XUhC%GlKzz;w7y(q9aksQcGfva&ubi<v5TpPco!n>c!l#v! zivE$bPhWmPruZaA0$BmiXDSDaj_?Dw6pSFF_mj>oH;IEJfsnP1w1L$eQ(Tgd2pb&} z@QMc^Kh0&yb4{~(Q;*M^9q)&`K=*n4S}qnZlAqXIa#Z4ZYZV`EdZP_57j4--=~yIA z{R~2@C$&3z{Vtvuc9#`AO3og81NMAAAvv4lGN4kMvlGE<riRMwEeX}{t<@IHkd8vE zs-+mdvfn<tpKjXNZE%ve-LzJ_?-;Ahr|XA9GO>$bYAc;1e|6bEa#d@siwK*SaVY<W z_ni5Wq^k7_woh0b`D;usqeWoqIX>7AJi);OWJ}f3@`6cXVZwOaRRTrmPiJ<VKe175 z*B<_T2bb?A`6mgfse6453URu0>KR+OTgaIw%zBRZNIWf%kAFXQ2-Z*hSK9|Ybip?@ zJAUbj<b0C)9<xL7#}Q>XZe0j?U`jN@PLbjM)YLj|tZ&G2*uG|i<I-p0$r8Q0?a{2) z)I|Ps?+@A@j&eLcioIQSM#ga7=U14$<s|KaGyaY06~N2VpC4^C$`{geFarNVPwnsK zw!T-7z3By2TO4n^_ZDW5;pn$>=gyyvUSH-Y3Knu=akVa^r!C(JmY)Q3({|lDKX-fk zvEtL1O#%lnUFA2sg0v1>k!B?`$9D(-4lkI;Uw4aoZq;S05WPZ1TQee+_Exvezg==p zV*UUA*B|ZxWHgMQKZ&pA_O76_{d3_#+9l?7Yc1p+PfQVI=x|!SD=Q0u+wf$5D8gPQ zxM!qul~RkoC&~v$z`soooqB9BnMGE{7QY}*_WD_tUEezZ0;~aYG~o?&z^y5wd^lh# zI=@SqLLXkxlTDo8KLu&Hm8vNDGxZANVoa5h7bHML>_kZ2F*P6wx)Pvh(|i4nCOZQL zv*xC`$6)|1i^<T!NTnhPNzVJ1+|Kb-AlPWPB9ZEsKOiwKE*Ekj0<ohk1267NMHy*t z^VZrzjyv{$)YH@s`;mjJj;{KH+%Mq)w?ZeAV+X((@&S~f{%tD^f3NUYlbS0x2j60k zPCtJl{?r85*yO{^`GE}x^qsyJi$24~t^M{*RlK^oom(MA9dm#K_50nQu$H3fAMq#? zI6iCDs#W1?1zUQyZccVKh)qb?dQMc6oTQpdGWfmr?-$91o~JgHoQ_Jdy3W|*>4y#a z%m|p5oI#)q8q>@p)3%sx-hrg2vQ8Tf5<`-mF_X)PvqQP<Quw*KLi=aKUlRuIwDs>- zo@X81+2NV}x3ueacBg9_)6Pk9{ni0LYt1$6$Zh2Ay=isPnEqFBs;G!A%*Z@R0{+Ji z+8bOkZrX=JZK0E$<6#FdmB-Ano;edAv^$d-5n~smKF?L89uj0zy^wFaFg`I+1?SWG zvU*+RgU_EM)nUy#jQi3>{)zm9J1mr|w&zqgcP_I#a^lj{&uU@g-XD6#yesqW-NoSx z&fvMbm!$eQG`(~4l!Cj+c}XC>e*1O^y_L9AW~m~^W_2rXxH)!Dd*9_FsOCsUkWfT~ z`<?!Num7GG>W4<?eBxtzQ~P^(SW<gzazw}=YE;Ifkb?1Q?=STIIz#bJ7#l=WWrkX^ z93`21=4zcbnb1_ts_gOACcSLFWtS*hka|RGB&qWGGfVr=L+sr;z3jj;iQmlrf2~8P zj8EdZl8VuKn_c=N4o4Grp8f9Q$NAa{;xv(Jni(-6QaZrs=3k{>9Xyxm@sAmnk6zyM zxW*?MdWi?K0}>?~5@|4yJKdhu$g%*-o;btN+gs<1^M_lgis6$F$CG%F!jxnzxB*|8 z=L};DTRr#e=l&tN?@CKw2yXY8+n${=VTQCUja#|*r->%ZcZtC$hZpQXm(8^7H={Cp zMVUJ!A&+JOl<nr{ci-;9O2{2n<Kteuq{b?5uA5puSex8{q2b}-l>8NRn>*<MFl@QA zCgBctadEjflgF44rJc6hNZcb0Z5DDE{FVu{#-mLlpD$BYnjH2TyWJR|#vx*i+o$_` zMzWu}o1HyvyFyBY*E2C(E=hI6;<FNu$Pov$hlZc_82NHaYN{?%T@N9<U->lbJAavU z2e(C>?!s(}8u8RJ)s@;uGPS(BlmuW-TY4V&3e=JCDFa>IGpM?)qaV|s3}n-|{owSO zGaX-RW=)X_jB|W%fvxp*-L68MpzvI}njs*;g-+)z08sNXHaWjR&kmxt`DjDGj}Sd3 z%1ckuD;xt(&~dSh<nTHFsUPYkd_r%TBASTWPy4EECW&U`D9&r!KWyE4?}S0SX2&nX zdaC@P(?WB^vEjkjsnVcKtz+2Iv#_}_XMH)NB=y7s+4V?S{27U)ILGppuY!Ci9?D}D z-59A-zEz8xUi3@JTwtx&y7n8TE!lO+%Bq9t*HNOqmd!2aNZ!PuouKDE7s`0w<3*Rx zt1gZNs}g|zcMaW4JRX~#=XsYR6s6K1{XG+Iu$(l<VvuYIz<QiwW@W0b&}nt?9EZRw zR=>l;^LUwu;He|cZHN$9QfDw||6C6Xxt@Fz{=FJ174oqD3=FugDD}3fX?p|y$ou@} z^W==Hno&CJ_^i6s{OlzK_fad@=Zu?5Jo4nefy*}9>>4T<C4UEfNAgJOWvj_LGiO@z zB8k)ro}m?P{FzxF#$!2u-fox>F{G5}*Ft?)8`^iq69gG|#rn|&g5K8KC4{gXIx&$% zFtO*7F}1`U&95@|b*9heZ|SXw4xMkr_uBpYpL+bOVb<J?WEY`knp(+faCKpD9umhL zh^c8?5~=h$Y&y?q9?dzd{=2ts?Pmb*YY+}66nt@6T!)GwPwYPETL?)HS8C&%3t{F+ z`nL{t-46V-?4_Mj;xVo1`W&&B7wf6e{G{b<b9niAdj^r^i!=r!S$kN~Q0$f9zeaTP zo6@EoCAGiB?^b=q@~z&Lt*!6=Rm#WzH40W-ETX6V>~pz%S)%tAaAFT3#x&pkWQpdB z14*iMjI+V}okk$8sDTY18E+V~fya-H#U~+U8VXg;21XmZteHI^UqVmKl!K-E0=1#J z6oI%H#h74yVF|BcP_i=|iMwdG$^d*(jntDP4+|=>?d|RRXp{D{pBOo7D=yr3^D?pR z4In2&Pj+aRY*><&bZ)u0na|XJ?5==f^rid9@y81$5Je)MaXQB)Lk6Br5kMl-{n;Z9 zJB1~Im;b6qU#=C`>$J+!D=Ij*Gq7pKKajDswDh!&wxw@(xmffN`t%yA><^!{f9fNu zWK(yvuzC%R&Tk;Y{5sX>Y#+Oygw%CB>6I$~{j|GYA3H#M(Zy8@^$N|g$%qHM=#6=@ zK*>J=mUQ7n@`dygSHjgd`1_AR?KLgCBhBh+aS4$`6T&_lGoa6E{d~~B;@7V?39e>} zo5)yWI(dJ5LDRuN#RI&J4>Vsipg%TN8yaV4ZQa1ChK$1*2c-T&tO}~s=8MV);`Q%~ zP1OveTD%hqQPwza-mIcQ8OZv^GTJe!ZdV-DOms=z&q-lPY@6?*A<{2=^G5F8x~m*C zLt>Nr!*GB`;_B2IWZ2phepSySmD`h4HDsR!oJ-we8|}Dj_io)qD=qH0jOyk7zH*y{ zOmOb$br*~LimSHUGVjlxC%Re5%iUzYtO;e~cY3$3cC3T-J@32)@nM-=w)yE_PfTF6 z7Hr)I7o^!6$w&*X0+)=^px!+Z`!8pWi~~_Z5J$)IKPGawaO8L3KP2$2D-3{)ANSX- zeADm6RM{H{ejP<v61tEJ)@sQ;<(YTPqI5-=fK1gDEK%iepP~h4#)1VHDfB?L+^=^K zfTPdC98RMHqMEZR333;qQAXu|S>+tt)g!=B@VQ;$;jWN}k9((D!C(lNmpNLn4olkM z?IZ;tBsFz`w!&z3EAQ2%hvll{A=_$O+*r5G|L^N$T4r%M%!*OP*kXE8S>m0pC%A@; zL^tmf#<wIzq#4i+4})&KczWOYd&z&;Y|tDN!wto?y*W~8z=0iF@k@0Xv~FTFD>H|A z)4Q{gxwQGhyMx_dUgRzuv&UhOi?Zv{v(B*z>#kNO#>BL3$XeHJVQJY$(>eXs0@-6` z<06EJ0C$CjL%UZ9gF>Ss*P<VmGoA@Eup7Mmr!&rXAGx12R`7~VHlAS84k~dkH$SW> z2D2>~#VCUlGj~)U0S=J}uYg^HZqH>ChJ4+jw}Z(}#Fg5^T$jVy2*a+@Gz+qq|8}>l zi#k<|(Lr~G{<#6q-Uhy>%h0p3mZ>__-0iwhR__m4WTi-Rv+%J`gNmH-ep2!NwLgK6 zZkJTxe^6zRVVVm+vhhykVGPtcGMRr3<7^4z7Y6uWxtQ4*XLfSI@}Ng7O)=64?Z3YV zyHpZ*Tm}vvp0*@XvLLOYwXt%{vzpR(?+$?RtU^gC=9(wH`gTb*EDjqt>J8R(_jA-u zuf1|Q+3srqz#K~GM(UC=`DuD|#a|&jXqxFN24^x33nnI`h8SX$o?`81Ez#@9J#(Ay zxdBLf&w+^q^Rdp6X7F|s;$A$#&M2zd?g9TL=GvhHv5wnogk-$J_rApRdcY@a#~)uu z-3)cK5kbeZ8*1VtCBqWF6$<}7w#6O@NepeQty^EB|0@88$wbGO^gQeX$RxxYxhYd> zP*9x?YL!yHJcfe+UUT2r<O?MwCB0&kcf$n1a9v}U3FobpEL@uGC;SGBm7}~T4h~ft z5qz2%4Tl32CZpn`UJ2d9h5F@kGi4-C_Y)Au<FlYCup@*t0r?plmIgiZB=b6%b~a5X z7XMs1>DD(lZOGy)nD{>V^JkYs(?Ffc$DZ9(E8yd`(u&iUHNK7r$jQ<&6ZrtTEZj9i zjbGI@dJT1s9SVSCJT|ax+qT6;JKD4EoIdp6^w9Y|B9$uGmA=_mZ7#b*PM{9bAnPi^ z(I(Haw>QrhZA+)ixQNygO|#|)gR1&k3qMKPlM9$g*7_gnuo>Rn2Rf{hoL6tr96{b= zI|1%AkV|43I!gJ1a7o8vR_raTAhq&gvuEGH2gq<o2&4*ZdzRMm0XauDPv%y(4c+lq zY9rCdN~qtxawAFgJ4ZG3y%*`g;INiOC^<8<Tam%S%q_pU9>)x<l<&yZv8JXZR<<#g zJcK#sZzhkJR)9>vwX*sa4qvfo@7vv}V@8dt;m7#IyOWPOUDaduC@4l)El5difm|7) z8aBHjv00K0%&5%o8{~sudBl%3S*2Gv&(gAjf$=oFE6D{_?RyoazA{xb3ro_>E-OSo zSDJo#WN^hD{QYUn0BGKsql7ZfoEnuc#q%x(AdC(d3z4S1`{J|pKv7I$V)df)jJ(Fy zWJZ0P`?>YxYfUpMW=&&@I+g~}bf1U0$7^aX=$DVTB#ZW!jP;1dVWwxdmwOxZF3+a0 z#DUfco@FsFm}=NuxAZ~Iv7hKVC0<WU3@Ck0y+RM^3-J^~&22WGorR6h3$9yVLJ$zi z=gHM>?5Ht()SSTccDzeC*Eea!RY~U(-$V7_a6r6?fu_?lHhC74+M#m-lFkF`?ZD4= zxiO~DcR_{s{odu7?33>1RoZ|=T_)$)*~hTe2>$t&rX(}VNyp-mlgi|(n-BpvsN8b< z^09;M0-f%o$ni?J9kd?V4NCC}y`l*wBlu9?QNQeXxG_8~xi8bl?HLL*j*~8&g6&P2 zxG!J5-Z7z?sJRSdiyxfp$X*0hey<<&sd~(a_s9(l;r}}d3&{-rIt*qax_Fg9MTI6k zLr36F^(`0Wj0dRnzpz3^^4PojUPcdIzFaCPXdn6OPu9~#4(+ka*Z-&K+MFb&bCWT# zg)fa-J<bg7rCsU!_s%iN!&g||nkp5TNliqftHV^7?$gM!=n@h%A_}MTG3Bw5fb!x` zh0iR)g++>+LUpuKe)E%&+q{rllf1njxC-L?>KAJ_D9Wh!+y9VHco>nq?Vmr-Wr|6s zKk{PgYS3*^^ABNxNRcykC3tZa+ou79(gHM76$}Gz!51x?KffYu!I>EF087oyR}e@I zl?-0F*PkE5KY3LSKp7P%qsAo6#0Ok-62kF|L{9B77-Q3)iSr_Dvm8ycDL4gL%avAb zk7p63MRu4{#G*qICznLZaTjbD7vc3|d&cb4)URBSg{J86_(PGC$o|PfvX58t=FZuN z`xe?|-?{Uz*vNkRO6}l)c2o(+V+bnxx?Shux~t*b9E<{2sSRB*-@*Zd`dbe9O$0Lu z`+6DO(a4v5p!B|gTL(O8HK=%dm9Am8lT_b+|DGxtfVCOkMIzLIQ_iuI`Bo3*Ro-*7 zfqAjz!piNDIeV0&jILW_$yC1af(QDyIk@6p#{)76m!0LE&;l^Xvlqe5n;5T5X8DuB z{V&XcdIR%cjbvQ)!p079fm1Up&g?jUEQe!Z^B&;{%NA$wvvAz>X-Tw3heHOO(DS@V z^D-sO--%&Ki3WSVCvrqI>m~X(l<!3z(+KX}*3K@)uVR>A&b+^!e$1;&u4HiSrVNre zE**|xijB`_oRa@zOI(oeusz!T#J}K-`2g7@FmQaRmBNLE?(9x{VfAI!ScXK&Tuhy< zCEb%ccGofUcZv>D6xvEA?LWEa{eOS^c3x7zS&b>e^0mKb#@hch4{INv$Ii=9KAF>| zAU3)4Q%6UKf&Bx1Kg|6bvB{tXxyv2)mrAK*S2U%*hJ&)QMzH+}eATC(&asKE;xo@$ zr7HK03v%${K}Is5%tsL6TOw?T8e6VY6Jx$~_-E=#Cr8Js{PpS$8KpnLU?Ik0MVRi| zn5Nd}Kw*GTCv|ergK(y8W;W5{4%{@rW$&B-Dnw6mq{CQ03D!f6-P?cskfyd{b$6Y6 zPzh0L2P<nbA94ufZ2t92)6m9E<j_3f$+U+X#vYubtw4726Jirs(4thkPfdp*cbUb} zBL!8n`J%=Q3dxnVv~*`y8rM#s(2~r14rn&S0E$|MbeLLbV%Oovydh|%Bqv|X$arsI zd5r1h8QNn{alS*6YH7{RD;HBIolHywH1`V5e)83|8J|(~IO&b{H;+7fqtWYmvdB3+ zNi_k;WTB+t0Ek@N^^NQ|ZnA3<PkwNaIs%{<b4l4#zT0tvFPKVH!D#1hy@VCQJYhGn zgW?3AtT~E`yY)tU4E_*7LTV60%?226MX#J3K2iNm8+vdDw2IQQGDD(<2OC>VR>-q0 z^3W%0eH?yq!?vG<f{I0KUS5l~PaF+GCx`Z@GD&s&E2m%6`UPI=LWB2~=NBVpoTJSv zb!oHcDnHN*y)kYQ_AIlnn8I@qJy-;347{*VG`B(;_)j|b5WqYY21}2Dwe@*GwX=6o zSV5Hr?zsDZOY1jm+ct<|A!v|+6sxC}H*Z$PBs<IX>&3D@?t<ay@E~$ucQr{3&@{{B zRd4gj^27L8-1A!HuFQIoX4VWtL&MVgmd&h*@nZ8W^bI_o>^uT@O7NB1GgQf#W7uWL zNE&(5>^mU-xLwkTsL!$$oNX-#fOgi^vqy(l%ReYfX!UubSJ=W-Z46%V6~c3n80JE2 z0j~uik7Hwo>?9RwQRElJw&9FHZe?URBlq8xSqiUc23N^-wUX1$?Is#A9pAalzd<Ma zSo=Geak#{sB9Bf_jzcki%bkE%^|%*{Wv_jGL0!B}_PFwD`%RmkpmlnOwV8H@kHG`z zFPPg~*KXhTj7w5YMQ_TCz800p3WYpZmIl3gNTBJCV9Z1$Vua&xg*;~jK6os%LEqeW zwt4FX30BT{B825ka<s3K7uNMlWWJ}Y?WN}(=8A7(8`4h-KgHhEHf-+`vdijcNRJl+ zHo`9q7I*(Fx`X5Ee*PR6m5-P7-}MJa7d9^@&z6Sg6KfqLc^@(AUAuGV06D!zpd8t= zz7ABhRx2<de8!NW>L}vWAkkhVNeAD?$)YVqqg(&EqmZE-IdOmGo$gNho}+;Ia!{{| z>p5YqLSB5&)?w(uvg3uQO)6_o5MFFLBDgWExb_?`_Vru0j33r8ahvc;^Kw^BVwZD( zv}5Sb$bEKeqQ#Px(T5js-}Q`G)Gtt7*G8=;W7H&7wxe{t-?6}Wd3(31xa$P8p@8Y! zTT<6`eBaz}&22l6RG#PNHCG!t67&67V~c`7#dp3*^T*l$?_%FU33E;XPG%ah-X?m^ zJLI*4-@eZ0J$~z9o5BqpRNeM|nd;FAXHC-nmCgK%MS<Zg@pYwfH&ZtSbW3-PQ-ShU z=S>*b?Sp$6vvL#j-_ABTFYnP1HZz}!<wbQYNJ}P#4x<FMUKiG1y<>~_JJ?L+KytxX zhmfk42YUKL+1a|fQIYvyoYm#ma-;g*E-9jeIYJ{t&2a-vT@2$>q<phu<Kr(wzg>OZ z`Xsx#PvlJ;vX@6~ypVEw3!B@|-U-jDo0V?#KpYi1Kj}m5?_WS&RHOpAVr8o*E35P@ zX_;ecg)eg>nM*rui{*neK-z6dP5t@e`SaERxlT=bV;H54p?rczroWo@W`<gUUkh`) z>bqC6+46)bN^QDsy>^^~HKzlEr1?34UU~!B&@{Vo@6qd(MmySqN|-*~c@#hD6OeEV zgmr|Fo;LZh>3NzO5KjL;*tW+YQ0F>ny+JfE$kg1lA3cpNMnJ}j0Na9VA!AqFhaWiG zKPH~MdkY}bPaaFMQo|lCL7u&6bim1iDz#wy*7@VEqu3lnBis$<fHh=zYHDL&<7m1W zPvKrGQ@^iJ5sxg6-07$;FZa38>z{z|r1PHIM@mE<wk(}ye96Sgj?m{Xg@bt2R_*-> zaM6)!uP$I0#lju5d!9lEy6c<EE?X5rW<k7CAt5E)mn@$Y&?2<5!+u+}eGkOs?how7 zC&icscOTS~n1n|Y$`ZRCfKC_q`k)miIs4F(9YqQ|&Gd~Hs1JWsvwcu5Kwg=BY_Say zqwi{eAK})~w6v@p7;;9{<n@Sxv>^V|@Z-lN0;pFPdz6w=`P66Dh{JNh_S9THr1AYv zzPHUmIbL<zi62gy8Y){iXO+}x{Pu}wHM5f%2#wSP{(S22Y2fTc+;MLm{5*L}?ypdl zGazdFCc`^P=GQJy)AXKgx{-kTQXQ_WqfHmVi37UJ`xvfg(Rv=pd8NibKfF^F(Ula} z&i5Zg833<tDA|t|nWY2SAgkM8k8@&=M8bB$F5(W5I(~uMVs&nL45iXVu>+SuDl`=g zUAyy1p4Agu=x`L6?IPY$a$rj<CIoNrn(eKv^2~d5Mu$&k2-no*5Y(;}Fir3RHCDiq zH0!J-?n-V@bJm6Qn5tu=dc4EYdc{KSw-vZwt+-n&uK)kIgdli`9Uluj73N!rS>Z0( z54Zxm-)X*x*`9IFbb~5FZhpI6%wDq-6BE1j0=lKjDHJ_;ifsm4BXRokH)nlA99|Qg z3cF!l9pibFuE>>HOe%TAi!W^ONffXvtlGXQYh5A=<o`uGW_Z{xB-L`(A-?TxuQjKn zEWa?43hm5#^%MAp+!LyE+!Y|OyWIQXrhT)qAnI4TIblQ$k!+H>yhl6D+Ur+(ORaXO zPG5Y~V`%cWtIOZx3V0+Y6Qr<S89p!s5#1)96&WeXc6jn~4@L(h7I|dN2wi&5Wa*xL zZ6I6-lxwd*OH>xCUSr6v_lSkuF)kGv)kvjgqFeJR(LCXNPZL)X*?a!}>3-*;#VpC+ zB-)Ym2@Nxmey;iz=Aq=+QTY#^m&BEL5$W*6fL~sE_vgMdzp(O|Rj9<Z7YCm?K5etR zV0F=dZkn=m?lRRdpGgJVVW@gjS*P<;uA`t{5>;Jm2SVs>aqXT9<b3Y5O=O9CWyAFY zh{A?5W8%f*&#xL65lTvoM0v3NdM;2Tvf-ANmqU|UH)1p%ELi~nV@hi3_d+Zy1Ltg| z;^N(#Y>>E(yK9eAY;s<O+a=SRoyk{fJ)#{`q;qAok2F*BjYr>d%<=s^lgQbDivJy3 zY&^qk2f$_HiD3^@68-ww7K^nOvB_Z1LlO$BQ;tVRf5&F-oiJ>tttYg>3hk)|Mkjz$ zpI&(86?rC)IL0xgco0<x4q-KbMSw{JI~^MD)w(^y^zAX_Ja=!C$gQUL`iw9Wb%tg{ z_55!J8ay-651zFU!O!tw^Km7U5!0p5q^VtmU9nvu@ALL$9|6?(S;*B?f6DI8_U>^t zyNgB`8&gnmt*g0LmjUK{<Y*pi1EuE)y_q%_v)HmrQk_)0J)>PA&lo=fU7l`*n-^E_ zJ_hl_#RyArK6{d?9lc2B|0p-mVfLoZ87mbCHz>8%2hv$MF&K@F?*H4kG02<7kUY$g zX<5G_XUX-`Nn}?ft1SAm94-u&nA7iFp5f}9IpXkIJRc0J7GJg+$+(PI(R(pVQ-%;A z!_Szan!0z1X4^LB*gw}DZJa;%PJutflhA-64!_4?h+kv)9H*ED2E&ieYx7MY348e3 z;CZV;_flNmBv{0g#Ec)!ZB6WvcC&sur#i`#&6n6&SE=0ynkY)CFWo!Tr&Y7eWGPAB z#vx~mlkT^EYW&g}`)XwehP3gPjxB6<71RP|33}+K>lu;qOhfB$YRT^I6me6JH(8!S z{7~PM1Lq8QFo*!Tk(3u)kALd-jDFQH!?1bAA6w;q@qL%iNpfztgKmwHq(yizM!Ys! zfvQGb{u0rx2s~d(cuCxOG>5sSP4qOluxq$C>d9(I^e5EHzc9_^D@A)xk)}tFYfvT; zLfkevMzz|b0Y+cgK{5r}d`IM})8Rrn<NGOsQZ<UjEeB&q6pp}#AYTJ>2Hi5N>M?Gv z3VrjhqMYBah5m9>VE4XI|0Ya0S`-?Z|MuwZ64ynMD_hHh1|6{Im!uj@M}MeN+p$Ob zL6N2_t(+&&6~3=$fXK)~9WNLl!dZ)Y`6Zdy-T;U7d|PD{^4@!`i%sqc+y64JrcK-; z|13OP5hhJ*FRUCve3uA+2fFQKd-;xM&%#VZzr+dJO?qX*GPW4;7!Fqj<*eu8D`1Q^ z513bu`^loMx6#1IzJK@b>AH;V=XCR5k1DS9sN+-Fmn|tEG;>h>I9<AO)}qPva3p~z zuCy%WK6}r}yV=*E42dYNOY@m#x;+|n5Ew2Awtp_D_6uCk{DrYF!;fWhmVkoJpsZlK ziYM%9asPrekPHOnFr?lSoA2-vpbmqgp;$^zIk#UWq7YrUEpblCjQ>!kiH|8tDv$=h zNNR3-wO(Djo(ci|StAstSzx}FiZqLvwlVGqrk-`!wk_O1Uq1_(fgPHSX`Jz@dG2D8 z04EYj4M+{&Rc(I(@2QQ(Vfn?P*DEcvD7RS7O>!P%!>8MKPs~5@T$Trg?_o)6&!>Js z6PEoEawxrKHimVbhenIfEm!(;^Z4R(u?l&YQGZA3JlyK)>diFHWRR>=tY50?;t2`^ zyPsi&RW54kDRi^DY7)AJ*%mho-w3BoIN2i%V-m7qmYcM3-Pf(vl1l0z{jiPt%`BHq z&8}gA)!t9jOrLw-V+N!Vb12C1eSbl3YOfwoxZoUOzy4}$oL=gp<;YDJdufa(tZG9C z8>>G5;WeGc5Yl~I#5KfzkNJn+*Z#&5XiOj2XHJw-zJhe`T=tIZuBJ!@&LN|Lr0(FE z3IiX{J^g?vm0gN5+SBCv`R_lVxzo10jMvZ5BV#SWL=&D6UUHbarwp<AGdFGN9SYS* z7XO!|x;lR8LjILs#32bngw@4ky&HalgT8<J_N*StDcyaawEYd8|9MD3+IPLes|9J# ziL1T6_0zrK3|)P;q^aJ)-=IY?KfNGrf|-bgk2?1e3-CXT3f=<J#SuUwTO^pWBp5Qs z)85{Gj%eprdwU~U<A`wsNl**HjBIH+y{37tobgq)0>jav^B1jttAeO}I?u;ha^7Fz ze>8ux;d&z1LpWS12Y>%=n=`NE;nZgT{h8UJTYoQiQrO_#15^G^6FR(*oA#X*e>47R zZ$u^-S2#Nm&WUxda1CXa6%P<DbH*c8_uTsN&h@3Do2*7V%{hgRqaqPa6b^G?(t3Of z?QwqQ^v1K~*HMR@D`T{`>-COKPlLpIS4+#yeHEUAfdK)qZ^cgZQClcQwwW~@)kWK~ z97G#(2!>|iTqqUm)vY<U>^||HLWKieC!&K$R{ef&`GvDQmHCZLwLJQp6XUMGv!4Wu z_z!}WBdgCXZ!1T!SvW;a?G!!O59Bo5MGP~apc{xQtPXm#Xh^^PA8`#=w)_qEPM9`j z+O+I^_q7$g|HBxrnebKdgz%{^kTaGk^(JEnB2Gh7!L+D!(Zm4nT=gf>j^`Nnj<>Wt z4k^xh-MR$AD@eOJuA<-E4lVWCqqH9$W}+iV$p06+Kw}J*z!-G5L{DylG-Y#Zb^P$d z3s%wt^bXp)W1P+v^TC;$B;0U3vT7Wd0zP=v5aa8Ws>6m3#SaWc=zl0qcl-Kwgfry` z;ZvNMtDem0?STCW17U_-Ka*Rl%^3JBliAn${ri@Wnq~@P#vIf%Ge?Mx9)m&EyS*Gy zYk_5LvauQ_SwSB3QG6@hn?BKwI^GE>%Jm@tgIjE;7N7CS>e@`c(H8k9M^(di$X=_+ zDcP2--|K;{w;kM|$#7LJVwPZb_peguY3C7K;jFdA-j$?fb2Ufw%5(qCo|N%;)|Ok( zSXTjz4=Su4KmXJ9Wam7=mkkCir8^$ALxn>Fa^LCe=vWNMUF4?Fg3+{+bKGDLqpGta zXC@TK?d5CyvI{fUPUR&yU0ges*h-bNt7gheqpI)x<)k@SC9wD4Bb6&GXO2R1Biwhg zu^JdqRJW^MHSD#8oFm=M7n<(3X=;CH7*{Pycrd@&5PkGi0`ks$3_bK7tia~YAplis zvJtFBm(_Q3ytUaeg=HAJg=y**o43=DX0C=v$6yl0a<+@j+kOFwK;e2d5MkvHueZBQ zkm4P$H*Jzcp7>4H_!SOHSw5b5m~uF2kf??$nT!s$hZ@Ep;~jY~Yk^@m>XB#ms~UAu zM7{&d1HTO<kpM5N==->>0O?{j`3sv#l<~h>R*%bK^N&WaqZMvqmZLk6mDuDQR$C8g zYDknQ1cHb8-?6q0rx-BqGJ6{>WvL$Yu!Ds^WgT(;L1^EwT&`JSc>O^*GpBX8R?oyk z8C7}5iS2uAa@%ifwOvDwXJstSEFBGUce73U^JYC2h^vAc8^ZcM^}CnaM7u_JHS2k< zU62a}CMio07wNlMaG8bVzT)y7!)M0XdJPL^5tfr&rUox2g^gPwcZ_@{@s#s8uWO2m zUfY<}Lidscy}pOru+}zq@2~bVwOFZ*02F=EW6s*eY^`#sG1hO~IKIe9^DBDuw_W`c z?j@^+>CBi>+0p$Vs@szf`~{cO_%z13tsT9kY@+RBm9dbEU(sxT&|rXK*Wq6%OK=IW zH?|n9zo-3Ip}5|9FAT^nFY~S*#Zdya_Mt=1j=zH6J!Y&eZN739`LcE0JM>yaFu+IW zs{4C9R6|j*9D%QgrKPu-=nDMG{~X-(`F$OQ2)fj@Pt!Uw5l63La`c#i7t_+wWnB?t z+9G-ihUDq#Hg_LXDcgEG(N5S*Samb6|7lkEFbqjLTEevQDqpA{l4Q)|c0`zTKV^G@ znXt2?hkWS#WM#{d)TSa7RCxQryAviO4O}xkkJ7EKmm9P3uq48`5W4q4s2IP`eZI62 zDUNK^vQMX`MxfQC;>n|RUg%+KmkneHRT=By;X=Hl4dDY@^a=|ljyrE=bf+{rd<8$) z@kL4wmX<T-f4ZBI;f>7yD`hVy#%j68tT2{vju1v^PSj-gxH`i#O8JF<O@9qD&=@!4 z_58c3n#W?QGBfXfFm3s@vuEYz^7#Rh-z05^KVAOO_R9IH5nFCezHFtpec|WDs~4~B zt2AM8l2Q*ziH8yL(ogJ@OK)D#a?DIkOVya1b@2Hj**|{g4=mfL6tCa%u|x8tNdH*; zvBp{Te|INtc9IXi?7aGCSLffNCC8_Z${e{qv-HT%A3ydHppxVMv5}Do>Da4g#5_mA z2jB8}pCBVLndCsKAOaUV&B7Bt3ATwrt|jOo0l}c>B(>@>Q0;MFLcNkHU@R?*Ix!YJ z=BDX?YKwgEBX!fsgF_Y4S6}wz+xX0u%$&0J!?7FeCxRSF13W#Z(L`bNXrIv$;ZkPY zyQ^mNxD6C2!U+5J&9M=73%{5VJ1(8CgQ4u09ZIl7x1n>2Yy?+N3F-ZF->jHB#8YA| zd(T5XGj9kd7?ltah`9+5-N&BSdX?v)mqE~_jNsC6#9?r&;jDXh6RcatZmWxx#E)4L zGTPT)>Gv=1YJFto)Z+m~3Q!0HD99XP7mSTxx^dH{1q8*eR2w?paNJGzSr7iORCTZ! zs58%<fo3N5Ot#AA!X5jPKWZkCUvhGC{-PVC#HyYc_H1UH*^_iv<rveUI!6lhC%kcn z`{1{0mz7(=hMOzG+LVNQzu&I$syeoct(n2!_l0+lJWo@U!Zk6DIt`Q3^l4HLf1z8r z+iQJ}clp-JvsTHgCJiY`yEM)uvKs5dIp+^z-<f31`G4{%r?2y>=tZ1?r6s0czkSt9 zEmrPzeE*9=Mpx2Em0P!sHO8xo<9!4vmOQL+2(|6V<6?P=Hpf?U#1w!EN<H_^ao(~e z40Xc}?<T{lz&cI`#jwxet<oQz*Mw9L#6;oi`{VW80W|YodRtkae#qESJ$3Y`Q8Rf_ z3s?Yd<b8nt8)U7fbuuAgs8j5fg0zoX(&LwkcAhP+tza(X^)sXTzBtGESw+78E8{7d ze<npc>U#<SewVFw@7}nvGLKaU3-peU=aw8F4c&BHKw<gWiVi=5I(z<y;BL0;!N<XD zr+w(kULn&uQQh`oy}GJYV8F^rzmH4!x_WxHe0=?SaMerGJFDiDq?bN%PG39Kf4Ynm zpw|`tf8KAdt!&hmDqqL2`78|Xo(&}gfZ8uU_j(Y&z!zQ;g8sU8!-q9jmYtng*v)R~ zm4t7f2O(_Jy_?4CwXxYn^CYlUE?6#i4DIh>#RIk2PGM@Y7(OttcTgw0T3`f7vTqe_ z!Pu0|0C<*jtQLjH*nocoyuK5}o7>9gF*8O95((8QM590s*v$Y1<9kW4{g+-wr}h{m z{%BW%er6p#%0kXE&2@Jw&JU>NF{Zs?JXji8*+h5Vu5fF`a_AQg6kOO`qDA}-DHsTY ze83RHY+Zd}<!ih!W%aX^Np~UGu&~+tNaX>)?0WwXDtI#cJ>C#;Q|%xsB@TjKeay1% zT)$qy1AKdUa2w{!uJ+fjm!GshF-EwPr~W*}Db`9pxUcSuO~h8MjpaYf<f=BxE8~C- zrCkeDT#3^~TC&Ful-7;;4s!=f=HPO_huSWI%40+YlzuG32K;^7G)F`b58$E|cUE=r zXYDIE@#Y)JEJ`fQ`*!!!M~n~_azmIgPGi|+n8l{Wd&`zdms2N|fwcU%qmYCvWC|b+ zOW8TSj92&6`w#?J2u|yCGf^;iVh7*9vrV*KjOofqrS4KrpZ?Oh)Dng$sC_>Z1ww8c z8Li!HQGOO)zI4g=Lv=HG*Qo9Y)1+j&n6=J)58KLLpc&>`94!L~asO^+=45R9?0}~S z+s`TfZIG+(0HIy1BM`gp6Fa`BtO>SPxS^&yTTgE#J?(gm42*|*zN7Sh&-~P!4scIw zavADcac?cD;;4GC+WQJFY<8u1t4^m*0>o7zEk8mSA&iqWGR1n*dF1u>abe?#sIlIx z(a~ZOdGgB2NrvRummb}~5PUg<8hAyWqXP>22VP^ZHEYe~XhOE6aBCv*6ps+z60QBR zuKreuYj%=q^hiye*|U4_i58!6Zg=zc_TFFZP1&1!`j3S0GC_Z`N#q+z8B`t&n;x%7 zS$b|jt|FTb31bU`lJq{o_BSOIuB++h^bNeJ6Jz@FZjYlJ`6y;?AmE>|9ZszI<?6Zb z+4m8en_b!5c8T>2prk`}=ii)EcG`}nJtH&o?=3R2cTBtAnp7f*#F9EU^U3V=YfQR2 zH=8XJSTA=`k{@ui=_S(4-e&U_2VL%ED+0}>hD}>1DfqTlgm^AZG??<Arhe~+p5&?; zBwi)&FqvgB;Hm^io1F|Gr>d#RK~koQAf?-a9mhYy|DCil^PlWbI45!*G_r2~&9&Kk zOZs>(pL9&RxKD|T)<UX)X$9LKRX5iNpL#Upy{`Fn&g$ZjG`0S`_>5WS=9uVbn7P4F z<317^u2V%>-CF%SwtQ;XTi1?AC6h#5&#A0Ay?1_n9^=o-Gng{Jom_b6`E3Zcm?fC~ z2dP+OF8rU+Ec3m~6<7iOT{WuYhx;QR>BOWNo80*8N%O6%dtUtY(}`B4?l#=9bLV{L zSSvQ7t2nQw6tp)(M|qj%vb@;CD)KC{I3+I9`@=x9!yK=^p#1F%&?3Xvk~sNKqdY&Z z<ZQ*d-_p{s!%6l{{w+iLxeQpiJ4f{)GvnCeUTwbXm|gjY+Ml>XwjjF13eB~ZT=B5! zdx2ME)>6Gb-L~^<<twMN&(ailoen|99wpLr4pba!oA_u(p<WQ&l_--Gk&N;6dd(c$ z|D80H>t}-i;tg6-6N@)ad-jxiQsnkb={vgTdfLcNJ_cr~YmtA(mHUP4t=GyqsO=n> zo9;Rlnx&Z=^WFLudz+!;@W!q7`IPR;L_%yA9sWTn{=hFDx9(Aig~KpH6za^{_kt)7 z9J<|8bJambm882S@|)k=F>)UJ-X%iU{_(!<v;5r@@@BEUW!*PM-{%YXa|WLbHjjMF z_BZq)klDY&Z<|wWR}2%QWtNugG2ps%n)5<>i!>3_mUS$WJsPd#eDBU3DKV&EiLj3F z+4_?7I<{Yr|NKdxsjEAg@R#?Ueu>xA{uifYvfuH2ws2}=N&0+|rhbg+Bcvd@^3q+% zj(>f}<+<s``)rBwVl=gJ!n)jig<zc#hra<oH50+ngK~HXvB4EZDLLT}sTlLgta7v= z&hQ%*w~tobC|LLbL4_7m3T78H>*0;=-i2nXRyuc1<k=;usR_8x#|z!@D|V%wd{I49 zI1R^OkWu!vYYiFUnmO;As|$B8US%XR=i^<Ef?YG62cEmKH1aI+x+E_6Wao$Ju4oqj zRr3C(_LEb4ncQQx`%{ioKBH5i0|-~jA8sMXJ2pWp?!`5cY3ZLf-(44rR_|P*fXsZJ zw!)u|1WBXvh6Wj?Rjhq95Ut%V`TaEJ%C+2MmO|^mJa^2t7w{)Ew)t}64ufFK$IPfK zOHVgfonz}trWYjBN!p=CPf*e3QsX?N%y`67k=l%@_y?2-aMe_>;9JN@l45mR$t0He zZmvH_tc+Ul_gk)m;Hd$K1w)#002#^8&CxpD9u?zpYxVv$1#*%(7oBJ88U{oyKNKb1 z=81^#V`lyR-LZ;NvwCL|;yXLWbTs~!LPqA@l5n3-l^^~0JMU()bJ&HIVVY)9tydqf zXCf|UcuebE8y$C2S&?xkb6+fJx#-%XVw0=rQ=X1`(6eEOw#3maNInmR*$R1CL!~4m zw+??kvEGABEi$HU_gA6wVVOjRHi#{zfZ_qt%$fV)0!$wrK1?;NX~Vz4_L|g13#D_{ zlFR0|uxc|SKgcrO_)fbr83EnrBn~I1c*j27+j|V`ULH0I&aGHjU6^=W=g0~{4HqoE z=FiT*Eg35(O<+2N?ydG&+PybUn&ks4ae=SG2V@wrNUdk<=z#y&q!F#_K(+FL`~*9% zx?9EHxM>U0E-j%@hv&#rul-AY)ZWz8A5{g%ThRXRXF=CZwfT(!)qIT@9HD}#2#%PB zTESenF<eVvcNZ^}-Zde{^mUrrpt3zJrG{A1iW9<e?r)1#c8%TiDKv+F`eo;;4cF+m zAF$B1tJ3}{hLU_be7c9q^mnhEz6^XJCXlm<UZ(2hUJg$V(eT6cx;n^8hPmpsnr3Cn zCfgSj|DM41krd(npgw5q65o1sPRHuq)#Z2lm6MAt!)xql#2KBZ-KZAl;<%F-16lF+ zsl$AhmHcUsLyg**r9r+PQM&awo6@l=y+fTeKLG3=i(*m~YLxuB@y?vcFLA<sf{=DD z7Tuf-+9W5`XfV53KaplV_wt?{thU0c+xCy?Y6v+E^h``frh~Fl8a!4)Rrs|urFm~z zeWJQ_^Kd~nSN$DIvyB+0`P;hd95lQWl4}aDsf}bYDP54(r%U#f6-LDuB=q>UHdM6H zR=@FxcbnAr%)w#PzAKp=!Ce{QXfrQRF`?(2yh?W>lJQ~xZf({6p?>owWQw6eP~{!N zv#Q@yuhfD_DBUEV3?O5VcFrn2p<z{g+(M~2Lmq5{HIoSbXsIn>vGa~pCfKc66QpF) zz<y`%^U$2Iv(SuKWX~FfkL-tdllcc@%;co5VAqmt^T;pq4|b=!8d}MnLw)*&N3wKR z=4DjhR&tM(j4isBUr<U-jeV;*MOr`<am_Ujtb6P(oiA)_XevP;k7^G%c(6;Va1`o+ z2~tVTa)qT6hP@<FEo2Z0gLS6LvWQ%EbM{Di>3MVMeFnV?cL<|E9-kNK8MDcA4VR4` zsARGln&3D}$`lbk8CbzvKUVagj-X@ZxQG+0*RJ)oCybMmhY_cei4P6p{qFYKt0mNq zl{`{EQBN(8Ji7{j6)cfr*;m>b&gS!K`qkN92pf58r`J#4>((8I(Y>bS?ie;B##C<3 zBGFAtA$zLHa^NL$kaMOpQp?;k=z$^1fHmx9z->d!JYlK~L_-!}jlxh#fPiC2zs0{o z;UQb2ZQaLFBj)Vg(kuRG*yo6D!YYYhqy#}q_vRn^ntpSb?o^IM8zyT!y+)&bl#i3_ zgWFVR>p;i=$3^;sTl^?ayPaN5+6D%QtlWGD@;GdT8>A{Dh4MKO^;uyl^7|nIyvfzl zxhwIA>ir*OzNHUEk|7ZVi<z*kGPbyhKpXSH;KJtXDZYbOq`TH<b$9&@tc+SuRl1RE z#U$qu{EaoSH&1?TU8gGd0Yh8S(o+roQm6VTPBD2+G&XI_o5GVi8-)hCwTr}xVMJ6b z2&`^9>sqpd6$U2`?vSQ;>e6#XnrPGeUNL{z>zdB2GTM^mxEre3TRwbISh#9Yq#m8m zZt$2;yc?Ha&}44oO!Os7<cyNKEA>BrZk;ZjOS2Q3>|ErcwdO_Dc3xBW#4`@+^3Pws zc%g4$>A@Bwt72NQN=0DrQHecWN}ixa*%|G)X6gJjJW_F~sgbeCk7;+W>}km9lZ}$j zUp)WBUC@?76lpWZc9Lp8XZZ!hM9J{%7QC!$CV=z;ySpmygn~^sc+Sk%DkdS1jESir zz(h85A4G*kx#~)}>JO7tM*s{yx=2YGZYwRo;Y~M87=pzepK9xa98u<_>jp-(dm=0E zc!IfaChvY18Cd(0o$XLTC=Jfg9v!}eG@^CatzEu0dsiM?weGrn@b&n|W9YN~@YQE5 zzwm3iNYk(-zTS6pD-ck5TKMlAzWq<}RdlC1e>ld&XeuKK?NJ%u9>PGYNTtCKwy`nL zw~4MdqlK{0inBbKW3=7hKO0*pM7UuRN__)Q(JE6%(`GM9sD9y~5lWY};7kr4@!k(m z+-DCgFXYR`eGuuY756G`*0xvz(|R>no|Lb25SY0=Mv}-fqyB4io1vU>qd1!^W36@c zts%x2P(N3BckR1HXoS9U*o{h+`>l_sC6C&w%aZvKixcVHS))&<en<Iq0F7f7#Y?7e z7DY9ISFx&Ldr|YGrKJtN={l0V*wU?^c8+*x;Q9USs7LPJ)q#pTnLr}w48*cuk`BwD z^vQpo)bpc^WWGl#%^anmj>q31#`FsRN%l_g7uKT!Wj`xM$DcIx{{-0lq5In3z~?|* z&MZmaHniXVlRJh?)|pkH>zD1n4X~3h?P2VTP3}KG>TJ-6QPYqf4^5a>s^I763~Iz^ zN6hh?xyNoHk0B+^I#MayId*==T5<L#Q;fO5Om4jYwe0oJFIOjjb~Eo{>K66#KvHYd z<AcMx3;8|e+yWos?KMO8PdR3OoFa_Qo>lMSS<>UN;A!Tn8xq@e1B?agG`w+Gw92hx zzcanuo!I^+g@Z$-E?M<i?cslwE+D%&Ge_~iHFkD}x3jY9dY-ytn#`J&19QfR!@{Yd zhZi89-(+fO3B?rm3!eneNs@6LjbyBNSun1dif#_bRRtZDJKTvMK8L~{82e7!>~~I@ zJzDC^u3~g6s{QSMF7<ovjm?G6XuBAFp0B+N^=Q0Qpe6}hjPNuI(vGI4ZabLNDvNaU zFbUO!;>3ylXYBtqq;rcI`%aeYR|C2~XT89#4nm@vLI@W<8)30Ex@b!U9`;BjXaCKc ztMS5$xTG}#M69;^()}4H79J<6c}WQg!1^S|^SV*Na-Xu5zoyoo-KmIosP)<8t2+@A z@q(=LYjZ>y1KgGL1M!7|gUKF0l&`@y3~ljf@&=To*W^1i{p)B`<UaPVK}SPw5bDpp zWL9$~D28oFsMO9{Icb1b!Wcd8CWnTGig|o~`3`}2LRj)1_U>qHytPdAOaI<M3;AZm z(0ZynqAD2C>rFpAqpmbQHg?N@nx$m%-FGdieZ0Y9E!lm%O+GL=wzoA^F_9i$7_WQ$ zi}ueXwE_ttliz|e(<Mdp&nNHd_)|%$HYWoLIw(;gh9~%UdB01)?7DU9QU+psG#=|9 zvaS5vQa=V{Sb&nrWl_z)(z&f*P7oyxk~CtibV$jBOTD`mO;EF>ksFT7bk{hTnpG$> z{hRd)^_!p1$TIh9iuypGH&5HTs&BwWyRN3=-Gfac;X~C~$Q4PPDy5SU5k`1kyqrZ2 zCnNa^vz$E#HIFBm;7+r)ew3OpI24{u!c6ITT!l0&4r_nn;^{y<|Ap^-A?@NhIw(8P zESWoN2G4*tL0rpg%@@oME2MK_(UGkb#-XSv<3v`O_P3#3mv4U}PC}7VciV(0liy-r zN_eGq`}@s_13<^<2;EPow~@27$VXf-!G0Ik1I+H02=LFy$~ye}w})g832{vkU3Ek? zEcs&E1O~4GFcp)KD1|<IA^T5D6(SBpM9bAOIz*p@2)+sr<O0T-i9jUGcp13Gcw9u~ zj_Q|1@xNqP3r2H)d_(kmI>Od@3Gi3+RV&nnwm>b%4^q|WhckbGz|v{5xUd9~G%G59 zC$sfgJaa8q4I4wvU6A%QlZn%-938?@wXh8rmtQzlT&v&lF3;dCj%qx{y^~b^P83wl zMH5e+0%M)Ja9xvA>Sm&OiG?lZI4l1SEX*P=$x`?^zp;}98ouY;s*GU=AAe!FdnhV> z;xf4*o>y1%_O(ixe+sIF%FBm|wT%M)4%?JoDUbdENA-{Gs53ziwcFND>CgE}?oDdy zXbtHbcqFEjq>raoXpU6Ei3f?bLD>3pa{SUkb5AdWMnTYGLbbl(JXN{v7BAgdPo}#T zvPmb@aE+Cv#|QyTGuL~nbnekl{@tCdRCm7hPW-aas|hmY=y&ORu0u4eZXO$z&znwZ zG?69O{l4YJE_f`0JdUiH%L-_va#RLBpc(|Z2pv-^ca-CYSrB>l3*~(={dl@-bDG*2 z*7)Z@KNHh9K(H0+3tzk#rEL)Eo>^+Zj(|zM1fmic+Ts|9A2$jE$@Nl}W$y1KFlm^9 zHk+-cPJOF_lF%Q)?+)LA+^@z7)tNXqBupZubJd|Z*J-U7^;MVK(n0vM(04FjLhiwl z!A25`%+1V(82-5)K0rQLr`Sa+h1oKRyoMK?NAQz6J3HqqN^P*$9MPy`(l1hJ!XBhC zMlw6tJg>BLG`4uO!XOlam9DnO_cw{JG+lkRZ7US~-l$Y)v|(?tP0WQMeCg`dY3QgD z;!KsRDHb&bem16E>MPRp_h9DX8tr%xQpwG%EHi>dU(~k@T50*4-cZHdckp(AaD{Cg z67^KCU$|=~3SLB|4|~8SJ7h-8p;M`;>vcb@683V)$(clI7|HN|AF=fiB(dOc6i8s~ zBR=ixe*8F3*{&II)6oV?!KmH*lze2i!gnXlXSR2DPK+t2>fpe8#hjq~?Y7RL$X!1k zm`I~v-!HJ?Hb@rhXvbV)qkM=CJ%9P~l*j6amfc!ig)e0D?0Hs9NEBU5HX)H=tcOB$ z1tqk-P>j?%`#zPxZY7hh8+^Od@F>ErgGW1sysCJAT@sL9z8r{}CqLieA$VkU=^!8_ zJ{}&HPzG#-X5q6KvK+biTszhvI8A+o`P4P5FF(O0NpUpWMpf=9Wa55vR#+BM*nE8q z%RiY>#l6hTCCrTb2MTHLT|WOU>o#yHc{?#oqxkLHhEKce?Qu#FFwC#ho}bu}f6CE@ z&SrM)B^6P+Ym|Vzb1=~HFH<$sU0X1~3zGTWkD7;ZWdnnNn~9_Lo+v~%!uR**#|J0# zX410q?>|I$?dImz&`FUz_hQjFltRfRbqO=fqDbBu^T1I^yyluov=MdoPIg@vQd7TN z>n@bA_Mu(>Div6+X|{x|<G8|RCZzR4EG-i`ltUkHfP48NHMQ%kTESHS60|BQ>#o+9 z5+IGg&R99BVvL^GvduO_p*~0zmd2c!19GiK>Mdab+*r7c@tZDFl_Q&rJOcfeE13;< zolgKd^galDH^E#8s9mT{3l2#p6K!Aiu<*QYS^*1##A@rjy)L>2pHsY=kjO^e74Cfd zE>(&f%gxfCxzQP?*dxZ{{(<F@iz7_srh7-<d=S9Z+FLQ*CuaHlp5)QiBz~4#qypt< z>v=OR<;=Fj0rkm6tJGBA-o|QibQP&7j|$(VkHXtT?;|GQ+t}n=M-Tb<?%fFkZSB@t zuAw`8`@evptkxW1Ye*R2CnwEx)v(W#kA?lu<&3Gw6lLyJ39r)hx`5PFl>pC3y-1~r z95wYs%Nvn_R3l0ei+e_gGn!#chr{j=%ODpWgFcbf-Z@n@+&l1`f{DuTc~&ihubj<H z3@rOqa{F<*B*w<h7Ss{h;#zSg<6_c?!)eLR!39-KZ$Ewd^k1XN1AV8Al}}jZ|7Ul# zcpBd#yO=N3TJpg*6zjyy-0^DMFc}4$xY~R6!#Q?o5Akw`N7RQ}L7xOo;E0x_8K$qE za^G6bYRS3RY$-y<M?C$taL?eM_5n$%Z2HO{53|#xqjpXiN*H{pSMw@DJ%92O{H1Y7 zeB;r{Whc9TZUq>#vJEzWCf~hM=7T0~0ZUef!Zg&RG&EgwJFA5$ov(S15Tb3QSIM>8 zYpL5)Qdxt5G{u@Kmm*U-R^Yfc%V!AXE$Ff{z6RZc6guYjpF<YhpP(E?CgU44&HBR_ z`_<m=)6J;!A#1<o*rB-e3AwR}P0r+_Tq(D|w{Uzete<}uDP3ZRtq-MT!~;W`tykpj zy(2Dqefd6lY5^rA*k0NSgOi<)?9NIUA|-j&LBr;rd*zc^Vh2^-hg*YC9c1?}x4V$q zK3RCVCi?dn?y&E=Wo<_;)V6c!v@sr@PfmNOs4{_0V3Yg;);Q70&b*L41cUgc{0t9e zB=<hax7Xby-<yXZn*~c3gO~9FD)_l)UV-eF47ix=94(<h3}`s-_kfmk(gP8IIN3zY zAAEf1mD79?xo+&}Xe5F;LV({_JiCOF&95P7%z6w)#y9Uyi?BZtI6ibJN-f}5wM)&+ z_A8k@yWjX^WX_oG#xX7b4IVaiZNpIPZ-Glwf|!jm;Yry)KHfnizlRLnbLsvXb8QWI z647KNuYaE3&#<oPBMo&RDMaY`bqn>HpGRVXMwx_?-o5#&8H3e&m8ksP5Rk*C{`%4W zyB1fN#!Ckc>bz_sOsAq^PxPGeO0D4jh<^LEFmw}-){f!zKa!@R@+I-BNE$tepALxw z@Yx%?r5F^cDfIS-7}GAmVB{<lVw2qwniL!KHi=|s!@($=RCFyhCPAx5K=CPJ+~<vp z_=W;)CBetzBAymgD|atYl=*gDt+we4BT~wxS1wxmi!1o^=Ez7Y?A2t3Gu7@ski4;B z<3Oc2#S)&hFh!JuQys5!=#;1btcp^qiIC=Z9|!8V5py@lzN;wD5h?jaC7s{rT5|lV zUG`MkheWh~x0rt{;1ZR6S$`j~*qS5fPtv!*BB5z}$bIP%sQ4z|VO-{V4V5tOv$Z~= z^g25%S-<imTxdG_KL|Dc&PT@<YXOG^9!9Qch>%ckB2OOHF^l~2XMg`;lGq;04UMEq z<-kFJ;CF%wb0_;Y#V>7DAOm*Sg0!@-B!$P7jn7#Z0MlB9<SpUFral->2%RL1m)t5? zc{8{`y!luyEkla7cub2ijg>R@;F9b^U+8<acwT1du5HCcXpt|4N08A|P~3WI89xCU zQNX+*j#COA@<HBfGGc_}pz;2gqYi)UnPZEq8u@E0v6hD~7_Y^jdiTmzHa;tIEB;*} z*Nc}G%nbWD=KJZcyB|jKE$?--X}(pwE>0-tHS2Tt$~Javuo@hB`ume|iN#gX(Ppcu zaugiU80%<DbaW~vk(cNd9W*Z7XR@@4T+t-@EP^av>L|Vb`Q*t0>&UZvcMrZ#LY({e zHxqqW-lw^iFb??qX}J(k?Y-N_CsxU%NmfYG9_!kVRT~WFK!`$v1I7xeubgC9fl`Y^ zQgHSW6JTtBZ(>b)j!k82Y%)SkafluSAj*Sz#U4@iCvFQ4a4r47^Dm85YQk~!mO;dG z)<MMa87-1C=CsaMl)`tdy{BE1)jzfCT5SdLrV4v{`2o$pwc3>^uivwnRw3kjU%YPj zWmFGySScS{yFb^S1Oc=$vpv4c?LeY^qpW^SnpzavMG}DF9EfH~2LbK3f~d*De_Gh* zLLJ#B<=RJft{qF5NwEDQD(-A)MJJoL{`}5-GM98cd#pcds*JvFd~CAC%^Ck32iPqu zxtHbM=oG!<1!EzY<J=5zj>R_&x{RW2p;nx6W+{AMu?8c}?X{86P-E`@;c|V8AX)mD zhPn@D`5m9%sVc59v9W=<L)+t_^XMOWydhh$plSKl;vM^Iur6>C&ONt02U&Y~!$;0= zslZc--d|%jQ#6Cw;S06-u`81q^KLN))a3Oss)Mn|3u>?~DaJ32<2#lX<bxY8O6PVo za}5KYoeRCL2zUuA6G!>rwzp57JW0}h@^fG(0!1Js>_1k#%y0jnV8E!TKeE?^j)&*s z5uL!ac=_TW12jQ6sXFnate#MBC2{iP%OS=_8Zq<FygGq+t%XXngA<&6^#Z-Zl$mC^ zI|}t%h6E~V;7SM^8RDT5%Rk|^bEjlM<H0SlUzc|I7#8+Q%Fy%7tEkON@dQVIe45=8 zC<5=(>)v39^vrZm+P@sdS|2wW*E`X-=d*c}O?Li_*NHu`iNI^K0f#J%R)WpJG2+AP zKj*NbRAkcm|Cpn&<;Nx{`Je^>W_q(#Z-QU=0XPirEf1c&Zo2e%%KOY4H+IyQdY0*T zcQh9s6kdiUz3aWKthDs9RN%kdzsLk9&?n%Ib*p)OF8}M-<Z`bI07C18r(|t_$Qp&# zqZv^wfW(%UiH3HkoM&H9eYO>qFtG)pic+^&Ya3hm(nPVV+|9DIGX`D%8;?Dti4ZWc zhR}qwOBB(Eg5@{henq{KWu2fJcIEt6sW}~oXMHMX;zU`6O^obk1Vo{#VaKR~7Nxs- zqJL&WT!~FyUApoahaH==Ct7AR5G<~;EV93D{V~c>hvoRVD+3Dk-R>BKfK@XSonU0N zi_tg6{e%pjK>yvl|1wM!NgBytwps$eh+8FS(+zJXp&77n6iu26($wk~jQdAE*u9!1 zz&Q+ASXU2iwC*V^5#8KMU<>=MDVCPg!jhhTzk3BT$a;;Kqs;Yaoa@<9G4fcLwJz_% z|0C&4pmJQ>J^n-pNeCfolM1OMN*WQOK?u<x3bCc6C`~fY6h);7MK-CZlm<c)LI};0 zBr1|rs`GolbJjj<eQVo$)B8TpeP7pqToU)MP;YU3<2tR8ZES0tPyu2&0US?>LrNmA z#BX%{_upIiTfUQFxy(xDb4f+lbO#lg`6VeX!ahibu_srbTe>PtL87N}UCIVh3Mh46 zp56W?Uz9XttTpoT*pmmWRb-Tq1#L<#*)9?EI1AP66uV+~+A7r-tfD&{nfSWozHz1I z3xiMf(u?a`?cdO#l~nC1?OKslR_vLHz7_dLkX~VOl4{4-7F}{!Xgr$5LWFS?0nZ!E z<uu9%&e+}{x73;_>?xQ+S6v_GUH57{`@+u)i@qeZb#|!=twx4=GiI;g9UV90SkLcQ z3Lh-Kx(6;eSIeA40i4Bmo1f2QqCyCh38xAaCz6+)_Q^a(X%mC_o4DwYZL@<fi4`Ob zC`cL!<aYLg%EYRlg(LP&fQCrBQ6CiH-O$<*?<l+8#42)$b&F0&zUqvZx8zU85V>++ z|KUlgLO<fpsFoIhGG-l<8U1p@(zP}z(6;u@HotN8xZjYmvpO}YVM2*<p8%F}Tx{UY z(Z!zU^mKGqtJ&ZEV~8Ss%uUr*l%RA_+vQ06+2~L)^CIN+!#V2<F)*gGqxoo_J-`V~ zn^K>ACs9n%+QJM<Q%Vc-ij;rqHMYr=7Q+BkHkI1#c)MZUy3bbtGg%(a+p6`a14*}q z|MZk&8C7v|m&e-<b{Tszhj{{WmII(qRK&S+dmUx%f6fn9BvS)$7GoXmi?qL?aeF`O z6<$O3oLd_m&{aq-!uMGhi~z~xAsH$R4Ggj*&UX!p(!&}o%4=m8y0h~7bWkp?HTNO& zf#3L4P5boN)yW?^14Bf{ty?k;UKt)2<WI*Gdq*Wu#o?e~-rP-@(;f5)zgpEt^xONJ zk#;63SqUSz-lva|S<+0=hG9qy>0}fjTIMI2Et@!$)G~9?F9}~`R2~gEC|=$4=^%ir z6Iq6_0K`bgUzu8tKugnC;hB5sFRo)yln(rjU!eeS>RRx_WCBai*Ba?;_%Xz-V@rAV zy%zN^=?3W@wHA4etsw}n_pw+qHISRjLqzW4=3vES!hQ4#YtPNtO>I0CTn9m6uEPw{ zBDsoioa2D5!BRctZ%kdwlTm2Uq57ygv42+oDUw5wBJX%oyPAD$0XfzH4zdQ($1RjX z{LPC(dl@fcFiyh~jZTHsrlq}%ceLH#+y56h48oLDunO9`&Ngn-?N8!SNdAMc!rGm% zf6~WzzGO)61AeJuBw8&SyMzroSh0n<MLAe8k*k83ye<_vsm2#tqkA=twkysPc~@(9 zL}_zQe=}1mN_exeOH>7Ex$tF)5QG>H($H<N*C9t)^YB<~ubrv|F^g1Ah=vW4Gl@~( zOJ%~KoIZR$CITve1<iWh<Ch0R8t(yTC!`S4p*ZXq?-_v|PRZ}nR(*FHq+w~;h=dv2 z=-nIj|Lsh3_g^ko*j!2r9_3yc_P_fEHBn$#Nv;r($`pP5vZD{z{I_IHf4~(Fhwk>` zXQKI|Va~m3apOO8tmLRSLs7->B{oA=k{d=Tq%XA24I(d0dfBbK;3#_!0Z;Q^<Zy@L z<C%{iuS-tzZPRqJ@$&A{ElA>Tis0D}f(l6n)4hH3rjaPrZa_jOo*|->tYvz=+#nOA zu-e7N6q(XPu%$aF-X=Ydv5h=?)&)m}X#ULOyQ0Zuf_%-LnR?#CH-yqUtr)3kPOZ!G z(Z`-FM+DjObZX%@NSUa^b1!a7et%ag$L>HQGL`yGyv#C3=XM|G*{XP6vo(F{<w-a* zP{VcOh%<EaZs7BF%Ua6EGuTA>!8JA458z&Inu-1CsHaJb(Ss&XT%SbM;WV>+mggSX z|HN*Wa86LS9SzLLC+9n@wizZmYNbxptCJHwg~z5ke~5UMiTQZbS%i|{XrT-twJq&s z2Brn?5v5`M_j(*L7c3;sGHjlSj@}=m@`1s58kCyD-5pa9hTCtu--CjtcdW}x<g4=0 zcPd0Y3sTH~Ml^%`gX$lSs>3=u>AwEX8izcYps>~s<+^l#AEfwG%smQbO#Ud+%#vHK zXxbyseJ{(2Tws8))zaekdSEbm#iUS)3eeYW_ww2ykd4~}0RO!4`}ecY_a%RkSOr|i zz62gN1OEmPxjtUPp(cHyOv8oyAWi-#StE5lC-z)zW&MWNg2%VcD?=Z!&K|D%8X|W+ z^P)m4nej7s_1mN)w>3#snLww22g+69`TP(4aR{B<{G`Z8bF?ke`U;VA5rzK>8I!)^ z#u|)jppt)S{&Ya|h;&5z%j?T^{JJ#SZzmxV#|~ci!61AnooDVcs^mlVclPreePc*_ zcBKc4G;^z5-hf8(YO9)>ZU(gfs@s3#@d1ScqK|L0iPaM#+w$thYw=>HpfLG!%JM$< zPsY`y8)@mjpt4{)ZBvn>6ikb5y>?BlX8^4tTP~k4A2X$A?7`+rLq-J}75yq;?2TS4 zJ9nUXkIWxCO1(ikzLNPs+r*#!ZCm{6SG`)TQOPpUo7rLJ)Tzz=b*#)S)+EYCid|DO z4IW}w+_o;cPD<G;H8r&lOZ>)?-$pVIS2ArCM(Ho)5MC1N@{=g`?sFAwqZdf;!I1EG zg5VJ9-1fDqs!Btq-)*rCuFnnVsSR~L>-sFSqLCo-fqjE+l5&55Kev9pt6Av?w{!D@ zPvK}VCIkbX^&=tokC5{uLS)4G_E?);VaYq5rD!VJ>=YzKRrjXBYmKGnm{^I2I^Py$ z9_t%R_YfEW#aYaexb@CSubK9t=A+JXZIwekqG}Tp6UCOt3POvI-(!s<O-qv=5E<?_ zuVB6KV#1-H$kB;fedv|(O!w$Sq&9r9jmU=Lgl$7jUb3=~v5))$KI~m%Ycz2V4wHu+ zhQ<2<COVenR}*@!eXhOnStavO9`o$4dEO1EA6zfK%$Kdkz_?NKtZx9B<}Dz})G0Zf zavs6ARZ9fvUuJ3z^W;xzTP1UyD3t4$tMMxRM)x!;nMUNam~`~k+bn~dyo|ivd&`yt zSqbs!%-27G=^&4b^hBvGI&Tw$3c87YF3&G<u1eD$AC`eV8a~NZk68xPCMee<udTTj z!R{kiLUChN^~sZ~5Q6)e2K(=KJd=a2e>ho#+UpS|+GWa<SWF|&&S3mP=r`#0<7gyE z?&0g#rwS$^METJ*vthEBfT`h(^LzC)z3oCnqvOL1XVUdVv0CJwAPpiUJ)Y##c4hb+ z4DidraSkdRh=ww!2~W#>XN6&r)=?vc6Pzk>V0hJYFAf@PGDQoQ6i1b)p_;evj=KMk z!&8ZzP&&Qff_;J|)slJDKh9T&s6auAHkV_TJ?^d65ES4^{XuwYUR_?eb?iwamVKyC zE<6squRQzrlM4+dfiq4vmfm`7Pfrd~9-m4bDRJX3F)G0*f4n4u=OHz4FG-oPyk&;A zc9^^0;A1EBkk>(?RGd_->jk?#FZdIR-HXQt4e0cjC;q=?5lqw8Ef#SW=eGJufm|}e zD_E}hO;{;GaDIly(uccyMenJ6`zQLR>D}`xPiP<_@a+hXK-xC5yxKrWf#dJ1FTG7s zw@o`yQc)58+1p?F^n%gf8yg4W0%9ZfVD(KPAmc8<rEWUkXqNc%@}-pv9dgnpR%0b% zuBr69sPd%wP>d{0gfE~_YgVhiZ&!14A3W}XD-;L2s2o~zFy<YfI!g4Kp1XvBM(i3R zO@k+|S2(rCCKSK@0MdXbh2+aJZrpLx`49WbRL-?T+`xv<G|Xm(<d^ntisOcTm$G?? z_&r=DvIu`d@}1J45ylTYe003&#E(uoOOsWvnM%*uqi{gM#OebGH<|=L{yPC|#wMP2 z0o|1MLh5!P8pOlM&PE{Dd6fm@U<e~`9hF%9An8A{Yw>XuG@QTC(IM)V7t2AxiZFC6 zD>${;q?Y2rm=>gfuZskf*Binc4#aGL?mYgp&G%<!Yx%`<En%CrM(*VCh6%L}Ry4Pg z$yP0h?2ufqIYRqsRoPD$?OgIbjDr=Kg?YS)?c>m+o8+$`@SA^vY}Flpa8CP$MH><p zsWd^0u^8Z>w?Z-(b9fuJ54d&;;2}c50@pu}%%AZ@(-`HkP`lvr;GlcwXF6?5q`eCq zu~A)3O_OQP(LyizQhYoqRpbBH^et*+uOd}i4@Ep1LS@sZsx|S=ZGVY#=!jpkGXF_Z zB%cbPx`+v)|E+a_-k9zQ+hzOb3|)VB3^_)YR<DPe277_$Ws$OdyOd6hms<Lx56=0F zn6Znyc|WH9v!oNBH1W72$7);YAJy=&Zn~}A-~U#1c+Guqa=~RZw8c$Z3#Ni|iJ+dy zQ6qb;esb=^QtP3hYFVhhNrQ-S30E+EHK{wT#c%x{c_86QGw&#Ag~w)=L}Z-LSW?k& zRM0V%jhx}pTgJruc_8BUs=sZ`mEL2h=)AtHpgO;H>kPU>S(`GiUcEY0_`oZ;la^Uj zX#sSyI567<;b^~`X6e`c2SM7_V8y*)pLrxn*{)deuGa~_pPx*powG<5K65glMBKUd z)r3RwNE!UrtyAhJJX|v<-)S(*#Cs|a%x<q7N_do#=t+()9B3MRs_b408pl-S5O=v3 z<V=o|5EnhJMBE_ANL%s|6pgRMGq3gqs`hhcN|#FZ|G8p$-(<uPaSU|<RyZQ!RK6B# zPoLgpPig>bcv_B8YM<Fre+Iw!?p0->oN)cR{&x?zJ2s;5dgXxQ=#P04FVbI2EBK}z z8I`kZr*@4ou|hES>Nvwl*VU=(pI7pb?p7@TVT!u(rc=$oac4y?l7nO;tECenp1opx zxURC`y~Yv2SQ>dJUvtt~v(H%URv|3nmROJXUxq4iW9gN`MiLnf&zgOiuQ+Q}=w8G` zl}LFSn%6^zQik@FSV<yPEJ=~f;-5gD_-ew1FF^`_$OU9^uA5H3vF@Fur297#5=w+K zMhdGN8XH3}2b~o$5BE(!UU8A#$KiJ|SWzE9Z)qo_r4RlxNPBm%>YmcXl&$6IL7`Jk zu-c?U_vZ)CnYn)=K+8k_Ke_U+a7*`vCmLiL{Oj8{)uQ?qy*#0?d6>}s<3}RH3Ofi3 z_J4SEE{njg-bTtHeSx|0PAtT6pTAH&^MRENG@cs{C~C+@=DDAy-U8e6upQ<_J>uh2 zmRjFNkAinfI`9!F(E+67{}@XTJrpxoxX)|5Ew0H<4|Q32JM5LkB55o|u`XjzFYq4N z_Tj@w6p=7}5L|tTQ);ce*K=Y>K0UN1ea_dVs}UrVaJ4QAUY0jh;n3LlHzLnUnPGEI z+c@s2!MC%rj&Tzc5+}QF7qG_vLUO=pEG?CcrOksB216KelQ3J_=U0DwpG>63P1S3& zskkYuHOa2Xo>%mXuzd>eCQOwqLj600Pu)UsaK4b%qjC~Yz_>#nhwgLC>QNbo+;2JC z=_@AU8R4;XM6{}mIo?ds9-53+w>7<oh)I%}MAd|M|I7>x#(63ShDQi?#hDL1)~?On zv?e1z5}9`Q<Mqq0E){adX`%Uu*`a@iqo&!le?vgD=eK2QC3!DBd{W0p7xoGBB%p5l zlkMG+CGU7{_yOE}W*h!2r}rb(7y$*mLnCEV_TkDA&(ag$JxBX7yXY6H$BVXV7b_aC zSzJ~B=0Dvv_~F4mANjc%I(if~cm6v)gWiZ?=Pn%((IOr$E(bljp9R)VMyWH-yl9Ma zh$$!Z!Uh>{V(gd@)^Z+GyAsF8pPHRLaQMl3*$N}8Q`&tUz>)Cz4w%3bySvuA6gHQ4 z7^U$OE+i@?A5Jr$it6r$L-zBincJn(Z;&2@h5%u&Vu)$uXV2~~zdaO-{q^tOf|h1G zij}U{PMY^XNC?}Yt*7b7@qp5q5~Z0tiw}>?c<E?fgt~0|lUnaFG=hl|p9ykxvVnQo z?~&WfSh~D)zUnZK&0f#yixak^%_r?)#i~`!?E))s!%<l*Cjj5u8_VhUq;&f;tjbK% zYbKsPw4r1=5%|tFZ)pH?>q6+|aq$w~AHBkAI2D-Bm>VwP@L9FxznQ^OOQ5R}VvPyy zq+b_GVxOZRP^-xYB}yYl*V>6=NJ|XwOss7v^M-C9TD;%QdX_>Cd$Z0lxTc$6WqpIb zR9=$TBDIBavNX;`x4W}3!0;#5uZ==){*+}Pa8vKts(pU&I5RkH$b3;mtbg+}?R+qv zF~VJ)M3qC#WDMEfQF-V}aLlYtJaaGUUkr~YL!GTItrdLRTM%XLSgabXD5_e($ntw~ zK~krGHt@KS^&9_*r(;l94wDOeaK55(AY`<Y&F^H@O*8sf5!LoV|Ak$)|7c!P1ky7D z)AuV6e`tx;?19&5m*<uJd0i<O<91D5gx8LIQMzRLFH`|7#_yks`+-ZDsD-&i@go@g z*;>}8!jJUN#MPx&pOSEkKr&d7+6Cs3K?mnB-)8n*uzk5lw@6h<g<eI<_dSZHlY|D9 zLxbS~nDYW?5p(byF4fxqM!oKb@6(0A>a<b8igw<*@{M=RghQK4s^SX%an*Wt^l19+ z#m3T$)WRT1^~(=Md~tVRP%d}5R_3~MTpLEwnFo6+*9<L5(f2;O(`Wm|v#z!;+EPiN zJ`nRo-wYy}n}BI7%Kz2qe(sLGJUjN2S6a!iBO`6YLGxqB5ezYFHi$)@+Cyn>tAXu& zq+xE}Kka9e7r%41eNO%bIKuzs%Ix*Z`2Nhy_uE=|Q4}*GfL%0Bl;y4o_?7IT{Q&4C z->Jv3>K90;TRTt%apj=rQYyQUL0N81jdN+n_JJJebS;QJO3*-_BiAi4DltnZdMjj5 zcDlJAhIX!ZATG_bIU17Wem6ENOZ3>1*)ojn2(tce>kc5_$4TE#FT$-0ubFuBW@Xt* zKLdG&BmM&0JOEPykp}AlpqOs8_Fc+RVkdc8y4LG7Lk`N{yE;U<-2x=fTR$?j!haOZ z#P3V9c|n-CVS|mXF1=5vN+5mn4_BQb5Ewkvv1B^G7vFBx(;d`6S7%gosxb@1(mImK zZdt9PhVu;_1KL6E4?S@osv}@6OLqsBbYt}3^#%<>t|w9+@SY=8qxtXd0NKD48aI?B zX7NiD_ROIdt+3W3+HhfUOP9zDHEr5Z+?bzGu-qM7K)%pS1=(INC=s%T)TPU$R#X+# z!)?jT{j?V?O(-6Z1z5a`Z-z%X>(^y<bKz$CjUn;zvx+_G=c4Nlhb5ZHyC6A3wtLN! z7Uwx9NRN#)uDT&=(2bWHc5HeKxq`fWN&MS}^2|*?^|o;Ik0V<O5_c2A`Hc$FM)dh) zSMXOcq8?-<D?_JUQkh7O*2|5zMZ!%)aJ5l8pKsD>{Pr!UChJb0p&!{zy;O%aZwPGQ zsm*w+T2$LS!u1u%zuvQEcn>}mOLe2^!uM4F`qZ@ULzYH$tsSTy!T~MS-sZ4Ib)o~c z4|UEeuCGHY{@>Dx+onf6B=&#X)`pMS6dTRD5J()&db3il!N~=h*zJ2_%C20#Y*|jT z9vW3Q9V$FcbkF_%8yD()Z}U@ROEhyGZ^zlQ-%(Z^NDvU<vadno_-#z>a#tm|8@Q7S znjVS5SJoQ-Ui<&8AZWGlk?{0-jXSi+`VCWbqUvD~)>j*}#_ovPe|XF7%_V;Gm4&&a z%>$1l;)Q1esZUQmk>2Jp{5G)$<S^;)N!&Scz0KR5=Szzc5Q^ChW6mT5p9clZWX$u( z8M|>Xnisi!emcTV=Haep&!(&KPY%Y+KNEWpd~pcctC6->_oy6#^LDcuR{m75=p8s; z0BlwQPI0oK+!WlHJ&0!x=m&mT(3>aj7Ss>ZDy?}uYiaJ)y+N_v+kd%i5yPZ6X1Tqz zxGic8PbJYfVV@}%I6MF}5=d4jpi2)yCL$7w9`&PlS4aHbSZDd;Q|7Z<n1@`h9dG(Z zeqm+=5miC)@#V=i<<G^9nJtN={nOnle7-Nmd&;ND>wCXS15PV*Z-su~w2=d_st}!F zGYn@FBnDe0jxGM7C_V3wr>%jZcD^FM_;*&LLG(ZZ42Tsn2DJe@Y-mv9m@YW-^Fi~Q zjYE;G5+tK@3SIMZ2fv|&y!}<594OKUlNQH=%3p*aKYG;LAW85MlW6_i(Ous|#Wc9j z{36fMJR)u;OUqa8V5=v3ct^yw5+^EUe!DvIJ91Od#M5C5MF<w*--_*GOLpgUbb`2< zDCW~V`?R~H_ZP>R{Gnw`?#-KSbbMl^Qh`B|Sl8o!HsYSw7<}*-64l>4Sph*_mMRSe z`lC@?>*{s?CPd0SSn-EUVYG*Lm+QF^O};&*n^^4@!QqkBLjazDbRk6NkZvjwv?zcg z!A{{XdoBqa)X_aeQ3tRK0<fmc=T1jWcT?`bDTaoPZ{|-p6qIpAXW(>an`LvXtq)hH z-Ge#&*EHC-Vb&Uo7LKAIm*{ccb{^Wx>B8Pvm$^k+gzS<!?-!&H|J?MXC}v+wLa(s+ z(8IClah6Jp1OLvJ7O!t=TGTVgTq(rj+M5{fs4zC`3O1r&2m@3L#-^94>4T_<orm@d zRXKElsPmbI(cl!h<W?E8TJO)jumTwcpC~^AJ;$RoJS^Wf48^jt<v_mODP-Akt3pk5 zmh4%lBJ&m4`UAP}0|U30J#F~7gNuIo$@L+MR|&lpQ{dJzIK5yHP7uM206|m-<yC1r z`X-U@jvi}=xqGdC_@S6zKoDzfLbL4?LP+RWG=)2cN={G&#?4&kd3_lZOVgU<8>xR< ziXB=vgxx5-m$>nsb)Zs+DYwK&{w9fh#8_Z6n9E&&um^m`z5Xp_<<1Y*OhGZa#@V@- zlw}q+=OT?G#6Ar}GBd`|Uvj_lajrT3fh;Xq$#M__R0pi}m@&D5?St20QX)P`qTzwH zBZA_c3OcRB(vy;U6lw7rWIm*7+9%@A4!ya_?;mjNRGwNb_BZa+TT;UZdp0;eG>xw8 zY^}(HxJZ@QD>ro&e>B3Sc&WIVMADAN&h&743_d#A1P)md6=C0Ze=aYfNCC;4)!u0! zw|i*h&7kcw?`*9(RHCpK2inu8l3bbdgIQt#BERU~*f4y!zP5Jl<w177^EgCQ3+xM@ zn!iarwsL4-agh&+JED+oybTHBi&bQpY42*T<5=HVonv}VFS;;SLsB#{Q*#7`)No6a zu?8&V$2RrnnM2b@H3J&MYBPJgb^Y~boY2u3(%9y?Wft>TiEnA{J#=&P7Ov*Na&;o7 zpr4jG(c`m?gD+j_$O5LwtXM*0wCLA6PbeH18+eV$W<LZS$!Td4m1{vuZmrtr7I0<i zsY_xTER}{pULI03jR$LhO*>W5Xld}Qx#GizSHwpU?%=0aSi%=W1=#KApM8xeu?ajq zUvY<t)qQX_GUNe*8~YHFH!D~XzPbW;X68s8)8I6ZS}E>#g#t~3maCTJC#=>Q>Bygz z6|cV63gxeJW0qZe`Fyw)KGE%*DW5?KZ^fuIyg2b$b;Vk{;)j6tX*TOWvgo24<<1B{ z6Z@X5T*u8N7B^LAMw%)8;;15rC)-qd&o&Ncs-U{CyjvA%QFVQNc)z`Eup6&toQr_r z`|m>h#t4N2@taF*OsqZzE4D={U6(mHht#l^@unZeR2aF(vxe^k?cYMaVI9ccPUI!3 zB`LSvbe<lL0TVw=O0&P}uw=Q}iwX2ejbO{BP!8sRA&r3Fr$6*6NMXTUew#CHUeT?& z!A?dpCU5P|+k~1V6w_}L>uiHF`!=<UILC&F4`NOx3uKW@uT7gaT||rULEQKZ1E<#= z+uwIq^iAD$=jP2o5E6E#YWNtcxw9%m6c3Iw-MZuJ>#MqfZr9%Yd@;14!!0hlY=6gu z8OKsz+_|jOx~;}G5pgfyl3CH78zNEIBVx`1K{##GxAo;~WHx7nu=n`G=gqMLTEgXW z>`N>`gI$QX)ZFCaVvFhy2P;liQ&Xc|BO*z)Q0z}LjqF>Hqr9{&TS<QQBjy3dRwA+Z zdKs*agQcVmnuGdewT6VXwG}i`byP@Lg0#4M@|%sFvGMV#8^W_-DT+(8Yv(&K^Cz;k z&$>`);yNJLt!Pd8eNx-2-W3v-tS@&n;~l|bJoI=ke);Gp{5#HcFg4nF5?d`lW1QT* z9k;7}<D<-cA&@rq79acI3DOcfM%@Oyvbbs4?F%eIl~-9L`eAlNP8)=5sVDXQ|H`)c zjv@Payd@?dW+V|jWUIE;$7f{9=I+OZ+ZQHs09NZH%orGXYHOLPZ)>BV+&Ovp{JK}Z zc88-PK5X4B^Z${E@Be*Ua?>UJ5gJ)7^IY^CZj9NSo4AIstMQ%b^s#GfwNeXn|NYHo zd38VS6M{fN962Oj3$ruHtl~;p-pjbDJZzlp2fU<V)IQTLQCeo()i=;3S7R{2yjvCq z|H>9SBdSF^n0kNn8J(gCwb@zp%YDJfN1qF5Q$Hifru}8X_rY5p5gnJLx`~hAu(<IH z`Hpva4@g%g7iFwKn8gPz^AwsjE-bo|r(xFl`sxx%;dW6StXvhI!M+M>$mF8g$u)I9 z5*nTcjLF>TQvKxs>N#R~D48npg1O$gq%9}aiRbtxxDfHv2Ez^yz#y<N)<x}b%wydb z%E5H`q-@@-BX<Za);-{5?y_qSu@9~cbw*2<jBRCfXSIB{4&je;#f@*`sLpBrtBzJd zDsV-1MH~_VpxyDNKFTuv+J>6Uu%;)H*0Y58jd3)}5WzMHi@|*jGw>=EW9cfCbZEue z1|JkBwk4ViI@EbWbYW4jqF+CwGYS&dUT*j+3WGE}Sx^&d`_ExQz&YE+0=pWvXCE#I zQ_m}1a&t*W*kAvE&dSR3DYtJARhAel(s#HB+agyV^)5)7KYU)5S?|^j;ZZuzvJq09 zDin*Z!U>7uhCb$(GtV9S^w?<(1*Q2(|NW~LhOqtT&rfoB-p=>X#<E5Y4wM)AoL4W< z>=n4w+M4Qk4rwN0x3c6LMvtvOi75~GMrfzGHf_|X(|&WNA4b%QZPUo=^$yD2kTa8v zPD0qs@lxTjFsk=7BvIoKZg63dkmnB8(vaUln(81@*_8(O{fc|EVzku$A9O`bDAH0# zziU3z`PA|5ru~NWm~<5r&ikrAIUXpWNh|!>c6ZWlF}Gkzk4--sw!h2l+O9jgaI<mI zw(MosI$<luQhI|lAUioR@ka@VoOz^d>w$Z#74&MXdJD?~Kh51>cgu&8mj*~NWNE)P z@z3D6?k*9X4WV=F+7o7;`U9fTBXGIFwjWKgE<UqE;dvknjV7MHPXh;)4}cCnX3v|# zw=c$h2Jh7B`VS1T{lyPuuP5id>Jz!Tx=i}e%p>hUf}AaUY1MH00C)r*q`6h~I5T9n zESECM3wN$b^(igeUca<kT^8N8?dHA9aukjyuea1#->~^uwGJNhDx?v{*WRr3TKMAV z+}!@EX{NfVb40Ez{8OVB*ft)#QIE_VP=|;TaQ*t4JO4;-Z+>4<AtLGqVjae+be-7< zq)|X%<A)O;gX4+M-Uc0LeW2Myyt(~ZA`${Tk@wV&zV%craH<fbWnKW$TrKnfg=D%> zo`P2K=&TDgD`$o*!xXw9e0mQBosf%JFw7cx?oP~HSC<l(g_T$i-0v@V+MvMUfMktW zLMu9chGqZ7#hWhk)Jd~<;K|J;gMt+=3gIc6OW=#lhzx~XU%;{0#Sxb};sgBc^n#=w zroqd!M!un{xJ)-JKK{=qWy8LL{l=?^uAnX-T-~xUN%go(cmq8&QzV-$NWnd+*hcU5 zpO458bwl!L?Kr=cE=t6?YaAWL_#StIWCpAXzGO-B%B8~Ei^zg|o*#BRFPB3@L-OMI zLu**fZ8PoTqT(m@5%dNs=+cfFAFoT;dP>h-fs|nYABONc*k)G@gqpax^19TBeS;!( zr$=Lz36DLCaA9nLCZ#FCM80qJ^)1D^JAB5m!@!3StgT*i@xq)^%=blDsw9{9!@}as zFq1(Df5%IV)#1N9Ug9H~Rb30C#hpiw4siAMwm~qDDWkIVLxyTWN{H4!NN;_E6e_=b zd7R--ZyJKNlav;iSc$mqx5U&TD6Wg<gG@@k(o;FZKq=&)c5CI^D5QBV=0*S2)YOa& zJYQHl3gY1hH^Q~cC|P{sCI%~JZXi=lM9u<gAT&S?qfa8#4Mo$`*5AK*wdHG?+g6c` zc)Y_mD`2w3{RG&6GqH8kLXg9li`p~GUEWQemsW##w<Us?kdxdY13Q5_jl=({4qHWe zOR-4g+;F0d)GEeASem{Rm}~#0aTGzBxKZ4jjpGO822%RIn=AnRrU=!7^7Bzes;(&| z-@$-~uT6ZHAa;N-)qr(=ewlbnyr^vU4pLa)>OEdsqLK>&Z@IeIpH=A6+S6iGkmfA1 zZYd|e&68)1g75WWe`uEuTT$gbhPD<uMvH={j~syTe}1s|@J-M+q&P!%1Jwfz44+-& zJ%%AiBo%p*O-A#TpWXK~jzkk?qaPltjt~${5&>saTZ7#<>v0w?nD+eU+2L!reE1U} zLZLxo(nTORC(XY5kA2Ndh|`{<y+_FDzamXrX1T={n_-loiUe*rqk*c7Vd?`X6eL}B z`B1#M!~n2eYDZM`49~Bpgve7XBAzLARSxXRvA4C=JCs-5wL*26do~5y(qwpFUQE@V zx3=u|3veYn>Mn=fJ^B~?32dPJbM=27{OF=MuLr<Ba>JjTBl~);)oW;r?76{;0AFaL zzF)AXI7HJl*tob~?;Q4tbf94pS9Zg>4>t1f_xF!qcJ0FAtAVrtwaO}9SoGLjQ<`vM zH}_17*=JBcJXoR^z_&Cv>HU9*8w`Y|T9Hi#%|XjUb^n)UaYaWwCQijKwVKIjf%O}4 zV&sjb!$q<h;U5y<i3JC6=Hhs^CUHK|-Qlq_X!zYoy1|OjGBV)Woiq_H5-F%z`hoBB z6Y1yM^v2|w7e#Koz49lE)LaG&Y(N19GW`xREe3dQ+B7MXUKesn<#RRuI%!&+D{53c zz2GE@k|JR&uO@@zTt*uuXPYP**xJ)78b=A`*U3xq$!rL5KFf)h?h-yb)Ojy=aog?N z)0SAB^3oc4+pOppV(p($luioL^BMS>dF;j(Bn^URYSk^TZ`n3)*kDcbWZE@s7Ry|I zMM`a(uRqe&f;96b+V{`qJAq7$6@pQ$jgst5jY&s%j7m44*R(#n#muE2$ct$ty;tq2 zz)}v@C>iSP9O?FLX3FMO4ZB@s_Yu<;yVTnJ>9c32*$BB}zc;r%lFZ%KH|Pox5BM^P zQ31&d7)!>}_>z?Ic{kSGF}Dp?6v+su2)Uch;Ily+Z0zk*+-B|i7NTgH=HQ#^RX5!L z0SWDu?t~Ve3x*|Z@1bbgyRr06^C%3h;8rW_>^kq$Bve77OB<K+WhQev$i8-Ub&2bk zs^8JywL|Y1-3GYPQ8(w*HuD-?iT9zcrF&>pZFlSXC~u{fd`thuBKf<ol;s$qsYX3u zgraG>#eTzHs~@F&&mc#%UaAnu;w=Y7)4}H~@~)}N%gbjN_oA%ma%kzJC`Z}8$Esh? z8EZ@~M|Bv<3@fZor4r?`n34(_W+tD5L#El0^(G)d9_x1+>(MH_+SSibd<aA5-91m{ zA=M(^M2vV}jy68{Xku_z-LQ;Vp&B&fWq%*3Z`h**Ama2J)z7pm_Vgd_(ez@G^-xAh zx5t;phsQebO4++S9?%2z1@e4d^P=1K39SqH&ANvR36~H8{{S7;G3X1y07uLkjqH^e zG}5X{Qhwl`{fM3H0TE3%*^>AOp~FBMz#Q&UN^bA)$WwO(xiuf4$hHJ@lsqG`u%n^S z>osPPlU_{TJ~KqCYh*-33F?Cil5g*#VGv?Am-LakHK58(7QMb4j3msm-^uxx@{+zy z7l=*UdGZ^QWyH7mGI(;l#f8*u^gbP2eDza{oUK50SrEM=+OQxh1)4eyPR9x~jvQ|D z?V4d%Tn&q!*Q|&7u?Ncs+up~^VfI_2L+a)$1~I6MyM6ifG<=_9sZg1$x^S!CSk;0k z1si%0%H;$!gtssp*jmY?4G!b6AS2I_L|H_j@EJpB0r)dsIJ)5SR)T2N2#rT;zuPNA zl&$$ItMmJoRiZ(B)KY&MF7`P}ifzy`Cu261EWpe%*Ak?+7wdgIG-T;kI)Di4L9;JX zjB3${&Rz2#D@ibI(F$(=K$a4+v5C5%u_rfx;~OHh4;W-}vb3V2*4d^3>A>TcF9%_k z+7UG{Qh#U4RMdY(TJ!jKh%+|`Quq&5cf;AK>!}TWU*+}~v+`Ny(8unjWX>!bd$N+; z4RPZ|SB6;m9f`Tp#OXA-Aja+!ot1O>>*C83_p97W8e1(PnZ}!rwd;)+LV3i#Dk24d z&2IvCzNF8_0}Q~z+WL28WgvMM3>Ip4ihg!<p7QtzWgKrLy$6FRl3I28qGr1Mv)A#A zlyKqA#-kEJt04$(g&40B{t$f(c3_%gI@#XZ`aq0Ckb?ib;7i$bl928^grDZt=8^?* zMgBISB;Yxfq}cV8PTU+p8wrcOGPuS(D;e%PUAj^BIi3JbF)%OsgY%Bj%_Z))ZVwHz z$G?33h9QIt1h;*k+2bsKoxxa8AM5fND@**&S2GEVeB&;GXcSp^_h}4vbXK=>#0~~Z z>7ppEdlG7hK{++_6$dHY^|^VYzC7mB%BO7C>7qHE6DAtt+IL=wgRyl1)%MTkT^z)) z_{sPuSiR`p6L|9b>34ifX65`NhaTc;{MQQaL+g)oG^@Y=6q*wG(oaw}0@723%|DF% zw#yZ4cjP{+lK1aViXvZUSzGI|Omk6=w`zUxE%d#bZCc<8)!(ax8$IXGIIufF$@G<c znBrBtt4o7(0)nQHOR4VJJMwjPnO51Pgu6Wok}4ORV}N0|fdzy{-w&3uB6J!@t0>~b zcG$6<BTqZG4Z-)03E%(v%MEAr3cFKW!lN;^y_t34CKW_?7a!~x!8=%meG>?SDUEPk zpi0?8F*|^qL(58vLHN<B@KcLo*%(c5Y;RF`ebfrI>KYxn>HdH70{%(~Z`+=yH4I7! zt5O;*209*tMF)k<c~E0dJ3|x#3`YhHzc&-Zy}Z20^Bj1}vG*yXd)|aF?m&UdY*K4& z{gA~H5*cGOg%FmBs*^;}9$GOFO+r~futfE8hZ!sHd;LlbkM+}+lWI=C5siA1T?W&= z48Wx9zO(tY%^ipj1`ai8djO8YnTDfC-gKsaYeq${f+T8uTka~FzD)3Mxz>jsyhhju zl!H$>AK|LbNe3`i55Lz_C`s|$Z%B*Y!11P<wu;RG2Wz`eSt>B8nB*zv!0EwF6rmIT zYuFZI*tZ~QA2i}<A$ve2vyxO#i8uA0jMtan|2u{r*o}&VM=X&Uic1~ALp5ClTIS2S z;NlS-Q)#GVx|m3sA89W)fWjYE%$F@}4!%+Unx-1wwqo@1o_5_~RG@POA0(akABi4~ z+1&;#Y#?@I{GNaR?^jkL19lGV=Gss~3KCVI8zfQ`PcGO<l!+BnW3AX84#-LjH>c-b zOmvoglq%?z;!C1l_d}ap3lZjXl|oQUiqSg^N<<9kyp+wG4#iYL-}CvSJ;@5_&ieJ` z<v8g1{f1pXj?aS{J+(qrNod*>PH%a~W)fs$UDBT={ku2j$|EYQMS__%c>nk{yMm-p z^7xd=12Dv+oXf|zQ1BlT$nHG=dGj4*wc20f;0s3wVzOcdqI`{<<9|!K&axleh>y1= zFc2Lox$0G3ii7I}tnJD@b_M=@w#9#m9|<8ZQZ~z*Sos)47e_kYeokntpNZ8aQbKks z=HJ*{($84BeYM6FQE2lwDxie(a6_e^Q)XU?iJw?%ELXeE2y}3WRLP_Io;XW=4q)=k zeqFb1B`Qx{Pd7Jcz8{pIiHgrR3q!-U*Tmin95Oks<do-NBZmk&tDdyCx3A~%Y<-5x zsMA76F1B<OkrE`=*bgbH$v5Pb=p`7wbxrNgQZ0DOv=SleQ73v&UH@S+{X(-1qFXms zQtv~xxL=o9ku5byhA2FJ#f?7^Y^e=Zhx<JT<Rt9o8k=FfF91p9*UQFd5z<{NijsM{ zJ*)YgKj|E}q9+JF55;8Rrh9-vWFIy*TDyB9DGPP}2cb~r>A3bl{`J#%P~>-o{5%-z zf+EIcpQFD>=4J>ywE)^gb=c0rBvqYnzH`Q&?0!_+-1(E@MG{21Eg3zAL+)gid@mQd zS+@PbEY|b($^k&*X+*!EX<!vES*i}25rCgSBn#4>ck$%%`fPrcp{MG7^7;Y$9MfY| ze2QK|g>Iky&$xmlQ9-@Q`tvdzJNio6W90hny}R4^>e7|oe77E<&gVS){4?X&ZUu>` zrI$;-e?;GFzxc_7>jys_RPQ7Z-W4Ybe7;!DhYeco%VSi=q)oLD32o)<&unk@TsRwp zEiUNiyb#$9ze6}OS({2S@bv$oj~j#_wbZk{u5F@eFp9||*On*vV+x%)(R8q=QCDxU zxZ^D82cyJ|OP9+$#0alEs*>tJpjlB<Fuu?!l52lqrG6}AO^~=>I6wGTE$8^n&rTWL z_X)Nuu4)TdOQ>Q-*$oPsP6IFElpcjUEsB<1@HYQY=d1F6EBl;^QQ-oYMZ`BCXS|>e zv`rPz33@=NRGsc*V?nW0f>y+{HUb<7B5~sJ2Ws43oZwKANw)+EZq};9zR$gQ4|OJE z?}|IL`vCMUJUX|!g7sM2<4&obiPdu5a~8yd5&rp>YjcH)%p(>aQMfL0FjQ&-1%`=G zi#W%U6feRnlx0i~^1=4zJ)`czM{DFcuLbk20X8BS*C9q6W5ncKjVl@38@br7|9tXf zL6PZ24Rkw4e&}WQKhH$iLE=?(bo6?%5Wpn4dGFpE**YBFZt5-7O;|#5d8)slLZmn~ z4=F4(HP5LgQFyWDMUrGU*k<{9L&lvp1{7@X%wiz;j#@4nQ+O&&GUl}(%_KaMIUQ>g zIyz&*0d8yN+{M9)Vu3ZT{kU?cn-!G;&R2kQUBF$>hm&P&^;#*<y=QoAAHlXvp{Ef= zmb2}OZ~J6gu!<0K6zC{x6MX3_BJ}PAsJ;oD&-`9wWWOc}@z&;!6Sdx3b>v3UNU{06 zfzPkU*TSGRcxGY{i!HwD`#kBt<m2*&kBD{?>HDEhmT%q7J4pI3S#AjgK^PKNP<SXN zO{w5#Gx*O`q5O^K=q-1D?2B7qYhz=KS>@WBt&V%(`+J)gWr5p<6x6^4BxYnB1`A~p zCs#{Q&Qzuw6>8^ic=gVQC?eMeDfqe*?NiG^xuWP+VWMhBab!^qw?TJ1+S%g=c9fb- z!+XATqOtUzR>0<&6x{A?s=T*%wZ?px@O`2VxM0Q3YEX5{(N+gmS*(Z%4{z@|yf4G3 zlg*<%gWpp+h$fa7{xFR;4LKC^w+NVR->PF(I#LY!Kz(v~1mPK5TW`q$Ru=_ot&x2+ zS;*c>cEFeE&pSE|VDx28gQX^&ezJvQYux^@U)ik9hz(JTb5(ACS3jd5$-h?)AgET) z)k4lzrz!NNgx2091kB#yftER@oBPb;!-c!^ineW_3D?Z(b&h%dff${By?4V5NnInR z;{Cs<^ua>d`hE#=MB%<nQhj+Y0&-g%b%U{+>uz$1=wBtPK}_UXBaeE(_Kn)77l_Jo z$qi{FT_Te%Bt4JMN3^Xc6=?F#h)NOZz1eA8bgL6{*7t!}o#zSuggt)d1i1ZQ{6ymW z3!4#D1S@*q?(RQaEzM&{AH>%Co!^gQzH^Re%P*(mt+2COuou5c8x~=E(kOI9mJeib zIYr~AF@gs=zYnAOZkXU38FNLRqvQ+PSLMb3?5`atgf{o@=i6Qs9g8;sk!Gi4U<GS& zKriXC_wU=jvGz`tD(v<^osfQGyXIL*GSMbU1lbct#4Wzh@f{*K$i~0&zD>p)>|XrI zsn+W*!df1n6!9$B^#OQFKFIUEIb&b`pz9r%Uwph;)CzF$oszkwpLHybKU}l$>e8=6 zc+h$o1v{P@4nJ4qnre7Y!|eX($zjeTz%bTno?Rp?HL+S+lF}<Y*5+6>8BLURLIWlx zk-eXa>m3jQT?aN;V$(A({8N%5veUX!U4Zt!m}H8@q!YYL(U&nfS*hb17NauAh}SJ^ z=E$S{aCyDeIO3FAQdXp8&e1vl@?y4=^1iq16Q+jb?@^Kn^0c^B3bd8(cbG>?Cqjmu zL^Agaczgj(p9qJD?J+L;m5mAXsPJc6s58Iy_tn!QI{R=PC%~XjM3uEp?1iG~$5#Kw z)~3DczV{G<$)$h&0=Z0BI(==_XBk_a8qZ1pyQA}_Y5~hQ5unf4C9k{q@_h39Z)ZsQ z&@vBJkeD*~;2(OpKt&$1H6txmLMHaEXH%i@*G7PISy+<d7g5_r4CTKR82h+H!s>|W zoOO5e=;BWk29UUkBk_LZhMz=j+`V8BW&*trOGr#yTXr{n+3Fq*&27teg$yP#gVf{} zi_E*@9(s+@XiT}6^sO*iwc|Z!<yxL{-qmW+_Ff3=O{8M0*k5(H9adrA!?kVQy#uu$ zhngv6UvT-*$aFQ8BRMcPxp1c5PW2IVz23c-k47%mEeoH<LkN+e5)VFf&eK1?Q?ol6 z$2;C1^axxd#^gFGka@gYt{^G9>iJVh14c?<)(&FbyD0#V4pyvd+z|eoHFQT;Q&SUe zhnt&6@d^M=-m!fiVM`V@gzD&A4gcF^t`6pLMTOVm53Nw`9rw$HZgk#zcyEZCTPv@p z3TznuR^T#}3mxRK>QU(_1dylJH9;`U#_K4rTF{>Hys&BC7v@coSnr|M=r$SaiKo@b z>rH`I$gOQYNB)KFwKpP#3-VE(rEck*pA>l5U0-Ip&(W!N>S{sH%DUwPvT8)#nL2Tk zf{7Fq!O;jHwu$ORn|l8z=;`0<v<K1VN=-({o`J)QoDU-LIukA8s{5UPz#P6v#(CeY z3t@b?VeoFlbLt6wvg;~F2vM5u&#XlPF1LjUjG?%N7@Nt>dWLIDe(#zo{^wpFd4-Vt zIb6%h+1bYzsVqI|?7hJ1l%tA_Pr~A>e+l>MfkTmf5Au{;3~c8E!ei}%gYda#u3$n* zPj3$qyh@FF)O~ItsEB0m6V@_&>D-g<x3??C*~TzCGqZCq;y(F4O{GkD>m400e3LZX zr62*1yy}=`pdm`E(`HJ_TISnX>Mw6E_s*kCm?Xb*IA7r>yIOES_HR(hMnX7B`3XNq z$D56((L9U<L(<3F#J)1eDiVjQ1I^Bcl&wT7ng0AxUT&YrpZ}?-2y(cvZPMulXf~w? zoqP`?TUjZjY{va8@{s+MF==CtF*Pq5Nt$$KO3K?j)3)6nqbg%m?wgm8Fp-v6V5AVZ zP50>5J5V7$nLG{INlCA4R<87kQZ$_))9)pDMhX(M>b)}dABwr#Yjv38nPKKd?0d4n zvX6+%F87{~f-<W$vk?GZR?sjsEL<Wpjr;{d465lR+0FlNak8;rE883KznHPK{yxX} zU`0=W>Jgx!HlZ!tSIBNckh2#t#@gj-#P4%Vn^FA<1xH1!%ZDDT)7q*TB@#ku_k2&7 z^+hgB@WCWU*?%ccnN{?w;<Ag+q_bvJC~IdfMw?Nm(;ZRkZQma}ZOORNl$2)DM9(%M z8n7jEPoVnwYid_a2K^>d$u#*Ftxkyw+o<+Fz&pQlYqWhr?T9CGpRH)wt)8^}#%h26 z@(4u$Y{6p95mENgjbG@pIn!Qf4PbP~YjSUAW9EJYfKjy!w%pj2=N{NSw@7}!CqABc zy$7}p?RAm)PGI!;BEeV)SKO5()qrx-GvZVaO+u%}Uv0kSn-{5r!gkwO$$)HW`adUk z@T=M|s4V-7ul`w;p7`_*o|(G1@3t}~ReaCnRB`8FSQ%JqJ~#(_&v5y~(_2Aw19qfK zQsWqgf3*9B-7jB*Xflqvej{xJ1>w<3xHUyqvMICCZy+Q)QK4!c2Kmi@qyLfkh+SdG z!*h!bcyPh3X;r8&HTSk~-tX4YA0rNbi^72B4CdmNgn-U^4r((Mnf5R!eQ!i7$_;ag zlDm5c3s;W2982gnyF3Ek?Syh-{@jBVzl)@h&yVJ!IS~(3XPEOJds2nM3cZP^7hJ>w z4td#6h&8eLyN<uFdwI>4p!cJdJj*1o4mE7PQRZ6VzW>SpQq}c<VAjL5AYZg6J7J3O z`}OPBN9T;)MXm$F2Mx)PSDu*;*Ox_*9qdj#<Z{85PHV%r8*f+sHe(*UcW>8riEYJ{ zHa1vfifoS=HRm{;TU84nFjw8QP(4^79tdXBt7!=CZiF68!DAj5cAE9y+k;78kfQ)7 zp)|{nuA(0e{De!ARI3*{v=5e`6#-FeL6X<MB~fJdz&dQCaEdsssEaNu#hMUIMGZYT z=l84&FS2gbcfUAzasaPq9vF@7<;C6)n)O)wWTR?l2z4Tv4_&=Wt;dUkTJs$}rxFvZ zhvi0EklVdHB1Q!}y+ocnXX<Sc4Ik(lt~A?fsWk{XL2lCGC(GWwYXWZXLk)|%y80%@ zaK_4=tb<?RHwFl2DW9~52onr2Q9f{&BRo1Ec86(RPGCv9V>AUjsCkjJu2qeVYQZu( zOn-@xRSh$1Y4L1D)A2(1)EpU#a$6{i@5cfEH0i&utsSX4$5xG%_~?M6(g6?QQtQ*A zKGFHwUqcIPQ5thLG)nD!N66Ba*u_^JhMBm-@$Z!g+Hmea_Y1d*gocxfrU?GeaqPSW z%Ic;-gea+)sb?hz<nUm-@@g#8kp26EChwl$$yT0rTSm*t?ZI=f!DiS5Q`X~y#a~vf zSh3+s{K#*u9skA0lj7Eg6cs7)9y3|6ciXCIZ;_pQU(0;FOh0{2(I|dl7nty4d>Ay- zwvr_W4VOLScwS+VR;C(`oAw9GJ1P)VjNj)N<-X6Kt!i3S?db)VgSTB8FS5_#`v}=~ zm4w;D<UgEaOw|@G5TP}YNq?eoMQ4`Sq0%5KbWvYy1t?#)#jO7oeh3+kYJtz<pX8Sn z26QzO3%JRb<h9YE7gze?ct<Z3^YY4ij{+yn@c8&XSbJtFcSS>H8QRcUt!VlIG(SOT z8rFc}h@4(g>#ay#HmSwk+XU?ZYW#|h@>bEut)J%l^K*eim!=4Oby=~wq$`7SXG~5I zeP%5_8?;8k@bGiA1G3$~L~7Wv^vKQ_l?BVKPCfYeF=pq2Zkmv?;_BNC5xSL&Jw4iy zKGBNz=`cU(LO#*^0A9?&Ha4M#+mc(6<Hx!fOfgS>l=N+yP`<Aq>DzxU;Te|o(*uCA z2GgE?|747cv$ZwLQ&gDZ1gnH%##shgR=w}}7LhB|IWpuP)&j)%h|)pUCd#Iwhgl+X zIijG(hxp?8R<G9z+JdjI-WUg*)<w*^guz@Sn`3NXJqXuYkcxi>AKY<%?y+h;pBpp3 zO_!4r^=J;nNa;a)ogi&%d!(R3Q?e(h_-;nW`1p~hoZnO59I9x_3-t>3YAZz1YX|R| zp^Ie3pN*}nU^*aJ0hfjL`kM?9DDcpK?0mN`?(M{Zy#cLT=U5#<&2`Unf7*{4BLxj) z@R5q94UHH^M3tpimR(~$Le0S;LP1M5qwhmeJ@P)su0Jf6eJ>>~yY^m?EJ;ZSQJet9 zP6*duQVnEnLjAPNafD<nooJ0DzTt<SD8hcBumH{k8rlru4^fAs_WeLrQchMzcPoNv zeM3V_U`(+}zLVcL_bG+9j#RW#oR>VW$4ztw+rnet!=OTara0Rqa?33qiifzNYKNXZ zAu@bdyRZQP_8Z@^Rl+2_J3c;1F3&|S@6BKTY#l>Gc?<)$VqF+By#P=mC2tWlK)I!S zLDJp+B^=>?Rx*7BGHNfd+OWjrYCT(>X}@04^eZxTyY>gl2JU?VU$f>2YpyRlOzsPF z3%iXTm<7s&@dZicTeL<RQpR$C4l!&bPc$Syl54zc{}{KdE0x|^@hVTUtG&ApOPzQE zZmi4m0K}dKN=fk7cWNKT7>&v?7aV}#vgiRt<iAMe(ujRi>RNo_UBbB>-;>~u<b}-T z0UPfm5Zy*F8JYQgq^C&k#%b3w_u_@Ku`?)<e3E`+3BjS}d`C-l<kS)p5(b(VnH40J z7JHU4*i<pQ1t}b8xOdNZ3P%ArBmq$l^y(CLH#BxNOofHc5;e{|-JrE5=-%qrCUSb_ z#w>zkc8@<f-wc^zc4)p+dXnl?rguXe2iaso4dY13+v?L)xhpJ|7z%s+w<cPEM=%6~ zfqQiG+{YiQ{sPBLXBK9#u}BGv^&mowvn%%3pY-ycYk5ug++JC6<JEqCew;vk$g|zz z<MUyi?4zPPcUG`v?<FXIoJ||XmvilQwfmA4?w)$Ku6vk?l{`8QTnrGcfQJWMmAm>0 zV+=mzpUr;eE{A!>fir@0>n^>l-FB%Zo$yP|+c$(0)7!k^W`iUdW<i@uw=M~Uo5g;Z z7R{K9%a_=ax2$G=m7_)LR$;RqgTQJHw}G1>8veYFGuZ2&eVk_Hmm9XR;jSx{%gQ*D zpXBR@0>4=2SVyXi2@2h>^U_uxiXjAAG*{j@;?K@KCa~wRYI_Xxuese5ii-#%My4iN zSy6q-sdJ~!%a>hKgu_DU;fG^00FO2m-`G{HLnxSc$O|=}d(OJp=QA>Q!8=zFy}qeF zeGG<2WD5r0|Bjl-_Z`8e_mFL^Y$=(cdt&PnER{mEg~(~<&BMc=#pd~Jo$`&i*5=QX z(33C-nH9~+w4aBD3}*nCD3uVXtM$z0V9v|5-$J=}SV7I1ne$huh5caN6s2#|(zJkl z#pVV_lOio1aFMqP9D|bqC|Kl%PKFE9hh9H3_3?o)d!N1!z&wt|Tv<)QE7|-8f)NPK zXHJJ%>`J!^njKcG&|tLt`MSAjE;T;FpBd{<Wm3jiArc}InqC8-cRJR^k+L%h1<A^p z742_RF9ADJ9T~$Q!vvne`c}pKttQj&BI}WuH0bJ7R@?uI>Ru2WfKR?}kisn{DhEyk zpcR7TRs|~#q9Ysnq`#19pI{*^ez`tf?&#dIADhVUpq0a)B8Beb_TDw8QC}~_f!PX$ zZhLpf%b``jkjV8lv3g|jJc`MvpK0){+bc(-SJHg{Z)i9~fTz$l_u`ZxQu}K_MKzCY z*sW(^AcgkKmE3cb)TMA~qYgi$Oqpj(wD8{QsJi1jO5mY-W2@F`Ef_9OD4t*wdXVOD zZ=wrLtgSbJjF5y|$2gta*Y>;VwKs<-hCb>1o|)w${|lkUX1HPOs2vR5et;;XN?ihQ zB$#WgtmH?AYzlc=ey!nUB4sdG@gRTj*-^E9h=y{NolA?|RrH-5Xa}gs(WTz+j(79t z*JMn1f{lD;gJH$iSCAN6`rYd)pR<_szqePe<pLE&*$1$&%nGeB)HGjmTCwgp9hoR2 zE*!Gkcx6-zT4RWCx#M}Ybcj|^!F(7?5N7*p)#+<Hp2v`S`YrJQgj7hC+Y0*ZNc8Q@ zI27Xq)1@4w;I_~4ZnfqKjFq+~6L83<x^aZ9MMS}4L(16?i*@@Pq1wp<Lad<Y^Gkx# zDg=!IaybDGYGDa*7V;x%`dCzYNfmZ=ggUnXrUWhAedOU9k(Qn)Fn&Cdj}W;O$H{4Y z{)yvF+j|F|XQCBl@KoRoe@$%j&oe93o?I@jza!z9R`lNWt1}Mx!|my5Lx*3l`mKm_ zV~Nbe0P+WawPMievWhEmL1{3Fa1>O(n5FrI80}$4@SyMqk8*iVuVbX{nB$oja?F%= zli=m+!rK&j&3xM~S8?MV4@!&_Do-m-F7Sy~%x5N-x9<VB5<;-)-T3%!(feGH<+m!+ zx9w*Vg>`+JlmeT1X>Jj<Cz*Q*ft)B6g#O6JR!WUNjd!y3>Za^`_izW_L7WXYmtFG% zNQ#|izKWb317qo~MWN0pXP1lV9Q;P$u(Wtp@bYX5^|D-Ldjpxc$w~Ik_Nabz)E!yj z#_+j_HECL?MjDHV&8_q~#2v?2gu6G>9_@pN@jqT5Ui(gMRENrfPpgD~1$6{K+1EB= zr^{tREkk+|85Q+BJ%3E<sdeG8tKusJjh;q;KWa}%ImXVsn86R@*WIHb?wxK5(g%>; zz6??bbhbgLh%vUOuy@F<jX=Sfnq!W~k&@dz(AqkJ9bPZ6kl?tX$Ew@+IW9#@B+$dx zxv(I~DOhnh)P)}|6^d&_j5zDJjctb4QS-}-8Q}a0wCSV?7opYy0Dmy_fk3NdRUN^b zu1mr%t^$<P`3R<LLLYue+043>akW0()7MvyEbf&VWy?ea=f*8rZJ!lR&Ywf<8uXE^ z?W$FLWl39bXo&L4Q|on$Hxnp1M7SJ3v4y<xy^vw=>$d%eSay4$n*$ygcVQK!WK>v< zpIk83J1P~CMlID(3I$tdN$&|Df>4*Ak`fE1Jd7Oxj+}XL^+dwv;upetO+$!iw$>st zh{{m&qNN{y?5HD;yqkZ2XSc)0F1@EGoAny^Hhu`4HFVLt*6XdCL!-_{9i6JUKi51) zrRam|Dz9&H-ZQ*DetLJz^5Z*YWp_FGhh6{9^BO!eWzDMSR_i2Hn^CF%>@Seaf1ke7 zXUn#W8M_{3_1xQI(UtbDFFundKkB*>lD((?<9NGEb0h;(%Uk`TYO?~g^W6JlVn`?+ zMJE#?LL!c~H0wFIq?UMv6->jpHIDz2hbKxwVoUx-Rz>3^7V-LRy3+(D-AWRvs9w6c zLRD3uS(TO-FCKS>+)xDxWN_3tB<$21qaX2XIuUawG7k*|QT<Deo6d$qF;XSpQ{L2U zoj_GqkMlHR#>an+QysRjWL>h$p_m8T?A8lczI&B?Dwg)Cd-9|o3MHD#4-n^Oq|h`# z$gcdcBg)3k4(sN0M+ZUr=-e$mznt9V&ZH0@&(gsG+H0TV^dp)b7ap$ZOJ7HM!#3T7 zAsa8oy0~SO-F*MAl6A<t?-VS%@#rBcShD$I{MX&p+Kr@(epW{iSs}P_I@2c5H?QN_ z9A_kXZrsa)c~SPI_^+Gh+`n3{izP=xU*CMpV?#__0XS7AOm$lC;!>ANc7y*st5X>u zCqocdw{bOXRhbt4>~nBcMPQlhJPp|gTrxt=#@qJFgP$#(xR(tLTqojL?<mm*YxLsL zzDZ}uBhB3L@j+jxH^2S4KTKc!rvLHt_F)I-m~Fpyqh4t-LB)6Nuf6f_hG{h{`**s# zZGP~4MFVxy!Ls|NjOMjGPZ}B=io5%u?_LoPv|On`St3(2g<{93$VfT#`M$~T<$A36 zK;NWD`;J~%LXcRmdA65e*~5*wu-^kq>NXG3RP))Ejg=<H3Nxc|XM51tsb%g^<=y2T zRZ9g%DP=i*j&v>px^fPVOkpP4dPg#&ENYmzBSjg}_J{xjc&9R@0u4uv7=hR2`ec$Q z{xN+u_rjug(J<ik3E84n=%PBa4Y7N6flom99HrPyUQX@{E*96+QP@pM*_H2Ixm?DX zJ{+vO9Okd6ck7S5BVWVp4h$m?*ufoOs(4>>M9Lc>`Sb!4;n-hkMJX>0*+5R{*~jyy zmX?%McZo#>j20OGjs&+!9$P7`B>;l@F=VwTlH}0{uCO$tY#;w+WQ&9quIy!eQ~1*_ zkV1^lx2U}UE$-7}mzWS+=33;HF`CdablbYQRWAr%MU>zy6!4&w$c`Gd^L5Qu6fn0L zfkq?Em`T{pv*x>fj8Ok2gBK8c5X`?tipCNvnZvOzxpOc6Ba*Y@9loFv@7>y9w_SBu zwZzGniw@`1ZTnd7(5*Yh`_swrGS}3G@8A2PCfUuBn2G`~x4uORTid2JYl3w3^z=?C z)@`Q2(@H1@QIXm^OJ8Uw)5Ph5N<Z4*f7J^BW0zH4N)K5S8Xtdi<#jG=5n@#LK&kUv zm7B^`$t8=eTN>%gP#sn<j*<gLlecx-!o4!it+xq%bn@EtK1Odn^?N8R012WI<NC5C zvin}@97|p#^9I)~+ZAuJq`O;u{Knv+19~q^ASK_)=5t}RVIw;~vO3RW)ha^E#@iDY z$(Rt_d_2}=7|joY)WXZboaV(FZ@;1)m>bDA(>|5F-ngQ=U4YIr<c=i~>h5flLJLxG zMdNlfF~?T-onKgVv$0|ozUvVqcM9_kodG9zFeEQLZpN{W#CxloMp3{5R%&#!2AOx7 z*Y}Z+-L`TzKdf(ggbibkf%1sbL2kqEO*I7GU@E{k*p4rEi}VQ_fOAcOZXMtC8D-Na zX<J)^!?_pNZHr1Q`3{Rn)`G0Oe7D2>wq+AfSL?Lg`eCPR*xgnbaWieLPD=&*Yc#>; z!53_OaDa6aDegy8!N(&ILA!{ojE`6PXKASOhVb5@&Od0z+g({|Vx@Ia3BkPx!<spB z)9<VNZ@x1m+3TNMsT|U@`HeCR!(unnL>w+E2NG}D@EabkNxY>Xkv(sIG$<lJF~vJA zdEke5g?J~fs*Rm|m*$X`9ePv|%*(G>BD43?;xFjU)H$cJuxD82tw{uJU+>`GRx|b9 zYPZU*cU1N{#=?tjv(vtMhUbht{-?h+3=CYC^<qX^XM#1Aj^4dIeY<T%_t^WIt(jt# z7t?RFLLYYx%h?YvFkI)@rj@FpBKv#?|B{Jm@Gzu-OhLZ{UntsW;;epOzC0eQ7Fj8J zKOc|#yk+V2Wm7aYfBHxM@#m{Qr{jKq;NMK0ALT?sVKRu2F}VYOkaz9PMEr<bpRM!w zZ`rkj-IH`YzQX+a0n`jLIY}e7KYrZbvX*upy62{a$8HvMg|1$KmcKeW0ng|ni-zg( z1mAN<L|qsjTSx0%jLMUK#PVfQDOgXM@4T-q?b;PPs*e&my`xE|uq;R1w`97}?h<{% z$vxS(hKpY)aZR1c2Fk<wmFtn%P#Igb<=PR?CW3f=Z}Ayf*gTX@+dak~F1n<%t;VO{ zs2_8DUhhgxx#wzj#dVC8uaS%~`Gh&jPMVN=<oEm3?}DP#!k)>yHfU{}^;+_l>#&@e zqF~f%cEvvk?ffOS2;`n(fN#P?qWiXRnLrf}eqUbxmS}cF4Q>ovtOJ`npsd2olxn;( z$}%A4I~ew+%KPAXzCH@=r-r-~l3c(S?S6ajuLYJ@3+qqbbCPQJBBhWKBc%4%@<5!K zuNXxX$3lJ|vfX?|FaO+s?(b>~C`eXLda$KfY{P@tn3C^n2sB3y#TQuYxul<|)Kr^L z(!I=lcTE|%gDG~dO{iyZE=D_AF|&Ia5v(wr0@e$s?F*eWwOQ;es1zd-q;6Z*^-&5} z{~p-B%Slacpe9%|Wtg7|e~PxoFjis@+%THDy6rroeb>sjTMAugV^olbj}|P5D<jN6 zZEN#%wGm7qpkNihd!F#pk>d;bHsMgxmd9P1h-Z$n^rBOmr54sP&AjN-n#3<BoZHq5 zkrXBgm4{_aF4MC1$h|b+iIe6N1TraaHv0K*+H_6AX!{-81@!H5V^vV;`kD-}O?2^m z4^HXt?PjYM*6%z!E-9h3wxmG`ker(DlbMxHHmg)1sI|m-<{;6R^$b)*n}A9j54H5c zERnHp^vYP1QMS&>W*C(7Lk%;_V$Vqe2c6S=19f3*E*dIZ4cT9#Ud?{KCh;zQ`bMf- zNNBA~QY``E$=sp$e57v8u4n5G3n%`Mq;r9*u}$~ziX`M%Qb|G*k`RjIm=r}6a!3b7 zL?kLYNkXYqlu99#B2h@`M3Pkc2uW0wk|aqIseP^4`!_Rt_MZ7ZwbuJS&wc-oL}^8p z*uLVDu6X}`|3Pg9TT&XSt^$$1cFj%>adHuD9|O1rd@beb4v+6g<%gX_-gSeJpO{b% zAvst_A|4&>N;HP_+g$!>lUjULrt2COhcB%zLNJm`WUc8;uHAD&xfav*PGFc%fB$9Q zUwdsD8r&D%-5x=4jXETrD~EO>rReB)wb(Y*a@)3J+jDrKdqu_-9*O<-_3Q0`yGGrQ zPDt`>bz$b=yQN#^uV1XmUa4ixSb;|&d76iDWqx>31*sxO;_N0DrJP&%<TgL#C!XWb z;ktG&cg#eFQr4B%rp<QP`e%=(+bDrhs5{-F%TU)iCW?A<9Ln<ZG&Mhe(cA08F)Z}( zlu>E@HECGcTA-}T=4>P5mm^Wb99{I_r-bnAarsd=VQ5f6$vKmU)<QL#wT59WlWkll zo!!+0Xe;>V_vg)?u5bf1_;c#*;7idZw#>{Txpft##l-}_Oog{Uud(Xk7XHBITJ66^ z@x9H$K%94_)c0BV23g&UodN^qf;`r}-lnG0c%VZc=XOre4BQt|g^O1YUFVZ0;>dA@ z=7WxbZ<{=ScDgwei-8sLR(iVK+RUxCiuxfH{Uc&xJf_GG+9G^IMRh^UkQTS%8BDcd zX8+)revlgJt13@rBjci%j9;S`jzI|X#~`sITPZ`y`=B`J^GM<Yfu?N_eWgSiTHn5q zVy;Jw6+y+yfuAP6lh(aOTXa&!4bKs}#?`ZBBrcmwdWEv&@2sdPb*(OsPMqk+t|ysu zD<#G1v3tl<UmLT1C84FV;-W&e9X8dAo7AFixYla*rk>N`<1wfcq2J{bOImi<k0K__ zV!6QjA^iktt}#I%E;9({5QZd%k1@=jFuzkDAa_(~XsE4E6D&SA%JGGge0|ob6=L3s z_Qzw-7JhOZC1Az}k=c-3en{Wc^b64pJu%eqbx_!YQaWqq{P|PgU}(^ke@$W)Wyw_@ ze|M4L5c#Bw&YX|X-5P@h1m)aU@zW5fk;gI7ZxUXnr*(Bogy4-0FEWM*%gD@>7pak@ z3y_mTOAtQL#_MBSrw_k=KwM*1VWIv|y|!M`3!K$ul=vxq{bE1+#X1GGy&Gt<+iZx> ze3l4W8ZtyeLJ<RgMS0qT7jIkNBM)?nQc(LF{V$HqDYnAi+*m4~yS$S2pNh&#lFS>E zr%9B}3^{<0ld?9~ji^=%17bHMeMA7xMoA)3@1hjtTSEoQjbEN>=v<Ljd4<<8+NNUu z&RJ2a0(gusNDHfWr*$}O4#HdB%nY$#z&aYn=SZy1vmJK~s7OI9V;W{dFN-F9tWVl9 z-)|rI`Jcy@%@nb0bjW&zWi6D8ywfOt21T5QShnBT&syB@EP8pyrW?FscPXoMrsQ2e zWXZ8bV+h|1E{V?C^TC^jz&XQCm@v-Kud*yi=g-wo3Gp#0e9>P>dH^q43P2ZyW{#ip zyD(zj-d=)9N$H_Mh|dDW3rtf66xuv{7Pv9&Q%@4H)MV;jTYD{ixb8)}$k*(F8m6W* z1!d;RY2q~l*bEGG&O3lczqL)B7BuhIdPAxFF<zFmAMRPA;!|RKgg6T-%ZOYfmK&j6 z0f^6hFaS57L>senI_`hY8yOjOUp;Ksy^|3_)Afgv05~I_5o>PrAS5LB-?OHuOLDST z1#phb$a)W(GhvMNur;!>r$(x6`P$OrDd$y~8?Mw3aNyre!0RLIC6Qy~@S@wQPN>N2 zSBk$Y#Jpt-&zH}GR8MaFPcA;&2&_3FIbjbz4nSMUUtN7gx+-_v`SXIDQLV4brcs@8 zNY?Aj619*I39oh#E%xBU9?f09C5=!tbwNYh7)vFW6c>A`G%dR;MiNbLkuaO{w7+hd zs;Vm0Z$kA2YqFiN>GK;#ZZB%tC*L8dT^hA;N?oaS*Q{-tfl(92O!|L^R-Zkm>-BcO z_es5^B3!a9(kc^Nw2hdWXIxQ5Dm2QAj$(-ulQ(bKGTKf<PUv;uL~>`mz<+Oe^&Iv+ zJaubU&g&!CX`Z}J%xlS5%cr}w0`sWNkS(v+ai_R*NP=M5XJh5iX?=6)wHo7RrHyNg zyii4H|9K)cs)47M1?|7TnZ2|xPcga8GtM8*6y_{g-P&%O2zbZ`l(#!g@>9j>I6Iq| zhH3!2bQCR8dFljtNO+Z@c0Pu#BUCtM3ewlB9vG2(O|Sv9M|n~#L==CAdz;kC{<(oH zp`{432@-q64fcvGn0LFK@ADj)nC}1k&%=Xx20`Kyo+Z*`x22ltC6}+E>pj9!Mmo28 zj(ngDk`z=DJ^2LK`;;}lWI`UVKkR+;f$_|evjpc=iwfC36bkkpxpiyW8Jh~a{{Fz1 z(U_H;G=15ySkB8{@nxt~eb7hTt*}4B#4r~Ce49>Z;mRsb@7Z&spB2E`uScnb3VZ10 z^34oE2NCY>mDgK0X*fpp2*}ur1O#x5jOIIt*9;uVouQJau9Z{m0Hw`iU@9;L&B;wO z7Q>P?@zN%9^T(kpb;y@#UvyFZr;E1zoaooMr^B()B-(9gtEtJQyXX3?_1CX89V~5X zpCmAV>gso)6WRX055am0cC(@kofU`3s7sWAs&o@yPFI9XFPQ^#M$MD<*TRYr@uGT` z>}5sq?=IT5CRc+0{SA7In=*5Cg7%^}^Ky+RD@B!jqtagKMC;!_<vD@D!9!=P$=mL^ zz*q|JNZXcH?H)Z8$(tC#DP6DPB-s|&_EmrFgS6#hQ3h9p%g~}1*d4U)!ymqR_il-* z^bxF&XI9tEq&}Ya`6VP-d2Oo(=w4i4ZFnKB^r+HGiq5|Os&rs?v~YBMaoW@4{?=1a zf+|_B1sB#{D;ef7f6wJ^q+<{1TaVB!Nl{gm9zgUh+t5~q;J{1Q2l&UTbQ9ad8lEbv zvL92Ps;cT)tz6NCgXB#Ws*Pk-mn-QLQnQ1yZTSK-c=w9iz3;z&)=Pylh3zYKIxo*S zUrLpt9GdXG{`ntKDlAtTCaGHVc1?oG5gW6aQ6-KVhUM>ecT`g(h-m397-AE9WpxGT zAtlS(Bg4k)_ZRnGAR-PH6$kt1AA7H|N$50B#%jw5I(g5BhkZbZp4+At663$q$=?3! zS1vImW1Fc%C6vuVL=#?m*Red~)`MAV9*JME+wcj%s3&x&U#toV#=RaZPnf`%&jeQa zf*X^P0egE@xBB9UExo=+4LVjkG&0VCy!s2OMZ6f!uWeIJ89~vK%)o<(9`%m;%$cT% z<xLaJ!upi9jV4%VBk$v{wbwrJb#9n+#ws8oN7-+z&Gy8d-inHR9ykxUMP15`<;PBY zcmi#HY07mxzr(P<<e5ww4^%ga;p87m%R9%1qB%_zRm{%GDU~m(zp~Zr8+EnVXPFLX z%!&%=6<Bvw=_(DuZnYz;7bKToQaJQ=S_To1?mFjf?+{?OIp<|l`>)Mv<t)hWy1TQx ze%A&Sfw?R<KJ7j3^zjCsZrLX(+AsG<-&wE9HJU_l_EWTIPXhS6pi+iAVTw2z6jUt; z{F7vDZS9#n6kT1Jc)sk1PvnoKZ@N+InBE_icItZ7LOj1X1hN=6&1#NIBqUB^D#*6G zvtbKsc#iGWqs7bghg~8On|PpiwCD85FZjvk`tnkcPGabgVBl4Rj{tEiWWNjr0Vn3W zXNs?-w?y8Gd;Brlf7ij*v*?**nkTD@KOF6|=;Dk5*Iyh08V_YxrGVnS+s66fNrc_} z<fcEIrQOv|_urpSFqy=tXe-`t+QUAmz6!;+EwTTyRIcjD-f{1EMT$2yvdTjNrUq!p z54tEjrXGO>r(9goL8{ny4;5Izm$p%XCHCV}vPf6Dv9bM$*t47fH&4yls4lZ)PBg6G zVlwoy%qIvQ*1Gl=SWLQbvVS9NwGOO*&!Hbu*~H?Qo%r%}$DM~Q9iIL}Cq*0OJ=ynr zU!HjTHuULnL;aq(A$HFKIZn2VJiy^6zIP`Fa@&8Q|I247u??-;<Bzf!=)au8pWb=~ zqx{R8jxMa4Iart)G-F;sm#*UBN8)<w?=ZEKBw(*1^${o2l<=bVtyfkXqg`?*lQt(c z_0q|cC$;TlK0MT%{?Kf=ZtG+}D_L1tLfjeM&Wi2X>E_n;+)Zb`&8_uBf|ab`W?cZ; zl#S#8Yj%197wUk<qd-v)zJ1$0N-wYaF#*c^(o800Ns5bJb(%9J%;1X9K2<vDe;K2H zMb^VIR5v=k4K2JpGkDn>>>xc?;_SA;tlzJ&pM!R|*)ctn`a13-8&0^7?FT=!AGE>e z!+dsw7(J0pew1&p%cd_HZ=1zEO?l^07pxb__mhWMk-&jD$ff7YNce(v4%Kbtz%qw9 z0()ExdKFvr=`BI+Z2OIpKD+4wn;s!_^AjJ?ICvupiRX<@cVYL=BSTK->04@ix+if| z{t(}DMh$vw3d_a@yI88rXwm_TrK_Ij3p&pQ@={z81BJ%)>E8U`+DQ0N;Lz0Z5J6f- zoL%Oagk9^dnI0SZ@!@U<hc()zX@EB0akRM+O9p?_^tfIUl`-DK=!<q6kd41W`=~-r zUTy0WF1uqIhJ!iAeGX=M0QVIPd~J;Je-Wr0og1c;&ln_>HEKW+tH|qbZWqo6nKAgc zxjdF=D~x8{#)R6JWZqBa$p!tq|D(N>%$<5*9Or`vH&8nDVDBaxQG58hVIy?QZZlKe zmUXwdvpNCmksQiZUymGzL6^j*&JSKTMCxJ75AB{X)uP{3E&t4!A}G5>vaUL1N&u&^ z@UE6NE`x`9s5q;NpKNkVQR+>h_V1RqfAwX%w}c<|&>4&Hmn7Yp0cN?zCvp5EjOw|o zq#q804SY58+N&?KTdK0|+kUS*#H-->(J@^(o4UQp98=`D(DYSD+t>MrIE%5Bne5oP zv&jj?*Vn(UzuFIuLb2h(vmky!4HsPZit_fMf>4Brr%+hSnuSf9HtjH@0w{iD?{5&9 z2v}x(+p8{<Tia@3Wz`GNiWLNdr*FQMNS?aw-#n{Z{6{rEJ{83&IjPH>?QJelwop4? zibWyy3S3KZgipRzXFvMi>ovdW4J>RR=E~u;!Ih2D{-1ILdhSjk=GY5`DR4}ja=gMz z4vz5G)pq%gF}~W~Sk|@wU8Lr%)~@}}&kc*Wm>1SyG3Pp%aL`~nIfYS@C$;+y_iAwV z>~KaEx9eJYQ&Zh4&yM%bw?H76s>t`~aYB;y<K>!_WVk{%(mqUZDU6g*A-VKdFB8+5 z?pQn0Nll3>v-2<d<o#i92py~=+2v8u+71XQjzTgN(PQc4M35;2p5hR3MN-Dg8f%bH zrFttOmhIWCB9)RwEJ^Q6NuS;RHmBjM_$j5EAaF^kY|bDb?mgxWfx4EKt7I;ZX?-ZN ziZwW*vdl{}wNEL{dQG$y1_Sko72i;Vb&_t&0IK5mf>2MfT(zPUNr7blqdEg?I*8Zq z_izmyPyVAvKC(NN{bE1Sz(R~cc}qv-_Q=-=(b0LW>b*eZCM(89tlW(mMj|)KU7pDO zWuCNluHZKZ-DR|Bluu#)`vB{U2JG1biyFEXzVOVmGohyUlN4A>?C(BVd#}JOY@n>f zU^?!$n3;7d=!ZlK-f-?;UOf@Jf0R)vc6*Y|BwS(~Fn$hazUY-(pc!}#9QGrv%A;U# zI?m~w531X};fcUTT}H((c0Ea~+~ullm04WT#05zXs5x*y-qdv72njK}FdJvI^yEon zne5M7nOWY%h!7GyX48z2N1sWwVi5F<FVjbq6Iy%E@70b`qyx>EHR~6nP<IaRrc%)l zBI#5~l{YB6t!Q>HMRi<g;n!aW=iLV&L!0Kbd9YY7kpbyu{;^l#@VbQsxdnUSzAro9 zTVD3_EX_`diBa$u11yNM;OTdA+MM=XdrLxj6NbVh#&2gEGo5RRJHGRP7=;%dtxR)> z8W6MoJ*xpxGZ;Lzx|9YC%RQhLzEAF}9GNW8kEEUnP059XcmFzPv~8H?(`52uL<;sE zVhk)%FK!vtJA=#u=UtYTA3{N?E1slo$IR@&shUjA{W!URNLNU_hbDFOnUcWbP6?2n zpzF1s&W~VauMyn({=|>2=U(5hYur5}Pd%LE3BwFX^?wie<57(ut$vt#OvP{Y{rBCy zb&aba+C1Fd=l%4E`A6KnhT)89&l3{~92~mh0LdszgocB_TFeBP4=l?snJ3o*Bb+^Z zR$bO$@MxV!%m9Q1d~ljmvR0_Mcrf|wLba{CtrY*WyskSoU^6K!Xt?GYDxCzE3O|%p zrN=)_=0rc{uLHb=TKNuYQs>he?Xj2Yb*F9H3jUl}>9%Mtm856IKW8Wm5IYhj5cS@w zsD68aqQKXZzi8{`as-X%`gqauQGlIDPS;r8uxt^#^Po%Zrefa-Lg>C4+~9>vzwPh4 zw{NGL?h=HMPH$JIb*}eK(*zUS?5<B!qtq8I8Zh&viH(20;|v)IkCR?M7-bC~Jt5k3 z)wNd`m>%psCp#NF_5?$E^tp4HS~@x&;ugIYq?jjHiZ1+4vw7tFLWk*ET6T`!sLg=j ze*U~I8_zm)m+O&0)h_@S!oqVxGO1^C5^Sk)^|-rA<s>?H3zh=dE8ZSghK8GEja{`= z(E)^f&KQ(j?!P;2r`VK!-U7J4*{Fo0NEP^j(wIAvjoJ4`lfB}QQzBPcM*x<svdnw1 z5wwo=%3;^<dA#bsOj7cDloWzIjlyh_${MfgoL@Q3TU|xI^&NQXM=TT>RK*rNek>}` z796{{L<V+N*sIH9yRYeW5}t~5p3bm-ffX`Nw|E6F*hSVj%{c}YDdT&KcH-TzgV~6m z!m?ZbX15eDDSB>3&`cDMC*x`qN|3uo@p&QN{enEZ(D`N$@M4Cz#V0h;&uZp$r@;YA zQ$%u0IeO;=FY5v!A4FT)G&%*=UVD{tqe(kYojD+n2X$KTGIqSz+wWfn@<Z_bevRoJ zx>ti_j^rfwzIT9&?>kS?8$v!lFbHcN`ejcFmC1mk-pS9m*I@Wp9@p24`MUsVPz_#B z_fL)yyY6hrqe-cS<>nt6RpRtu)3Pj2JCBA5Sa?aP%38+uaif!;x8i@i_ltbPD(u&S zcx_%d#O1+pFO=s#R}>KGcY5SZWh1p)IK)bzE<b3o@4_pYnVIis&F<h--x^+YC(_`G z5mR^)gx@LLws$rF<_?TC0S&xIX(wpVpN9`0G9uONyd#J15QRd_!7m9d7Bb42$P|zr zZrA7!&a0)x%kWXMg&aHR>`ilDOUDXUaZN+qPhVd7VGqiITZ3!B<Y$B^y`Lo2Uz)E5 zz4!cv1NRs1kpj^mG7-dD`Ds}7?aJnAIuA-|wU}sF787dI8LwgZcV_v}l{(@zE0Hl@ zU)$8aA?X0FoMdc?qlr3Li2`1zIysnNGWKHIR4|2krly{WTxAn@Q^uKGT$Rh`ic90a zrgm(my=S!gORN@-;V(1>vh6+Feq42yRR0H`91l0R4ymXmQ!XcELsIh7lrD5^SFoXu z^;!bv|Bdfj2-@a8-?PzJYK@it<x_PwTYG(dMmHC#!k_f|DDXefHPo8S)myss^>M%W z4N1&^?wY)~@z2Y<%LymzY&d_6(TD&cA+a4grq1ERljl1WUK0Q}y=R_zvNQ91v&aw_ zkLznE3)5w2C<CX09O@q#mnYadZsmt*FCG)$40ufRkS+r!?aO?7$gKdhL0_{G-Rnh_ z)Q=!q)3;8`MO#7i$if#MZ+l+|JbCi#42ibil@2)pT#7eUciy$f!hv?@(sOm2IAOrE zFmtQ@i>b`65j>?`*2YpKqkRJkeGyKidRyuIp3LM5`^d!~9$1ieCrra6DuKiwM5qkc z>>Uy$k&X3|3%r`xOW+@TY@mJ!5^I#ySvj|EeIS0peAo<f_4^8xml$8Bagts+!*<CN zn+eVU_FxNh=3Lq_TE5SmCeih5w@FOP8>UBGA0*cM7x_A|luuMaJ&wk{@iHb>#gk() z=2nIM#ocLtJ!J>nQ}c^`y7$}?mv6U+dSt@i8eEAbiV=kNyL`b>!W=lLU<#ZzkI+^a zj8@_Uli*OZuugOt{_l4?yxK7nZJ0||)s1{BOX^Ru|9-o_+td`W?KK5tRshgO=QLXh zx$yW?Q&aN*WHTEo!ozmQ4uj^7zXv$=iNMp+>PJs|@Axkoi@sGH%(`JLb%th40-%v! zTmb-YLaJ;Jl%{ViwS}0gGe`uezR@2dYNIK?VPt?<?+ey<HY8AyCYz>tD7id!hQti= z8i&G@JpKInD*eehWgqtV&}Nkza?Iku0qHv%0<Ne`@^o=IyPTt)Y*YfxQCwUA?Pj8V zJkjrqUF6cBlP6(T%`4u#xfu`;&`D{;mpz(j`8*PF@neI=R8l!}QcyRA+5gqHI?4DB zCDr=>bLa?vkgB<=4fM+o4jBt?`4o8j!u#F(C~*`l^ZgQg8(-rKjew2j=D%FC%-bQq z5)%`h5py3S`hq)VDqaANG6ZeK=e1oOuh5!HLpWuFYe!L2z!>Bcd)4!N;a2!m19VcO z{qt#xe#NyZSCrxqjg;zcYU&Kw#0X)=Ik?OGg|j?T%v`i%F!Ii>Za%QkqmmgEnc`|5 zn9krJw>n_D>I-&%dPsxoIgga8cW&^xXPN?Gkag=vU19nLJ`stV$>mLlLX=GHB0biW zX(aHyt|Q-HX&9m1-iP%%`_#Uc@91=!4<XRTFR(zY{Bg-#k($xBR7b{~Ju47M4j-dG z?3~dA01(`;Fuf-b35)g;AvBgysZHsQeFWWi*Q*A`Fk3n$mmi_kuVRrvofjFI0E_z; z7B4+sS2omMC=~`1+o<5>iGwJ{wO+Pt->uBd729uB4+|M2KU96->3lu$>Gv^=KDJFw zpCY{+a;#_VoelrWfRN_(&dp(gpmyLJ<FD@jymCUl3q7B&Ux!uvL2DYw!aTv$w3!H& z6H>a=dednk)Jy|$arUnKlCgWJ=$M78@1Ja_yVdb&Vy0N`L1rHKtavgVt-CwnIZh-R zU0E&U5RFx&%->g57C|Z4vOzQcwbkM4K#4&D*HMVMQfOweJwJFyQjn!B52-uEUv=xw zoj%~gs3DHW9%m*_Z9jnSOJ=+4z4yC^RlDpYF`$syf~LbGagDMlt2~KAtFkcr#Vj`> zMCq`myZ*~McmpA3zV=!lrVp!I_mE!YV0uYTNZhb8zAUqKBP>1oP`IR<e85Xoq#O%V zBuq_7a#2=RJ|_r?jC+s4k!(Mv*hquRt5mi=`*=0yUuDjj3ChZ1Ap6rFN>PU`+_|{R zq*GEdGq3x_UIm51RNtgwIJGdP>p4T~D~%F*fVBlX$Ufw1oZ>f@>{Z)a>xC)0BgcRJ z@53Ict!9J3QeS^Io<;t929zPA$N|92W?qlmDt=*(>BY<xBcCUM_mHU5DDB@T+UQte zLz}w9f)1CM(p6IX5650rFG@LItNCrNh<JjDLA;8=4;SsY43PzgH025M8JbH8gP35X zfSQ&?No$WF<^qHZF}RYUTC{_|+5AJluA@aqm9w8?pjEpi)-HqIX)L3CcFh_|Ovhhj zU8t(_?Ppc))s#PYW%XWaNqSi8bH@IBZoOl`=JNJ`tfeuDiLY_b+T*rfd(BEiZq#?} z(MYgN<|zc}mhYc24DUS!y*rmGDW|5TmG=`n0^wG&tk_K_`FJc$US-?y*ky(*R(LhI z8kV<5suqRhTM;FwuzX|%9t=|yVg}&Js7!{^KN)T?o(&5K3Id$8=>1!_`b<l_3LrSP zZt>59S=aNe(s|%=h)u31=T~9@(%CQHzTNo8rz+H(Fr4-IZ{wCN&d_%E-hT_|K$Dlm zs`$I6@BB9m*?*ewi*`*sv4kOs!;EoiJxLcd+NO7&pX(ghbt6si2vBZC*r&rqpZ-XB z_2p(KhWtRtvPU2|UP>pU=N*zhx<~|>%GVrHwFh2%C1)j5??8E|0sX&-t>BJ5i0Dc6 zA>v+7Eqt8z-y#jeo=&EUCnV%9UAhz@1&&U@_llM(98qW_S=fceEtIM8F8JhG61^gN z<blJ9M|G~<2-7T1*J{ofwh!V4&{DoYn7EGSazeDxw%GC}_Y6K8F74Gy!$NH;{K*Cc zWbe7uzCdlvqg>s$1{4>gF6`U4?>)y){kM**jEKF8?<k6BKDfAt@bqnuzI^%ehD33T zyEkd!GJN$PtAJd<V;-#*+8}l#p?Cy;u#PIXYl(mI;dSu-2;J8vtGTqN@)LKnl$TaE zANWsW*C0!+z)%}AkEF`xr}72vB%aMhKN{GeRWo@@XMf{Hx4oEA_BMJh8Jm3olk4Es zQp4eDL?0e^(H=xzM~dp9zPT!1dWdp5aoVMPr@4Oq?e(fFQGAT_qH3my?>8D>NpJPJ zm~Q!QBl4Vqfpm1T(=#&W=-Mi@IQ$jpz1XnYovj5=5@dN)`mlm=)41bQJ9lkJ3X?sd z#kA@)XP58W(Ls+gi5$k^0oVS%kGkmhE@AJ$f%`}ti%WRIyme?pr&g?8C+1)ddB{Pn zFI{6Anko3ij@WR;?vK3J=y;W<sVOPbBT5_Gx!=pTYrI){Y2hu^N}P7vQY#F2!47o( zuyJ*CO!?UHcX)Dn<<#(^%{9jxZm1X_<J8htSm|kLd3X-u^$Uy{y2jU0{U<I7wvZ`c z9-1e5fu(;!s6G*Ur_I9ND-1do&4(Z>A>B_;FsGua{q4Kmvoqd*vz&D1g@}aUHeGsO zQL;VCT(iyWZb6DYPeg32%CV(WBkNtwh0RxO=sgDIR8NIkK->T^f|hZ%lzQ0OYr{zk zH9>qsZUz}RqpbH#5;g?Uq;sw5PX~E4EMF4G7N1(Pv5Ydr?V_52monbph^oDJ`Tg#} z70m}`4G~`!8Q09YSsyUF>H?TASaIeVgQFzMkmi>F!9TJn#XP5aG`meGKjV4a8+0>2 z63#RUCg*_OX|}nlwE+a>wXmu%-^zHL$e0pa$;i0p&`!+<=JM)9D#bh7*x0N}E=Q*x z4vmEo<Rw%K%gw(ORlRdY@%LA$+}ppo1N4O1X(y?UOEJ}yHU6Xp_v#Prsjqj;yu<HG zC#m43?2%1c6mQNu^y}+BwBAos?Drfzn9+$$v58Q4qGJoU4&&c2^$-xdgmeTBSq-_P z)6{#M5YcjEN6ftavIng!ct=ax!7OtHO}{1QA|oH((jGt;ZpaI)X*cmk1_uWV+XqN) zpHINP>=zY-7JHuW`oFF}3S6L&UOnxer+sL~;NLQ(F-yd7%0&7F+t1p$yFZpp{(P_# z(Ofq~x3b^K1PULnYZj|QnDuZr;d0W4yN{MPU7@tF4z74GXk00WlB=M8MZWkRlI#eR zs6S6ml2=!YxH8?!#igU8wdw?b=-W84HX-#K>D9n3-@elGPucf_Sw#IT1@!<0+qPB( z;T&X;KYPY`W~pr=#dylQy~-Nh4$)SNk>j6he*_YvVNNF%>|MSz#=G$jvO@=|6s8pY z=sRBD@lEqDhr)dbScZs-2=h1LODR;SE%J-Ko<j-K55hhlXPQri9r)!nZrSKg9g$7s zT(}B?P`!rdTTKiK2*`qG2)B``k2bi{%Pg$=)&74iI5F)6g(%ql<N%lZMHMx)tts64 zV(V_xYo<W4HNOu<472z#Ht7X@ktA12^EHMj^}|ON=GAcW5i+!uxUy;p8-)XZOrSGa z%eYLujvno^=9QATcMs<C7sx@%X1|tD(w{zfM@sSw&V%VR<MBq;f8+{$4|K@K^qS;$ z6c-3zh3cidcWp}=J??7eMQ}XQyOtCg;tt4EQvfsx^y2f?_Za-GfRABqcs;b>o zns0#WS@E+}wdjkq|CMLzC#`ATB!%w{dHO6v&9qQ2$lb^U1QyOAo@bkC*5{N%TIIa^ z@70i61PRw<q%^GbsBlILa(Na93r>$3)R+9h%9f7Ff(?RqQo7HvJKoIRFBl~FLLSDH zBFD2o*9B~pgm$Lual2s2tYx$12A+t$YRj4%&4uqEcW&=v^=G1ej~u>M+596`Wi@l+ zo2sh76S3>jQfr0TOy*J{<d|Kx#<hw)%^j?rp&u7vW@&?DQ+vkCmX3JdSk1-m3o7hq zy>31b>Z6=*n|j7IX6kf_(6)nFXGj~bjD7wYL)z~okOnra9=n4F=UDq}bLP*rf^758 zM@dkKYC`71ob>7z*t2zWBUbo=-W=s%-)R)T##$zBqguF~euy@KK`W+5yu&#^Jx`rP z7q*S(y$>%y*Y#RN8|L+mo`S0naqq{FBG9UR+f`d(vKO3o*M?b9uK<kXT(gdvCr?1& z_5rJz=d0am<*d(8dC6#DIkP{#!3Tv1jbWV$9_#91B45o>KRGaOGMJPyZ_dYkafghK zV3SE#c1He^)eq@DuyyO!gWTMFeZETuF`!A5DMwW^Ru}i(zH_I){oVPf>OD>A(gG$3 zuG1S5qP(y__bfHnenX#SsrcRV_?J=m8+WA(FdcIPyECAGRlTHS`NV|-;fpLWqg`$$ z8%s$a25>=^`LQ^=fTKr`jt0x8FEQ`q$B!dGA4`e;d~bE@cPEN2q@MqA?he<SJ|pY* zM}Hczct>SqWe=kwdh|#XJ&?ML=m&W-RcSVR;%vcrSohN^4PAbppSQ2R*iCUr4V;di zir<{R77lQ57vUk|?0$b3-EApQ?{|p<ztID-`V;{dp{7!wM)>7_O!kj;368TPCxvt) zZyPg{Yo?4jh}EWJCTG58x0sg7U7m$9;1JbKv3VapPxA8?V%0InNf$fS()gdn*WUsq zP)aP+K{gddf(#AA**q$CCwqB;a#Kj?X<Xhu6^;{Cw9q=-T~k+gnY%%c*n{q$D|>$4 z7hSl1mDHz!0`KxBvfQ)H@+G6QDCnBKF3bi&dhzmHuwne^6TL9<W2l@tc|o3?gkS7; ziWh6{l$+-<9|+ANe1^o2p4!oMVnPfBOMJ{T{wZo0M%lSA#S1Z#l|y`jdg)DzCDOOx zM^#Yvx{$T|TwLA|sBn{YVz2x<=Q+^^DpKB+&9<OCT#0>ID$bWSP-;`XYR`HS3v9TH zQg7ehnpR=IOYo1;aHc}gwGVq-P^e}=>tTdYNG`uG@1K8lcUqLvFUP=IO1bh<uD@C} zvW~gD00t9EG6%}8I=r-D+wrB+xvN5y6a<G5j(@<B#W8lXvKh~p(wj`!ryM(p{dr{g zwe<QAApVfRo2wgl0@We#J`mCXE96Gbom=^6Xq8v3s{)EN>MC{4mwvq%T#UQ>EZYsC z;2wX#l6Sn&NP?WoC~JI!_WNk9CUg9ztb=DxN8x%-k`)^YG<mVQWj1ti!GC-26a8wh z>DY+2qwkT0p}J%J#+tjgn`)C(Newh-9$Hg#zgRiH*f)T@bI%xHHfi<9$>~)?aG5x2 zbWa<XQT=zPu><XJBkxkfa4}?f|D)c`{Fco3i&*kqwPPMysQ<@xNpzQzB7e6NOK3ZK zv`MY6e#le7?&%UUdX3W<CnGTk%}R9bJ>xJNEkU%^EzQezb3krr?F*+Sn^k525@NTn z|0_J%u3;fQ$W0+=o1W>bgRo((+FLek-1zqkvbCPaDfYc`m5oDAEgT_${}3k9ptQ`a zI3DYQ&b+&6$DKJy#yuqk$f~9yd4kq~U38hQIpvH2jHRvl<kB{b9LmGq?zlr@ch9-t zx?ej{%WQo^C%c9EcJKFKGjO@Y0hV0Y`|;{{M+1zoQ*0;sTCR{DlHmBnD^UA#imJ7< zbGiKl^7r<dnr5Ldu#nb)m$)&!e;>BMIg71GTwX}c8m9(cEi_#JOUxWZ4Bm5FfCFh( zW*le2G+*i#hK!Fod{aP!N_^Rvk2RRS7qc`KrThsPIom0wq4o2nphaOe-?e+zlJh1n zD{Dr|-8ov?Jogba)R0o~6=vZFJ=@N5mJ{g1zJ21TqUJ7Rsa<@l6xMY9;~OHTO$)B) zW_3$4Cr=N)L;G1HKelRCY%kX^yua7Q<@d^g*-|5e3aSM)<jqYZc8CN;=TiZ*6@tc{ zF=z(h?@-eJlM}Gq!mLaqI`%5nCH#h+^nZ0tfS1aOj*kBJ<jE6Ce-9T99~%?K0UjCU zpsg@_+mPJgy0ucelF!{X$#%TmnJl9DrATtnh=RQkNVybB;!7#Nt6HQY)gL7LEM~6H zpH-?{Y6tF{GIZFkEc4j|g9-vp;t|VqI+YkYe(_tT2Xff<$Co8Q51**j>;~pvacezB z*4`&#Rg8xCI4TXZWEr`8@7{L2VM-@=eyA%9HC;HwS8#io(noH`Z+I^F7%$2NhzX<y zmWAhRNJ<1D9=pXiZ^xZk4po_EmG9o&J_oYYL=(y4j2nHS)N(+p+#Od_;{%N8zH{et zhOHx@LW2@a5~U=>{*hEAqdE&i;*5wDFJOxjRSbsetzS3LtL^jmOC<{D_V%tD=rjd* zRaY=vaKNz4XS;@h=Z67X)Z4Zn9`|~Hr7Q9PBhy!VBjfHf{$jp}0P|H-2)eZPTJR?8 zUEHcn;3QkS_{BodwGkFCr8`X!DUr8K?69e#(?jNZ?*>=a`!$z#NkoD?UJ%9=-g==i ziUINHqJ`=*^Ai=th2=*NiH5R3ntJOj(Q}yCke%f=SEjYTu@0JuuA6(*)=eiZRwc8n zQI#ytr%ml)uxm^sNheO6NK`HQ1-u}w+ZqXdJ8ivc@8A1K<b??-R4-oHn6aDdp%^b1 zLG%B$xoH10xblJ-b}hS^!>lMHzu4nLpL{rQKj&CnqcbX9p#^^%?@!8|JD<j7Kx74S z8+jEwve)8@;C&(-3SRNVwYg`x1%1c;s&4-F?I9`yzR~(!=e4C+7oEQKQjdP9G_?4M zpRb}gcgw>!Z)C*l-`J*pK+`=t&;9Fxxnz>AFddLE2>M+_{>(q0E>3#khWkL%$ug~y zv7^}Ddf|{_k9m8XqLjmj4;uqXb6)YE16vndxzR`Ues{g@EeBLBb|I%iOY#gkLUzPD zKNUS15ERr~Gvu-k<}b2-ruEECKQ5oQ?4)-0?^>*H)`S|45r1ecc+E6+_eN8&-e`BH zla^<%QH;Jcxm>c(!mEVxeC0KO-%7ikb9~%iq;>sb{~MDz$=bp#(xw9SQRl(<vWoe8 zKQ5s!;3Er#vMtgBH!D)@v9s}IF6-rTe4It?In^QuSer-h-fj8~KYRJ;8?-S41j>Xy zKqAT3YX-_MZ4>jb<SZ{?h>jrSs_gR7VUL!<Ps|W|B1f3IXi-Ys*I%0by)QpBmSSW( z2E~rH%S|VUo@i2D*!r0)g-Q?3PKpXy<k+!HhA@Tl_zLt~PApUE<riE0AbYRbjPlVR z%!576RiqYhuz#jfnhY{5ee06VuK??D0CL+;)Ehgr5`$L)w?45N&ZM^_4-^v?n(uim z=z}=!O{0?&bPF!x%!1lRky9e~THfD}$BXccA?tC<br2yL`GLx3DG1)Ac8slrp#C)> zN`+7x&AeenDXPNKN4iU~%@+=l$qin3bUnB|Onh#z;t8_6#@-qUE!odISFU9pXCX-V zFH%`{M*1GOPh@ppU1Q#(WlJvJXnOner_=pcI|fn`L6X2N)d3+hGt<(x4N`E8nZ0-x z;G>nMy{zE+m^&s;n}zY7>`$gdHk?)zua85HcxkSDAc*-;D9fF5_kI+$JdJoBRWY;L z44qRy&-W|JZ|Mm24A()5rCqvHQ_itcNk2tIPyEP-J>u*H(*8%~B*cuYEdd>`qWOeo z=;L)eEv+v<WMmvlrZ-6Sc97sSU7`%058dXToYu!9v&gL7ust#^VB~Ei_(c+VWQ~(m zat7y~lzxa9n+AgA+bH~x<y$2<*xRc!>-QE=dU90=@65i0m(2Sb&=qocAz1y(mEUX# zK9`%P8C?0qJ#q$P2m7#Rd(|HCW!KlMTG`q@c8Um@wGF=H%a=(p?!U~2JX&;RwaD|# zqLh<NoTwMjm9I})yShE%dxns7K!y}|pr<%uhN7&Tp!f+|rvQ^leaIv5wPeM&wi*tf zx<ZA&A`e==c;sAHm%>wFHF5}3^h@7YSI@3oLJ$KplS}iR^6$he0^BW>66V)40}F`) zR())6(}_Z%R#|NIb698o!B{XPd+-?O&b5qC!rH*2Bh0<>tsc;YZ1-iKru?H4H+Oh> z-{4;VOU>nEG>Vs$$a|t%B<-}hW3PMzZU|QT$D~A;Y&(4UR&ckAiqs+%sfVOXB1R*K z02@FBgL5CA-*L;1)*h*W<mA_YFa#iVzck9-hRqKRd=6CYi1lInh1Qnt`12lr90b}2 zTdL;KEMNa&W!C`WN{Q3-VyuRAz?ke^FxvCoCTqXg1yZ{Ii$BB7Oo}`+qxj{U#Q%@z z<yaG3jwgDz*k2-YVM47bUL?wRcN$Jft}kv0`l}x{wMW{n^|h>NKPUv{G9|{Y>*Iy@ zCZc-&;bs;?*cQ!bBSca+>jrN-?Ws|)H}3k=Wsk-v_t`;O$r+`79KI{g%?>#SXj$Bp z@k}l%+=kw$Y^TQ6C2v%wU|YW{MC`A~F8=rlVYG(fB>{eNag+$BY|{H)7%49L76ar; z)fQT)iU+P3m3pH|zTX1H!^4@1g$>J38gPvww5dX%$z}ZTWF2S(siew2`XNf(_WWd# zmNJDGPVcCjwe;!Q7jlYu%q=iGC*xxd`t|iPioYaO^;~+cCU}yfI??Z;Y@n56o3h=C z(<**yzLpz!YBFxLrEl5|HTD^2QHa?in#*W|EH=b`1XdvC+l!muQ~bgtzp<FsMggC7 zv0di2WhSf=7P4Gw7R{B&vIUn0U!P?cc_U+!8aWavz!1pSTzk6Rp@+eB3@&>z=yr0S zdmH$w_<eoyWSMY3eYYu}Q!n^)s;sZw5A7}6%+`VfGa#&<6CHPa<bGFIStV7URR%Oi zo!CxP8e-uf?H}UIZGQQ&6T_80?I)=qRz*1p&Gopbl8;|rU8_Gx!xY=Fa9dg%8E3hF z|8S07wQ>6X@;?c+oVJ&xE-FbOb^!;GqSwsnE3u=ZxF?;1Ekq)4jO{q<`oqFFqAqDB z1O7n%LFz<TKtM!z#7&_$6e07GnwKL3d<#>?NL=7vV1p%<Q+O#fI*pYJ_{d&R|G@<w z5JTA6mX*Kf`53)zbXqY(PWE%ijxg;3WMamu3_C8rcT+XlB5@m<;1=q)u`MmS|6YLs zK=IHMhSUB>dx@{J)0B^N@kb9_=d64o4atU&g-_v-ApJ>a7U4rHs9i__b6Vw5<55a` zlnU|@mlB0an%}PU_upo_>s0HF2C#ZgwID>)j|)gvwMn%+I4Qj7_s{tG1AQ&`pfsGZ zgzhiC>{{}3kPnc29e33$SM9{xdYAgC`aUdp>h*hU)u!z+Y0e%!!CY0k#Q&U%9~KZo z%^w+Hy=Esk*81Z|idN2;S3;AJ@Xr{-V52wOi^#p_1v7h2@g8KFof<iDkA}A9vo#a^ z!~PpsXxBaX`#YXAI;)C3wj<;a(I;R@m{TpKdss>T(U=`N5<Y8I&JqYjm3_IS+IsZf zv``R!?_m2Rp$~0^kr6@U)-cpenwJM-dxHAYZha(4j0Tir0jY$`)_&*wg+bk<HUjpL zAt<}MJ-L>rg!BqU-!ptL9N!$`$O|QZ>WY<Um+};OYYP}!+}+=wUMn~KeoAS>Twb_s z@$vBsm5wnOimuAX3iJNkv5XrldBh*r*V|6zf1QU@Z4+DaV>?|^-0R;7TNFMBapu_- z_DD27aJCC0dAu$WWad@3cKfaMh`uc3t}{rQnChy_APhzQhPX_aO8kEJ1Q{`Mg<+Ql z6Oi=P*|ROG+UM1dd|pm?PTkWpIOw?Em7{ztWxA5T7mtvZt}0#A6E^U-ySA{5eqX?s zj6lu|gjGU3QXwc$Tw_uCCSN2MVQWv08Au0m*P-(2`9rRX)@*dRTCnAR1%||3_5u+{ zWp!?4SI&nD>@gi}KXGW56x*!sH?)t8pzMKx6e>&X?7#i(r*jzC+WhQZAo;LOOX2Dd zhG+7|L);Cs9a1{YlGg4EXv_#an6<lV)8R{rdJuVPj`RlcL}!mp>1MkOEHf>1xSyWh zFTAKvP=U3_Hh3?>1Bf?^j2k0AsP_B!|3rHc;ncQzUzfABnY8E@_z6@f3!U0U=Nitc zK?t|GTtq(M5Ti}MXVW(7ZtcFBIEff)vVo8q86I4qt<cx7jE!>7oM`3ngbhig4!ikZ zH!0KjF)H(V)4^3Cm)8isVa!RZZW&E9Q@n}kKh^Z@r@rM`s4uv)q0b>V#Xh-Rj_4`P zYL|o)t4NT5@cuM4Em4@0K3-Thv2tF!l#K5K=q;SbC%D_G^X3z$B^Ch@|6cpw&$96X z2Ndl=!&F`%6XG2fA)jP-8r>$$!_r<Blg@;Y!%<v0*<wkgv6L`uV5eB1(HmrY!YXW@ zZ^m2oLpF7$YT+WeN)vA+C6Sw0!}ApPCmxnre7#v1zcAggC@GNXl#I?jUWRae>GX&t zluRT4PTH8pDk2!?X0y%8>f=22+NfGhG|dm6Y^0R(XlcVC_O<SWybr&ZY05w54JPGi z=jx%94&g6eVocIbqJOL=rXoM|awteZ-Fj2^NHEo{^*S@=&i%XZbnyMT)23Ng-6-5P zq3<Vt%aYP18x-pfjXBnCp`I(uW+I1=0c(2rJ?{EiY5)9!wyqM0iv+%Jz;pD!fQ0pm zQko%ip{psXYfI%{&dqfmgteY+*Ui&A#RVa8&Xp<T8yGr*-l;nj6twoc{8cPaZ8G*- zw`#Iq7R?`j#pTY1d?Ef>a#Uv5@r`G%113{0p45}jhn&Mwt6LJt8=JQdl-qRZc<eoN zDMv{wscS77E+Cx~PM9}lU*Lj+KN5$AS8Ug~nUeBjoG|ZWFz%xQ;1Im|#fuG0P5Jmj zEL?fhIO8q2CL`mh1UMYm_yc^iVDGumRg3iVm;ZT^Yn*dl#cSD4jqoD;DiZLhG`K%S zMKU;a#|}+-;SRH0ycE4D)P<qLgVqBD;3Bk~(l-N7IE`sDHcaGf)cnH9$|72ciIMM= zQ+iIVl~3P1a%artw}&ldP|kbTYC?;p9vqi+A60Fw>AZ-3vOBK71%4!s{kYgtmXS=@ z;1LYtQGy@KGCzY?q}{eSIb^&*y+dh{8C6`iOJ}$`c-JV3%zboD@4wM%;X9WZn^f4Q z_5tW;buv7AB~}GgMT5*w4a1EVX0JidSsLFzuvoR$wB7c~>U4^^JX1F$jmF#NjCQ>D zz2d#^wwNWo)-+VOigpHerFW^lqY=@GT3<08bJ^K8!dg|8?wjznWj}JI{zWN8K&r2i z)KTc@{oq1`9+F}<e?ux8xM2$v4hj9OU)w{Yqyw-2m&{m(el%Ha%9Jc}Dw`sQUcGK7 z=a)Yg`G$kqU5xx;?;y7z0wGnZe+c9bcsyL|T2|Y78!bYVc4>z|o5cipLzGXOz*QgU znSBC1`H;GL20;+`NjTW%3HApS^fs1iMK1q<2}4E#pK%}=3@xZ#6xAmimVJLDxzb|m zR#6I$t6Dm?>`mWPKhd3`hm@bu7(;(Qo}DesUc+UwJyN;9x8lyoFyO`+mj{=qOJGqP zD5&p%(!G$lgWFe_gHW?ab4AzGX?gPV<;Mjduh?R4ZqAwg4slZnT2w1_8R2`cF6JTJ z&twO<{_x+@73(@>%#1VE$LdB9F)+_jQl2DX<C~|B{rmlQbZtZtLKJ@BK|Nz)I_KxE znf><`p9+hD?S;OA88@Tx01WE~O*_d)V$S6CVdH0~qo~okY?raz*Oix&s&VK^L&GwU z#PzBkzl9M=3w4A%rCRtA)uP!TV#Dn8<voKBe?WRb(-1c-u|WTF`rc%qrgMyJ=->IZ z+K1xHw7xPTS!=t~Pz4w-6g^^i?Qwv^Kk8P+{~x*Iq;)k<l%&N)PZfRQ8ssfa!#BNh zwbYrJ*_Q}0>()LIth8)biMZ@KsiS*RvOl$<4}ujql^aF|>C?TH&6LL|H!m5YKk>m1 zs<5a0U3qK$l37uv{FFvy9}Kx8p;hOfA8Xc6=8(8%;EdS^KOP$M>i)sgcLv5Zw4mC} zi8_1s-iUyuo{|d!8eDm=MVayPufE`{MlbA5jpAdUMA_8Etja%zeJ71-U(i@r$%0YO zkd)aEyi>W06U%k~{{6aPpUC>0a4PdHnv5+Ju~;$2CMF91RZ>!tC*P$hDebsko_l?< z?DJ2KAl1%fz|xbVf(dgQy3r1z@HTDUJhNlDpnAOi3!5;B6(<)Cqz*;J4`U#{T}AEv zKP*Om78Pbmz3dz6@&H6ds?q7n)Yatz5rIH|$wHGqrReSl=BC@Gc9!GaWaTOa@0b@@ z8_B+<BS=Ewnp0t~6DvE-om-c|ixv10lD+hM_cV2>9O1u(i0dWYup1dj?yXgo?%?ox zBV33#?MvBvs?3?Ep2Ptk4&vFNOi@gjaeGAcmfnV_Hc}4tgeWT`(H<oq8BnPUx9*_; zDQC2}=vS5vAg|Gk8U*dI<9OX@8WOPJ8)HtLD>Zqa#>X_ApQo+8N&M&{DXpY{%7QJt zs4a1Ja-0s2{ikM&`{#Ruutb&IU1ofG>KTLR$e0*q%|UC_mTuVfIH_pR1$r+)3dWya zri3=~DElS|`9r+BT7tmc3e4U(DzRtJ#_;QW>WIJQ)WY1MxoPiwh!E!x=H)kl!Al@5 zXW{+#MvJWLP)Vr&mkukLbC56Wkk0uux!#U*y>8j2x)O}wCz0p2pu9b2jcL2QooC6j zXOSa^xCVD17CR4s+7$)#&`piNzcYwK6-JHvCqGR?E82+N8&!14>8hbNMbl#DcwIW> z9P)ShEZ^D}nlH>}n3&GyDR4y!4jNxrSST0xNFwHeg+=<o_8p|_q=|?MzJJ(r?@D5# zXiX6Y?XgWkT|6g2h**#Y3PI4~txx`t*r?hevcU8er(F-OjjngF?s_i2hF;28fqk;p zRmb(*w(6#K-&s*f6UDvv;pbWUM^5k(Veu~vKb{+gh>l?x{{E8}3x`TVJ2@^S@=?%* zoi%86!b{@THEtwMQt^wVm&NtS)f)(1UVL(#$0GO=BCr-?%}ZjF=Z`x{xoq1w`U3uD znYYx|&AnkViRd_nY67i^tmPjlrF^vQUl_>x9=_4EByte&2jKZ2t-#4|?PnR6@7I?S znxHO>3|P8_#UhYa;jFsc*{|<+{zEweKPtQhyQCjG@2Z~`S`yyS8EzK#?-5O92ja`j z(vhX)pOuUueD9w7-&uSQV}r$g^Db8C^!DNpp-ju&f5>6c5y9nqj}8)~Zb??@ze%lp zb4<e)^0|b<P#`D3owHopz`bhMUcF^RyUrV<)1I(WL?DzTV)#Lc6qVovKmxsJO}dFB z0w^=bbc)=FqYonFe1=ZjmWt+IEwQB8u)i)b7R^(SGxNH=frsv5lQ5tIBC+IGf6E9N zZD+>~J%qx)sVf4s2}Y+%H^J!g{r^DVATjy~j2Piw*w5;r^gDw<sTlR2EuNN|pSsyI zn(cS(3ZR3-mw>$Fa<-!bF;p$x0^8#c$1+&)|7Ej=TEhj%ZP2ga175LWMa{U;o#H4= z?HoT9ZX25(FOf%&>?n}bp;0B$Sb?xMizB07hwkR&g>x=MepW%q?L55T!YKcI+zFO9 z?f1%ej95BaO|&KtVZKkS%EX|8OTz+Y?%iw<;xvW~K#o7QH<w=(+iqoN2U1x}!~nI% z+Jh9&QGQGH9B(SFK;goUhfldB&OG_Ah})>#b<m7EV^uimx$g}z!@?<6uTzl<D}Vj^ z$-AxZY*W$5eevI#hxS>xVR7OV_nBBUJ-uJV5!Eo8(($2%^U0H(PiIDV(v7C`@ZmYn z+T6-&9=qX^{<cO+_g@=6Yee4j*GxL&@jcqPs+E+DsT4Q43l0cM`BO&}UiXpTQ?SJ^ zc1Y^$0IGO<aHiJM{A~j`wy*BjR+-nuldh8)3rJX`U7Ghj>4M3mG3QHrdua)-nM~p& z%UP!u-t(Ei^|Wmpd@eZ@U+oq)jSB!qXbnvLg(j$P&aXSk702?%pk>xZH5a&Z|NfbM zYvu(Nw1vaK^juc?GGDNM*6V6d^b`O3)jV;JSf;dM+_(zWz~uRkhY6M7h-#n<va~vV zA84qt?=J;~puXfJ(^u0<16~3@_X`pxOsAh*iIPG7g~n!-locptANpY8ohAbUM5_ky zF|z$1KM{aiJac?v!O39(Rg8LinCSFvR|^!ydlAH4L0TFj;R~x1Zlg;$t)$;1s6zvS zaD)MH{(K!BkC5BzH4Mis6!vVwYmziT<g{Rq)5r-gUexZA`{*(cx1!VLWCeM7lYz=_ z-tw{v^XYD?{=LLOaflii8Q*E1YeIhV1|DIp^7ME1(X8qhf869}h5doq=SvIdjRkO{ zg1v{<Wq+j`FVs(8B&t!W|6zJsy=*Qe+JlpK{Owr+WzW_3wzXs2)E76VpAHo)5Wjxs z!2PWLHIl+mPDABT@Atb)(>5dxj4zXgkaLM8LJFekZBzS-Owo(!M9^bu<LMlBdfW?* zf5g}vDQje~_-C&i+SuuqUCjZ}jKW`DUjC85OF8deN9#-DYp?d4jAxIvys*C{#c$8z zlOqF)+q$e%RIC5tgRRP$?(*$EW7rQy1Y!Xm!*29jBh@|)t$GP2)n0;&I_B!Wi>kBO z0w1fNlnz)L4tXj(YcNm?TR?jnAwk~mE1kD(?9So3oSHTyrQx7Mxmrp~8`JCy&&l+L zWuG&+5{b%6be>3HEp>Bj70ffGBo%L)B3+cqJ8kLR5B(WS%lQwQ&&r$HFLRomBRl3b zL+cv5UNwWfAUR$AEzf##MfcD=(X}GEd^v2#jZJEvk1@g$_MM&g;Z2ckDuH2{6ZJz} z51l=KenMV)5?7=r*9wmgsV)GwLIeZxOUc&jY{3v!IU*Jkxl@_VsPVLrssF}*Rt+pS z0&H0``Wep6@1%RGO0Vg&(8Va^av!s>o=ogda5p?uwsU>FJ|4G;erLdC)kz^pH45YT zG|kPAxBIh&isQxLBgVwSLzRioifTSbO)JiQoC8%%M%1gg>6f<?rjR+g$Pwv7B|aZ4 za6is~g`=|JDXx!Owmtmu-<}G5dG}hovBHefln<<`E|^iS(Okq4mGf`#_m>?sEBdJx z@rt{&mCW|U0IjnZefPdvI+|9Qo_QiR-<fpjWsDLtqYOc7XGW~pP<ZpDAWEN$f*q~f zISUhrHPPD*9e-C|OO$Ku_&Y?m^*oeXk3Ul4>vRuOnl<)}!Gral=V=l?KkiwTW4irx z?~`Fya@*YMXtGS8R3X7y`;Z`)Nc)z%+asT`#|Bu+gx`8Vi_HXPw`S%npvHgNhGm}k zyJZ4vGvy0fxBh4M{bz|ZG&a(!r9``tLV!OZ!Q{_H0MOvgJ3XD9*X`Go|I334mvWPd z={r2cldi7Jom?zf1OMW<caIXb20Nx>e{^TkqcQO{R(w4AC?Sx}3oVfqBO}JMudTVU z<GM8^;5DQ;6?BZAYgmS(YKKf)P-zme{j8@EjTf6TPOMPO`$-5s93#dEeiNDOk+hrD zj~%k>ALE1xKOW$j6q2LR$heYI@<%|r$&L^LC4_}2;R@MerW)o!4zEo8_4033Sy9Xz z+xU5^p~N6rj|#EGRd1`RW;L9-++QS6Z8J-vbWDRDO2D-6@NkEb%^kt~cYyE4vWAak z8AelKKnJprIHqT+|LXSYtV7|qFAm^7<2UfW(IjjlXK`9c#<gf^+fQQOAJZW<8jI<x zhPHXV1R9;w0z1Cq33_%;%R12+?+aW7UeZ}7%96^PA~s20x?Dv}>T)Sv_w_@3{C#)- zT0K4DBw=sbz+LXKDz8N{X*ydck~z@J{-ZTp1iBeyro7j$h^b6{T=-t_9cbfC&c5_b zvwD|gaKF8mnXV&xQ!-#_{IC-~@O7l=J|%hX+ZMs^OTeAwzklC*^+t6?pmTf~xZ~NF z7@;l`@B!fmpVf(UF{*~<>kT3nPrAiv4y);oH}-eusuoodj&+`xjGu$WdK16&Tc31@ zf6R3pZS#eM4J;DpvGt)tmD6U<Y`>wTPt({(DcL6mAzOW|dTYuCEKMG^a^a=txde9X zcv>xfVpZ5Dt81?qi*}fo?=K{h#4q+Mio>KkckVQxH}1vKpV!v4kE41^-|s}a{B1~4 zbtWktRfebLuoGW}(FLP_=k^t*reV=ft2&5=Jy_je*-N3&kCQU?MpFYxFFD8(#Ev|e z&1~nusA7y$)aOQ%h5%_@0r1-m$?@15mUG!pWVo_gW|VX3{qB{iszqlE#%J<|qC#Au zO9ENlKM?`CL~74WbE?mm?cc1d-DWb$=11{N!@u1~WNBG-U=NhcJwT8#kxNDReNSC) z;(cmlTsC?;CfB%yS8A-Z{|B~dV(LkWT`WYk4>WI3m6522B;wInF>NtXL0n0V{Jzn? z&zmTDz8e00EpOmzY_1p`Jw0~pc&f1$C;PvTypz?ZV$yCju^OUJ72&Hc-m#+Wb}K(m z0G6SLsc;0ZsA^p$Co9`8X3qXe>k~}w3CnCAZNEEQT-0L<=O5jV%gWm~8%wPeXlC8J zN3yt~!q5oaQz8V|=JBvJ1}O#}vabE}0Mu?Vc+C-HyPo&b)6E!g+@?odmZ*KbvMHlG zRl9U0a^;@HTh8l|M@o44$2HD`9d*-jxM5k_*42u-h>MbuQ7GQ6@DxJj;Krk>J?%NK zTUV*vUZWyaw_Rh>mJBDmGnQx1B_`Imb|<U&WkeT!;;%xF4l#nHmV^(yqyZ30D8~Wq zK4<K%Dh`@BN^4x|I8;xD%{u7`mG-mvE(n~!i#TQ2300fv5%Hj!xDA|1G7Tc2u}zrA zVE6GX^$~I3y^Bqd+ZJog3Gr*dvKVF)jsmvYFIHw^coA15EX{;PJciVUUqU3Pn{v8P z{zFzr)nWuX?vgBI-H4QSJIWv9c%~<XsIhy5Ign}`85I%HNjKr55Tz?mzDJX+seUd) zeYX_ksb}w+YZT6jXS{4^yF$WF6x1`CXYdagVd2-=`6>Kj(;wA5^`I$gYD<NAs&xRg z<e^NFk<jVE6+1S;PLAT{RnunuTs*E-oO`Lh#;AP%i^p07p(*n=^URDOyXd|kvhHTA z-G;t59nM`h7u;Y?^xgBQSdFvNK?k8mQ)Jw{el>3KWw$~`6W1(MRv;-e86;FVLxgeK zfZA%vZ-z`}IvoVkcJY!24uS5y@nxMUiHXTfV)MbNJPY@}YY~xIC-uo-PIOGk*6C|F zrBV>r4ov#JBx&tmHM1}(d<T)3pZev+{!#f>&oy>H$5PT&%5xzQ2)$`U8lP5iXw|O1 zQ(+H`-cT#0TR{tNit5}=>(}3#K6B=9_#0tD_5GIYCZuA2gEy&lL>OFg46~_N*VO)} zn?RB>jemQ89NLoZcy!f*lKt#f)qQTN`i&(t&+su7=0`v>h>va>U1@*!UYy+~B)>PB z@-5Ww)wLfSEaCQjIe7xt0M7FFZdxyuKbt_r@x%H({^Ur_#wVl&!eSSJ1-}`JU-zT- zy)GYPBgo?(9?yA+hidnWVPlk|czN%t_~keXC2CrM8<|>^SH6Gq&Xx%`sK57j4YR3< ziHorMHZOhMGfne6d78eh=FX5?&7)%?BM)+W4i}96p!sd&Wq0y{Y0%k&xRM4b^>qm* zk$fpz{=O~0aevc|>K7Wjq;glsmpwme=-dUpHJ{;Pa;QfNF)zax@S@&fK8ofyb}+xU zXCX?^+4_A5pOFqKNJ6zI66pJcL<-HIqsRtn;92~?CYOJeZaSqnOx|Nlays#JH{A~# z>qlRHzwX+r;ug-+BQ_Pu!bn$<@6(G?P5?7G(wK@|cz>09$L833f0|fRq8V17^P&8H z^X9Do_7<pvtc(mfG4+x*w~m?`FGUrp&d*ybN*daFPcPM~8Zp6q<c~~+O3y)?)xv9e z+nmxWONbU)BQ@UoYHIfK^7bNR3`iZxxMHQqLoZ!YH{a^p*lgL9#{~PN4?UJ=DZO9< zGS`*Sb97f&dQO)gGys!<&jhS!dK3M2VDbgl6OJGC1ACaCjS&`-Wp(7NVc``mYH=Z) zPG^TKexfOr(*bvvW0hKAE57~4>IB7TBQi5Mek9LaOiXOtsBSg=73ss7YgDBddn-O7 zF#vFENnouJ6DH8WZwK;n@v**xhfwAsx7oI>VT{)pcfLKLCK*=P?A+9>pD(NhG7E>i z9<Topqrz?Cb#(<n@(l@;i@Xf5UrF#O>b)QHQ0Q?f2qmjf5D;j^IL`*<?ib`d-MfjU zI^vXk$#m{P{IZ@n)7@+j9r{aZbme80Nw-r{QXm<<gsfEA?TQB$x&E<lNFa?DbX71( z-MHoDQPI%0U!Xm?=tqQY>WM=g-z@j-lN1n``QvUuZN-MooAVz$I9yoCaRfP@>7MiR z#d5{IL?4WO95P}z$0r|JD;L}`yGVsr7wsl;I_8BIV#^dT7Y<(^mPE*S&V5iTV&&Wv z7UVS_kSwp+bKt<Q&5Nu2kQ@sQqEoYfkL6CLkE#fa_g!n=1gZW*wcb%vHqIfdU3#6W zw2dI=QJY&#L#LRR=z}I4@H8zwB&M>{Ee0bzv{W{vw>d*fbl<@W7tE8bK@fz0X*LV> zm}nzLk&y!8)%MHfa>l)nx7&c#7!-?3m*TQt&`rlc1-=}(KN&qTr8H--{P2d4vKDll zRPn>xav6*Xt|kzBaW_<2u{fkz0F_iS&9Z!aqZDc*ngrd^adsWsBhAB<3av8do0vkX zMWw7){b8ZL9#rhlhYyyTL&U`|f88b{#))SyN%QhwjEh5K?*fW!qz2*$RfKGrLZHlB zQ69_xVkuqFkfHs4)-u)B1uY9XO)lYR@<1#^ihJt~`%f76K=9f^ZfD{)I9hh97JZD^ z7Go)*X=ApVP`ocpt6v`fIRf}NJgqVstt<cmI!G=Ss$Hj~stRkso^PG51*Axf@0W0x zmmFLbpfk^U-9++$7eq*CM!Emw!LajITwh*Z-m{!h5B=wQ)v$dUh6Q^b-QIw&;_b8; z9l_b{FhT+RSP)?ktZvodrk}$ypwQRi*H>yHg(>popb?a;^jzY&2<M2B6G)EALhg>+ z@0iLfaDOq@%6*@n4mXv`r`j$XbwKv-ng>VdWNqU=30=0sXY^sLkA_O(y-xn?i&NW3 zum*Js=a2_V|8I9FN8@5&PuG&^0>E^zcEWsw8e0o>U}hoPgWgwdOSXO0AH<)nza`o_ z-Do{n$IaVMFveR35U5mLVjp4IUCF|hfWT=}=a3hmaQ^JstDCb9wtpJz{&{gU6A(1t zlD>k9ohwRvwFbcVhTff_;^$prJLAk6!Mm;X3x4<kRGo+EVEPoTNmKQ+YJj-e!g%gE zbN1}Cx%|@|8Z~;`dH1zs(linjf+s2S->*s~yXHnWot}BBMZ&O0N;}azd|8GeLPUd- z>F-a*1-TVH{QciCojTH;2B?K!8&EUQSSn3q2~*!v@s-h<-{{BTx0I0Zns{ur>F}j$ zYQhU8iYoI~u%2r8SWE{0$I-cf)wr%}ctmItg^*Ao2_Yn*gCs;GghGX)lT^|<B^0G1 zlroiyq9h`xbRaa7RFYIGq>@Ua<XGz-YhC+V*WPQ-MUC<Q-}fG#=YEbaS6F^+0Kei; zR0jBHy)<N@UH5LeUHzD|8ckof8_IZqbx|{F-#Navl72G4Z_bctxqe^f3P2t<La7$d z75n*BH%<~N{$xq9KObvrYqe?KCwpbZOxa9V!+bX};VS?HGAA%F=;B6D&{wGv%!9ac z3%3-q`M)cTjZyhdFH!w#D3;p6#l>8>1M}07qMd`9@5M+QUOZRO%RHwSn7Y~H6X}-y z{cIfO{F_a*^0x5<rWsvb9)5^IX1k^35;9|_5i=(}@UVl(M-g>qmZUicxz+iMf~$0Y zG|+`{F-_lQM7E$oI=Ey;<k@IYHZ)a%-+mHlI#5_qcDNg4<~#_J5Z3$G(U<)x<joiP z@*j;L;@M$@4IF#(Y7*jpiohLg7=VkRK&iW4-8K{U!!Criqr}`SVMpe(*ss7*NLRf2 zL{XqLYNqFmjm|<NV1aW7+9XR7bC<hYw1JtQ6Bx`0dpEY%lM-KO+Gia*4WsyeKv4!w z2@gsqKae@D&^%zbT6O!L-Mc5PH|869-HYRBzYnCKcf_W<|7uS175LeqtQaBT_+cnA za=D+MHs(wfn&6(hYwYj8=!E_H+|uKf$FHvtDCmag_w`G(>AhcR|6Mn3P4@b!^Fce4 zX8MpwXCN%#qJ>zH9eJPoexWjJ!O?|-(j8-MFEZvRA-3r&56StKdwt|dqhnQT)5-{} zi|+(Lx^HEBcN6)J^|$xbF@(N7B3KWUw1>dHL{)R8qu@dfminRt3o4%tKe{A*`9XZ* z%lBh3{5zSh_TRYk9;=O{VoykjV6NOg;7Hzn^|4hz-d095xIu~ws&1176>^sem3qPP z7}18Y8=tX)2Y*_&WQO$aQ)06cLqbFM-`}MCnX0IbFFJ;wAiNHd%-;S>yp^8#etxTz zW_cjdX73X#^&N${oYVA-To6l5CNk$ygR@b8feMOiEtH;Sl<+=VEA+Nj943g6XEHQi zDUX4SvegZf%(CVSf*;ZW|A;J;ZUe<|Xz_TaDp&LCZDKXOUgf1Lm)WZ^_t0NZUC2c^ znBC&K<mC5QV@2P5SItvN!<=JyDcQ54!8ujrh)uNGin7l3zL(ZWb!i@0w8+Y2!%)$< z8A02>QI6n7kQ2N$_iUc@>TSjdbSHp|qwu0IBC^?9@nG1xm1<{&gEg+?F)`+4s`h*K zEF2wRLZrqhA;oFJ_*vUVYq(K#>~$<iSLPuXresWvGKdHCV9y2*pC{)e?kq*U6XFMt z4Qss`uY^t}VjxQk2YY*i>&jlX<e|*6FNf#SaUeNagM1CaQ<V@8%5v#Yd52>D#sOrY za^mn16+~=BpXkl9iLCj@6lg+}-N|=4PhX;)MhCv#!Qr{MqnesIYz=cX^f`}Io&`fc z#YuROGoCS>O=!IkU?Jd8bWLdb`-7hAb029oc;0w&Ntn(i#araP^`tZX1)M7<VZr~d zikh=)HFMZID5we~u$evh^~=*t>T$!)8<m7rPxU*cTo}1IHDaByF=U9<Nqe=iFX<U| zqR3VjxF3CHgVKJr;D^t!`#xY`%akJvEWc0{(s&G?U$c&`G`YBG^GH2Bn1Rrr%O1sT zNvkM6oVSgT<8KOY<JTxDV@qk_XD5lTbLgpg0yhv`*zHoeLw#dcC(Rdd3285LZzS0F zPNHw0+#C|f0-@c^)GyZfCO$C;Rg!4wLT&oB9>ObUcxuFG_qC|0t-Xbd8UgAYsdH!8 zJpI}o)0DF@qTxTHDJ)Hvrj-9$CZ*R9S~^w^J4cT7^69?0uNCG-SY<G~a^<T-1}F5n zB67K!Y};><l;0>pTJopc;@_8RT`O!@%sda-^|IMfFX<7nwY>TKdB(fxB7zgU?_qgs zD3~0p>M^^+-8*rO(w{fTo8DrR4`X#HserR_GRA_BA3u)jd%$m0ZVuv-B#hkZp}Jfj zd||mxTlmX|DCj4X7pO&!j#Hm$3V~uymarFw1@Tt)9X`{-^6-!U;@~$K43~4XoT1_M zUD-Wmp3_L-tzBu~#OAnPgw?V!Ay2x8+l!7*(n8nQUgv8|FB9ReF{972+cpX9jMwo| zpcYXIT7ee!M3YB!{3Yn<uIOIWy|T<K@I_MXD9ZL1P=s?59BlF^Ghg)e@@}=wlDT0V zwwP!=pWuZ3&->vTW5^x9ZW8W3eCV+Q=Spa0C*zo<)0rGusEK&Je!?6%BPj`R2?^_` z>cLXcxwtltIn+RT1ND`ZP{crNv$TA)czN6-rx=Lo{X05GL?;@;t2*{p%&Hw4bnl%t zN~dIf|2W}O9U-`n7QL9I+{ym?KfFA<C)=d8`}Zj)c}3P;PoWt`T2=Dcc=XNPakHXD z)4$K?4PVH&!iXT$1hQ9P`~!$>#@PDH-PqdTV81#N2Mt*`dx}{izf^QgO7c{K9Y<VP zdpQr3`ep_Lk1>@7kDAHGiS6VlDZTO$dLBlSha^^pzjVs1K~i-btq(ChS8E!aso<ml z|4uA)cH6zXsNb2d^Qo^>(v{N&2j;!NT#|*OnHRS>y*1auWimC`p${p~pFKM>sU6K2 zLmF(Ph|Q05781RoXLQOy%{;dFHe?E|UWAbjh+LQPl%=gv@;1M?cIbbs5!`{OZmLIp z`pEsJz~Y6&?Ovz=KJQ^leq$=S4~Z4hbAW%UQP^LIc>F~nDTh;?Eps78AYRjX{5n01 z!*hr&DE{r8ZFst{L2kg8bJWw%o;~x1!MP7+Cv)6%CgIu;xMof|sn3W`dxwe%IXZ)@ zzkYT8%^}TvXU;j;W0Jxq&NB-~7UW+{S)FVWcM(G&`sE4LA5PE)T!OnhKaCUo;F0Eo zr?Df$VjbJMJc_3QtiMhyXA$`B^hPtCq%tG+m1?wc<u<JJmQw}KXNuO{@oX}|BQLgJ z_s$1Jv1gR%fywjc>c;;oIA5Z=O617j-glQH&Ar+(dI5_av_p(zXt;W{YcQ0O^;6NZ z_adDAbxlG4bzR+LpAN&RLC#wxMgKI%_Sj6r{YXE&4KRc^B#dKa&ChTLa%s;f{8~^{ zv}%lBIpe`0Q8i51h2+YE{{g*;u%ZZh6P;+He^_7K2I(Dkl{!RBUxY-_TMQ0_IoisF zkMh505^;cJZ`U#1#f)>bp5Fk%3H<x_dT>!hQxx)(I!rjK`J^lfUM9zYD?w5d1M@`m zjJ`Y>v**l_kpiKq)#))^7)Sk1J9?AwAfb%=G)lo6U3ga5((^b9d2u?Dup`<Ml?#39 zclPX|^yHNV%=qqA>SiI=t*`-v8Ha-z4bSIZHfE>$g{oVE-}6ZCl|HbPDcYrSTQX7# zuPbkE?eYv{`ZAMVr-EH8k0=pO6mI&f9W97nZ6zM;UbAJRN3GOdX~o%$lce)hq(&=| znhY$uiUe)!!@<yPWj2fsn8Ndw)>lmCPqOCr*4b01+CbT+u<z#RpWjdCh+VWIY<Cc= zdmACv0@MkjA`+(A>+hT^zFCf#oI&Zz1Bh=amX@J2-phkbE%EqRyi$_LvlZc|-as|w zT|&=BOEUa(muDQ!SRi&bz&$p*c1?zXAh}3fuxb0Y{uVLcAGzYOm58vyr%hWoZ`je7 zf>RtYbtEiti$KxM2TG<XD*@j%?=DXw4Y5_ah4}E*kJ?<#=Q(^5NxvjqNd!NZ@t6O% zzdXzDWb!XydHr*!d)pgT#VJA2rxY&F18u?)ggx5%?w`?&3Fe6Bx&Qi`4Iq<YSYHlr z2`<`h+=$K^vfZ}PPfot;qT8TK+<yJc{L7Q?)KEnPC>QEQCzANK<~cQcywZ%#$`MhP zvps|a$Vi*$o^y1HSYOQFd-Pc4jrg<o-c<q(gE8jDt)F`0zxiJ@_DqW`q`Rml;P%Mo z*ABN4+nx=t+N8V_BC8II3N%R|hEp?_RyRjtDQh}e@Sy>PiAumGxzzPj2gNI01t_9t zB<00`5}27bMz?l2Qxve{iOsm96l9NWzn$CrRL8KbnjYiok2YOQ*!tAa=w;gbOXces zk#WI%9N&MAfaAe8PALdKj~4mM2uu|VbXNu3Cp3r^RW{uAt4J{}Gy5L$F7%uEvF_eo z`R<LYsAT#cSGY}M^&?Y|PJ7iS_a_7xrmo-BL%*#yFmU99Opwwmk{NS<vC;Y{0wARx zlax~MjYC|>O(e|&VHS9=*f*7xKVOy^YHx+V{m;C!t9GL6eSc)jiZazz>!e1U5M~AZ zT?|bGF~*JBHdo);?bkK(Rm52pNdUo5Q+gVlJG5mNg&=Sgi+{N`9T6|Sf5ZE{hpl5e ziR~{?_L1{^-CaXVf_24vGPoA#8J&QnzFgr&qq>8@;$w&Vul|N|LGf>WG<?uR8fDh> z)P+P07fM>c4_;M<%7^tRQ*B|e!Tzruu3MpJVa{{Y9(L4V)#}yTd2+<_KJvn*TBy8! zW;uK0*&^3WT7rRkMzLtWdWk^z0Gc6_y>vm9{jE#IO?k+<Y~F9Ez1>Uc+7QSnYBWiw zH2NRe8_yQ-Tegb)*aJ7reDwVbvnCp{19qQ42h7$-hx60_QtYu$*LBNWdbwU4W}iZC z_6V;MH4G;XVjL>Hk~UZ1&msV$(*JpKtmwt6st27$-nL{AXU#?Nd`>-n#2d=E5jv9l z&#tjJw>k;b!zC&&FBNHf3JWzoqZ{!`(cbZ}j5t>jjto4UJ;}aSa_5nISA!o(u2Anq zSGJGqiq2pymj!cUwZ<;bWt>Q`$gxPn3bc8^jD*iEY21+fXjGt&js8s9^zb>W2nCIO z?2`E(Y3B(){`NctqbrAfW<Uw0;B3FiB#Mt6c-U1vbP&T0ZG3F&r*c6Ag3*Qo+jR@` zNz8BMcXykd=L3U!xD9^0bM}T5)Wjnf9d`^6lc^9a_6cbEi66^~agW%lGWNy}1Q>|8 zzjU0r-Pw8A<kkQFIBpd8N5oHp7WqiLlG}oD+q}L1m9CUU>Fx<Rj89~1#XeuIxe$lj zEBi{{C1spd{umq+8?<739g&^BZ0X88u*l-y`aAPzAV^!=rz5#R&}o|b3cQB*gcBbL zr>zpO0AJ-acHTFksg1l**jcAKyZ6*(hw#2T_Z~=iaHD8vHElHPx1YRO)jOmcA1{u( zHdjllr|`+|g_wOTq?a~$^axRjYBGa=e)+P7WoIHPV2{xHTJD3t)D;X5!zgSjnFpGq zb{y~9x<k&6{^!v0e|oiIekl4~X38+|iR0f@q4iH(w))z--`tz?j~^#3(>m{Y#ovO- z27T|5O^x}J`zzwVXFz0n-o1NQEuQypHZjIzuD}7Cwb_^VUwi1$CHoJ?Ujk4+L2w^` z=S2PRF+XD68<qX=E*_!E*iJLSv~e2@9P^z0noh@(uFBP4-VB8Y77Wef^9q__NKrav zs#R@jh)3s<%&WL`*)p~kHT`pUYS>Tw@B|a3a3#tJ{y=rxbA&Y*A3yBdDn!`{&SSWJ zup#9!C+~XYkzOb{_ApnCJ~lSA9@3z&bDZ*aR*X;XJI4<YEmx9Q@dviEoWj|J<m3@1 z5r!+mAJNng7Vhy0R1T_FpC(`}eD1ruM)-rW{NL`sx|U4n@MXmjtXvqdJh_sl;CRta zoGXWa{`45$Z}+vxT1nAul*>!pg=3CTykZ$VLd17&C2SBMdNPrfEFYXzWoj_Mi8unj z>}kU@#!9s3bVW-IVm|G`=Ye954~oD1=eO7Q*t;$Zvd9BpO+Sigd>_z<{av5RBac-Y zpmEd^IHIe%xj61PF?xR0ZHhk!Ekp}PEze~w<edpz+5Qh=1Y!71W6uOVOOpTveP*gc zZ)1{H*A&J~)E3mli;Ru`oxitn->NbwzRow6e$mWRp^!;oeO1H(-6V3q-`l*?D;mT* zegNO2_TH!=TRe)>N9k<QKw;_)!Gg#BX`gs=O`o3=b!IlZ{7U1PoV(+#&)SN82j1$4 zEm&}R#T3<5g{9UmpT2xiY3Xo($QsW6^ogKT=cgeOM87k1;NhL5-k;;Je5E=)7ck}` zd5agK2NKS5Rw&wkTdO2BmC@l4zj=<TqI-AE9(`|((iT3d>`ltI>g?4r*+c8}Q9NdE zCg?pFyt?e>=oR?E-7X|uYPn~@8tngg>Fix#zA4$J<k|c%WNltXGJ=X{<782t|Cp@! z2*wLWIl8Qzbgw3&toc3+oYmhndUtW&GJe-4u00l%U-KgQTmraI%J15@HC9T`NlDCK z{5(9<9_d^T#IJlxxPB%EE{@xb9TIE(3wEwJb_K72YWS=wQ`eFFdhhCu<YZHhGhbI% zoa3IpTyM;g&f6@|5jW(LbbWY3#1DyWv{4`mmt3d`I(8)*#hDXM{3n6*QpjP>6#7d6 z{<e$uIp8E1gF<CX>ITgjk-?1ZQix$EyjW|=@?efzrp-SrRK$YfZ$dmFZ+Ca>f_=%< zpIH}`Rvh_|9iA5$uY{A*L$DC7bZeg<H@LqOFu~a!a_vn|v~duO5^4(ohV&vYHsrmI zi&sjc__Fo!`Fn6kV8YOlrQLiCs|^iF{ngSjokTtTq0aZCu3R5KS5=v<q9thjBvA0# z2<m{tJydADSZ+Hs=4Zv=etDy8qGJ$3#NuyuK>G#>Z*OMJp(HIP+~(+>ZY@pd;2m4N z2GNECu|;m`V<VS8YGz6obvQ+7Af+^oYSP-vB;X3OnCWeBtz!gW{KEugNAbCZlcBtg z^vij4Vz`T_A002)?p3Tx_ANLk0X=ZV#bIkNpE|lt-W#5n)rPe!J_WhOMMbB<in`(Q zP@V5`?7&{tlLboqbIjSzMga{yigwi*>0s4Ur#JShGHp5Eo-Z8YuQ==9Vga3F`8{5! zZjykOA8K6TjX<kt$vq@OSaKs!V)=U6*-i6dZTj`oC)*#ClVvPRkccmP=yrx8g>aUA zjA3U)t~|ChVer@n$GwlYcjzoQ_Z>&_0+4!x-&zvc1HR2}&mP0iu9@LVLC?8}b9VJc z(NjmEse`T~jL>d$RIft*JW&3~#1Zej;1TpLtM(0?AO5PT=gU@|NtYE)J4Y-?DRb%m z@N&+=%sj=2!ODew6vqs=zZUYq;-JV`N3rkMXEj>bhZhVuX<)j^;@k7j&sN7YH%C3! zN!{?A)Jo&apZ+EoH<*O}UD)34nYOXlaqE`q1c%FPv$X2keSANo=$gMe{KKXN=N#BJ zw?2DjK%~h)&0ROr+#H((8s;hGwa^Ezu5_C_>G=0&+MOl3zj~5J^v`;KK|lOM1#w7c z>DM9JUrkF(L-#W7N<|A0qB~nyc=8hH2pByFU=vL#U%{3lk}<XxR@5p$JhAvh=0VNL z(9+PbPgDwel^%z!T}4I3&*643x1*(WV<-)HNc|m_0^`c$oitlLT%DY*KXQ8W0NGlx z_OFi#s3?85tQ+Yx)(wu#kd@(5uQT1!VkB?bRm?z!yshHuRywZ%s_&<yCQtSBX&m*= zJ}@AFxRYe+*wKOtzz=5)5+@3JM(5@s7GrdO6~&_L+1S`_$FUm|ls?%}-0kk&<4*JQ z*Ujmww%|)Rooia&JM~Y_cmEApTECI!k4(89PY(B}0!uMHBUn;jCgeMfGB)0dpv;$T zenvkl;OmLWwomQVav+JWR4(jUFL|h<^O?%rfNlS3npzY&+#VDZ-+4mer-I)Nfh>cL zd^XT?WkU8}ce`^%2<sP6ho2f6(**vq=>!TE5fz@`{+O9u@5~qTU!xy>6BA+o*G3!9 z7$~;Z<;amsoo1ae{&Zs}e@aTY!dBXhG<*m1?whrPsF-df^;b&In5i4%q%Z#}=x<Ld z^SDrMTe<S$Foe8rCl&5q7@T8lyqj6GFR{tr9n+JbN#knpxpiB`zp8!Toae7vx)vK7 z|FZ}MP)O*K334wSZ(*E7(V&|Z+w_nB8TKLb@L2Lt{YMYDZFZDaSw)5039HH*f_On6 zHpP&w@0HtT$cp#h!#LqKiqMOAHIcd)`OAZ(G9Ycih6%+1itnF$=vvTu&GMJe7SG+F zB(+pJ0Kd(5vW;%`3^A<P!Jn?BuD+c6X~j?P9)gO>sh?Th7Dmq1JG!)7Ra)Fs=Hw{B z{*GYtkLurKCB@^FY};hsL$~_EG;v;@%49y6=y)Xnt!dmgBmFGzZrPuz6x7buGKa(y zVbJ$H>DpuK;GxMB$MEkY2zPm-!TqyJ!)v#>Ge!LjlxI1SiOo6CSFml>KW}gznNn_g zgDnSN`k#3kK2h7w$bp}X?a<KHQdRAoJnviQ+zF6GpMcTOF*?<QKsrqD!|Qf+76bWO zG($C$Fr0?47B)^Pe=|1!GV?$i73qiJ3j0VDO=XaId#slCrcvFHT~|+xS;{gcQeKQS zujctfs(Q-$=1@<*`pYh-zWcr-@iPt?rd^0=%t6)Oe*^O1O?}4}yp6RNFJ5e6frPpA zr_e&%ey?Q)*|j}q9l!Ptd`lI%ZSA*O>)lCb2fai!k3PHeW#BLIm+u_M3fAycpxW?k z%stSzOhNzFuiwA58Oe>AVRrxZfb-yE=w$L<eN#O(c1XUA-?gHhFjo@)qgxoPc`UEH z)%Ewec%>mWzhg0p9_TyZ=7B$`K%XKssx8gCyAdIMG)F8upTi8ztLi(hP_b`?C%p}X zAlWJ4gw$C61<D^uHBcPR9=ptRt2Rx$@w{SpFFWtahHrm$wIsg^+i5a#=KU}JF;NTV z%$dkj(_cS4w%?bhWIJ%*{S(tPbNbAgzrTO3DLfJ{eM;ddLclc9FNM~sznuN$j|ui8 z$lXIg^LOj4&vk=umK-@QQ?}XI*m3Obfo~@ie-pk{b>sD&7ezDx1GZ-Wo|oRbuB!j0 z8If`<%*#mP-WZnj_aLE@(XtjPBf|2haA5BCD@Mh@gX~#Zq|wG!#~v9_VsX=$UDAz} z?BI`qRb|$_BBCL^!18II*L-u!HbvAB`R>aw6VAzL-v4oOa<Q0(wPKo>#a+yMs(RLI zcGSOeqeo8>IWs}*;mP8reVx~mlNSUxxJl$9rsmxG0m#mjZ00H93abGBb|D)TQgBi< zV}4E?n_s?XfgmqSdnJOmS;oeJ&vt&hdhTvq=eog505hZKEwE5=7xOR4%b7bmO<v5i ziy6ZbL4SehwX!lw3IDuz%lW0O^uwc<CR`7zzcW!mf2v^rz_(3;fa}8_|I{IRowyDG zF$eqgjLdYyEt#Q3F}pVmSGaQJiuIVc5+n&}zjU~5{@MAiL#?2nV33fbitWd@$z{P= zm^I_*;P2lOiCO6O{PIQTn)@O%l$Gs=iFS;JF={>L{K(IX%Wg&#R2v&-6grK)m^_t1 zY+C-pK8u8mV+V&sWR^0#-Ael5vmy&kD7fbvNv%X!hP*ht+97k*L=9Jl-%TM)CqnJ- z^;alpKd$f-hQMtAwd3a2ob_^%(({<9XGB`BS8vgPx1|Zoy81fq+n3SoeAnznMMbw& zX#M^>*RDD8i`7&v6pRas&&9PFWng<?LU2}J$4dy-xxz{<Zd7gn{FcKW2X8xnm${U6 z{J8k6MJI`m*t$-tLC!NMMNHrZTzPr;ALqC=((p{lkX~+c<Dj>e#PpBL&Q7#FFjb&h znI?NFUgw#^(;H_nqTRKeeR+=`Hn&|v#x1z8M#>m{Uy?_RFefLIQf5wedit=m4Jm#7 z<!_4li+O3plyQTx%iW}X{bW){{NQVmNgcke+CrO~X7?KeAqSY(lT~Ay8bE6?*I!;E zZq0Ir(<?*6!iL8ynWB`7nv9+2;o-&GEWN$GSDgG8)EgbWkoE8ASh7h;s?+{B4<0m~ z_I?K+RD<m^pEIM!{HsBX`rbx^c_V}8Qb4464LH9{@=zhS_3y0JNhe<o$>r6|Zn>Jd z9$wh|&>NjYa>GRK00{dG1yr<Sp~uvl5swlYLi_g-L80>QYUXFSkiyQ)b?RwP-PutJ z*rY>fT0EI<Jcd^3#4X~(%!`=GZpebS)?U6}1uW-K!Df~O984!Qisjy`KX<Lz>c$8{ zYT#isncL=GKHvEHf{o15gjvu(caR1MQsgjiu`_`r7$#^iLPm=R%oDf+-dlfcX+7w; zQ`K!7EKOqesLI?r>t01R40iS*!*wLJZd7_B7}{#KX_LD-H?6jgWC~MGY7?W~v%YtA z)!<d!V`VbZUtYmF`g5O4wB9{jg>rIoy&;dco2W(^xDhFl%=D2!1G!wD-%(g#9;0cx zRMwme8jR(fGi~&A&+*?dQ|9{a^tT;9I45t8?_fQnB!)YC`yYJQFQzGSdAN5{rF}NS zn(J6cj@CXKKgdFS;q+@fg<}Rte$L2MpuFE`JXg8!YYt1}Hj-?wQfm>a<p`J6?tq7? z+CO?mcU+o>(KM1X;rT5FX*WCu4N;xrl>S(%FrwEBS~*jMw^`x?iy!j^h6$z8Y!kEV z>O1)TWZ%4gt^VoTPjIje+QgO%a)$~AEDu+vj}IHUlIu-HL*p4O+>qQ3{1;ObN`HJc zyAb=T&lJ|B;;1P0&|0n%u&i0$R+W*$Kd&q>mC~D!aP~-Dh!p4dNYQuY2r<;8#nV++ zwfwDH97nm&^;V*Cw&?x?i;pbu|9h7gxKZR9OrH%b38@--EC~bnUYlEPts<>>WrH0R z+3<^Nk22F6vHRd=l9Xxv(HWm(ju>_N^y%A=w_iU%6<=VlmS?Zl5|yP{kbJ7RX_Vj( z+t@!6X%!3iR`0%@)d9_@B;e@BpQDti6L%yhZxFm>o@E-h=Jm#@r?F~ODeAxA0Hh&S znLT?gDk8ZC_0Q!PREg~MRXJI(o_UUO*@N!&b}ZC;+b0a(H9DYj9eN<J$EpN2GwZ`# zJloGIt>SEd$-Wku-apgbyu8ldnZNcr0a3&yl#Xp&3zJd{3PdgaS+3=5#0PAl>k4j2 zZ)d|WYgUJ{j-+?7qgC^}b@qbSL=F)AOvsN<538_)WLprIA>P&9J%A@}wzRm+o~LE* z<-RA9L~t_iT7#P!h7-+<k8J6;1^*T8T-Wi_8+7OMw#pm3df9}ce@mjW>#)s8hCCZk z(XyMUmx#pX`_*masI?~8R8iWfXlsWhEDP&dE_rBUjdS62ri7m7)VeXw_Zr9OYYNw& zcka0R8piu{vV<Z#a{1WYtk<K}V`q#Eo+uc|;C3BF&YlC@<AW4WPQlO~;OQ~7UG&RI z%n6$OzhAaDUM`_RuFr(MgjnK@XG<!6n#bfB{=WHk*x8~)7J#PmlJ0H%CpkNAS8H#% zyna3Fh4abDeKD~)+#aK#Z|i$(z`}r}PzC)Qp630Ri+0*g3rfGFv;sg}B@zwzJ1r~z zC01P1`*6IHp5!6h1?PI2cnbu2Mj7yG+lioznLaYO0-L-_zSBg(D}f99Woxh<yJ0x6 zG0z*N!1xsuueabo;=1|E_wC<b+f$+|5%Q$oY3u?QF(MLQ)_C~KFABe~lHK^e-k!fV z1m8RT_Tgcr58e=Gn);OC(*tYO&!3HJox&B8MhDEVs`vgkLcvDY=v2jwnKLC;uUcib z?($2bx+eRb%e6)uPaNXk{wnI~uMsnP6TOKL#3#16TUHQT_SItUF(-zbh3WIw8-t9C zRuj!x6#l^_Z9CYSYphW>d+A8EzgPdfnVAKZnjy`2H*${+EkA8PzF{^y`0!#?K?;bQ zcqNl?g~3vKA(RSgI+8WZ71kms9xJ#@F1Dx7`u={T>{fVfGT*;r$H7MRt298d=gyot z&irD9)Z;dmQ@a>pAkn*}A8wzn+yeV)9b_cdcWg$b=qojZyUAbPT8yL5c4S>%t}wei zGfNMxoxy-UBHTbj{2-cH#gc&4p;2t(vuW^jL^k%Bu5G`v<CWHl=Up?MI-)Qg(X7nw zGPKF(6bjZd{`}>g9UB1~8P4u?sudrt*i5P~feRntCiSr+!A>DDTtKIv$;Zw>Xq&1G zSscih-U~_HC-|ym#*OQ`rtB3wQjTGe(dG4I)=(F-=(>XU$c=>4^~OH<J_jP`z~Ewl zEJE-WG+DsZyGipLW!Fee0(CJB0t(nkAs6=wdhfn{`zD&E?&Le~#xECmZuMkl#&OUH zHY_pP(*KKHz&5SKE@C^PuP)~+k(QMWNZbww(n~tv=UhKM!Q#v77Yy`6Y%rcn2wg2I z<7hl$dnu-*Z??1QdeGk8GJYOT04vrNw(VH*#mFE~S3g2aa?W<Nm?%VtpGG$-ui#dB zzz<Sl{Ydlf9s(&RT+7bxIf>R=^LCAE^#Qhtw?Iac@ru(wal~BBTV=rk=LM`HX7CNJ zm9n~2-KG_%^mIQ}z{~AA8LjV72bgj0j9OWCQ}A}m$%0d}&KBvCj|?gjZe~Edk_$2h z#_~fNoae6tx`La>7R^IH!R@;J3&s48*t)!2t`J|>GdFGN%(_Km{L|R5|4h_4NoA0Z z&^EHtK0=@|_-(eV=IheJb=#Qq1bQYXk*jwF=2MdgwTrf2y=&&*W^&t+raa2c72MPq z;f!DbqSv|A1Gq6>mBo=f6f=1NDxuioWsYN;coY>)BIL%($js(m7$Dw1uW!gw-2s|i zi#D21IlW?Z>opIvooZ)IVw&WTnro9ShR3e`gw@?WES|dG><x<vyxeaJ`ccGu`3wzm zs2;bnGef}{2=o-&!5+GUzadL^;B&oL-S&b?jKR@8{I0xR6mV<!{PaMC1E{mPzUi&= z-56#U`E+(asw%Q0m;i``6klzw8-7$2uudjB?lk_hNHk4a#>P&c-^{0q;#R<KZ<o4Z z9lbb@^WXCouJil9Ro64B5c78*mV5qzg?q*W3+dMRWAD<=C&Ob5e_6gk<|N+<9wL%5 zM`6vD4mct5K{e*C;%}1t_|N3}NS?IvxW9gC6dObS)QhFoV|U-K-U#os%>7fCcF&Il z5KgQ3@I>FXotSI_S%HL8OyNEwiTIi+glTOK)BJvB<n~!ZEZ!rnV2ipF13LS;fBaC6 zm{XreK}vAd4|fo`_PN7-r&3TAd=o<`+?z8@$7y<YejKNG(gwzKk7mHO+I2G`$6@@4 zSe?|(rBr`<g%zs<6c}~`jIzzrGMSGDvODf8$boTrZFQL{C&bmhABFD)a0dPldHuBm z7EK;I1m4z8WQ*J2NLrX|sBo7UJb1o!bdPCD`N03u#m^S?r#J+nDtPS_V@9A_)|hCx zNM(diNHC#I!8sUFYW+vlj|BLAgZxY)3+K9{#VtXE|L@b)o-ufvkKo;b1mU7vb$Z%H z0A-uP74{ezk02hU*@alv!9+TgR?ih&L)};0trmbwtEImmb0IR|Mzl%3bO?TZ*XZ7# z{W-+)G@P`WPnM0wHQ(MINgc^mMaMkas^-3@HKsjyong087~y7`Is_liZ!Er>A|9i^ zys5lPKip-3os!gxA3dzdhwuRQ>V<#UBRE9&svTQA=;)I75`_(42TVQvR9=wx;e%xb z-fc|!%zMyt*J~693xt!+>H6W{est8=jTd`=5*BBeEAbt9AgoBZ5C&C=i;LeMm}@5; zFduxcNrcrtjfbl|Mka1je!}EloW24){&3N_gMGL+XWVV$zsufsmZoM%TwI(UhU0z~ zZ9cX8Q3-SHj=TH@6@ymno}UaO>bV$J5UWP3=un3NP(4p2K`VA<NnM?syx0W(!6JlN zZDvDvGlfU?S9Dd+>HGJLiB;W(UE58(5|^Gkc%dOmut}PKl^fXd<!Pv?E#-|_$Zl0h zkhp$o8*er#WY;=0B=p0--rW+4gR2G$1({T>I4Mo7hl=V*e`;x|&LNI?$pjHtcMVTZ zpBsPe$?DN#$G)t&tNDE%Hca(UJM3dUsNEj5-L7*$H9Ul^ApR5}7U5K&6r6KU7A(P^ zx|x(S`kTPUsup9@+k+(}_COEFF0ock^gR74_|C_wz?ou;CyoprO*MlFVhI&z&-$t5 z^eJ*A(EOgHkCSp|YP^y&OQtaJaruJ#@o*|V-_1>7AQ_(6e3`Ij7H;R0#82?wt!7YC zXER3-a_rJ18&-n<R<vXsjdxE|F4PJUWiv(Bn#Qov4%ptsG8<QC=dV^#21^YMKlwzd zC6q4T5t#l9wrZ1@{||wH!GlGH$g%J5)mMkz%Nw$=k=V1zT%Al>Mzfk~d2w-N>-8P^ zH|0#o;6d=#&SzN*mXR4QdD7mO+|DUO-iVeL3+dIGtETqkzjS*BGBd6zPqQAKNm*x@ z^{H#Ao{r=%lZZAk|MN6mbFL)}30j&UsaKk-^31XQ+pjgai?htM4J98Ha}RhC>UyNE zJ*T|BV-sM|OuCuAQhFK7!><rVm+&C{riQgezQ~xPORi;QrJgWNRW5Ya6zL=IwxPBT zU7Apb9xHETu+^AFw6I1@J)z*^s#u_|ZY==YHhpQ!EW1)4mK-~8jOKkfS=bPSgzQ<< zH=olA`Zdea@81_sDNioae2AJ5$kk{@r8ws$^o-t6?<bK&cCyK1oPO%yEnfYTwEX3x znORho6#~&~**5vaa?zjOvJfR%2=^zd`;Dnr*H_zK@^k*^xBq;*-nc=v_0jk5Y7F12 znO4{+p1e!nd&?oS?biAJv(Zp)X#1OHo-<=~$dgskiKF<-9wQWIVp5RaO0iJuvLM7> zEyZKnHR3P1N}CqZ5sFJlwB)tpnb?F{^TuI4qx+M2AaFB0`ugzUVkl+N%<K30%cHL! zrdbkY9MSL){&5o<+uGY%ZM$8lTtciWzmtp{<CkdVvg?M4dzM+2JcN;4Mks`;uEJUL z++Gc$+al6;%0GR95Eiydah-K>jHcPi0v8V_rxPM7$5&i*`Dm(m@<65i6Gn)T(5@bh zf4#<d-=lYqs$Q`jH;L`hkwh+s$%Kpg`#A0W_o-+Hi{}}bDvzwS%~;JFgOPokJGkQf zbBbcy?U)GJf=fj$ItDYxLB{-{*n(n9t(V-c*5mMVIO8d9MbO5eG+F=OJ0%mRoLk*n z4PyN_O6EL)vOt4lW{8p0I8Yq=drj;@dD|#l3&Ff=nWt5>)27wSlp9NmqReB%5_;Im zq~-#nDQ?3fTV^Ctt%C5=l?Z<|)jwv+;x$qi^};V8nyN-%ZE9{Vls23!wLVnVe26+} z(0NBLiQkwP$UzYEx26JOzF0|23dN&!boK{AW}y47jGSTfaZAl96jyO^lFxSTJ=Np^ z?T6J?>h0(ZB(!U#jOAox!s$bqA<m6nuAnu0_Uy%A%*ZL9MkiY3a9cAgq|qs0+vnD< zQDc}8w(w!@zg=MYu%zVp$m2aW0uIIFpSpgv@U}9fjO-uGE|AF_il&?!85vzMadG1b zz?lBjkOy0MM%oyB1+Z^rX{o@eA;%VBq>)s6=;Q4%{IJ_BEEcuTw^hCnvso%R*-T1w zTUJ@~6^1$WBodxVY$ik^=vMV^JB4AFS;-fq+s7-dP!xL@XXC>mWz%|Q;eWCN58fYr zSV!{FV-_)!uvKR)jys>A!blhr<J^s3o4JY4@at+5{T9~e?VdMxuIFr0hLie9w>;+5 zRf14@gA$u*N#+C1#yF5yVEOeR<B^T5D6uU1p2#EZjOy&Y(CN^;(maS25IYw0!t)L* z!yi#;tZ32g?(QDMka2vtLT_^5;^lZT$Lqhi5VtR()EdQfSl1dcU4C3rs2bpE9exr< zbjb>q&dy_ZZ8bOd9XjwG))UV^@c~oh^}kYFIk+x3morq)$ZgqK14ZtKtc+{Bie-`V zX--%(DAmZ=IDaaCF9cz90S1b&5L3K%AjDu`-g(?>@Znh+8h@JNmCU?4OP3kedNiH8 z2{E)QTX)=HFz9hGGWxx>XusP#(@2_)`AW02NRzEweXtTHcqtv52?7Fo@CzS6Rhsty zFs977QWu(>%znIq6YQS8(cZg#7TyU)3v8jH)L9}uB{~uJrN^2Gt1a2yCVgv=`JW^@ zN>p&NpmTS)0%Mfsi848L%`O|*2I0M!o@LN)@L@l+DRNVS-nYg{E*Hees(kj8IIO}0 z`~2L(+Yqn~&c551wly;%t=#qza6+~{Sf}@d96R=AT2TCnZD%O>Z&tUh<X|Mrm<78q zgULiyf*Fi1c@K=G$$Nk$Kt|B=@Ffg~;g7pQc+mj$!6-Qu$y?InFk7u8W}H+G#27k` zO-hNmIi8?#d9n9;O5&mQI3tyL3i#hGlI$#IN2zYN#hBpS|6m+&g94=e=v#|--XMm) z)6GcQ11u8-uWs~Z2C)ZR?{4AM_dMf4b}gC!Q60gmvM_-oKXN`9%Xl<zi&$f*d(meh zV=MWf_pJ1O6gsL4RqKfGJkKZ;pt+tNuHdoKaG^x2#ZcT*`~;m_o}YDpm69JOr(N6Z za)&ArvY*+LNf@tyFv%`gJXtn2Kb6&d|J)nOUaxlED7TJw{XVrd3$r0QT2L#Is69VA zs&lJ_7%1+|Yv~$N^Q`Q1k*wAQkz7<g_iG$_2m7%^IJWNOAdbwiQtN-e{{9>3sW|OY zauu7Ef4B^Qv)|_9+-`3#PE-*Q4x{<0%NXWe$9h*vXxCivytjB;DZ`1#I7IWOT<CdW z=Yn&!q&>SX1WGC~sFWR55>M;mpm+;w>;G!^rrt6(9`TR=ntnR+_s#a`hhG?c@PVTs zR{|E81AoKlw;pDD4l<cNN>#AU&aP!1@|0KGuRB&1*)amq@SEIE$AV#Y9Q}d7f+DI# zHY~|xMx+}hPqJyMsn>w{0u6MMxhe(>+eD8o-GMB6E5cm4kL~Tte0_6b1Z)ccG14Ca zJk!_gZ}hv?>vc%b1B<spy?lzA^hAB<qxE;({{G0<uGLmmJ%q|iQZx>BJbE8HU4u{P zwk1$Dsmg@JQgvXyF<c%lO2!czGlu8?mNnbUhzDdpc<^AjOfl+B3#Q#4FYmf4LM+>T ziW8;a$Ii<#OtYS;Jj(_O_UVi2w#mAtD|hCBqyhf7_DZ=elU1RcrJ4M3S-|Yn;WIl? zGckX|qtTXoFgf`n^)Vde{px}rf4+SA0@dQz?E!M$j@p9ETRT0MROU+um`v7R%LSFT z@9vg)q*s|jq;}dcb;L{CxkMWy9#3de|2t7f@-wldq2P=M2Xxn<Ni(E$ub%`&E72pS z_ced?Mg}g+8L5*SH8QgBvGs{-RV%|4#`X5e6_qzAbCJ%y2gx3YRSNgxZxmK$Op{;8 z_}^Pr?XymOtOJIpCI$U_7b6ROrcl+W+$67gT$aCb#qYb-|M=gL3RyZz<PAF~HE_9u za=-BAnnhUUu~|2!FGA?J0tvyY@DG1F>ho98MXH}Guq2lF?kp9Rx4^kBx@Ml6DE58` zNTZmhb7<uCj9!lFb09a5({9F%$}Lky1|KVKx`BX<-^gr)=r+(3P`GTSCN3&YW!XAw ziP5Pc`v(Q)Z89~bXk-pRkXnEcC2jpOnBhB-36~{&=gJKcG(mTs9VJd^a@^=j!Jl0* z`ZGI}(TBVe)lpwscGHg01lLQ3#t1rW<cV8)E77dx4iT4FGV`sHq*&`S0nTc!@8_}F zX&Yx`eOxrrFJC4kfPC0&M(^v%V-{Q@bn&wBlB`vKP)O=gC&lO2-@S#<la0EAi0kou znd-%5l~88JP)y1c%P>G$LJvf3{N4T4uPOF7Dog53Zd0xd0BMzR{koIX!r6J&X~Q1I z=?1zS)(cD0lnTo?>~ydCC$cc(;kQ2pXFaN-pDsyp;bcl=%4La{C_KM@$`En!_53L_ zyBvnQ^*^XHtuVd#n?~%B{Q6VL$-2qO&w*UP`1**Sg`3rOTLs=AkGFW}^%>%jviWM= z86o7fp~0%ty%CDvfkh;%%LFhXGQ?Eq^NV)0m*&jZ%EiUyvzvQkBPGzI(5eB{&7*Uj z1WRcpqKg`L2+ZWYl$vA>Yu-DmXA5N>c%Ygb9+vc3xHHOe!ihTx)on6@KYayBg$=fh z?#!1Zl-4DdHMa?8vm0Clz3BM!R9EHbhF{1*t33;aWvg10!DPMy&n$f~bn=++@yR0Y zE>YV#c!AiWy@zKDp0akIGi%m?%F4=TPoF*wBmwmQkF;Bg>QGTkKeBhXtgg67)O8>c z+lU4?Vr862pPuFYhOKg@)xigA5|wPl{c6)owIXZd!qAJoVi>a6xO`h$MP{s3r7nY; zrAF&Fw`?RFxJC0f3OJk!NJ@mHxpHgO{Z5}=US39uOOEZkM$_O~Q3f*<haH{1%5>#t zN%?(`{MixFE1L`L5t(i?rSwK4zskgna;4PTd+Wk0?lH?qSJV&he%<Cu98`O8gL5pu zy@{6l7x`y9=kUuzG!fNVG&|~0aZ}$_W#&-S;x;J<K<PPC)R@N7J&Mx~>bzZ4d0S1U z+b-5-w0*!CP3MO$)D8bIO2BiOSYp>=FY<P-rO21~*SfAy0Hz1UdpEudl-vIlXRk1p zf^nBHB@tYVYT2$X#1}tYuWx#(5bj1f<?9KkYhHti1*iK_E+;zzajm1Z)}(Ierql^g zC|D&36ue1Iww)DQ9BE~8m1T*;jmi(6c2*L89RQy99+DSJPzu_HN*I`Q8O_Rfa-^3^ zE_uu?SCGENLG3I@=4Z4?g5qzHUw{62!nj3c;lg0THSWQ_G2453Ww>aO<;8*~!u?$5 zEV{V%0T6t&&;&RJ1O&js7#fz}H5XkXj9eGd-$YJy6_I_QX((7IrzJoRWe-v26Th4< zV$3=f@iNeIsy(ATrh29rOX;=Em+NyaCo(BMXH-XZUC#!V_kjxfP<LdGEuBbrrY0To z<gw-KpEc~;HlmL4p{P+OG<AZXRfJWwzx*3`ixZ;{-CTRwf{J-voZ$8NKPMKNWGwL7 zlDWcmM0r(Jw8P4}*RM-Fcf`h=J^Q<avdM4Ua^soj|J;mMqPlJ5`RU6EM)904@+Z5% zGJbZHLF@*7tJ$M5Ln3Y7FiHO@8b!K-ecYg3HDedWjU#-0@B@oAbJC^@er!=Z`O`)1 z?A*cP;{W2ae#WES&b3s{hUfjapM40TXzKDbhLL70dB|=0^yzaY#;WJis&mbHrVY-0 z%--x1p1pBszbZz^M>{k9deH0wG7{pV@v_~^5{#ha?EzV}67<m0_Wp;*=>@#BSKIZX zxzk&D<P8RCTgRx6qS%pbX>T`YOD+<w(EVL0Lf|^#BbEN1R~3Y0*&LXMlgD$*&Y4B6 z!)fW-As9E}@tvot`sjOSRXYRNWty^v%ZyH;@n-e(sn~LMDfTqKh-VjVnqz%?Jn*Au zXKOKoY^}*0C6h6mBynToN87LS=C8Q8M(IEJPId|`vPtMVlwXgZ$QepVscKt;dguwO z(K+z_oqGRv_s!jKcZ(JkkJ-hd-OL)T=mfY?h7xc@H3pwkPa-F=OHn^vI%H|@J}avR zHVa|MloFwi0cE@;BF%&J@xTEQ4A3F6mwU$mLoPH+b7M@Y?M)R>qMCIFrX9IWe<!B? z;*B<^Wf0C2bBcE6VI|=G{M<)t-=~-ChAR+ex3^OpkgBrb=hk|UY)F7t3LCatM?YcK zXC3`Ydgd+#{RM+9mPkF$+?+acp|-X}VBUev4tM*_%la(%vQOX>va~O!oWvUbCRX?2 z{E3@&b#+I9@H<+Ym;jBTCCeZnbN}}nu}=5{(@r;eXq_xjZ2`0m5>Zm@%^&5z{c|G) z-oE(cZ1{E2ROQKG3z*ES<;WnA9LD<mFd-@<Ir&qYiU6x|6dAGl3d2A^v+pqN@Fxq1 zc!=)bp!*K+!N3i@lA4Mor-0r33)DkTcn}|0s9ehp71_-;_a7?A$JVMndWJhgMwz*9 zD{F9`+udHLE%Np+w(B+2qXg<bX>-j?e73psr}vcDVz>PIFzsx%*%@WcqD%&uQC@dz zH$xKIV-2^yzn@#5FKJh<oG)ws7#m15WXlysz}vQoEDIf5dcd#hZ4Im7qxMzTHr4l= z66DVp$tvnG`#*x!@caJ`q>wVgeSksWE!hwbIe%Txy@QQ+{pL;4w2I&z`JoUy`6xg6 z^y&r<X|A2PR#FsKAmn65El|kDC>QdUerH})H{jYrfGaTTKvDKtloPMyqj>W2<>{gc zrAJ8ny?^90(?e|JXyE34Db0W{KZ<dX#<luI<-aPjrs^3MOdT04_rm`Thyf>`HB$<| z!hL+k7|7xJrXF1q*D(Q`L|mpjKgTsuAk6PeFk=09=|x>#Z#lin_}kS!P^Ke+l4zlW zg{l$w{pC4rU$Y$#UNXK}fp=nR(Cjz%YGEtGPXT5jA>L_bo{HP|P0LER%$TPud5GtT zjE&1&m`s-UaI0*5rG_IVb-)L~nM9>ek^;@X<#>F#i%Y}~<_5brZe+y7hE|ZLB0>M8 z`}$pxZiE#P_JWUn{bCBPESNj@^yARhSJQ&t*Wj>}nXLbHih##+<$%|B7k_vE#Ez!Q zQG)q7!*fK}CJ|eCU$jm6S4)lhN2U{$npc=cD@Pk7&Jlpb@w6lJbzj^X_lc{@ZZjJn z!0|c8K(Vav*!%}g-`-J#3*Q4YL@@Fpv=d+Eax|uKDFYyxg-=P~o_~|sd@0JVYv{}m zsmYzNih5I9``K}9MZfcPV-Y+L5YSR*V9`ofJoyju>ET%K#RBsV3IohW4ea;huaGEW z`?FkdKH&~FXOUd_!gRvnXW7h=;L8$3;2@mCfQWtjg3Y^7H!;)PwinvYC3bDF&YeD% zjPLC3-puWl=k#V=y7FYf8#Wj{(C&VZ8xnZ+S4kg#0ZZpAxD#sAMy#&#g&B~<p|g{X z>n(H{H;)YtS1?kN!brc1XU?1yr-qHllU@vKyP0v)KylRGyKf?yh7Yg$hUzN&r`_Yq z6BC!QMgA{F%jee|&Z`yy`3%bia}@L)P^-CRwOY;ex;I&`5mb@?vM||l$BF+nIDc%I zbzdsCm}A{w+O%n2NOyA7R8$-nMOa-*Ua+)GHLjt@)?Gpn{j1#zWm9i3+*F9zU6(33 z0?wVjIKr4X%)%QVCnb~)7&2D9_1n+%)D3nE0RUQAU7Vu-!kZm2J5o2ZdoD0{jG|*> z&4ZUrcwbUdA|*gwSKM`EKo8?8G5;^~lgjQEIc<4qp|Ztf%a%9j7NOLzxO`=*b!kHi zk~m|*=K)`a3%>dI_!ONDE_A+ojP@H04|;;J3th#duZ($pbYl67k2fP-Q%YW?MC@7% zoC$&J{`x0_AKR-9Fi>1qZ8;lj#}kI0zDpz@L6jLphsXeeFKP!S5OipmbPjwsz&m~} zM^x}3+vj)ZrAM;g#>6X4h%CGgcj`K6hoLW|J3yN9PkXWSyY($|*jW(iN`!40&$(s& zd4-PTNIIRpD0vn*fA}vAuU%qA%RZb~nGrwg9o1RC-dyp~bL!~@99Uf|{`_nbo@V#7 z=F5iR-;PDY!MA^YmsB&aLN+Ju>qn0srGY5GFmVwRYFd5A4^2TWb{pR?E0aPr9!$l5 zM>4kf!Vv368>C#0FPkiPQkZ5SGF$fFIq~w}eGlZW$gEjyoqPnbX%ema-mIA`5T+G_ zcrK&YnSl;@E&F)Ve){>#&p<1Z_$siU1t}Me!V!u7u+VV}g((c1loKD^77n@yfJ)r& z2&L4#S+A>7<j-Evmn3iO?jBioM_w$nw%lQ0E_-%UZjk!{&RQ-XOY8*qop>njWoKvS ziGH4PgIrp=F9rQR#otQ$RPnZEJ^ZGTnV#-!ZE1NyR!o$cN~q88?+2_ZQ3Tc-a;~{i zHe%KcsQUQP`au01U!u0mne^f;YGX5x2dvsOZ7+U?*jM69A%z`SB!I`w<%Np}4g7-` zO)u8|owmmn3c5BatEs7~URVk9agGPn2U0qVi;9bzSS@!(+`g}ua%($6W*=M!yMrHx zPZHY>l%Q7NxSKzn3-SNdwk%Kcty}wD)0Jkv?<&~Cz^NoAr#AjzywY$%@=tFq<{t|M zC8!ej>qtiY<Nw3p?v@^V@>O2FiU2lsxU|%W_Vp7H*)O1Dxr^mikdjuI?&%i}r;BWF z*)D*vvq*v_(}VNT=j|?D=A63rsZs-V;Iyp0EQ$c2Z;q!_aXZzKNQBj%Su!CE-ywsd z96%<x<J{_9%d58t)8`nv@5T$Rxi9$R;R~BnH-JmehCt~f`r65x8+DP<sj&HDL$Mjp z$@``Oi~`)tKe=w6?t!tG&B(9F$-aO8O2QQ{ujOAVcg3#yE@cx&7B>axDBc4pJ)N^U zG%5JA=P-t9;1g}@aOWv^tbY<>uOXZN@S*=xm19-)lSrfkl7t`lA@aXDQ;?|$J@496 z^@mX|NgrL}ETy+fMSR_8#@i7Q5!o~w5luh0?e0+snt;Hs2JZ~FFa)2i;R^jYu&!`w z&kP6*Jk5YdBTwZj0U1=Y&B+-tGB$M=S4P$nnI17we{E~S+9nbEH=W{fH4Y%AEgT&s zxkT*M4l3w(el;*VHJN`dG2x!qq8wMEI9=7wj$`O%PmUJ1#5|nB2eY!i8z(2rLd&Le z<^{pyV(7u-t@M;P;*M9tB}M$!cn!W!#t8+IqdL!{6AUY#w_h@6-wKrV6pL3vmUar% z)D91i`Lw`C>Fl`ctWR65lsvQ!=TW0;W*WxU0UI}LP%0`}uOy|ygbQToHuf(}HP6we zUzHc5*#FyZxdj0CjL4L#gSXCY-MTdd>LMsXA;|tJ;=FRwNw2dlt;PAH<=Lq;?C266 zE{*iNcMJOWIgsgTJ{IBnb!OQNwJEWwwefLF=Q|1UqM4?tiUSWnywTw7;bLuVy)kve z9Lkt9y4papuj)DOelAz|I-7OSt+Hl~@|Fh!k&=xQ6BT9TKUbi*`y>C22P(&A4Df1< z+Qp89@z#ET4`#@@d~-34p#FJ1Yr(B2bbxwBunMElX=W1R)`5Vu&$Y6LT)u#dekmp; zC-+p=ylJd_{n`)pO5QsHu<spvw*9*Gg9&G%qnQZR30chdOr9VNon&n6`!K!LN1z=2 z=XCrfIYzub=y4Kv|KP9=X=rFzCmh$JCjup`nRQ-<JH5}Mo$l`L*=*g-(!6k6nT6J` zNhzmXGaZ|6%m+SZf|&ntE0c^)=c5^|{=9mX2uwZiIqso-WsJ5vvd}7T$czbZQp9sE zB!6<eQF$NL$r&cQG2`O8I_HkkxVCPzUE7H1D!ZU^?itNgwf4;$d!n>d3e%Bb-9=s= z$yg3YSbZupqtmt-195t2#TJvseTegQqp2_h&FRmNjx?(qmA6@!YASwdj8u!n=at4+ z{`Z37&62gZkwG=SSh~kO2xaJI6O$9{P&KKq_>(_wyNs2M5bEqi)-E}y^5(Eu3t|3j zVKTD7a&2$S;QoD+%clYn?Vm)9%N^$iVd6pTb>%UP?F_~I&rrQpvv}$&$nN|02d{4u z;tY~Gh}nwq{4|AbBebGr70&G;T|L<@C}qybi<$FwV1z6?{_Zrd<;v*9UF;84_@y*& zdz8I%Y@MJ#JLBff^$9i$Kzqz@L&Q=Y?X)h5DUnuZS65u6{bEVc58ph5g#gZu86Yy) zfN8xvc_K$;)-0!+8xQnaQ|i-dT*|Ni8HrA5NLW}{PC<Q#G&?q(h=yGNGEd7N$y=J> zv~&M{S<Zek+_=**j@U)A4a5CJkbLMszrUR6zZz4zK4pB!^voI(u#J{x-^Oc-`XfX| zkh@Ed8KWC^<oGTVHDvnhAb@N*_&}0rEt74}OvAqS$%LdOM0dG`iY7mF+(EK&PX+vP z^u!g-;$uBN^?g$k6+JeanZ43Kury)l(gY(pWuYgC7LH0Y`cw-7t9y}exvVk9<CP0W zg7cSo+`d-JG)O>j9EB7V&#xQW7yRZ}Lp7J-WpA&1rf4VPwl1BhSBcz3`2JE}msXi$ ztUG{iV4993KOlnUI^TkoX6Xh-FPCMET$f?G^}1;)SjF1*4tJOS`)4li&rf4_z>k%r zX=*#ex!?C{uEJPVn;+^Wll$b)AMZSC)%dlSU96)WxKxV2D|Zf}r=<ahFB4y}>u(X# z5p^S}T^X`D5!n~Aux-1?z~6WgKZ8&ZR-T4MMMWXu3c{5{4fp)y<>5Dl(pMtb|GXOK z_NEjXQYt&WiU%8_3!VY-0FJ_{f)fp*8ov^E7hjxm;iuil*$i=}z2|K3FKd3;|6gsy zifQlER~Oq5d~G{3wQW{})h@=o7OFCRO)WfNS986yp=MP>4SWQUYczI_a@&1-!e+Td z*Wby4#mcDk@!~i~)FVFcBQ`s9Sf6c$c`=2xX-oI-oELM9wsF0qdL^-=4i)o-0!z<E zsx#jNc`-&o3cN38Fv5^~5jt{UzpZNY8itH8829=fu`*GE&|cqhJ|{<xC_N#e6d4`B zZ*EgUkq{ZzPAh+FUG)%hwuY68boLw!NXDyX+`E7OPcavDE#d@v7&8_#y6MW)pED`D zV02s@pokj1jS0!I{CbZBS0(Gm<?Y!hn7Ar7?DuSaeLZKkOo*@cym_NOsDGX&BeT^` z*V<ucOcMbFXr9>7caHS?er%o8#r$B~hXdPyYWG7WCE&S}6xG?N%&KSnP^3xwv$`%Q z4fM26GK8C(gyQebLho-t>4o4GR&ImOD;K8k-nXxOK66+^m8|t~q-t^8o4sREb;clZ zC8D?!MLQ?b+mApPhl0{2p;U=UY(B-?Ur?PqL08la;9pAVG2C3dw`1vqp={q1kTb3p z4hDtU26O^NE|IP6?P1IuvAW8kX5HB3V7ZHg1LeYHXn<K7Y@H-FK}Azj^To+i&u=KV zaMc}QE!ISZ{D`Ns<p1O~be@i=tbh#AzP}+Qfw)A~RrMH2A$ADw>`AevErxUaZHpNo zEf|>?xvLK{VE8evAWY4Sqz36oZpkvsFHhOng2~tG@Ztv}#rvC&I=ZBDyKcS3KmLC7 z9bYuk4s><4Q;hJ}NH#c|v{@bBj<kU@{oejAgwpi93zQ5ZtbEp}&zl#BG=K2P^P|aB zdAUs&>#fW_y!<WZcSf2rCNP?M8o`HHWT7z$>)Kd|wOIdyUo9W8ASds}QYEQ-@4J5| z1jV~^Y=fxS7vqXpnxxen#QJ~Y=!2Z^iW?i-r7N%G@=xfef)$SHM)SDU_U((qZr}-x z)Qu}q)DKU)@7a}XHsW*jZ3&Iy`nuk~b(^^sGMKDePys|0HPWwznJABBUqXR2aqN(9 zOeKge*&*}Z#O|*3m|#~i&LKY2kX`7c;NgDiS^&ZOdEe#mR<iu%kC-F)+-YI)me+Eh zn7^NCYNAuszQ7KuG5Megv<>G6&-5~RJhRH0PFIN1XYj(9OK;;V=5U%R#$MK5y_=Z{ z%?($`l1bQd@*@vdNX(@@wyaeiZFQ@;xV1E`uaJ;12<@QTgcE0OY*Nn0V1X9`gF$dD zL=o%P!KylvLj=8IZ_C3K{;n}D53~NU(?}{)SP(Er7Y>e%lt(&sel$XbWrwRN6|sEN z=+++-YXz<1f9LMLz0-S`-cUr|WK-8T_~^bgySP?=<|63;oh-A!y7r1`Yr+-Cn99fA zNZ`S@MOY-#i+29LipcRPPvN16E|enkh0efObMe80n>RYO`KY#X+UC;T7dE@>{M2>N z!^>;oBd4)^cBl)ni+6yxusyYET*lQ5-J6@6m{0kQD=$F)N?jrQbxGOH+8K9#vdg-j zp6<Um?hAV#eHi)L1c2rA)WPI#C<ZuzQTH73b>EbXc^TDtKHW7HPlntGpquVwyvITT z&4AgJN$`YKE91Gg`hSInlOc3&*fN#Lx@CeZ>#rbJ4iEzw=WI#d#|6qR){tGMc(Qbt z=)5?~Mt<8-tby{lCw;K+?hlH;^R214*V5HhO}MW9;jQ&|P9N7kDdZcG6i97H2%zWe zC`+10HPRwtZ&uoS(SB6CbF^=Co*$%8&==pp%-owFH%ylxrAAZAEamgu9;s{V*1u_; zR<d6r#303E1wXI7+F9A{d#-PyoCHC`xr?fy03GdLESR2tVNYcG`r*9_Ho|pqPZas? zfoGPpKX%wri0?c56~*Fp(k}_p=CcE7%UbpCAUwVcs(wO$5pDo@7T3&(?3#zu4RkD_ zp}t06!xBAUn7UKSlJt!^xslR1%4|vWjEon`Z)W;5ucXAf#sciPLS?H->+ql6`!5ID zl(<(-&X{?qUY$)3I)JdH32chPh-HTniCB+#_?IpFi0DFO`?nLJ_iqeAlLWK^9}muH z>%wQyA*yqw4>Pv4d#)Yh3&7eW^iVSYfLRc{%Fxg*U@UXjzjY<QauoC@oLgOgw<$*V z;#!>>l`q$w@stQ2p4-O8003DnE2D+54ifU;m3n-tYLsaGvea{^8!928lSNytm#%Vk zQr~ceciq1c9hI#7^@|jUF=*)kJp}K4sSp`zIlD54zM)n;z05MC>dR+Tg6eqdx$}i; zcPmwcfBY@@D)I{((o;7n%T}lqO6k@7>3OTpAJLB@%l&J?WbJ`(=_P-O`IW*0A;?Nk zP%<o;UHkTVQ3hwCqDq4g+p8_CcUd4bc<xV9(C@YjUa7m8%1*a%RY{N^79XXc_~HRK zBZ>GOcTJ`+vD}t(sa`R;F<&rtc~aRL<GEW>%6n``-CHu|PVF&QTu1l%i23zj+4oxB z(HEV6m}%LQb#!$@%J{JSgv~#^%BLbFMhO#MpupFD-fC>$-YIjt+%@0=aP$8v+St-- zceuK!U7}U=LAR*b9Oc3o%7J?yhQEHWfxVJ>xWdo7wC<3rAgc|N*=S%Sbwep=e5b+Y zbY+UCPwqcZ@bQ!_nGm<qBXz?xwo40HjR#wq9CX#i-SC_*CXiuA2tHnN$@zET6us2? z?d$71=q~xnoWYjtOe?ZQvRlI<3f09`p4N7^%$iiB5k6UhA47}3?ee;RNsb|d@RB?l z{{v~5B(2yJCPz2cPfZ;z>NFrvWsqj~m-B=Ra-P?CH+}ml8M3siE45*;pm(&pZkKZz zk#W^gLGga|>Ky3SdnZi)@34YCs)>^YqA^WSpocKdhDwb=g-}X_nIAgb|6ugXNwv!f zd-CAk{AbHEf7;cusStV3oH$u2=;J$kr{T{>vZ&Z|(mLr>U3-3!`eq$T)qk%B><vgx z{xQ?>-s?AS9zj5nMYzz=dGwyVn7mj#{HR+Pam=QBYn)qc7jx*W)71)N<B$#wbNZTQ z7%CrEshhw$`kN;U+mi%j;cWF>Ug_T6`24e_4Ur6agj@HdvIjM8b%QPP^O!q1etD~t zB@+`HD?D})D?)9rJqR{Jrc{b~g`{X!?_~Y(&@7&d=%f9~^T^rYmbvxKzKX32Ms8Tw zSFmuvNsJkqgQ~`-bOrRvIi?GT&2)MD%Sx|wBOTG@FC!D9w&&A3dvbhHX?2*twFdzP zK95eab4zva|42F$upIYw|34{&R0yGI6G9Y1Xb?iEL?Kc_$<Tym4YII=T0)jm5lV$L zNppl&LP(M{5JD1~M8p5{p8vVdzRubET045*=lT8a`#bhOKTR@lftnmrOa*qc{{@W| zH5+tWLdT&KDXYyN*%7z2-b*KH<oJo?bTRtmdY2Ck3y9n{bE+WzYLbLjdtUo~hedO) z{|-|ffcJq^{*h6a{67*k$&gHP2VCx(-UBlc>w1r=&o78CbjrwI<~{JMl#<W%i{A3t z#oHD-*BsoEe6@4og^TmohaD<>yWslTvdBVS&R1L<H!knVuBQE*Sc*TrTBZg6{rC4Y zV~L(r$6whRj~x@P55B(X!nu*-PD<h`r(M`>x2Ilo#m4R7f6V`Ma<Q+N%i|3IFDjeI zqmIZ?;-EpR%Qt>vmKnW6{B<rJ*}F8;it*+7oLP1HkIhi`4S+FIC^8nmeXk{_3~HFr z1#8PN{kZD}VRmiZOXu$g>8VtD(&eEaG)=HZcJO%4tfr3_K1}MearvV0yT6Y%?J3fm z$}f-F;{4zqGg$w2ha(3LpRABye%RXTTXWreF@cxfyVhpoOdiCu|8=<hR3WH=zzDc( z=B#~v1KYn8%eO5!MUz#`f?-XIZg<YRqH85#V19F)&1I*aIX)4OE1B~z_iufk_zyPp zn7+4>A#ZQ!S?ATK*LlPR_tCp%1~V&efhzB99<z$WH>q@k{;lo17fv`u_Ut@@P|-9w z9n=_cjHTvx!TOofj8-ED%YxYHjT<5%#-1)x^eDf5dT|l5L%yhss|2G^hH}8gpcobM zdFdR$2(&YOi=(4){@Ps+hXtyL?kM92SRS1+>N$*gH#bN`naDe)Z{SQn5;oS5wrQmh zKY^?Djcbu2>X~`8u-0Bsd#L=o+izyT>;Mh?;hIc=q$=2u5D$G2CdQxp{!=QD!xz+% zN0(gUieSGy#?Vip^3B(ML>0Cd`)9!o`;!gfKQZWCFLYgPLPcZ$)XJ}abd^dws+!zU zt!@mwQ|B8LbG%pDw6}tb*?+FK_OE7~O3qXvl>%>7NJ&fkCD6ok9TJrsBi!iwH<_LG zzpS<#7R4Vb#(K8CJ}2ys&QH%S*)X;G3VtbBS>6OQA3}o!h_r&9^B`6dKQlQGxR3rB zw{Dq4>UjO6v2DL}!9F%I@|d>v+Q@B=##msp&caQj$aR{9g(8sX9pZ>1Zi)xjV-K*0 z-FJdwe70G0r4b!-R?|FIkootR9kRwc-du0Pw6l9*NNoyCdc*@1`xDz9`^Y}Eo3Cpo zztHEE6BYrXju_l;5w<f!l%=bQysKmO%T*}K&Ba@?(xSYcJ-|lLB)z~U$;c_mIyZ<v zU*lzC8!>~)^W_E_A~(M?^l2+KpPj8t#wA^Tz57Czf8WhGx#F-bG1zu5oF1g8=ZD2y zWlj5mqGC)?%!9>d`(vw`YGRuvj?Qj)GQZhsphTaHr&@~sZx4-B4^$CVQM2hr3){vU zP44q6+;-xgw9_jm3{nbdAn?k!w#i+;&*qd4*PPJ>CAg^L39UUI`#EFh+zBb_yN;A# zUw&IEb{=_UK6s9ZH7EiE^?;M~#Z1BjaUPDqUX-*Js;ZAE?6!Aq&qe#xc(Zx)!HYzF zy@1_#gI}!^QwJ;aKuX#wBP~q<*Ki}V(|&;}J-ob$5(aNZhZO0DKDOt_T;cb&frMOn zW%Vf3dvh5MLRCL&ctzE6p>1LDb!JE!hr$eB6@xOa9J<T{AZ@BGVk0+iDDB}@xIOpz zszhzeuxep*-=`A)zzb)fh`~Q-I(YD4<KmR#)R8XK8f{D*$2x#+M~;4n;YMg*3Tu75 z`h5B@;M42Mh@TSsqB3GHbvyr*VkQ?s2`eW|N1(DmC4eCpZNr_$wlA@2sg+XUv5ig{ z*@S|ks!d_ug8eA~-JsT;$iM@5UQe;}?wD#cInv}3fb_vP$gXl@zU`Ygx^Z#RJ(@~_ z{hlWL!`080i*`^qa!SPGJcpAbj~P-5JNTJ{x$}63ISh|tj4Vf<2~QV3aQ)r70|8KD z|9^l(?`%dYB+4s1Z!!@bAj-S=-n`dMs;7!`96X!ayxXcm=_lkUYHz<)vwUX6W8_q? z|B>ZXgrm^j^ZswWYrsDu<>icX$dW|Kwu0xtf)HUp;O?*ChUd^)zI4i1BzHd}u58CY zs+lhkh8dF(fb^m<zvE4WGLHD;Y&%i`GBl%?ZN>ceC*Mr2?LToDojTsTdXy2l=&C%3 z56w+nuWlV&RKGUNE;_qDc)p%=T@#1R*HU;7N_S?RQuTUBR1Ek3Gint|)+V;qD-;bu z%e|MyI~7q22Sx3Q(D${cROf!(lbHql?<Q5a9zbcMu%BQvoD9wP95brhUyxC~falCP zq#=6r=+Rkm)lN2yhl2usc;`9`Dj*T0bPS&;`Hr+)O4eW2R6(Y%AyT{Hhi6SjO3GbO z+$rpcAsp3kxPF^V-MiOVhWV3hG?}+T6eih?@Q%>_52AxaY!#|}d~bi<xnsb&#-y&5 zJo8g8y0Q;&7k)AVe0h<bW!`pM+qa_F&gP1s+kE4=1gLtPBwh!6d+S+bpYJp>zag}T z_H$<vRD9+O;EFr$Y@5*}{uC9^lsSdHgbU0vG*jNItpNS(<#T1V7u$_5-l0|+H5U>2 zM5&hn#t^6H862{Ih{v5;sA<#ao_zzwMtH0;QSs%-_(Y4uy1Bt)+B^5lu*3Pk_v(>Z zY-SFP-2z1JFVd>*w6n9b-?Qg=%-}-!s!0K<SRP|n$M4rhQD~nU&4F7~_IclXe$aL$ zzhAcb?&AHvPo(VCFuPistiRFBi&Qz{S{ZIsz5L2g3o|)=rGbYW49&h#RgvGYCvyS{ z#{AREuM}uXoj2KjEavJK4e1QJ$n<t=$}={l-MMKdcfUWB`La+2963Z|>gAIe2#jAr z#?&fViG#)4UPFudqboC!yC2QWcDJDg4N5LGldUQNN&471p^eX=HZ8^1TS~j8%+wKs zWa{jM1!Rp~?e6aOzEa$x!!VSP;O)QelzjW{=dz>+Puit5-_UFtU0FoED56i`ep^QX zOA~1v!Ar*uISCOJQncvE!vC?s<p!27^X$!+e(Nne#i4xh*pmg=)=!$mp^U+2M!Ja0 z`~QYq&rfJsN$?t1`vi2h`Bu|p@ch`T4z1)6E?OU^Yb<+joUla5F%G@lU~ZB7A@+Z& zJeHa>XCAB_weTJAFl5K`{(E27#ti-+!M!A%&6arbkE$1ksc&xO?kKeRsanRpi_0F6 z`>Mlxn00!ugM%b75ZI&su^WXrAzB=cjmeq$9^&Kfhdm;-e7-^-j%1OWQyT#yNr&_n z>L^wC{0$PMkyX9J@>ck*%#ofKWtcuj0}ec`ue`K6zAk@E;I7PPbYN_=^y?oW7ckU) z@~Shc#fxQp@e<fNO1fhg&RJ)6I-BcIyriTAooB?v2@_s`;tpjRh@?U~A}Xq;j|;(~ zsR~7d#XK`qjl_{Di0HdGekf6+y`Q*4i%`AlLyBQz^mlW2f9W*iT<os&*YVH_eL=<8 zg={Kczn+XF#x%83m2q*0QRueR$}T3&Z(;bWa`t>!t}8cCSG+Dpy+qU<e%r5m9zR!D zFy@`e=mh(;B%^8*3K&yOsnm2jmaJ`TdW(_9wG-=|MewmsslLvP89$w(8j|QPK4(`c zQ<Bo<ZXg?bZEfQp@&cc5RM0_G6KdyWXi+``kM6S2^DyV49W824=Kd(V%38d2zJB@2 z|3~Fe_nv@*e2nxF!qvacVI0cW2zs{{&-b6L0)=_`N9-zzieD<WU!maDp+O^O!*j3U zGxH&cGmeR8C8GpjqW|ZX&b&=(a?+E7elCRxu{K^90oo0a{DgXnJ^{+ROm@R%O*@;- z(YaB`qdOv(<8n--$&vC6D$ozWHf*4bqzJz@Sy+goe&#T=>94>3($BFDDxm?b-xRt_ zL|N2sNSYWIm+QXBtR~I?XRD|r=vhyX9}QAu?Tt|OZGH9~)1)8K+A>2W4q)7h95{d0 ztiDMVgBXXdsYpg^jy_?!bJvlE&UpLO9V|Zikk|h^Y>VtOvAU1R51rl)rkWv^VXklQ z9%|&OH*IgK>QEEb&U^#Fo-2!2^&n(8@NL`&vxBiaX8m6amx{d9(0e8(R71|bY}51e zY(s7PtqjGoN2eLsypxGfo0W36bF-#)`R9G>Pwc6R=--{i88-ji%C(#d{TWdlFMpJL zaoH$5RORHdI$i_e!jb+u?XR|al1B#E<2LtP*!t5ZaWaVV2}VuA35yHf4@;+luJ=CF zjjLH>cB{xbFsp|Y?Hy5I`B<*S=KX-2|B~a=b<=Lo#T;N677cy5K%?{mpng#ASsigu zA8K~4O!?o4V;A%DZ6fYPpR%jORMXzS&w*1Tr&(!tceRvKb#0}2W_i;(IlGvmmb?$( z)!JwXGbksqYAj1uKZbu{q~k9n4Y<xlLjW4u))7bTUp|$#G79~|3-E{CE}h||9NodF z@K_pguKgW3#$v@7Ppauf$-PieWdD<?!83(L1cz9im)`b_s#3<avBqV}e7U`a2&_2d ze|uar=+#mx6^%By9THRE+C|=9P>9_0H2jItUGFCnMiW}IC}i>2+ifp5x}_==x$>n0 zri2%cK%mIle7xt8LxjJ^Ug7BCJ^&Vg-SdUmWuZE|QY&vU%rb*?UH-rRT;aPBLJ3u) zca~wf9#9Qr8TgTz0pvq#m1_?!<|(17@r<F$1^5c|f!OkqSfF#yEZwZRe-HQ8fX!qJ zy}@L@7qU8zK+CtN|C+`v4ZbN=_+L=W?mY?}>sa0gS&^xWgGULPt-?FgDi6+R8mTt= z<k{<#q|`+1Ywu*e%RBq#;@?@boDDSP|GKkT8`5T=kT=a}wX&hvff|Djqx@RuwQ_dn zRg0%0(Jx=G?*4GI=6f9_Q%d)8M3JA_JZgiuc$Zj|JL9MGKnK5(p+FJuxK|wRUf~so z04tvfpS%x!7u~czX_mJ1vYz<rDuwuf90{8}J=gcWAl9nqj`wf?w)>0aJH43stox`q zASNToMMW6CV2D7xRLc)uO~bw4kb1qtzB#+dbtzUm*T+o!DQRi@qSZ^9*%b33Lik<= zaY!#AVo#$aMHJasGmm3ZE`VcfA2*8<H_X?^-OhuT{=7R#1E-D=p4$7aZwk3RJrE_; z3x4JG>P8TQXhm|$iR#k8>C(A)?DUjdx7uY=)VJfO$cHNH3l3kgbCxNfgVTdYiPmii z3pM2x0CRx|Fjj}>bnj(QKAY?NJ(D2G#AgoohMDRdK(lw=#>y&<{P7;LcE%FHu*Alu zc93vmsKlKyQirqo?39z$8^i1}QR@_Kv+OY#dvY_w$uXzrxO26PqbnBL66sGb$PMe< zhc?tLWmWFB#_u@h<g&}<8#6$v{N13};VO-<VNBZ*?zhd$D-*u*#>+-GH&@poIH=wi zpE|<vTge-@hd=$&Xul0+r?(PK(Z;{32}M}X4-Ncw#rN}|Q!0|x(_@P}F@e5t&^oUa zvK=~blU`iHWI)DkmM@P_7>2WwNAgd3K|#Pl)naa-8jL9UX=$z3)Ph2IFg&m+H}PH( z?Z0^DMThn8qU<+#T;I8&fvc69n_(}&uCf<%qVwF~?58vHy4+FN=Fs7DoiThwNlJ9~ zq*7tTvA(%F;>gex9b!iX0zQGfW<7Iw^V2)mhJKZ=f7sokD;hUJ9u&FL)O)$uibGVy zmabA;Oy#CSO0Kp4E%6JhC!guFVOCR1XX~iL6MFHMy3C6N65w;}^Tx>|nL&mSL1GO% zjtM!K**nN*kV9fUxlprttmN4EbfltV_~=NvHtF;09(0TITQBRG1y<y**o-xLzBPS= zzf3?m3HlijIe$fXy{mQ_No*E&PlX~|Y;FAiXffv`@SDiNvmV|x<D4e73NafG+2?Q# zHJ`HU+=K{lR(Nd3Gp!S%`CCfr!iMW#mXD?q6G92KOe+FIT{L0DQGqP$DIZ<D-b}8) zAj=iOWW*V%{CQJm5xoG2Kc-<DI9|Lh0qwnXfCigUH7`g~FVP(%L=Fu;`;o$>gfCS_ zq5EeBbi^lQSteEJlda|yeg1scOvDO(Stt2K(g@@+lN&zP=w}p?48&MAS9W+)6_YC( zWRBZePL`Ei&w+<_y&2zPy>3+RK|zW3;S6qpzDEj^`(DVOQ<uF`_MVLJhCc3|Q_EEM zEHgVzeBA?OseX8pt6-5CE6Sf}9$#r@PFRyJ9~>=Jcp-bz%073MFv6H?s13lG-Xn)U z2;^8Fz5P#WO&I0!_M&YmMM+zMot(AQS0%c%7mFX&eBC_K<*cn9z-jG2rM`_CJ^C*B z88teZnzAi_x=n;=Rmria1gemCnLWO@O;bJ)1^pn#37dHH$q$ea$&~N32qJ{E;(a~z z_*xp-OXn*D&!H<cfY8Hq70I*1j{cRtbku+RomR~_XHJvgQMMsBV3>uWm!}$kyLx}| z&O@J2k!Nwh8<w>)VR`O^N2F4umuI+ZYDtO>m~ketOt@CBV@1ml+Trj1Fi`D!_d{F$ z@FY=S0_Z&Lr9_xRQT$-z*PSAHH+#HMj8^gzdJ>^?J6STTXGcuEOp}$qzA0JOLG7?G z`!3+{MwV-e-fiaWh^B3EWzz{(wE&yg+vL8nY2UmGv99!lgb)yB-&@SZ*9mJSWqxCe zy)Zv&5aP)+wV=Y>TV=|uZ=Xe7)gsA58On~}%1TQfp*OV-TKl=?mw}_{Bb+)JwfyRf zMQ<{=FG{w}I0FwjmXFgauIxbZwm?+bCsi{=V(*k1y(a*5fBN<7w@OV8pW*_Lyr#1T zfU5j20|3BXV#xzRd(4T$NL}A?YN6bZ2KxK*a_1~;FDP3X-bv+#%Pp0l{<=&{afD$q zZc758vBY&5lbn1BerwOCrx!(ulYWky<06m0u1iJ8z)J?l^1F%JB;RR7UUdVt^u{LN zg1+c}$jF&L1}8dTpfmpELyzrCP(iz=Ei#T601=2nhL;y^1HNXFnH+O>3vo`mIC`DY z3CsFn<bJ5E?NV^<PPkCF%jQq`w@+8pz8DL?Ei7``^Zmj~8xFyMJ%QY?Mh6{l-fDoz zgTw{4wX?pM?+F<|$Y2@P4V*@vPds}@Uj8!&ZLcVQDyxqB=tN<XGF`pba-;ePj!;6& z>M)R-vW0H+zFL{V8ZieETmxpxQs$Zg;92)tx=Ik&{)9^*Hr4v*UWK^r7ewviWDh}< zkrDFOhzWO6)T8`<?@$bRIxcm>j_^ED^|JHe@<um)7;G^=HrpZm3ExG>#Gyz1`&=03 zT=HQCrNeH^?VaC7+F7<c5?t}@txJwQ6-Lp3;cKBX_bSY}a_%w8fTu5=-+TEDDez9; z&@B`3xSgV?N^^_0@$f(-g1@TB{pR**)YgG)O{JT%-5nFxCXQm4pJ5>D|0w0_@}yEn zj_T4MI{sJLViFR90#&{eb421#a}IHiF^ImqUvNlFK|+xKsiiXtF+@56jg8x*yq3_$ zW{Qq_x3Qd|xyPRE`7d^+YX{fQh*5i2k>4{5<jhEz^YFvZ?vu;j&pvkldH(`%<v3yg z|IV!>QT+4O;%(vm>bRhk4%;dKcf932GYqrSCs%I<Z3Y^L3vE}LnDki?X#4NA+U8os z{k;zKz}A{X>5TfQ{Vn7A+LC8G)1Qd1XYFrB(e?cEKEJf`ossig>J}iaT3wn$KBH7& z*A;4Mv4Fk9+NNBv-OjSd@!~26CiK1mo;p1Qb~cvjl=_>5UXG5|@k$|Ywq-(U<#8rJ zg7+?3CzTG9Nahp$HtXC<odEI@YFXH_xfPLN=IbC)Ugw>$Bz<K6%m|ggOYq-=(RZ8{ zeuX6@eBkM_CjIpa2|WOn9(?#yNzKzw&&vAU$sqLKW=)v5ZxaeND+JF$hx%aV-ii{9 zD21!f9MUM?&0L$POBYWqv{%jf;%&DP0qP1#)KWwcCX9vEA$+ZcMfJmm7E@fiDCnMr z)Bk)mKfkx{b=mO9$no2^Z_nV^i7ahUMh0pUT)!|z?Hd^t{;a~`bIAo<apif*aKpL8 z@~#_hSbS*VMN={n{8v=1oF#)3|7A&N@wNjEokdhgpeh<pO$cTe59|sqh{1f~&6l54 z^%__pqfF;%9Mam!Fiad`PY9fyQsg?qKz5q&D_AW^Lv*_BVNdTbjFd2t6!#2i&->wN z75!OB$J1r$*rc{SRZX)|n7aAu8-+q7fMBs>EMh9tDdiBb$B!#hH$}h?m=mpP#0KwM z2p+l2YuB!lrLqzzfqL@zl_TLELQUfQ85C=Qu{v1{u?qcu;;C~ZLzYMZZ{2y-<;z3g zlO*%)LTN+Q_3r<Xh9v#?(bJh>xpCAWC2{FqF`t~wbC^F|;%x+u(~$-LJE3~jC{@+y z`J5{__mTc1Q50?By2uNYV$@2R1ovne`!8)#hsjdV@su4sCKq|y$oyY@8D<o@RP#v9 zTml;B4cKrzA>nub>iVON5B>pVgSxs1ZXZzgc^kzHJxs7&r2VuPr<~uoY10R%+_tqi zheTCovW7!ARI|RW+^Z3{deT>9IE+za1ZzR|+m1WEhw5)v>`_<;w=A~#h<|Ek=75l* zgKHD7Y~2qDhevdMSb2QlhKQZ0)DU_z#*H>vxK{2;YF1Vdl=P<3oV>i?RcaELgHST` z#3UqmpyR($yzRF;{}DVxvGm}<C(b>#C+!zcm_ziPMOwzYj-US{X2sqa!p&q#GIq@= zZF{s1ApnEp*b;_=Gp;~JXKrB;QoJn-%uY=pV7r|dz8e*xYgkr9Us<M2_m_3|Uc4|T zYg~VDUAdNV$WC>6p^S||f0MPfAH{b$2~|y7_U+RG>hm+TC~t<}2(z2}B;~6!vGa&S zoB>eoQorT>h30J=IQO57AbAnR+s<RVQwZ4Q>G>-T!m*`5TqXzWuA>mWTy<!}d6Ncb z34_09N?qdWf3hbtr@Um?Z6pCEuIze{>03Dau=V9{*BXt>_lHxcYJNsqnkr+EGvO7? z3cLSNojWb)9h#%u{E-KKtr0XnyJwFyw}@1gd^aEbGa}~d+4H(S?jd(Jt5Ea(C)=wZ zr;K>6K~FDQz2?;xXENQJUcUridQd2%pM$-wDxa@`8MOa4%bNO@&h>)K&SgRS=5^!5 zZuKCjh7GuA)ZqbBf}YDs93YDA>&4LF!S#m;@~WC285}%Gd;c$&@A#Wy)PiWQ8+m`r z$-bHsjh<g(Mf!NBzj9YCQT5znNqhrI_qTMmz+FZ21%V^TaKU#>;&*a(&hG>}5Ec6= zjvD19zks6H9W8l(zODGs;<YZjIv9ZfK@8_}oAdr`!5>9v{x1>yM#z*K7w!Vol#s!; zJ9ZQsgkA=(U7TNwlEb|8udIO=)?8oPX+HTw)VXv2ql6}jlkVA)OK<VAVpF*nj+O+y zA_*`z8CdhTZ`l&FGW2pBaMG~c#W_&XO=4w?0EM6T&3j(Bq!y|7*B_qbAuea=pM+sB zi*|{=2HHB)rw^%up{CgDl6BG;4g!LK(Fo6A+yq7I^}>P+TqQ&JY6nTKxy)IjNIfH9 zr{#l({@0Qdb#2M61rv;S?1eYcO{=$GBzAM$rIo5f!vF+!2zo*<ofI^Fd7hd5epg17 zh}@Syd?(VQW)$<X57ZNW@w?k*<a*$kzOs4}N3sHENChQ*CS?UX4^yUf$@%=NQRc(u z)O*e{IeIJJE4L=YeDWD(OtQX2d5IoNQexJjl%$xM>@2`-GTy!%rW`3|Q3D6Lxka~; z`iLo_)rptwkLZY4IR89dbPnN%A9Pko*@Mt<<S6yoOxM|jj4DTf8f9@=F8tx}gEG`n zGXH@0815c5Rr<MoD%MjRF+^m3;AkI20R(Y)CU`Gkqw$Km-5pn`3E?A>>Q4Di+~{=+ z_f`;|#aC9pRo?&Iz}oDz4=h_$%++XdPf@46#>`RBMIr-MjN0#lmk1Tz_Z++52P=%2 z3wd#{{<Ffj{{_R-T%Fw!&#Zo7ZK5kjStjz@75uR@*Ptj@Mk@cSyGNOKF;389$ox{i zvrW_u{DYOD0tEwh4rXzNyPS`ayIyi&@e8y`huLLJ3i5t!pPH+BZlxb1*&EUpgTb)x zY)Ss_z=F-B{ze0b=8-GZ^|8ImIgWq21(k)W(L(xfwpo6ILQL}e_4Y`2po+ZD)Ds@! z-yM$Fh`8a>mfA6+Ms+^KUNeQY%DbuHA626`78@U~5`Vk{&g>nUhGt3zvet{tUWlZ= z=spXlAG?1S<bPt3E6R;AYvk;znBQX7Sv})d;ml9_spFsPQ8&SRU|c;9cZG<<0@oOX zlW+j8@}wGMC4mVEFj$}E3N?AWdc`pfP)m}p8nlJI9w+oj_UBSzKQ#7n>s)WQz2qWH z3y-xyM(rwO2%knuyoG;l;#|86v}0vsV^au7G>rs{J=zMFKo**zD@y$G{ST`AoiC=6 zte!1ukJc-4wW{MVtziY3akhlqmPFHy9<Q$h@mRCsjqdwY%mw~^pn+^XN8@m*LMwi~ zKQP*DmHXy7LK@aeeE)(0Er!r$@dCUEA+XmS{OfFSO4mVd91IlskKekq&Xj8LHjsS< z{v@^lVVBa&%MFNC^7Er782zLV@-ca~%Z)-G5*k7aQAO>KU=PAz9ulz78p&MM^Owrs z9wdM2{;eBn63wFEU-5b0w~DkM$?G416tDQMV?)g5B*9)FH?r&>yH00rtEHirD=4@1 zNNUSw68N?y`O}x?<_6>d+C<KfY=K?jK5Afdp)p3Sr@6MLJtIjU=ChlR<Mf1Z@F#%q z+I+w6-{<K1Zng}Mjiz-Zj_FA0i=v*rV4qP{eQUjXHx>8%%tx%7<equ?lmDka^yoI0 zggKBDaMC}=B(MK^3liOb+F2j!1bc4LAB%z0VyheVP)~NIPvD=OvMYV`vd70|k1j@m zm5kP!j7sd?qD&0?qZ|lJPtv%6MXOV6Kc_+N@`L|yM?0>uXwGRd86_}IH6s8d)Y%WN z>n)KU=$B2jBcI%iQHw6?cU5HP|MLOthcf|wmvce``1m8khDfc4N?a>$qIa*JXH@Of zpm%W+2A-D)P{vF4@r_f*QB=Er0=m1qIIpon?6b~*IgU4fzNHb@g;;nj=%J6>=FI^x zN;GXQRUdIsEr{jvxr{+nLpk4_UviT3c3py}DhZQrg!rtnxW1N7iM;c+|H`z@{u52V zOLX_NV@j`zJ<H{d5Yvfz|9Ht12>yMo2l#n3=I^sP@5k3^e{1158w4~Xv@Uy)iOKnx zwX!V!3C;-k$#o%$^WFOu=+jG?%?orF+oQp*B8TZwjOqMCkns2>*Ev9_vvRs^v(%HR zTf=*C6wLk7BnDb3g`)9PK~^v(yC;_SDb)1GbEl;j>@*O(#v!RZxrpaj+(B4{l<RFv zr%O+lR}SUr{^wUtuqhiiGK$Ae*Ho|by;GpdHyCw|^bP+P%0CAgh?1CK8D`AMR&J`> z_M(~l2-W=WAXaJ?m}-8_S(sWHh`Yp1HJT(XowgTi*65T{WT#&~e{qPIJXx*(Mn@yq z+lorVSEtm55b_<2kI%hxqqx<`cCynjkQJ?!!N-sPH7V$4>z-k+Q`DPNH(c-F^Hnu8 z+lG|kmxf2u_3OHW7Z8$a!OHm9zKobij}R#MsMyaTWQ0Hdr>z_~GylEzjr*F9BH1bJ zHRWe>SJ195g92lUoMEK+0?}ARxd6P{oQ8&mYNms11SOnS-9_-!znSrf6nGk==C?}j z{%0~J2C-0)X=Ob_Q}a6}_;?#7eZQ_(Y?(HOm&}}@Nrd%yKpFG@qv1kP^xhX}>*?i1 z*#5gN>BfzAf;5RM8^w1uAgQ7%)NT~~B~RGz^@-))D4?qQ)`=%1gx?&dz76J&nw+_d zWbZj~a!eCU!Q5mRT6YmJ{)hdvqob*6UB3m}XPjHXl$F0azKbwY50Tu1@K!<uvIGSc zqdh|lqIol~Vi*{Aa#;~kyqx@pem?owdWA>sK=+@HM3cDG4e{m-;pb|Jt)3gzaEPAc z2Hrb=|6kwV>R;S3TEbxS=FLJ-%s$U3k3oSq%a7esRghka^PtwWto0^b!HG!Q+?_Md zg>g^T(t^{>Q>!lu{cCLd-CI*rV}hR>OUFU1B|VN1%u3{_mts(AJiOFEcD<q5Z*mfv z$>4TH#8~W<u@zRARYtV#EcNdDaN@v2f$#QYPNq}9F?Z_SJ}QW&^dGn6_yU({c+U(y z2asI^U{v6GKE(E4{V^2#5jsWaQYq#$+_yD-zq?S!g`VI@+VMkZavKN@x}B8N+)TEi zQfy-RWOOCeX%pZlf}P^cZxZ;h@S*^_PZ<Rf)ZMX9kEt$7t^6w?L1Z1%QcP3}60r!* zXxcM~HsiWs!;o@S82NedMrE{9`V)|{lB&<`^uMX57cvUmBK<`*427D?n5?iK2Y>~3 z=g!(19=0912f3C<d*g?6VlBdSTb+2DzeAe)2rZrDu-ki2wVd26|8bL4p$_)a!MuKf z4V|UEU)JT%)6vpOyOQu_LVyfB&))pn-W5D1MFGL83shu(WvT_~(`B{>Wy+!QorZeR z%ID9YHy8UPc_1S60+HY@MT#Cm!8nQzd$F}1NjrD&!G_-QBtN%b2l^|0VpAP5zt~bm za$(;Ke3uzBq*|QA=ZD6qsSZ7=N4v$p9L4PN779haOXThs4LWoe{cp1AsZLR>W2mag z>sjc4ae{#HAoY@HM!HmBl)pyUQ}0!fat-bLv)bCEy<MD6WdeU2YgBd(lg|YC^PG(? z*d+AiY`C5`pdg!=m3%r|YujtY;g+GY#?1F_z3SO==hySId2$><ahM8+3-iEfhX_ej z*maK#im_)3Eg%{ok6T5bMWPlD7}RBOy{M<RWfL)bV66Ljc#=4gygoh}#UaYyct3#O zBM?*l*A*2baTUxyTT;Hs((*0iq$w=S8rUrxsA5T@(As*WBtp)Kn5!9tXGSL^B#|os zu~ocpo-Wd%Qo^eLT6nPxLOUOTW2;~u6w@yDYY8)uzpLwyZ2roRtDWY2+LPI;a*DDD zk_k)rXM3YcKIjn^nE!vsBx)gy1C36WVf74M`kaN-Q>{hu#eZ8XKws=8iEqS{<XoxT zoyFg53N^xWVAOqz_m$EK2Yx$}iR>DyaD4H$cS2X+fOTa4uVj{i+S}~&BYp*EoH6u+ zlT$D_wpd106HP6PHEh576GP(>P=C9TbIE^l$)3ewANE~e`)8-7d@GfQa}<gy`KxJ& zNh%a|-$q~L8P)4<8q#xKEyzqrqUDb!9ci&oq#&CxTlwrLeKco0$pz#B6AyKp3TtE@ zi=D^mo>`{a&vACuE8fIQtkYA~OROgvrSz?9;YNsx?(J$IE4l|xn;~r4m9o#!XmVn! zq>pSJRgjKM42kvW)D=ubT&zg|6Y=}zoxoyn>zTu^WuaC`k}Mf#&_dIemi-185vV@{ zU^xHr&UANdBfY9dKgR|{SJ8vRTRBZZx_45MYbpo758hvHiUC4CjS#=BFFn)7YFm!o zFhI5VCZFZXOV2#-Ve4qTI3w!COPA|w3kkj@%&l<SjH&ph$<h8w%X-L6De=R$)>9=H zl78#AR?g5J<P$&H*#Uvt)@pL0M;FITGFn~Zl#z52LCAMN<RyqbS27@sZgP{3g`FFJ z-Ogm^&=ur*huI}N*Xk**W-7-C6EnRYgWFHm{5vf<`X`skZB71{g0q0bGciq@Us+w5 z>eFFTMa}a1*G;#`q1xi+*7k4ZZs{3Pg}^LxecG@22|G?3KF-Ad!q5^MqA>Se*4)$c zPcHkUevIe=Wci<FJc#%y1@@j+=b~FGik^Anb>b0cI?o%s?)pF#?E13ALySH_Lc~cK zo$m{d*!~+^?c{&e!{HU~;-=9{EE65XjzjXwI2iE_jNumxhsN@@$N}I9u1_l%@^{SD z9ra6D!k6uBX@4}04;wxI(-DQ5{AQz4)~hF5_j-q@8u^44zlZdyMar+2=y-v5WEk$H zNW#WOpANyfdkPSh4EEL+(?eDHT)xvK_V(pQXG7JYVkIe9rU%oDU7J+VxRky9e81aF zlo&68c=pAcZy=4u|HAYbUTzfZHB%)6>8N=N+^>%YW5szr-*BJG5^H---b7wFQhs=L z%XM(_5r;*?<KWHjVpn~g3S3Oxt%cl&hp%71E+cb`yJsz8P#g9@G$vW9M*bHDKbsUZ z`6D1ap7Pp31<T4>mvZg&bc=EYcqTiT2U$66P@dTEpo{n`Q!MU2sBa@xjqs#S;cj0K zqaG3*Y=TlxWS$LWpP>=%$Tmy&Q>vr<z9tuu)*2O^UezQ9q+o7#+8Nc<m_p4)4u-|E zBYb@j?|=X9A|?>lPen%eEeuul#D3{F*-Gop#ZY&W7vu^^1o3bFzzzC71Q{gJcGIZA z*;52~u3rFb1>cl`$32*1RoN)?Ek+iGq-YUAiM-|n-(1I^?poLEYIiK^>Ot>Ls|7g^ zI#QUl+M*35?ujWuW1nkv-&BzVT-82OIK8r>;s}91zGrR!EzZdKFjc0H+LO}Kj$H|9 zHT#b<*W;GSj7>;b7W#gdSeGYpNZZDq{AI2>v~#)h)T^pS;bNBw^fsS%wquBdNF${` zT3-H_uh2qaQQrk9m=?h<>7P{nT!c0R?_^{=;xWo+>)F|rg6p>kJz3EF0Btv(Ieh&l z*7#7N$ct;^6i%YWEIk}MIYpZ_bNEJ7=>o6d-AG3ZMN;pc{KB`d7+*v_x;DkRd)`kD zXvU-2^!)ifUSbjjWuh8v2G{*T$)_xRBt(3bhSlwV1Q%=BzX<TYQoC)&5T@IT7cXAe znaTAYjk#J3YEJ1&&lSXIwSAsOLa|yB1hgdda>i=8SrbcsI*dJe6H%|OY3R1Iszw^6 zEyGboOeW`mtpLO<kq5BPg;R^7J>LzeZhXIQ-a0sf2z00&Xc*jg?)<`2KVd*1-_V&w z6qcN0*u%@ZRger-JxK3ZLc&g}u>5&+n(35N3V2as^1aW0|D|+^S%&dSsY5pWE#dxp zbngAQjA11HV(`TktmFb;be0+huPA5QAjt=8WQoTAy1v5dW_Yl^+`u!JBiGSrH_ay3 z+rn6NDBj?+hwLgplXWSvnNP6b`SYRHo^Shdfxu~sWS&zEWL<?sZoFD>!CI6*SfLOw zs>ltbDI#sdR8mJpdSI{A@bDduj)UROfm2Z3&2zF8Ke{8=cd#*nK+}V^@>3TmZtz(u zcVC~Lyru9}eG42yN`8FUlB`YcZ39GY?@>yZb<;Ub`%gQ&e0;UViZU&BPFqcRgp5y1 zG!~3K`Be3`^Dv3G@+B$1YC7`b_P*YlERT48HfM+HvHL^USXhiRgyV!m{RaA!t@ZZ{ z{EL!-qAqq^v`aP28bgK~#xwN#f8LR1J3GQnxd6p(Y{S6!Eu9??wj}QYYbxXcdaU2_ zXlApn$G7u(i<`%1bnXaOYTP#u5QM_+mp_MFN3Wc4V%ph37|5etGOax3N16oN{;OKr z(y%_Pdz@uh|5>sdnm@KXTwL{QwsDz1QLeS12_0nj`+pz{eUqVC3}bY!kEiD=VzNI# zi@8$$pb@kMf_bHnj?&<aE?dj6D%5`i>;55YV|tNm1!?%(ckLQPd{fl^pT*7iYW*28 zzKu~(ctf3Lk>b344m3r>FX~Mw`B}w$|AI(TCIaf2_MjKfqg_XlEZ1nP5_zJKRS5$k zE~|$QJmiP%Vw#Yakigo#lAyfp`}J%T0?<9R*$A6aY5qs0!)5CvkssfDvMy0xOo;x2 z1-f87-JP7CfF$Vt@I3#hp@shLh-(#%9%wobC(lgsyuUR>*Zsf7w&$Ju^JcM=4dEM- zA2lj-aDg&n#weA)*UcV%!b9%Z{fV@eNR+n7utJiG{A;>V=sKZ`7fr<4+mO@3F695; z&UC$38+$wED@c=a)+9=kpCp`NEND7+B5%ixb9pPvS}&+b>Z8~{p%<MLUu|z;@fdkx zHGonqAm3-W8@TjysD1p$89g^L3I#{malrOpwL;BfTeoht!GY9^VsR7h8-(2YDe8X^ zBl!9w3TtN;DneVdpDdDljcuaBjM5jh?d%9&E4G{Ll0|SDG>SP<!{!fl5G~S#V#G!? za+jFR^<lm=wfJqvhvP~-(io~7(5N}XizLi$c>X$>N4J`%4jG*&YNiKi>^akDJw+nH zl8JZd@YL~eRoKqAtorBoZzaIBRA`$d8gur+b^dvE=Zzd<0Zv4DP)>{J(siujTRCCh z5+Hem;k%Ssu7+!D4xjB5AQT27-xD!v<J`XwjT30sizdYRp{PkiQ}Zc4i^z)?FRmcN z+e+>}YJ>Tl@gjB2bv#HSs>gJtv9T}j*!W13Kg4gui*w~AsFyT3XhA@fXM<10q6izU zYV-s-jf8Poj(W)kwZ{>tVi%O9NxM9k8bmz;d>#;ygh4<<r%q{$>31Dv#JEaS+Rah& z`8s{Ptfayki*z&!V-=*4tlU3)_H4%8w>PuPcaB$-E($1ZC?pE&CkLkAiHT{MnU%ox zW9V;=R2nm;5D}eL=9RtZ+;P6_8!s=F2ici>%=X`Cpg1UTUDE|){z0~&`1*r;wp;5? znG*}R=vQ#|q1D`xSUwuJ$vh*o7Cp8s#mEb4196z9?S5)q`|q>awNbmi5BspEQt8B! z$5;=`-(TbX*C{Qeh+S5K+>p<UwqJku^1YK(p-3sWS2v1r<<DR6RCXZu9&cRxi}v7_ zoDu7P8aUP^{!f*5pO1Do0easmjok{Db(Z9U-l>vzd;5IPWnyOSQ5k)rhVq|p3`BKa zN*e;J2n)Ly??NvaT962_R-y*%cosw=KeK~>&x$aHErcpZ{XKJNNRca^yib0Fq;;R3 zeXXDSYct;L$pP>OcSZXLaoDlJ+0>yDEj8%XXGMVP-z2FZ)99q{R>@R#=xB+5J{f$W zV5o~c_x>d*$`Iuq{GQ#*Ey|Bk{Xv4<lQnYbed>~+E~Awc743XdjAlod=GSc2RA9f2 ztV!C=u4W3jM0BhJreUN=iY_l3GwF}3nj_YAl$T;c#N%81yB}yA`wchDBsOPVhf^rI zReF8vn5F!7Wm@$!G@BWy5)iwC$fQI$!(3$f%^>;5?`(G9^e9m^3KsdfxT`v5M?Bt2 z`wA{3()HaoW>@DKN6ZzacjBqvPRs$YwI}t9BML6ZsC6K3D`G{UcXlewATa$8XM7N( z%S0du9bACK;XFeL+MFb^Tf00kFQC?f(6`|F7dcIwA@08rI=v3Kr_^}DDg9H$Z*&nU zVd8$R4{+Wl!&Di~I%*d2cs9`$%}qnJYt65(^+hm|#35KIn&y(ZN*Uer?rJ_Nv9q-P zpV3c|-D4$TbU0{4qD>{H9s0+Q4LG!rLeXH5u}dIh9C{ukF}4A$ek5gS4pPC7pvley zj}&U?yVMmxQGdAxv??XhhuD)GBm^4Nv*p8BWqf^|J_xtS16UF0vLuv2n}C$kGc$Me zb=kreFHX#i|1+nI4lc|&f5&(tsq}Z;y0zYy3q5JYgj2mPs1<cDu2S36`so?BUu`oh z!VK0=T6OTxZb@DrO#AmRrI4bxdoo{>Q78sD^`=i9#8drCPGI-^T8(c1Pu``POTSHa z{$p<5H~#dRj2EjL-ss*rrK?m`?|Scn_DQLK&!644{(0yKCCy^_5n-D(W<MwxeelGc z2VOeu?_Ev5M45cKu-4?twS?98I|`S1+jn>?`-bnjkvC!46@Tppk8cqTo!;bUF)wH$ zf0?r*ykA1XPqm<)?Am61^`Mwb>C$i1jGi~xSvq~naw^wqx)8f#46?@rwTJVwva@@k zs`UbFUqSQig^C|*pE?&P`3R|RYsmr%Ep6CX($GR?QX%)IV%Cj`hGxf`U#G7)f9~9m zI&D8(zMH9Y^dL7<xlps#R^DD-n5KfVrcV1t;e|Vz*9PyI?<D`=$?Sg}?d--A<-3OE zIklqkgSCHmTRK-S^TbZJwZ_k%kvdxsmguv~#cYEg{Nxp~OAT&+O(}6tGp%-fv4c<( z#1*3uen0LFF<tP}Q%9V~_>WX!PJQo(VGa#Di21&}dJ-2NNY*+Dga6)X=M_QLB#}O< z7W8usw>?o}ziaglwlCfrabzY@uUs5Y>1;Eq60E)&V=n=m*)VY!2OPHHT4{Lh38&^) zjah&y69}f#YD2}7v->tBvD5hQa^16{0ahq-l~+_eM1t!gXJ?VgQ@WW}snK8(gN19P zgEAlQ-$e(?-wj?1%+gxC(#?waiuRt`wKceR<noIrwtrjZ@>=&OX9crLe{9})tJGTS zSI6JO_n?U34c2k7+3qP~RFuqKcxk5GEBmGCa|&*~qmc6MqeqW0%zgy?^ZDPY;syNq zX-;Yl)1`czXPn!=rRC$}Xt4mw%V!{-m&?k^y0A*EpnRQ8_YLklgp;RZ)EbtBYF$!$ zt>f|S&EU5#p0Wo2B(d0GTipO*c9crCwUf_eziyr)5VUc-gIpETOn(gFkEGqHaix96 zmeTp^BT8mz2mALIwq)Jt1@h_yf}AK^8zOOsl{bkKYms)aGr7As%}u6DZCz;AYP6}s zBYpHcXHb?z>!hUN$L@;|cTfJx6O=;y|Ej+YQT)t?vWVm5J9As`eLB}>?u{E{_)OU$ zd^YS!&BT&D>gQJWka%Zw*2b@M<9MT?ZktSLur`@+%4d#qjShWzUy)wcGDncHI~yQh z_v{7pCmhSQVhhgN$`1@w8Cu#h!9bSKSM^g3Pa+qwO!mBO^WMrqT+86Iz|361@R@;x zfe8)EGs(AGBKv+uq2`l;fiB|@+g@bfypfRbpXMV9L^6`BrqMj`GZj%k)4_@iVDX-p z>i;z!w(aU`@XvhY4BXu-oL{HKXRzQ=jkx(|(3BgVM`J%1#IK3lkD<Wko~HW3vV9R( z)|^rO+{WWL#!Su-?@}8|1mz2AUw#1XuVckrQPH+ksN2})9jPT%{|s3J+w%g)nw-q7 zMyv=mz%ifd>gomx+k^u8n{K=R#9rD0TOe0>GlToWD5@damE>1ySNcm8&YLicyFp3h z2gsq`)e$*XGa1^;PO8pD-Y#h%JC@UHuJEbct$VbE#hH~83b)F)pJp^)0R%U-wB_K` zXR`XZj3=SUaTjjKpBP4_T=Ou)<f{o^h*th>N}LUL-tXIHP$(#3u%bbFe3;The7wEC znOnH6s&JciwnTB5#GN%s6}jksqx%L-LFE=1syd5FEHLKNq%b?K>7cy|>+o9_^6KXk ztU4gS)?Xt~rMW_D>akk~w(uM}j+297fq4AE(=clJm7&a`b=pr5Cg!RdEk{6@W1WQ5 zR)jLGQrpJOM`vz?s!@el0XCKJESI-|lbB_7UEfLYKJ8mvI@K>kvGC@u9%a1)4Sd{y zE(N`X6KQ-8Z#wLHeXY2KMb*&X>W6JtNFNag73LjkCFf0<U;ju?@BV&{6U^psm^XWN zKOTtxf3{pr@E#$|bJ!NuK)Ymy+ddhg;N!P%PTKxGI&5L>+g$rUralk*@PmUfpE~f) zr8f<nEhWx}$YdqIVfV$Qyu5yM=FT0UQ%cnZ1X-sI&NmyQP_0vs?VIU;d6}7+*&b^i zzc#U<DnpA?1D^>pd<`X6<Jd&V#>S@eerTkuruEk{&N$+6fno7>Pk5{upI%i_Q4vtm zJ>FwB0RrM#Z{{~!u3I+}ZMJmP`CUh|rkr`mKhbIfsorT7F{<1tt)sQI>z40NXVb+Q zv%5;Yb)u4-YjP_42pxi;DFr^Be^2w#5@%=U97u%4q1#YRPiDorq~@&-_MTGt)jFzy zPRIH=j*8<j0CMDe#3%gzpM*i4m`if8&EzvAD_`Ymy*FZceG*T`p%tFLCw^)3HVgZ( zPOOetl5wG`hMT5UY=<%QN7|kbuqz`R=UeF2J-5>O*3FyW#pDc?5h?M1n1ox#5EczY zY{+j?NJMhbj__NQ)E{Akm>a5U8i~&InOpZf3yWicDz`V7o8g`$&rTWtWjT4SZB48T zLkn+KF!flIxTj@Ym1<WK7B{%?RZ+`+v(U??l}+v4f~<pMYa)A%4R6dh@7!;E8M7n| z`U!QT0#))xO7)vaFg9b~Xs+eevVYZrK<OHq%@*qBGl48qA2Fs+fX2W;O=;l<PqF2R zqWTlWjA|JxQ<v1AS2Wc+$sZ%YT{N?ez|54x{O0Eodl?k-)ll}m!@Nj8f7PKPSBC#g zCbPnpoP6t~-ig8W&a^|_N%>j`rtIsew65_&X4qr<LK193Rqy=#Ib(bJ24yxgA9CVl z1WuP+wV*t{v2xAhs8TM!z85(A3(;y_|JeTf_2I*TzL;J1@;j!ZH+Xf+aSY=zqG=R0 zZBs#Amc^T|<_B-^bQx^;Orgj%2tD<_dA<;+@S-lhzPgG>7e`@3`+#g}Wm#HQj9RYn zUD_yg8o=l_Nc?2nl_QH>Sy6GK#}IXRE2_o7xa=N3V-0h$LQyYgOVupnD%RO%Ht3lW z22$j8txn%iJ#*HqS+{6;v^`tmb_*1rI)wJ3Ey=*1F$AL#qLIOV@&1-m_3xXpJ2cLe ze2}44cu=6q2Z|C{nYzIm8rVzSr3%|wOHy&KM@L8Jk2_WT2w(hHgddhUC&UXh)gw&e zY;dzQ%a0x%h}*E?{d-lWCQdhJ7Sy9lE=gm@RVX@u7?E#+emg3OA{7)BtAWhA7|WB% zBPVQ0yCjA7@_TcG8&|1u)SaK_Hjoci939+D`SKB?%e0_VT8Y9pX?m4hn9H;FBsMKC zuV)yo%+`S_6yts%c<|ef``z;jmjjF88><`_G}b(^Tw{pD5V~0V$Qjx~Txtg&gip~9 z_V|ye8LNl$@`D;W4>px0BLWr#>|Mr=kr3Dy5_TSnx!SgSb~fUkj9vA_=5jskOWQ4s zG}x?aWCHL=PHK9~OrnLBUs+w$XJ5I+x~4)+DKWwG_vg4O?fQ^4a&14>D%T&_tho#o z8;A7*vlm(FB_W&T-Sq=iHm7fxFK-{JidR^1_g1af!Gc1OD1Ae5iC#%cWW<7LXGQdU z)!s}6QdFaXc?wZZk%iM#ddEKXK(!O*JsJLNBm~>FjC}}|SOdRa=T&pecKzzIw2qDH zVMm}Vk#sEb@R&o9NlxDF+qW~C+#MeOn`0XGVIyWm+=g$+Bot-3PGN(L9xJ(}zoFTH zO%>z0+y6S&*8bOxM&|(%ePjqTs%D#*;I_$zeDv321|I6Um-4k){xDHI9nC!B2ZfO{ z8_9t6XLqQ*yyJJV)wGV8Aw{W6WbfTNd2$HgrYR-sxpIcx+x4P*FIO~HQz%blMl`v$ zrs>aTn<3}B*!X*}c5pK}eY@^#c3E7}HU*Ko|9>rAjodXb+}5v&kmZW+f&TJ88T;9+ zP!ma1>*dGx*<4IYiRJUG6Uz^8xKgwc>~l$3>xYDdteNK?{l_t7<6VDZj^Auu-KorR zCs(Q6`;^tQQIIdv{7S6nUcUd&Fj>#{jOyCq>8TBIje5a)q3pf>!r!b<uy3|ucD2vH z&876bfeF}j)Zrg=XUuq>bx0S57&7}=VRpuVEWDLBXz_@ie72<GLH&=vI9|&e+icoe zTeVyjG;ZZ(6e7lQ43BlZsU89GZwib&Kv+l}+9oK3!?B;E#S4gTIW8?DlTE9;wD50j zb4IHApDQDN_5n}15Er-9+@gGIYGpv|XLMO|4&lM#3rs57HoooM^1&uXZRbcsv!+EK z63GL3NG>iEn=j`UkDvBS2Q3(W``$Ni-u#$T<5^Fh*PB<b<azm@rl{8v+?@paE^lbI z@yYqQ;@ZLbV4Murz9WtuqC!kVEvOH114~I!e%I!01H`kjufh6}hCgT|tL`t{2rGGS zD`B8irq#p%Su+JWGoFI<?=m~Duk}edR89l6Dq-TsREuruwR<qF(pFjXwavSNtJNaw z#wG3{u7a^Z-G^d6i7JaiMD+^sd`WmeZgUvI0VoHm3_nu%Ru|`KrFU*m=eKX)h`5>! zrRwVJ+&oOsJc;TzMlEY_;esh=27*@I)BHL@_%)_RuXt|c6M~**5wEN%rD8N=s?q8` zhR>`t<u8*e;dJl@Dp3q;u_Uoq&}BGUQbKy^*pqX(K<65T+S~XvrB_!F@;6klnpiU9 zyN(QQt;iV%D1IV;qtIgAroNaoQ|I1PA2VLEk66G|GF|8+XK`ToxX?H+l*A7Hx<zaE zwWu4K5k{ByXNbh-Pd}$U8yK81q`0Z?%~`T#N0ZxITlambx~_CDgMntAPR#Nvdyc6{ zHUqviaH``~u*|OZv%B={6_THmo;rENs0UUx^+TL8#4*G3=hLdHK}-Xy)JKr_f3Zw( zs<nEZyZ|Q(U)Y<EMQIa`&mZPIRpPH_U*_f@uItaB5z9|OegRGELg?VD3}<D6Xxr01 z^o=VUg#>t!#@k|36BGAUWla(m8%rzP2aX)rml)cEXmy_0Pmo-={lazKIcOkiw$3=W zaO&vBGuM-QA|wNUjS+N!uBK+)Sj1|G3PChW-<&E&9@R9f+nZ-g)f;iAeQ9cPQ^wYD znV=f7X@79|kK?_t7hFDP>DBJcS{|sPg~i;uI>l}fM!O6633uS7J=);KiEad|hyl!+ zdS^@sxsi62Fp`~#*ZaDZ{`&Q6>EJ@oy(q74g>E->_weWt0uVOD2deBw9Q8lpmq-&` zgfEGdC%uO)UD29S+4c?&pCpB+*YA7mK|sSEAOfAr+V9?4yfnXmz(kL)uik<rAKGyJ z7G?BR=)zx71(Q-9mw=hfBW?BqRG-`oBisLUPd1SCk(HS1EPwc~m``V1Twe{8KRn&B z>Q>Y8O%+L~)lOyI(7^Hh4dvi=k_Vz~<@xVg;v#tT{{8#1rj1WIrw+t^9*5?v8p9?` z_yhj9KrQ1E9y-vX#F45-p%fXJ;|y`CO!+WSxSbujw(-lCK89va5A9QJO6*hfT(os| z$@e2-fuSKXGAgQPd{9iUm8GRudQy^eV2oN+Lub-6E#K(ExBr51-c~g#XxaZaX*+3K z->|byHR?e4k#%O7PHdz1Hdoi_vu4Z)6c=vYzWr;WnVc~mes4pwYuB5r%7pKaiNI)> zc}|MNYkxs#;EUYK&c+hl?k;Dzj)~HeJ4D;}_r5=WS_vF`^Jmkvb$t20LALUUsj`L^ zY9d3Sy?m0a<Tm-kKmJR3#9(azxJC8Q*%2d0dazfSN*GM0=ZMw>;*>M+)Relukr^T} zw?OlexK!c(K7w9M<8KpImj{~HD%hyVlvX%w8xo^7x?F28wA%aw=hzQV7u6>-4{cHl zG6^|;{GM2yvv7gl$eh7~VE8P$Pr-blU_1|PP>c&v);E@1x<~++S9q*A0e|L675%A6 zhI~3pvugj>pP$e%fu6C#WaY{(#dUI59=~cfnsBNaLWr=`t7PAfBgAdE@C3l4(K5_! zXLvtAg{g7_ah|@rNdp;aPA{ox)4S66n*f5N9qsKk1c1p2o+E^sPh{^?n2I%q5)LV1 zRZ*Z){valNIz3zvq%pKO&}=Aq*tR+EL)gZGo#}VM9sQqZKGMf6)&Zi6hH5wiYsKh~ zpZK+#!TJ<S&c^N##kj&U)$N;?6l&MGktfOLS=h|sf~as%QNk@^32GQJkjUqUE%LT4 z37d+%>RG=S-M{L8HFWv;ua&#+S08hI$H2myf1ueo1yj_;3pEi1Vd5(!5EK~^Vo9sn z5#5fwbEeNfx7wgKcT)=rH<QCgDn`x&FhAppma({jEOGQ(=DUB@9wdY@oMdaf&GgT* zSo>SfK=!4(V^o6|4jozPBYffG0#(#Gy*toqZ^F}>H*@<FD_w2vSGLN}w5oUXf$Wy< z*p3Iof^I`r)I~(~i&@D%v3j`IdC>N{EqeK+InB9vc72e@r=mWB<ehEu{Rpj{FQY9e zfQgdcH17jK>Yr(`JGx`kp13NkYwO&<(Z;vUqAjv{f5U`86;I2sbLNw;43qd#L&2rL zLwGwO=N&Yd|IGnPIO7g3Jl>Am1cmvL9&p3Jtkr2#g<)|01PnSjTHDYx<-PuC<Vk$S z>@d4hBnS7onJ=qIj>le0fbp%gw9~cdPj4T3r8rdLtse({HuCMsL3@mKlt?qnfp0?B z)^+Me<BIFQ+bSdjwLzC%&Y|5V)#wJ;1~lTxVDt!$Vg-b8g!5UGY@=md)@)|cwnBtG z8HIl2*seyKaYU>ReNump;_p6Tc8T(bFY>@IMUO*2=V6s)8bL8KsK??vJ3E!>_EXU^ zF2r}pTRBGKhf&u?#4CG_nr>+$o+5uxzk|wzH0>WGbg>l9BUz6I<PK`%SOg`F%Vvug z3`SuZqviy}*1C1R$G0vitl0d;PJv3&>z;plnW_>WRu@pu=up)*lA1bLrTI9Oh^-bE z+SqLpQLF^UT-_=Z0Mb<THTdO#w7?WUMOavA2MJ%DYcr}g5r`@!D4<c!AU3;(yy%<i zfBwDENP2Lk{+BE|yE2!^AGXypPUQ8tB!Boi?<L7))}-D|3Q7sA|5cu%?(a@ALLnc| z)uMWiq5alnTGcz#V<_{2-54xf3|l!qu`x^B&@8p&!%$Tt@APL5|KLEf#hy8f7|p?0 zxHW4&v~<4Qx2bnG0S3h&hQkftLa>}kQD1|W087l=|6JdU+Ek&xf$&A>1O~3hrlIfY zJdV>c{$q=rLG9$S{T@gt4j#5mn|eeLS|2=E63;$}i*xD4RW6Xm0bshvPn^*0D;!!| zm`Ux<%1~9N40J#@6v)~mu|_!~c^>5#i_PAwPO6B81jxRT_j~7!$o*71ZNa@c*U)U~ zQ+J)A#4(k{8jmnEdxurNmSZv>uCVreWTe{+sj|Y9-D64y2`*T}udR|xN4{l+)VsW= zr>9D&TLOoH6L!MBP5#OPn%lH`CCB`p-xc}p+FImP-K4gPSrO>M=*sHmsK`jhi2>Td zg=i^?n5gv0fM3f{004TGeI#w9Dn`CFO$XA*ysz9n;&m#5>6XoU(X~}hfww-NcbsAG zbCrBdw~vyXh3ITLZn?h>{^SLItIzf?(i;ESFks*U*~^#gR$N(4m@~0LG&XR~k-bdt zd<X#yQ5fF<fSZk^3NNo1?u3Pf`Q4Tfeqx{Qymev8%2pEcsNAwqV7zhBe)HKv5FlM5 zU8XlnBTPB?-D!YUPI&BKlF&XiHAVhoH<y_7G=frmukY!fX6xp-WHmi*jp|7++`5l# z%y4>~KBwemldM#skWn=ls*S`pG2w}<#E*FQE!Voe(v$PRec7|J2ppe$CJ<B@p>^~A zkAmWmj)U-_6D9ksllve#ZF-QjTvsIDWo=nn?qmC5C_r|}A6A^}`@0n}l)|2Qk<vji zO85pe#23VjzxP=gdClygn0&6fxxw`Sao2<bV@#>jl|o9Fhe{;n_srwATq=LqD@iTL zhERcCdL+M1m%0RcfZn<D5_};E3rcuOZIl%hbiQ`{QJx{Sb&i2-5;{k6@VS)Nxhj}y zOr6>U=|u^Y|G1K$(FjD3Vf;+3;+O7M2}55mtU{F4N7$bf7q{JO-@X?@K$5J)kmqjQ zMT|BPpk?u51%<-MQ=Yglrb#Yz00D8BaV`p(+(8vd^fXhlZZt#QDe<Uem3>~x0%U;B zPBQR?s?l%9u_rwhihkIPIs9XAz_Ia~90$=^H-@EeIDwduCQBzu4&0|pts$84K+LC> zh&j%)@w}~7lZ%D_o^jZAT-7bdMj8k@IM!|wJi+*1`_!#kPEulM){T5oWY-;bi#fpK zPW=MBLRGhd5A6b+6NSi=Eq#|6u1^7$y(HeqU<Ox3SZrE@*y#U?xta|z%_j~BKVd#u zCq$0u_x>!=&=@}OkTJJzZ+zqLou;NC=U7y%rcL2Li6b&!2N`|`|NRr>bsKBSUmJDU zmLYFD%MpWZCA_c6&T#k3mAjoD5+IE@U>H@dRIS#K>}4z&_?6@dXGdEgvz*8F^NF%h zCP4yp&&|TZv@t6Rp5`~Rmx^FT`2KSsK5yCrZRYCfN%P4Z-mEEEye$;*&t2RobKsjQ zAXj$Ii_9x*?nop~!RxSX0zMPB;CiPb&E2<WNxZa{`9m4Ad6*qjGFVT7hzH@IYlIIU zFf#6ye`4eBSt;s!B?EQ1+g@z(KTy82FD5O%cWVRL9OlD!vBnXxP~htP_AXyuOroFT zAiA_Wu3g2;ucY*cem{Jpkw>d)&xb=V7fwb{bSXu>gF51>@%C3kga9dFon5Nse1QPT zG6XH}$~Ib8uJz5lykm5wgVw9|zpCiCB-Wa@f(&6%2p%#fR+~g`Z|}TAwy$a&v<3n+ zhR9#Gm3JJdCUn)>UsErkYsH!;`ft1uXG<IA$Vy~pWn^?DBNiz`hu2@B=zj{*9wxbt za$2P=kv-IF2%KxQxoR2nclYvuVJz~Bsx1!=>SJYYj)#GWyG8s`R7rKUMECy1sdCa< z<N=x$T$f&9{f7fG#HlvVm%JY&O8ay{*<Z8j$VxmL<vmP7jK@YMH#e7@)Ce?#x<I5Q zCUK`I&hGlRwBZjwXAA&tr2JP>hv%=#T(R}0;~Go#5e!y6OQmkDO#~2H8R1i7;DQ`6 zP}S(^gP*s2M#iY!C32%E>8Z)`beo_U^VRWkNCOOy6q=FnH)iKjI}P9B6e+mfrw&@1 zsSpuuh0L@Bu}HGg+R)cG00@vXcoY`xXa<k8(~%e5rJke3Iiw;9G>Fl=bE0q@#5Wqe zZRxT5W5NFjrdn}b{{30ZMrc!OB}Q)jXBhu}!IXYp{)0CD7{gGv1>m^5wY3%UGzTCo z5}%1zaQ%%DhCg1DQC_dDr&{u}_DkFEBV_3>oN-RU+S0P~OI_WC#j=Z^G_-U}8~n3@ zgqT>Y>`z?ZoWO771Lyty#S5^JupfWAODP*9!{M>Ww-~BAAoEK?BH=-ieFLu9%1@Fr zteXDH<_X!)X>%-a;bNZ3n}_upjHSrJBAt*6q;oEV4P;AYC6YIWeb5I|JB3#0oXX!z z*-xeUpMD!Y1uUdgi-?qn-gQzVuwt8Ts@TeDYGP=XKsDoJGr3wjOylp|vz^T?aO<!3 z$K3DiuC0(7s;Vm?XoLTcIebzOo@zC@N*G8VjrsRR`Of1-^|q3Mw}J5%GXfq_Esny~ z;z1Lz2+G^%=9Wt$Aeof8;(}6`>SulUYlL{~?JV_fqkuWFC-eMB!|D8~y@%_670Ms( zPF<VW#HS_AG7e*ZTI_=2K?Mq7$6(u^qH1KnZ<8qq#Igem3d(~FW>EW5{9#WmSsGLE zFDnZ2OUznR9JIXGmuZnAUq;5KmFxZCl)8qnCMi!eIe+znT7onC=ub>f`#+pnHw_zy z3Eu)(eHh?}S9EC{y*xdy*jEyh@&@|l>wj$NJU-H9|Fc=sr=Og9X8CO4CN84Q*9)JC zupQPSuV9tG<M{oD8psYVyg5$7zzPS`|KsS)19Du`F#fh6gd~JY2sx4vB`rb-Nrd(V zAzCF`sDvUEIf_VxqEw`mc0v+Dh>{{nlF%WMn%_6)znMAH^7X#YbKlo`@Yu1z6asG@ zs}$iyy=Iep38fdxJQ_K)Un6wR_i>gcYW-GIMdDiy-BA7p%QT1Qzi^q+NVH40lwi%x zpT>^dov66`g7a@RlZpZFT-D|z_q1bKs)6=L0=Gpw+}cB-<Wf`~C$xld<VYv^^}~dH zd-v`wbgjy0TC7&~n-&2F`4>YJhYEFZl*_HqkBcLsf8&6WD?y&Zm8GUZaq&)Zh7qdP z?eOP4qP$)M^nWR5_<Rur2l=~5PV)N+AxsFt%4clUcT*^}Ri_3L!!pXL{fNpiigc6V z`UvVADb&fH?rZ}a*~`{(Zk5$ViQvszyDg(0!XHn=9&l86tVfTBO+ZJ({1JzTM3jgX zUrFYp-;``wGbCQ&rpAK<jxU2Au4j04aC7U=nK@BAyzo(*ZtGSZf(w<%I6g_*B8MV+ zEFvyS<~@r)76nN11=g<CB(Z|d;(9-l;~0kReNVT_XIezHXdbOzbNc7jt-J{nXB-;R zF<F6Tr|2@nOXk5C;$|l=m3BRyt5z2KcA9PFtkGXA)L!Th+ZC_s>NZdiK(V`5ReIx1 z+U}qKX1q{mnli!&)9x}|rSaCfzJz~3vvCd>UbWame+ZW=5{kgJ^4romkjrUiIOm+h zZ<VZRQocFnCntr?q`2agNpZUw`r1p=UqcicOgHhLATMo)DXW=F=8uO$AZ+$h?B!OK zKlB9U<#NwS@m&hE9ta%Ko>_kvi_GErY%s`maz^D(H1p9WXOSK1Xi~BCt#-gc$K#VZ zI@l9%pS<Bdm`>I(@uFSl(ZoV#byyE-Fy#a!nM6w1;l*VA5Ya=e;-UG0x_Wvoyq`lt z9QPpbSpe~O4W@RAbg`)XNdH86V@-(TujwYaWXzZM4gR`Q@ZcnruGbFWtz+PmGir)= z{{1&y?PyB*p9_?=aDU=Z@aQMF-11Z)i@$ckf(3zCt-62g&@VSnUI{}~q8;A$F=uJU z4%uQrbKbuK6wEb*1|+K(A4r*7bWYR6V1K>#-g@ngG25^q<XOrY(JZrllvH|B^KTu& zLMQ^gI*IV`?=r?_M~?f=`f;mw>emJ$DbrIi4j2==G*Ghm%69Ot>!xeSfb)7zP&|LR za_lb>VezT6&HhsfanufR+>MeMC3+zDaT=i$&&hS%VQN~w5CLRt{6*?yP5tuUv?-K4 z32}UlGUXV(W^cGqcGdsVrEy$$+h>dIph_8>?PcjM&(~a)fjwBAZ`U}_j64aw)1~WF zBT6J--6(bwC1o&2eeuv%Lv(6qNg^d1*&auE6U2PTsbJGwlp@Ag*VOEcQYkIZI&R?6 z(Le#svadwq93-@C3X~R?R}Bkso};`eTI|iJxBX2`2Smhwj6m6OOuATs$+*zaj98_2 zgXrXO+p*&{jy$R(=Gbg|<y2U&?WPst*ocgcBdp`*l5y8qhEG?5iig(+Y`kjG-!9u@ z*N;DcNx<k~P~xct&Xttf{I0IffznNbUP3YAQ-gga^-{$eX!%7_)sd<+gb?7WRtBBP zJ@gKJ`cwmhLT6v!6Fq}Ijm;bb6m@n;xnA>@8*Yy^9}<em?Iva%DMEzl=pHKR_^;z} zW4>N%J6V;$;G}n)yFPs%3_Sx;)z7qE6T);xONrau@**QwoHo@~`d2~`X`NTx?y|Y( z6zN&SyG*{K)|WOG5Dg&o6_?DvU*GfuusJY1{-TlGorp_GqHZbC`c>8t9*}-V(jISk zv_eS>yArhrN$jm1G)(MWbCvqbGq0+v|9}_mX7NFq;4t;X?3K^Q8p@=*P6>CEzp}QZ zfA;tL6I*LDoR4lmWjkGV{}TEL{$R#ZIcn_l<N4~dRw>)G7h_o2B=KnnTzLd9mzV=Q zERpX&11U^HURf8|_S#yvV<~zSIS*|G4Gj$ePc9K~#EfyM2RT}dA8Hz@!d$r6_sioi z(=*IUU5n^4=aX}Q9~9pu0Ecb-_S(QC@_i!x75^&l8;~_Rt}H33;B<MT=-!(q1o1xN z1Kt?Z(=zI9QgUiA1&Rb2;#S$d)YNq1H=jH}EN?z;5|Mqum^#r8%L;v%jD1@&D^EXY zY)j&j$E}vdr@fx~Yf!AghBDRtihmsd@XmxqpelTbcDO%jWSEs+!;Y;NvJp!!;0c?g z8YWUXbvu`qx%Lk|2S+9foS;$I*F35LRCleUp@yWP0=Yo7jDvkSs*&{nV%6_b42$0m zguc1{3dG`KncL_HYc3^yf)O71CeOD`Z&I9OPvK{;kvp!8Ff!v3+%QG@&nyA`gBD)T z?a4{My)2^&@1%c@fIK$HaIKypZS>?9I-gm*s(qO*Oe?l#bKFL%ykY>^(0A{g>ha$c z6-u1hAtZy20?>wU%G5bh-pIcz<)P5}sxYuSSM;Tz6Pxh3Tq7OS@B8~w5>N?hUy?bs z(==m$E;HzU;O2Tk0Hzr!5wruzZ8?^XC@0G~GUufQ-lL(*FFiYnXwP0t`drIVZCHr$ zY`SCO$_<`w)VvOiDB^TTYk2ThyXz!|*Ui@DW%Ytb4`DXA7LT4EE<+gF1Y!oPtgWm6 z341r%IC9p;n5E4*UF|#cyCFMbz_DIWCm*g|St@v&w|4{Z$|o%(QgnAV`RImYrEH|r z3S#ZJW#x~i*~*X4CH)gxug%F!;PpTwvq*Av5hR~_o#8x)GG}O)+KH%%`kPeff525p zS$S*t{BxVN!^>ISPy~adttN~duXIptYcE5YFAORJJQbqb$;BexV*!4bU|J9V341!p z_-WRb8?XIoVT*m`LQq*->k7FZfQ}n_82XIBc`!gyy!A_Ks}@lzA1GWq1{e$Yv)W26 zYP|VMqq;Tw7v9wPOyT)ZV53$N=j;iD`+^*sOoE=}ZNpeDZnbp=y1BS$?!H;)Pn~7- zLX`kwIgao!&ZOU>PSSAppJxPol{9UAcW2ELasjC%SnE3NxApitOLUbcE6m)oj(^T8 z?Vp!~HAGQf9=e<StGTEbY42_ear|7qZtCm`P15H<L_#t3Hs8O0zgFywi~L>1AqVap zsP{P;TSy2~3J*M;=tB<B=UR7S!|C28OO|L_mmZuk?W3BZ%!pmHmBSog&W#po9H6uv zn_r}CrxEYfkS}M$l<(08+B^UZd+YY?b0=!`$9BZ-M^FfHo$`?LE7hY7q=Z6IZfvsf z6^<?7E$W182oThapPEjQuAZr*Q+4(LirMzT2aJf61$`6wuB|KsQz?*O{Wc46Oh5;{ z(^dL2t6twH8|63=3@d*;GEYxR;xr6$61A<2ja11EA8F8^$@bIF&tEyLd|}AhSn(;{ zq?xLy`A6{cO)dZRr~A6v_kI8QIW<~mRpFDwSUly7#6lcNI=it^GwiXZ-paJfUG>^5 zyzMM3qK*MB1Vsv}Zr6W{riQGSRcn)dd7MFQ?)B^Ib4a`Y&qw!-v-pURfn3>TLQ#hA zcVvqAg92vC^=YBgx|oMlUsH1{rrBIE<vv0QX^aCT4Nno3XCTxK3X7*aF!vS1rzo&~ zY}xn5zX9EfD#rbfs`Ms&qI}%Z3C`DEF-dI)hZ@gSiNaI}nmOdaAu~DeEJyhVpFe-T z%dfbRuCUQk?`H614HiBOl=PJoev&aZ(nFyUn$V0)0}#A_E1Et(_0I1pEToHc{nQhI z#h#s&=z?-ZgHJ+p4j!w83MGkF`n>`F-^<3`=2=Zmj0+g<=kMP!F)i==F~A&a>kB6i ztCfv1lzECcbrMXetk5|`cnl7YfWd@`n_@-BVvR5E9V#}M9B#e3wjp|kYt=L4J137U z-1C~(G<Tla9>SzKAhJL&$3XS(14AQNq`#TmMCoGHoYaVn9sTW*yK^z#Y}r;zIn7AG z3_6gz3m|o0*4DOi5brBpXNBBPYoO#e<i}c|{104aEMU;sR5t#Iru6P;l}qcgs{e3^ zSm`RYr(C|Ar=z3ud%8(Q!Jz%~W@Pz$Cndq*d2kI%6y3RT!beyCqH~oyg18}*h8$pM z7y@IGuC}|zt?)oXlf&6%@-EK{``K1jsFmIAVR#QY$`e!z81+4bBK{h2I^O?W!Mob0 z<l9e&brM24zkD?xPc;OA#*<HT!6`s{TJu?BcOO}JyGA^Drw*}h@v3*B#IUtLB<fvT zUOI+IS-}2_%2Mu(H2;*hP1H1LBxXG?EdFvg*zlWaQ>Q+y{%2(&Ar)`nbEPe#2C|7} zBq#SBYBVtH&YIgA2ZwI89nWc{S*+n&o5ja#xz)DtAmVLRx!-+@HN2<^IqG=47XbT5 z);m&{X5f4{z+OZ|c^hweE}HBHFm)Y0y}vg>ldZ42h}l+-lHDJq8WvHXlPY0S!F%pN zjBYNn>DMhU8(`cQxICRB`wL6^9g4>Q5TRe&rzlX65cPb~g*lY--rbZLDJ)xK`E&oK z%$&(bOMR?<NuWw`!;xI%GUHr`<IC!VMDXRJuD^fW?`k{<>|L&CzH%?=ui3n3OBY7& zK?AZg`ro}W0!@9s!06uJJ7N+HO-)Uug;XOm&6}RDue!`w%*ASr7;y+1Db_GZ6vmX| zckf0MCykp3%UggO2tr8w$7niHb5onO__QGt0!f%BW7bcsZUB1{yWL8JBo3^+V4vHO zK93hgDl*8@NnaafS;%QQgNUbtD8NK4zOwm@lY5z2HX8L7opFlwt8<T#4-xS4?t*=j z#QbLsX>RK%T7Qi$%Gj50ftm^#)$9hsP?2#AQzI_?2UV1Hcg>V+Fcm@2>A%rT4s&wn zfI@L0!*W71X32#*v8SJErW^<KV7HQy^aU8O+nDHMwIxi8>q{$ZQ@1^goLf%QxH@gO z#u4s$V%)HMhKP3z^>{MfziItnLgEgQ^%Y7jT0E+hXJ~*!9W749Uo@2{%1&?|KwujQ ztkJ+<S|FV8s6;GS^U7i0>IQKcken2DFa0yzyr@*!Gp*7e_aV_Teh1Xb&L=p#pHuzR zKr)4=;2;!93${WKn(L#e@bxJj<fv*#yQ3}aVQyH!0zlKvK|td_W^#IK<nQ*<4nKKV zrD-+NrxO5|cQmBs6%?d1?yK(wwa-s(II24Iz#aMU`qK^?A8GWW&w2q@&%Uw-UaBZj zalNRqcy$L|dAli_Y?zdCsEVLwxAm4UL={Euv^lCr?_QC(bmw~PR`&R3L<xeEfhOQ$ z-ir3ie0Y#qo(gfB-Y)--{VU@~{*4G_skOk{g0N6Mx?-ML=ON6G8x5`XdvUh}@X3HL z^cH;55}bPpbyF;({Ox=j2E%C_f`l$uBR~Iaa`FLZV$Bxsko70SR8rWntRe$nLw8JL z#{wQNij-b+248nUS=~oa5FUWeLFcrSAGtGKO$&f-3StJU=C)Tlvu179JZU0n^h5#* z)F`X^Z+7WAah5gdVksaxlslh-l@&;>uwcK+&B%C<Dn6-MCoEo-?cl(tp`Q1!^9<n; zwvTq|*mGx%vrrU>t%-}%h$s-EaV;;ISDjjPAz*>bZN*7RA4H;dZ&m`?il+ZE9OZ36 zPfhXV!2)Fg0jIJY&fjV~6kOya*12tbrO0~iPjCENO$b2<2X0B2H~Q_%f}Od8g)K~) zcKp1j(7jpN*qj<<<e7cp$c|f^G6Vcr_cp#Aol0oJth}6@q@V5W19&!T#e+uMZ=Jh? zI`uuZogcL9Nj`~txNa&cltU+uAOAYzq{;F~l@t=H%hGknO3hiY@j}w3fksaZ&cv$* zJIae-BJ+R#x}WxMOnUq#1wMcZqfdT6Uu}3rM5xWR^mO6^ThfS(nF-@gA>U_20<kd( zwxhz{9dJD@BdkLj-UBNqgIemA8wXdy7fiAshZ*($HLc-?#y~+OPCOPiKT;)+#frW$ zgN7e|2CwWofoNqUr!aF8g<VjS-Q#rQTXgmJNaffjQM6%Li0|q8Y*X50wzIM)iU~0f z$3d^51|w6(k(vl(PRv(|g3v?ox?%H12;#3AU{v{IEv8>A$f8XvyuRhmXX}&|UbM;< zip(Z^=8S?*#KMJi0Nd~np=h;-Lan}rhQlq5%e%uIEUzCe94aYB@~{X`LYPgE1Oc&o z5rvb3ABfhk^VctJL>A}9ggRG0<dP>~&I?Qeq2>boqASilIsU=7D|4A@hM2ILG`e2> z6$nD2y5{ER&n_eKDx0ol*ta|=P%+LDFFNUM+siVldw_AI2$8)&IIKPAYUm{E>+i+X zqqdW7-{Bcve|THkdA)r@_RrI4O5UisiFxZ{Qqs$Jr7%^L0d)P{lzAU3cD#x)eK@~W z!~DcbzO@3BJd8<b5d=|qn2K@w6PFpSCr+JuFEV)I<Ry@&d|1c{<QBw7tf#M}6>q^T zNJSI5JL}<(X+wR3;G{i)PM?vMc6MEEx=Q66rVg7XNQ(vekse4ale@KzjjpZQ5Dv4P z0VwcPnudlro`N^ZH5oUkw=i1p87O%~s4HN`Ay~>3*~^Y|4M&k+loNY$`bDWV1m8g- z(|)~s_im=JaZ}7H4k=MBeSjCQB<8T@Mtt^#p`oESo3<7JBb)wgtwm~bFmPY|FAUVH zMas-t^^!VmQA<Hd8jDaUzuv`%>;0!5S*Wm9{=;+8KCJqw1WX}rQ|}G;S0k%H`^?py zoVi1Gf#6_lCWnGR(#TAIVWbMfQ>~qqm7iK%dE8pd>-&}OK?05uX7`hpwqepBGa#6w z)1+dnailmqWUF>~T!LztTZc*?@E_xqD|d!C+5jhPAbA+8`ZsjBjf@0@-?(l%dobGP zbYaK-@u%+rP)+AXA%s0QUUk5ArIMb)JW!1dGsBbTF?wd)KiatV>Pz^2IRZ+SMm6-} z1|8~cy8ubOzHMc%KY#vA5qw7DY2%$MWjO*~V7gz7Z?M!t?Pte@3m3+7*R_g*%b<TY z#^{H~e;g!Ttjqw_f}*SOMT+$k_L?1Ax0*M7`V<E9;G-HA24Drw*hO*Ezrf#e!aB?o zB1LyA+op4rQ^yQg&5M=IKY@Vl2%DnMYaqFafd}XvdQZp|uOxNxBEWJ6pd<j#3T_KS z+sYDV<O9N2=(INBE9SfL&M`kRBM-u&qFWv@Q+>-OeU_=#lP69X(na{tEvuD#vT|bB z)Q6r5B&@uuwDWIi1K$5NVCBl2*%v?dKwbm$svWGXIB*A_3x?U^2M?BPNE8Gg5Df>; z1mff(No*S+Ej?R99*hn?pI^U@$5%&iX>D%aT#}mykIM072=$$ssy<R!*tFG(Dtn(1 zQ*^bodQCe02VK|#f`KC(<t+)RkSAFaXpk<JzQ`#-M}y*3MTl5fJkF~iu;CNSdjzfJ zTOR--qzmw0NYwGdaUkGnMcpe$e|eKXLZN>z<ZzrH<UWftUuj7HVKeE8MmBS+4tnj+ z?yy^T8JRc`8$Go31A3S5bl-d{YL?fB2hW*?XPJzvfbcDDF`9m4VIKa6pT$7uvzea2 zbcqytTvO8z(aq;={u?5*Q*OJ|$4>~G3WTmxG&AVHl>1gGJtYl`(9tlh)mF9qJl#^A zRo<psPBin{NEJn5(WVh!VeS2HX-==Ycb(LoKF)cCc`i16Id39A`NlsAl7_z=H&;zT zv53dF6K1`c=&#kd6ALgpEKM9_1=h9cqK*1oV)B@xb7#1}v4Kdt4{fo*d}St}P2~&o zcm1&Zu%N`{b^UHGgjQ1yugCUMMv=*YVCAD2^F|$8bO~qc?bi18k2$H!<uX@S{;>Vw zr}yl;@qgk)gcIZM9==v8c*jKxwKc-mbMy$JRv-`Kl$%jtd&W*#)~nn}adS-%h<QcS zxOM+Vo~A{t?I0Le9KGW`6$&K`5BD~d`5dnrBNc41-ty-p0Sl2Clku%vx8|6Zy$>PZ zx^-H)u9p#kk|-o41>FapHZ(*iCa8WInrYRtwnau<I5=ABdoALe9zyLC&6f1}=M1s_ zw!d%d7*D)9E+#Ts4JwweDYy=txO(%WGiRKwh&HdP`7~1=Cn`RVk%5#br)Hy~QzxZG zTIiG$4o6*7Le_G5`K3L?j*?3Ho1Jm~C38R4;^+N}mkpG3&K(v5#=KY<y22-*Fm8oh zgQ)A~VwrmG17A$A-Pp5dAxPc}Er6tC0)PR5r${sgkZoh|O*igel}j7I`4Ulc${Wf= z07_(mTy$O`6|RU_q7lP~FUQ`2UZijIKLg>D?bL?!BJr3TQyX&14mwu3EPb*<|5_4! zyI$7Rxa#?Sf8QIyF6H#y`AJD9nF2iW?M!h2^R(kz1!>DUcVY70IcE>o<ojpA860`I z-rc3|Gwb0-5=KwN1dryN{(Pn|7u!7)vc!aAIG-`)m9gU5dR!e<a0gsEH2&i`HY?gE zLpi~p7lwz2yY&dVf(4N=d?<1>v$V=WuezdLt^fq%8J_=DDeY#d19~ilsnjD#h%CPn zK{?~<)o;B38`a9(I9=UIVUm%O6x4q@Y^%asOipEA;dNEKM*II)MlZ5L$Kjl<B((2^ zC=Q-HUvs&J^)U&?;r0E2p$==8cphGwIP2jYVm%KvyJ`*xiUH<^>FP&A-qt&VSLYcF zKcwFN<Hy@cPkt=EWWH&l@V?4(p_$yQz@`58GoK668?IUIa<ZfmCSK9tj>eLODzej1 zMHCoTWKiwas-&cps-&~^9*UxcoMtpAb?i{WbB~jjM0?kH)8DuGf&jH<zH$kxZs}4f z@kC9nzba+bTK-zdXL|~lU4L0y+rRoLMj;>-)GRTx<%~pet!_I<)q>cW(l9pA@UT0s z=^YyKd8yPJaN*DdJbUu@_oNFSb(Hr}mZ6!&VcWJLYp%*GXnP3eD>;Yh)wH8kq%Y~R zqmKk}pzN+}Zh6*yv~*obAvPL(en?4k2G^}wU$A#u$m!Fkqlre*#j^rv_3_J>u2Lj} z4m)<_z1ym@mrO{-VvUM;)hbjOI^m5=#z}CZNCgK0cMw?xcK&$1o*4TxxQ2%GV{gSO z{ZPiT6uXDf%m4=GoU0h1eciTfNzdbL6S7~f{bjG~yYbt5W*pC6Vexi?>Y?y(9q!d= z@m;e^YL}%|W}$+d$Sx19!|2oGZ5-J}&p{?nB9$Spp~j{HLGh~e09sumc<?|)BPU)( z@3fod@LAJM{*X-_w@hwqe}QtBcW%a!U#fW#4-hy_-dpQ6wdTTS<IU8DR7C$$m@Rjw z7CplBVCBaz8W%5@yJH-ATYR?Ou|>8toQwm?T&-gKN!k+Tr<?HRXi{Tevdq^GJ~ZFm z88j&C^_H>*>Yq53UU>f<DtwJVG6T@w?yIW=K4u)OtlwJ*42_yy&>+L@`^DL$f;#Gt zM^onB&jpGt5gF;^j7%3rvM*~73%S8X?a6KK?7Ccv)lgJL33#!SZvc_;Pn47M%9Rx@ zio|{*Kzn~p2*P_Wata4?qDTq_qor<1OfKx4YJ)%AT}%)G`rc4<DEky0<?ljFj3nOv zNeST@&)GrECdJ*h!04w?QVVuDlb;kS_@SH;!smmXLdmy80A2?S{icwL5nLs$Itt<L z*WKQBbIwRm9X~ApW5XmiypZ^fGQv{i1?NF}A98kO+*xC0zH+dW<@_nqM{{#?+5HM9 z4L_6vXvNIdO>DaTi<+84LQ(&q1Iz!5GD>c<xu&+5<d;MM>exvx5`w_rzZ#t~-Sara z2DnsTe~6~_Fu99MG>0qBII(2%{`imT$gM^4MRnQzMF{)71&tkWjkQEl1}=+gm>_A` zMg8gDDvg5|)?D?umf);~*iSrI*<Eq?@G5`O8jm1|w7>4|$gdKkyl(_?EFU`vw-n7_ zu|NEFZYUdn#j-;4u*&`t&(53dCjW9X996mD#NM=kG=!EAM^PZKC{4?cy4eK~2&08P z{faGs@Ad|E){h*6FiI)6=FP;i@3{y-50dq#Ru+tQ>8gc}-OI((YM4RU=<N`p$O;F= zii+;u4I$Iyf%@dh?R1X)Jf!tTz>t~}I^y%TS&#uTMxIxnY&_36x*ZsFJXyX8D7?P$ zWwA5BX}w^#^$m-^j;o<|zS*-%!NHSEs&Qs=W7vPB4G-^84T}w2J24_)u&`q@fpzYg zR(lyyi!?sZG?WRTmCTkg)m=ik_HcdmE7_Rs!{1yo@1r5Tx%K>G{nAX+JM>UpI}B%9 z5v**%Eyjpru&HGIgs@NR8mjMRKp8xWt4`>1{oDyiFXCx*D)>W>z(apUt-ADmy>@>j z;W!P7N2wXhLh|p1uLyDM!mQkm8vGKI68eU~rj`~xu$o#V>tjd}>>}uMV>>bCyF~_N zt0{{(S0Afy9u^|Tue?ldFF;<)F8L^@S^q7QG(6*dzg!4Xv>NvPh55IT1m{rrp4`Dk zyKrN$=*dX#@@jm<%BW2&gAwUB(9(?qlAmuHRD9(yMa(%n+k~LRvWD;5jU&xH6-H9% zT*2zoh;H-&3Rk@Cfm6V|om6CZK~rYcY#YH=w+W}(V)f`1xG=uM=$<<{!_`kuMk;S* zRD+qJ%u@c1+B<7J@4xkUz4od_fETRQfEzV#1j%1N(w9QuD`{vJ9-~L2HOF0)9}#W4 z&GMhP@;?-3l-nZN@F#Snk)NsGq|;qv2yCY9lYHOFMF5d++4Suzy<=YzXbdK>Djero z;61*Rq|lzJd;77~j!-dWIDpmM`2^Q14m9#~x3{nDN5LlT3**TP(2$X`u}oPNM?CvI z%(1hog*it{pM^I^8As|icxXQ*3Xhr`6XDlsWvL28*=^+be|Ecbak{W^c!;5PEHTge z8|3d6zSxvGd7SKiSIFr&ae=zSG#IIVVeut{_TT0eEA1A7Jc~7Y(i)>_C<D9z=5SYJ z8W0ogdI&z9-%9Xy??$&aAAT_K?6T|=2~8m-^-pkNZ@_@4v|R3jJ0iE;YGqa4w%v&d z&Jz%V0r!R|?;E35R<NM*M<EHuD@4-qcJ_)Tv<x6UtfDLI&|}S=)5_bFETh);58b`q zat5Fuk}fY$VaX83YFqW8qybCJcJTH-wpr0aOpsL#(-#xs+yYCg%ePhs0Uh0#t^C!w zSfk)f^KT`E66lnw)J0px2MHebqmQ5koPNP7rK_s3t%)th*2ZQJI9-pWu{tCcy`D8= z#?ReUc4QdmB_+)fwPOQlS79o8y8dwH)6hczbb+s$w(39b(#rZUqpG*zq5A9`x=Iej z|FY6n2#82Z+M`xhTcK$}{y#1~y>VghMDZ57LTBpoOS<srZw4KjPrY`j>5?UqK*u{! zsIQMJ??v0Cg@(MYy7ALO(y-nNLW=yLeeqHVMUS=>Y&`>4O(j^K9-@sHA_;JKq~GZ! zjuDKt2aXkN;%D&_ZKg(3%c!07jyT7aN6(gdkIu_G0q2wlDAV+nE6X^!jLpmgNKZOJ z3Y0%AtyoaQw#f4>lYkagWP3IL&;jUwG$97>75FFi8&8ZN-3r1oD$u{{)}C1B=J}t9 z+G8TTvd^lw0BxeEl7Z{lLhbs6=U4uiRolJLAB=O&Rbx1y5;-9)&puWU%52fTz}!8u z*jzru+szn)7~=+MO)^GTul>r})DT<UH@rS8Iq8#2^Gq^vyiv8-libGDV$xEcUgL#v z1kofF5xs5HhiVS*N2TwlA39_p&`cuI0Myjfh;~QrZ_&<1mQYE(7@MGW_*~85Kb~mz z<3Qt)tXiW~Pof8LLn4Vt)=t?46#x9A(BGX9xYri=TaJo`L^_7P5GCK>ps~@lpCY6T zyRQqQdb(HRQjDB(;q_+H#rh+qBu6Wh)L??8$FS3g+j`#S$1M|smF4*P13Aizc{PDA z;%;lWgr+u!GX5>#N^NcP(QO09s8%rs^B5_b@9W0u?+?U0^fLrU*(9W*kjHUP{AL_n zyraK2*Md+KJL9D5WgGR{%IfMrC18i2Mft}hw8fos{>=c}IXh+5IdZ>NRC<%^zVj)0 z=cA-<(P^?ks7q8UdrB+^KUY520O@Uoh)$cC$5Jqi5k{_q_GQ;>hgoIm>c)}rg1}%^ z@UX2@(JoEP^{T~EQ6Cj~HskTfjX1<bRncaQ`yNe5I8gHO1m~%O?&ap+lb6Zu9Km;B z(Y#GhraPA63kc+*(F2yX<*lgv5!kQiZX>}*OL%=y`Q9A=FXu(Y&5;UZ?1YkWnId>Z zRJRm(<5@ZYL9QCMW#zb|9XQI8#exWzEG&d&yYb591*uJw%D#^gmZ9_E?|yQ{rGH7; zapFinxkBy^kiPfJ9Pj20az>Xz=8S5`yu_eQgjMIm^+%gpTjNAB+a3QLt3ufG<%M_6 ztL3^=_s_e9eNd0--_ddiT|XI%R!f^y%*C-V=d8@dBrBA|Y2=D;_4K^jnV^;5q{yz} zM~bi~AwiRw95-tYci$9U=xu9o^~x28k^Dp6roF_j*+fXSbK{O@juz!}#(uw6(X?mC z$-Wr#t~iwqVexQ~@5wLPX3+I5VxUPy_@Ri1)-{$x0A{A6KxoibCy`)$_?rOEDj)pK zS9mn0@K;MGT^jCEj{6wmD3Cx&_jqS3DBhd|X9J4p1IRItYV0Va?&m%weAA9B)F#o< zn@p`U&Q%ZbYcOxAE0k={{Il!Vg}#3NpN0rk=jUVE3#Q_}NaJ$7w5Xj#L<7{ncRhE2 zpbYfUNL2cvRsGQZXS~?#H&@q|WG5vZR58Xh+%|nx^06r=A1Y_ce~>h^;L@vJCZ~6^ zZ3pg^oyIGl*T5}4f0P0iO8K)xqg*X|Nj~i1hvsi+dzI&l)J7|IslRpKJIFXI@oW@P zi9Fu-=^JVf=55$ARM0tk3v~~#JTd#&;@vmPo=r;|P<4E5OoGTxPZ#|wvkh)FIfJXl z9{E}7$Sx(Q%NiEH)!>NWV;8B=0ss9Md_gFp<F+=$QRk#a(VhJ^;q_-$wn-9B()`1Y zDAdaNn@>(RnU>{!oOIyg-#A>ZT)+O}$<FXYhYT+)-__9IROG2ZOgS9UqX{%VjTD`@ zb!&9#4DByslRJ>~h(|e1zO!&oTK2mz4fa;&s%Gip&pm<wxW5c8*2qyW?EJ2e&KhQI zH_xM!e8R=%-<iy5vil_g)F*$+QF`aw1sAKLucH%#$vlL_V=v_Ah3q)jc;^gd-q+xZ zL<71xp1`}UOw5B&%!s~zzettUy@RD3Fjb;*WPc%1q8nqSDV;MS2fFj5goVm78ew<h zK~2KlH^vOPtKlLpbWu`Vz((T0QYi9<BfL@QUqT5*1j+t~Ft+0)&m!%r4FA`3-SS#p zef<D_uzde5TfR@4^k6SWdJ#=9*yvkxO2(nSf($E8u=0*0_1STlnH2T#htd<%(n82p zvBp$l^#unE?Xi$2%EnJA>bgqGJ0Ad_W#J+-InF&9$+suqFPqW6{6gDromR;eeto3= z4tb_a*XwhnM-b_s0+>yTghWuFYM5;JywMjJr70`=8;8^ZxqTQ!cQT$|XRDC-i_$_~ z+K<26v!;wpX*Eb|{+-LO>DBPz;mJuUU+3G&8KFh){?yd;syO|!s1te)lyoz-LPYxp z;3Ek@M@nAX)6ZaC6LrgbLGtbA(>Bfeph8GZcFLj#4~00ga=|JXgvLDU{^1?i&ibz1 zv1`B%K`OXN^xeEhT%fS}X2X`7WQox8_4RyhYaEVYkzo5=dE;*KY1E^ei4pMwp87X6 z|7X?YbhW<tKn^>-`b3}n2bv$Q5AA+2Y6{&*XPf;-Y$%>0-KIz)kYcd%YSPIR<mH3b zTvdIlsfcNCJK@)&yxp%4?%wVBSkr`d1%K%DSx_<P)5)hb@zYfTK^l+F<8XQ7iJv+) zX_Y9uiYPC^bjlpHjX2J@4cA^x=R3fYha!SAliN=SHv&mL+<o@sDk$<T@<=@dYkiZu z^Ut<q;OcoYw|gf)x55^Xx+=mf0Fo=0<hVdtSFN7b&JjzOAdw>ex$1Q+pJ4crq+_lj zREJG2_%#}IzW*XFS^l5jiAlbGr~B&oqoomPmoK|;u)vl&Z~ik6YJnze5p87tPlJ|p z{VH_2Ta{(*T?GF8+3)-vuh1FTyuCs>#6C7PArlhd35(ivNd{z6pwGHd4*Qc%(T$&X zqZX>18T;#tkBlJTlz`=XH2MVp6@EOalPPDXljVb-b+ONPz>KpG8#XSO#Iy<1xJ`Sm zAYh^Z!xK#*@*z$8tQp>QhSmHmzpfQQI-%aNnjwoaHpo}$JTU*KM`(Y=V4mfruC*=O zw%<D^2pDvNJ34%+Lnj=>aosw}D&6)O*Cxa+oy%gf&1HsC#N2$l&{a<*Euvi8YQ+Qx zM@KQjtShZXG{NcmgARN@?W5cO!gA;1_1V@4bL5b)!yR<}Y*C3_+D++SD1Bw55`6hr zrD+-&`@~(yFIJHqiPp`|&aMCgUzZkb3*7Raww0zC%E4(2-2XR>hC)VnJc^ywer?Uw zUy<N6{e^lI#u5;wdaiM|-@iXECLH4Lwm=9XN+KEGnII^&eEITbC$UU{U6bRAeVQBB zfS-1gFtTjrU~EJOonB$XaR2F}yIJ^Jx$55+nv7q%GiUnF#UwRSpjC4|f(3U$o7&my zT$JsXlKlQeO|rJ5V77gW!uEVpxAs&tU1m3ryPw_}sbU<Be<^fE?8?HAUKW}smPAxG z|1ba-n1woqB&iUDG9QWZ2i;aWqS6}*#?OUgisF;*r7Kr<;%jY3tT}RVq}-$R*Ag)o zg^Fa*UY+qhzMcfa?jxMi4)3P8U6&-LdwdGh%;bod+sBPd)I>DDd*U)VlQB|HpQAGF zB`DzY$4%2GEPjcD{EV~CRY#CF&f>B(KuWk2`hP;Oa@V28j$UX$w}Y)jbFNN?Vsghx zcWjm42MHvkGw|P#N5l@P`{(mDL{JMl0}O}?gsShm)z*LrmHo4oJxHAHmOV7zpb^7f zy>=?L<e^Y5?VzmJrgv}Y<~E<4<?>2g)HAUuGl|jNV2srFztBk)d>GgW{L@#O{Tgl@ z*~Ywn0Gps+$FoZ-1P{+;Q(+?CFiyhE9~xrQ5A%ZI;dU>DcJC-B`;8_w-GswNJk{KZ z3KN|Q129ot2^RkxBdVpdnCM7gFV3lA`e3Vf0uYa<$_SwQv3$tj<(JGixH?yVS2t`3 ztZdj~gv26nucO7q9`2oMSFeu#@Xbeww5VJlWEud<;VI#QC~2F}LkP8q$~TT`AQiwJ zx!c#@&1uDNi$hDvG5%W#lx9Ci&S*;2QBQ2JRln95M{-_?AW}^GLbiqM{e~^BJ_@Ml z5FldC^3hdNHcqctMh-q<KaJ07#w}%gF`S<<^eW&dh%NIS(q~N*bmBtt^QxJ>v%GLt zZ~s&&40S%n37{<HIzk39Gw-X&V_%)+-n#I^gs@=5m8@rI*FHa;od2J!PyU;5<K$(k zvk(00P1ij(N@h;*kk}PlHe2){e5nuTZt=UfzDjUa@*z(;^o%2QTGtXjtaf?VYypGD zsy;mg_2IXxM%dr53E>5A2~FBNEd(l&lL&7tv>q~NWbph)%v;U>W+(7b)1<J-cv7nb z^3#o1x6O`fc(i`L%sl@$63BoXuL**vJR8aC&q;krx8?U_paqIzh%(H*REvCP)b6M< zCq#I$k=E7YiEOT_%XPn>u8RiMz2@ahpB6;Ve*BpW`wK_$_r)Rs)EeF|TW&+_LKPkD z&Bl?WO7G-$>>^n3<jim{tgEUiBLv~g3gdZ(=8h+0V}G>1yt-Rl7%U(WpORlt5a70H z)23a@`+CC(AAY#LU7TQn4_;{AyP>;8=u6JC#;@{%8a}8%S;ND{U^1W+zfU6J*#OmI zcVYQ3Ze&j*vyTj8(Y38wyiqI1o1WGsPy5bWkBzR^teY<Y!~{IWp$%KD1@Q1^M5Ia} zA;7KRyTx{C(IE%SD&mj<xyc#T8q3^f4$_|_CGPpnW><fLwLhvG%Ggk@z_7^++#^_d zj#}B&mg>*$fq$y6n~ICx;IKRIKtuy;>%ZwPPkw$KnAsotIF9x2IlACvs}y~NL1!$~ z5_sk#B#K;z92mO|MMK0O$tfItU^%hnAGX|xbB+n2=8g!BHzjR(v{vY{XerUM*1d?B z!B&DGV>x^ekW&ZjW8aOULCfV;Iyzb*W68DyILt@#NL}4rseaWi4JArT84TrCTTb2> zgqs~Wtl0iXFc}t#1@$21-pSQ<(zEL7TpJ`*wv}_C`0|YYdrdxYVGJ${gv$&}wcL;- z^8bigl7P39kW71My9$O7fWSb4&9-M69G@XuVE&KD^GR(95%9!Pv|<JR6R-O7iRND= zAzQiZ`y<i?t_fFQvA-c>?s|xLDm0;qx`6H{ItxXF`AFy}BQq5z%K#?Sb|NqqCRQ|y zUTyK9*qqcrt0*TJ@1Xi$G%E&p0ASBgtDIHZrYqgApJGyFvps#kq!}z}*%XwN<X)no zwmW`f2De(M<I5{*WocMxo&5DI?d?O?P3?_3!~zV=-%}w%Y1X!b$5eWYUYn+^U6NCz z>jMPsg6r3R+7{N<R^NZ2za;WK))}CY=a_hBv1@)27mzm$idPL`<U`Nc`Gc&%lVZx; zVb}Mol-3IxRCtcjG)W_{bFWAlz~!TJe-0WywX*BqiiDvzx0o)D{Esw`k?u22Ch#nu z;NzHtNNKcG{0PIthm(?63BC~Gz)kEaXS6mcNoTCFl_Sn-ddG#JP*V5A1UKO^{Wiml z%&<OhX+G~oHgo=INBI>aZiOgIZH!6KkUmO5-9<<Fe~aIG*jfcok)A6`!um(LI9pFC zBHZ!#I{En~mELn#t~}*rxmZ6gaf)=V#p>d36r-w-2-%gKv<PHXJSbH)3{GBJcuXP4 zP~l^|Y9uwz5ab7^%Si1gYS~6i(I1{DQ)pwXx|BmL94i$J-$)TbQ2a$?PV@;P*A1)p zAwX~P#IWyXCKd9MhU1ouJBs+j`^)Q@{-Odw3N<+PySOI{zv{-Jp1L?qdfMZF0g<KW zbu={2+)uweXlTpAaVu9&ku(&FuSf}7C1yY8%riVZPFN^thzp`qn9!p`_1aHrYE0m# z`JdL0J9=Zb*}o_1vt1DcqoFp_qrmyRg_>K+^G%2%0SLYGE!0kbVaBIObSGV*`Iau% zEYuRYlyk}&(Dx|7XCivhI;U#Y)ZDxR$2&(wyVs%l=eVg<1!d7<M6NXc!jZj#&Zvep zL+6Oph7*O?yB%N7Ff!``@vg;0O4#(Yu=qHMp!Oo8s&~Yp2P`!+A1ur>lv!wG7Q!SK zim$YQxw}MsS5X%-rreeRZm#=G2od3F!u8gjbEv|tR+cE84PV`O_?gsprh}rKW0Xye zw)1PU<lEA{i5{^G*ZBzPVxMHp0N48~lfRKgZ1fG@HwuvK`Q6Kjski3#u|ip>j!m^; ztByPBDfQ4|&u0jI1{r-L)vv8OQsvwJd2^KH<+HEbrPU7GKkvHz7NG+WwjA@fwcwyE zFRdS>d~bu818$K(qCjdNrhj%ykyx0)&z1T@?EU+(y$+jRRr}+FnTgd>Z#f#Y_QL+k zwGu(O(@pxak%kh7WJAH)jz1bOS%Vw4_%Z|C6{}ky3|*`-f3eKo_>JUN)uVc=h%wPw z5cz(9RIty2OXfM>mgl%_me4KC%j>ixcqp>??LJ06-~}Ua@wnG++ue0y-O5gL6L|+6 zj!7VY&}HPRm4YhKq|OQ@12`i^$*PkG=3E`+M4Oah%Bs1+H_sqZFfY7VF_tL`GnkgR zKzA6JO3<PUYv_&KyXZnNO0l=7(y(#aqu?l^hzV-16^LczAjz}nG)C^ed1hby$7|TT zL!WOlnF)MI7}_NZwQafzDXW)MiZUVBpi(K-IM}nqbG0B)lFeP}FJttCWL$419z!Fu zQ_{tIs_z|V(oEAXZ;K;qw-lnp_YbA8C&o+7q4KyK(yp8kWgCX4igi<GR_%6Vm6wP~ z*s047ZWMXmgy(crlv5n)WUTokTpcVi-$kpGDiZcR_r4A0dyvA;w^f_dTDIiY92LGI zOLu2?qH(=tprm1=?`c*!9P;zo2#7O9i9R|fwVfBZN3q7Dm;_H1V;zgA6f_>r^qLx( zjYGiDSIE&cnTTJzRYTfqIjUb@-;PYK=n=hxvm@)X`v}W~BJ#jEKqf|);q84*eB-L? zF0bYgc~L;}?ajJ6W$agbRZ4veYg>_S%$1pEXl9N(gQ=-B{qp6cO&DwAkZx6EhzrjU z_Rb6~ep2jtYJ|`!)Qyw61%XNMPjcqe7u}euAM!MvUw+93&SS>I2M^SMYj)ysYoM1& z5NNbGKPqhWk<xV@#Tw+NK5)ybMv*Lg;Ep6^886;?xFk61^b}s;z9!H2^_{jI_ykpk z9}0Q?*5fl!c%19sxE+{%*&j2`xoet4ixnvw%ev~>NQT$T3m=8A64}SkOO2Ka#)b|i zF<RJ%24`aoF)9g(uUs~T#n)Z6Sb`?!1=hz6+6u(Gew@rHg62{06HyQHQ$fw7#HE6- zr03-PZZ0h~-kZ==jwdx5N-G(!4MPmrf@J}doQ>DR=?$AQ7opEc07fPj_IFQ{iWNyo zq_sX9*~9SVJG_zUYHLBiOVK*Uq&AD91QyBcDHG}T*rI6S&}DsJJL6=tRPgJ|s`rQX zAE^&Ub7&yY?{MLfM9@65XNl>rE^nuUnQaVW`mQZ}u>DC2ab$%hnQ!8pBn@d~7iDn{ zSBeNFQ0A|lu2Ode@h^jjh9s8Di<|;8xoWd|VsVU~YaY6(vBX$KHj%9-&i(IStu|c) z)Fk<5m+h00JUdPL<){3e^mEy9Dla~^XfH0_?U`<&=6y$gUmE2^XYckX6=Nl#OVQ{_ z4HM5yY7lV0;KuhKNGL7U^#LCrj}nE}0sag(l&PI8*T?q4^4^^48<>Ex*sLcK1Onja zTaF)sk+XkRZRQeF!YNM;I8LF>fftsed{Dx?C0XKmj_oLw4($k0D4;#4G>I0<Cziw$ z?4?C1Z&yNjW3xz+<Hhdr+D!`$O}TiH668)FLD4?*`6k!g)ItW)vq1F2`|O<^sdC2I zZ+P*Q*3$GPRB{kfL>wBgoDVqfTKOTLTUr<|4>I2B$r;&V+QmSc!)mci^;xP~Cyt40 zWJ2@|>SmAk7Jh9}8{+?H&DB%v+X1r#jYt(+_pItdviVjq5Kx8G!Ok%k<@hW;JzEB( zvKuz3BZLAB$i*#I0ke$AOY8u>x!?RF0G!8VuG!YUg3C1N`aX1|amvsLBQo;)i}0in z$L*PqCx`OMjVJ4FPQ`zQyeMuk(G{+H6I6^}^0$7pQS-O2ZDn7q^r*&nufKMJLGOH0 zl5}|+y}mP1so;qv?Q59uk_kIbB(HmaY_;7Kwh)n#J-x<FR0H#uKj{E4q(q!I1ZZ4! z$^0V$*#x9Ce5<y?e*k6Bdw+Hmq(JLUmb&F(-9dPwUtVFM0aqYIixm+~^x%E}|BicT z{%(@MA!`;MD|7OvKD&3YGT0?BN(xwOSn*p6<HU-&jN-!3L3$Vb@>3I*PdJBF+m#;A zg_^^k7r*^FQE(tkDxspu9EYY}c)g_1sZLBcWycFAuDKu<bb86Si4c=4^R7h3D5Aq3 z!(D!t{J?>aH4p6s>v~J3SR%6R=g@U?%>G?!_ACo=@D%B3u%@|H4YIj4sS-tf1&yjI zn@6PZ-lg_g&Ilvad)2Tcj#3HXIOEisYp?o1kM2_`jl;RDBAiFt-P`bRe7vetblEY^ z3p`2VC<>bdiFc0mpc6TZ9;p<t@Y~^?vCe$Sc;#YcZ$A?JE=D*!lS1CNe7?LGBNY{? z0Gyc%qdrb5m?aFm-uq+QRune0rHBi*m(0zXa+O0I>)G}`t($6zUG!Sdq3+I0GOaFX zqo5r<a8QZoDuoj7#EMrgcV?Oi+LA*jBu$Vm?$3%$)FJ)t_ev2Gj3G6lmq|q~L-gZK znSI#(&Nct`Q<ibyzxe7h;}4LrE)jXM2#`m_B+Qf#DIFuVyjPHfP-iCB0APflX9XXD zag@_K<aE;zxbMAjW9H>$s^;5Us(uUt^}7LUz6g7xba?&z%}=7x(p7ELyaJL8iu!H& zrLAjd`xAs;b@85M<HAN?%ga;1j!POGbHYvZAprj3LeYt78_wkB`de0H+(3c%iZaa9 zloVrblN1ZJt}iUV%c*!06E<Q;tLK!Z#^r9h3z06Ha#F21d`;q2m3Z!x1&w|Jz%aJW z1+tQ(hyh*?9FABt_qETz_1U$Av=pdG-Qwl^@qO`JDb=vMlZKQP6A>jIbkcg%9?Wu= z`w2^;Lu5P@4E#PlyJRm4j^X$!DASMz?A0&UP)V$?1PVF*V#CaS0@bhsdJnzu-Huq{ zRmnBP`Lz&qKQB^c!$je$8BTR#7C}xYBFC!X5k1GZ7-t;m&a^x76^e<$Jh~4sQ@CNx zEG)Fg$v;HSC`+O!cjZb&=jhSa>y}@G<78FEq_Bg?TI#Oan{raAK9MhPOO8o6!WeoI zuZ%ZSNQ!)jZ3{66eFb}hOo@K|LMqjguz2ME=%y(h=5+0t7G7_F%!a%&dw!`x0vT2# z(jKQ!!fO0i@Myr}98KwuaYaV?r<_z94D@$BZF2B%?KA(!+tI`0t0+$D2CwQwF@Xs9 zN8a1FPk!|9;U(@RDS-_m4+)ME%C16SVz`!rXhg|*P}<lpt_vt#H)hGW5|-2nM81bO ze#Nf}^;ROLj2tAFx4aP};M?ofZq{M*&#fbEOHzE-WPZAH)Qk@{JX}sT%<+UKn{!X( zZES75DS#u*;iWZjLq{b6#l2`;T}rmF*}!V0mv}ZtTMwvuM5<lOfB$8C{^qkV=s>@R zSjg?thEmPd3Tt28+Fs15MzP^=o}~(ngCp^UrGbESFJF0Vu9+NFf`YK6sm@4Q<}rAt zNI15%(p#&<vvkW1m#eQ_L}A0Yy^c|0WUn3#&1%eG^1?ymrI+!N`_KI5Rzj#@r|-mN z^By^MUpb?hd>Ma7$6Y`D@>>xydkfhWZdt3h+LpZKFP%xuI#hH&VHwhnAR6_|FPX0& zpr9Q@qu%-S4dqHZHf_3}k&*Eq4R@mC*X-(+C?<jfOi)Z;HQM1?f^ceSqLfg8Lr#Hc z?t3IZg&kXDG{nf0{uoP)4NGeS{<NILBF<d=fm#Imk^fy7`3xh6k524-9??Za-Uiea ziG2qD!Bi^EfNUOleqp}dWI#ySVC8NRRRuU{ik4On@o^bNG~EPGbPK{%rHGSwg~%&j z%R%65TUlPA`S97M=_J2DdGp3D4U0S*8}gqV7(+Y}j7~Z?Jx@srWa5x$-Yj_JtCfWk zC%>M24zr33lIv61m-+~Y56v%LGxfx#bhXWF)(Ooz=PQ~{5C&Y0SAw5W?Iev54O^Nb zRmP%_qtfBc`Q{w?h?3Qqf(-~tu_IwtKg5yWww0xLUsBR`0@7)yJ1v6Odl-H-!5p|b zCZywUz^cge{{UryZcZ?ctmC}N;g39nst+#aFD)&Dcj(t<l9t^oh~wJ@)b6Tu@og4m zf^3FyiQA`Dx>7JkExiOEOu25ksSt!R>GWZhQW9f^_LCI9xozZP;t_IdrV6*ecjUcz z{(P*shzxIT|1&r&{;_Ci5?m%6TXclpw5et3^(iaP0P&`CC8HAdx?S%%xa6AwTA<aL zRzH06?d+RBP`wd5UML!JXnqSM$Xmn;=3MSxxF1sa$Z@edhB$7)1ZfI~fkJWmu#gF0 zlkq%gbbEDAqPoPB{I#pgR8_=hw=@1epOih4JC|JDF!+WY52sh|kP}`Yn0kmdVp#I? zB+HZ+Th1;!jxT69AQq*GkPi&($4l4c#jAee1xdqZIC$ksgY4_qqd-|us(y2n|Cx&B zl_5_Q`sRmGnxHC*Z9EjTdI#5ymwH#|b>p>@d`Qa|YP(nrszyYV#NzkW<e0pp@i|vM z#5u&#g-CG3_Wxkk)uL#mV}+#QLQRta!$Y3jNmo0i=fCPRgV>a~^6odS?SaOXKYE14 zcSY2;7A6rYBy_HbJRgCL=8(&b%|s#hV0%#?sFy?tpKiGb?X*g(4CDkNJ^s!+?XI(o zoV?SX>o7T-JF(=$05%9RBj3U|X8qn#FqwM3x9oeN@fREM0*w%Ep-$<7DG+7CpM>x4 zCH#Re*Rok>e?qJ%RCytSxMJb!SV6mqR_oJ^+#!_=bFCA?*7Pg>XlZTjf3&jM=x;zF zUeHJBYKs|77m;s;z)k<>&#c0~@B$uWG5Zm7(}tB}t#0|;sV8&?N=dH5wPH`6P$3UE zwuJP%ZJp~AEB5mTuuV$p3EGY!&w#68);HVSZPSGyf;&aldzfmRORbg`7TL5<R(mS+ ziZ1KHUyhL2gH|cqkSXNi*>ea8P=Z639Cy^%^uqG(e5s-2<B0^t1BA|IG~&yew+evz zs52-P*<0gQ0u*b@WIi6>xQUEp58)wD6So}R-Ae_(-W|Ba3WUfzu$5ara*|odT~7sQ z6=0=PYGtF5lZgeLWp+$2e!KCCnl+|K@)wVilXnns$s+0)YGfJ~3E<jEEmmufpzZh4 zFQfhyh0v}+=Jt)_s)_e!obdAUs?Cxm-!@Re{2B`g3Hn%W+7hs_N|mKke3726*8Hep z%X!tXYk;xlH*69l4PO$O(~KmTE35&F3=J(c)EFjXO5)pwDN8NUkDJWBi#YrlT-ZX( zC<)TAE@gCekr1?P+s2I-`v^0HY*QJ@@nP|mNJ&pJY{VoqU43yWmckiI4%du3YRE~O zj79-(@f$)0mzh)$By;0#`e#s)DfnQJ`znywGkx;p$pe(MJ?iitrp}X*ln6S@LXxd4 z)vs7%T}(pBJhSsej}fCXJS<*4Qe}c=)G->)*2<3q;tA!07|bMS5_$eF%vu8b#Rsan zW{xVGN?Oep5=mZaNT<GXVF^2Vw=Iu+<Z$%ubtSmFCQAj^r5KKX-LlQyAfPiF<gq8M z5o3lQx<!sY?Hg01y*yl9Q?goAkSL5V@#IFgqdzIAve`+fQ!a0dNlIE7<<zVckr?6h zO4OXT>XP}ta5=<Utf0y931~VDt=A8~n(F7z_X<HKkt(+l>v8b4i_bP(xsp17Pk^=M z8VAYTK@=q!tZaIt=1br$BdyKr0|EjHRwdgWivQS)`voAwLt!W#K|^u;sP_sYD)IKZ zslJ#SPQ#$rlF9(7`*w}N9nNs;NELFgLalXfj}|(wiNG;_h-t==ka9Wf#^gt4QJC#? z?bS#=_7P*ojHzqum@Tu%t7C^9L%lae3(dR{nWTB4Noj1;yOEKxb)&0mOA4{vI$72E ziz_m=<G4^vRQ-oZS|_;P=So9y0M(8NbBi>VT;V%j09tKj20h_;-1Lm9AM^S{26AFC ztufn90xR0CY0?g$iX=C|8958KJol=?z(D<@r81Ky92HeSop6-D-LU1aT}8$SLL0J5 z*ZD~q9<F4FT8k%79@E6Cl|QtgE^lcpaZeskS&bUnN<uMT;t$ReEBZ%j&d_3w$*?D7 zJq)GjNc+x9Q@~Y`F(3k*xRCI>650K?k0LiM=PB%b(%NoMo#d+N(&xr2^#4P*3^&#+ zq7>k>vl><;;+ya0AWncr-#G3l5rj)T6xufkzXl1Px8~O9u|!@&7iS>ki3_=a-n|SD zBW9%gQctBUJt6567Ih^Q+ARxzM^nLc40(tu--QTH4}}Q0r4a07`)b@w)z#GtD)0c~ z&|J$~Pn(aKoINKPH-Z}CF%YMpD~u!OL+P{t{T}7Jp28qA`ot1_&eb?HjeDU>9<7_Y zp0|}GZm5aj#Ff?-UcG9@Jr{)Mf`T2y)P+~B2<UfiQG1S6#{kay5#-@yaNFw+`NWry z|Ekxt<;E&KrSfPvC_wgZ6i&-$*`e{8HE<px);VWA_*x@L`1y1D&ZJ=&_Tz+Qj+QS* zm8Cyy+Pa=&vA`<jF2~OBVZ*Kx%=K)|)qC(mv0yGJ=YJm{Zxy@JTKSN@V~w|9SyK~E zjWJHAIY@cIIWu~@xQf2Pd-fB4Q4(7(JYJgL>FeV1;IitX8{TCWT(E`xLW|4!p_|o- zTA+2|60`Jxl5gp$&3(wE7J{tV?Uhb9X7QXm8b|s>l+>Sf9**~EH0`C#Npx5Ex=@t4 z)ixTyEXg^hs-j|0k%kLdiUD`udSnA_)h0O)&t(8jtZ~c2p-&fto0y=Vkdzcz*05e{ z#tfg+jfLcV>U(x|`VJNHz+hp1-mqdA<fo^PHj}&1H#mqpdPr$w+e@+^hZSq26I6S= zUi&$3F8?zN*nS51p?r2i9dcy5je76BZ7U}e{yj|6Fd!}I(>Yvnsg&|;K_a^tvX9rP zmA}y-bQh?F2Hmi6W6*X%2=*T{Z#<a>atQc;k|5mE=t(KFVk@%<87`-9X?$kGZ<8+8 zl-N~7YQDkT3eAr>1u0K9irAU?W^y}UIYqbJz^|u>cKpOe)kO)%=G{`-@zro5#Wj2z z)8s)Rj)%FgXutTz(i^N+#!*Z@!})=dPb$OjlIKjGt_G#Stl*|(cwwA-C3-|kJS7cf zwrCE|<i~ykIJ*nN+rrN7#WK0r+Uu^?oKA(&POl8g(iMQWr(lSeDQ~Nc)%E@U#6oQq z=s`CXHI-DOCyH#r(=ig_{xHQhQ2{}QT4+2@;#6Eu5vA)EaUthT@7v}jXdH;YM|lqz z@w+s!y0fePzD&={)77VK5HOHiU|eE_@iny()o{zaud6G)x4XNi!2$Ai^*~B#LW03x zp1!lYdku&I6zCHy=*JDP3+QmlidUsj^G^e{sD<H<7UF_Zf@)H4Vcpqfvx(*%*k>=r zDZP*!ur8UI{W~YqD)zfyemlNp6yo`7*RSvS=|_$;ImI(b4?%ewKzn@`37p3BMjvtF zGE7ZNTP@V-1}l4DbA3YwE8MP6Hp&hvQ;Ucw>I<-jSgUq}<xc_*I%kDAKBa4Z7m;TM z0OJ_*x>7+5U`TWMfEEA^7{?^6fHClAIR1dZnxMIe5g}Iz$6gt%Oi$%=<Rx7++05Y# zBo7HSc;FGIj&oAM=ZA%Klz#kpaggvvQM#wm(bBDz)OQ}^2jbs3?x5k5ncBQYZAde< zpjQIB0}eS^I&R&X(fBDj4QlDvbU*;#(}AmG_Rx2-ts3j@UTTlfs-jJwuOfTHU&N&v zqIfDOBy@o8EdCE#w)cO?N{WFV#*vj_g4cQ?@eL)`$2-1aXKBJ@k!FjGVARQnFI+RN zE@1~aM5KQ!XIm?|T*D9C2|)1ErXQ&?6t8}_6Gg?_QFclfABMDyRVnpQmCJ!h`VTM6 zM+4N=Jep@{39`jeJnpD3n@r83$oGfn9L7gh39+ak*zwv8j8y5C5TXe1?%s`jhOios zztbyiyejVBUj*8(m}Ql+0=KnQMaCGix<+y8GmCXn7Az|~UacN&3T?GcSteVt?w!LP zT9oFE_9VH#bC8XS#}M#1NUT}m_4oMoNW*Fd&B~Ns`;YJdx3fr{T~2|A+pyuo@6!p= zD`?k3mC>7Gq9zVG&|i?jjEuyc3e+^dMANTt^%VrFUQ%78d1N75ZC+LVH&v<NGlag9 zQ}SIsdLp8O1?;%5IKB*J_Wac?FF_f5oSs=mW<<E{43z32j{B}h9f?<6%ebvcJI|o~ zl1fsNn!@9m;YU#t>7n3izqz|tuFq*ggxbOCy|1cSqfDi1yZ}0H6l@9@265;2*JWCb z;rPTu)<xI_vfwxe<Y}KieIFh&g$m01HysZ53QDw$>R0~gQP+|9izSE>%y3oOvihvM zu>37Un65(q0Vq6}1NSKJ+s<M@In*)E4n67O2ORjxIQqU;Raq4w#>IvLVZ>wc^D0&d z(`#xcqnuu;g{^^6xyV>{xOCkY-s(7j8B&9`tX^FizBw&_m9o?twA2L~`M=`3?gv0o ztdUSPmU4{MH*D;%`Z<8>cD{QTPe+|r=JyZeWpObrQ{*4#hja3VmVA4H2uo9VJvnSN zrZU&nFe(Ft0D>)=660p@>FA|{7i6JsB)@X~xhG#ogiI+(zdTH+<3WzyI4LZi{`o}t zkQ)!1e}t2a<tT46QM^oT^5jr_MhqD3Ss`!pgxNsI6Nyyxw27_H?jfj36eR+z2BKMC z4JH39{*FFjz(b*>@byLI*-ai!T$w0%yS1*a&Ye1{kE|T~P-^d_)LIX^V`PHrKc^n9 z&p)x`?g%N#;DEwF_v)wgHJw6_!#)+k9|(Q>q<GcQm&}v!!zhI~_9qVa`9hVa2AZ1Y zEWZm!AMxlnU_iI4hlj@6tm+2hd9q3R%T8_nPn1jq%a=<-;Cf{lA3+F+d$>LVm7F(z zR{RiSqn!SraHQedEz6od26*`yc&HVGA!2nau3CJKP0`U|zVBPQE}e5!{&Zs_t4!D9 z$B)x-lPZ+7ix-8chV7OLe%x}~yjgFXn1Io&kS6i+iDBupW#-8W?|1FmRgQ7z9ziez zSljtM+#WWzRYu@_%)5Hk(^o_O8G%b0(%0^#=aGXs4eiNT>gZcMwEN?hp9F**!SCh| zO}n1}U?N=qvK@AhT+#YhvC_7&yU?xBtMx(bEU(0&&gS!N)17YIS*kEAe6I4S-n}KI z#`gX!zSz>juX?tH!==89Eu${%8Lqr%X&+BN&;2LYz52A%FYd;6w-eTd1{NKsTL1Ri zaei%nb#uoK-5I>=2HCa+{tex?&!O}xYnX#zJgoi~8Jc9iX0EILnX-3|7;i;&!xkqb zhBP<E@-8sh-KG^UaY9&*Q$WBQBeQ@1>uf6zyjoZoxUeFlRjyAD?X4dllcN?PoS~7z z6f{+9lDc~T^A*m-v8BzHH;E`gzVM4x%Dzv}-G2zNxCRmBj9C}$47-g#Ptc^jb8b@6 zu4)_!vftJ6;KZ~+*If%AX+D$@may;@ihSCp+jSJt=g{HZA66}`*>8)N*HIGN{V3?I zd9Up@m;h3tQ;hxU*W(ejzwVafW`mQy&x<_ERz3OvdK{1^12$9K+5V(ZS|hh{_;Wu8 zmaQCC&<IW3NP!HSo=YmseNNYsk~&tn`0{!zZ*LbnZl4wJs!>@vY~I{F9WB}I>l!!5 zNyXpOSn_c|;IHDnM4L47=M|;Rd=HD)wNRCF6X7jK)yigZEM>apc8AaUqP?`@zgR)k z_`WlyUV9|5rkgU)LxAbPvSkt*E7}n*B`qR`dkD{LkCJc14|)N|uVt9kG8yDjJ%i2R zUufl%nkLq70=D@wcJ(9HV13L7yC^5$vh*QR!S}?AzA%w(_}NljNsUH{hV<f>*Hbpf zd{CB>-KtPBU*>$z)la8+^M~ZGOLn6sz*-zbLM7($n0Qqne4*%AMiIZqDS(=KLaGRd zO6D%0UPIK@@Xaq@4Q0Qh{ANi*T_WmFmp5!-e9&b`dc}3=?_~J}2Nd++&H$vS?aXxB z@R1A<q*ksJEAc#j{I~^RFhY^YZ$37Os-G~PtmC*G72+r>e9hXHYl0R2{DiPbRK}gO zRkZx@n~0I;9r&&}DP=XVaT2167i>9nOqz!{W-l2xO|E}vu1mE(WOg7-PT++p`LWrv z-+l9O*N?N`e#2(gSmRA8DJf&^20ot^K4@`bg{Zu#4PqdTL=abJriAmU&AVCCdH?IF z4<M?&QK4inpe$~uf;{)yg1*96_aA=wlvMC{eRS)X;h(e#VSXjMBzlp#{Rvd^e<Ym? zRL$xB|DO~>6hcTfgoY@Dtx`e=AtQ+{LP&NgQs^e52t`JbOCuDSicl#jLTC~?Nj5@5 zk|ase?f=@p|EzV^S!W%i+I_#z^ZC55$gjJd*8Alq{^r5DP);)M%%RR^6wT5{m&bi} zw|3otNd3awle7y98(Kfdb+lHMz1mV@&2*kT{dBNZ)SrVw>mxw%93`5eG+t%oOuIQ5 zH!xx0lTS#z-uYpL928L*)?3L29fq^bUwd5bPr|U&F%}5n;pE_;vT@%6k+Nv&7@>Sc zzXxqZnJd&SpVl>9kwmPP-8jDrJO0_EQ3#IKd3!G|^9fjP^Ox$!EGH5w%}ID!GxX5U z-yM1vm5Db+!mxL*uv<pf;gy+@vh<!Zv(CS1s7xZdIm&e)BA(HM6SYM<aXwXC%V7jZ zwqbm&VB7Z1>lZiO4{gM3x(<1;THifAH_sU}GCXr}t>lq44{^xo(D7{gufTotQ~$OB ztHhYzIkjxxN{#gVn?oZ!O(GhmAeMZP_Bq=|U7q{af%n!REZ=27al=trZ93FKQi2=i z?~PHqyHG;5<}o8X@1HqTUKPKFHH&Y|)zap*_t!VKv|<Xc*(5J50b_hdtOz)7>Xu`7 zxHSW)zp%`$h-3kTce}n!KZRC?0RTOzNlE6o?K602uQ-g&jg3Daky5jc0BXV|2|=C1 z;5-AjL>T!1UjF{A$wDA_?<7laLL*R@E`=!nmI4$u;9GO631Kz24ENie?@?NN_0aXH zo0q+Q@gkf{(j9djG{t*l&Y<uMf3>yy?upNIjs0+H=FoAjvaJEGuC7EE`NRPs$hS5+ z_RO}eP`Zmcp&m!2u7z4qTx{$wu=YRU=gm1es8?NRZEfAwh1C=NzNZK_NKQ$4bXeDZ z;fTX0NihHCMf$5t(w1@55&_EZCR4V8CA6|r@E-EiPP_fO;TD^Vf>0aO=K&4W4ScSj z?bKbLq)Y#>Q6DT8aHcol#UWz8F)3+$?bg9xZZs^=Q}13Qi5MKOw{)ZI2jxo2j6p=x zYyW1Ih8*WtUS3|Yk7JXI#-x|kTOMQjPM1~;4}Ygy+^~Wh(0Mx3ctj;G@s2WJ@2eEL z?vK~YeOT2HM8_9#&7rgt5Is+QZ9@9tF_S`c)?Y0376N8%eTK|hydjog8|Q&}sLO0- z`D=WbHxd)8?jbrH5?PR6SAM0dVlZK|D)fI-RS!%Uk>EC%PrmD>yFdTpOI$%U;>(R< zp>9d*?RNyz*O|1?3Wd1ZdkK+S;mMW<|7PNT?Zs@K`WHWnR@X78;RY*Sr4h{znS@Kf zgx-e9Wa#u3rvQp>vY6lKVR7(cL$fJ?0c~Y#uUIV^)$d7V{W7z-NYJy?ncd_VJ25DS zcnTGnR*Dbnx}jja-LHLKcKOEfT)-Qy4Vp^cepZV4Xsf7+rly~%QXdJv^qcZG;Pn<n z*H>3_1(g8Wc(8r6a~U+DlD$Qk@J>!o)ba`<!EMmZOP7M@TU%GBOUp3hF-3aFfmGtu zgNTC`Z^n!HFl+MRGI5FR5NAh6%arUdSvioLp9%HY1>AGc)qclJn;RYP?(VDm^6AsB z(ZazO-$Oaor>k6CEVgK_i*?aJc|n1BU6){DVgjW|He_3WThKMQzjzt*U`-(4$8TDZ zSfzpMw7LctV6vYz?_3}G$jZy@$kR4Ea)`-~4RE7m#VbTqE@qsngGZW-q<3$v-pAt# zZ|didXdrsI?yV$(Z?L8pvuh=_ew*sw-R)nP#_n`?g34ynTta!>%KBOUHtf*-1PV42 z+(O)9x8Nhw6pz!TJNRl<k}o^GubYw_VI*3|_u0D)p%+!1Cl_=@IQZ=TedX<MZ+D&- zrArs#P4DYB>}*Tjc~8vUV%IiNT-B6r@~*?>!HVSml)h_;^^RFvtT_H)k%oupY==Y? zj3o@Nzsb_~#TYn`eYRmDX`t?LFeCvc2|ueqDTCNIA-9#ROV)?Sd#tkG`d9q<9h_Fq zWtb~c0Se`li*tnL6wJBCO_3NQpBjyExL9h2A?&x43y9B*r-%U&?6)gG)`Oy5J=bY` zFy|+GdClF95Z-}8)3NLtptLumRcFC>l6ovQb`_eIvg$2!oBdDGOM7sR?uG|z7L(Us z#XSWzH9Yg_X20RjS3OMg$B&-;&9tMP$GWejO^H0PWb@{RZM3Ulhn~`Bujw9_=UdRU zF61gwU7p;ZE_c;s(YA6cuiL02#wMnwtvfed+x|Z~OnQn(W5$dL*tl}#Gzj<QvUI{& z0!OQNAF}`MD$f|*>Hu830QfD0i4>r-RTG9r)^${RsgfiA|09TrP>;j8(zR#49_rPL z{Vct%=*wQi=U0lndeaJBEAJTn!U+J6;1bLC>pmb3<r45jfIJ>gWP)f1UZNfHu&&j; z^jfUXUH`bYyr@%fSv+?DBiD5DY>v#)RSS>*bN-0FZTBYM?2Wo;-S6SQd`>U=sa4<= zgglRPM*dO-#uV<pqMz-HFryJ&Sy-BWF(Bfnyu4{CCDr?}jRoc#p64aZfQiFcLAAY7 zaRa?d>f&dr^mIDX9W*hE@dgFuI90^a8=w%ZB_t@!M=r7LDS{aY#|wXT%O^cJK6{AQ zxUC=MfuNcr|0g-&h5(%~U^%J~dFFGXuA<+JN=iB>U7>z0=i?{w733kBl$(E#dt^O0 zr0d2}W7<u~{ZR$TuUOS!01ObS=E-}lQ72p4n9?IZSnkBMe};~|Oc=7-82I}7<`(h8 z4JoiuQ?ilDeh{hBN~glW6qW18AFT0SNbc?>{fiXpWmHPA)m$NC(NgVB3mD)~V7o-U z?ue?Hl@<_eUk4a*qEfOGOl#HNnIT&=6UP>QL-_lBFaN0_pWsq))dU*eWoi1QRSiSf z>ql6nt&07yi<qVXB-KJeyzs~X=271_b0|^n_2N>Qk@cCy7cvz@`Q_DNW)jIB>g73X zHh1l`^AE12XGXP+NTXoMS3@z};!Ch=&V3_kzYfEkl<)O2rnl0AmbO4Dph!|3QupPH z87ydj)H-X#r5vZ!cMZ++E!0}GQrv}zO}M5Y6ftUzn?eaiY~PU!X7cgAMyfn9()8Q? zVs*=A@VjLNUMU|WV+Z#N^KEHsH@|&kU?}3GvDEC^TBr@WyiCQ>**PcxqClR9r;`8t zs{Xt#0>OYcirEF~cQG4eqog`&x92=yk}s!MSGJ<r!w$`v!^oCi+g0cwIL=U0s_r5T zgy~1ZT~G%piMh%l^A+=kiA}!akNFR>d@@7Ty!C4Y>Yqt!%8SscRAj+N4Q2Ebg=u8v zzbJDKYTKZrrpLa`s&z8;ZvnETLzO7kAvVx;c+hPkDi=&XZhg2iQ?*N{oz}AS4hoPw zE=hNQG~ARBG2r*%-(!PqZF62%HJqdEVuf3*2l_H|deyg;7&%k0^&i#p;8hAJ#?LHP zx6SgaA1bC{LVb?2&h1nc`oEWml97=AuX;=12K#3<lo}AM8H*0>^~|A9R7D%<JA6az z=}|m_q=vL;GgSSegb4-9bh@0O2d0a!cwWanFD-3+wd!)_VBwuE4Reb%d+UAOtf{-J zyj-+vu%_@|Sk~AzE~vfP?zG;gu+frTJ;bGw^x6kZQ?_J&5`p&3#K$o*mCBYGWsQ>+ z@}Ni6kt8GUqfxbdz}}fRXGQ&&I`oioFCi6v8(N;JieNGA-?}CSZ+rbCa}${n`_XuB z6;=GrG<PzABt|M{2%b}w%6fT9rS{}%_-c+U^T?=ZrLd>Mo75f(6E@#OV@K?Cfp~Kb zx}%rKNz?C2eic*1NemuP0(V)QR6%h_V6vsdiJfa*><3$dds_a7BN$gV29alksH|XQ z$VH?tHypn<Dsl(9Pz-hXU6w8r(?p((CkBh2enjQCP!}4_96>0m*NktL3W-na&w3VQ zV_mBc^Gp1x-@|?ux5_@fg5;Q+(sR?PRYwu*oVfVHWY$S4qip(GUQS%3r;kK>rH<Oi zbsC{4OCk~WX6&B+8x?2A8IwtT`b#Qve*WUc_NQt8q`t9JD(!e$T6*_I`bj58$AF83 z%|EKF|4hs~g=)hsZ63il^o%R6qF&a-P-Qfz<~qjtu@RL{7rLDZ(b3f`ut`rnQSq|< zRvn=Q>Ne^{$ebfFxMWn+c{1R>BIo-dBg)t3&zDWrP&xIAFMJO<0>(4r3rptmQGVa* z{c(m+8>xI7g%M%K@SGhuJ+NLC!1o_@(V$gbKHxYpvP;h-chEx>Hl{FkiTb$<HCc}u z{Iv?|ixu-2>y<<H|7;_<@}QE%zjd#&o7BbpG5Y$?Wy8<Yz|ucFJ{f9a!;|&@t7~eh zU1@lppiAPI$}pZ=v4c}Y;&CD_PW5?uj={0{�xrs!;XegPwIsCgZicRCaTzx+OAb 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	pnDK@0-=RMwRNw{5@F?--3@(7I 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 literal 0 HcmV?d00001 From 7f5a10c8ca1e1ba708352dd76d686bf172f9f398 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 20 Apr 2022 00:36:03 -0400 Subject: [PATCH 026/200] Partial revert of MC changes --- code/controllers/subsystem/zas.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 8b892468dad..e6d82f1f552 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -211,7 +211,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_MACHINES - if(current_process == SSZAS_MACHINES || !resumed) + if(current_process == SSZAS_MACHINES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -223,7 +223,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_TILES - if(current_process == SSZAS_TILES || !resumed) + if(current_process == SSZAS_TILES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -235,7 +235,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_DEFERED_TILES - if(current_process == SSZAS_DEFERED_TILES || !resumed) + if(current_process == SSZAS_DEFERED_TILES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -247,7 +247,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_EDGES - if(current_process == SSZAS_EDGES || !resumed) + if(current_process == SSZAS_EDGES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -259,7 +259,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_FIRES - if(current_process == SSZAS_FIRES || !resumed) + if(current_process == SSZAS_FIRES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -271,7 +271,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_HOTSPOTS - if(current_process == SSZAS_HOTSPOTS || !resumed) + if(current_process == SSZAS_HOTSPOTS) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -283,7 +283,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_ZONES - if(current_process == SSZAS_ZONES || !resumed) + if(current_process == SSZAS_ZONES) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 @@ -295,7 +295,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE current_process = SSZAS_ATOMS - if(current_process == SSZAS_ATOMS || !resumed) + if(current_process == SSZAS_ATOMS) timer = TICK_USAGE_REAL if(!resumed) cached_cost = 0 From 56dc9c5b6b8251ac197ef65f3214627664ae513d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 20 Apr 2022 13:55:06 -0400 Subject: [PATCH 027/200] SSairmachines --- code/__DEFINES/subsystems.dm | 28 +- code/controllers/subsystem/airflow.dm | 11 + code/controllers/subsystem/airmachines.dm | 254 ++++++++++++++++++ code/controllers/subsystem/zas.dm | 222 +-------------- code/datums/components/gas_leaker.dm | 4 +- .../computer/atmos_computers/_air_sensor.dm | 4 +- code/game/machinery/pipe/construction.dm | 2 +- code/game/machinery/spaceheater.dm | 6 +- code/game/objects/items/RPD.dm | 2 +- code/game/objects/items/flamethrower.dm | 2 - code/modules/admin/verbs/fix_air.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 8 +- .../components/binary_devices/circulator.dm | 2 +- .../binary_devices/thermomachine.dm | 2 +- .../machinery/components/components_base.dm | 2 +- .../components/electrolyzer/electrolyzer.dm | 2 +- .../atmospherics/machinery/components/tank.dm | 2 +- .../components/unary_devices/cryo.dm | 2 +- .../atmospherics/machinery/datum_pipeline.dm | 10 +- .../atmospherics/machinery/other/meter.dm | 8 +- .../machinery/pipes/layermanifold.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 2 +- .../machinery/portable/canister.dm | 10 +- .../portable/portable_atmospherics.dm | 12 +- .../atmospherics/machinery/portable/pump.dm | 4 +- .../machinery/portable/scrubber.dm | 4 +- code/modules/mapping/map_template.dm | 2 +- code/modules/power/generator.dm | 4 +- .../mapGenerators/repair.dm | 2 +- .../research/ordnance/tank_compressor.dm | 2 +- code/modules/shuttle/on_move.dm | 2 +- tgstation.dme | 1 + 32 files changed, 335 insertions(+), 287 deletions(-) create mode 100644 code/controllers/subsystem/airmachines.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3e488184df9..842eee0b639 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -142,6 +142,7 @@ #define INIT_ORDER_ATOMS 30 #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 +#define INIT_ORDER_AIRMACHINES 17 #define INIT_ORDER_SKILLS 15 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 @@ -189,6 +190,7 @@ #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 +#define FIRE_PRIORITY_AIRMACHINES 45 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_INSTRUMENTS 80 @@ -273,23 +275,21 @@ #define SSAIR_SUPERCONDUCTIVITY 7 #define SSAIR_PROCESS_ATOMS 8 -//ZAS subsystem subtasks -#define SSZAS_PIPENETS 1 -#define SSZAS_MACHINES 2 -#define SSZAS_TILES 3 -#define SSZAS_DEFERED_TILES 4 -#define SSZAS_EDGES 5 -#define SSZAS_FIRES 6 -#define SSZAS_HOTSPOTS 7 -#define SSZAS_ZONES 8 -#define SSZAS_ATOMS 9 +#define SSZAS_TILES 1 +#define SSZAS_DEFERED_TILES 2 +#define SSZAS_EDGES 3 +#define SSZAS_FIRES 4 +#define SSZAS_HOTSPOTS 5 +#define SSZAS_ZONES 6 +#define SSZAS_ATOMS 7 -#define SSZAS_REBUILD_PIPELINE 1 -#define SSZAS_REBUILD_QUEUE 2 +//Air Machine subsystem subtasks +#define SSAIRMACH_PIPENETS 1 +#define SSAIRMACH_MACHINES 2 //Pipeline rebuild helper defines, these suck but it'll do for now //Fools you actually merged it -#define SSAIR_REBUILD_PIPELINE 1 -#define SSAIR_REBUILD_QUEUE 2 +#define SSAIRMACH_REBUILD_PIPELINE 1 +#define SSAIRMACH_REBUILD_QUEUE 2 // Explosion Subsystem subtasks #define SSEXPLOSIONS_MOVABLES 1 diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 3c0ddf21127..dbe2addfc80 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -22,6 +22,10 @@ SUBSYSTEM_DEF(airflow) /datum/controller/subsystem/airflow/Recover() current.Cut() +/datum/controller/subsystem/airflow/stat_entry(msg) + msg += "P: [length(processing)] " + msg += "C: [length(current)]" + return ..() /datum/controller/subsystem/airflow/fire(resumed, no_mc_tick) if (!resumed) @@ -88,7 +92,14 @@ SUBSYSTEM_DEF(airflow) current.Cut(i) return continue + var/olddir = target.dir + if(isobj(target)) + target.SpinAnimation(3, 1, rand(50), parallel = FALSE) + //target.set_dir_on_move = FALSE step_towards(target, target.airflow_dest) + //target.set_dir_on_move = TRUE + target.dir = olddir + if (ismob(target)) var/mob/M = target M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, SSzas.settings.airflow_mob_slowdown) diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm new file mode 100644 index 00000000000..6a3fd0c7de0 --- /dev/null +++ b/code/controllers/subsystem/airmachines.dm @@ -0,0 +1,254 @@ +SUBSYSTEM_DEF(airmachines) + name = "Atmos Machines" + priority = FIRE_PRIORITY_AIRMACHINES + init_order = INIT_ORDER_AIRMACHINES + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/cached_cost + + var/list/pipe_init_dirs_cache = list() + + var/list/networks = list() + var/list/rebuild_queue = list() + var/list/expansion_queue = list() + var/list/atmos_machinery = list() + + var/list/current_run = list() + var/list/current_process = SSAIRMACH_PIPENETS + + var/cost_rebuilds + var/cost_pipenets + var/cost_atmos_machinery + +/datum/controller/subsystem/airmachines/Initialize(timeofday) + setup_atmos_machinery() + setup_pipenets() + return ..() + +/datum/controller/subsystem/airmachines/fire(resumed = FALSE) + var/timer = TICK_USAGE_REAL + // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call + // and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best. + if(length(rebuild_queue) || length(expansion_queue)) + timer = TICK_USAGE_REAL + process_rebuilds() + //This does mean that the apperent rebuild costs fluctuate very quickly, this is just the cost of having them always process, no matter what + if(state != SS_RUNNING) + return + + if(current_process == SSAIRMACH_PIPENETS || !resumed) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_pipenets(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + current_process = SSAIRMACH_MACHINES + + if(current_process == SSAIRMACH_MACHINES) + timer = TICK_USAGE_REAL + if(!resumed) + cached_cost = 0 + process_atmos_machinery(resumed) + cached_cost += TICK_USAGE_REAL - timer + if(state != SS_RUNNING) + return + cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) + resumed = FALSE + + current_process = SSAIRMACH_PIPENETS + +/datum/controller/subsystem/airmachines/proc/process_rebuilds() + //Yes this does mean rebuilding pipenets can freeze up the subsystem forever, but if we're in that situation something else is very wrong + var/list/currentrun = rebuild_queue + while(currentrun.len || length(expansion_queue)) + while(currentrun.len && !length(expansion_queue)) //If we found anything, process that first + var/obj/machinery/atmospherics/remake = currentrun[currentrun.len] + currentrun.len-- + if (!remake) + continue + remake.rebuild_pipes() + if (MC_TICK_CHECK) + return + + var/list/queue = expansion_queue + while(queue.len) + var/list/pack = queue[queue.len] + //We operate directly with the pipeline like this because we can trust any rebuilds to remake it properly + var/datum/pipeline/linepipe = pack[SSAIRMACH_REBUILD_PIPELINE] + var/list/border = pack[SSAIRMACH_REBUILD_QUEUE] + expand_pipeline(linepipe, border) + if(state != SS_RUNNING) //expand_pipeline can fail a tick check, we shouldn't let things get too fucky here + return + + linepipe.building = FALSE + queue.len-- + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/airmachines/proc/process_pipenets(resumed = FALSE) + if (!resumed) + src.current_run = networks.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.current_run + while(currentrun.len) + var/datum/thing = current_run[current_run.len] + current_run.len-- + if(thing) + thing.process() + else + networks.Remove(thing) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/airmachines/proc/process_atmos_machinery(resumed = FALSE) + if (!resumed) + src.current_run = atmos_machinery.Copy() + //cache for sanic speed (lists are references anyways) + var/list/current_run = src.current_run + while(current_run.len) + var/obj/machinery/M = current_run[current_run.len] + current_run.len-- + if(!M) + atmos_machinery -= M + if(M.process_atmos() == PROCESS_KILL) + stop_processing_machine(M) + if(MC_TICK_CHECK) + return + +///Rebuilds a pipeline by expanding outwards, while yielding when sane +/datum/controller/subsystem/airmachines/proc/expand_pipeline(datum/pipeline/net, list/border) + while(border.len) + var/obj/machinery/atmospherics/borderline = border[border.len] + border.len-- + + var/list/result = borderline.pipeline_expansion(net) + if(!length(result)) + continue + for(var/obj/machinery/atmospherics/considered_device in result) + if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) + considered_device.set_pipenet(net, borderline) + net.add_machinery_member(considered_device) + continue + var/obj/machinery/atmospherics/pipe/item = considered_device + if(net.members.Find(item)) + continue + if(item.parent) + var/static/pipenetwarnings = 10 + if(pipenetwarnings > 0) + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") + pipenetwarnings-- + if(pipenetwarnings == 0) + log_mapping("build_pipeline(): further messages about pipenets will be suppressed") + + net.members += item + border += item + + net.air.volume += item.volume + item.parent = net + + if(item.air_temporary) + net.air.merge(item.air_temporary) + item.air_temporary = null + + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/airmachines/proc/add_to_rebuild_queue(obj/machinery/atmospherics/atmos_machine) + if(istype(atmos_machine, /obj/machinery/atmospherics) && !atmos_machine.rebuilding) + rebuild_queue += atmos_machine + atmos_machine.rebuilding = TRUE + +/datum/controller/subsystem/airmachines/proc/add_to_expansion(datum/pipeline/line, starting_point) + var/list/new_packet = new(SSAIRMACH_REBUILD_QUEUE) + new_packet[SSAIRMACH_REBUILD_PIPELINE] = line + new_packet[SSAIRMACH_REBUILD_QUEUE] = list(starting_point) + expansion_queue += list(new_packet) + +/datum/controller/subsystem/airmachines/proc/remove_from_expansion(datum/pipeline/line) + for(var/list/packet in expansion_queue) + if(packet[SSAIRMACH_REBUILD_PIPELINE] == line) + expansion_queue -= packet + return + +/datum/controller/subsystem/airmachines/proc/setup_template_machinery(list/atmos_machines) + var/obj/machinery/atmospherics/AM + for(var/A in 1 to atmos_machines.len) + AM = atmos_machines[A] + AM.atmos_init() + CHECK_TICK + + for(var/A in 1 to atmos_machines.len) + AM = atmos_machines[A] + var/list/targets = AM.get_rebuild_targets() + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline_blocking(AM) + CHECK_TICK + +/datum/controller/subsystem/airmachines/proc/get_init_dirs(type, dir, init_dir) + + if(!pipe_init_dirs_cache[type]) + pipe_init_dirs_cache[type] = list() + + if(!pipe_init_dirs_cache[type]["[init_dir]"]) + pipe_init_dirs_cache[type]["[init_dir]"] = list() + + if(!pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"]) + var/obj/machinery/atmospherics/temp = new type(null, FALSE, dir, init_dir) + pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] = temp.get_init_directions() + qdel(temp) + + return pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] + +/** + * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. + * + * Arguments: + * * machine - The machine to start processing. Can be any /obj/machinery. + */ +/datum/controller/subsystem/airmachines/proc/start_processing_machine(obj/machinery/machine) + if(machine.atmos_processing) + return + if(QDELETED(machine)) + stack_trace("We tried to add a garbage collecting machine to SSzas. Don't") + return + machine.atmos_processing = TRUE + atmos_machinery += machine + +/** + * Removes a given machine to the processing system for SSZAS_MACHINES processing. + * + * Arguments: + * * machine - The machine to stop processing. + */ +/datum/controller/subsystem/airmachines/proc/stop_processing_machine(obj/machinery/machine) + if(!machine.atmos_processing) + return + machine.atmos_processing = FALSE + atmos_machinery -= machine + + // If we're currently processing atmos machines, there's a chance this machine is in + // the currentrun list, which is a cache of atmos_machinery. Remove it from that list + // as well to prevent processing qdeleted objects in the cache. + if(current_process == SSAIRMACH_MACHINES) + current_run -= machine + +/datum/controller/subsystem/airmachines/proc/setup_atmos_machinery() + for (var/obj/machinery/atmospherics/AM in atmos_machinery) + AM.atmos_init() + CHECK_TICK + +//this can't be done with setup_atmos_machinery() because +// all atmos machinery has to initalize before the first +// pipenet can be built. +/datum/controller/subsystem/airmachines/proc/setup_pipenets() + for (var/obj/machinery/atmospherics/AM in atmos_machinery) + var/list/targets = AM.get_rebuild_targets() + for(var/datum/pipeline/build_off as anything in targets) + build_off.build_pipeline_blocking(AM) + CHECK_TICK + diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index e6d82f1f552..b17fcca9c39 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -80,14 +80,6 @@ SUBSYSTEM_DEF(zas) var/list/zones = list() var/list/edges = list() - //Pipenets - var/list/networks = list() - var/list/rebuild_queue = list() - var/list/expansion_queue = list() - var/list/pipe_init_dirs_cache = list() - - //Atmos Machines - var/list/atmos_machinery = list() //Atoms to be processed var/list/atom_process = list() @@ -106,7 +98,7 @@ SUBSYSTEM_DEF(zas) //Currently processing var/list/currentrun = list() - var/current_process = SSZAS_PIPENETS + var/current_process = SSZAS_TILES var/active_zones = 0 var/next_id = 1 @@ -183,46 +175,13 @@ SUBSYSTEM_DEF(zas) ..(timeofday) -/datum/controller/subsystem/zas/fire(resumed = FALSE) +/datum/controller/subsystem/zas/fire(resumed = FALSE, mc_no_tick) var/timer = TICK_USAGE_REAL if (!resumed) processing_edges = active_edges.Copy() processing_fires = active_fire_zones.Copy() processing_hotspots = active_hotspots.Copy() - // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call - // and anything missing a pipenet can lead to unintended behaviour at worse and various runtimes at best. - if(length(rebuild_queue) || length(expansion_queue)) - timer = TICK_USAGE_REAL - process_rebuilds() - //This does mean that the apperent rebuild costs fluctuate very quickly, this is just the cost of having them always process, no matter what - if(state != SS_RUNNING) - return - - if(current_process == SSZAS_PIPENETS || !resumed) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_pipenets(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_MACHINES - - if(current_process == SSZAS_MACHINES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_atmos_machinery(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_TILES - if(current_process == SSZAS_TILES) timer = TICK_USAGE_REAL if(!resumed) @@ -307,103 +266,7 @@ SUBSYSTEM_DEF(zas) resumed = FALSE - current_process = SSZAS_PIPENETS - -/datum/controller/subsystem/zas/proc/process_rebuilds() - //Yes this does mean rebuilding pipenets can freeze up the subsystem forever, but if we're in that situation something else is very wrong - var/list/currentrun = rebuild_queue - while(currentrun.len || length(expansion_queue)) - while(currentrun.len && !length(expansion_queue)) //If we found anything, process that first - var/obj/machinery/atmospherics/remake = currentrun[currentrun.len] - currentrun.len-- - if (!remake) - continue - remake.rebuild_pipes() - if (MC_TICK_CHECK) - return - - var/list/queue = expansion_queue - while(queue.len) - var/list/pack = queue[queue.len] - //We operate directly with the pipeline like this because we can trust any rebuilds to remake it properly - var/datum/pipeline/linepipe = pack[SSAIR_REBUILD_PIPELINE] - var/list/border = pack[SSAIR_REBUILD_QUEUE] - expand_pipeline(linepipe, border) - if(state != SS_RUNNING) //expand_pipeline can fail a tick check, we shouldn't let things get too fucky here - return - - linepipe.building = FALSE - queue.len-- - if (MC_TICK_CHECK) - return - -///Rebuilds a pipeline by expanding outwards, while yielding when sane -/datum/controller/subsystem/zas/proc/expand_pipeline(datum/pipeline/net, list/border) - while(border.len) - var/obj/machinery/atmospherics/borderline = border[border.len] - border.len-- - - var/list/result = borderline.pipeline_expansion(net) - if(!length(result)) - continue - for(var/obj/machinery/atmospherics/considered_device in result) - if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) - considered_device.set_pipenet(net, borderline) - net.add_machinery_member(considered_device) - continue - var/obj/machinery/atmospherics/pipe/item = considered_device - if(net.members.Find(item)) - continue - if(item.parent) - var/static/pipenetwarnings = 10 - if(pipenetwarnings > 0) - log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") - pipenetwarnings-- - if(pipenetwarnings == 0) - log_mapping("build_pipeline(): further messages about pipenets will be suppressed") - - net.members += item - border += item - - net.air.volume += item.volume - item.parent = net - - if(item.air_temporary) - net.air.merge(item.air_temporary) - item.air_temporary = null - - if (MC_TICK_CHECK) - return - -/datum/controller/subsystem/zas/proc/process_pipenets(resumed = FALSE) - if (!resumed) - src.currentrun = networks.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/thing = currentrun[currentrun.len] - currentrun.len-- - if(thing) - thing.process() - else - networks.Remove(thing) - if(MC_TICK_CHECK) - return - -/datum/controller/subsystem/zas/proc/process_atmos_machinery(resumed = FALSE) - if (!resumed) - src.currentrun = atmos_machinery.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/M = currentrun[currentrun.len] - currentrun.len-- - if(!M) - atmos_machinery -= M - if(M.process_atmos() == PROCESS_KILL) - stop_processing_machine(M) - if(MC_TICK_CHECK) - return + current_process = SSZAS_TILES /datum/controller/subsystem/zas/proc/process_tiles(resumed = FALSE) if(!resumed) @@ -541,56 +404,6 @@ SUBSYSTEM_DEF(zas) if(MC_TICK_CHECK) return -/** - * Adds a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. - * - * Arguments: - * * machine - The machine to start processing. Can be any /obj/machinery. - */ -/datum/controller/subsystem/zas/proc/start_processing_machine(obj/machinery/machine) - if(machine.atmos_processing) - return - if(QDELETED(machine)) - stack_trace("We tried to add a garbage collecting machine to SSzas. Don't") - return - machine.atmos_processing = TRUE - atmos_machinery += machine - -/** - * Removes a given machine to the processing system for SSZAS_MACHINES processing. - * - * Arguments: - * * machine - The machine to stop processing. - */ -/datum/controller/subsystem/zas/proc/stop_processing_machine(obj/machinery/machine) - if(!machine.atmos_processing) - return - machine.atmos_processing = FALSE - atmos_machinery -= machine - - // If we're currently processing atmos machines, there's a chance this machine is in - // the currentrun list, which is a cache of atmos_machinery. Remove it from that list - // as well to prevent processing qdeleted objects in the cache. - if(current_process == SSZAS_MACHINES) - currentrun -= machine - -/datum/controller/subsystem/zas/proc/add_to_rebuild_queue(obj/machinery/atmospherics/atmos_machine) - if(istype(atmos_machine, /obj/machinery/atmospherics) && !atmos_machine.rebuilding) - rebuild_queue += atmos_machine - atmos_machine.rebuilding = TRUE - -/datum/controller/subsystem/zas/proc/add_to_expansion(datum/pipeline/line, starting_point) - var/list/new_packet = new(SSAIR_REBUILD_QUEUE) - new_packet[SSZAS_REBUILD_PIPELINE] = line - new_packet[SSZAS_REBUILD_QUEUE] = list(starting_point) - expansion_queue += list(new_packet) - -/datum/controller/subsystem/zas/proc/remove_from_expansion(datum/pipeline/line) - for(var/list/packet in expansion_queue) - if(packet[SSZAS_REBUILD_PIPELINE] == line) - expansion_queue -= packet - return - /datum/controller/subsystem/zas/proc/add_zone(zone/z) zones += z z.name = "Zone [next_id++]" @@ -755,32 +568,3 @@ SUBSYSTEM_DEF(zas) active_edges -= E if(processing_edges) processing_edges -= E - -/datum/controller/subsystem/zas/proc/get_init_dirs(type, dir, init_dir) - - if(!pipe_init_dirs_cache[type]) - pipe_init_dirs_cache[type] = list() - - if(!pipe_init_dirs_cache[type]["[init_dir]"]) - pipe_init_dirs_cache[type]["[init_dir]"] = list() - - if(!pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"]) - var/obj/machinery/atmospherics/temp = new type(null, FALSE, dir, init_dir) - pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] = temp.get_init_directions() - qdel(temp) - - return pipe_init_dirs_cache[type]["[init_dir]"]["[dir]"] - -/datum/controller/subsystem/zas/proc/setup_template_machinery(list/atmos_machines) - var/obj/machinery/atmospherics/AM - for(var/A in 1 to atmos_machines.len) - AM = atmos_machines[A] - AM.atmos_init() - CHECK_TICK - - for(var/A in 1 to atmos_machines.len) - AM = atmos_machines[A] - var/list/targets = AM.get_rebuild_targets() - for(var/datum/pipeline/build_off as anything in targets) - build_off.build_pipeline_blocking(AM) - CHECK_TICK diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index eaf24de0001..29e676c3bcb 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -31,7 +31,7 @@ src.leak_rate = leak_rate /datum/component/gas_leaker/Destroy(force, silent) - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) return ..() /datum/component/gas_leaker/RegisterWithParent() @@ -56,7 +56,7 @@ SIGNAL_HANDLER // Hello fellow atmospherics machines, I too am definitely an atmos machine like you! // This component needs to tick at the same rate as the atmos system - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /datum/component/gas_leaker/proc/process_obj(obj/master, list/airs=list()) airs += master.return_air() diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index 7b4a83bad3c..1322551c3c7 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -16,13 +16,13 @@ /obj/machinery/air_sensor/Initialize(mapload) id_tag = chamber_id + "_sensor" - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) return ..() /obj/machinery/air_sensor/Destroy() INVOKE_ASYNC(src, .proc/broadcast_destruction, src.frequency) - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) SSradio.remove_object(src, frequency) return ..() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 99d1e3195f0..02dadf88db6 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -171,7 +171,7 @@ Buildable meters // See if we would conflict with any of the potentially interacting machines for(var/obj/machinery/atmospherics/machine as anything in potentially_conflicting_machines) // if the pipes have any directions in common, we can't place it that way. - var/our_init_dirs = SSzas.get_init_dirs(pipe_type, fixed_dir(), p_init_dir) + var/our_init_dirs = SSairmachines.get_init_dirs(pipe_type, fixed_dir(), p_init_dir) if(machine.get_init_directions() & our_init_dirs) // We have a conflict! if (length(potentially_conflicting_machines) != 1 || !try_smart_reconfiguration(machine, our_init_dirs, user)) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 3134a41d209..f94657e7691 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -48,10 +48,10 @@ if(ispath(cell)) cell = new cell(src) update_appearance() - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /obj/machinery/space_heater/Destroy() - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) return..() /obj/machinery/space_heater/on_deconstruction() @@ -265,7 +265,7 @@ usr.visible_message(span_notice("[usr] switches [on ? "on" : "off"] \the [src]."), span_notice("You switch [on ? "on" : "off"] \the [src].")) update_appearance() if (on) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) ///For use with heating reagents in a ghetto way /obj/machinery/space_heater/improvised_chem_heater diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index cbc9d797ce6..a68703cfdfb 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -510,7 +510,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( for (var/obj/machinery/atmospherics/O in S.nodes) O.atmos_init() O.add_member(src) - SSzas.add_to_rebuild_queue(S) + SSairmachines.add_to_rebuild_queue(S) // Finally, update our internal state - update_pipe_icon also updates dir and connections S.update_pipe_icon() user.visible_message(span_notice("[user] reprograms the \the [S]."),span_notice("You reprogram \the [S].")) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index d1cb070521e..260077375fc 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -224,9 +224,7 @@ air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) target.assume_air(air_transfer) //Burn it based on transfered gas - //target.hotspot_expose(part4.air_contents.temperature*2,300) target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE - //location.hotspot_expose(1000,500,1) /obj/item/flamethrower/Initialize(mapload) . = ..() diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 78edeb5893a..01f9f63ede3 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -22,7 +22,7 @@ to_chat(usr, "\[1/5\] - Supermatter depowered") // Remove all gases from all pipenets - for(var/datum/pipeline/PN as anything in SSzas.networks) + for(var/datum/pipeline/PN as anything in SSairmachines.networks) for(var/datum/gas_mixture/G in list(PN.air) & PN.other_airs) G.gas = list() G.update_values() diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index a6de2e9fef0..d95707ac121 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -83,7 +83,7 @@ armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 100, ACID = 70) ..() if(process) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) set_init_directions(init_dir) /obj/machinery/atmospherics/Initialize(mapload) @@ -95,8 +95,8 @@ for(var/i in 1 to device_type) nullify_node(i) - SSzas.stop_processing_machine(src) - SSzas.rebuild_queue -= src + SSairmachines.stop_processing_machine(src) + SSairmachines.rebuild_queue -= src if(pipe_vision_img) qdel(pipe_vision_img) @@ -470,7 +470,7 @@ for(var/obj/machinery/atmospherics/A in nodes) A.atmos_init() A.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) /obj/machinery/atmospherics/update_name() if(!override_naming) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 01c3dc5e8e7..d215c8d18f7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -122,7 +122,7 @@ if(node2) node2.atmos_init() node2.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm index 62e4e709a99..8421a2f05e6 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm @@ -333,7 +333,7 @@ if(node2) node2.atmos_init() node2.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) /obj/machinery/atmospherics/components/binary/thermomachine/proc/disconnect_pipes() var/obj/machinery/atmospherics/node1 = nodes[1] diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index e7fb23f7e9a..eb751daa617 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -206,7 +206,7 @@ var/datum/pipeline/parent = parents[i] if(!parent) WARNING("Component is missing a pipenet! Rebuilding...") - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) else parent.update = TRUE diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index 02ec0bb294c..87cd056f416 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -32,7 +32,7 @@ . = ..() if(ispath(cell)) cell = new cell(src) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() /obj/machinery/electrolyzer/Destroy() diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 4d7981e0086..b74318e3fd3 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -190,7 +190,7 @@ continue node.atmos_init() node.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) update_parents() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 1abfa24475c..0160725011a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -554,7 +554,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics if(node) node.atmos_init() node.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) #undef MAX_TEMPERATURE #undef CRYO_MULTIPLY_FACTOR diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index ff2433045ec..2960e4fc5c4 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -14,19 +14,19 @@ other_airs = list() members = list() other_atmos_machines = list() - SSzas.networks += src + SSairmachines.networks += src /datum/pipeline/Destroy() - SSzas.networks -= src + SSairmachines.networks -= src if(building) - SSzas.remove_from_expansion(src) + SSairmachines.remove_from_expansion(src) if(air?.volume) temporarily_store_air() for(var/obj/machinery/atmospherics/pipe/considered_pipe in members) considered_pipe.parent = null if(QDELETED(considered_pipe)) continue - SSzas.add_to_rebuild_queue(considered_pipe) + SSairmachines.add_to_rebuild_queue(considered_pipe) for(var/obj/machinery/atmospherics/components/considered_component in other_atmos_machines) considered_component.nullify_pipenet(src) return ..() @@ -56,7 +56,7 @@ air = new air.volume = volume - SSzas.add_to_expansion(src, base) + SSairmachines.add_to_expansion(src, base) ///Has the same effect as build_pipeline(), but this doesn't queue its work, so overrun abounds. It's useful for the pregame /datum/pipeline/proc/build_pipeline_blocking(obj/machinery/atmospherics/base) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index b40d85073c1..0f1fca9be7a 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -18,7 +18,7 @@ var/target_layer = PIPING_LAYER_DEFAULT /obj/machinery/meter/Destroy() - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) target = null return ..() @@ -26,7 +26,7 @@ if(!isnull(new_piping_layer)) target_layer = new_piping_layer - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) if(!target) reattach_to_layer() @@ -50,10 +50,10 @@ /obj/machinery/meter/on_set_is_operational(old_value) if(is_operational) - SSzas.start_processing_machine(src)//dont set icon_state here because it will be reset on next process() if it ever happens + SSairmachines.start_processing_machine(src)//dont set icon_state here because it will be reset on next process() if it ever happens else icon_state = "meter" - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) /obj/machinery/meter/process_atmos() var/datum/gas_mixture/pipe_air = target.return_air() diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 74cac69ed1b..c0e38bb42b1 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -34,7 +34,7 @@ /obj/machinery/atmospherics/pipe/layer_manifold/proc/nullify_all_nodes() for(var/obj/machinery/atmospherics/node in nodes) node.disconnect(src) - SSzas.add_to_rebuild_queue(node) + SSairmachines.add_to_rebuild_queue(node) front_nodes = null back_nodes = null nodes = list() diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index f0fe7850ab3..ee01bc2f2d1 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -33,7 +33,7 @@ var/obj/machinery/atmospherics/old_node = nodes[i] . = ..() if(old_node) - SSzas.add_to_rebuild_queue(old_node) + SSairmachines.add_to_rebuild_queue(old_node) /obj/machinery/atmospherics/pipe/destroy_network() QDEL_NULL(parent) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 4e8c281129b..97f5962d66b 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -291,7 +291,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() air_contents.adjust_gas(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) air_contents.adjust_gas(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /** * Getter for the amount of time left in the timer of prototype canisters @@ -367,12 +367,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(starter_temp) air_contents.temperature = starter_temp air_contents.adjust_gas(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() air_contents.adjust_gas(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) air_contents.adjust_gas(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon_state() if(machine_stat & BROKEN) @@ -496,7 +496,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(!. || QDELETED(src)) return - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/atom_break(damage_flag) . = ..() @@ -678,7 +678,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/n = 0 valve_open = !valve_open if(valve_open) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) logmsg = "Valve was <b>opened</b> by [key_name(usr)], starting a transfer into \the [holding || "air"].<br>" if(!holding) var/list/gaseslog = list() //list for logging all gases in canister diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index dcc57b43165..8a19c6e46fe 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -22,12 +22,12 @@ air_contents = new air_contents.volume = volume air_contents.temperature = T20C - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/Destroy() disconnect() air_contents = null - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) return ..() @@ -50,7 +50,7 @@ excited = FALSE /obj/machinery/portable_atmospherics/return_air() - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) return air_contents /obj/machinery/portable_atmospherics/return_analyzable_air() @@ -80,7 +80,7 @@ pixel_x = new_port.pixel_x pixel_y = new_port.pixel_y - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() return TRUE @@ -101,7 +101,7 @@ pixel_x = 0 pixel_y = 0 - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() return TRUE @@ -139,7 +139,7 @@ holding = new_tank RegisterSignal(holding, COMSIG_PARENT_QDELETING, .proc/unregister_holding) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() return TRUE diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 72945fca32a..6288a60b7e6 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -96,7 +96,7 @@ if(prob(50 / severity)) on = !on if(on) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) if(prob(100 / severity)) direction = PUMP_OUT target_pressure = rand(0, 100 * ONE_ATMOSPHERE) @@ -147,7 +147,7 @@ if("power") on = !on if(on) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) if(on && !holding) var/plasma = air_contents.get_gas(GAS_PLASMA) var/n2o = air_contents.get_gas(GAS_N2O) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 22cd1108322..b907d136763 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -93,7 +93,7 @@ if(prob(50 / severity)) on = !on if(on) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() /obj/machinery/portable_atmospherics/scrubber/ui_interact(mob/user, datum/tgui/ui) @@ -141,7 +141,7 @@ if("power") on = !on if(on) - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) . = TRUE if("eject") if(holding) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 00497473f12..0f9b5a3b655 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -105,7 +105,7 @@ // NOTE, now that Initialize and LateInitialize run correctly, do we really // need these two below? SSmachines.setup_template_powernets(cables) - SSzas.setup_template_machinery(atmos_machines) + SSairmachines.setup_template_machinery(atmos_machines) SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index d5b7e185874..c4fb0c2c9df 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -20,12 +20,12 @@ AddComponent(/datum/component/simple_rotation) find_circs() connect_to_network() - SSzas.start_processing_machine(src) + SSairmachines.start_processing_machine(src) update_appearance() /obj/machinery/power/generator/Destroy() kill_circs() - SSzas.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) return ..() /obj/machinery/power/generator/update_overlays() diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index 21789898daa..594d5f66e67 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -51,7 +51,7 @@ SSatoms.InitializeAtoms(atoms) SSmachines.setup_template_powernets(cables) - SSzas.setup_template_machinery(atmos_machines) + SSairmachines.setup_template_machinery(atmos_machines) GLOB.reloading_map = FALSE /datum/map_generator/repair diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 824c7437c80..70c785dd5a7 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -119,7 +119,7 @@ if(nodes[2]) nodes[2].atmos_init() nodes[2].add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) update_appearance() /// Glorified volume pump. diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 17659877f5b..4115beaa475 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -254,7 +254,7 @@ All ShuttleMove procs go here A.atmos_init() if(A.return_pipenet()) A.add_member(src) - SSzas.add_to_rebuild_queue(src) + SSairmachines.add_to_rebuild_queue(src) else // atmos_init() calls update_appearance(), so we don't need to call it update_appearance() diff --git a/tgstation.dme b/tgstation.dme index 707f7972ef4..73a44fca1c2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -455,6 +455,7 @@ #include "code\controllers\subsystem\addiction.dm" #include "code\controllers\subsystem\ai_controllers.dm" #include "code\controllers\subsystem\airflow.dm" +#include "code\controllers\subsystem\airmachines.dm" //#include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\assets.dm" From 8d5154e3fbd2285f4211e0a1662236ff072ea093 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 20 Apr 2022 15:46:26 -0400 Subject: [PATCH 028/200] Some fixes. Atmos Sensitive still needs signals --- code/controllers/subsystem/airmachines.dm | 17 +++++++++++++++++ code/controllers/subsystem/zas.dm | 1 + code/datums/elements/atmos_sensitive.dm | 4 ++-- code/modules/atmospherics/ZAS/Fire.dm | 18 ++++++++++++++++-- .../modules/atmospherics/machinery/airalarm.dm | 10 +++++----- code/modules/shuttle/arrivals.dm | 2 +- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index 6a3fd0c7de0..de0b4019dae 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -22,10 +22,27 @@ SUBSYSTEM_DEF(airmachines) var/cost_atmos_machinery /datum/controller/subsystem/airmachines/Initialize(timeofday) + var/starttime = REALTIMEOFDAY + to_chat(world, span_boldannounce("Airmachines: Setting up atmospheric machinery...")) setup_atmos_machinery() + to_chat(world, span_boldannounce("Airmachines: Airmachine setup completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) + starttime = REALTIMEOFDAY + to_chat(world, span_boldannounce("Airmachines: Creating pipenets...")) setup_pipenets() + to_chat(world, span_boldannounce("Airmachines: Pipenet creation completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) return ..() +/datum/controller/subsystem/airmachines/stat_entry(msg) + msg += "CR: [cost_rebuilds ? cost_rebuilds : 0]|" + msg += "CPN: [cost_pipenets]|" + msg += "CAM: [cost_atmos_machinery]|" + msg += "NN: [length(networks)]|" + msg += "NAM: [length(atmos_machinery)]|" + msg += "RQ: [length(rebuild_queue)]|" + msg += "EQ: [length(expansion_queue)]" + return ..() + + /datum/controller/subsystem/airmachines/fire(resumed = FALSE) var/timer = TICK_USAGE_REAL // Every time we fire, we want to make sure pipenets are rebuilt. The game state could have changed between each fire() proc call diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index b17fcca9c39..6075ed4d4f0 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -105,6 +105,7 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/proc/Reboot() // Stop processing while we rebuild. can_fire = FALSE + next_id = 0 //Reset atmos zone count. // Make sure we don't rebuild mid-tick. if (state != SS_IDLE) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index 9cc8799db7b..a3266fa20e9 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -15,7 +15,7 @@ if(!mapload && isopenturf(to_track.loc)) var/turf/open/new_open = to_track.loc - to_track.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered + to_track.check_atmos_process(new_open, new_open.return_air(), new_open.return_air().temperature) //Make sure you're properly registered return ..() @@ -33,7 +33,7 @@ var/atom/atom_source = source if(isopenturf(atom_source.loc)) var/turf/open/new_open = atom_source.loc - atom_source.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered + atom_source.check_atmos_process(new_open, new_open.return_air(), new_open.return_air().temperature) //Make sure you're properly registered /atom/proc/check_atmos_process(datum/source, datum/gas_mixture/air, exposed_temperature) SIGNAL_HANDLER diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 4c6f8ec0e69..78982913b2f 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -440,7 +440,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD) apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST) - apply_damage(2,0*mx*groin_exposure, BURN, BODY_ZONE_PRECISE_GROIN) + //apply_damage(2,0*mx*groin_exposure, BURN, BODY_ZONE_PRECISE_GROIN) apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG) apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG) apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM) @@ -449,6 +449,20 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //return a truthy value of whether burning actually happened return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) +/turf/proc/burn() + burn_tile() + var/chance_of_deletion + if (heat_capacity) //beware of division by zero + chance_of_deletion = max_fire_temperature_sustained / heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 + else + chance_of_deletion = 100 + if(prob(chance_of_deletion)) + Melt() + max_fire_temperature_sustained = 0 + else + to_be_destroyed = FALSE + + //turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) /turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adjt_temp) return @@ -462,7 +476,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin W.fire_act(adj_air, adj_temp, adj_volume) /turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - //burn(adj_temp) + burn(adj_temp) if(adj_temp > heat_capacity) take_damage(log(Frand(0.9, 1.1) * (adj_temp - heat_capacity)), BURN) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 657444209d1..f8408d81968 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -226,8 +226,8 @@ continue cur_tlv = TLV[gas_id] data["environment_data"] += list(list( - "name" = environment.gas[gas_id], - "value" = environment.get_gas(gas_id) / total_moles * 100, + "name" = xgm_gas_data.name[gas_id], + "value" = environment.gas[gas_id] / total_moles * 100, "unit" = "%", "danger_level" = cur_tlv.get_danger_level(environment.get_gas(gas_id)* partial_pressure) )) @@ -300,7 +300,7 @@ if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] - thresholds += list(list("name" = gas_id, "settings" = list())) + thresholds += list(list("name" = xgm_gas_data.name[gas_id], "settings" = list())) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "hazard_min", "selected" = selected.hazard_min)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "warning_min", "selected" = selected.warning_min)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "warning_max", "selected" = selected.warning_max)) @@ -609,7 +609,7 @@ var/list/cached_tlv = TLV var/list/env_gases = environment.get_gases() - var/partial_pressure = R_IDEAL_GAS_EQUATION * exposed_temperature / environment.volume + //var/partial_pressure = R_IDEAL_GAS_EQUATION * exposed_temperature / environment.volume current_tlv = cached_tlv["pressure"] var/environment_pressure = environment.return_pressure() @@ -623,7 +623,7 @@ if(!(gas_id in cached_tlv)) // We're not interested in this gas, it seems. continue current_tlv = cached_tlv[gas_id] - gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(env_gases[gas_id] * partial_pressure)) + gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(environment.get_gas(gas_id))) var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index b2a0e3302db..40b43cdc428 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -107,7 +107,7 @@ /obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure() for(var/I in SSjob.latejoin_trackers) var/turf/open/T = get_turf(I) - var/pressure = T.air.return_pressure() + var/pressure = T.return_air().return_pressure() if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check return TRUE return FALSE From 93a263423e1c8ce59a039d4fcc8cc5fea4d766c5 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 21 Apr 2022 00:39:36 -0400 Subject: [PATCH 029/200] Atmos Alarms now work properly & trigger firedoors --- code/controllers/subsystem/zas.dm | 2 +- code/datums/elements/atmos_sensitive.dm | 4 ++-- code/modules/atmospherics/ZAS/Fire.dm | 3 --- code/modules/atmospherics/ZAS/Temperature.dm | 9 +++++++++ code/modules/atmospherics/machinery/airalarm.dm | 12 ++++++++++-- .../components/unary_devices/vent_scrubber.dm | 5 +++-- .../modules/atmospherics/machinery/datum_pipeline.dm | 4 ++-- 7 files changed, 27 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 6075ed4d4f0..2e993242511 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -162,7 +162,7 @@ SUBSYSTEM_DEF(zas) CHECK_TICK - to_chat(world, span_boldannounce("ZAS: Total Simulated Turfs: [simulated_turf_count]\nTotal Zones: [zones.len]\nTotal Edges: [edges.len]\nTotal Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\nTotal Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) + to_chat(world, span_boldannounce("ZAS:\n - Total Simulated Turfs: [simulated_turf_count]\n - Total Zones: [zones.len]\n - Total Edges: [edges.len]\n - Total Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\n - Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) to_chat(world, span_boldannounce("ZAS: Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index a3266fa20e9..6139f14b284 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -40,11 +40,11 @@ if(should_atmos_process(air, exposed_temperature)) if(flags_1 & ATMOS_IS_PROCESSING_1) return - SSzas.atom_process += src + //SSzas.atom_process += src flags_1 |= ATMOS_IS_PROCESSING_1 else if(flags_1 & ATMOS_IS_PROCESSING_1) atmos_end() - SSzas.atom_process -= src + //SSzas.atom_process -= src flags_1 &= ~ATMOS_IS_PROCESSING_1 /atom/proc/process_exposure() diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 78982913b2f..364dbf9fa47 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -11,9 +11,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/var/obj/effect/hotspot/fire = null //Some legacy definitions so fires can be started. -/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return null - /atom/movable/proc/is_burnable() return FALSE diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 4dd66a56b9c..16a963552b0 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -34,6 +34,7 @@ // Get our location temperature if possible. // Nullspace is room temperature, clearly. var/adjust_temp + var/datum/gas_mixture/local_air if(loc) if(!loc.simulated) adjust_temp = loc.temperature @@ -44,6 +45,9 @@ return if(T.zone && T.zone.air) adjust_temp = T.zone.air.temperature + SEND_SIGNAL(T, COMSIG_TURF_EXPOSE, T.zone.air, T.zone.air.temperature) + atmos_expose(T.zone.air, T.zone.air.temperature) + local_air = T.zone.air else adjust_temp = T20C else @@ -53,6 +57,11 @@ if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) ADJUST_ATOM_TEMPERATURE(src, (diff_temp > 0) ? min(adjust_temp, altered_temp) : max(adjust_temp, altered_temp)) + var/tempvar = null + + else if(local_air && should_atmos_process(local_air, local_air.temperature)) + return + else temperature = adjust_temp return PROCESS_KILL diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index f8408d81968..0c95692c6bc 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -229,7 +229,7 @@ "name" = xgm_gas_data.name[gas_id], "value" = environment.gas[gas_id] / total_moles * 100, "unit" = "%", - "danger_level" = cur_tlv.get_danger_level(environment.get_gas(gas_id)* partial_pressure) + "danger_level" = cur_tlv.get_danger_level(environment.gas[gas_id]* partial_pressure) )) if(!locked || user.has_unlimited_silicon_privilege) @@ -623,7 +623,7 @@ if(!(gas_id in cached_tlv)) // We're not interested in this gas, it seems. continue current_tlv = cached_tlv[gas_id] - gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(environment.get_gas(gas_id))) + gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(environment.gas[gas_id])) var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) @@ -662,9 +662,17 @@ new_area_danger_level = clamp(max(new_area_danger_level, AA.danger_level), 0, 1) var/did_anything_happen + var/area/local_area = get_area(src) if(new_area_danger_level) did_anything_happen = alarm_manager.send_alarm(ALARM_ATMOS) + if(danger_level == TLV_OUTSIDE_HAZARD_LIMIT) + for(var/obj/machinery/door/firedoor/door in local_area.firedoors) + door.start_activation_process(FIRELOCK_ALARM_TYPE_GENERIC) else + if(danger_level < TLV_OUTSIDE_WARNING_LIMIT) + for(var/obj/machinery/door/firedoor/door in local_area.firedoors) + door.start_deactivation_process(FIRELOCK_ALARM_TYPE_GENERIC) + did_anything_happen = alarm_manager.clear_alarm(ALARM_ATMOS) if(did_anything_happen) //if something actually changed post_alert(new_area_danger_level) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b1d46b02494..391d156f517 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -254,13 +254,14 @@ var/total_moles_to_remove = 0 for(var/gas in filter_types & environment.get_gases()) - total_moles_to_remove += environment.get_gas(gas) + total_moles_to_remove += environment.gas[gas] if(total_moles_to_remove == 0)//sometimes this gets non gc'd values return FALSE //take this gases portion of removal_ratio of the turfs air, or all of that gas if less than or equal to MINIMUM_MOLES_TO_SCRUB - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles + //var/transfer_moles = min(environment.total_moles, volume_rate/environment.volume)*environment.total_moles + var/transfer_moles = min(environment.total_moles, environment.total_moles*volume_rate/environment.volume) scrub_gas(filter_types, environment, filtered_out, transfer_moles, INFINITY) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 2960e4fc5c4..964e364ff77 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -209,8 +209,8 @@ air.temperature += self_temperature_delta modeled_location.TakeTemperature(sharer_temperature_delta) - if(modeled_location.blocks_air) - modeled_location.temperature_expose(air, modeled_location.temperature) + /*if(modeled_location.blocks_air & AIR_BLOCKED) + modeled_location.temperature_expose(air, modeled_location.temperature)*/ update = TRUE From b5d5ce70620fda28d1ff2d16f3c8f2fb334e3d69 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 21 Apr 2022 03:41:07 -0400 Subject: [PATCH 030/200] Attempts to make scrubbers work right, failed --- code/__DEFINES/atmospherics/temperature.dm | 6 ++++-- code/__DEFINES/subsystems.dm | 2 +- code/controllers/subsystem/airflow.dm | 2 +- code/controllers/subsystem/airmachines.dm | 2 +- code/controllers/subsystem/processing/airatoms.dm | 5 +++++ code/controllers/subsystem/processing/temperature.dm | 5 ----- code/controllers/subsystem/zas.dm | 2 +- code/datums/elements/atmos_sensitive.dm | 8 ++++---- code/modules/atmospherics/ZAS/Temperature.dm | 3 ++- code/modules/mob/mob_defines.dm | 2 ++ tgstation.dme | 2 +- 11 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 code/controllers/subsystem/processing/airatoms.dm delete mode 100644 code/controllers/subsystem/processing/temperature.dm diff --git a/code/__DEFINES/atmospherics/temperature.dm b/code/__DEFINES/atmospherics/temperature.dm index bac65da5b79..e26dc041577 100644 --- a/code/__DEFINES/atmospherics/temperature.dm +++ b/code/__DEFINES/atmospherics/temperature.dm @@ -18,9 +18,11 @@ for(var/thing in _atoms) { \ var/atom/A = thing; \ if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ - START_PROCESSING(SStemperature, A); \ + START_PROCESSING(SSairatoms, A); \ + A.flags_1 |= ATMOS_IS_PROCESSING_1 \ } \ } \ } else if(ATOM_IS_TEMPERATURE_SENSITIVE(_atoms)) { \ - START_PROCESSING(SStemperature, _atoms); \ + START_PROCESSING(SSairatoms, _atoms); \ + _atoms.flags_1 |= ATMOS_IS_PROCESSING_1 \ } diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 842eee0b639..25d877dfc97 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -175,7 +175,7 @@ #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_DATABASE 16 #define FIRE_PRIORITY_AIRFLOW 17 -#define FIRE_PRIORITY_TEMPERATURE 18 +#define FIRE_PRIORITY_AIRATOMS 18 #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index dbe2addfc80..b110cca476b 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(airflow) - name = "Airflow" + name = "Air (Airflow)" wait = 1 flags = SS_NO_INIT priority = FIRE_PRIORITY_AIRFLOW diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index de0b4019dae..d9d6a7c8b96 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -1,5 +1,5 @@ SUBSYSTEM_DEF(airmachines) - name = "Atmos Machines" + name = "Air (Machines)" priority = FIRE_PRIORITY_AIRMACHINES init_order = INIT_ORDER_AIRMACHINES flags = SS_KEEP_TIMING diff --git a/code/controllers/subsystem/processing/airatoms.dm b/code/controllers/subsystem/processing/airatoms.dm new file mode 100644 index 00000000000..32d046cde70 --- /dev/null +++ b/code/controllers/subsystem/processing/airatoms.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(airatoms) + name = "Air (Atoms)" + priority = FIRE_PRIORITY_AIRATOMS + wait = 0.5 SECONDS + process_proc = /atom/proc/process_atmos_exposure diff --git a/code/controllers/subsystem/processing/temperature.dm b/code/controllers/subsystem/processing/temperature.dm deleted file mode 100644 index 772a2086a57..00000000000 --- a/code/controllers/subsystem/processing/temperature.dm +++ /dev/null @@ -1,5 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(temperature) - name = "Temperature" - priority = FIRE_PRIORITY_TEMPERATURE - wait = 5 SECONDS - process_proc = /atom/proc/ProcessAtomTemperature diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 2e993242511..f6a5951f635 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -62,7 +62,7 @@ Class Procs: */ SUBSYSTEM_DEF(zas) - name = "ZAS" + name = "Air Core" priority = FIRE_PRIORITY_AIR init_order = INIT_ORDER_AIR flags = SS_POST_FIRE_TIMING diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index 6139f14b284..e54c307f5fc 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -40,11 +40,11 @@ if(should_atmos_process(air, exposed_temperature)) if(flags_1 & ATMOS_IS_PROCESSING_1) return - //SSzas.atom_process += src + START_PROCESSING(SSairatoms, src) flags_1 |= ATMOS_IS_PROCESSING_1 else if(flags_1 & ATMOS_IS_PROCESSING_1) atmos_end() - //SSzas.atom_process -= src + START_PROCESSING(SSairatoms, src) flags_1 &= ~ATMOS_IS_PROCESSING_1 /atom/proc/process_exposure() @@ -52,12 +52,12 @@ if(!istype(loc, /turf/open)) //If you end up in a locker or a wall reconsider your life decisions atmos_end() - SSzas.atom_process -= src + STOP_PROCESSING(SSairatoms, src) flags_1 &= ~ATMOS_IS_PROCESSING_1 return if(!should_atmos_process(spot.air, spot.air.temperature)) //Things can change without a tile becoming active atmos_end() - SSzas.atom_process -= src + STOP_PROCESSING(SSairatoms, src) flags_1 &= ~ATMOS_IS_PROCESSING_1 return atmos_expose(spot.air, spot.air.temperature) diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 16a963552b0..5068228ba97 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -30,7 +30,7 @@ . = ..() temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - FLOOR(mob_size/4, 1), MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient -/atom/proc/ProcessAtomTemperature() +/atom/proc/process_atmos_exposure() // Get our location temperature if possible. // Nullspace is room temperature, clearly. var/adjust_temp @@ -64,6 +64,7 @@ else temperature = adjust_temp + flags_1 &= ~ATMOS_IS_PROCESSING_1 return PROCESS_KILL #undef MIN_TEMPERATURE_COEFFICIENT diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 04515064f8d..b01244fc42d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -18,6 +18,8 @@ throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC pass_flags_self = PASSMOB + flags_2 = NO_TEMP_CHANGE_2 //We're going to assume mobs handle their own temperature on life + /// The current client inhabiting this mob. Managed by login/logout /// This exists so we can do cleanup in logout for occasions where a client was transfere rather then destroyed /// We need to do this because the mob on logout never actually has a reference to client diff --git a/tgstation.dme b/tgstation.dme index 73a44fca1c2..946f288e01c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -543,6 +543,7 @@ #include "code\controllers\subsystem\processing\acid.dm" #include "code\controllers\subsystem\processing\ai_basic_avoidance.dm" #include "code\controllers\subsystem\processing\ai_behaviors.dm" +#include "code\controllers\subsystem\processing\airatoms.dm" #include "code\controllers\subsystem\processing\antag_hud.dm" #include "code\controllers\subsystem\processing\aura_healing.dm" #include "code\controllers\subsystem\processing\clock_component.dm" @@ -558,7 +559,6 @@ #include "code\controllers\subsystem\processing\quirks.dm" #include "code\controllers\subsystem\processing\reagents.dm" #include "code\controllers\subsystem\processing\singulo.dm" -#include "code\controllers\subsystem\processing\temperature.dm" #include "code\controllers\subsystem\processing\station.dm" #include "code\controllers\subsystem\processing\tramprocess.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" From ce0ec1e387e02bfa12c559cf9a79f8ddb34b9e96 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 21 Apr 2022 04:13:16 -0400 Subject: [PATCH 031/200] Updates SSzas --- code/controllers/subsystem/zas.dm | 294 +++++++------------ code/datums/elements/atmos_sensitive.dm | 4 +- code/modules/atmospherics/ZAS/Temperature.dm | 1 - 3 files changed, 112 insertions(+), 187 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index f6a5951f635..0f9fd9a608a 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -70,6 +70,12 @@ SUBSYSTEM_DEF(zas) wait = 2 SECONDS var/cached_cost = 0 + var/cost_tiles = 0 + var/cost_deferred_tiles = 0 + var/cost_edges = 0 + var/cost_fires = 0 + var/cost_hotspots = 0 + var/cost_zones = 0 //The variable setting controller var/datum/zas_controller/settings @@ -80,8 +86,6 @@ SUBSYSTEM_DEF(zas) var/list/zones = list() var/list/edges = list() - //Atoms to be processed - var/list/atom_process = list() //Geometry updates lists var/list/tiles_to_update = list() @@ -96,12 +100,10 @@ SUBSYSTEM_DEF(zas) var/tmp/list/processing_hotspots var/tmp/list/processing_zones - //Currently processing - var/list/currentrun = list() - var/current_process = SSZAS_TILES var/active_zones = 0 var/next_id = 1 + /datum/controller/subsystem/zas/proc/Reboot() // Stop processing while we rebuild. can_fire = FALSE @@ -176,111 +178,33 @@ SUBSYSTEM_DEF(zas) ..(timeofday) -/datum/controller/subsystem/zas/fire(resumed = FALSE, mc_no_tick) +/datum/controller/subsystem/zas/fire(resumed = FALSE, no_mc_tick) var/timer = TICK_USAGE_REAL if (!resumed) processing_edges = active_edges.Copy() processing_fires = active_fire_zones.Copy() processing_hotspots = active_hotspots.Copy() - if(current_process == SSZAS_TILES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_tiles(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_DEFERED_TILES - - if(current_process == SSZAS_DEFERED_TILES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_deferred_tiles(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_EDGES - - if(current_process == SSZAS_EDGES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_edges(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_FIRES - - if(current_process == SSZAS_FIRES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_fires(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_HOTSPOTS - - if(current_process == SSZAS_HOTSPOTS) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_hotspots(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_ZONES - - if(current_process == SSZAS_ZONES) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_zones(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - current_process = SSZAS_ATOMS - - if(current_process == SSZAS_ATOMS) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - process_atoms(resumed) - cached_cost += TICK_USAGE_REAL - timer - if(state != SS_RUNNING) - return - //cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE - + var/list/curr_tiles = tiles_to_update + var/list/curr_defer = deferred + var/list/curr_edges = processing_edges + var/list/curr_fire = processing_fires + var/list/curr_hotspot = processing_hotspots + var/list/curr_zones = zones_to_update - current_process = SSZAS_TILES -/datum/controller/subsystem/zas/proc/process_tiles(resumed = FALSE) - if(!resumed) - src.currentrun = tiles_to_update - - var/list/currentrun = src.currentrun - while (currentrun.len) - var/turf/T = currentrun[currentrun.len] - currentrun.len-- +/////////TILES////////// + cached_cost = 0 + while (curr_tiles.len) + var/turf/T = curr_tiles[curr_tiles.len] + curr_tiles.len-- if (!T) - if (MC_TICK_CHECK) + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) return + continue //check if the turf is self-zone-blocked @@ -288,7 +212,9 @@ SUBSYSTEM_DEF(zas) ATMOS_CANPASS_TURF(c_airblock, T, T) if(c_airblock & ZONE_BLOCKED) deferred += T - if (MC_TICK_CHECK) + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) return continue @@ -300,110 +226,110 @@ SUBSYSTEM_DEF(zas) //updated++ #endif - if (MC_TICK_CHECK) + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) return -/datum/controller/subsystem/zas/proc/process_deferred_tiles(resumed) - if(!resumed) - src.currentrun = deferred - var/list/currentrun = src.currentrun - - if(current_process == SSZAS_DEFERED_TILES) - while (currentrun.len) - var/turf/T = currentrun[currentrun.len] - currentrun.len-- - - T.update_air_properties() - T.post_update_air_properties() - T.needs_air_update = 0 - #ifdef ZASDBG - T.overlays -= mark - //updated++ - #endif - - if (MC_TICK_CHECK) - return + cached_cost += TICK_USAGE_REAL - timer + cost_tiles = MC_AVERAGE(cost_tiles, TICK_DELTA_TO_MS(cached_cost)) + +//////////DEFERRED TILES////////// + timer = TICK_USAGE_REAL + cached_cost = 0 + while (curr_defer.len) + var/turf/T = curr_defer[curr_defer.len] + curr_defer.len-- + + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + //updated++ + #endif -/datum/controller/subsystem/zas/proc/process_edges(resumed) - if(!resumed) - src.currentrun = active_edges.Copy() - var/list/currentrun = src.currentrun + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return + cached_cost += TICK_USAGE_REAL - timer + cost_deferred_tiles = MC_AVERAGE(cost_deferred_tiles, TICK_DELTA_TO_MS(cached_cost)) - if(current_process == SSZAS_EDGES) - while (currentrun.len) - var/connection_edge/edge = currentrun[currentrun.len] - currentrun.len-- +//////////EDGES////////// - if (!edge) - if (MC_TICK_CHECK) - return - continue + timer = TICK_USAGE_REAL + cached_cost = 0 + while (curr_edges.len) + var/connection_edge/edge = curr_edges[curr_edges.len] + curr_edges.len-- - edge.tick() - if (MC_TICK_CHECK) + if (!edge) + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) return + continue -/datum/controller/subsystem/zas/proc/process_fires(resumed) - if(!resumed) - src.currentrun = active_fire_zones.Copy() - var/list/currentrun = src.currentrun - - if(current_process == SSZAS_FIRES) - while (currentrun.len) - var/zone/Z = currentrun[currentrun.len] - currentrun.len-- + edge.tick() - Z.process_fire() + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return - if (MC_TICK_CHECK) - return + cached_cost += TICK_USAGE_REAL - timer + cost_edges = MC_AVERAGE(cost_edges, TICK_DELTA_TO_MS(cached_cost)) -/datum/controller/subsystem/zas/proc/process_hotspots(resumed) - if(!resumed) - src.currentrun = active_hotspots.Copy() - var/list/currentrun = src.currentrun +//////////FIRES////////// + timer = TICK_USAGE_REAL + cached_cost = 0 + while (curr_fire.len) + var/zone/Z = curr_fire[curr_fire.len] + curr_fire.len-- - if(current_process == SSZAS_HOTSPOTS) - while (currentrun.len) - var/obj/effect/hotspot/F = currentrun[currentrun.len] - currentrun.len-- + Z.process_fire() - F.process() + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return - if (MC_TICK_CHECK) - return + cached_cost += TICK_USAGE_REAL - timer + cost_fires= MC_AVERAGE(cost_fires, TICK_DELTA_TO_MS(cached_cost)) -/datum/controller/subsystem/zas/proc/process_zones(resumed) - if(!resumed) - src.currentrun = zones_to_update - var/list/currentrun = src.currentrun +//////////HOTSPOTS////////// + timer = TICK_USAGE_REAL + cached_cost = 0 + while (curr_hotspot.len) + var/obj/effect/hotspot/F = curr_hotspot[curr_hotspot.len] + curr_hotspot.len-- - if(current_process == SSZAS_ZONES) - while (currentrun.len) - var/zone/Z = currentrun[currentrun.len] - currentrun.len-- + F.process() - Z.tick() - Z.needs_update = FALSE + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return + cached_cost += TICK_USAGE_REAL - timer + cost_hotspots = MC_AVERAGE(cost_hotspots, TICK_DELTA_TO_MS(cached_cost)) - if (MC_TICK_CHECK) - return + timer = TICK_USAGE_REAL + cached_cost = 0 + while (curr_zones.len) + var/zone/Z = curr_zones[curr_zones.len] + curr_zones.len-- -/datum/controller/subsystem/zas/proc/process_atoms(resumed) - if(!resumed) - src.currentrun = atom_process + Z.tick() + Z.needs_update = FALSE - var/list/currentrun = src.currentrun + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + return - if(current_process == SSZAS_ATOMS) - while(currentrun.len) - var/atom/talk_to = currentrun[currentrun.len] - currentrun.len-- - if(!talk_to) - return - talk_to.process_exposure() - if(MC_TICK_CHECK) - return + cached_cost += TICK_USAGE_REAL - timer + cost_zones = MC_AVERAGE(cost_zones, TICK_DELTA_TO_MS(cached_cost)) /datum/controller/subsystem/zas/proc/add_zone(zone/z) zones += z @@ -446,7 +372,7 @@ SUBSYSTEM_DEF(zas) //datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) //ZASTURF /datum/controller/subsystem/zas/proc/connect(turf/A, turf/B) #ifdef ZASDBG - ASSERT(istype(A)) + ASSERT(!istype(A, /turf/open/space)) ASSERT(isturf(B)) ASSERT(A.zone) ASSERT(!A.zone.invalid) diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index e54c307f5fc..fd0ac7f6db2 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -24,7 +24,7 @@ us.RemoveElement(/datum/element/connect_loc, pass_on) if(us.flags_1 & ATMOS_IS_PROCESSING_1) us.atmos_end() - SSzas.atom_process -= us + STOP_PROCESSING(SSairatoms, src) us.flags_1 &= ~ATMOS_IS_PROCESSING_1 return ..() @@ -65,7 +65,7 @@ /turf/open/process_exposure() if(!should_atmos_process(air, air.temperature)) atmos_end() - SSzas.atom_process -= src + STOP_PROCESSING(SSairatoms, src) flags_1 &= ~ATMOS_IS_PROCESSING_1 return atmos_expose(air, air.temperature) diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 5068228ba97..0447f522f29 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -57,7 +57,6 @@ if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) ADJUST_ATOM_TEMPERATURE(src, (diff_temp > 0) ? min(adjust_temp, altered_temp) : max(adjust_temp, altered_temp)) - var/tempvar = null else if(local_air && should_atmos_process(local_air, local_air.temperature)) return From 675c22aaaac3feee936d42e94251fead72e487c0 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 01:12:24 -0400 Subject: [PATCH 032/200] Scrubbers and the beginning of atmos sensitivity removal --- code/controllers/subsystem/airmachines.dm | 2 + code/controllers/subsystem/zas.dm | 3 +- code/datums/components/wet_floor.dm | 2 +- .../effects/effect_system/effects_foam.dm | 5 +- .../effects/effect_system/effects_water.dm | 14 +++++- code/game/objects/effects/effects.dm | 5 ++ code/game/turfs/change_turf.dm | 13 ++--- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/open/space/space.dm | 4 +- code/modules/atmospherics/ZAS/Fire.dm | 2 + code/modules/atmospherics/ZAS/Temperature.dm | 3 +- code/modules/atmospherics/ZAS/Turf.dm | 38 +++++++++++++- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 2 +- .../components/unary_devices/vent_scrubber.dm | 49 ++++++++----------- 14 files changed, 96 insertions(+), 48 deletions(-) diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index d9d6a7c8b96..ffe16f5ca0c 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -235,6 +235,7 @@ SUBSYSTEM_DEF(airmachines) return machine.atmos_processing = TRUE atmos_machinery += machine + machine.flags_1 |= ATMOS_IS_PROCESSING_1 /** * Removes a given machine to the processing system for SSZAS_MACHINES processing. @@ -247,6 +248,7 @@ SUBSYSTEM_DEF(airmachines) return machine.atmos_processing = FALSE atmos_machinery -= machine + machine.flags_1 &= ~ATMOS_IS_PROCESSING_1 // If we're currently processing atmos machines, there's a chance this machine is in // the currentrun list, which is a cache of atmos_machinery. Remove it from that list diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 0f9fd9a608a..dcf849cd7cc 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -379,7 +379,8 @@ SUBSYSTEM_DEF(zas) //ASSERT(B.zone) ASSERT(A != B) #endif - + if(A.zone == B.zone) + var/scream var/block = air_blocked(A,B) if(block & AIR_BLOCKED) return diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index e21750aec8d..9a63f6b2951 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -119,7 +119,7 @@ if(-INFINITY to T0C) add_wet(TURF_WET_ICE, max_time_left()) //Water freezes into ice! if(T0C to T0C + 100) - decrease = ((T.air.temperature - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio) + decrease = ((T.return_air().temperature - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio) if(T0C + 100 to INFINITY) decrease = INFINITY decrease = max(0, decrease) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 78480f53349..1ffd68f649f 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -44,7 +44,7 @@ var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot && istype(T) && T.air) qdel(hotspot) - var/datum/gas_mixture/G = T.air + var/datum/gas_mixture/G = T.return_air() if(G.get_gas(GAS_PLASMA)) var/plas_amt = min(30, G.get_gas(GAS_PLASMA)) //Absorb some plasma G.adjust_gas(GAS_PLASMA, -plas_amt) @@ -291,9 +291,8 @@ . = ..() /obj/structure/foamedmetal/Move() - var/turf/T = loc . = ..() - //move_update_air(T) + update_nearby_tiles() /obj/structure/foamedmetal/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 4141788552f..7f8f5a6909c 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -7,12 +7,19 @@ var/life = 15 mouse_opacity = MOUSE_OPACITY_TRANSPARENT - /obj/effect/particle_effect/water/Initialize(mapload) . = ..() QDEL_IN(src, 70) /obj/effect/particle_effect/water/Move(turf/newloc) + //WOW. OKAY. THIS IS REALLY HACKY. THIS NEEDS TO BE STANDARDIZED. + var/datum/gas_mixture/env = get_step(src, 0)?.return_air() + var/diff_temp = (temperature - env.temperature) / env.group_multiplier / 4 //MAGIC NUMBER ALERT!!!!!!! + if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) + var/altered_temp = max(env.temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * diff_temp), 0) + env.temperature = (diff_temp > 0) ? min(temperature, altered_temp) : max(temperature, altered_temp) + env.update_values() + if (--src.life < 1) qdel(src) return FALSE @@ -28,6 +35,11 @@ ///Extinguisher snowflake /obj/effect/particle_effect/water/extinguisher +/obj/effect/particle_effect/water/extinguisher/Initialize(mapload) + . = ..() + if(reagents) + temperature = reagents.chem_temp + /obj/effect/particle_effect/water/extinguisher/Move() . = ..() if(!reagents) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 92ab7d3f0cb..e77a27905a0 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -5,6 +5,7 @@ icon = 'icons/effects/effects.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF move_resist = INFINITY + flags_2 = NO_TEMP_CHANGE_2 obj_flags = NONE vis_flags = VIS_INHERIT_PLANE blocks_emissive = EMISSIVE_BLOCK_GENERIC @@ -60,3 +61,7 @@ /obj/effect/dummy/singularity_act() return + +//PARIAH EDIT - PLASMA CONTAMINATION +/obj/effect/contaminate() + return diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 88fb3bd7602..21a57199504 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -40,8 +40,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) WF.InheritComponent(slip) if (copy_air) - var/turf/openTurf = T - T.air.copy_from(air) + T.return_air().copy_from(return_air()) //wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself /turf/proc/TerraformTurf(path, new_baseturf, flags) @@ -318,10 +317,11 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( ..() RemoveLattice() if(!(flags & (CHANGETURF_IGNORE_AIR | CHANGETURF_INHERIT_AIR))) - Assimilate_Air() + //Assimilate_Air() + SSzas.mark_for_update(src) //////Assimilate Air////// -/turf/open/proc/Assimilate_Air() +/*/turf/open/proc/Assimilate_Air() var/list/turf/turf_list = get_adjacent_open_turfs(src) var/turf_count = LAZYLEN(turf_list) if(blocks_air || !turf_count) @@ -333,7 +333,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/energy = 0 var/heat_cap = 0 for(var/turf/T in turf_list) - var/datum/gas_mixture/turf_mix = T.air + var/datum/gas_mixture/turf_mix = T.return_air() var/capacity = turf_mix.heat_capacity() energy += turf_mix.temperature * capacity heat_cap += capacity @@ -347,8 +347,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( total_gases[id] /= turf_count for(var/turf/T as anything in turf_list) - T.air.copy_from(total) + T.return_air().copy_from(total) SSzas.mark_for_update(T) +*/ /* /turf/open/proc/Assimilate_Air() var/turf_count = LAZYLEN(atmos_adjacent_turfs) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 3a7e3da9931..5dfdcfe2488 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -180,7 +180,7 @@ . = air.heat_capacity() /turf/open/GetTemperature() - . = air.temperature + . = return_air().temperature /turf/open/TakeTemperature(temp) air.temperature += temp diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 86d4c46115d..b938edd3bbd 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -97,8 +97,8 @@ ..() //atmos_overlay_types = null -/turf/open/space/Assimilate_Air() - return +/*/turf/open/space/Assimilate_Air() + return*/ //IT SHOULD RETURN NULL YOU MONKEY, WHY IN TARNATION WHAT THE FUCKING FUCK /turf/open/space/remove_air(amount) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 364dbf9fa47..24cf2f70868 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -130,6 +130,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /obj/effect/hotspot/process() . = 1 + if(QDELETED(src)) + return PROCESS_KILL //var/turf/simulated/my_tile = loc ZASTURF var/turf/my_tile = loc diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 0447f522f29..7b40374d89c 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -18,9 +18,8 @@ . = ..() temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - w_class, MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient -/obj/proc/HandleObjectHeating(var/obj/item/heated_by, var/mob/user, var/adjust_temp) +/atom/proc/adjust_temperature(adjust_temp, atom/heat_source) if(ATOM_IS_TEMPERATURE_SENSITIVE(src)) - visible_message(span_notice("\The [user] carefully heats \the [src] with \the [heated_by].")) var/diff_temp = (adjust_temp - temperature) if(diff_temp >= 0) var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index f57d8a69cd5..d7c20e8af0b 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -52,6 +52,41 @@ if(TURF_HAS_VALID_ZONE(unsim)) SSzas.connect(unsim, src) +///Yes. Massive copy paste. Pain. +/turf/open/space/update_air_properties() + var/block + ATMOS_CANPASS_TURF(block, src, src) + if(block & AIR_BLOCKED) + //dbg(blocked) + return 1 + + #ifdef MULTIZAS + for(var/d = 1, d < 64, d *= 2) + #else + for(var/d = 1, d < 16, d *= 2) + #endif + + var/turf/unsim = get_step(src, d) + + if(!unsim) + continue + + block = unsim.c_airblock(src) + + if(block & AIR_BLOCKED) + //unsim.dbg(air_blocked, turn(180,d)) + continue + + var/r_block = c_airblock(unsim) + + if(r_block & AIR_BLOCKED) + continue + + if(!istype(unsim, /turf/open/space)) + var/turf/sim = unsim + if(TURF_HAS_VALID_ZONE(sim)) + SSzas.connect(sim, src) + // Helper for can_safely_remove_from_zone(). //ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT #define GET_ZONE_NEIGHBOURS(T, ret) \ @@ -221,7 +256,6 @@ else if(verbose) log_admin("[d] has invalid zone.") #endif - else //Postponing connections to tiles until a zone is assured. @@ -241,6 +275,8 @@ //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. for(var/turf/T in postponed) + if(T.zone == src.zone) + CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning SSzas.connect(src, T) /turf/proc/post_update_air_properties() diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 1d520237b4b..9b8f3189676 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -509,7 +509,7 @@ /turf/open/proc/copy_air_with_tile(turf/open/target_turf) if(istype(target_turf)) - air.copy_from(target_turf.air) + return_air().copy_from(target_turf.return_air()) /datum/gas_mixture/proc/leak_to_enviroment(datum/gas_mixture/environment) pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.return_pressure() - environment.return_pressure())) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 391d156f517..8cf918b441f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -51,7 +51,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/Initialize(mapload) . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) + SSairmachines.start_processing_machine(src) /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() var/area/scrub_area = get_area(src) @@ -62,6 +62,7 @@ SSradio.remove_object(src,frequency) radio_connection = null adjacent_turfs.Cut() + SSairmachines.stop_processing_machine(src) return ..() ///adds a gas or list of gases to our filter_types. used so that the scrubber can check if its supposed to be processing after each change @@ -78,7 +79,7 @@ if(!turf_gas) return FALSE - check_atmos_process(our_turf, turf_gas, turf_gas.temperature) + COOLDOWN_RESET(src, check_turfs_cooldown) return TRUE ///remove a gas or list of gases from our filter_types.used so that the scrubber can check if its supposed to be processing after each change @@ -96,7 +97,7 @@ if(!turf_gas) return FALSE - check_atmos_process(our_turf, turf_gas, turf_gas.temperature) + COOLDOWN_RESET(src, check_turfs_cooldown) return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/toggle_filters(filter_or_filters) @@ -110,12 +111,10 @@ if(!isopenturf(our_turf)) return FALSE - var/datum/gas_mixture/turf_gas = our_turf.air + var/datum/gas_mixture/turf_gas = our_turf.return_air() if(!turf_gas) return FALSE - - check_atmos_process(our_turf, turf_gas, turf_gas.temperature) return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() @@ -212,23 +211,27 @@ return FALSE -/obj/machinery/atmospherics/components/unary/vent_scrubber/atmos_expose(datum/gas_mixture/air, exposed_temperature) +/obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() if(welded || !is_operational) - return FALSE - if(!nodes[1] || !on) + return + if(!on || !nodes[1]) on = FALSE - return FALSE + return + if(!COOLDOWN_FINISHED(src, check_turfs_cooldown)) + return var/turf/open/us = loc if(!istype(us)) return - scrub(us) + var/should_cooldown = TRUE + if(scrub(us)) + should_cooldown = FALSE if(widenet) - if(COOLDOWN_FINISHED(src, check_turfs_cooldown)) - check_turfs() - COOLDOWN_START(src, check_turfs_cooldown, 2 SECONDS) - + check_turfs() for(var/turf/tile in adjacent_turfs) - scrub(tile) + if(scrub(tile)) + should_cooldown = FALSE + if(should_cooldown) + COOLDOWN_START(src, check_turfs_cooldown, 5 SECONDS) return TRUE ///filtered gases at or below this amount automatically get removed from the mix @@ -297,20 +300,15 @@ var/old_scrubbing = scrubbing var/old_filter_length = length(filter_types) - ///whether we should attempt to start processing due to settings allowing us to take gas out of our environment - var/try_start_processing = FALSE - var/turf/open/our_turf = get_turf(src) - var/datum/gas_mixture/turf_gas = our_turf?.air + var/datum/gas_mixture/turf_gas = our_turf?.return_air() var/atom/signal_sender = signal.data["user"] if("power" in signal.data) on = text2num(signal.data["power"]) - try_start_processing = TRUE if("power_toggle" in signal.data) on = !on - try_start_processing = TRUE if("widenet" in signal.data) widenet = text2num(signal.data["widenet"]) @@ -319,10 +317,8 @@ if("scrubbing" in signal.data) scrubbing = text2num(signal.data["scrubbing"]) - try_start_processing = TRUE if("toggle_scrubbing" in signal.data) scrubbing = !scrubbing - try_start_processing = TRUE if(scrubbing != old_scrubbing) investigate_log(" was toggled to [scrubbing ? "scrubbing" : "siphon"] mode by [key_name(signal_sender)]",INVESTIGATE_ATMOS) @@ -345,11 +341,6 @@ broadcast_status() update_appearance() - if(!our_turf || !turf_gas) - try_start_processing = FALSE - - if(try_start_processing)//check if our changes should make us start processing - check_atmos_process(our_turf, turf_gas, turf_gas.temperature) if(length(filter_types) == old_filter_length && old_scrubbing == scrubbing && old_widenet == widenet) return From fa82440f49715fb96dffbfa7a342c534f5c1c6aa Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 10:47:08 -0400 Subject: [PATCH 033/200] fixes the overlay code w/ placeholders --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/__DEFINES/layers.dm | 1 + code/controllers/subsystem/zas.dm | 2 -- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 6 ++++-- code/modules/atmospherics/ZAS/XGM/gases.dm | 8 ++++++-- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 2 +- code/modules/atmospherics/ZAS/Zone.dm | 2 +- .../atmospherics/machinery/portable/canister.dm | 10 ++++++---- .../master_files/icons/effects/gas_overlays.dmi | Bin 0 -> 7707 bytes .../master_files/icons/effects/tile_effects.dmi | Bin 1514 -> 0 bytes 10 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 modular_pariah/master_files/icons/effects/gas_overlays.dmi delete mode 100644 modular_pariah/master_files/icons/effects/tile_effects.dmi diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 16f2c26141e..616fd777028 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,4 +1,4 @@ -#define ZASDBG +//#define ZASDBG //#define MULTIZAS #define AIR_ALLOWED 0 diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index f16f597a88a..b5366603493 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -115,6 +115,7 @@ // ABOVE_GAME_PLANE layers //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define +#define GAS_LAYER 5 #define GASFIRE_LAYER 5.05 #define RIPPLE_LAYER 5.1 diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index dcf849cd7cc..5cfc0f8da3c 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -379,8 +379,6 @@ SUBSYSTEM_DEF(zas) //ASSERT(B.zone) ASSERT(A != B) #endif - if(A.zone == B.zone) - var/scream var/block = air_blocked(A,B) if(block & AIR_BLOCKED) return diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 532ce87360c..34e18b9583a 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -93,11 +93,13 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new /obj/effect/gas_overlay name = "gas" desc = "You shouldn't be clicking this." - icon = 'modular_pariah/master_files/icons/effects/tile_effects.dmi' + icon = 'modular_pariah/master_files/icons/effects/gas_overlays.dmi' icon_state = "generic" - layer = FIRE_LAYER + layer = GAS_LAYER + plane = ABOVE_GAME_PLANE appearance_flags = RESET_COLOR|PIXEL_SCALE|TILE_BOUND mouse_opacity = 0 + vis_flags = NONE var/gas_id /obj/effect/gas_overlay/proc/update_alpha_animation(var/new_alpha) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 1f38fa75453..ad184f3e607 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -47,7 +47,8 @@ //and following a N/Z ratio of 1.5, the molar mass of a monatomic gas is: molar_mass = 0.405 // kg/mol - tile_color = "#ff9940" + //tile_color = "#ff9940" + tile_overlay = "phoron" overlay_limit = 0.7 flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL breathed_product = /datum/reagent/toxin/plasma @@ -59,6 +60,7 @@ name = "Nitrous Oxide" specific_heat = 40 // J/(mol*K) molar_mass = 0.044 // kg/mol. N2O + tile_overlay = "sleeping_agent" flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" @@ -100,6 +102,7 @@ tile_color = RANDOM_RGB overlay_limit = 0.5 + /datum/xgm_gas/hydrogen id = GAS_HYDROGEN name = "Hydrogen" @@ -180,7 +183,6 @@ /datum/xgm_gas/nitricoxide id = GAS_NO name = "Nitric Oxide" - specific_heat = 10 // J/(mol*K) molar_mass = 0.030 // kg/mol flags = XGM_GAS_OXIDIZER @@ -194,6 +196,8 @@ overlay_limit = 0.5 specific_heat = 5 // J/(mol*K) molar_mass = 0.017 // kg/mol + tile_overlay = "chlorine" + overlay_limit = 0.1 flags = XGM_GAS_CONTAMINANT //breathed_product = /datum/reagent/toxin/chlorine symbol_html = "Cl" diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 9b8f3189676..194ff75e82e 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -368,7 +368,7 @@ var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) for(var/obj/effect/gas_overlay/O in graphic) var/concentration_mod = clamp(gas[O.gas_id] / total_moles, 0.1, 1) - var/new_alpha = min(230, round(pressure_mod * concentration_mod * 180, 5)) + var/new_alpha = min(240, round(pressure_mod * concentration_mod * 180, 5)) if(new_alpha != O.alpha) O.update_alpha_animation(new_alpha) diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index cb183465d3a..0eeda7ec58e 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -162,7 +162,7 @@ Class Procs: // Update gas overlays. if(air.check_tile_graphic(graphic_add, graphic_remove)) //for(var/turf/simulated/T in contents) - for(var/turf/T in contents) + for(var/turf/open/T in contents) T.update_graphic(graphic_add, graphic_remove) graphic_add.len = 0 graphic_remove.len = 0 diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 97f5962d66b..8eee12b0e2f 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -109,7 +109,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) pressure_limit = initial(pressure_limit) * (1 + 0.2 * random_quality) update_appearance() - AddElement(/datum/element/atmos_sensitive, mapload) AddElement(/datum/element/volatile_gas_storage) AddComponent(/datum/component/gas_leaker, leak_rate=0.01) @@ -207,6 +206,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = GAS_N2O greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#c63e3b#f7d5d3" + +/obj/machinery/portable_atmospherics/canister/chlorine + name = "Chlorine canister" + gas_type = GAS_CHLORINE + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#b9d41b" /* /obj/machinery/portable_atmospherics/canister/nitrium name = "Nitrium canister" @@ -496,7 +501,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(!. || QDELETED(src)) return - SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/atom_break(damage_flag) . = ..() @@ -573,8 +577,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) excited = TRUE update_appearance() - return ..() - /obj/machinery/portable_atmospherics/canister/ui_state(mob/user) return GLOB.physical_state diff --git a/modular_pariah/master_files/icons/effects/gas_overlays.dmi b/modular_pariah/master_files/icons/effects/gas_overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d4fa5ad522ff1c0553a274befb6364ae9b6a5993 GIT binary patch literal 7707 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 V_PJX1`56EJ002ovPDHLkV1h*q7{UMm literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/icons/effects/tile_effects.dmi b/modular_pariah/master_files/icons/effects/tile_effects.dmi deleted file mode 100644 index a1b92ff11dcb9f2167baf28d9daae8187d078c01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmV<G1r_><P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0001XdQ@0+L}hbh za%pgMX>V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#H!Q}a@bGLx0KI8!o<iWO`X47oVdiV|~EA#Aw1cmfKQ6<qyX z6kL2gxd8NrCc=Qv(!2lw1uscNK~!jgwOPw@<2Vd#kaC>)|IeJm9>=joVGin+T3kEH zidj~rM2i#}1o2K}=5MTH0&oFv1rRunw7J%10C#?K!Rzth`h(xxNJBIyKCAKY9sEX` zlhJrKX0Fft=I;0tfXGZlM9s_^5y;E~frtY?)d(~lA~U1gCpr>NM8ss@YP0Z5W|k-T zt)p9v#=?WuPw*w2hzRFBw3uY9MMTj~5|HGOnNvh0e+O3SgF?7P#Je3vhzEWE+;ZjA z-z6DaB4X+AtAxzUk<deYQ3&^lc>4zay~mHt{D(g#+ZdU7A!AKaw!?!0XnYSo->_@Q zj+{A1#2?PZSbg%n<4?Shh5L#f9^_@=d+>R|t|5-!BI2XNF94Qe`#u27nc1-3ifksy zoNRc>qmDNF`@=o6t%I~KoCClw?B=8K0MIgXA%5cllgx^r9)GdF597u08+gIQzjFWj zk~ajb_C8TcNv0&VjW9I>I65b3$Bl=TMm=nwv_$h*$*1hR(H99{<_DUGOhgygUqoPa zauarqnr)x7MDvhjU1i+q>DH#qluZguw>)9J(TPBFW<CHsGE=nW{NA`eXJ+AhS8E9Y zMq3UV{07*~LV~>VnOL=G#;(m_!oG05kyb4LCf?|jnPL|93=)EQXjidH!RU~Ph?bcT z-l8;C^sbyQShc0{Ml11qpAa+)$6pM;=rD%AP^%qZ^e&t)0PaN+AtTjpSszvRrZfe2 zbS)xo*nI^+8@3zhHEg1%uUKt*0Z<eQ{cwEm_;P%DxkSVryRQ(w==S(6A}aAq;Q`<H z@jG^J+dPg(gzQ@CxY-}4cdTmHGb@v-COCJJg<-g0H4%CK#Wja}D%Kl+hCdt6jxUoc zCb&(5Wxu48LA8NN4`e6=+QrwVZ?tAkb7PKs4sn{}I*7l#z+Vg>ukfWZ6?^_6J1Q0l z-ar+z2%vFDQ+bHVOsS{q-dUWKPw*8&h3_Wv3cs2u{fjQ&HvkctdBagPlTvz+u?c(r zyk&q4U9N^<hpX779oTQ#Yk--wt~jcu@MpeP4kCPo#^njVCq<6GrQ?R*0L-#0EzFsD z<wpX$n}j_tI3(;~G%$}oQ60n7a=Qua1&ZhPjTxx$Rq$wdUeM#KmMEOpFYqgX=H9en z4T)}G@~jue*2<edIJ=Jc1mF@8!LYW9zAIF)J0iF9`T~DqL@B)a_6dH~IljPOLo1UO zt$LLP?B4oebNAq0Syj9)r=N{yC2o%|A<Z`T9K`WuuFuNpm-xyAdqy;r-TlHEBByR& zcF)hivfHQHp+ArhWp`KXh1O5uF91F!u&I#e>v^f**?z)MJ#YA@`U%R#N9uVcDQEi$ zL-joOo$e=iKj3UVuW`1Ypz82cJ#X7i^%J(V7vuH(*?z)MJ#XVwKcQfE4%%?*1n{su z6?^Ke3J?sD3EDg9D~p`Dz6si5xH~5?eD4G>+n$0wsZx>z37xbZU-f}#FF2;oTTMPv z&yV&KhU$3?_7jw~jnwm_{e+=<9)taag7JEOw4X3k&ttHkP=Mij{-^p0r|NkO_7fDp zN9y^}e!@^akHLO|qQHiq=j!>N?k9Y^p0{(n!vD0Nu>Ft&A%m4dkgdy0`~UIYJLb2w z%zVcl*8}V)kU?oypX`J&SS+=c_us-Ec6E3BZ7nn3h_6ELVffOlaHhrhnR@=G`U$7% zc?|XwioFo=v-SK>^%MS6J#YA@`U#QizsLWtdj3281ZmKzdj1RiFZ&690cia=`?d<| QRsaA107*qoM6N<$f;TbqKmY&$ From c40859547afdf9bb5e9d3e77dd59efd0c4195664 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:44:46 -0400 Subject: [PATCH 034/200] SSairmachines now recovers during MC failure --- code/controllers/subsystem/airmachines.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index ffe16f5ca0c..5f2827af1ba 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -42,6 +42,15 @@ SUBSYSTEM_DEF(airmachines) msg += "EQ: [length(expansion_queue)]" return ..() +/datum/controller/subsystem/airmachines/Recover() + pipe_init_dirs_cache = SSairmachines.pipe_init_dirs_cache + networks = SSairmachines.networks + rebuild_queue = SSairmachines.rebuild_queue + expansion_queue = SSairmachines.expansion_queue + atmos_machinery = SSairmachines.atmos_machinery + current_run = SSairmachines.current_run + current_part = SSairmachines.current_part + return ..() /datum/controller/subsystem/airmachines/fire(resumed = FALSE) var/timer = TICK_USAGE_REAL From 59f7ea5205ae202661b00ec2b55b8cb2d24057f4 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 17:35:02 -0400 Subject: [PATCH 035/200] BURN BABY BURN. And glass cracking sounds --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/__DEFINES/~pariah_defines/sound.dm | 1 + code/controllers/subsystem/airmachines.dm | 2 +- code/game/atom_defense.dm | 10 + code/game/objects/structures/holosign.dm | 4 +- code/game/objects/structures/window.dm | 42 ++- code/modules/atmospherics/ZAS/Fire.dm | 2 +- .../atmospherics/ZAS/zas_extras/inflatable.dm | 333 ++++++++++++++++++ .../master_files/code/game/sound.dm | 8 + .../master_files/icons/obj/inflatable.dmi | Bin 0 -> 17220 bytes .../sound/effects/glass_crack1.ogg | Bin 0 -> 6312 bytes .../sound/effects/glass_crack2.ogg | Bin 0 -> 4486 bytes .../sound/effects/glass_crack3.ogg | Bin 0 -> 5967 bytes .../sound/effects/glass_crack4.ogg | Bin 0 -> 6812 bytes tgstation.dme | 1 + 15 files changed, 392 insertions(+), 13 deletions(-) create mode 100644 code/modules/atmospherics/ZAS/zas_extras/inflatable.dm create mode 100644 modular_pariah/master_files/icons/obj/inflatable.dmi create mode 100644 modular_pariah/master_files/sound/effects/glass_crack1.ogg create mode 100644 modular_pariah/master_files/sound/effects/glass_crack2.ogg create mode 100644 modular_pariah/master_files/sound/effects/glass_crack3.ogg create mode 100644 modular_pariah/master_files/sound/effects/glass_crack4.ogg diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 616fd777028..16f2c26141e 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,4 +1,4 @@ -//#define ZASDBG +#define ZASDBG //#define MULTIZAS #define AIR_ALLOWED 0 diff --git a/code/__DEFINES/~pariah_defines/sound.dm b/code/__DEFINES/~pariah_defines/sound.dm index 07cde8f775b..573c990e817 100644 --- a/code/__DEFINES/~pariah_defines/sound.dm +++ b/code/__DEFINES/~pariah_defines/sound.dm @@ -3,3 +3,4 @@ * Sound effect defines, used in get_sfx. */ #define SFX_KEYBOARD "keyboard" +#define SFX_GLASS_CRACK "glass_crack" diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index 5f2827af1ba..02e872bc111 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -49,7 +49,7 @@ SUBSYSTEM_DEF(airmachines) expansion_queue = SSairmachines.expansion_queue atmos_machinery = SSairmachines.atmos_machinery current_run = SSairmachines.current_run - current_part = SSairmachines.current_part + current_process = SSairmachines.current_process return ..() /datum/controller/subsystem/airmachines/fire(resumed = FALSE) diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm index 2755e3089de..2c4dab7debe 100644 --- a/code/game/atom_defense.dm +++ b/code/game/atom_defense.dm @@ -58,6 +58,16 @@ SHOULD_BE_PURE(TRUE) return atom_integrity +/** + * Retrieves the atom's current damage as a percentage where `100%` is `100`. + * If `use_raw_values` is `TRUE`, uses the raw var values instead of the `get_*` proc results. + */ +/atom/proc/get_integrity_percentage() + return round((get_integrity_lost())/max_integrity * 100) + +/atom/proc/get_integrity_lost() + return max_integrity - get_integrity() + ///returns the damage value of the attack after processing the atom's various armor protections /atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) if(!uses_integrity) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 62daaf3102a..f2875d4c213 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -106,7 +106,7 @@ . = ..() var/turf/local = get_turf(loc) ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) /obj/structure/holosign/barrier/atmos/block_superconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players. return TRUE @@ -114,7 +114,7 @@ /obj/structure/holosign/barrier/atmos/Destroy() var/turf/local = get_turf(loc) REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() return ..() /obj/structure/holosign/barrier/cyborg diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 514aa9be0b3..36a323c8cf5 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -33,6 +33,10 @@ var/hit_sound = 'sound/effects/glasshit.ogg' /// If some inconsiderate jerk has had their blood spilled on this window, thus making it cleanable var/bloodied = FALSE + ///Snowflake for fire act damage + var/damage_per_fire_tick = 1 + ///The amount of heat needed to start damaging the window + var/melting_point = T0C + 3000 //See, because some dipass decided to make the station 50% glass, NT opted to infuse all the windows with plasma. /obj/structure/window/examine(mob/user) . = ..() @@ -58,7 +62,7 @@ if(reinf && anchored) state = RWINDOW_SECURE - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) if(fulltile) setDir() @@ -69,7 +73,6 @@ flags_1 |= ALLOW_DARK_PAINTS_1 RegisterSignal(src, COMSIG_OBJ_PAINTED, .proc/on_painted) - AddElement(/datum/element/atmos_sensitive, mapload) AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, AfterRotation = CALLBACK(src,.proc/AfterRotation)) var/static/list/loc_connections = list( @@ -277,9 +280,22 @@ /obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) + var/initial_damage_percentage = get_integrity_percentage() . = ..() if(.) //received damage update_nearby_icons() + if(atom_integrity > 0) + playsound(src, get_sfx(SFX_GLASS_CRACK), 100, TRUE) + var/damage_percentage = get_integrity_percentage() + if (damage_percentage >= 75 && initial_damage_percentage < 75) + visible_message(span_warning("\The [src] looks like it's about to shatter!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) + else if (damage_percentage >= 50 && initial_damage_percentage < 50) + visible_message(span_warning("\The [src] looks seriously damaged!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) + else if (damage_percentage >= 25 && initial_damage_percentage < 25) + visible_message(span_warning("Cracks begin to appear in \the [src]!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) /obj/structure/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -297,6 +313,7 @@ return if(!disassembled) playsound(src, break_sound, 70, TRUE) + visible_message(span_danger("\The [src] shatters into pieces!"), null, "You hear glass shatter!") if(!(flags_1 & NODECONSTRUCT_1)) for(var/obj/item/shard/debris in spawnDebris(drop_location())) transfer_fingerprints_to(debris) // transfer fingerprints to shards only @@ -366,11 +383,9 @@ crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) . += crack_overlay -/obj/structure/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > T0C + heat_resistance - -/obj/structure/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(round(air.return_volume() / 100), BURN, 0, 0) +/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if (exposed_temperature > melting_point) + take_damage(round(air.return_volume() / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location() return null @@ -412,6 +427,7 @@ glass_type = /obj/item/stack/sheet/rglass rad_insulation = RAD_HEAVY_INSULATION receive_ricochet_chance_mod = 1.1 + melting_point = T0C + 4000 //this is shitcode but all of construction is shitcode and needs a refactor, it works for now //If you find this like 4 years later and construction still hasn't been refactored, I'm so sorry for this //Adding a timestamp, I found this in 2020, I hope it's from this year -Lemon @@ -522,6 +538,7 @@ explosion_block = 1 glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_NO_INSULATION + melting_point = 25000 //Yeah fuck you /obj/structure/window/plasma/Initialize(mapload, direct) . = ..() @@ -612,6 +629,7 @@ smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 + melting_point = 25000 /obj/structure/window/plasma/fulltile/unanchored anchored = FALSE @@ -628,6 +646,7 @@ smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 + melting_point = 28000 /obj/structure/window/reinforced/plasma/fulltile/unanchored anchored = FALSE @@ -667,6 +686,8 @@ base_icon_state = "rice_window" max_integrity = 150 glass_amount = 2 + melting_point = T0C + damage_per_fire_tick = 15 //there is a sub shuttle window in survival_pod.dm for mining pods /obj/structure/window/reinforced/shuttle//this is called reinforced because it is reinforced w/titanium @@ -690,6 +711,8 @@ glass_type = /obj/item/stack/sheet/titaniumglass glass_amount = 2 receive_ricochet_chance_mod = 1.2 + melting_point = 8000 + damage_per_fire_tick = 5 /obj/structure/window/reinforced/shuttle/narsie_act() add_atom_colour("#3C3434", FIXED_COLOUR_PRIORITY) @@ -720,6 +743,7 @@ glass_type = /obj/item/stack/sheet/plastitaniumglass glass_amount = 2 rad_insulation = RAD_HEAVY_INSULATION + melting_point = 10000000 //Yeah this thing isnt melting /obj/structure/window/reinforced/plasma/plastitanium/unanchored anchored = FALSE @@ -749,6 +773,8 @@ bash_sound = 'sound/weapons/slashmiss.ogg' break_sound = 'sound/items/poster_ripped.ogg' hit_sound = 'sound/weapons/slashmiss.ogg' + melting_point = T0C + damage_per_fire_tick = 15 var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1) @@ -790,7 +816,7 @@ /obj/structure/window/paperframe/attackby(obj/item/W, mob/living/user) if(W.get_temperature()) - fire_act(W.get_temperature()) + fire_act(null, W.get_temperature(), null) return if(user.combat_mode) return ..() diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 24cf2f70868..6858ce84282 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -463,7 +463,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) -/turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adjt_temp) +/turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adj_temp, adj_volume) return //turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) ZASTURF diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm new file mode 100644 index 00000000000..f299c1f4206 --- /dev/null +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -0,0 +1,333 @@ +/obj/item/inflatable + name = "inflatable" + w_class = WEIGHT_CLASS_NORMAL + icon = 'modular_pariah/master_files/icons/obj/inflatable.dmi' + max_integrity = 10 + var/deploy_path = null + +/obj/item/inflatable/attack_self(mob/user, modifiers) + if(!deploy_path) + return + var/turf/T = get_turf(src) + if (isspaceturf(T)) + to_chat(user, span_warning("You cannot use \the [src] in open space.")) + return + + user.visible_message( + span_notice("\The [user] starts inflating \an [src]."), + span_notice("You start inflating \the [src]."), + span_notice("You can hear rushing air."), + vision_distance = 5 + ) + if (!do_after(user, 1 SECONDS)) + return + + user.visible_message( + span_notice("\The [user] finishes inflating \an [src]."), + span_notice("You inflate \the [src]."), + vision_distance = 5 + ) + playsound(loc, 'sound/items/zip.ogg', 75, 1) + var/obj/structure/inflatable/R = new deploy_path(T) + transfer_fingerprints_to(R) + R.add_fingerprint(user) + update_integrity(R.get_integrity()) + qdel(src) + +/obj/item/inflatable/wall + name = "inflatable wall" + desc = "A folded membrane which rapidly expands into a large cubical shape on activation." + icon_state = "folded_wall" + deploy_path = /obj/structure/inflatable/wall + +/obj/item/inflatable/door + name = "inflatable door" + desc = "A folded membrane which rapidly expands into a simple door on activation." + icon_state = "folded_door" + deploy_path = /obj/structure/inflatable/door + +/obj/structure/inflatable + name = "inflatable" + desc = "An inflated membrane. Do not puncture." + density = TRUE + anchored = TRUE + opacity = 0 + icon = 'modular_pariah/master_files/icons/obj/inflatable.dmi' + icon_state = "wall" + can_atmos_pass = CANPASS_DENSITY + max_integrity = 10 + + + var/undeploy_path = null + var/taped + + var/max_pressure_diff = 50 * ONE_ATMOSPHERE // In Baystation this is a Rigsuit level of protection + var/max_temp = 5000 //In Baystation this is the heat protection value of a space suit. + +/obj/structure/inflatable/wall + name = "inflatable wall" + undeploy_path = /obj/item/inflatable/wall + can_atmos_pass = CANPASS_NEVER + +/obj/structure/inflatable/New(location) + ..() + update_nearby_tiles(need_rebuild=1) + +/obj/structure/inflatable/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/structure/inflatable/Destroy() + update_nearby_tiles() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/structure/inflatable/process() + check_environment() + +/obj/structure/inflatable/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + playsound(src, 'sound/effects/glasshit.ogg', 75, TRUE) + +/obj/structure/inflatable/proc/check_environment() + var/min_pressure = INFINITY + var/max_pressure = 0 + var/max_local_temp = 0 + + for(var/check_dir in GLOB.cardinals) + var/turf/T = get_step(src, check_dir) + var/datum/gas_mixture/env = T.return_air() + var/pressure = env.return_pressure() + min_pressure = min(min_pressure, pressure) + max_pressure = max(max_pressure, pressure) + max_local_temp = max(max_local_temp, env.temperature) + + if(prob(50) && (max_pressure - min_pressure > max_pressure_diff || max_local_temp > max_temp)) + var/initial_damage_percentage = round(atom_integrity / max_integrity * 100) + take_damage(1) + var/damage_percentage = round(atom_integrity / max_integrity * 100) + if (damage_percentage >= 70 && initial_damage_percentage < 70) + visible_message(span_warning("\The [src] is barely holding up!")) + else if (damage_percentage >= 30 && initial_damage_percentage < 30) + visible_message(span_warning("\The [src] is taking damage!")) + +/obj/structure/inflatable/examine(mob/user) + . = ..() + if (taped) + to_chat(user, span_notice("It's being held together by duct tape.")) + +/obj/structure/inflatable/attackby(obj/item/W, mob/user, params) + if(!istype(W)) //|| istype(W, /obj/item/inflatable_dispenser)) + return + + if(!isturf(user.loc)) + return //can't do this stuff whilst inside objects and such + if(isliving(user)) + var/mob/living/living_user = user + if(living_user.combat_mode) + if (W.sharpness & SHARP_POINTY || W.force > 10) + attack_generic(user, W.force, BRUTE) + return + + if(istype(W, /obj/item/stack/sticky_tape) && (max_integrity - atom_integrity) >= 3) + if(taped) + to_chat(user, span_notice("\The [src] can't be patched any more with \the [W]!")) + return TRUE + else + taped = TRUE + to_chat(user, span_notice("You patch some damage in \the [src] with \the [W]!")) + repair_damage(3) + return TRUE + + ..() + +/obj/structure/inflatable/atom_break(damage_flag) + . = ..() + deflate(TRUE) + +/obj/structure/inflatable/proc/deflate(violent) + playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + if(violent) + visible_message("[src] rapidly deflates!") + var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) + src.transfer_fingerprints_to(R) + qdel(src) + else + if(!undeploy_path) + return + visible_message("\The [src] slowly deflates.") + addtimer(CALLBACK(src, .proc/after_deflate), 5 SECONDS, TIMER_STOPPABLE) + +/obj/structure/inflatable/proc/after_deflate() + if(QDELETED(src)) + return + var/obj/item/inflatable/R = new undeploy_path(src.loc) + src.transfer_fingerprints_to(R) + R.update_integrity(src.get_integrity()) + qdel(src) + +/obj/structure/inflatable/verb/hand_deflate() + set name = "Deflate" + set category = "Object" + set src in oview(1) + + if(!usr.Adjacent(src)) + return FALSE + if(!usr.Adjacent(src)) + return FALSE + if(!iscarbon(usr)) + return FALSE + + var/mob/living/carbon/user = usr + if(user.handcuffed || user.stat != CONSCIOUS || user.incapacitated()) + return FALSE + + verbs -= /obj/structure/inflatable/verb/hand_deflate + deflate() + return TRUE + +/obj/structure/inflatable/attack_generic(var/mob/user, var/damage, var/attack_verb) + . = ..() + if(.) + user.visible_message("<span class='danger'>[user] [attack_verb] open the [src]!</span>") + else + user.visible_message("<span class='danger'>[user] [attack_verb] at [src]!</span>") + + +/obj/structure/inflatable/door //Based on mineral door code + name = "inflatable door" + density = TRUE + anchored = TRUE + opacity = 0 + + icon_state = "door_closed" + undeploy_path = /obj/item/inflatable/door + + var/state = 0 //closed, 1 == open + var/isSwitchingStates = 0 + +/obj/structure/inflatable/door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral + if(isAI(user)) //so the AI can't open it + return + +/obj/structure/inflatable/door/attack_robot(mob/living/user) + if(get_dist(user,src) <= 1) //not remotely though + return TryToSwitchState(user) + +/obj/structure/inflatable/door/attack_hand(mob/user as mob) + . = ..() + if(.) + return + return TryToSwitchState(user) + +/obj/structure/inflatable/door/proc/TryToSwitchState(atom/user) + if(isSwitchingStates) return + if(ismob(user)) + var/mob/M = user + if(M.client) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!C.handcuffed) + SwitchState() + else + SwitchState() + +/obj/structure/inflatable/door/proc/SwitchState() + if(state) + Close() + else + Open() + +/obj/structure/inflatable/door/proc/Open() + isSwitchingStates = 1 + flick("door_opening",src) + addtimer(CALLBACK(src, .proc/FinishOpen), 1 SECONDS, TIMER_STOPPABLE) + +/obj/structure/inflatable/door/proc/FinishOpen() + set_density(0) + set_opacity(0) + state = 1 + update_icon() + isSwitchingStates = 0 + update_nearby_tiles() + +/obj/structure/inflatable/door/proc/Close() + // If the inflatable is blocked, don't close + for(var/turf/T in locs) + for(var/atom/movable/AM as anything in T) + if(AM.density) + return + + isSwitchingStates = 1 + flick("door_closing",src) + addtimer(CALLBACK(src, .proc/FinishClose), 1 SECONDS, TIMER_STOPPABLE) + +/obj/structure/inflatable/door/proc/FinishClose() + set_density(1) + set_opacity(0) + state = 0 + update_icon() + isSwitchingStates = 0 + update_nearby_tiles() + +/obj/structure/inflatable/door/update_icon() + . = ..() + if(state) + icon_state = "door_open" + else + icon_state = "door_closed" + + +/obj/structure/inflatable/door/deflate(var/violent=0) + playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + if(violent) + visible_message("[src] rapidly deflates!") + var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) + src.transfer_fingerprints_to(R) + qdel(src) + else + visible_message("[src] slowly deflates.") + spawn(50) + var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) + src.transfer_fingerprints_to(R) + qdel(src) + +/obj/item/inflatable/torn + name = "torn inflatable wall" + desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable." + icon = 'modular_pariah/master_files/icons/obj/inflatable.dmi' + icon_state = "folded_wall_torn" + +/obj/item/inflatable/torn/attack_self(mob/user) + to_chat(user, "<span class='notice'>The inflatable wall is too torn to be inflated!</span>") + add_fingerprint(user) + +/obj/item/inflatable/door/torn + name = "torn inflatable door" + desc = "A folded membrane which rapidly expands into a simple door on activation. It is too torn to be usable." + icon = 'modular_pariah/master_files/icons/obj/inflatable.dmi' + icon_state = "folded_door_torn" + +/obj/item/inflatable/door/torn/attack_self(mob/user) + to_chat(user, "<span class='notice'>The inflatable door is too torn to be inflated!</span>") + add_fingerprint(user) + +/obj/item/storage/briefcase/inflatable + name = "inflatable barrier box" + desc = "Contains inflatable walls and doors." + w_class = WEIGHT_CLASS_NORMAL + max_integrity = 150 + force = 8 + hitsound = SFX_SWING_HIT + throw_speed = 2 + throw_range = 4 + var/startswith = list(/obj/item/inflatable/door = 2, /obj/item/inflatable/wall = 3) + +/obj/item/storage/briefcase/inflatable/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.set_holdable(list(/obj/item/inflatable)) + +/obj/item/storage/briefcase/inflatable/PopulateContents() + for(var/path in startswith) + for(var/i in 1 to startswith[path]) + new path(src) diff --git a/modular_pariah/master_files/code/game/sound.dm b/modular_pariah/master_files/code/game/sound.dm index fd542f6f946..7434392cd0c 100644 --- a/modular_pariah/master_files/code/game/sound.dm +++ b/modular_pariah/master_files/code/game/sound.dm @@ -9,4 +9,12 @@ 'modular_pariah/modules/aesthetics/computer/sound/keypress4.ogg', 'modular_pariah/modules/aesthetics/computer/sound/keystroke4.ogg', ) + if(SFX_GLASS_CRACK) + soundin = pick( + 'modular_pariah/master_files/sound/effects/glass_crack1.ogg', + 'modular_pariah/master_files/sound/effects/glass_crack2.ogg', + 'modular_pariah/master_files/sound/effects/glass_crack3.ogg', + 'modular_pariah/master_files/sound/effects/glass_crack4.ogg', + ) + return soundin diff --git a/modular_pariah/master_files/icons/obj/inflatable.dmi b/modular_pariah/master_files/icons/obj/inflatable.dmi new file mode 100644 index 0000000000000000000000000000000000000000..403e39c6378cc2a3ce5c18b6d41f461f2c6af806 GIT binary patch literal 17220 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 VZ;aea*c1Q&002ovPDHLkV1hNxiI@NY literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/sound/effects/glass_crack1.ogg b/modular_pariah/master_files/sound/effects/glass_crack1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0221b238d7f28fa8029dd86b0a7acd37fb53d6b6 GIT binary patch literal 6312 zcmahs2{_c-+rL3}H6-Cq88R`}8Cyo_qQ)|eWz1L`Vhkq6HpbdA)<onAmE=kzyDnvj zc1v!Slr7<^6e9gA(xUjzjC=pz|9igYd%p9WIrE-(JMVeVd(Qj*oPvT}AtC7RcE@A` z*dF@W7Pb=>6CUNyVDV8fPTK}0LKY?fT3}9m$$vM#B%ksd<LdJ*>z(WW(PV`;^k@UJ z2O}a_&nYSh8Orc?6KF@;Aq_BC1B?O25UJ_J3}Zw@(OLAcX!K^lt_*&(aAt&GG{ZlX z?&}}r7Z$)WkBmkl!x$mq+X2;*M7DD!n>$6(_2@_vJ&+Mbk7CeST6~g&6@_T-8qN+2 zK!yh*-NU0o%#c>0ezXu4lMx+^qz5pf8R20_EOHy*w!u4+@aEPGdT0PLicSlU3Sfi< z@d*c<h(x?2+11<>;~&A)K^oxv{i2ir!OEG4)bywOMYE6*^e7~g5yp<DqX8RV$~8PN zI@T|WZtmb06KHItXQGG2U{nFYne89SU<K2o{+G>2P2h+<XgR<{wj(>>&4WVySS(*! z6tEbp0I(#y1K!dVf53_2NG5p#Tf;(uKlok%Yllbq#?Yf!U_<7{hI<SRu{aY`{(AT@ zS~!0z$Y=(WZVpy3)WsO;VvUd(12c@FnV|ukFYk8*$P3&n@U9HNkx7;Z>>VjYD?G{E z0Jdr44Ara-xWOO`2vTP$YFU@F6jI^JR?bS(2&?{(cS=?cvdIVo2k#yfD_50UYL(%w znKY0~f%pO^E#u@<GcCncQ&Hv~c_|v^0Ls7t9D|R8Tm3WOalwFUDZV3h8e=M*^2YQl zA{CGGfCJndGIfhpOHoQK4lt`5+d8L+;^q*k4|Fs$lRGdi3aKK-nx~UrW4eb@q^vTE zQtXVsDyIfn#wl#9p>AoLn<8r2t(a<U2`muBwaBOTSXL^hYT?9HQjtah+n`(sDlOB@ zEYp;PD>q6)-4Fz~aFKr)iTLw3#GefaDRCLkP5d|)2Yj}fT-%)2wt4EFc_=}jIaRIG z(<tZ$0&!b#+Ah-gNO>`VTmS@#mzrjldt{aeXU=Bih^MC43PBtQ5&_E?9dO-elYj6r znKH^_j{isZE~G07#DNdtPZ@z#q8S)rB~igS05dqUnV1gFKThT-5;m7f)ZwOzr%OFI z7ZDn8JBn?a;`1(M-o(uov-<y>DaQ5#sI1six(M*i7I&0-N^U?J4e<j-T6|n&|J%dG zvRwe$T^FBQl-&fNO?8Z%BKrma+1`vNU9{)pSbSB2VZQS%qIfHRT6z0s;l+VY06BHN z{i_)MZx#Wcz{z007Vz|JzX`PX)7fC8wXDCg!CT8Oa~KKblwzy-Cv(Bvd^2%WK_rQw zvEgtb$U<B-O`c@?&)}b-nywi22whQ{Owg*TEIVz`qjSAiFqploy}o&`G`0hNK)bGk z<jOQ2@d$a3n=MMY;pP=m*F++q%kxQ+0{<a_@2y0Y0&-pWn*B4-6~$4KT9q5_MDmXY zf}B1fp2+U_@BR_-SQh0X2fFT{f$^X#p2DV&7P38?k9j{!qkcIy3Hn#IpGP6x^MCY> zt%H{q34(oNBj_$gRxfT&Js<whHo<{H5%M;Ic(ZF%w|}bM_f*Ge$;fG|xr;o0(1`M6 z8`WhG)5U~7XiRlAp;FwK?uATm9((*8ef-O@ssHFyF~JtWYhsqS3!SHi&YL#PQMa=Q z?$&}VMEN%|^Oa`Kv}vBYT^@>&7ZhJud7<d-g%Yi50Sg4@v+!Hy)ws;6xXjA9oVkp= z;0uM7RYls5uD)xnU-<vJlpw&>At+kiCQ99gq>d*6K;T`DG~c_3cC0!+N~h<k(Z(L1 zY&8cCb&uY7H2yvS2$KHu5BZ)a2%;Qnn50W_)g30`hg~WEUn3405w`-zO7Ji2Jw$51 zZe^~WgzouF%?|ZBlBF1Wt{;<J`b7?xQv6UJXO-JkXqS4Pf3HL!7jUnz-PjI9RKLr- zI=&yLwWGWXXH#`$$c4~wRnd@u;*mq9i@|hWvs~FeYe%^}Ewcd#L1N%1b$K9n8_Yr; zf|B4QNpxDie?NLQm-GlbgCJ$%DvDkEahjL%AK`XiIxB}RFQx%%aelwuo8q%i?KDAr z+=GFim8MYu9)fE?FCq|qXN`#RDB@PUlRR~JD}K1ZsL#mQg-jvJ6NkwZPX*#|0g7ly zB+64<x8f<=D6WM>N&)?`5p#@8nN*-qn(5vvAWqm*hQu)i%J2x0(!>VS$pYr&xqqvo zjFKtdCX`{Gu}d`7g+liPnq%mrJc|1Wn<!5mbtR5%qfiPdW5aYxA=@{aLUpH(j#AuL zj*X2RqmHos6#1G*huM@Ew(kgY>KvQuv0Gpjl>)3X2AY9YOrXmBZ<{G&pV`A~CUq-* zl&=|2DWC$`sRFvdW<J%G&8G60wDU~w?T)}^K=mu2PM%|rD~3_OWcL{{$D^s#JyiEm zCUsA`=jbtCGR4=OKDNira|PVP2KJPqHD#FX8k6SBru(+AeLcgdv$uHJp{tLu3wI2E zSV#Ms77p{!*TSUQYZtygc(2p;LEC)r278dgo+ML!&oRA~!l*U^rJi4j?kj2DquJ9V z$AXlo=jtCd>en{bN;m)Om-hFo4;r8IB71o`Aq$ThRtfYk1@t)PxO*T~qqmibXuD>3 z+z;e}dmLfNf+ImM6@*7I1f}G%GSK3``Ge$#PJ@#&6;pC?8Yr400gY;MCLEEa!L=T8 z1N!YG%5TUM80h?`UT750nUGc2<mDRDkWTWFD!<`DU|^fvXd!i78CZ!6ERw-2H=pFC zU4EkwXH(9~C5fq)=aI5d<%-&~+<*a>w@5CTbgGIgPt!zo<&jRK%9Xt{b(<Agn}I6Q zsRlsELO)cX^~=(nfhw>#y8MP4;YeMSBLS%DwX_4O?CsEj{dV(6?vSMoUzHsiSQQFX z+1p`ximWg+Pno~~szU70T|kvCZ^BHxE{*IjUEcA`zxQU7TZmxsT2%RS|Jo+7xJ-G6 z2dRoLQPVK0Nb5uM4!LF-H!CLA>o)taHt%n8V`ZX86=?6V&B&1c+p%!4^A1JAsfJFs zkSy%1Gl9Pkd%Fg(IJ0hKCm`?_uj*2y^*40+xP~<G6cZhFM-H*x-|j-B9I2ZDs?faR zkow!B6UjOdbXaiZQVpDgy9p3d5`r-4*jc2JB*<d<qTqI(&BKYQrsf;WB2#lovxw9@ zuZ7|iXF^DMe!f>$Lw+7fP@g%!02%sl%GHinP+EGe2t<NG(m6EGlAxmMBRx5&_!7<P zt2OhyU7jTxnbp<RJZ5|e8vM7`*Lw>vt@SkvB@6*ZXW<Tzs;;ir?zt0QT@7AZP*!}n zSUukgFpY~+H4Bd#b;fyNzqHS{f{KI3TzC`-m{#vJAZ&Q`tF4$HT@m2j-FF`bRo+V< zmUYbR5|ZLSg#p0CE@S|l)QwC9`4pX+PXZ}P6ahg(4w}LOv&+DnuU6YM;zg?iLlz$j zsRJofkT?I&0S1w_ZiYx(Oo9nIn>YLj%3w@7`YIwt+N?dFHDITSDhF;YPRSz?3Ron9 zT~*TvKU(?T3xtyxx?Rd4eMsQZ)7TXdKe}CBtjFdc=ChhcCRkvKNPKK5ewI|zG=oUp zT;1dq(vSO!bO>n}QI3XNDMFk<;QoZe?epRqcv{jw2OyrB@81g+JwU+D@Jp4G8&j4e zwhK%x#V_-z{EW<}@(a;kaONrCLSABR7L=rB0;;%b^v2W*)S!Y|b>Q!+^)jECU%$d2 z&L;550yC-2i69v%c<@7sUneF%kJ7;!+Tvz(Ohi;S-K5x}J8uM9E4^u<NUCy;0vxdc z+zu~R6*vJX8HlUGAW?D2K!|f6_Fxt{CnBB$KCCP=df}(i(_VZil|!ms72<S=q#c4P z|7fvoYvJe#9~$Tc$zI$Fp6r3JfJvB|zD(En>qF`<#ig#~c_h#aGAQ%{2EAy3)YOXF zy9b`VnEUV*k^qSjGzI7@1eqS>WMs@>42(=n&GzlLumUl$(KsBA0I&cfha>pp6S;#C zpdkJyAD=Nue$#-43Q9{Gt*O~oRZ~`~vJ;6y>gj4<t>UVvs;VN9`Z~J1kZQZMv<kT7 zKL!@{TSYsX7S58+UHN|eNwrM(i7B4a$Fsp1J}|D^vgV5zY?<Zt3FM77{SyxLuD8p0 z%S*vBpQfGs*S35co;h1QL4FpPA$;@>eC`R`;`sG5D+_yvZQtvuxSJ;YPG3%_t`n7Q zt#RHvqYZm~2x4a0tR>mP-^}3l7sbaUB;1YsLRYAHb@EF^Oy$kB(_f!_96n3EOM`}d zo?e!07}@(633Cz-uO0u+w0n1Fb-B{r`E{>I_`Z*l@z$256hj6~#M>h#X<a``^vTke zx4*9}|F~NAV6<>&1?teR%Wtfi?_3nmbtJ83LI~fcwD|XrQ$;qJbvHyDVzoKn{`F@i z`2;Jf{?pH+w9`%uOBJ8CnC%H-eG&zGuL~W84^;Q|T$@a^zH_FewaxD_t^!s$OwM~R zbZ-ue2{@`Yoh3K8m}NX(7&jYdyTr7wa#JIJn7)2lK`t^bUB5<)^NOt3>~?Pc?flm< zU0iFzQ(C~?Gdo<`O#{;|evErrd;NH?r(#2T(qUGXwSR^F{lUu6?YL6z>kCI@{aMDc z$-Q`n^C(tMWxRIw=hEykEdzY=t%7$`wGCZ;MGHyjg@dsoTfWC6oua!^gBI>pR^61j z<0exsgdV?7$*j|S*cOV3Nql|E*j?rOfSvS**x8RGP36y*8ht|?!?V}J<imod4vk(J zWIv>zu1x>&K11HTG5z3+JMR;68#@QQ)>eludt3LY4o<DN5NRSB_t(@e)SZ5r`Qy`4 z)Yj9tBtmyL_8RTqtw8xmz1`NeI8R+l7*e<{d%mS&H}+|JwlC5`-{$e7(F(5g%)B1# z-df%VF|}Na;tWp}=+-a7f4NbzgyMO-;@<_To@_f*AycP!=5o<CPl$uk)c>s4$h}WA z%lTF)%kdy=(bJ3Wn~Iz13Od#qG=2VzEL-t<*0`ez<!$K8*(;mEh$$NK9m6J^kE%~z zn~W`eRxc@tE(~ekeJ|+V#E#omKl(&Ev92zks(o9;>~;3kkX7TbY<hBJO4M^2gfK(( zv=b#A;9{-d`)_R8+K_h(A&hrFgsm{t{*)NlFc|>5V?&qv)-U!TvQKfo`f8%T+QnQA z{~byVkWpXhf%ESm<Re>gyGrAuK?yz=rtZcerk(6!mp@I^Ly%7%yMw#9IIvqTUFfK4 zjGGO8r(e(AYFmzk`nI*SPRzgd(zw}%4F8fynWN&eJ6bmte&_sjp<3@bbjltDt<u%7 zda=gWo$GJ%-m9F%)L?zPZ`|M*HlG$Y>h6r9Gf{u#bUt{YA||I`!`5C4N`cBPUVTkC z+JRqr_O|$Df3y))<1cyWne4*+x7M}SS5P%0>`RNsvJRHGjPqh2uk1{BT+TO^HC$N> z{l0%C^JrMk_C>`^rLHx<-W>zOhOF4Sc9~+~iRFn)R+rzMR7QXHpc8}eNhH;>S)m%? zzO6KIT%@7FYn*LguZf7$Ly_9Ifs-AnyGnoTGq^dhZTx(wmssg*<m#_KH`flimF9Lo zJSc?GyjH%nH~eAECG6{5`B@p2m|#v5#2rd6{V=^n0`6Hap*ErC5cclnNSHxI4}2XJ zAuYruOVq_x`gYhMv&XLJ4~>@0UYT(w(evKqXG=!@^cLc}RTU+x{%lo%2qCZ-m9cXJ z<=0?`ckWqmH!t)VP4M2;c~?w_>lTXs_4NhlaJhYJo5{qHhG3rh(q`$0G9l0YdVJy% z#C7&au0j0#WR(riUR%@1I(pZ%wK}Y0|4*-5t&zJ3Yl|<na&p#d)|+FW&6q+RWC%<8 zct&6Nb)B^N@87oEe0w3m;{@)^>e6qxMu$IltpzqL?Gbm0ylPT=h0x*l%)}zJ?h}c_ zQ*VB;a_&cC?aBqrV(R#gtlV3L9VKoBHB%SNj<{;Fg%ZA~SE#}c7v}GNrOETMyiotS z&sXctn#|Vug;UbR!ISb~!qO0Fz%!^M^6(MNQwgErdUxR$*VY4x)Rn}(ljF2QQ?-K* z#(I(J$0s}MFT0+(MSXGOagB10b7IlQm#w?ajg-wl{p<7404`c-#Ybw(HLVu)$)@;N z-ka|?%Oe9$$Xh6P`Swd0o{8J^+mt1AZ^wx8gwJ2fLLTR_UFWA)oV8U3Vk6}CyA#jp z#1f?JZ@oS&=}J|<w%9#UVHUXexhN!Nc^4KfF>pl&BZJB9E?m;9HNmbZ2FVpzL7n?{ z!M9l)(JI>neJF^775`YhyFbxq?eg+mRO0fR#*0Jg`^uEREoI2BPL_Y#e!^<?5Be{$ zwCgd1muq*n{;5WHT>rhXjYCoB!lGcDwVpqFT0JfpaY*g;kQ_(t`c`H0fHD<jJ7viF z%0whCYr8GvAmwH=e6sKN<>s{DqNbLJ<>^p|LtmDJ!^0PLXryc++bV2>Oizt-N+5B$ zt8#g*6=(EozMd%3udgD;%(ab@ASg`^#eg`+y`X)nV|8j*R`EVt9vy61Jhn_n8>uQa zxyRm$SEhYdFi=x+n=IH};kfsm{`G((au!ABes~Vo$~+5Q(w#aBMRPWBc1(J*lX`qF z!aqRHo*E_d5%cvOuf#RWlZ3cKBUP0N?sEH>LfoG5_EW;K`3J7Z!cE4^j?l%&pxP0v zg=MsRA+-1h?1l5UBek)?d+%l67<x&sYW%fxC>qUmJ6?9UCDF}B=D9dDHyV?MdZUbf zHM#Ulyo8R-4*hRhwQlughxe@Rn=DP;@3GnIX+iK?ZMZ#adElUy!G7DXJdxUwbP`ta znOefjD%d*S{c>3HdcJhXv!o@&nSfEz{YKnpUfjd^zG`Zv$S1j-uHnx`|Dt_SAj63y zlb`iZb49sN^`NfA?`H;K*rMfqdEeJ-tD_zcgJ*94!s4@~-yi4b-F2ZLdWL(v_xPXL z1>=%D?LS&Ho!+Fexze6yY1zAAR)#wIHs}2{<u6l{V$6gaYF378u?lI}AXzTCsyMlH zXu*E`!vm6wuqAA6`vXr}$)Nx9vR9W9sgD*i*B#T>NzL?-m=LIzJf^TIdu*Rbhr`p5 zLFcTjlkSb|V~N*7_GVi_CH+lDOd&1_?dnpMjZ0DxxA>?ym^h^gX&-BsyV@f)KKJ9K ztVFFF{e1G=%46+PHJHe~&n0)oo0A4jrAjS{z6ACkId3@NJiJN|w;$8zU2cRSAx)d3 z2kTc~)wPPh5Hg-#nz8k%)dK}nL*3VC_UZVf&87;@<vsh>f2AsvJvq#6TQ;1ea2LKS zte;rl`P0PRojVkk>@UJSUY{y^&&s0umw@ge^a#n)iBU8%*H~%qxfnZ4`Rx+cx&)<c zqwDl#1!HuLek3T1TqkvpV*JSTb}nZBi7Q{$Uf<SR`(8P}du1*D-Bd}_ef#Rs1tp&@ z<@0T#)!tucC3wwynp-80(K#j0%7V*eg?`>Q%@n>fIZ-VNL2fX&8}L7RT?a#<dfm?B zi>s#EFpg;H!_SMWkk78}?H`;gDt-^Te0}bGpiOCUPQ-JGPs{i38<<niv!VY2qidvc literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/sound/effects/glass_crack2.ogg b/modular_pariah/master_files/sound/effects/glass_crack2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e5e3702458842b7b7a75c787c19ad206b656d094 GIT binary patch literal 4486 zcmahs30PA{w>O9w0Wk>DfYJYA6G>P!VUti}AvBOg!g7<#YDyslh%o^ZqEc&1B~S>; zqllo8^3W0s2q*{<ad|F?6ajGwXw_n?vZ{5dilxh&8`{3U?|tw4=bKE<oNdmWIWy<n z$n<m}WC8uz⁣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 SKYzp!ekvqrT;qy^asLgDgd<r1 literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/sound/effects/glass_crack3.ogg b/modular_pariah/master_files/sound/effects/glass_crack3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..631c584462eff8d87c1edd9b5cd076bc3a4b0e3a GIT binary patch literal 5967 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 QNrWIl@@<5b1hnqI0gb8p+yDRo literal 0 HcmV?d00001 diff --git a/modular_pariah/master_files/sound/effects/glass_crack4.ogg b/modular_pariah/master_files/sound/effects/glass_crack4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5d6302e88b2bbde0b6444b40175c4e468763f9af GIT binary patch literal 6812 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 946f288e01c..5b668201abe 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2366,6 +2366,7 @@ #include "code\modules\atmospherics\ZAS\XGM\gases.dm" #include "code\modules\atmospherics\ZAS\XGM\xgm_immutable_gas_mixture.dm" #include "code\modules\atmospherics\ZAS\Zone.dm" +#include "code\modules\atmospherics\ZAS\zas_extras\inflatable.dm" #include "code\modules\atmospherics\ZAS\_docs.dm" #include "code\modules\atmospherics\ZAS\Airflow.dm" #include "code\modules\atmospherics\ZAS\Atom.dm" From 0c7b8fc42c20211390d496cfe15a4ded6f244053 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:01:37 -0400 Subject: [PATCH 036/200] temp removals --- code/modules/modular_computers/hardware/job_disk.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/modular_computers/hardware/job_disk.dm b/code/modules/modular_computers/hardware/job_disk.dm index 0593ea29ee0..3b1b27d6ba4 100644 --- a/code/modules/modular_computers/hardware/job_disk.dm +++ b/code/modules/modular_computers/hardware/job_disk.dm @@ -22,7 +22,7 @@ if(disk_flags & DISK_POWER) progs_to_store += new /datum/computer_file/program/power_monitor(src) - progs_to_store += new /datum/computer_file/program/supermatter_monitor(src) + //progs_to_store += new /datum/computer_file/program/supermatter_monitor(src) if(disk_flags & DISK_ATMOS) progs_to_store += new /datum/computer_file/program/atmosscan(src) @@ -65,8 +65,8 @@ if(disk_flags & DISK_BUDGET) progs_to_store += new /datum/computer_file/program/budgetorders(src) - if(disk_flags & DISK_STATUS) - progs_to_store += new /datum/computer_file/program/status(src) + /*if(disk_flags & DISK_STATUS) + progs_to_store += new /datum/computer_file/program/status(src)*/ for (var/datum/computer_file/program/prog in progs_to_store) prog.usage_flags = PROGRAM_ALL From eb1522b5c4a6f1319bb0e818fddf384747735fd7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:19:59 -0400 Subject: [PATCH 037/200] All linters fixed --- code/datums/diseases/advance/symptoms/heal.dm | 5 ++--- code/game/machinery/shieldgen.dm | 9 ++++----- code/game/objects/structures/mineral_doors.dm | 13 ++++--------- .../objects/structures/transit_tubes/station.dm | 4 +--- code/game/turfs/closed/minerals.dm | 9 ++++++--- code/modules/antagonists/blob/structures/_blob.dm | 4 ++-- .../components/unary_devices/vent_scrubber.dm | 7 ++----- .../modules/atmospherics/machinery/portable/pump.dm | 2 +- code/modules/mapping/map_template.dm | 5 +++-- 9 files changed, 25 insertions(+), 33 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 648fa0070c2..1d39d442090 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -515,15 +515,14 @@ /datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A) var/mob/living/M = A.affected_mob - var/datum/gas_mixture/environment - var/list/gases + var/datum/gas_mixture/environment = M.loc.return_air() . = 0 if(M.loc) environment = M.loc.return_air() if(environment && environment.get_gas(GAS_PLASMA)) - . += power * min(0.5, environment.get_gas(GAS_PLASMA) * HEALING_PER_MOL) + . += power * min(0.5, environment.gas[GAS_PLASMA] * HEALING_PER_MOL) if(M.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) . += power * 0.75 //Determines how much the symptom heals if injected or ingested diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 8b29cba2d28..7798c13477f 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -14,16 +14,15 @@ /obj/structure/emergency_shield/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) /obj/structure/emergency_shield/Destroy() - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() . = ..() /obj/structure/emergency_shield/Move() - var/turf/T = loc - /*. = ..() - move_update_air(T)*/ + . = ..() + update_nearby_tiles() /obj/structure/emergency_shield/emp_act(severity) . = ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index ab9b1f7a944..ccfc6c74bf0 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -36,17 +36,12 @@ //air_update_turf(TRUE, TRUE) /obj/structure/mineral_door/Destroy() - if(!door_opened) - //air_update_turf(TRUE, FALSE) . = ..() + update_nearby_tiles() /obj/structure/mineral_door/Move() - var/turf/T = loc . = ..() - /* - if(!door_opened) - move_update_air(T) - */ + update_nearby_tiles() /obj/structure/mineral_door/Bumped(atom/movable/AM) ..() @@ -106,7 +101,7 @@ set_density(FALSE) door_opened = TRUE layer = OPEN_DOOR_LAYER - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() update_appearance() isSwitchingStates = FALSE @@ -127,7 +122,7 @@ set_opacity(TRUE) door_opened = FALSE layer = initial(layer) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles() update_appearance() isSwitchingStates = FALSE diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 1072a24a227..111ab281c51 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -169,9 +169,7 @@ if(QDELETED(pod)) return var/datum/gas_mixture/floor_mixture = loc.return_air() - /*if(pod.air_contents.equalize(floor_mixture)) //equalize the pod's mix with the tile it's on - air_update_turf(FALSE, FALSE) - */ + pod.air_contents.share_ratio(floor_mixture, 1) /obj/structure/transit_tube/station/init_tube_dirs() switch(dir) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index a300002430b..2004f89a951 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -131,7 +131,8 @@ var/old_type = type if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE - var/turf/open/mined = ScrapeAway(null, flags) + ScrapeAway(null, flags) + SSzas.mark_for_update(src) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction //mined.update_visuals() @@ -599,7 +600,8 @@ var/old_type = type if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE - var/turf/open/mined = ScrapeAway(null, flags) + ScrapeAway(null, flags) + SSzas.mark_for_update(src) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) //mined.update_visuals() @@ -657,7 +659,8 @@ var/old_type = type if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE - var/turf/open/mined = ScrapeAway(null, flags) + ScrapeAway(null, flags) + SSzas.mark_for_update(src) addtimer(CALLBACK(src, .proc/AfterChange, flags, old_type), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction //mined.update_visuals() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 332c595e7c2..92f12dc4d32 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -42,7 +42,7 @@ setDir(pick(GLOB.cardinals)) update_appearance() if(atmosblock) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) ConsumeTile() if(!QDELETED(src)) //Consuming our tile can in rare cases cause us to del AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOB, CELL_VIRUS_TABLE_GENERIC, 2, 2) @@ -69,7 +69,7 @@ /obj/structure/blob/Destroy() if(atmosblock) atmosblock = FALSE - //air_update_turf(TRUE, FALSE) + update_nearby_tiles() if(overmind) overmind.all_blobs -= src overmind.blobs_legit -= src //if it was in the legit blobs list, it isn't now diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index f2d493572df..1d6e3b77a43 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -252,9 +252,6 @@ var/datum/gas_mixture/filtered_out = new filtered_out.temperature = environment.temperature - ///maximum percentage of the turfs gas we can filter - var/removal_ratio = min(1, volume_rate / environment.volume) - var/total_moles_to_remove = 0 for(var/gas in filter_types & environment.get_gases()) total_moles_to_remove += environment.gas[gas] @@ -300,8 +297,8 @@ var/old_scrubbing = scrubbing var/old_filter_length = length(filter_types) - var/turf/open/our_turf = get_turf(src) - var/datum/gas_mixture/turf_gas = our_turf?.return_air() + //var/turf/open/our_turf = get_turf(src) + //var/datum/gas_mixture/turf_gas = our_turf?.return_air() var/atom/signal_sender = signal.data["user"] diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 6288a60b7e6..73915fb4ede 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -65,7 +65,7 @@ if(holding) environment = holding.air_contents else - environment = loc.return_air() + environment = local_turf.return_air() if(direction == PUMP_OUT) pressure_delta = target_pressure - environment.return_pressure() diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 0f9b5a3b655..29bdb96720d 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -154,8 +154,9 @@ if(T.y+height > world.maxy) return - var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), - locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z)) + /*var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), + locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z))*/ + stack_trace("This is a reminder that kapu touched this code") /* for(var/L in border) var/turf/turf_to_disable = L From 23fae83e224011e51654258e94f8e40d64d3789a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:36:05 -0400 Subject: [PATCH 038/200] grumble --- code/__DEFINES/atmospherics/ZAS.dm | 8 ++++---- code/_onclick/adjacent.dm | 2 +- code/modules/atmospherics/ZAS/Debug.dm | 16 ++++++++-------- code/modules/atmospherics/ZAS/Fire.dm | 8 ++++---- code/modules/atmospherics/ZAS/Temperature.dm | 2 +- code/modules/atmospherics/ZAS/Turf.dm | 10 +++++----- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 2 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 8 ++++---- code/modules/atmospherics/ZAS/_docs.dm | 2 +- .../modules/atmospherics/ZAS/atmos_primitives.dm | 16 ++++++++-------- .../atmospherics/ZAS/zas_extras/inflatable.dm | 4 ++-- .../carbon/human/species_types/plasmamen.dm | 2 +- 12 files changed, 40 insertions(+), 40 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 16f2c26141e..336c8c981a9 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -27,8 +27,8 @@ #define TURF_HAS_VALID_ZONE(T) (!istype(T, /turf/open/space) && T:zone && !T:zone:invalid) #ifdef MULTIZAS -var/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) -var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) +GLOBAL_REAL(csrfz_check, /list/) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) +GLOBAL_REAL(gzn_check, /list/) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ @@ -72,8 +72,8 @@ var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } #else -var/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) -var/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) +GLOBAL_REAL(csrfz_check, /list/) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) +GLOBAL_REAL(gzn_check, /list/) = list(NORTH, SOUTH, EAST, WEST) #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 5b30c07d1eb..534a6a80a12 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -104,7 +104,7 @@ * If you are in the same turf, always true * If you are not adjacent, then false */ -/turf/proc/AdjacentQuick(var/atom/neighbor, var/atom/target = null) +/turf/proc/AdjacentQuick(atom/neighbor, atom/target = null) var/turf/T0 = get_turf(neighbor) if(T0 == src) return 1 diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index 6fc387fc79e..ca2405550c0 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -1,11 +1,11 @@ -var/image/assigned = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") -var/image/created = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") -var/image/merged = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") -var/image/invalid_zone = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") -var/image/air_blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") -var/image/zone_blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") -var/image/blocked = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") -var/image/mark = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") +GLOBAL_REAL(assigned, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") +GLOBAL_REAL(created, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") +GLOBAL_REAL(merged, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") +GLOBAL_REAL(invalid_zone, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") +GLOBAL_REAL(air_blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") +GLOBAL_REAL(zone_blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") +GLOBAL_REAL(blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") +GLOBAL_REAL(mark, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") /connection_edge/var/dbg_out = 0 diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 6858ce84282..2e996122b8d 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -66,7 +66,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(!fire_tiles.len) SSzas.active_fire_zones.Remove(src) -/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0) +/zone/proc/remove_liquidfuel(used_liquid_fuel, remove_fire=0) if(!fuel_objs.len) return @@ -208,7 +208,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin firelevel = fl SSzas.active_hotspots.Add(src) -/obj/effect/hotspot/proc/fire_color(var/env_temperature) +/obj/effect/hotspot/proc/fire_color(env_temperature) var/temperature = max(4000*sqrt(firelevel/SSzas.settings.fire_firelevel_multiplier), env_temperature) return heat2color(temperature) @@ -402,13 +402,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return max( 0, firelevel) -/mob/living/proc/FireBurn(var/firelevel, var/last_temperature, var/pressure) +/mob/living/proc/FireBurn(firelevel, last_temperature, pressure) var/mx = 5 * firelevel/SSzas.settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) apply_damage(2.5*mx, BURN) return mx -/mob/living/carbon/human/FireBurn(var/firelevel, var/last_temperature, var/pressure) +/mob/living/carbon/human/FireBurn(firelevel, last_temperature, pressure) //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. //Due to TG reworking how fireprotection works, this is kinda less meaningful. diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 7b40374d89c..6f739b11cca 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -4,7 +4,7 @@ /atom/var/temperature = T20C /atom/var/temperature_coefficient = MAX_TEMPERATURE_COEFFICIENT -/atom/movable/Entered(var/atom/movable/atom, var/atom/old_loc) +/atom/movable/Entered(atom/movable/atom, atom/old_loc, list/atom/old_locs) . = ..() QUEUE_TEMPERATURE_ATOMS(atom) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index d7c20e8af0b..85e7fe2d581 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -377,7 +377,7 @@ /turf/open/space/atmos_spawn_air() return -/proc/turf_contains_dense_objects(var/turf/T) +/proc/turf_contains_dense_objects(turf/T) return T.contains_dense_objects() /turf/proc/contains_dense_objects() @@ -389,10 +389,10 @@ return 0 /turf/proc/TryGetNonDenseNeighbour() - for(var/d in GLOB.cardinals) - var/turf/T = get_step(src, d) - if (T && !turf_contains_dense_objects(T)) - return T + for(var/d in GLOB.cardinals) + var/turf/T = get_step(src, d) + if (T && !turf_contains_dense_objects(T)) + return T /turf/proc/get_atmos_adjacent_turfs() var/list/adjacent_turfs = list() diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 34e18b9583a..a59e99f620b 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -102,7 +102,7 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new vis_flags = NONE var/gas_id -/obj/effect/gas_overlay/proc/update_alpha_animation(var/new_alpha) +/obj/effect/gas_overlay/proc/update_alpha_animation(new_alpha) animate(src, alpha = new_alpha) alpha = new_alpha animate(src, alpha = 0.8 * new_alpha, time = 10, easing = SINE_EASING | EASE_OUT, loop = -1) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 194ff75e82e..66dca038ee0 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -142,7 +142,7 @@ //Adds or removes thermal energy. Returns the actual thermal energy change, as in the case of removing energy we can't go below TCMB. -/datum/gas_mixture/proc/add_thermal_energy(var/thermal_energy) +/datum/gas_mixture/proc/add_thermal_energy(thermal_energy) if (total_moles == 0) return 0 @@ -157,7 +157,7 @@ return thermal_energy //Returns the thermal energy change required to get to a new temperature -/datum/gas_mixture/proc/get_thermal_energy_change(var/new_temperature) +/datum/gas_mixture/proc/get_thermal_energy_change(new_temperature) return heat_capacity()*(max(new_temperature, 0) - temperature) @@ -187,7 +187,7 @@ So returning a constant/(partial pressure) would probably do what most players expect. Although the version I have implemented below is a bit more nuanced than simply 1/P in that it scales in a way which is bit more realistic (natural log), and returns a fairly accurate entropy around room temperatures and pressures. */ -/datum/gas_mixture/proc/specific_entropy_gas(var/gasid) +/datum/gas_mixture/proc/specific_entropy_gas(gasid) if (!(gasid in gas) || gas[gasid] == 0) return SPECIFIC_ENTROPY_VACUUM //that gas isn't here @@ -308,7 +308,7 @@ //Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. -/datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample, var/vacuum_exception = 0) +/datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample, vacuum_exception = 0) if(!sample) return 0 if(vacuum_exception) diff --git a/code/modules/atmospherics/ZAS/_docs.dm b/code/modules/atmospherics/ZAS/_docs.dm index 41372ea2a06..822c8ac7b2a 100644 --- a/code/modules/atmospherics/ZAS/_docs.dm +++ b/code/modules/atmospherics/ZAS/_docs.dm @@ -25,4 +25,4 @@ Notes for people who used ZAS before: for(var/connection_edge/zone/edge in zone.edges) var/zone/connected_zone = edge.get_connected_zone(zone) -*/ \ No newline at end of file +*/ diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index a56ff737f08..cd5f5fb0feb 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -27,7 +27,7 @@ /obj/machinery/atmospherics/var/debug = 0 -/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in world) +/client/proc/atmos_toggle_debug(obj/machinery/atmospherics/M in world) set name = "Toggle Debug Messages" set category = "Debug" M.debug = !M.debug @@ -37,7 +37,7 @@ //Moves gas from one gas_mixture to another and returns the amount of power needed (assuming 1 second), or -1 if no gas was pumped. //transfer_moles - Limits the amount of moles to transfer. The actual amount of gas moved may also be limited by available_power, if given. //available_power - the maximum amount of power that may be used when moving gas. If null then the transfer is not limited by power. -/proc/pump_gas(var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/transfer_moles = null, var/available_power = null) +/proc/pump_gas(datum/gas_mixture/source, datum/gas_mixture/sink, transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing return -1 @@ -122,7 +122,7 @@ //filtering - A list of gasids to be scrubbed from source //total_transfer_moles - Limits the amount of moles to scrub. The actual amount of gas scrubbed may also be limited by available_power, if given. //available_power - the maximum amount of power that may be used when scrubbing gas. If null then the scrubbing is not limited by power. -/proc/scrub_gas(var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/total_transfer_moles = null, var/available_power = null) +/proc/scrub_gas(list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink, total_transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 @@ -195,7 +195,7 @@ //filtering - A list of gasids to be filtered. These gasses get moved to sink_filtered, while the other gasses get moved to sink_clean. //total_transfer_moles - Limits the amount of moles to input. The actual amount of gas filtered may also be limited by available_power, if given. //available_power - the maximum amount of power that may be used when filtering gas. If null then the filtering is not limited by power. -/proc/filter_gas(var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink_filtered, var/datum/gas_mixture/sink_clean, var/total_transfer_moles = null, var/available_power = null) +/proc/filter_gas(list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink_filtered, datum/gas_mixture/sink_clean, total_transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 @@ -266,7 +266,7 @@ //For omni devices. Instead filtering is an associative list mapping gasids to gas mixtures. //I don't like the copypasta, but I decided to keep both versions of gas filtering as filter_gas is slightly faster (doesn't create as many temporary lists, doesn't call update_values() as much) //filter_gas can be removed and replaced with this proc if need be. -/proc/filter_gas_multi(var/obj/machinery/M, var/list/filtering, var/datum/gas_mixture/source, var/datum/gas_mixture/sink_clean, var/total_transfer_moles = null, var/available_power = null) +/proc/filter_gas_multi(obj/machinery/M, list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink_clean, total_transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 @@ -345,7 +345,7 @@ //Similar deal as the other atmos process procs. //mix_sources maps input gas mixtures to mix ratios. The mix ratios MUST add up to 1. -/proc/mix_gas(var/list/mix_sources, var/datum/gas_mixture/sink, var/total_transfer_moles = null, var/available_power = null) +/proc/mix_gas(list/mix_sources, datum/gas_mixture/sink, total_transfer_moles = null, available_power = null) if (!mix_sources.len) return -1 @@ -432,7 +432,7 @@ return specific_power //Calculates the amount of power needed to move one mole of a certain gas from source to sink. -/proc/calculate_specific_power_gas(var/gasid, datum/gas_mixture/source, datum/gas_mixture/sink) +/proc/calculate_specific_power_gas(gasid, datum/gas_mixture/source, datum/gas_mixture/sink) //Calculate the amount of energy required var/air_temperature = (sink.temperature > 0)? sink.temperature : source.temperature var/specific_entropy = sink.specific_entropy_gas(gasid) - source.specific_entropy_gas(gasid) //sink is gaining moles, source is loosing @@ -447,7 +447,7 @@ //Calculates the APPROXIMATE amount of moles that would need to be transferred to change the pressure of sink by pressure_delta //If set, sink_volume_mod adjusts the effective output volume used in the calculation. This is useful when the output gas_mixture is //part of a pipenetwork, and so it's volume isn't representative of the actual volume since the gas will be shared across the pipenetwork when it processes. -/proc/calculate_transfer_moles(datum/gas_mixture/source, datum/gas_mixture/sink, var/pressure_delta, var/sink_volume_mod=0) +/proc/calculate_transfer_moles(datum/gas_mixture/source, datum/gas_mixture/sink, pressure_delta, sink_volume_mod=0) if(source.temperature == 0 || source.total_moles == 0) return 0 var/output_volume = (sink.volume * sink.group_multiplier) + sink_volume_mod diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm index f299c1f4206..24dee699f89 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -185,7 +185,7 @@ deflate() return TRUE -/obj/structure/inflatable/attack_generic(var/mob/user, var/damage, var/attack_verb) +/obj/structure/inflatable/attack_generic(mob/user, damage, attack_verb) . = ..() if(.) user.visible_message("<span class='danger'>[user] [attack_verb] open the [src]!</span>") @@ -277,7 +277,7 @@ icon_state = "door_closed" -/obj/structure/inflatable/door/deflate(var/violent=0) +/obj/structure/inflatable/door/deflate(violent=0) playsound(loc, 'sound/machines/hiss.ogg', 75, 1) if(violent) visible_message("[src] rapidly deflates!") diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 983b05ee90a..bb198308ee9 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -74,7 +74,7 @@ if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves))) var/datum/gas_mixture/environment = H.loc.return_air() if(environment?.total_moles()) - /*if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) + /*if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) if(H.on_fire && H.fire_stacks > 0) H.adjust_fire_stacks(-10 * delta_time)*/ if(!HAS_TRAIT(H, TRAIT_NOFIRE) && !HAS_TRAIT(H, TRAIT_NOSELFIGNITION)) From f3370fa3e7d6f27215d9edbf8cadafa6e30a6e9c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:40:15 -0400 Subject: [PATCH 039/200] grumble 2 --- code/modules/atmospherics/ZAS/Diagnostic.dm | 2 +- code/modules/atmospherics/ZAS/atmos_primitives.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index d67fec39512..da93192fcb5 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -17,7 +17,7 @@ /client/var/list/zone_debug_images -/client/proc/Test_ZAS_Connection(var/turf/T as turf) //ZASTURF +/client/proc/Test_ZAS_Connection(turf/T as turf) //ZASTURF set category = "Debug" if(istype(T, /turf/open/space)) //ZASTURF return diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index cd5f5fb0feb..95d9efbd07c 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -82,7 +82,7 @@ return power_draw //Gas 'pumping' proc for the case where the gas flow is passive and driven entirely by pressure differences (but still one-way). -/proc/pump_gas_passive(var/datum/gas_mixture/source, var/datum/gas_mixture/sink, var/transfer_moles = null) +/proc/pump_gas_passive(datum/gas_mixture/source, datum/gas_mixture/sink, transfer_moles = null) if (source.total_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing return -1 @@ -482,7 +482,7 @@ // - Has between 17% and 30% oxygen // - Has temperature between -10C and 50C // - Has no or only minimal phoron or N2O -/proc/get_atmosphere_issues(datum/gas_mixture/atmosphere, var/returntext = 0) +/proc/get_atmosphere_issues(datum/gas_mixture/atmosphere, returntext = 0) var/list/status = list() if(!atmosphere) status.Add("No atmosphere present.") From 65a3a55f7c30299258d3f539687d44b73546260d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:42:55 -0400 Subject: [PATCH 040/200] fuck --- code/modules/atmospherics/ZAS/Turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 85e7fe2d581..5f58e1d7406 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -390,7 +390,7 @@ /turf/proc/TryGetNonDenseNeighbour() for(var/d in GLOB.cardinals) - var/turf/T = get_step(src, d) + var/turf/T = get_step(src, d) if (T && !turf_contains_dense_objects(T)) return T From 63ea3c7a51041b4058d0a8faee023e60b4802c96 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:48:53 -0400 Subject: [PATCH 041/200] FUCK --- code/game/objects/items/RCD.dm | 2 +- code/modules/atmospherics/ZAS/Turf.dm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index e2f7b63f5c5..e91e9486b7e 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -1005,7 +1005,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) for(var/direction in GLOB.cardinals) var/turf/C = get_step(W, direction) var/list/dupes = checkdupes(C) - if((isspaceturf(C) || C.TryGetNonDenseNeighbour()) && !dupes.len) + if((isspaceturf(C) || C.open_directions) && !dupes.len) candidates += C if(!candidates.len) to_chat(user, span_warning("Valid target not found...")) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 5f58e1d7406..033c069fc9b 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -388,11 +388,12 @@ return 1 return 0 +///I literally don't know where this proc came from. /turf/proc/TryGetNonDenseNeighbour() for(var/d in GLOB.cardinals) var/turf/T = get_step(src, d) - if (T && !turf_contains_dense_objects(T)) - return T + if (T && !turf_contains_dense_objects(T)) + return T /turf/proc/get_atmos_adjacent_turfs() var/list/adjacent_turfs = list() From 1a4586e5ccf45e64fc0c627bc08c5499786be29f Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:58:48 -0400 Subject: [PATCH 042/200] Globals --- code/__DEFINES/atmospherics/ZAS.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 336c8c981a9..666db30595f 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -27,8 +27,8 @@ #define TURF_HAS_VALID_ZONE(T) (!istype(T, /turf/open/space) && T:zone && !T:zone:invalid) #ifdef MULTIZAS -GLOBAL_REAL(csrfz_check, /list/) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) -GLOBAL_REAL(gzn_check, /list/) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) +GLOBAL_REAL(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) +GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ @@ -72,8 +72,8 @@ GLOBAL_REAL(gzn_check, /list/) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } #else -GLOBAL_REAL(csrfz_check, /list/) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) -GLOBAL_REAL(gzn_check, /list/) = list(NORTH, SOUTH, EAST, WEST) +GLOBAL_REAL_VAR(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) +GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ From 4c244df8e873f079100fa5e09341e2dab6ea2d7b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 22 Apr 2022 23:58:55 -0400 Subject: [PATCH 043/200] wohops --- code/modules/atmospherics/ZAS/Debug.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index ca2405550c0..cbb49ecf4ee 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -1,11 +1,11 @@ -GLOBAL_REAL(assigned, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") -GLOBAL_REAL(created, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") -GLOBAL_REAL(merged, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") -GLOBAL_REAL(invalid_zone, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") -GLOBAL_REAL(air_blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") -GLOBAL_REAL(zone_blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") -GLOBAL_REAL(blocked, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") -GLOBAL_REAL(mark, /image/) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") +GLOBAL_REAL_VAR(image/assigned) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") +GLOBAL_REAL_VAR(image/created) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") +GLOBAL_REAL_VAR(image/merged) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") +GLOBAL_REAL_VAR(image/invalid_zone) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") +GLOBAL_REAL_VAR(image/air_blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") +GLOBAL_REAL_VAR(image/zone_blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") +GLOBAL_REAL_VAR(image/blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") +GLOBAL_REAL_VAR(image/mark) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") /connection_edge/var/dbg_out = 0 From 2274615cbb2b8b573ac4a619e17251bb7cb0108a Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Sat, 23 Apr 2022 14:13:07 -0400 Subject: [PATCH 044/200] MINTEST: Atmos Equipment Addition --- _maps/map_files/debug/atmos_mintest.dmm | 1297 ++--------------------- 1 file changed, 107 insertions(+), 1190 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index 5628c573064..0acc3cd4df6 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -1,1193 +1,110 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/space/basic, -/area/space) -"b" = ( -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"c" = ( -/obj/effect/spawner/structure/window/plasma, -/turf/open/floor/plating, -/area/hallway/primary/central) -"d" = ( -/obj/machinery/door/poddoor{ - id = "c1vent"; - name = "c1vent" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"e" = ( -/obj/machinery/door/poddoor{ - id = "c2vent"; - name = "c2vent" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"f" = ( -/obj/machinery/door/poddoor{ - id = "c3vent"; - name = "c3vent" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"g" = ( -/turf/open/floor/iron, -/area/hallway/primary/central) -"h" = ( -/turf/open/floor/engine/plasma, -/area/hallway/primary/central) -"i" = ( -/turf/open/floor/engine/airless, -/area/hallway/primary/central) -"j" = ( -/turf/open/floor/engine/n2o, -/area/hallway/primary/central) -"k" = ( -/obj/item/card/id/advanced/debug, -/obj/structure/rack, -/turf/open/floor/iron, -/area/hallway/primary/central) -"l" = ( -/obj/machinery/power/rtg/debug, -/obj/structure/cable, -/turf/open/floor/iron, -/area/hallway/primary/central) -"m" = ( -/obj/machinery/door/poddoor{ - id = "c1toc2"; - name = "c1toc2" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"n" = ( -/obj/machinery/door/poddoor{ - id = "c2toc3"; - name = "c2toc3" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"o" = ( -/obj/effect/landmark/latejoin, -/obj/effect/turf_decal/bot_red, -/turf/open/floor/iron, -/area/hallway/primary/central) -"p" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/hallway/primary/central) -"q" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/hallway/primary/central) -"r" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/hallway/primary/central) -"s" = ( -/obj/machinery/atmospherics/miner/n2o, -/turf/open/floor/engine/n2o, -/area/hallway/primary/central) -"t" = ( -/obj/effect/landmark/observer_start, -/obj/effect/turf_decal/bot_red, -/turf/open/floor/iron, -/area/hallway/primary/central) -"u" = ( -/obj/effect/turf_decal/trimline, -/turf/open/floor/engine/plasma, -/area/hallway/primary/central) -"v" = ( -/obj/effect/turf_decal/trimline, -/turf/open/floor/engine/airless, -/area/hallway/primary/central) -"w" = ( -/obj/effect/turf_decal/trimline, -/turf/open/floor/engine/n2o, -/area/hallway/primary/central) -"x" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/hallway/primary/central) -"y" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/hallway/primary/central) -"z" = ( -/obj/machinery/meter/turf, -/turf/open/floor/engine/plasma, -/area/hallway/primary/central) -"A" = ( -/obj/machinery/meter/turf, -/turf/open/floor/engine/airless, -/area/hallway/primary/central) -"B" = ( -/obj/machinery/meter/turf, -/turf/open/floor/engine/n2o, -/area/hallway/primary/central) -"C" = ( -/obj/item/card/id/advanced/gold/captains_spare, -/obj/item/card/id/advanced/gold/captains_spare, -/obj/item/card/id/advanced/gold/captains_spare, -/obj/structure/rack, -/turf/open/floor/iron, -/area/hallway/primary/central) -"D" = ( -/obj/machinery/button/door{ - id = "c1toc2"; - name = "c1toc2" - }, -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"E" = ( -/obj/machinery/button/door{ - id = "c2toc3"; - name = "c2toc3" - }, -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"F" = ( -/obj/machinery/button/door{ - id = "c1vent"; - name = "c1vent" - }, -/turf/open/floor/iron, -/area/hallway/primary/central) -"G" = ( -/obj/machinery/button/door{ - id = "c2vent"; - name = "c2vent" - }, -/turf/open/floor/iron, -/area/hallway/primary/central) -"H" = ( -/obj/machinery/button/door{ - id = "c3vent"; - name = "c3vent" - }, -/turf/open/floor/iron, -/area/hallway/primary/central) -"I" = ( -/obj/structure/cable, -/obj/machinery/light/floor, -/turf/open/floor/iron, -/area/hallway/primary/central) -"J" = ( -/obj/item/pipe_dispenser, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/hallway/primary/central) -"K" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/iron, -/area/hallway/primary/central) -"L" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/iron, -/area/hallway/primary/central) -"M" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/iron, -/area/hallway/primary/central) -"N" = ( -/obj/machinery/door/airlock/public, -/turf/open/floor/iron, -/area/hallway/primary/central) -"O" = ( -/turf/open/floor/iron/red, -/area/hallway/primary/central) -"P" = ( -/obj/machinery/meter/turf, -/turf/open/floor/iron, -/area/hallway/primary/central) -"Q" = ( -/obj/machinery/meter/turf, -/turf/open/floor/iron/red, -/area/hallway/primary/central) -"R" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/red, -/area/hallway/primary/central) -"S" = ( -/obj/machinery/door/airlock/external/glass, -/turf/open/floor/plating, -/area/hallway/primary/central) -"T" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/public, -/turf/open/floor/iron, -/area/hallway/primary/central) -"U" = ( -/obj/machinery/light/floor, -/turf/open/floor/engine/plasma, -/area/hallway/primary/central) -"V" = ( -/obj/machinery/light/floor, -/turf/open/floor/engine/airless, -/area/hallway/primary/central) -"W" = ( -/obj/machinery/light/floor, -/turf/open/floor/engine/n2o, -/area/hallway/primary/central) +"aa" = (/turf/open/space/basic,/area/space) +"ab" = (/turf/closed/wall/r_wall,/area/hallway/primary/central) +"ac" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/hallway/primary/central) +"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"ag" = (/turf/open/floor/iron,/area/hallway/primary/central) +"ah" = (/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"ai" = (/turf/open/floor/engine/airless,/area/hallway/primary/central) +"aj" = (/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"ak" = (/obj/item/card/id/advanced/debug,/obj/structure/rack,/turf/open/floor/iron,/area/hallway/primary/central) +"al" = (/obj/machinery/power/rtg/debug,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"am" = (/obj/machinery/door/poddoor{id = "c1toc2"; name = "c1toc2"},/turf/open/floor/plating,/area/hallway/primary/central) +"an" = (/obj/machinery/door/poddoor{id = "c2toc3"; name = "c2toc3"},/turf/open/floor/plating,/area/hallway/primary/central) +"ao" = (/obj/effect/landmark/latejoin,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) +"ap" = (/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"aq" = (/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"ar" = (/obj/machinery/atmospherics/miner/plasma,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"as" = (/obj/machinery/atmospherics/miner/n2o,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"at" = (/obj/effect/landmark/observer_start,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) +"au" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"av" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/airless,/area/hallway/primary/central) +"aw" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"ax" = (/obj/effect/turf_decal/bot_red,/obj/effect/landmark/start/assistant,/turf/open/floor/iron,/area/hallway/primary/central) +"ay" = (/obj/machinery/power/apc/auto_name/directional/east,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"az" = (/obj/machinery/meter/turf,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"aA" = (/obj/machinery/meter/turf,/turf/open/floor/engine/airless,/area/hallway/primary/central) +"aB" = (/obj/machinery/meter/turf,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"aC" = (/obj/item/card/id/advanced/gold/captains_spare,/obj/item/card/id/advanced/gold/captains_spare,/obj/item/card/id/advanced/gold/captains_spare,/obj/structure/rack,/turf/open/floor/iron,/area/hallway/primary/central) +"aD" = (/obj/machinery/button/door{id = "c1toc2"; name = "c1toc2"},/turf/closed/wall/r_wall,/area/hallway/primary/central) +"aE" = (/obj/machinery/button/door{id = "c2toc3"; name = "c2toc3"},/turf/closed/wall/r_wall,/area/hallway/primary/central) +"aF" = (/obj/machinery/button/door{id = "c1vent"; name = "c1vent"},/turf/open/floor/iron,/area/hallway/primary/central) +"aG" = (/obj/machinery/button/door{id = "c2vent"; name = "c2vent"},/turf/open/floor/iron,/area/hallway/primary/central) +"aH" = (/obj/machinery/button/door{id = "c3vent"; name = "c3vent"},/turf/open/floor/iron,/area/hallway/primary/central) +"aI" = (/obj/structure/cable,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"aJ" = (/turf/open/floor/plating,/area/hallway/primary/central) +"aK" = (/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) +"aL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) +"aM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) +"aN" = (/obj/machinery/door/airlock/public,/turf/open/floor/iron,/area/hallway/primary/central) +"aO" = (/turf/open/floor/iron/red,/area/hallway/primary/central) +"aP" = (/obj/machinery/meter/turf,/turf/open/floor/iron,/area/hallway/primary/central) +"aQ" = (/obj/machinery/meter/turf,/turf/open/floor/iron/red,/area/hallway/primary/central) +"aR" = (/obj/machinery/light/floor,/turf/open/floor/iron/red,/area/hallway/primary/central) +"aS" = (/obj/machinery/door/airlock/external/glass,/turf/open/floor/plating,/area/hallway/primary/central) +"aT" = (/obj/structure/cable,/obj/machinery/door/airlock/public,/turf/open/floor/iron,/area/hallway/primary/central) +"aU" = (/obj/machinery/light/floor,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"aV" = (/obj/machinery/light/floor,/turf/open/floor/engine/airless,/area/hallway/primary/central) +"aW" = (/obj/machinery/light/floor,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"aX" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) +"aY" = (/obj/machinery/atmospherics/components/binary/pump{icon_state = "pump_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"aZ" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"ba" = (/obj/machinery/atmospherics/components/binary/volume_pump{icon_state = "volpump_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bb" = (/obj/machinery/atmospherics/components/binary/valve{dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bc" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bd" = (/obj/item/pipe_dispenser,/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/door_remote/omni,/turf/open/floor/iron,/area/hallway/primary/central) +"be" = (/obj/machinery/pipedispenser,/turf/open/floor/iron,/area/hallway/primary/central) +"bf" = (/obj/machinery/light/floor,/turf/open/floor/plating,/area/hallway/primary/central) +"bg" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) +"bh" = (/obj/effect/turf_decal/stripes/red/line,/turf/open/floor/plating,/area/hallway/primary/central) +"bi" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) +"bj" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bk" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bl" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/binary/valve/digital{icon_state = "dvalve_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bm" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/binary/passive_gate{icon_state = "passgate_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bn" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 9},/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"bo" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/turf_decal/trimline/yellow/filled,/turf/open/floor/iron,/area/hallway/primary/central) +"bp" = (/obj/machinery/light/floor,/obj/machinery/portable_atmospherics/canister,/obj/effect/turf_decal/trimline/yellow/filled,/turf/open/floor/iron,/area/hallway/primary/central) +"bq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/turf_decal/trimline/blue/filled,/turf/open/floor/iron,/area/hallway/primary/central) +"br" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 6},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bs" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 1},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/obj/machinery/meter,/turf/open/floor/plating,/area/hallway/primary/central) +"bt" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 10},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bu" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 8},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bv" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bw" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 5},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bx" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/obj/machinery/meter,/turf/open/floor/plating,/area/hallway/primary/central) +"by" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 9},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) (1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -b -b -c -c -c -b -b -b -c -b -b -b -c -c -c -c -c -c -c -c -b -b -b -c -c -c -b -b -a -"} -(3,1,1) = {" -a -b -g -g -g -g -g -b -g -g -g -b -g -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(4,1,1) = {" -a -c -g -l -p -l -g -c -g -I -g -c -g -q -g -g -q -g -g -g -q -g -c -g -g -q -g -g -c -a -"} -(5,1,1) = {" -a -c -g -g -q -p -p -T -p -p -g -c -g -g -g -g -g -g -g -g -g -g -N -g -g -P -g -g -c -a -"} -(6,1,1) = {" -a -c -g -l -p -l -g -c -g -p -g -c -g -g -g -g -g -g -g -g -g -g -c -g -g -g -g -g -c -a -"} -(7,1,1) = {" -a -b -g -g -g -p -y -b -g -p -g -c -g -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(8,1,1) = {" -a -b -b -c -c -c -b -b -g -p -g -c -g -g -g -g -g -g -g -g -g -g -b -b -c -N -c -b -b -a -"} -(9,1,1) = {" -a -b -h -h -h -h -h -b -g -p -g -c -g -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(10,1,1) = {" -a -d -h -h -h -h -h -c -g -p -g -c -g -q -g -g -q -g -g -g -q -g -c -g -g -g -g -g -c -a -"} -(11,1,1) = {" -a -d -h -U -r -u -z -c -F -I -g -c -g -g -g -g -g -g -g -g -g -g -c -g -g -g -g -g -c -a -"} -(12,1,1) = {" -a -d -h -h -h -h -h -c -g -p -g -c -g -g -g -g -g -g -g -g -g -g -N -g -g -P -g -g -c -a -"} -(13,1,1) = {" -a -b -h -h -h -h -h -b -g -p -g -c -g -g -g -g -g -g -g -g -g -g -c -g -g -q -g -g -c -a -"} -(14,1,1) = {" -a -b -b -m -m -m -b -D -g -p -g -b -g -g -g -g -g -g -g -g -g -g -c -g -g -g -g -g -c -a -"} -(15,1,1) = {" -a -b -i -i -i -i -i -b -g -p -g -N -g -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(16,1,1) = {" -a -e -i -i -i -v -i -c -g -p -g -N -g -q -g -g -q -g -g -g -q -g -b -b -c -N -c -b -b -a -"} -(17,1,1) = {" -a -e -i -V -i -i -A -c -G -I -g -N -g -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(18,1,1) = {" -a -e -i -i -i -v -i -c -g -p -g -b -J -g -g -g -g -g -g -g -g -g -c -g -g -g -g -g -c -a -"} -(19,1,1) = {" -a -b -i -i -i -i -i -b -g -p -g -c -K -g -g -g -g -g -g -g -g -g -N -g -g -q -g -g -c -a -"} -(20,1,1) = {" -a -b -b -n -n -n -b -E -g -p -g -c -K -g -g -g -g -g -g -g -g -g -c -g -g -P -g -g -c -a -"} -(21,1,1) = {" -a -b -j -j -j -j -j -b -g -p -g -c -K -q -g -g -q -g -g -g -q -g -c -g -g -g -g -g -c -a -"} -(22,1,1) = {" -a -f -j -j -j -w -j -c -g -p -g -c -L -g -g -g -g -g -g -g -g -g -b -g -g -g -g -g -b -a -"} -(23,1,1) = {" -a -f -j -W -s -w -B -c -H -I -g -c -L -g -g -g -g -g -g -g -g -g -b -b -c -N -c -b -b -a -"} -(24,1,1) = {" -a -f -j -j -j -w -j -c -g -p -g -c -L -g -g -g -g -g -g -g -g -g -b -O -O -O -O -O -b -a -"} -(25,1,1) = {" -a -b -j -j -j -j -j -b -g -p -g -c -M -g -g -g -g -g -g -g -g -g -c -O -O -O -O -O -c -a -"} -(26,1,1) = {" -a -b -b -c -c -c -b -b -g -p -g -c -M -g -g -g -g -g -g -g -g -g -N -O -O -Q -O -O -S -a -"} -(27,1,1) = {" -a -c -k -o -t -x -C -c -g -q -g -c -M -q -g -g -q -g -g -g -q -g -c -O -O -R -O -O -c -a -"} -(28,1,1) = {" -a -b -g -g -q -g -g -N -g -g -g -b -g -g -g -g -g -g -g -g -g -g -b -O -O -O -O -O -b -a -"} -(29,1,1) = {" -a -b -b -c -c -c -b -b -b -c -b -b -b -c -c -c -c -c -c -c -c -b -b -b -c -S -c -b -b -a -"} -(30,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababacacacabababadadadabababaeaeaeabababafafafababacababaa +aaabagagagagagabahahahahahabaiaiaiaiaiabajajajajajabakagabaa +aaacagalagalagacahahaUahahamaiaiaVaiaianajajaWajajacaoagacaa +aaacagapaqapagacahaharahahamaiaiaiaiaianajajasajajacataqacaa +aaacagalapalapacahahauahahamaiavaiavaianajawawawajacaxagacaa +aaabagagapagayabahahazahahabaiaiaAaiaiabajajaBajajabaCagabaa +aaababacaTacabababacacacabaDabacacacabaEabacacacababacaNabaa +aaabagagapagagagagagaFagagagagagaGagagagagagaHagagagagagabaa +aaacagaIapapapapapapaIapapapapapaIapapapapapaIapapapaqagacaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagabaa +aaababacacacacacacacacacacabaNaNaNabacacacacacacacacacababaa +aaabaJaJaJaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeabaa +aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagacaa +aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagacaa +aaacagagagagagagagagagagagagagagagagagagagagagagagagagagacaa +aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagagagagagaqagacaa +aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagagagagagagagacaa +aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagacaa +aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagacaa +aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagacaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagabaa +aaababacaNacabababacacaNacacabababacaNacacabababacaNacababaa +aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaa +aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaa +aaacagaqaPagagaNagagagaPaqagagaNagagaqaPagagaNaOaOaQaRaOaSaa +aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaa +aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaa +aaababacacacabababacacacacacabababacacacacabababacaSacababaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} From 193eca932404fba27a78e1567af3f4d22fb1cea4 Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Sat, 23 Apr 2022 19:23:04 -0400 Subject: [PATCH 045/200] Further map updates, add maps.txt def --- _maps/map_files/debug/atmos_mintest.dmm | 137 +++++++++++++++++------- config/maps.txt | 3 + 2 files changed, 104 insertions(+), 36 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index 0acc3cd4df6..310d8b6efb8 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -1,9 +1,9 @@ "aa" = (/turf/open/space/basic,/area/space) "ab" = (/turf/closed/wall/r_wall,/area/hallway/primary/central) "ac" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/hallway/primary/central) -"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/hallway/primary/central) -"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/hallway/primary/central) -"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/space) +"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/space) +"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/space) "ag" = (/turf/open/floor/iron,/area/hallway/primary/central) "ah" = (/turf/open/floor/engine/plasma,/area/hallway/primary/central) "ai" = (/turf/open/floor/engine/airless,/area/hallway/primary/central) @@ -18,7 +18,7 @@ "ar" = (/obj/machinery/atmospherics/miner/plasma,/turf/open/floor/engine/plasma,/area/hallway/primary/central) "as" = (/obj/machinery/atmospherics/miner/n2o,/turf/open/floor/engine/n2o,/area/hallway/primary/central) "at" = (/obj/effect/landmark/observer_start,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) -"au" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"au" = (/obj/effect/turf_decal/trimline,/obj/machinery/air_sensor/plasma_tank,/turf/open/floor/engine/plasma,/area/hallway/primary/central) "av" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/airless,/area/hallway/primary/central) "aw" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/n2o,/area/hallway/primary/central) "ax" = (/obj/effect/turf_decal/bot_red,/obj/effect/landmark/start/assistant,/turf/open/floor/iron,/area/hallway/primary/central) @@ -37,13 +37,13 @@ "aK" = (/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) "aL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) "aM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) -"aN" = (/obj/machinery/door/airlock/public,/turf/open/floor/iron,/area/hallway/primary/central) +"aN" = (/obj/structure/cable,/obj/machinery/power/rtg/debug,/turf/open/floor/iron,/area/hallway/primary/central) "aO" = (/turf/open/floor/iron/red,/area/hallway/primary/central) "aP" = (/obj/machinery/meter/turf,/turf/open/floor/iron,/area/hallway/primary/central) "aQ" = (/obj/machinery/meter/turf,/turf/open/floor/iron/red,/area/hallway/primary/central) "aR" = (/obj/machinery/light/floor,/turf/open/floor/iron/red,/area/hallway/primary/central) "aS" = (/obj/machinery/door/airlock/external/glass,/turf/open/floor/plating,/area/hallway/primary/central) -"aT" = (/obj/structure/cable,/obj/machinery/door/airlock/public,/turf/open/floor/iron,/area/hallway/primary/central) +"aT" = (/obj/machinery/gravity_generator/main/station,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) "aU" = (/obj/machinery/light/floor,/turf/open/floor/engine/plasma,/area/hallway/primary/central) "aV" = (/obj/machinery/light/floor,/turf/open/floor/engine/airless,/area/hallway/primary/central) "aW" = (/obj/machinery/light/floor,/turf/open/floor/engine/n2o,/area/hallway/primary/central) @@ -75,36 +75,101 @@ "bw" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 5},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) "bx" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/obj/machinery/meter,/turf/open/floor/plating,/area/hallway/primary/central) "by" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 9},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bz" = (/obj/machinery/door/airlock/public/glass,/turf/open/floor/iron,/area/hallway/primary/central) +"bA" = (/obj/structure/cable,/obj/effect/turf_decal/arrows,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"bB" = (/obj/structure/cable,/turf/open/floor/plating,/area/hallway/primary/central) +"bC" = (/obj/structure/cable,/obj/effect/turf_decal/arrows{icon_state = "arrows"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) +"bD" = (/obj/item/pipe_dispenser,/obj/structure/table/reinforced,/turf/open/floor/iron,/area/hallway/primary/central) +"bE" = (/obj/item/holosign_creator/atmos,/obj/structure/table/reinforced,/turf/open/floor/iron,/area/hallway/primary/central) +"bF" = (/obj/machinery/portable_atmospherics/pump,/turf/open/floor/iron,/area/hallway/primary/central) +"bG" = (/obj/machinery/portable_atmospherics/scrubber,/turf/open/floor/iron,/area/hallway/primary/central) +"bH" = (/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/door_remote/omni,/turf/open/floor/iron,/area/hallway/primary/central) +"bI" = (/obj/machinery/air_sensor/mix_tank,/turf/open/floor/engine/airless,/area/hallway/primary/central) +"bJ" = (/obj/effect/turf_decal/trimline,/obj/machinery/air_sensor/nitrous_tank,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"bK" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output,/turf/open/floor/engine/plasma,/area/hallway/primary/central) +"bL" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output,/turf/open/floor/engine/airless,/area/hallway/primary/central) +"bM" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output,/turf/open/floor/engine/n2o,/area/hallway/primary/central) +"bN" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bO" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bP" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/pink/visible,/turf/open/floor/plating,/area/hallway/primary/central) +"bQ" = (/obj/machinery/portable_atmospherics/canister/plasma,/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"bR" = (/obj/machinery/computer/atmos_control/plasma_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"bS" = (/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"bT" = (/obj/machinery/computer/atmos_control/mix_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"bU" = (/obj/machinery/atmospherics/pipe/smart/simple/pink/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"bV" = (/obj/machinery/computer/atmos_control/nitrous_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) +"bW" = (/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"bX" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"bY" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Power"},/turf/open/floor/iron,/area/hallway/primary/central) +"bZ" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Main Floor"},/turf/open/floor/iron,/area/hallway/primary/central) +"ca" = (/obj/machinery/light/floor,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"cb" = (/obj/machinery/door/airlock/public/glass{name = "Basic Equipment Tests"},/turf/open/floor/iron,/area/hallway/primary/central) +"cc" = (/turf/open/floor/iron,/area/space) +"cd" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/space) +"ce" = (/obj/machinery/door/airlock/public/glass,/turf/open/floor/iron,/area/space) +"cf" = (/obj/machinery/door/airlock/external/glass,/turf/open/floor/plating,/area/space) +"cg" = (/turf/closed/wall/r_wall,/area/space) +"ch" = (/turf/open/space/basic,/area/hallway/primary/central) +"ci" = (/obj/machinery/atmospherics/components/unary/portables_connector,/turf/open/floor/plating,/area/hallway/primary/central) +"cj" = (/obj/machinery/atmospherics/components/binary/thermomachine/freezer,/turf/open/floor/plating,/area/hallway/primary/central) +"ck" = (/obj/machinery/atmospherics/components/binary/thermomachine/heater,/turf/open/floor/plating,/area/hallway/primary/central) +"cl" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) +"cm" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 6},/turf/open/space/basic,/area/space) +"cn" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 10},/turf/open/space/basic,/area/space) +"co" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/turf/open/space/basic,/area/space) +"cp" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 5},/turf/open/space/basic,/area/space) +"cq" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 9},/turf/open/space/basic,/area/space) +"cr" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/heat_exchanging/junction{icon_state = "pipe11-3"; dir = 1},/turf/open/floor/plating,/area/space) +"cs" = (/obj/structure/table/reinforced,/obj/item/analyzer,/turf/open/floor/iron,/area/hallway/primary/central) +"ct" = (/obj/effect/landmark/start/assistant,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) +"cu" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/turf/open/floor/iron,/area/hallway/primary/central) +"cv" = (/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/debug/omnitool,/obj/item/debug/omnitool,/turf/open/floor/iron,/area/hallway/primary/central) +"cw" = (/obj/structure/table/reinforced,/obj/item/gun/magic/wand/death/debug,/obj/item/gun/magic/wand/death/debug,/obj/item/gun/magic/wand/resurrection/debug,/obj/item/gun/magic/wand/safety/debug,/obj/item/gun/magic/wand/safety/debug,/turf/open/floor/iron,/area/hallway/primary/central) +"cx" = (/obj/structure/table/reinforced,/obj/item/mod/control/pre_equipped/debug,/turf/open/floor/iron,/area/hallway/primary/central) +"cy" = (/obj/structure/table/reinforced,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/turf/open/floor/iron,/area/hallway/primary/central) +"cz" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Gravgen"},/turf/open/floor/iron,/area/hallway/primary/central) +"cA" = (/obj/machinery/light/floor,/turf/open/floor/iron,/area/space) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaababacacacabababadadadabababaeaeaeabababafafafababacababaa -aaabagagagagagabahahahahahabaiaiaiaiaiabajajajajajabakagabaa -aaacagalagalagacahahaUahahamaiaiaVaiaianajajaWajajacaoagacaa -aaacagapaqapagacahaharahahamaiaiaiaiaianajajasajajacataqacaa -aaacagalapalapacahahauahahamaiavaiavaianajawawawajacaxagacaa -aaabagagapagayabahahazahahabaiaiaAaiaiabajajaBajajabaCagabaa -aaababacaTacabababacacacabaDabacacacabaEabacacacababacaNabaa -aaabagagapagagagagagaFagagagagagaGagagagagagaHagagagagagabaa -aaacagaIapapapapapapaIapapapapapaIapapapapapaIapapapaqagacaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagabaa -aaababacacacacacacacacacacabaNaNaNabacacacacacacacacacababaa -aaabaJaJaJaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeabaa -aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagacaa -aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagacaa -aaacagagagagagagagagagagagagagagagagagagagagagagagagagagacaa -aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagagagagagaqagacaa -aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagagagagagagagacaa -aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagacaa -aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagacaa -aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagacaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagabaa -aaababacaNacabababacacaNacacabababacaNacacabababacaNacababaa -aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaa -aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaa -aaacagaqaPagagaNagagagaPaqagagaNagagaqaPagagaNaOaOaQaRaOaSaa -aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaa -aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaa -aaababacacacabababacacacacacabababacacacacabababacaSacababaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aacgcgcdcdcdcgcgcgadadadcgcgcgaeaeaecgcgcgafafafcgcgcgcdcdcdcgcgaaaaaaaaaaaaaaaa +aaabagagagagagabaUahahahaUabaVaiaiaiaVabaWajajajaWabaqagagagaqabaacmcncmcnaaaaaa +aaacagalagalagacahahahahahamaiaiaiaiaianajajajajajacagagagagagacaacocococoaaaaaa +aaacagaNaqaNagacahaharahahamaiaiaiaiaianajajasajajacagagagagagacaacocococoaaaaaa +aaacagalapalapacahahauahahamaiavbIavaianajawbJawajacagagaTagagacaacocococoaaaaaa +aaabagagapagayabaUbKazahaUabaVbLaAaiaVabaWbMaBajaWabaqagapagaqabaacocpcqcoaaaaaa +aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacababcgcrcdcdcrcgcgaa +aaabctagapagakabaKbQaFbRagagagbSaGbTagagagbUaHbVagagaqagapagagaqcsbXaKaKbXaqabaa +aaacctagapagaoacaKbWagagagagagbSagagagagagbUagagagagagagapagagagagagagagagagabaa +aaacctagbAagatacaLbXagagagagagbXagagagagagbXagagagagagagapagagagagagagagagagabaa +aaacctagapagaxacaLagagaqagagagagaqagagagagagaqagagagaqagapagaqagagagaqagagagabaa +aaacctagbAagaCacaLagagagagagagagagagagagagagagagagagagagapagagagagagagagagagabaa +aaacctagapagcuacaMagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa +aaacctagbAagcvacaMagagaqagagagagaqagagagagagaqagagagaqagapagaqagagagaqagagagacaa +aaacctagapagcwacaMagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa +aaacctagbAagcxabbeagagagagagagagaqagagagagagagagagagagagapagagagagagagagagagabaa +aaacctagapagcyababbDbEaqagagagbBbBbBagagagagaqagagagaqagapagaqagagagaqagagagabaa +aaacctagbAagagabbFbGbHagagagagagapagagagagagagagagagagagapagagagagagagagagagabaa +aaacagaIapapbCbZapapaIapapapapapaIapapapapapaIapapapcaapapagaqagagagaqagagagacaa +aaabagagagagagabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagaqabaa +aaababacacacabababacacacacabcbcbcbabacacacacacacacacacacabacacacabacacacabababaa +aaabaJaJaJaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeacagagagacagagagacchchaa +aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagbzcccAcccecccAcccfaaaaaa +aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagaccccccccdcccccccdaaaaaa +aaacagagagagagagagagagagagagagagagagagagagagciciagagagagabcdcecdcgcdcecdcgaaaaaa +aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagcjckagagaqagaccccccccdcccccccdaaaaaa +aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagclclagagagagbzcccAcccecccAcccfaaaaaa +aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagaccccccccdcccccccdaaaaaa +aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagabcdcecdcgcdcecdcgaaaaaa +aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagaccccccccccccccccdaaaaaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagbzcccAcccccccAcccfaaaaaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagaccccccccccccccccdaaaaaa +aaababacbzacabababacacbzacacabababacbzacacabababacbzacababcdcdcdcgcdcdcdcgaaaaaa +aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa +aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa +aaacagaqaPagagbzagagagaPaqagagbzagagaqaPagagbzaOaOaQaRaOaSaaaaaaaaaaaaaaaaaaaaaa +aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa +aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa +aaababacacacabababacacacacacabababacacacacabababacaSacababaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/config/maps.txt b/config/maps.txt index e1ab50b3391..87293fd9bca 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -42,5 +42,8 @@ endmap map runtimestation endmap +map atmostest +endmap + map multiz_debug endmap From 814fe3928035c246d1080a792e68169d681087c6 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 23 Apr 2022 21:29:12 -0400 Subject: [PATCH 046/200] Typo + fixes? passive gates --- code/modules/atmospherics/ZAS/Fire.dm | 6 +++--- code/modules/atmospherics/ZAS/Turf.dm | 10 +++++++--- code/modules/atmospherics/ZAS/ZAS_Settings.dm | 6 +++--- .../components/binary_devices/passive_gate.dm | 8 +++++++- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 2e996122b8d..1c21064fb24 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -41,7 +41,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return igniting /zone/proc/process_fire() - var/datum/gas_mixture/burn_gas = air.remove_ratio(SSzas.settings.fire_consuption_rate, fire_tiles.len) + var/datum/gas_mixture/burn_gas = air.remove_ratio(SSzas.settings.fire_consumption_rate, fire_tiles.len) var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) @@ -356,7 +356,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/oil/liquid) . = 0 for(var/g in gas) - if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consumption_rate) >= 0.1) . = 1 break @@ -368,7 +368,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin . = 0 for(var/g in gas) - if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consuption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consumption_rate) >= 0.1) . = 1 break diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 033c069fc9b..fab4fc888fc 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -177,7 +177,9 @@ if(!unsim) //edge of map continue - var/block = unsim.c_airblock(src) + //var/block = unsim.c_airblock(src) + var/block + ATMOS_CANPASS_TURF(block, src, unsim) if(block & AIR_BLOCKED) #ifdef ZASDBG @@ -187,7 +189,9 @@ continue - var/r_block = c_airblock(unsim) + //var/r_block = c_airblock(unsim) + var/r_block + ATMOS_CANPASS_TURF(r_block, unsim, src) if(r_block & AIR_BLOCKED) #ifdef ZASDBG @@ -226,7 +230,7 @@ #ifdef ZASDBG if(verbose) log_admin("[d] is zone blocked.") - //dbg(zone_blocked, d) + dbg(zone_blocked, d) #endif //Postpone this tile rather than exit, since a connection can still be made. diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm index 430d48f9d49..f7f6a08d42c 100644 --- a/code/modules/atmospherics/ZAS/ZAS_Settings.dm +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -1,9 +1,9 @@ /datum/zas_controller var/datum/pl_control/plc = new - var/fire_consuption_rate = 0.25 - var/fire_consuption_rate_NAME = "Fire - Air Consumption Ratio" - var/fire_consuption_rate_DESC = "Ratio of air removed and combusted per tick." + var/fire_consumption_rate = 0.25 + var/fire_consumption_rate_NAME = "Fire - Air Consumption Ratio" + var/fire_consumption_rate_DESC = "Ratio of air removed and combusted per tick." var/fire_firelevel_multiplier = 25 var/fire_firelevel_multiplier_NAME = "Fire - Firelevel Constant" diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 4d6330a4392..6d16367c5f2 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -57,8 +57,14 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] + var/output_starting_pressure = air2.return_pressure() + var/input_starting_pressure = air1.return_pressure() + + pressure_delta = input_starting_pressure - target_pressure + var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles - if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles)) >= 0)//pump_gas() will return a negative number if no flow occurred + transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta) + if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, pressure_delta)) >= 0)//pump_gas() will return a negative number if no flow occurred update_parents() //Radio remote control From a43c1a3afe9f3b5173c5e054dc5e0fd1ec868823 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 23 Apr 2022 21:33:49 -0400 Subject: [PATCH 047/200] Fixes passive gate for real and fixes a canister bug --- .../machinery/components/binary_devices/passive_gate.dm | 2 +- code/modules/atmospherics/machinery/portable/canister.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 6d16367c5f2..d1e27d30e3b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -63,7 +63,7 @@ Passive gate is similar to the regular pump except: pressure_delta = input_starting_pressure - target_pressure var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles - transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta) + transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta)) if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, pressure_delta)) >= 0)//pump_gas() will return a negative number if no flow occurred update_parents() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 8eee12b0e2f..64b6373c169 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -440,7 +440,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return exposed_temperature > temperature_resistance * mode /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(5, BURN, 0) + if(exposed_temperature > heat_limit) + take_damage(5, BURN, 0) /obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) if((flags_1 & NODECONSTRUCT_1)) @@ -564,7 +565,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) transfer_moles = min(transfer_moles, (release_pressure/air_contents.volume)*air_contents.total_moles) //flow rate limit pump_gas_passive(air_contents, environment, transfer_moles) - //air_update_turf(FALSE, FALSE) air_contents.react() From d48ed6662774f56d3a73b0d60b88ff3146ccf56a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 23 Apr 2022 21:35:46 -0400 Subject: [PATCH 048/200] Hahaha im a dumbass. --- .../machinery/components/binary_devices/passive_gate.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index d1e27d30e3b..7d5ce9f6d97 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -57,10 +57,9 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - var/output_starting_pressure = air2.return_pressure() var/input_starting_pressure = air1.return_pressure() - pressure_delta = input_starting_pressure - target_pressure + var/pressure_delta = input_starting_pressure - target_pressure var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta)) From 6c3c921e1f065925e14152d8ee283a67002ad302 Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Sun, 24 Apr 2022 00:03:30 -0400 Subject: [PATCH 049/200] FUCK --- _maps/map_files/debug/atmos_mintest.dmm | 40 +++++++++++-------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index 310d8b6efb8..fc78cf65a19 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -1,9 +1,9 @@ "aa" = (/turf/open/space/basic,/area/space) "ab" = (/turf/closed/wall/r_wall,/area/hallway/primary/central) "ac" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/hallway/primary/central) -"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/space) -"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/space) -"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/space) +"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/hallway/primary/central) +"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/hallway/primary/central) "ag" = (/turf/open/floor/iron,/area/hallway/primary/central) "ah" = (/turf/open/floor/engine/plasma,/area/hallway/primary/central) "ai" = (/turf/open/floor/engine/airless,/area/hallway/primary/central) @@ -104,11 +104,7 @@ "bZ" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Main Floor"},/turf/open/floor/iron,/area/hallway/primary/central) "ca" = (/obj/machinery/light/floor,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) "cb" = (/obj/machinery/door/airlock/public/glass{name = "Basic Equipment Tests"},/turf/open/floor/iron,/area/hallway/primary/central) -"cc" = (/turf/open/floor/iron,/area/space) -"cd" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/space) -"ce" = (/obj/machinery/door/airlock/public/glass,/turf/open/floor/iron,/area/space) -"cf" = (/obj/machinery/door/airlock/external/glass,/turf/open/floor/plating,/area/space) -"cg" = (/turf/closed/wall/r_wall,/area/space) +"cc" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/heat_exchanging/junction{icon_state = "pipe11-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) "ch" = (/turf/open/space/basic,/area/hallway/primary/central) "ci" = (/obj/machinery/atmospherics/components/unary/portables_connector,/turf/open/floor/plating,/area/hallway/primary/central) "cj" = (/obj/machinery/atmospherics/components/binary/thermomachine/freezer,/turf/open/floor/plating,/area/hallway/primary/central) @@ -119,7 +115,6 @@ "co" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/turf/open/space/basic,/area/space) "cp" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 5},/turf/open/space/basic,/area/space) "cq" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 9},/turf/open/space/basic,/area/space) -"cr" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/heat_exchanging/junction{icon_state = "pipe11-3"; dir = 1},/turf/open/floor/plating,/area/space) "cs" = (/obj/structure/table/reinforced,/obj/item/analyzer,/turf/open/floor/iron,/area/hallway/primary/central) "ct" = (/obj/effect/landmark/start/assistant,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) "cu" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/turf/open/floor/iron,/area/hallway/primary/central) @@ -128,17 +123,16 @@ "cx" = (/obj/structure/table/reinforced,/obj/item/mod/control/pre_equipped/debug,/turf/open/floor/iron,/area/hallway/primary/central) "cy" = (/obj/structure/table/reinforced,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/turf/open/floor/iron,/area/hallway/primary/central) "cz" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Gravgen"},/turf/open/floor/iron,/area/hallway/primary/central) -"cA" = (/obj/machinery/light/floor,/turf/open/floor/iron,/area/space) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aacgcgcdcdcdcgcgcgadadadcgcgcgaeaeaecgcgcgafafafcgcgcgcdcdcdcgcgaaaaaaaaaaaaaaaa +aaababacacacabababadadadabababaeaeaeabababafafafabababacacacababaaaaaaaaaaaaaaaa aaabagagagagagabaUahahahaUabaVaiaiaiaVabaWajajajaWabaqagagagaqabaacmcncmcnaaaaaa aaacagalagalagacahahahahahamaiaiaiaiaianajajajajajacagagagagagacaacocococoaaaaaa aaacagaNaqaNagacahaharahahamaiaiaiaiaianajajasajajacagagagagagacaacocococoaaaaaa aaacagalapalapacahahauahahamaiavbIavaianajawbJawajacagagaTagagacaacocococoaaaaaa aaabagagapagayabaUbKazahaUabaVbLaAaiaVabaWbMaBajaWabaqagapagaqabaacocpcqcoaaaaaa -aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacababcgcrcdcdcrcgcgaa +aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacabababccacacccababaa aaabctagapagakabaKbQaFbRagagagbSaGbTagagagbUaHbVagagaqagapagagaqcsbXaKaKbXaqabaa aaacctagapagaoacaKbWagagagagagbSagagagagagbUagagagagagagapagagagagagagagagagabaa aaacctagbAagatacaLbXagagagagagbXagagagagagbXagagagagagagapagagagagagagagagagabaa @@ -154,17 +148,17 @@ aaacagaIapapbCbZapapaIapapapapapaIapapapapapaIapapapcaapapagaqagagagaqagagagacaa aaabagagagagagabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagaqabaa aaababacacacabababacacacacabcbcbcbabacacacacacacacacacacabacacacabacacacabababaa aaabaJaJaJaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeacagagagacagagagacchchaa -aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagbzcccAcccecccAcccfaaaaaa -aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagaccccccccdcccccccdaaaaaa -aaacagagagagagagagagagagagagagagagagagagagagciciagagagagabcdcecdcgcdcecdcgaaaaaa -aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagcjckagagaqagaccccccccdcccccccdaaaaaa -aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagclclagagagagbzcccAcccecccAcccfaaaaaa -aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagaccccccccdcccccccdaaaaaa -aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagabcdcecdcgcdcecdcgaaaaaa -aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagaccccccccccccccccdaaaaaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagbzcccAcccccccAcccfaaaaaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagaccccccccccccccccdaaaaaa -aaababacbzacabababacacbzacacabababacbzacacabababacbzacababcdcdcdcgcdcdcdcgaaaaaa +aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagbzagaqagbzagaqagaSaaaaaa +aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagacagagagacagagagacaaaaaa +aaacagagagagagagagagagagagagagagagagagagagagciciagagagagabacbzacabacbzacabaaaaaa +aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagcjckagagaqagacagagagacagagagacaaaaaa +aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagclclagagagagbzagaqagbzagaqagaSaaaaaa +aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagacagagagacagagagacaaaaaa +aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagabacbzacabacbzacabaaaaaa +aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagacagagagagagagagacaaaaaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagbzagaqagagagaqagaSaaaaaa +aaabagagagagagagagagagagagagagagagagagagagagagagagagagagacagagagagagagagacaaaaaa +aaababacbzacabababacacbzacacabababacbzacacabababacbzacababacacacabacacacabaaaaaa aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa aaacagaqaPagagbzagagagaPaqagagbzagagaqaPagagbzaOaOaQaRaOaSaaaaaaaaaaaaaaaaaaaaaa From 0062db60b42c4c4e1acdf6275dc4ba44c33cf946 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 24 Apr 2022 03:18:40 -0400 Subject: [PATCH 050/200] Moar gases, gaseous reagents, and handling. --- code/__DEFINES/atmospherics/ZAS.dm | 1 + code/modules/atmospherics/ZAS/Plasma.dm | 2 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 19 ++++----- .../ZAS/zas_extras/gas_reagents.dm | 41 +++++++++++++++++++ .../atmospherics/machinery/airalarm.dm | 17 ++++++++ .../machinery/portable/canister.dm | 6 +++ code/modules/mob/living/carbon/human/life.dm | 8 ++-- .../mob/living/carbon/human/species.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 2 +- code/modules/mob/living/carbon/life.dm | 40 ++++++++++++------ .../chemistry/reagents/other_reagents.dm | 2 +- .../chemistry/reagents/toxin_reagents.dm | 10 +++-- tgstation.dme | 1 + 13 files changed, 116 insertions(+), 35 deletions(-) create mode 100644 code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 666db30595f..9d6861008c2 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -256,6 +256,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) +GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index 64f28ec787d..c494c753e0d 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -167,7 +167,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi . = ..() //Items that are in plasma, but not on a mob, can still be contaminated. if(istype(I) && SSzas && SSzas.settings?.plc.cloth_contamination && I.can_contaminate()) - var/datum/gas_mixture/env = return_air(1) + var/datum/gas_mixture/env = return_air() if(!env) return for(var/g in env.gas) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index ad184f3e607..016ac21061a 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -4,7 +4,6 @@ specific_heat = 20 // J/(mol*K) molar_mass = 0.032 // kg/mol flags = XGM_GAS_OXIDIZER | XGM_GAS_FUSION_FUEL - breathed_product = /datum/reagent/oxygen symbol_html = "O<sub>2</sub>" symbol = "O2" @@ -36,7 +35,7 @@ /datum/xgm_gas/phoron id = GAS_PLASMA - name = "Phoron" + name = "Plasma" //Note that this has a significant impact on TTV yield. //Because it is so high, any leftover phoron soaks up a lot of heat and drops the yield pressure. @@ -131,7 +130,6 @@ specific_heat = 80 // J/(mol*K) molar_mass = 0.004 // kg/mol flags = XGM_GAS_FUSION_FUEL - //breathed_product = /datum/reagent/helium symbol_html = "He" symbol = "He" @@ -165,7 +163,7 @@ name = "Xenon" specific_heat = 3 // J/(mol*K) molar_mass = 0.054 // kg/mol - //breathed_product = /datum/reagent/nitrous_oxide/xenon + breathed_product = /datum/reagent/nitrous_oxide/xenon symbol_html = "Xe" symbol = "Xe" @@ -198,8 +196,8 @@ molar_mass = 0.017 // kg/mol tile_overlay = "chlorine" overlay_limit = 0.1 - flags = XGM_GAS_CONTAMINANT - //breathed_product = /datum/reagent/toxin/chlorine + flags = XGM_GAS_OXIDIZER + breathed_product = /datum/reagent/chlorine symbol_html = "Cl" symbol = "Cl" @@ -210,16 +208,14 @@ overlay_limit = 0.5 specific_heat = 30 // J/(mol*K) molar_mass = 0.020 // kg/mol - breathed_product = /datum/reagent/water - condensation_product = /datum/reagent/water - condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. + breathed_product = /datum/reagent/water + condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. symbol_html = "H<sub>2</sub>O" symbol = "H2O" /datum/xgm_gas/sulfurdioxide id = GAS_SULFUR name = "Sulfur Dioxide" - specific_heat = 30 // J/(mol*K) molar_mass = 0.044 // kg/mol symbol_html = "SO<sub>2</sub>" @@ -228,7 +224,6 @@ /datum/xgm_gas/ammonia id = GAS_AMMONIA name = "Ammonia" - specific_heat = 20 // J/(mol*K) molar_mass = 0.017 // kg/mol breathed_product = /datum/reagent/ammonia @@ -240,6 +235,6 @@ name = "Carbon Monoxide" specific_heat = 30 // J/(mol*K) molar_mass = 0.028 // kg/mol - //breathed_product = /datum/reagent/carbon_monoxide + breathed_product = /datum/reagent/carbon_monoxide symbol_html = "CO" symbol = "CO" diff --git a/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm new file mode 100644 index 00000000000..dbdd45cbb25 --- /dev/null +++ b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm @@ -0,0 +1,41 @@ +//Apparently on TG, N2O fluid doesn't make you giggle, so this is almost an exact copy. +/datum/reagent/nitrous_oxide/xenon + name = "Xenon" + description = "A nontoxic gas used as a general anaesthetic." + reagent_state = GAS + metabolization_rate = 0.3 * REAGENTS_METABOLISM + color = "#808080" + taste_description = "sweetness" + ph = 5.8 + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/carbon_monoxide + name = "Carbon Monoxide" + description = "A dangerous carbon comubstion byproduct." + taste_description = "stale air" + color = "#808080" + metabolization_rate = 0.3 * REAGENTS_METABOLISM + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/carbon_monoxide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + var/warning_message + var/warning_prob = 10 + if(volume >= 3) + warning_message = pick("extremely dizzy","short of breath","faint","confused") + warning_prob = 15 + M.adjustOxyLoss(rand(10,20)) + M.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2, override = TRUE) + else if(volume >= 1.5) + warning_message = pick("dizzy","short of breath","faint","momentarily confused") + M.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2, override = TRUE) + M.adjustOxyLoss(rand(3,5)) + else if(volume >= 0.25) + warning_message = pick("a little dizzy","short of breath") + warning_prob = 10 + if(warning_message && prob(warning_prob)) + to_chat(M, "<span class='warning'>You feel [warning_message].</span>") + + return ..() +/datum/reagent/carbon_monoxide/on_mob_end_metabolize(mob/living/L) + . = ..() + L.clear_alert(ALERT_TOO_MUCH_CO2, clear_override = TRUE) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 779c7fcfeb0..e80a872816a 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -103,6 +103,23 @@ GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), GAS_PLASMA = new/datum/tlv/dangerous, GAS_N2O = new/datum/tlv/dangerous, + GAS_METHYL_BROMIDE = new/datum/tlv/dangerous, + GAS_METHANE = new/datum/tlv/dangerous, + GAS_HYDROGEN = new/datum/tlv/dangerous, + GAS_CHLORINE = new/datum/tlv/dangerous, + GAS_CO = new/datum/tlv/dangerous, + GAS_NO2 = new/datum/tlv/dangerous, + GAS_XENON = new/datum/tlv/dangerous, + GAS_TRITIUM = new/datum/tlv/dangerous, + GAS_DEUTERIUM = new/datum/tlv/dangerous, + GAS_METHANE = new/datum/tlv(-1, -1, 1000, 1000), + GAS_HELIUM = new/datum/tlv(-1, -1, 1000, 1000), + GAS_KRYPTON = new/datum/tlv(-1, -1, 1000, 1000), + GAS_NEON = new/datum/tlv(-1, -1, 1000, 1000), + GAS_NO = new/datum/tlv(-1, -1, 1000, 1000), + GAS_STEAM = new/datum/tlv(-1, -1, 1000, 1000), + GAS_SULFUR = new/datum/tlv(-1, -1, 1000, 1000), + GAS_ARGON = new/datum/tlv(-1, -1, 1000, 1000), ) /* // Breathable air. "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), // kPa. Values are hazard_min, warning_min, warning_max, hazard_max diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 64b6373c169..3d82121001e 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -151,6 +151,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = GAS_CO2 greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#4e4c48" + +/obj/machinery/portable_atmospherics/canister/carbon_monoxide + name = "Carbon monoxide canister" + gas_type = GAS_CO + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#808080" /* /obj/machinery/portable_atmospherics/canister/freon name = "Freon canister" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6f2e1281e8a..8711c7cfe74 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -96,13 +96,13 @@ var/datum/species/S = dna.species - if(S.breathid == "o2") + if(S.breathid == GAS_OXYGEN) throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) - else if(S.breathid == "plas") + else if(S.breathid == GAS_PLASMA) throw_alert(ALERT_NOT_ENOUGH_PLASMA, /atom/movable/screen/alert/not_enough_plas) - else if(S.breathid == "co2") + else if(S.breathid == GAS_CO2) throw_alert(ALERT_NOT_ENOUGH_CO2, /atom/movable/screen/alert/not_enough_co2) - else if(S.breathid == "n2") + else if(S.breathid == GAS_NITROGEN) throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) return FALSE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 79d57f6f933..c80baa72787 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -176,7 +176,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' ///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm] - var/breathid = "o2" + var/breathid = GAS_OXYGEN ///What anim to use for dusting var/dust_anim = "dust-h" diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index bb198308ee9..3b11d3b4818 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -26,7 +26,7 @@ heatmod = 1.5 brutemod = 1.5 payday_modifier = 0.75 - breathid = "plas" + breathid = GAS_PLASMA damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = FRUIT | CLOTH liked_food = VEGETABLES diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index c9671c6b8be..8f3cd612fa7 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -116,9 +116,24 @@ var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) + // Pass reagents from the gas into our body. + // Presumably if you breathe it you have a specialized metabolism for it, so we drop/ignore breath_type. Also avoids + // humans processing thousands of units of oxygen over the course of a round for the sole purpose of poisoning vox. + if(lungs) + var/breath_type = dna?.species?.breathid + for(var/gasname in breath.gas - breath_type) + var/breathed_product = xgm_gas_data.breathed_product[gasname] + if(breathed_product) + var/reagent_amount = breath.gas[gasname] * REAGENT_GAS_EXCHANGE_FACTOR + // Little bit of sanity so we aren't trying to add 0.0000000001 units of CO2, and so we don't end up with 99999 units of CO2. + if(reagent_amount >= 0.05) + reagents.add_reagent(breathed_product, reagent_amount) + breath.adjust_gas(gasname, -breath.gas[gasname], update = 0) //update after + check_breath(breath) if(breath) + breath.update_values() loc.assume_air(breath) /mob/living/carbon/proc/has_smoke_protection() @@ -141,7 +156,7 @@ adjustOxyLoss(2) //CRIT - if(!breath || (breath.total_moles() == 0) || !lungs) + if(!breath || (breath.total_moles == 0) || !lungs) if(reagents.has_reagent(/datum/reagent/medicine/epinephrine, needs_metabolizing = TRUE) && lungs) return FALSE adjustOxyLoss(1) @@ -150,17 +165,18 @@ throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) return FALSE + var/list/breath_gases = breath.gas var/safe_oxy_min = 16 var/safe_co2_max = 10 var/safe_plas_max = 0.05 var/SA_para_min = 1 var/SA_sleep_min = 5 var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + var/breath_pressure = (breath.total_moles*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/O2_partialpressure = (breath.get_gas(GAS_OXYGEN)/breath.total_moles())*breath_pressure - var/Plasma_partialpressure = (breath.get_gas(GAS_OXYGEN)/breath.total_moles())*breath_pressure - var/CO2_partialpressure = (breath.get_gas(GAS_CO2)/breath.total_moles())*breath_pressure + var/O2_partialpressure = (breath_gases[GAS_OXYGEN]/breath.total_moles)*breath_pressure + var/Plasma_partialpressure = (breath_gases[GAS_PLASMA]/breath.total_moles)*breath_pressure + var/CO2_partialpressure = (breath_gases[GAS_CO2]/breath.total_moles)*breath_pressure //OXYGEN @@ -171,7 +187,7 @@ var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) failed_last_breath = TRUE - oxygen_used = breath.get_gas(GAS_OXYGEN)*ratio + oxygen_used = breath_gases[GAS_OXYGEN]*ratio else adjustOxyLoss(3) failed_last_breath = TRUE @@ -181,11 +197,11 @@ failed_last_breath = FALSE if(health >= crit_threshold) adjustOxyLoss(-5) - oxygen_used = breath.get_gas(GAS_OXYGEN) + oxygen_used = breath_gases[GAS_OXYGEN] clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - breath.adjust_gas(GAS_OXYGEN, -oxygen_used) - breath.adjust_gas(GAS_CO2, oxygen_used) + breath.adjust_gas(GAS_OXYGEN, -oxygen_used, update = 0) + breath.adjust_gas(GAS_CO2, oxygen_used, update = 0) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -204,15 +220,15 @@ //PLASMA if(Plasma_partialpressure > safe_plas_max) - var/ratio = breath.get_gas(GAS_PLASMA)/safe_plas_max * 10 + var/ratio = breath.gas[GAS_PLASMA]/safe_plas_max * 10 adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) else clear_alert(ALERT_TOO_MUCH_PLASMA) //NITROUS OXIDE - if(breath.get_gas(GAS_N2O)) - var/SA_partialpressure = (breath.get_gas(GAS_N2O)/breath.total_moles())*breath_pressure + if(breath_gases[GAS_N2O]) + var/SA_partialpressure = (breath_gases[GAS_N2O]/breath.total_moles)*breath_pressure if(SA_partialpressure > SA_para_min) throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 9f33fad685c..17e4f269378 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1393,7 +1393,7 @@ . = ..() if(istype(exposed_turf)) var/temp = holder ? holder.chem_temp : T20C - exposed_turf.atmos_spawn_air("n2o=[reac_volume/20];TEMP=[temp]") + exposed_turf.assume_gas(GAS_N2O, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) /datum/reagent/nitrous_oxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index bbc5323105f..441c285e531 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -107,8 +107,10 @@ if(!holder.my_atom) return - var/turf/T = get_turf(holder.my_atom) - T.atmos_spawn_air(GAS_PLASMA, volume, holder.chem_temp) + var/turf/open/T = get_turf(holder.my_atom) + if(!istype(T)) + return + T.assume_gas(GAS_PLASMA, volume, holder.chem_temp) holder.del_reagent(type) /datum/reagent/toxin/plasma/expose_turf(turf/open/exposed_turf, reac_volume) @@ -116,13 +118,15 @@ return var/temp = holder ? holder.chem_temp : T20C if(temp >= LIQUID_PLASMA_BP) - exposed_turf.atmos_spawn_air("plasma=[reac_volume];TEMP=[temp]") + exposed_turf.assume_gas(GAS_PLASMA, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, holder.chem_temp) return ..() /datum/reagent/toxin/plasma/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel! . = ..() if(methods & (TOUCH|VAPOR)) exposed_mob.adjust_fire_stacks(reac_volume / 5) + if(prob(50 * reac_volume)) + exposed_mob.expose_plasma() return /datum/reagent/toxin/hot_ice diff --git a/tgstation.dme b/tgstation.dme index eb1ccd4e75d..13fd2990a44 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2367,6 +2367,7 @@ #include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" #include "code\modules\atmospherics\ZAS\Connection.dm" #include "code\modules\atmospherics\ZAS\ConnectionGroup.dm" +#include "code\modules\atmospherics\ZAS\zas_extras\gas_reagents.dm" #include "code\modules\atmospherics\ZAS\ConnectionManager.dm" #include "code\modules\atmospherics\ZAS\ZAS_Settings.dm" #include "code\modules\atmospherics\ZAS\Debug.dm" From cd7f757746015e489ab82fc2aadc9010191e7bec Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:19:26 -0400 Subject: [PATCH 051/200] Updates fire code to be more functional --- code/controllers/subsystem/explosions.dm | 3 ++- code/datums/mutations/actions.dm | 2 +- .../effects/decals/cleanable/robots.dm | 4 ++- code/modules/antagonists/cult/runes.dm | 3 ++- .../heretic/magic/ash_ascension.dm | 9 ++++--- code/modules/atmospherics/ZAS/Fire.dm | 25 +++++++++++++------ .../food_and_drinks/drinks/drinks/bottle.dm | 4 ++- code/modules/mob/living/carbon/life.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 7 ++++-- .../simple_animal/hostile/space_dragon.dm | 3 ++- .../projectiles/guns/energy/beam_rifle.dm | 3 ++- .../projectile/bullets/_incendiary.dm | 6 +++-- .../chemistry/reagents/other_reagents.dm | 2 +- .../reagents/pyrotechnic_reagents.dm | 11 +++++--- code/modules/reagents/chemistry/recipes.dm | 9 ++++--- .../chemistry/recipes/cat2_medicines.dm | 4 ++- .../chemistry/recipes/pyrotechnics.dm | 12 ++++++--- .../xenobiology/crossbreeding/charged.dm | 5 ++-- .../xenobiology/crossbreeding/chilling.dm | 3 ++- .../xenobiology/crossbreeding/regenerative.dm | 5 ++-- .../vehicles/mecha/combat/savannah_ivanov.dm | 3 ++- 21 files changed, 84 insertions(+), 41 deletions(-) diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index c8f3e6b1cd7..337180125ae 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -674,7 +674,8 @@ SUBSYSTEM_DEF(explosions) for(var/thing in flame_turf) if(thing) var/turf/T = thing - new /obj/effect/hotspot(T) //Mostly for ambience! + //new /obj/effect/hotspot(T) //Mostly for ambience! + T.create_fire(2, 25) cost_flameturf = MC_AVERAGE(cost_flameturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if (low_turf.len || med_turf.len || high_turf.len) diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 5367666877e..a726d4cb644 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -164,7 +164,7 @@ /obj/effect/proc_holder/spell/cone/staggered/firebreath/do_turf_cone_effect(turf/target_turf, level) // Further turfs experience less exposed_temperature and exposed_volume - new /obj/effect/hotspot(target_turf) // for style + target_turf.create_fire(1, 10) // for style target_turf.hotspot_expose(max(500, 900 - (100 * level)), max(50, 200 - (50 * level)), 1) /obj/effect/proc_holder/spell/cone/staggered/firebreath/do_mob_cone_effect(mob/living/target_mob, level) diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index b7fe891900b..630860f7ea9 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -82,6 +82,7 @@ decal_reagent = /datum/reagent/fuel/oil reagent_amount = 30 + /obj/effect/decal/cleanable/oil/attackby(obj/item/I, mob/living/user) var/attacked_by_hot_thing = I.get_temperature() if(attacked_by_hot_thing) @@ -91,6 +92,7 @@ return return ..() +/* /obj/effect/decal/cleanable/oil/fire_act(exposed_temperature, exposed_volume) if(exposed_temperature < 480) return @@ -98,7 +100,7 @@ var/turf/T = get_turf(src) qdel(src) new /obj/effect/hotspot(T) - +*/ /obj/effect/decal/cleanable/oil/streak icon_state = "streak1" random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 1ebd987a682..f91a8fc9cd8 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -771,7 +771,8 @@ structure_check() searches for nearby cultist structures required for the invoca if(QDELETED(src)) return do_area_burn(T, 1.5) - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) qdel(src) /obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier) diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index e43b7fb4c94..49c1e4460dd 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -39,7 +39,8 @@ return for(var/turf/nearby_turf as anything in RANGE_TURFS(1, current_user)) - new /obj/effect/hotspot(nearby_turf) + //new /obj/effect/hotspot(nearby_turf) + nearby_turf.create_fire(1, 10) nearby_turf.hotspot_expose(750, 25 * delta_time, 1) for(var/mob/living/fried_living in nearby_turf.contents - current_user) fried_living.adjustFireLoss(2.5 * delta_time) @@ -65,7 +66,8 @@ var/current_range = 1 for(var/i in 0 to max_range) for(var/turf/nearby_turf as anything in spiral_range_turfs(current_range, centre)) - new /obj/effect/hotspot(nearby_turf) + //new /obj/effect/hotspot(nearby_turf) + nearby_turf.create_fire(1, 10) nearby_turf.hotspot_expose(750, 50, 1) for(var/mob/living/fried_living in nearby_turf.contents - centre) fried_living.adjustFireLoss(5) @@ -133,7 +135,8 @@ L.adjustFireLoss(20) to_chat(L, span_userdanger("You're hit by [source]'s eldritch flames!")) - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) T.hotspot_expose(700,50,1) // deals damage to mechs for(var/obj/vehicle/sealed/mecha/M in T.contents) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 1c21064fb24..ce0328f890b 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -93,7 +93,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return 0 //turf/simulated/create_fire(fl) ZASTURF -/turf/create_fire(fl) +/turf/open/create_fire(fl, create_own_fuel) if(fire) fire.firelevel = max(fl, fire.firelevel) return 1 @@ -105,6 +105,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin SSzas.active_fire_zones |= zone var/obj/effect/decal/cleanable/oil/fuel = locate() in src + if(create_own_fuel) + if(!fuel) + fuel = new /obj/effect/decal/cleanable/oil(src) + fuel.reagent_amount = create_own_fuel + else + fuel.reagent_amount += create_own_fuel + zone.fire_tiles |= src if(fuel) zone.fuel_objs += fuel @@ -145,13 +152,16 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(firelevel > 6) icon_state = "3" - set_light(1, 2, 7) + set_light_power(2) + set_light_range(7) else if(firelevel > 2.5) icon_state = "2" - set_light(0.7, 2, 5) + set_light_power(1.5) + set_light_range(5) else icon_state = "1" - set_light(0.5, 1, 3) + set_light_power(1) + set_light_range(3) for(var/mob/living/L in loc) L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs! @@ -190,7 +200,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume) animate(src, color = fire_color(air_contents.temperature), 5) - set_light(l_color = color) + set_light_color(color) /obj/effect/hotspot/New(newLoc,fl) ..() @@ -203,8 +213,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/datum/gas_mixture/air_contents = loc.return_air() color = fire_color(air_contents.temperature) - set_light(0.5, 1, 3, l_color = color) - + set_light_range(3) + set_light_power(1) + set_light_color(color) firelevel = fl SSzas.active_hotspots.Add(src) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index edf70da9687..af8e13ff484 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -661,7 +661,9 @@ break if(firestarter && active) hit_atom.fire_act() - new /obj/effect/hotspot(get_turf(hit_atom)) + //new /obj/effect/hotspot(get_turf(hit_atom)) + var/turf/T = get_turf(hit_atom) + T.create_fire(1, 10) ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8f3cd612fa7..2bfde32e8b1 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -119,7 +119,7 @@ // Pass reagents from the gas into our body. // Presumably if you breathe it you have a specialized metabolism for it, so we drop/ignore breath_type. Also avoids // humans processing thousands of units of oxygen over the course of a round for the sole purpose of poisoning vox. - if(lungs) + if(lungs && !isnull(breath)) var/breath_type = dna?.species?.breathid for(var/gasname in breath.gas - breath_type) var/breathed_product = xgm_gas_data.breathed_product[gasname] diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 756ffc9cd74..8a64375ef8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -183,7 +183,9 @@ for(var/turf/T in turfs) if(istype(T, /turf/closed)) break - var/obj/effect/hotspot/drake_fire_hotspot = new /obj/effect/hotspot(T) + //var/obj/effect/hotspot/drake_fire_hotspot = new /obj/effect/hotspot(T) + T.create_fire(1, 10) + var/obj/effect/hotspot/drake_fire_hotspot = locate() in T if(frozen) drake_fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) T.hotspot_expose(DRAKE_FIRE_TEMP,DRAKE_FIRE_EXPOSURE,1) @@ -332,7 +334,8 @@ var/turf/closed/mineral/M = T M.gets_drilled() playsound(T, SFX_EXPLOSION, 80, TRUE) - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) T.hotspot_expose(DRAKE_FIRE_TEMP, DRAKE_FIRE_EXPOSURE, 1) for(var/mob/living/L in T.contents) if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 15e3cd5e87b..9d890df0041 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -334,7 +334,8 @@ /mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T) var/list/hit_list = list() hit_list += src - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) T.hotspot_expose(700,50,1) for(var/mob/living/L in T.contents) if(L in hit_list) diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index 01a2e87700d..1ae0ca8bd01 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -448,7 +448,8 @@ to_chat(L, span_userdanger("\The [src] sears you!")) for(var/turf/T in RANGE_TURFS(aoe_fire_range, epicenter)) //handle aoe fire if(prob(aoe_fire_chance)) - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) for(var/obj/O in range(aoe_structure_range, epicenter)) if(!isitem(O)) O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, LASER, FALSE) diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index cb18fa00236..cbbe45861f4 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -13,7 +13,8 @@ . = ..() var/turf/location = get_turf(src) if(location) - new /obj/effect/hotspot(location) + //.new /obj/effect/hotspot(location) + location.create_fire(1, 10) location.hotspot_expose(700, 50, 1) /// Used in [the backblast element][/datum/element/backblast] @@ -50,7 +51,8 @@ . = ..() var/turf/location = get_turf(target) if(isopenturf(location)) - new /obj/effect/hotspot(location) + //new /obj/effect/hotspot(location) + location.create_fire(1, 10) location.hotspot_expose(700, 50, 1) /obj/projectile/bullet/incendiary/backblast/Move() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 17e4f269378..260cfa6bdf3 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -915,7 +915,7 @@ /datum/reagent/chlorine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.take_bodypart_damage(0.5*REM*delta_time, 0, 0, 0) + M.adjustToxLoss(3*REM*delta_time) . = TRUE ..() diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index bc6120804c9..31355b69b89 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -67,15 +67,18 @@ exposed_turf.burn_tile() if(isfloorturf(exposed_turf)) for(var/turf/nearby_turf in RANGE_TURFS(1, exposed_turf)) - if(!locate(/obj/effect/hotspot) in nearby_turf) - new /obj/effect/hotspot(nearby_turf) + /*if(!locate(/obj/effect/hotspot) in nearby_turf) + new /obj/effect/hotspot(nearby_turf)*/ + nearby_turf.create_fire(1, 10) /datum/reagent/clf3/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() exposed_mob.adjust_fire_stacks(min(reac_volume/5, 10)) exposed_mob.IgniteMob() - if(!locate(/obj/effect/hotspot) in exposed_mob.loc) - new /obj/effect/hotspot(exposed_mob.loc) + //if(!locate(/obj/effect/hotspot) in exposed_mob.loc) + //new /obj/effect/hotspot(exposed_mob.loc) + var/turf/T = get_turf(exposed_mob) + T.create_fire(1, 10) /datum/reagent/sorium name = "Sorium" diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index bc133b55a48..8594509568a 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -475,7 +475,8 @@ equilibrium.data["[id]_y"] += increment var/turf/holder_turf = get_turf(holder.my_atom) var/turf/target = locate(holder_turf.x + equilibrium.data["[id]_x"], holder_turf.y + equilibrium.data["[id]_y"], holder_turf.z) - new /obj/effect/hotspot(target) + //new /obj/effect/hotspot(target) + target.create_fire(1, 10) debug_world("X: [equilibrium.data["[id]_x"]], Y: [equilibrium.data["[id]_x"]]") /* @@ -487,10 +488,12 @@ /datum/chemical_reaction/proc/explode_fire_square(datum/reagents/holder, datum/equilibrium/equilibrium, fire_range = 1) var/turf/location = get_turf(holder.my_atom) if(fire_range == 0) - new /obj/effect/hotspot(location) + //new /obj/effect/hotspot(location) + location.create_fire(1, 10) return for(var/turf/turf as anything in RANGE_TURFS(fire_range, location)) - new /obj/effect/hotspot(turf) + //new /obj/effect/hotspot(turf) + turf.create_fire(1, 10) ///////////END FIRE BASED EXPLOSIONS diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index a34603f4a6a..ecbf33d3fc1 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -30,7 +30,9 @@ return if(helbital.purity <= 0.25) if(prob(25)) - new /obj/effect/hotspot(holder.my_atom.loc) + //new /obj/effect/hotspot(holder.my_atom.loc) + var/turf/T = get_turf(holder.my_atom) + T.create_fire(1, 10) holder.remove_reagent(/datum/reagent/medicine/c2/helbital, 2) holder.chem_temp += 5 holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The impurity of the reacting helbital is too great causing [holder.my_atom] to let out a hearty burst of flame, evaporating part of the product!")) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 08385f6e134..6635fbca8b2 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -53,7 +53,8 @@ var/fire_range = round(created_volume/30) var/turf/T = get_turf(holder.my_atom) for(var/turf/target as anything in RANGE_TURFS(fire_range,T)) - new /obj/effect/hotspot(target) + //new /obj/effect/hotspot(target) + target.create_fire(1, 10) holder.chem_temp = 500 ..() @@ -67,7 +68,8 @@ var/fire_range = round(created_volume/20) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf as anything in RANGE_TURFS(fire_range,T)) - new /obj/effect/hotspot(turf) + //new /obj/effect/hotspot(turf) + turf.create_fire(1, 10) holder.chem_temp = 750 ..() @@ -212,7 +214,8 @@ /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/target as anything in RANGE_TURFS(1,T)) - new /obj/effect/hotspot(target) + //new /obj/effect/hotspot(target) + target.create_fire(1, 10) holder.chem_temp = 1000 // hot as shit /datum/chemical_reaction/reagent_explosion/methsplosion @@ -225,7 +228,8 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/target in RANGE_TURFS(1,T)) - new /obj/effect/hotspot(target) + //new /obj/effect/hotspot(target) + target.create_fire(1, 10) holder.chem_temp = 1000 // hot as shit ..() diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 9b4cfa25aa2..9e5beccb169 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -44,8 +44,9 @@ Charged extracts: /obj/item/slimecross/charged/orange/do_effect(mob/user) var/turf/targetturf = get_turf(user) for(var/turf/turf as anything in RANGE_TURFS(5,targetturf)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) + /*if(!locate(/obj/effect/hotspot) in turf) + new /obj/effect/hotspot(turf)*/ + turf.create_fire(1, 10) ..() /obj/item/slimecross/charged/purple diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 36ceb568c7b..9a2933e81f1 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -45,7 +45,8 @@ Chilling extracts: user.visible_message(span_danger("[src] shatters, and lets out a jet of heat!")) for(var/turf/T in orange(get_turf(user),2)) if(get_dist(get_turf(user), T) > 1) - new /obj/effect/hotspot(T) + //new /obj/effect/hotspot(T) + T.create_fire(1, 10) ..() /obj/item/slimecross/chilling/purple diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 5e36207a44b..77ed699dc87 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -44,8 +44,9 @@ Regenerative extracts: /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) target.visible_message(span_warning("The [src] boils over!")) for(var/turf/targetturf in RANGE_TURFS(1,target)) - if(!locate(/obj/effect/hotspot) in targetturf) - new /obj/effect/hotspot(targetturf) + /*if(!locate(/obj/effect/hotspot) in targetturf) + new /obj/effect/hotspot(targetturf)*/ + targetturf.create_fire(1, 10) /obj/item/slimecross/regenerative/purple colour = "purple" diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 3b28c661952..827673abe33 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -123,7 +123,8 @@ shake_camera(shaken, 3, 3) var/turf/launch_turf = get_turf(chassis) - new /obj/effect/hotspot(launch_turf) + //new /obj/effect/hotspot(launch_turf) + launch_turf.create_fire(1, 10) launch_turf.hotspot_expose(700, 50, 1) new /obj/effect/skyfall_landingzone(launch_turf, chassis) chassis.resistance_flags |= INDESTRUCTIBLE //not while jumping at least From 6ea9f4144373b1d911ef277a1e411c43e90303a5 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 24 Apr 2022 17:34:16 -0400 Subject: [PATCH 052/200] Removes atmos sensitivity --- code/__DEFINES/atmospherics/temperature.dm | 3 +-- code/controllers/subsystem/airmachines.dm | 2 -- code/datums/elements/atmos_sensitive.dm | 3 ++- code/game/machinery/doors/windowdoor.dm | 23 +++++++++++++++++-- code/game/machinery/firealarm.dm | 1 - .../effects/effect_system/effects_foam.dm | 10 +++----- code/game/objects/effects/glowshroom.dm | 6 ++--- code/game/objects/effects/spiderwebs.dm | 6 ++--- code/game/objects/items/flamethrower.dm | 3 ++- code/game/objects/items/latexballoon.dm | 7 ++---- .../objects/items/stacks/sheets/leather.dm | 15 +++++------- code/game/objects/structures/aliens.dm | 17 +++++--------- code/game/objects/structures/grille.dm | 10 ++------ code/game/objects/structures/window.dm | 1 - code/modules/atmospherics/ZAS/Temperature.dm | 11 +++++++-- .../components/unary_devices/vent_scrubber.dm | 17 -------------- .../machinery/portable/canister.dm | 3 ++- code/modules/clothing/under/accessories.dm | 16 ++++--------- code/modules/events/spacevine.dm | 17 ++++++-------- .../living/carbon/alien/special/facehugger.dm | 7 ++---- .../mob/living/simple_animal/bot/firebot.dm | 12 +++++----- code/modules/power/apc/apc_main.dm | 7 +++--- code/modules/power/lighting/light.dm | 6 ----- code/modules/vehicles/mecha/_mecha.dm | 1 - code/modules/vehicles/mecha/mecha_defense.dm | 8 ++++--- 25 files changed, 90 insertions(+), 122 deletions(-) diff --git a/code/__DEFINES/atmospherics/temperature.dm b/code/__DEFINES/atmospherics/temperature.dm index e26dc041577..d9a31fd0bcc 100644 --- a/code/__DEFINES/atmospherics/temperature.dm +++ b/code/__DEFINES/atmospherics/temperature.dm @@ -1,6 +1,7 @@ #define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !QDELETED(A) && !(A.flags_2 & NO_TEMP_CHANGE_2)) #define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 #define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 +#define KEEP_ME_GOING 1 /*#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ _atom.temperature = _temp; \ @@ -19,10 +20,8 @@ var/atom/A = thing; \ if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ START_PROCESSING(SSairatoms, A); \ - A.flags_1 |= ATMOS_IS_PROCESSING_1 \ } \ } \ } else if(ATOM_IS_TEMPERATURE_SENSITIVE(_atoms)) { \ START_PROCESSING(SSairatoms, _atoms); \ - _atoms.flags_1 |= ATMOS_IS_PROCESSING_1 \ } diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index 02e872bc111..7973428b70e 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -244,7 +244,6 @@ SUBSYSTEM_DEF(airmachines) return machine.atmos_processing = TRUE atmos_machinery += machine - machine.flags_1 |= ATMOS_IS_PROCESSING_1 /** * Removes a given machine to the processing system for SSZAS_MACHINES processing. @@ -257,7 +256,6 @@ SUBSYSTEM_DEF(airmachines) return machine.atmos_processing = FALSE atmos_machinery -= machine - machine.flags_1 &= ~ATMOS_IS_PROCESSING_1 // If we're currently processing atmos machines, there's a chance this machine is in // the currentrun list, which is a cache of atmos_machinery. Remove it from that list diff --git a/code/datums/elements/atmos_sensitive.dm b/code/datums/elements/atmos_sensitive.dm index fd0ac7f6db2..28a32372fd2 100644 --- a/code/datums/elements/atmos_sensitive.dm +++ b/code/datums/elements/atmos_sensitive.dm @@ -2,7 +2,7 @@ //It adds the object to a list on SSair to be processed for so long as the object wants to be processed //And removes it as soon as the object is no longer interested //Don't put it on things that tend to clump into one spot, you will cause lag spikes. -/datum/element/atmos_sensitive +/*/datum/element/atmos_sensitive element_flags = ELEMENT_DETACH var/static/list/pass_on = list(COMSIG_TURF_EXPOSE = /atom/proc/check_atmos_process) @@ -81,3 +81,4 @@ ///What to do when our requirements are no longer met /atom/proc/atmos_end() return +*/ diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a67a5436690..ce10f43b7d2 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -60,7 +60,6 @@ ) AddElement(/datum/element/connect_loc, loc_connections) - AddElement(/datum/element/atmos_sensitive, mapload) update_nearby_tiles(TRUE) /obj/machinery/door/window/ComponentInitialize() @@ -75,6 +74,7 @@ electronics = null /*var/turf/floor = get_turf(src) floor.air_update_turf(TRUE, FALSE)*/ + update_nearby_tiles() return ..() /obj/machinery/door/window/update_icon_state() @@ -266,11 +266,30 @@ add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY) /obj/machinery/door/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > T0C + (reinf ? 1600 : 800)) + return (exposed_temperature > T0C + (reinf ? 1600 : 800)) ? KEEP_ME_GOING : FALSE /obj/machinery/door/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(round(exposed_temperature / 200), BURN, 0, 0) +/obj/machinery/door/window/fire_act(exposed_temperature, exposed_volume) + take_damage(round(exposed_temperature / 200), BURN, 0, 0) + +/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) + var/initial_damage_percentage = get_integrity_percentage() + . = ..() + if(.) //received damage + if(atom_integrity > 0) + playsound(src, get_sfx(SFX_GLASS_CRACK), 100, TRUE) + var/damage_percentage = get_integrity_percentage() + if (damage_percentage >= 75 && initial_damage_percentage < 75) + visible_message(span_warning("\The [src] looks like it's about to shatter!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) + else if (damage_percentage >= 50 && initial_damage_percentage < 50) + visible_message(span_warning("\The [src] looks seriously damaged!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) + else if (damage_percentage >= 25 && initial_damage_percentage < 25) + visible_message(span_warning("Cracks begin to appear in \the [src]!")) + playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) /obj/machinery/door/window/emag_act(mob/user) if(!operating && density && !(obj_flags & EMAGGED)) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 4d00c47071d..aaac9406ed2 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -47,7 +47,6 @@ my_area = get_area(src) LAZYADD(my_area.firealarms, src) - AddElement(/datum/element/atmos_sensitive, mapload) RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_security_level) soundloop = new(src, FALSE) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 1ffd68f649f..6aa32aba5c2 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -35,7 +35,6 @@ /obj/effect/particle_effect/foam/firefighting/Initialize(mapload) . = ..() - RemoveElement(/datum/element/atmos_sensitive) /obj/effect/particle_effect/foam/firefighting/process() ..() @@ -95,7 +94,6 @@ create_reagents(1000) //limited by the size of the reagent holder anyway. START_PROCESSING(SSfastprocess, src) playsound(src, 'sound/effects/bubbles2.ogg', 80, TRUE, -3) - AddElement(/datum/element/atmos_sensitive, mapload) /obj/effect/particle_effect/foam/ComponentInitialize() . = ..() @@ -192,12 +190,10 @@ F.add_atom_colour(color, FIXED_COLOUR_PRIORITY) F.metal = metal -/obj/effect/particle_effect/foam/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 475 - /obj/effect/particle_effect/foam/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated - kill_foam() + if(exposed_temperature > 475) + if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated + kill_foam() /////////////////////////////////////////////// diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 2c87da4834f..1cb3618c11b 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -100,7 +100,6 @@ GLOBAL_VAR_INIT(glowshrooms, 0) else //if on the floor, glowshroom on-floor sprite icon_state = base_icon_state - AddElement(/datum/element/atmos_sensitive, mapload) COOLDOWN_START(src, spread_cooldown, rand(min_delay_spread, max_delay_spread)) START_PROCESSING(SSobj, src) @@ -243,10 +242,11 @@ GLOBAL_VAR_INIT(glowshrooms, 0) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/glowshroom/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 + return (exposed_temperature > 300) ? KEEP_ME_GOING : FALSE /obj/structure/glowshroom/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(5, BURN, 0, 0) + if(exposed_temperature > 300) + take_damage(5, BURN, 0, 0) /obj/structure/glowshroom/acid_act(acidpwr, acid_volume) visible_message(span_danger("[src] melts away!")) diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index fcb6096eb50..d498b8bebe2 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -9,7 +9,6 @@ /obj/structure/spider/Initialize(mapload) . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) /obj/structure/spider/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type @@ -25,10 +24,11 @@ . = ..() /obj/structure/spider/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 + return (exposed_temperature > 300) ? KEEP_ME_GOING : FALSE /obj/structure/spider/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(5, BURN, 0, 0) + if(exposed_temperature > 300) + take_damage(5, BURN, 0, 0) /obj/structure/spider/stickyweb ///Whether or not the web is from the genetics power diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 260077375fc..96724324d20 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -220,7 +220,8 @@ var/datum/gas_mixture/ptank_mix = ptank.return_air() var/datum/gas_mixture/air_transfer = ptank_mix.remove_ratio(release_amount) //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE - new/obj/effect/decal/cleanable/oil(target,air_transfer.get_by_flag(XGM_GAS_FUEL),get_dir(loc,target)) + var/obj/effect/decal/cleanable/oil/l_fuel = new(target,air_transfer.get_by_flag(XGM_GAS_FUEL),get_dir(loc,target)) + l_fuel.reagent_amount = release_amount air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) target.assume_air(air_transfer) //Burn it based on transfered gas diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 86c531d8030..27f2ceb8a5b 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -13,7 +13,6 @@ /obj/item/latexballon/Initialize(mapload) . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) /obj/item/latexballon/proc/blow(obj/item/tank/tank, mob/user) if (icon_state == "latexballon_bursted") @@ -24,11 +23,9 @@ to_chat(user, span_notice("You blow up [src] with [tank].")) air_contents = tank.remove_air_volume(3) -/obj/item/latexballon/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > T0C+100) - /obj/item/latexballon/atmos_expose(datum/gas_mixture/air, exposed_temperature) - burst() + if(exposed_temperature > T0C + 100) + burst() /obj/item/latexballon/proc/burst() if (!air_contents || icon_state != "latexballon_blow") diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index cb28aeed081..196f15c164e 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -157,7 +157,6 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ /obj/item/stack/sheet/wethide/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() AddElement(/datum/element/dryable, /obj/item/stack/sheet/leather) - AddElement(/datum/element/atmos_sensitive, mapload) AddComponent(/datum/component/grillable, /obj/item/stack/sheet/leather, rand(1 SECONDS, 3 SECONDS), TRUE) /obj/item/stack/sheet/wethide/burn() @@ -279,15 +278,13 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ //Step two - washing..... it's actually in washing machine code. //Step three - drying -/obj/item/stack/sheet/wethide/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > drying_threshold_temperature) - /obj/item/stack/sheet/wethide/atmos_expose(datum/gas_mixture/air, exposed_temperature) - wetness-- - if(wetness == 0) - new /obj/item/stack/sheet/leather(drop_location(), 1) - wetness = initial(wetness) - use(1) + if(exposed_temperature > drying_threshold_temperature) + wetness-- + if(wetness == 0) + new /obj/item/stack/sheet/leather(drop_location(), 1) + wetness = initial(wetness) + use(1) /obj/item/stack/sheet/wethide/microwave_act(obj/machinery/microwave/MW) ..() diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 38f4e3a2871..bc36af79fe0 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -166,8 +166,6 @@ set_base_icon() - AddElement(/datum/element/atmos_sensitive, mapload) - /obj/structure/alien/weeds/Destroy() if(parent_node) UnregisterSignal(parent_node, COMSIG_PARENT_QDELETING) @@ -244,13 +242,11 @@ * Called to delete the weed */ /obj/structure/alien/weeds/proc/do_qdel() - qdel(src) - -/obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 + qdel(src) //WHY THE FUCK DOES THIS EXIST? WHAT THE FUCK? /obj/structure/alien/weeds/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(5, BURN, 0, 0) + if(exposed_temperature > T0C + 100) + take_damage(5, BURN, 0, 0) /obj/structure/alien/weeds/node name = "glowing resin" @@ -353,8 +349,6 @@ if(status == BURST) atom_integrity = integrity_failure * max_integrity - AddElement(/datum/element/atmos_sensitive, mapload) - /obj/structure/alien/egg/update_icon_state() switch(status) if(GROWING) @@ -426,10 +420,11 @@ break /obj/structure/alien/egg/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 500 + return exposed_temperature > 500 ? KEEP_ME_GOING : 0 /obj/structure/alien/egg/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(5, BURN, 0, 0) + if(exposed_temperature > 500) + take_damage(5, BURN, 0, 0) /obj/structure/alien/egg/atom_break(damage_flag) . = ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 026a9f4cbc4..eedf5c39bf1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -20,10 +20,6 @@ var/rods_amount = 2 var/rods_broken = TRUE -/obj/structure/grille/Initialize(mapload) - . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) - /obj/structure/grille/Destroy() update_cable_icons_on_turf(get_turf(src)) return ..() @@ -320,11 +316,9 @@ return FALSE return FALSE -/obj/structure/grille/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > T0C + 1500 && !broken - /obj/structure/grille/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(1, BURN, 0, 0) + if(exposed_temperature > T0C + 1500 && !broken) + take_damage(1, BURN, 0, 0) /obj/structure/grille/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isobj(AM)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 36a323c8cf5..d0cdf756363 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -542,7 +542,6 @@ /obj/structure/window/plasma/Initialize(mapload, direct) . = ..() - RemoveElement(/datum/element/atmos_sensitive) /obj/structure/window/plasma/spawnDebris(location) . = list() diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index 6f739b11cca..f5c43e0aea0 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -57,13 +57,20 @@ var/altered_temp = max(temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * temperature_coefficient * diff_temp), 0) ADJUST_ATOM_TEMPERATURE(src, (diff_temp > 0) ? min(adjust_temp, altered_temp) : max(adjust_temp, altered_temp)) - else if(local_air && should_atmos_process(local_air, local_air.temperature)) + else if(local_air && (should_atmos_process(local_air, local_air.temperature))) return else temperature = adjust_temp - flags_1 &= ~ATMOS_IS_PROCESSING_1 return PROCESS_KILL #undef MIN_TEMPERATURE_COEFFICIENT #undef MAX_TEMPERATURE_COEFFICIENT + +///This is your process() proc +/atom/proc/atmos_expose(datum/gas_mixture/air, exposed_temperature) + return + +///Return KEEP_ME_GOING if the atom should keep processing regardless of normal conditions. +/atom/proc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 1d6e3b77a43..debb3bffdcf 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -194,23 +194,6 @@ check_turfs() . = ..() -/obj/machinery/atmospherics/components/unary/vent_scrubber/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - if(welded || !is_operational) - return FALSE - if(!nodes[1] || !on || (!filter_types && scrubbing != SIPHONING)) - on = FALSE - return FALSE - - var/list/changed_gas = air.gas - - if(!changed_gas) - return FALSE - - if(scrubbing == SIPHONING || length(filter_types & changed_gas)) - return TRUE - - return FALSE - /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() if(welded || !is_operational) return diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 3d82121001e..25b680c991d 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -443,7 +443,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) add_overlay(window) /obj/machinery/portable_atmospherics/canister/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > temperature_resistance * mode + if(exposed_temperature > temperature_resistance * mode) + return KEEP_ME_GOING /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > heat_limit) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 632348c29d5..e787571f3f7 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -261,18 +261,12 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = -10, ACID = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) -/obj/item/clothing/accessory/medal/plasma/Initialize(mapload) - . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) - -/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 - /obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature) - var/turf/turfloc = get_turf(src) - turfloc.atmos_spawn_air(GAS_PLASMA, 20, exposed_temperature) - visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) - qdel(src) + if(exposed_temperature > 300) + var/turf/turfloc = get_turf(src) + turfloc.atmos_spawn_air(GAS_PLASMA, 20, exposed_temperature) + visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!")) + qdel(src) /obj/item/clothing/accessory/medal/plasma/nobel_science name = "nobel sciences award" diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index fec5b4a45a8..09d4bbb71e7 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -389,7 +389,6 @@ COMSIG_ATOM_ENTERED = .proc/on_entered, ) AddElement(/datum/element/connect_loc, loc_connections) - AddElement(/datum/element/atmos_sensitive, mapload) /obj/structure/spacevine/examine(mob/user) . = ..() @@ -659,16 +658,14 @@ if(!index && prob(34 * severity)) qdel(src) -/obj/structure/spacevine/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD || exposed_temperature < VINE_FREEZING_POINT || !can_spread)//if you're room temperature you're safe - /obj/structure/spacevine/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(!can_spread && (exposed_temperature >= VINE_FREEZING_POINT || (trait_flags & SPACEVINE_COLD_RESISTANT))) - can_spread = TRUE // not returning here just in case its now a plasmafire and the kudzu should be deleted - if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD && !(trait_flags & SPACEVINE_HEAT_RESISTANT)) - qdel(src) - else if (exposed_temperature < VINE_FREEZING_POINT && !(trait_flags & SPACEVINE_COLD_RESISTANT)) - can_spread = FALSE + if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD || exposed_temperature < VINE_FREEZING_POINT || !can_spread) + if(!can_spread && (exposed_temperature >= VINE_FREEZING_POINT || (trait_flags & SPACEVINE_COLD_RESISTANT))) + can_spread = TRUE // not returning here just in case its now a plasmafire and the kudzu should be deleted + if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD && !(trait_flags & SPACEVINE_HEAT_RESISTANT)) + qdel(src) + else if (exposed_temperature < VINE_FREEZING_POINT && !(trait_flags & SPACEVINE_COLD_RESISTANT)) + can_spread = FALSE /obj/structure/spacevine/CanAllowThrough(atom/movable/mover, border_dir) . = ..() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 2f6eb869f3b..e6551aab295 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -39,7 +39,6 @@ COMSIG_ATOM_ENTERED = .proc/on_entered, ) AddElement(/datum/element/connect_loc, loc_connections) - AddElement(/datum/element/atmos_sensitive, mapload) /obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) ..() @@ -73,11 +72,9 @@ if (sterile) . += span_boldannounce("It looks like the proboscis has been removed.") -/obj/item/clothing/mask/facehugger/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > 300) - /obj/item/clothing/mask/facehugger/atmos_expose(datum/gas_mixture/air, exposed_temperature) - Die() + if(exposed_temperature > 300) + Die() /obj/item/clothing/mask/facehugger/equipped(mob/M) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index acfc70af4f6..a9db73302fd 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -47,7 +47,6 @@ prev_access = access_card.access.Copy() create_extinguisher() - AddElement(/datum/element/atmos_sensitive, mapload) /mob/living/simple_animal/bot/firebot/bot_reset() create_extinguisher() @@ -261,14 +260,15 @@ result = scan_target return result - /mob/living/simple_animal/bot/firebot/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) + if(exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) + return KEEP_ME_GOING /mob/living/simple_animal/bot/firebot/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(COOLDOWN_FINISHED(src, foam_cooldown)) - new /obj/effect/particle_effect/foam/firefighting(loc) - COOLDOWN_START(src, foam_cooldown, FOAM_INTERVAL) + if(exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) + if(COOLDOWN_FINISHED(src, foam_cooldown)) + new /obj/effect/particle_effect/foam/firefighting(loc) + COOLDOWN_START(src, foam_cooldown, FOAM_INTERVAL) /mob/living/simple_animal/bot/firebot/proc/spray_water(atom/target, mob/user) if(stationary_mode) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 9ec8c76896b..27e56c5cf21 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -147,7 +147,6 @@ /obj/machinery/power/apc/Initialize(mapload) . = ..() - AddElement(/datum/element/atmos_sensitive, mapload) alarm_manager = new(src) if(!mapload) @@ -550,12 +549,12 @@ breaked_light.on = TRUE breaked_light.break_light_tube() stoplag() - /obj/machinery/power/apc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > 2000) + return (exposed_temperature > 2000) ? KEEP_ME_GOING : FALSE /obj/machinery/power/apc/atmos_expose(datum/gas_mixture/air, exposed_temperature) - take_damage(min(exposed_temperature/100, 10), BURN) + if(exposed_temperature > 2000) + take_damage(min(exposed_temperature/100, 10), BURN) /obj/machinery/power/apc/proc/report() return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_total]) : [cell? cell.percent() : "N/C"] ([charging])" diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 339f676f9f1..30722355d9a 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -84,7 +84,6 @@ cell = new/obj/item/stock_parts/cell/emergency_light(src) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, .proc/on_light_eater) - AddElement(/datum/element/atmos_sensitive, mapload) return INITIALIZE_HINT_LATELOAD /obj/machinery/light/LateInitialize() @@ -600,11 +599,6 @@ var/area/local_area = get_area(src) set_on(local_area.lightswitch && local_area.power_light) -// called when heated - -/obj/machinery/light/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 673 - /obj/machinery/light/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C break_light_tube() diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index ab3145e92da..d9ee9618b83 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -232,7 +232,6 @@ diag_hud_set_mechstat() update_appearance() - AddElement(/datum/element/atmos_sensitive, mapload) become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT) //protects pilots from ashstorms. for(var/key in equip_by_category) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 61411b077cd..9e8b7bc8dd0 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -192,11 +192,13 @@ equipment_disabled = TRUE /obj/vehicle/sealed/mecha/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > max_temperature + if(exposed_temperature > max_temperature) + return KEEP_ME_GOING /obj/vehicle/sealed/mecha/atmos_expose(datum/gas_mixture/air, exposed_temperature) - log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") - take_damage(5, BURN, 0, 1) + if(exposed_temperature > max_temperature) + log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") + take_damage(5, BURN, 0, 1) /obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/mecha_parts)) From 2fe897254b627780df74c62120ea25e9cf9955d1 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 24 Apr 2022 23:40:31 -0400 Subject: [PATCH 053/200] LAVALAND TEST + DEBUG IMPROVEMENT --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- .../atmospherics/atmos_mapping_helpers.dm | 3 +- code/controllers/subsystem/zas.dm | 70 ++++++++++++++++++- code/game/machinery/doors/door.dm | 4 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/turfs/open/_open.dm | 1 + code/game/turfs/open/asteroid.dm | 5 +- .../turfs/open/floor/plating/misc_plating.dm | 2 +- code/game/turfs/open/lava.dm | 2 + code/modules/atmospherics/ZAS/Connection.dm | 2 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 12 ++-- code/modules/atmospherics/ZAS/Fire.dm | 2 + code/modules/atmospherics/ZAS/Turf.dm | 19 ++++- code/modules/atmospherics/ZAS/Zone.dm | 13 ++-- .../awaymissions/mission_code/snowdin.dm | 1 - code/modules/holodeck/turfs.dm | 2 +- code/modules/surgery/organs/lungs.dm | 8 +-- 19 files changed, 125 insertions(+), 29 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 9d6861008c2..1a155629c85 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -204,7 +204,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //OPEN TURF ATMOS /// the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN=MOLES_N2STANDARD) -#define OPENTURF_LOW_PRESSURE list(GAS_OXYGEN = 14, GAS_NITROGEB = 30) +#define OPENTURF_LOW_PRESSURE list(GAS_OXYGEN = 14, GAS_NITROGEN = 30) //#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" /// -193,15°C telecommunications. also used for xenobiology slime killrooms #define TCOMMS_ATMOS list(GAS_NITROGEN = 100) diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm index d84e3877269..07d1d30fa44 100644 --- a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -41,7 +41,8 @@ #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //ATMOS MIX IDS -#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" +//#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" +#define LAVALAND_DEFAULT_ATMOS OPENTURF_LOW_PRESSURE #define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS" //AIRLOCK CONTROLLER TAGS diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 5cfc0f8da3c..3497c09b616 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -82,6 +82,8 @@ SUBSYSTEM_DEF(zas) //A reference to the global var var/datum/xgm_gas_data/gas_data + var/datum/gas_mixture/lavaland_atmos + //Geometry lists var/list/zones = list() var/list/edges = list() @@ -157,13 +159,16 @@ SUBSYSTEM_DEF(zas) var/simulated_turf_count = 0 //for(var/turf/simulated/S) ZASTURF for(var/turf/S) - if(istype(S, /turf/open/space)) + if(!S.simulated) continue simulated_turf_count++ S.update_air_properties() CHECK_TICK + ///LAVALAND SETUP + fuck_lavaland() + to_chat(world, span_boldannounce("ZAS:\n - Total Simulated Turfs: [simulated_turf_count]\n - Total Zones: [zones.len]\n - Total Edges: [edges.len]\n - Total Active Edges: [active_edges.len ? "<span class='danger'>[active_edges.len]</span>" : "None"]\n - Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) to_chat(world, span_boldannounce("ZAS: Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) @@ -383,7 +388,8 @@ SUBSYSTEM_DEF(zas) if(block & AIR_BLOCKED) return var/direct = !(block & ZONE_BLOCKED) - var/space = istype(B, /turf/open/space) + //var/space = istype(B, /turf/open/space) + var/space = !B.simulated if(!space) if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) @@ -494,3 +500,63 @@ SUBSYSTEM_DEF(zas) active_edges -= E if(processing_edges) processing_edges -= E + +/datum/controller/subsystem/zas/proc/fuck_lavaland() + var/list/restricted_gases = list() + ///No funny gasses allowed + for(var/gas in xgm_gas_data.gases) + if(xgm_gas_data.flags[gas] & (XGM_GAS_CONTAMINANT|XGM_GAS_FUEL|XGM_GAS_OXIDIZER)) + restricted_gases |= gas + + var/list/viable_gases = GLOB.all_gases - restricted_gases - GAS_XENON //TODO: add XGM_GAS_DANGEROUS + var/datum/gas_mixture/mix_real = new + var/list/mix_list = list() + var/num_gases = rand(1, 3) + var/list/chosen_gases = list() + var/target_pressure = rand(HAZARD_LOW_PRESSURE + 10, LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1) + var/temp = rand(BODYTEMP_COLD_DAMAGE_LIMIT + 1, 350) + var/pressure_scalar = target_pressure / (LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1) + + ///Choose our gases + for(var/iter in 1 to num_gases) + chosen_gases += pick_n_take(viable_gases) + + mix_real.gas = chosen_gases + for(var/gas in mix_real.gas) + mix_real.gas[gas] = 1 //So update values doesn't cull it + + mix_real.temperature = temp + + ///This is where the fun begins... + var/amount + var/gastype + while(mix_real.return_pressure() < target_pressure) + gastype = pick(chosen_gases) + + amount = rand(5,10) + amount *= rand(50, 200) / 100 + amount *= pressure_scalar + amount = CEILING(amount, 0.1) + + mix_real.gas[gastype] += amount + mix_real.update_values() + + while(mix_real.return_pressure() > target_pressure) + mix_real.gas[gastype] -= mix_real.gas[gastype] * 0.1 + mix_real.update_values() + + mix_real.gas[gastype] = FLOOR(mix_real.gas[gastype], 0.1) + + for(var/gas_id in mix_real.gas) + mix_list[gas_id] = mix_real.gas[gas_id] + + var/list/lavaland_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) //God I hope this is never more than one + for(var/zlev in lavaland_z_levels) + for(var/turf/T in block(locate(1,1,zlev), locate(world.maxx, world.maxy, zlev))) + if(!T.simulated) + T.initial_gas = mix_list + T.temperature = mix_real.temperature + CHECK_TICK + + lavaland_atmos = mix_real + to_chat(world, span_boldannounce("ZAS: Lavaland contains [num_gases] [num_gases > 1? "gases" : "gas"], with a pressure of [mix_real.return_pressure()] kpa.")) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 6ef3fb22419..83739f849c0 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -113,8 +113,8 @@ if(QDELETED(src)) return AIR_ALLOWED if(block_air_zones) - return density ? AIR_BLOCKED : ZONE_BLOCKED - return density ? AIR_BLOCKED : AIR_ALLOWED + return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED + return density ? (AIR_BLOCKED|ZONE_BLOCKED) : AIR_ALLOWED /** * Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 6260ddfd1fd..1e60db469ae 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -663,7 +663,7 @@ if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) - return density ? AIR_BLOCKED : ZONE_BLOCKED + return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED else return ZONE_BLOCKED diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ce10f43b7d2..b64840b4417 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -178,7 +178,7 @@ if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) - return density ? AIR_BLOCKED : ZONE_BLOCKED + return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED else return ZONE_BLOCKED diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index c05e9838c0d..67b8ff3951b 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -61,7 +61,7 @@ /obj/structure/falsewall/c_airblock(turf/other) if(QDELETED(src)) return AIR_ALLOWED - return density ? ZONE_BLOCKED : AIR_BLOCKED + return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED /obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open . = ..() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 5dfdcfe2488..1ed2a0c8971 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -46,6 +46,7 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = TRUE + simulated = FALSE /turf/open/indestructible/Melt() to_be_destroyed = FALSE diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 054f171f03c..3bf86c2ab4b 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -14,6 +14,8 @@ clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY + simulated = FALSE //OHHH HELLLL NAW + /// Base turf type to be created by the tunnel var/turf_type = /turf/open/misc/asteroid /// Probability floor has a different icon state @@ -190,7 +192,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) name = "icy snow" desc = "Looks colder." baseturfs = /turf/open/misc/asteroid/snow/ice - initial_gas = "n2=82;plasma=24;TEMP=120" floor_variance = 0 icon_state = "snow-ice" base_icon_state = "snow-ice" @@ -215,7 +216,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) initial_gas = AIRLESS_ATMOS /turf/open/misc/asteroid/snow/temperatre - initial_gas = "o2=22;n2=82;TEMP=255.37" + temperature = 255.37 //Used in SnowCabin.dm /turf/open/misc/asteroid/snow/snow_cabin diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index c0b6e9cb9d6..9425673e2cc 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -54,7 +54,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/plating/snowed/cavern - initial_gas = "n2=82;plasma=24;TEMP=120" + temperature = 120 /turf/open/floor/plating/snowed/icemoon initial_gas = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 37c2f2b7815..4dbdc4e6c44 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -12,6 +12,8 @@ light_color = LIGHT_COLOR_LAVA bullet_bounce_sound = 'sound/items/welder2.ogg' + simulated = FALSE + footstep = FOOTSTEP_LAVA barefootstep = FOOTSTEP_LAVA clawfootstep = FOOTSTEP_LAVA diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 11506523110..36b3d2d42ca 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -70,7 +70,7 @@ Class Procs: src.A = A src.B = B zoneA = A.zone - if(istype(B, /turf/open/space)) + if(!B.simulated) mark_space() edge = SSzas.get_edge(A.zone,B) edge.add_connection(src) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index da93192fcb5..ef393060332 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -4,9 +4,9 @@ if(!istype(T,/turf/open/space) && T:zone) //ZASTURF T:zone:dbg_data(src) else - to_chat(mob, span_admin("ZASDBG:No zone here.")) + to_chat(mob, span_admin("ZASDBG: No zone here.")) var/datum/gas_mixture/mix = T.return_air() - to_chat(mob,span_admin( "ZASDBG_MAIN:[mix.return_pressure()] kPa [mix.temperature]C")) + to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.return_pressure()] kPa [mix.temperature]C")) for(var/g in mix.gas) to_chat(mob, span_admin("ZASDBG_GAS:[g]: [mix.gas[g]]\n")) else @@ -48,8 +48,12 @@ if(istype(other_turf, /turf/open/space)) return - var/t_block = T.c_airblock(other_turf) - var/o_block = other_turf.c_airblock(T) + //var/t_block = T.c_airblock(other_turf) +// var/o_block = other_turf.c_airblock(T) + var/t_block + ATMOS_CANPASS_TURF(t_block, T, other_turf) + var/o_block + ATMOS_CANPASS_TURF(o_block, other_turf, T) if(o_block & AIR_BLOCKED) if(t_block & AIR_BLOCKED) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index ce0328f890b..dd8886ae905 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -94,6 +94,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //turf/simulated/create_fire(fl) ZASTURF /turf/open/create_fire(fl, create_own_fuel) + if(!simulated) + return if(fire) fire.firelevel = max(fl, fire.firelevel) return 1 diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index fab4fc888fc..6e5c5dfe440 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -125,7 +125,7 @@ //var/turf/simulated/T = get_step(src, dir) ZASTURF var/turf/T = get_step(src, dir) //if (!istype(T)) ZASTURF - if (istype(T, /turf/open/space)) + if (istype(T, /turf/open/space) || !T.simulated) . &= ~dir continue @@ -139,6 +139,8 @@ //turf/simulated/update_air_properties() ZAS /turf/open/update_air_properties() + if(!simulated) + return ..() if(zone && zone.invalid) //this turf's zone is in the process of being rebuilt c_copy_air() //not very efficient :( @@ -320,11 +322,16 @@ ///turf/simulated/assume_air(datum/gas_mixture/giver) ZASTURF /turf/assume_air(datum/gas_mixture/giver) + if(!simulated) + return var/datum/gas_mixture/my_air = return_air() my_air.merge(giver) //turf/simulated/assume_gas(gasid, moles, temp = null) ZASTURF /turf/proc/assume_gas(gasid, moles, temp = null) + if(!simulated) + return + var/datum/gas_mixture/my_air = return_air() if(isnull(temp)) @@ -337,6 +344,14 @@ //turf/simulated/return_air() ZASTURF /turf/return_air() RETURN_TYPE(/datum/gas_mixture) + if(!simulated) + var/datum/gas_mixture/GM = new + + if(initial_gas) + GM.gas = initial_gas.Copy() + GM.temperature = temperature + GM.update_values() + if(zone) if(!zone.invalid) SSzas.mark_zone_update(zone) @@ -370,6 +385,8 @@ //turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) ZASTURF /turf/proc/atmos_spawn_air(gas_id, amount, initial_temperature) + if(!simulated) + return var/datum/gas_mixture/new_gas = new var/datum/gas_mixture/existing_gas = return_air() if(isnull(initial_temperature)) diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 0eeda7ec58e..32eca48ae35 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -106,7 +106,7 @@ Class Procs: c_invalidate() //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) - if(istype(T, /turf/open/space)) + if(!T.simulated) continue into.add(T) T.update_graphic(graphic_remove = air.graphic) @@ -127,7 +127,7 @@ Class Procs: #ifdef ZASDBG //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) - if(!istype(T, /turf/open/space)) + if(!T.simulated) T.dbg(invalid_zone) #endif @@ -136,7 +136,7 @@ Class Procs: c_invalidate() //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) - if(istype(T, /turf/open/space)) + if(!T.simulated) continue T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) @@ -163,7 +163,8 @@ Class Procs: if(air.check_tile_graphic(graphic_add, graphic_remove)) //for(var/turf/simulated/T in contents) for(var/turf/open/T in contents) - T.update_graphic(graphic_add, graphic_remove) + if(T.simulated) + T.update_graphic(graphic_add, graphic_remove) graphic_add.len = 0 graphic_remove.len = 0 @@ -193,6 +194,8 @@ Class Procs: last_air_temperature = air.temperature //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) + if(!T.simulated) + continue for(var/check_atom in T.contents) var/atom/checking = check_atom if(checking.simulated) @@ -219,7 +222,7 @@ Class Procs: to_chat(M, "[E:air:return_pressure()]kPa") to_chat(M, "Zone Edges: [zone_edges]") - to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)") + to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)\n") //for(var/turf/T in unsimulated_contents) // to_chat(M, "[T] at ([T.x],[T.y])") diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 126a92bd4f7..6db9ee158a9 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -165,7 +165,6 @@ name = "liquid plasma" desc = "A flowing stream of chilled liquid plasma. You probably shouldn't get in." icon_state = "liquidplasma" - initial_gas = "n2=82;plasma=24;TEMP=120" baseturfs = /turf/open/lava/plasma light_range = 3 diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index d753921c753..2ba223ac489 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -171,7 +171,7 @@ tiled_dirt = FALSE /turf/open/floor/holofloor/snow/cold - initial_gas = "nob=7500;TEMP=2.7" + temperature = 2.7 /turf/open/floor/holofloor/dark icon_state = "darkfull" diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index cb1f8f01062..caee4820f90 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -120,10 +120,10 @@ handle_gas_override(breather, breath, gas_breathed) //Partial pressures in our breath - var/O2_moles = breath.get_gas(GAS_OXYGEN) - var/N2_moles = breath.get_gas(GAS_NITROGEN) - var/plasma_moles = breath.get_gas(GAS_PLASMA) - var/CO2_moles = breath.get_gas(GAS_CO2) + var/O2_moles = breath.gas[GAS_OXYGEN] + var/N2_moles = breath.gas[GAS_NITROGEN] + var/plasma_moles = breath.gas[GAS_PLASMA] + var/CO2_moles = breath.gas[GAS_CO2] var/O2_pp = breath.get_breath_partial_pressure(O2_moles)//+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES])) var/N2_pp = breath.get_breath_partial_pressure(N2_moles) From adb8c69d2c7726655379046731b9cf783d01b152 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 25 Apr 2022 01:11:35 -0400 Subject: [PATCH 054/200] changes for test --- .../closets/secure/engineering.dm | 4 ++-- code/modules/atmospherics/ZAS/XGM/gases.dm | 4 ++-- .../atmospherics/ZAS/zas_extras/inflatable.dm | 2 +- .../icons/effects/gas_overlays.dmi | Bin 7707 -> 10333 bytes 4 files changed, 5 insertions(+), 5 deletions(-) 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 49c62124bcd..031ce0748b5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -11,7 +11,7 @@ new /obj/item/radio/headset/heads/ce(src) new /obj/item/megaphone/command(src) new /obj/item/areaeditor/blueprints(src) - new /obj/item/holosign_creator/atmos(src) + new /obj/item/storage/briefcase/inflatable(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/door_remote/chief_engineer(src) new /obj/item/pipe_dispenser(src) @@ -78,7 +78,7 @@ new /obj/item/pipe_dispenser(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) - new /obj/item/holosign_creator/atmos(src) + new /obj/item/storage/briefcase/inflatable(src) new /obj/item/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/mask/gas/atmos(src) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 016ac21061a..3088e31548f 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -46,8 +46,8 @@ //and following a N/Z ratio of 1.5, the molar mass of a monatomic gas is: molar_mass = 0.405 // kg/mol - //tile_color = "#ff9940" - tile_overlay = "phoron" + //tile_overlay = "phoron" + tile_overlay = "plasma" overlay_limit = 0.7 flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL breathed_product = /datum/reagent/toxin/plasma diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm index 24dee699f89..1fef439705e 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -313,7 +313,7 @@ /obj/item/storage/briefcase/inflatable name = "inflatable barrier box" - desc = "Contains inflatable walls and doors." + desc = "Contains inflatable walls and doors. THE SPRITE IS A PLACEHOLDER, OKAY?" w_class = WEIGHT_CLASS_NORMAL max_integrity = 150 force = 8 diff --git a/modular_pariah/master_files/icons/effects/gas_overlays.dmi b/modular_pariah/master_files/icons/effects/gas_overlays.dmi index d4fa5ad522ff1c0553a274befb6364ae9b6a5993..1e5684036df411370460edb74813f75a3d8c5ce8 100644 GIT binary patch literal 10333 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 literal 7707 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 V_PJX1`56EJ002ovPDHLkV1h*q7{UMm From 9875e0b3dbe9cab2c5e5cf8efe65f556ed0396c6 Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Mon, 25 Apr 2022 02:43:22 -0400 Subject: [PATCH 055/200] the station is no longer covered in shrek cum --- code/controllers/subsystem/zas.dm | 6 ++-- code/modules/atmospherics/ZAS/Debug.dm | 41 +++++++++++++++++++------- code/modules/atmospherics/ZAS/Turf.dm | 6 ++-- code/modules/atmospherics/ZAS/Zone.dm | 4 +-- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 3497c09b616..3f70e516e87 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -227,7 +227,7 @@ SUBSYSTEM_DEF(zas) T.post_update_air_properties() T.needs_air_update = 0 #ifdef ZASDBG - T.overlays -= mark + T.vis_contents -= zasdbgovl_mark //updated++ #endif @@ -250,7 +250,7 @@ SUBSYSTEM_DEF(zas) T.post_update_air_properties() T.needs_air_update = 0 #ifdef ZASDBG - T.overlays -= mark + T.vis_contents -= zasdbgovl_mark //updated++ #endif @@ -425,7 +425,7 @@ SUBSYSTEM_DEF(zas) return tiles_to_update += T #ifdef ZASDBG - T.overlays += mark + T.vis_contents += zasdbgovl_mark #endif T.needs_air_update = 1 diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index cbb49ecf4ee..a3be8770262 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -1,19 +1,40 @@ -GLOBAL_REAL_VAR(image/assigned) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "assigned") -GLOBAL_REAL_VAR(image/created) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "created") -GLOBAL_REAL_VAR(image/merged) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "merged") -GLOBAL_REAL_VAR(image/invalid_zone) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "invalid") -GLOBAL_REAL_VAR(image/air_blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "block") -GLOBAL_REAL_VAR(image/zone_blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "zoneblock") -GLOBAL_REAL_VAR(image/blocked) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "fullblock") -GLOBAL_REAL_VAR(image/mark) = image('modular_pariah/master_files/icons/testing/Zone.dmi', icon_state = "mark") +GLOBAL_REAL_VAR(obj/effect/zasdbg/assigned/zasdbgovl_assigned) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/created/zasdbgovl_created) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/merged/zasdbgovl_merged) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/invalid_zone/zasdbgovl_invalid_zone) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/air_blocked/zasdbgovl_air_blocked) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/zone_blocked/zasdbgovl_zone_blocked) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/blocked/zasdbgovl_blocked) = new +GLOBAL_REAL_VAR(obj/effect/zasdbg/mark/zasdbgovl_mark) = new /connection_edge/var/dbg_out = 0 +/obj/effect/zasdbg + icon = 'modular_pariah/master_files/icons/testing/Zone.dmi' + invisibility = INVISIBILITY_OBSERVER + +/obj/effect/zasdbg/assigned + icon_state = "assigned" +/obj/effect/zasdbg/created + icon_state = "created" +/obj/effect/zasdbg/merged + icon_state = "merged" +/obj/effect/zasdbg/invalid_zone + icon_state = "invalid" +/obj/effect/zasdbg/air_blocked + icon_state = "block" +/obj/effect/zasdbg/zone_blocked + icon_state = "zoneblock" +/obj/effect/zasdbg/blocked + icon_state = "fullblock" +/obj/effect/zasdbg/mark + icon_state = "mark" + /turf/var/tmp/dbg_img /turf/proc/dbg(image/img, d = 0) if(d > 0) img.dir = d - overlays -= dbg_img - overlays += img + vis_contents -= dbg_img + vis_contents += img dbg_img = img /proc/soft_assert(thing,fail) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 6e5c5dfe440..30b0bdd6978 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -232,7 +232,7 @@ #ifdef ZASDBG if(verbose) log_admin("[d] is zone blocked.") - dbg(zone_blocked, d) + dbg(zasdbgovl_zone_blocked, d) #endif //Postpone this tile rather than exit, since a connection can still be made. @@ -244,7 +244,7 @@ sim.zone.add(src) #ifdef ZASDBG - dbg(assigned) + dbg(zasdbgovl_assigned) if(verbose) log_admin("Added to [zone]") #endif @@ -273,7 +273,7 @@ newzone.add(src) #ifdef ZASDBG - dbg(created) + dbg(zasdbgovl_created) ASSERT(zone) #endif diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 32eca48ae35..c1789597927 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -111,7 +111,7 @@ Class Procs: into.add(T) T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG - T.dbg(merged) + T.dbg(zasdbgovl_merged) #endif //rebuild the old zone's edges so that they will be possessed by the new zone @@ -128,7 +128,7 @@ Class Procs: //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) if(!T.simulated) - T.dbg(invalid_zone) + T.dbg(zasdbgovl_invalid_zone) #endif /zone/proc/rebuild() From dd9746bba51732eb93ec8fff311f6acf749339a1 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 25 Apr 2022 02:44:57 -0400 Subject: [PATCH 056/200] lung runtime fix maybe --- code/modules/surgery/organs/lungs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index caee4820f90..1e181c59afa 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -91,7 +91,7 @@ if(HAS_TRAIT(breather, TRAIT_NOBREATH)) return - if(!breath || (breath.total_moles() == 0)) + if(!breath || (breath.total_moles == 0)) if(breather.reagents.has_reagent(crit_stabilizing_reagent, needs_metabolizing = TRUE)) return if(breather.health >= breather.crit_threshold) From 09e23425cd1a017c2396f55f2b667e07b2e68954 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 28 Apr 2022 17:42:41 -0400 Subject: [PATCH 057/200] Improves airflow behavior significantly --- code/controllers/subsystem/airflow.dm | 23 +++--- code/game/objects/effects/effects.dm | 1 + code/modules/atmospherics/ZAS/Airflow.dm | 89 +++++++++++++++------- code/modules/atmospherics/ZAS/Debug.dm | 1 + code/modules/mob/dead/observer/observer.dm | 1 + 5 files changed, 77 insertions(+), 38 deletions(-) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index b110cca476b..f3d98230e2b 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -4,7 +4,8 @@ TARGET.airflow_speed = 0; \ TARGET.airflow_time = 0; \ TARGET.airflow_skip_speedcheck = FALSE; \ - if (TARGET.airflow_od) { \ + TARGET.airborne_acceleration = 0; \ + if (TARGET.airflow_originally_not_dense) { \ TARGET.set_density(FALSE); \ } @@ -59,7 +60,7 @@ SUBSYSTEM_DEF(airflow) if (!target.airflow_skip_speedcheck) if (target.airflow_speed > 7) if (target.airflow_time++ >= target.airflow_speed - 7) - if (target.airflow_od) + if (target.airflow_originally_not_dense) target.set_density(FALSE) target.airflow_skip_speedcheck = TRUE if (MC_TICK_CHECK) @@ -67,7 +68,7 @@ SUBSYSTEM_DEF(airflow) return continue else - if (target.airflow_od) + if (target.airflow_originally_not_dense) target.set_density(FALSE) target.airflow_process_delay = max(1, 10 - (target.airflow_speed + 3)) target.airflow_skip_speedcheck = TRUE @@ -76,7 +77,7 @@ SUBSYSTEM_DEF(airflow) return continue target.airflow_skip_speedcheck = FALSE - if (target.airflow_od) + if (target.airflow_originally_not_dense) target.set_density(TRUE) if (!target.airflow_dest || target.loc == target.airflow_dest) target.airflow_dest = locate(min(max(target.x + target.airflow_xo, 1), world.maxx), min(max(target.y + target.airflow_yo, 1), world.maxy), target.z) @@ -92,13 +93,13 @@ SUBSYSTEM_DEF(airflow) current.Cut(i) return continue + var/olddir = target.dir - if(isobj(target)) - target.SpinAnimation(3, 1, rand(50), parallel = FALSE) //target.set_dir_on_move = FALSE step_towards(target, target.airflow_dest) //target.set_dir_on_move = TRUE target.dir = olddir + target.airborne_acceleration++ if (ismob(target)) var/mob/M = target @@ -113,7 +114,7 @@ SUBSYSTEM_DEF(airflow) /atom/movable/var/tmp/airflow_xo /atom/movable/var/tmp/airflow_yo -/atom/movable/var/tmp/airflow_od +/atom/movable/var/tmp/airflow_originally_not_dense /atom/movable/var/tmp/airflow_process_delay /atom/movable/var/tmp/airflow_skip_speedcheck @@ -124,10 +125,10 @@ SUBSYSTEM_DEF(airflow) if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) return FALSE - if (airflow_dest == loc) - step_away(src, loc) if (!AirflowCanMove(strength)) return FALSE + if (airflow_dest == loc) + step_away(src, loc) if (ismob(src)) to_chat(src, span_danger("You are pushed away by a rush of air!")) last_airflow = world.time @@ -136,10 +137,10 @@ SUBSYSTEM_DEF(airflow) airflow_dest = null return FALSE airflow_speed = min(max(strength * (9 / airflow_falloff), 1), 9) - airflow_od = FALSE + airflow_originally_not_dense = FALSE if (!density) set_density(TRUE) - airflow_od = TRUE + airflow_originally_not_dense = TRUE return TRUE diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index e77a27905a0..3d084c917a2 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -9,6 +9,7 @@ obj_flags = NONE vis_flags = VIS_INHERIT_PLANE blocks_emissive = EMISSIVE_BLOCK_GENERIC + simulated = FALSE /obj/effect/attackby(obj/item/weapon, mob/user, params) if(SEND_SIGNAL(weapon, COMSIG_ITEM_ATTACK_EFFECT, src, user, params) & COMPONENT_NO_AFTERATTACK) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 9f3e413af37..b4081ad354f 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -1,6 +1,7 @@ /* Contains helper procs for airflow, handled in /connection_group. */ +#define AIRBORNE_DAMAGE(airborne_thing) (min(airborne_thing.airflow_speed, (airborne_thing.airborne_acceleration*2)) * SSzas.settings.airflow_damage) /mob/var/tmp/last_airflow_stun = 0 /mob/proc/airflow_stun() @@ -115,11 +116,19 @@ Contains helper procs for airflow, handled in /connection_group. /atom/movable/Bump(atom/A) if(airflow_speed > 0 && airflow_dest) + var/turf/T = get_turf(A) if(airborne_acceleration > 1) airflow_hit(A) + A.airflow_hit_act(src) else if(istype(src, /mob/living/carbon/human)) to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") - airborne_acceleration = 0 + if(airflow_originally_not_dense && !T.density) + if(ismovable(A) && A:airflow_originally_not_dense) + set_density(FALSE) + A.set_density(FALSE) + step_towards(src, airflow_dest) + set_density(TRUE) + A.set_density(TRUE) else airflow_speed = 0 airflow_time = 0 @@ -131,35 +140,59 @@ Contains helper procs for airflow, handled in /connection_group. airflow_dest = null airborne_acceleration = 0 -/mob/airflow_hit(atom/A) - for(var/mob/M in hearers(src)) - M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) - playsound(src.loc, "smash.ogg", 25, 1, -1) - . = ..() - /mob/living/airflow_hit(atom/A) - var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh - Knockdown(weak_amt) + var/b_loss = AIRBORNE_DAMAGE(src) + apply_damage(b_loss, BRUTE) + if(istype(A, /obj/structure) || iswallturf(A)) + if(airflow_speed > 10) + Paralyze(round(airflow_speed * SSzas.settings.airflow_stun)) + Stun(round(airflow_speed * SSzas.settings.airflow_stun) + 3) + else + Stun(round(airflow_speed * SSzas.settings.airflow_stun/2)) + return ..() -/obj/airflow_hit(atom/A) - for(var/mob/M in hearers(src)) - M.show_message("<span class='danger'>\The [src] slams into \a [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) - playsound(src.loc, "smash.ogg", 25, 1, -1) - . = ..() +/mob/living/carbon/airflow_hit(atom/A) + if (prob(33)) + loc.add_blood_DNA(return_blood_DNA()) + return ..() -/obj/item/airflow_hit(atom/A) - airflow_speed = 0 - airflow_dest = null -/mob/living/carbon/human/airflow_hit(atom/A) - for(var/mob/M in hearers(src)) - M.show_message("<span class='danger'>[src] slams into [A]!</span>",1,"<span class='danger'>You hear a loud slam!</span>",2) +/atom/proc/airflow_hit_act(atom/movable/flying) + src.visible_message( + span_danger("\a flying [flying] slams into \the [src]!"), + span_danger("You're hit by a flying [flying]!"), + span_danger("You hear a loud slam!") + ) + +/mob/living/airflow_hit_act(atom/movable/flying) + . = ..() playsound(src.loc, "punch", 25, 1, -1) + var/weak_amt + if(istype(flying,/obj/item)) + weak_amt = flying:w_class*2 ///Heheheh + else if(!flying.airflow_originally_not_dense) //If the object is dense by default (this var is stupidly named) + weak_amt = 5 //Getting crushed by a flying canister or computer is going to fuck you up + else + weak_amt = rand(1, 3) + + src.Knockdown(weak_amt SECONDS) + +/obj/airflow_hit_act(atom/movable/flying) + . = ..() + playsound(src.loc, "smash.ogg", 25, 1, -1) + + if(!uses_integrity) + return + + take_damage(SSzas.settings.airflow_damage, BRUTE) + +/mob/living/carbon/human/airflow_hit_act(atom/movable/flying) + . = ..() if (prob(33)) loc.add_blood_DNA(return_blood_DNA()) - var/b_loss = min(airflow_speed, (airborne_acceleration*2)) * SSzas.settings.airflow_damage + var/b_loss = AIRBORNE_DAMAGE(flying) apply_damage(b_loss/3, BRUTE, BODY_ZONE_HEAD) @@ -167,16 +200,18 @@ Contains helper procs for airflow, handled in /connection_group. if(airflow_speed > 10) - Paralyze(round(airflow_speed * SSzas.settings.airflow_stun)) - Stun(round(airflow_speed * SSzas.settings.airflow_stun) + 3) + Paralyze(round(flying.airflow_speed * SSzas.settings.airflow_stun)) + Stun(round(flying.airflow_speed * SSzas.settings.airflow_stun) + 3) else - Stun(round(airflow_speed * SSzas.settings.airflow_stun/2)) - return ..() + Stun(round(flying.airflow_speed * SSzas.settings.airflow_stun/2)) /zone/proc/movables() + RETURN_TYPE(/list) . = list() for(var/turf/T in contents) - for(var/atom/movable/A in T) - if(!A.simulated || A.anchored || istype(A, /obj/effect) || isobserver(A)) + for(var/atom/movable/A as anything in T) + if(!A.simulated || A.anchored) continue . += A + +#undef AIRBORNE_DAMAGE diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index a3be8770262..9ec0d209228 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -12,6 +12,7 @@ GLOBAL_REAL_VAR(obj/effect/zasdbg/mark/zasdbgovl_mark) = new /obj/effect/zasdbg icon = 'modular_pariah/master_files/icons/testing/Zone.dmi' invisibility = INVISIBILITY_OBSERVER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/zasdbg/assigned icon_state = "assigned" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5c7ff4b78de..0120b87134e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -22,6 +22,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) light_power = 2 light_on = FALSE shift_to_open_context_menu = FALSE + simulated = FALSE var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 From ae715bd8a07980967737b796767537ffa3bb0b6c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 28 Apr 2022 18:10:07 -0400 Subject: [PATCH 058/200] Dense objects can now step into non-dense objects during Airflow --- code/modules/atmospherics/ZAS/Airflow.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index b4081ad354f..8b403e224b2 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -122,7 +122,7 @@ Contains helper procs for airflow, handled in /connection_group. A.airflow_hit_act(src) else if(istype(src, /mob/living/carbon/human)) to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") - if(airflow_originally_not_dense && !T.density) + if(!T.density) if(ismovable(A) && A:airflow_originally_not_dense) set_density(FALSE) A.set_density(FALSE) @@ -160,7 +160,7 @@ Contains helper procs for airflow, handled in /connection_group. /atom/proc/airflow_hit_act(atom/movable/flying) src.visible_message( - span_danger("\a flying [flying] slams into \the [src]!"), + span_danger("A flying [flying] slams into \the [src]!"), span_danger("You're hit by a flying [flying]!"), span_danger("You hear a loud slam!") ) From 1f85cf3282b5bc5e17a8e52e121d956dc9d0d0ca Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 29 Apr 2022 01:20:43 -0400 Subject: [PATCH 059/200] Micro opt --- code/modules/atmospherics/ZAS/ConnectionGroup.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index c2ddf83d0b7..0c1ccd8ba0d 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -95,7 +95,7 @@ Class Procs: /connection_edge/proc/recheck() /connection_edge/proc/flow(list/movable, differential, repelled) - for(var/i = 1; i <= movable.len; i++) + for(var/i in 1 to length(movable)) var/atom/movable/M = movable[i] //If they're already being tossed, don't do it again. @@ -170,7 +170,14 @@ Class Procs: repelled = A.movables() if(REALTIMEOFDAY > last_woosh + 2 SECONDS) - playsound(pick(connecting_turfs), 'modular_pariah/master_files/sound/effects/space_wind_big.ogg', 100, TRUE, null, pressure_affected = FALSE) + playsound( + pick(connecting_turfs), + abs(differential) > SSzas.settings.airflow_heavy_pressure ? 'modular_pariah/master_files/sound/effects/space_wind_big.ogg' : 'modular_pariah/master_files/sound/effects/space_wind.ogg', + 100, + TRUE, + null, + pressure_affected = FALSE + ) last_woosh = REALTIMEOFDAY flow(attracted, abs(differential), 0) From 98bfa064b7b93e7e011a34a269aba6322397ce58 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 29 Apr 2022 02:00:13 -0400 Subject: [PATCH 060/200] makes all gas mixture procs camelcase (I will regret this later) --- code/__DEFINES/atmospherics/ZAS.dm | 6 +- code/__DEFINES/atmospherics/atmos_helpers.dm | 2 +- code/__HELPERS/_logging.dm | 6 +- code/__HELPERS/atmospherics.dm | 8 +- code/__HELPERS/game.dm | 2 +- code/controllers/subsystem/minor_mapping.dm | 2 +- code/controllers/subsystem/zas.dm | 10 +- code/datums/atmosphere/_atmosphere.dm | 4 +- code/datums/diseases/advance/symptoms/heal.dm | 2 +- code/datums/elements/atmos_requirements.dm | 8 +- code/datums/elements/volatile_gas_storage.dm | 2 +- code/datums/helper_datums/teleport.dm | 8 +- code/datums/outfit.dm | 2 +- code/game/atoms.dm | 2 +- code/game/gamemodes/objective_items.dm | 2 +- code/game/machinery/airlock_control.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/spaceheater.dm | 2 +- .../effects/effect_system/effects_foam.dm | 8 +- .../effects/effect_system/effects_smoke.dm | 6 +- .../effects/effect_system/effects_water.dm | 2 +- .../objects/effects/spawners/bombspawner.dm | 12 +- code/game/objects/items/cigs_lighters.dm | 4 +- code/game/objects/items/devices/powersink.dm | 2 +- .../items/devices/scanners/gas_analyzer.dm | 12 +- .../objects/items/devices/transfer_valve.dm | 6 +- code/game/objects/items/flamethrower.dm | 6 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 6 +- code/game/objects/items/tanks/tank_types.dm | 18 +- code/game/objects/items/tanks/tanks.dm | 20 +- code/game/objects/objs.dm | 4 +- code/game/objects/structures/bonfire.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- .../crates_lockers/closets/bodybag.dm | 4 +- code/game/objects/structures/false_walls.dm | 2 +- .../structures/transit_tubes/station.dm | 2 +- .../transit_tubes/transit_tube_pod.dm | 6 +- .../objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 4 +- code/game/sound.dm | 2 +- code/game/turfs/change_turf.dm | 14 +- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/admin/outfit_editor.dm | 2 +- code/modules/admin/verbs/fix_air.dm | 2 +- .../antagonists/blob/structures/_blob.dm | 2 +- code/modules/assembly/bomb.dm | 6 +- code/modules/atmospherics/Atmospherics.md | 8 +- code/modules/atmospherics/ZAS/Atom.dm | 4 +- .../atmospherics/ZAS/ConnectionGroup.dm | 16 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 8 +- code/modules/atmospherics/ZAS/Fire.dm | 20 +- code/modules/atmospherics/ZAS/Turf.dm | 27 +-- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 183 +++++++++--------- .../ZAS/XGM/xgm_immutable_gas_mixture.dm | 22 +-- code/modules/atmospherics/ZAS/Zone.dm | 8 +- .../atmospherics/ZAS/atmos_primitives.dm | 44 ++--- .../atmospherics/ZAS/zas_extras/inflatable.dm | 2 +- .../atmospherics/environmental/LINDA_fire.dm | 2 +- .../environmental/LINDA_turf_tile.dm | 16 +- .../atmospherics/gasmixtures/gas_mixture.dm | 74 +++---- .../gasmixtures/immutable_mixtures.dm | 6 +- .../atmospherics/gasmixtures/reactions.dm | 88 ++++----- .../atmospherics/machinery/airalarm.dm | 14 +- .../atmospherics/machinery/atmosmachinery.dm | 4 +- .../machinery/bluespace_vendor.dm | 6 +- .../components/binary_devices/circulator.dm | 4 +- .../components/binary_devices/dp_vent_pump.dm | 6 +- .../components/binary_devices/passive_gate.dm | 2 +- .../binary_devices/pressure_valve.dm | 2 +- .../components/binary_devices/pump.dm | 8 +- .../binary_devices/temperature_pump.dm | 10 +- .../components/binary_devices/volume_pump.dm | 18 +- .../components/fusion/hfr_main_processes.dm | 52 ++--- .../machinery/components/fusion/hfr_parts.dm | 6 +- .../machinery/components/fusion/hfr_procs.dm | 28 +-- .../gas_recipe_machines/crystallizer.dm | 20 +- .../atmospherics/machinery/components/tank.dm | 10 +- .../components/trinary_devices/filter.dm | 8 +- .../components/trinary_devices/mixer.dm | 6 +- .../unary_devices/bluespace_sender.dm | 12 +- .../components/unary_devices/cryo.dm | 12 +- .../unary_devices/heat_exchanger.dm | 4 +- .../unary_devices/outlet_injector.dm | 2 +- .../components/unary_devices/thermomachine.dm | 6 +- .../components/unary_devices/vent_pump.dm | 10 +- .../components/unary_devices/vent_scrubber.dm | 6 +- .../atmospherics/machinery/datum_pipeline.dm | 12 +- .../atmospherics/machinery/other/meter.dm | 6 +- .../atmospherics/machinery/other/miner.dm | 8 +- .../machinery/pipes/heat_exchange/he_pipes.dm | 2 +- .../machinery/portable/canister.dm | 36 ++-- .../atmospherics/machinery/portable/pump.dm | 16 +- .../machinery/portable/scrubber.dm | 10 +- code/modules/cargo/bounties/engineering.dm | 4 +- code/modules/cargo/exports/large_objects.dm | 4 +- code/modules/clothing/masks/gas_filter.dm | 18 +- .../clothing/spacesuits/_spacesuits.dm | 2 +- code/modules/events/spacevine.dm | 16 +- code/modules/holodeck/area_copy.dm | 2 +- .../modules/hydroponics/unique_plant_genes.dm | 4 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- code/modules/mob/living/carbon/alien/life.dm | 14 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/species.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 4 +- code/modules/mob/living/carbon/life.dm | 18 +- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/living_say.dm | 2 +- .../living/simple_animal/hostile/regalrat.dm | 4 +- .../mob/living/simple_animal/hostile/tree.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 8 +- .../mob/living/simple_animal/slime/life.dm | 2 +- code/modules/mob/mob.dm | 4 +- code/modules/power/generator.dm | 8 +- code/modules/power/supermatter/supermatter.dm | 10 +- .../power/supermatter/supermatter_process.dm | 20 +- code/modules/power/turbine/turbine.dm | 16 +- code/modules/reagents/chemistry/holder.dm | 8 +- .../chemistry/reagents/food_reagents.dm | 4 +- code/modules/recycling/disposal/bin.dm | 10 +- code/modules/research/experimentor.dm | 8 +- .../research/ordnance/tank_compressor.dm | 20 +- code/modules/research/server.dm | 4 +- code/modules/shuttle/arrivals.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 6 +- code/modules/surgery/organs/external/wings.dm | 4 +- code/modules/surgery/organs/lungs.dm | 66 +++---- code/modules/unit_tests/breath.dm | 4 +- code/modules/unit_tests/gas_transfer.dm | 10 +- code/modules/vehicles/mecha/_mecha.dm | 30 +-- .../vehicles/mecha/mecha_control_console.dm | 4 +- code/modules/vehicles/mecha/mecha_ui.dm | 6 +- .../components/sensors/pressuresensor.dm | 2 +- html/changelogs/archive/2020-03.yml | 2 +- 140 files changed, 742 insertions(+), 740 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 1a155629c85..e6e6962c118 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -59,7 +59,7 @@ GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } \ } \ if (CANPASS_PROC) { \ - ret |= AM.c_airblock(B); \ + ret |= AM.zas_canpass(B); \ } \ if (CANPASS_NEVER) { \ ret = BLOCKED; \ @@ -96,7 +96,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) } \ } \ if (CANPASS_PROC) { \ - ret |= AM.c_airblock(B); \ + ret |= AM.zas_canpass(B); \ } \ if (CANPASS_NEVER) { \ ret = BLOCKED; \ @@ -110,7 +110,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #endif -//#define ATMOS_CANPASS(A, O) ( A.can_atmos_pass == CANPASS_PROC ? A.c_airblock(O) : ( A.can_atmos_pass == CANPASS_DENSITY? !A.density : A.can_atmos_pass)) +//#define ATMOS_CANPASS(A, O) ( A.can_atmos_pass == CANPASS_PROC ? A.zas_canpass(O) : ( A.can_atmos_pass == CANPASS_DENSITY? !A.density : A.can_atmos_pass)) #define ATMOS_CANPASS_NOTTURF(A) (A.can_atmos_pass == CANPASS_DENSITY ? !A.density : A.can_atmos_pass) #define CELL_VOLUME 2500 // Liters in a cell. #define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. diff --git a/code/__DEFINES/atmospherics/atmos_helpers.dm b/code/__DEFINES/atmospherics/atmos_helpers.dm index 6ac20c153a3..838366e9da5 100644 --- a/code/__DEFINES/atmospherics/atmos_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_helpers.dm @@ -28,7 +28,7 @@ T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y; ///Calculate the thermal energy of the selected gas (J) -#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) +#define THERMAL_ENERGY(gas) (gas.temperature * gas.getHeatCapacity()) ///Directly adds a gas to a gas mixture without checking for its presence beforehand, use only if is certain the absence of said gas /* diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index aa1e559eb51..8c9b1bab955 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -178,9 +178,9 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /// Logs the contents of the gasmix to the game log, prefixed by text /proc/log_atmos(text, datum/gas_mixture/mix) var/message = text - message += "TEMP=[mix.return_temperature()],MOL=[mix.total_moles()],VOL=[mix.volume]" - for(var/key in mix.get_gases()) - message += "[key]=[mix.get_gas(key)];" + message += "TEMP=[mix.getTemperature()],MOL=[mix.getMoles()],VOL=[mix.volume]" + for(var/key in mix.getGases()) + message += "[key]=[mix.getGroupGas(key)];" log_game(message) /proc/log_say(text) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index ca0c2fc006a..250dabd386e 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -41,11 +41,11 @@ ) if(!gasmix) return - for(var/gas_path in gasmix.get_gases()) + for(var/gas_path in gasmix.getGases()) .["gases"] += list(list( "[gas_path]", "[gas_path]", - gasmix.get_gas(gas_path), + gasmix.getGroupGas(gas_path), )) //.for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results) .["reactions"] += list(list( @@ -53,10 +53,10 @@ "UNIMPLIMENTED", "UNIMPLIMENTED", )) - .["total_moles"] = gasmix.total_moles() + .["total_moles"] = gasmix.getMoles() .["temperature"] = gasmix.temperature .["volume"] = gasmix.volume - .["pressure"] = gasmix.return_pressure() + .["pressure"] = gasmix.returnPressure() .["reference"] = REF(gasmix) GLOBAL_LIST_EMPTY(reaction_handbook) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4c4d001ce4c..6843e8be159 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -350,7 +350,7 @@ var/datum/gas_mixture/environment = turf_to_check.return_air() if(!istype(environment)) return - var/pressure = environment.return_pressure() + var/pressure = environment.returnPressure() if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE) . = TRUE diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index a45c9921098..022ab58fa61 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(minor_mapping) mouse.forceMove(proposed_turf) else mouse = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) - if(proposed_turf.air.has_gas(GAS_OXYGEN, 5)) + if(proposed_turf.air.hasGas(GAS_OXYGEN, 5)) num_mice -= 1 mouse = null diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 3f70e516e87..1015394c253 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -530,7 +530,7 @@ SUBSYSTEM_DEF(zas) ///This is where the fun begins... var/amount var/gastype - while(mix_real.return_pressure() < target_pressure) + while(mix_real.returnPressure() < target_pressure) gastype = pick(chosen_gases) amount = rand(5,10) @@ -539,11 +539,11 @@ SUBSYSTEM_DEF(zas) amount = CEILING(amount, 0.1) mix_real.gas[gastype] += amount - mix_real.update_values() + mix_real.updateValues() - while(mix_real.return_pressure() > target_pressure) + while(mix_real.returnPressure() > target_pressure) mix_real.gas[gastype] -= mix_real.gas[gastype] * 0.1 - mix_real.update_values() + mix_real.updateValues() mix_real.gas[gastype] = FLOOR(mix_real.gas[gastype], 0.1) @@ -559,4 +559,4 @@ SUBSYSTEM_DEF(zas) CHECK_TICK lavaland_atmos = mix_real - to_chat(world, span_boldannounce("ZAS: Lavaland contains [num_gases] [num_gases > 1? "gases" : "gas"], with a pressure of [mix_real.return_pressure()] kpa.")) + to_chat(world, span_boldannounce("ZAS: Lavaland contains [num_gases] [num_gases > 1? "gases" : "gas"], with a pressure of [mix_real.returnPressure()] kpa.")) diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index 5bc91a7d85b..c087b7b459b 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -37,7 +37,7 @@ // Now let the random choices begin var/datum/gas/gastype var/amount - while(gasmix.return_pressure() < target_pressure) + while(gasmix.returnPressure() < target_pressure) if(!prob(restricted_chance) || !length(spicy_gas)) gastype = pick(normal_gases) amount = normal_gases[gastype] @@ -54,7 +54,7 @@ gaslist[gastype][MOLES] += amount // That last one put us over the limit, remove some of it - while(gasmix.return_pressure() > target_pressure) + while(gasmix.returnPressure() > target_pressure) gaslist[gastype][MOLES] -= gaslist[gastype][MOLES] * 0.1 gaslist[gastype][MOLES] = FLOOR(gaslist[gastype][MOLES], 0.1) gasmix.garbage_collect() diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 1d39d442090..2009b33596d 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -521,7 +521,7 @@ if(M.loc) environment = M.loc.return_air() - if(environment && environment.get_gas(GAS_PLASMA)) + if(environment && environment.getGroupGas(GAS_PLASMA)) . += power * min(0.5, environment.gas[GAS_PLASMA] * HEALING_PER_MOL) if(M.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) . += power * 0.75 //Determines how much the symptom heals if injected or ingested diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 6b3c13899fc..1737b7e4b6c 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -49,10 +49,10 @@ var/datum/gas_mixture/open_turf_gases = open_turf.return_air() - var/plas = open_turf_gases.get_gas(GAS_PLASMA) - var/oxy = open_turf_gases.get_gas(GAS_OXYGEN) - var/n2 = open_turf_gases.get_gas(GAS_NITROGEN) - var/co2 = open_turf_gases.get_gas(GAS_CO2) + var/plas = open_turf_gases.getGroupGas(GAS_PLASMA) + var/oxy = open_turf_gases.getGroupGas(GAS_OXYGEN) + var/n2 = open_turf_gases.getGroupGas(GAS_NITROGEN) + var/co2 = open_turf_gases.getGroupGas(GAS_CO2) . = TRUE if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) diff --git a/code/datums/elements/volatile_gas_storage.dm b/code/datums/elements/volatile_gas_storage.dm index 9ef28b04a37..df61dd0f243 100644 --- a/code/datums/elements/volatile_gas_storage.dm +++ b/code/datums/elements/volatile_gas_storage.dm @@ -28,7 +28,7 @@ UnregisterSignal(source, COMSIG_ATOM_BREAK) /datum/element/volatile_gas_storage/proc/Break(atom/origin, datum/gas_mixture/released_gas) - var/expelled_pressure = min(released_gas?.return_pressure(), max_explosive_pressure) + var/expelled_pressure = min(released_gas?.returnPressure(), max_explosive_pressure) if(expelled_pressure < minimum_explosive_pressure) return diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index fbe0cf17ed5..aa9c1d8b516 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -140,17 +140,17 @@ if(!floor_gases) return - if(!(floor_gases.get_gas(GAS_OXYGEN) >= 16)) + if(!(floor_gases.getGroupGas(GAS_OXYGEN) >= 16)) return - if(floor_gases.get_gas(GAS_PLASMA)) + if(floor_gases.getGroupGas(GAS_PLASMA)) return - if(floor_gases.get_gas(GAS_CO2) >= 10) + if(floor_gases.getGroupGas(GAS_CO2) >= 10) return // Aim for goldilocks temperatures and pressure if((floor_gases.temperature <= 270) || (floor_gases.temperature >= 360)) return - var/pressure = floor_gases.return_pressure() + var/pressure = floor_gases.returnPressure() if((pressure <= 20) || (pressure >= 550)) return diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index a2988edf510..247d4aa57bc 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -391,7 +391,7 @@ .["accessory"] = accessory /// Copy most vars from another outfit to this one -/datum/outfit/proc/copy_from(datum/outfit/target) +/datum/outfit/proc/copyFrom(datum/outfit/target) name = target.name uniform = target.uniform suit = target.suit diff --git a/code/game/atoms.dm b/code/game/atoms.dm index eebd9b8367f..2267052fbc0 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1370,7 +1370,7 @@ SEND_SIGNAL(src, COMSIG_ATOM_EXITED, gone, direction) ///Return atom temperature -/atom/proc/return_temperature() +/atom/proc/getTemperature() return /** diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 771eb72ce5b..843fa096e6b 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -299,7 +299,7 @@ var/target_amount = text2num(name) var/found_amount = 0 var/datum/gas_mixture/mix = T.return_air() - found_amount += mix.get_gas(GAS_PLASMA) + found_amount += mix.getGroupGas(GAS_PLASMA) return found_amount>=target_amount diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index e8aab954059..5e9eff96a2d 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -139,7 +139,7 @@ /obj/machinery/airlock_sensor/process() if(on) var/datum/gas_mixture/air_sample = return_air() - var/pressure = round(air_sample.return_pressure(),0.1) + var/pressure = round(air_sample.returnPressure(),0.1) alert = (pressure < ONE_ATMOSPHERE*0.8) var/datum/signal/signal = new(list( diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 83739f849c0..27fa24f363e 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -109,7 +109,7 @@ update_nearby_tiles() return ..() -/obj/machinery/door/c_airblock(turf/other) +/obj/machinery/door/zas_canpass(turf/other) if(QDELETED(src)) return AIR_ALLOWED if(block_air_zones) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 1e60db469ae..92216006308 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -659,7 +659,7 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/machinery/door/firedoor/border_only/c_airblock(turf/T, vertical = FALSE) +/obj/machinery/door/firedoor/border_only/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b64840b4417..7ddcd91cb5c 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -174,7 +174,7 @@ return TRUE -/obj/machinery/door/window/c_airblock(turf/T, vertical = FALSE) +/obj/machinery/door/window/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 668d6671468..59b80cbf08b 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -113,7 +113,7 @@ if(mode == HEATER_MODE_STANDBY) return - var/heat_capacity = enviroment.heat_capacity() + var/heat_capacity = enviroment.getHeatCapacity() var/required_energy = abs(enviroment.temperature - target_temperature) * heat_capacity required_energy = min(required_energy, heating_power) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 6aa32aba5c2..0574d52fc52 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -44,9 +44,9 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.return_air() - if(G.get_gas(GAS_PLASMA)) - var/plas_amt = min(30, G.get_gas(GAS_PLASMA)) //Absorb some plasma - G.adjust_gas(GAS_PLASMA, -plas_amt) + if(G.getGroupGas(GAS_PLASMA)) + var/plas_amt = min(30, G.getGroupGas(GAS_PLASMA)) //Absorb some plasma + G.adjustGas(GAS_PLASMA, -plas_amt) absorbed_plasma += plas_amt if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) @@ -365,7 +365,7 @@ if(I == GAS_OXYGEN || I == GAS_NITROGEN) continue G_gases[I] = 0 - G.update_values() + G.updateValues() for(var/obj/machinery/atmospherics/components/unary/U in O) if(!U.welded) U.welded = TRUE diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index fffe00908a9..0272ef5309a 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -176,9 +176,9 @@ //T.air_update_turf(FALSE, FALSE) for(var/obj/effect/hotspot/H in T) qdel(H) - if(G.get_gas(GAS_PLASMA)) - G.adjust_gas(GAS_NITROGEN, G.get_gas(GAS_PLASMA)) - G.adjust_gas(GAS_PLASMA, -G.gas[GAS_PLASMA]) + if(G.getGroupGas(GAS_PLASMA)) + G.adjustGas(GAS_NITROGEN, G.getGroupGas(GAS_PLASMA)) + G.adjustGas(GAS_PLASMA, -G.gas[GAS_PLASMA]) if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 7f8f5a6909c..990dd7d62ec 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -18,7 +18,7 @@ if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(env.temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * diff_temp), 0) env.temperature = (diff_temp > 0) ? min(temperature, altered_temp) : max(temperature, altered_temp) - env.update_values() + env.updateValues() if (--src.life < 1) qdel(src) diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 64fc60062e6..28622eac887 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -6,16 +6,16 @@ name = "bomb" icon = 'icons/hud/screen_gen.dmi' icon_state = "x" - /* Gasmixes for tank_one and tank_two of the ttv respectively. + /* Gasmixes for tank_one and tank_two of the ttv respectively. * Populated on /obj/effect/spawner/newbomb/Initialize, depopulated right after by the children procs. */ var/datum/gas_mixture/first_gasmix var/datum/gas_mixture/second_gasmix -/** +/** * The part of code that actually spawns the bomb. Always call the parent's initialize first for subtypes of these. * - * Arguments: + * Arguments: * * assembly - An assembly typepath to add to the ttv. */ /obj/effect/spawner/newbomb/Initialize(mapload, assembly = null) @@ -25,8 +25,8 @@ ttv.tank_two = new /obj/item/tank/internals/oxygen (ttv) first_gasmix = ttv.tank_one.return_air() second_gasmix = ttv.tank_two.return_air() - first_gasmix.remove_ratio(1) - second_gasmix.remove_ratio(1) + first_gasmix.removeRatio(1) + second_gasmix.removeRatio(1) if(ispath(assembly, /obj/item/assembly)) var/obj/item/assembly/newassembly = new assembly (ttv) ttv.attached_device = newassembly @@ -85,7 +85,7 @@ first_gasmix.assert_gas(/datum/gas/hypernoblium) first_gasmix.assert_gas(/datum/gas/tritium) second_gasmix.assert_gas(/datum/gas/oxygen) - + first_gasmix.gases[/datum/gas/hypernoblium][MOLES] = REACTION_OPPRESSION_THRESHOLD - 0.01 first_gasmix.gases[/datum/gas/tritium][MOLES] = 0.5 * calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) second_gasmix.gases[/datum/gas/oxygen][MOLES] = calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE-1) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index b8740740a76..c6e56b0b4e3 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -194,7 +194,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn + if(!air || !air.hasGas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn to_chat(user, span_notice("Your [name] needs a source of oxygen to burn.")) return ..() @@ -315,7 +315,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM user?.IgniteMob() if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn + if(!air || !air.hasGas(GAS_OXYGEN, 1)) //or oxygen on a tile to burn extinguish() return diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 123e215b394..389802bead0 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -139,7 +139,7 @@ var/temp_to_give = internal_heat / FRACTION_TO_RELEASE internal_heat -= temp_to_give var/datum/gas_mixture/environment = our_turf.return_air() - var/delta_temperature = temp_to_give / environment.heat_capacity() + var/delta_temperature = temp_to_give / environment.getHeatCapacity() if(delta_temperature) environment.temperature += delta_temperature //air_update_turf(FALSE, FALSE) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 3f2f88e3f6c..bb781cc76ee 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -150,18 +150,18 @@ message += span_boldnotice("Node [mix_number]") mix_name += " - Node [mix_number]" - var/total_moles = air.total_moles() - var/pressure = air.return_pressure() - var/volume = air.return_volume() //could just do mixture.volume... but safety, I guess? - var/temperature = air.return_temperature() + var/total_moles = air.getMoles() + var/pressure = air.returnPressure() + var/volume = air.getVolume() //could just do mixture.volume... but safety, I guess? + var/temperature = air.getTemperature() if(total_moles > 0) message += span_notice("Moles: [round(total_moles, 0.01)] mol") var/list/cached_gases = air.gas for(var/id in cached_gases) - var/gas_concentration = air.get_gas(id)/total_moles - message += span_notice("[id]: [round(air.get_gas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") + var/gas_concentration = air.getGroupGas(id)/total_moles + message += span_notice("[id]: [round(air.getGroupGas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") message += span_notice("Pressure: [round(pressure, 0.01)] kPa") diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 8009ffa92cd..3cb05feeef8 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -148,8 +148,8 @@ if(change_volume) target_mix.volume += other_mix.volume - - target_mix.merge(other_mix.remove_ratio(1)) + + target_mix.merge(other_mix.removeRatio(1)) return TRUE /obj/item/transfer_valve/proc/split_gases() @@ -160,7 +160,7 @@ var/volume_ratio = mix_one.volume/mix_two.volume var/datum/gas_mixture/temp - temp = mix_two.remove_ratio(volume_ratio) + temp = mix_two.removeRatio(volume_ratio) mix_one.merge(temp) mix_two.volume -= mix_one.volume diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 96724324d20..18bfd33c663 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -218,11 +218,11 @@ //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf var/datum/gas_mixture/ptank_mix = ptank.return_air() - var/datum/gas_mixture/air_transfer = ptank_mix.remove_ratio(release_amount) + var/datum/gas_mixture/air_transfer = ptank_mix.removeRatio(release_amount) //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE - var/obj/effect/decal/cleanable/oil/l_fuel = new(target,air_transfer.get_by_flag(XGM_GAS_FUEL),get_dir(loc,target)) + var/obj/effect/decal/cleanable/oil/l_fuel = new(target,air_transfer.getByFlag(XGM_GAS_FUEL),get_dir(loc,target)) l_fuel.reagent_amount = release_amount - air_transfer.remove_by_flag(XGM_GAS_FUEL, 0) + air_transfer.removeByFlag(XGM_GAS_FUEL, 0) target.assume_air(air_transfer) //Burn it based on transfered gas target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 4cd66ae96e0..2e00422b02f 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -92,7 +92,7 @@ target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punches you!")) return - /*if(!molar_cmp_equals(gasused.total_moles(), gasperfist * fisto_setting)) + /*if(!molar_cmp_equals(gasused.getMoles(), gasperfist * fisto_setting)) to_chat(user, span_warning("\The [src]'s piston-ram lets out a weak hiss, it needs more gas!")) playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE) target.apply_damage((force / 2), BRUTE) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 40e1586635c..82a57bd66bf 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -41,7 +41,7 @@ /obj/item/tank/jetpack/populate_gas() if(gas_type) var/datum/gas_mixture/our_mix = return_air() - our_mix.adjust_gas(gas_type, (6*ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) + our_mix.adjustGas(gas_type, (6*ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) /obj/item/tank/jetpack/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_jetpack)) @@ -123,12 +123,12 @@ return COMSIG_MOVABLE_STOP_SPACEMOVE /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) - if((num < 0.005 || air_contents.total_moles() < num)) + if((num < 0.005 || air_contents.getMoles() < num)) turn_off(user) return var/datum/gas_mixture/removed = remove_air(num) - if(removed.total_moles() < 0.005) + if(removed.getMoles() < 0.005) turn_off(user) return diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 4e3a3eab4ed..ad6bf4baafb 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -22,7 +22,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.adjust_gas(GAS_OXYGEN,(6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_OXYGEN,(6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/oxygen/yellow @@ -52,8 +52,8 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.adjust_gas(GAS_OXYGEN,(3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.adjust_gas(GAS_NITROGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.adjustGas(GAS_OXYGEN,(3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjustGas(GAS_NITROGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /* * Plasma @@ -70,7 +70,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.adjust_gas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/flamethrower)) @@ -86,7 +86,7 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/empty/populate_gas() return @@ -105,10 +105,10 @@ distribute_pressure = TANK_PLASMAMAN_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.adjust_gas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt @@ -123,7 +123,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.adjust_gas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt/empty/populate_gas() return @@ -149,7 +149,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.adjust_gas(GAS_OXYGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.adjustGas(GAS_OXYGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index c69e23ee429..83e63904caf 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -119,7 +119,7 @@ . += span_notice("If you want any more information you'll need to get closer.") return - . += span_notice("The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa.") + . += span_notice("The pressure gauge reads [round(src.air_contents.returnPressure(),0.01)] kPa.") var/celsius_temperature = air_contents.temperature-T0C var/descriptive @@ -150,7 +150,7 @@ var/mob/living/carbon/human/H = user user.visible_message(span_suicide("[user] is putting [src]'s valve to [user.p_their()] lips! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(loc, 'sound/effects/spray.ogg', 10, TRUE, -3) - if(!QDELETED(H) && air_contents && air_contents.return_pressure() >= 1000) + if(!QDELETED(H) && air_contents && air_contents.returnPressure() >= 1000) ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC) H.inflate_gib() return MANUAL_SUICIDE @@ -185,7 +185,7 @@ /obj/item/tank/ui_data(mob/user) . = list( - "tankPressure" = round(air_contents.return_pressure()), + "tankPressure" = round(air_contents.returnPressure()), "releasePressure" = round(distribute_pressure) ) @@ -245,7 +245,7 @@ if(!air_contents) return null - var/tank_pressure = air_contents.return_pressure() + var/tank_pressure = air_contents.returnPressure() var/actual_distribute_pressure = clamp(tank_pressure, 0, distribute_pressure) // Lets do some algebra to understand why this works, yeah? @@ -277,7 +277,7 @@ var/atom/location = loc if(!location) return - var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) + var/datum/gas_mixture/leaked_gas = air_contents.removeRatio(0.25) location.assume_air(leaked_gas) /** @@ -291,8 +291,8 @@ if(!air_contents) return FALSE - var/pressure = air_contents.return_pressure() - var/temperature = air_contents.return_temperature() + var/pressure = air_contents.returnPressure() + var/temperature = air_contents.getTemperature() if(temperature >= TANK_MELT_TEMPERATURE) var/temperature_damage_ratio = (temperature - TANK_MELT_TEMPERATURE) / temperature take_damage(max_integrity * temperature_damage_ratio * delta_time, BURN, FIRE, FALSE, NONE) @@ -325,13 +325,13 @@ return ..() /// Handle fragmentation - var/pressure = air_contents.return_pressure() + var/pressure = air_contents.returnPressure() if(pressure > TANK_FRAGMENT_PRESSURE) if(!istype(loc, /obj/item/transfer_valve)) log_bomber(get_mob_by_key(fingerprintslast), "was last key to touch", src, "which ruptured explosively") //Give the gas a chance to build up more pressure through reacting air_contents.react(src) - pressure = air_contents.return_pressure() + pressure = air_contents.returnPressure() // As of writing this this is calibrated to maxcap at 140L and 160atm. var/power = (air_contents.volume * (pressure - TANK_FRAGMENT_PRESSURE)) / TANK_FRAGMENT_SCALE @@ -341,7 +341,7 @@ /obj/item/tank/proc/merging_information() SIGNAL_HANDLER - if(air_contents.return_pressure() > TANK_FRAGMENT_PRESSURE) + if(air_contents.returnPressure() > TANK_FRAGMENT_PRESSURE) explosion_info += TANK_MERGE_OVERPRESSURE /obj/item/tank/proc/explosion_information() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 5742bd4febb..b1ae29d5e90 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -119,8 +119,8 @@ if(breath_request>0) var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.return_volume() - return remove_air(environment.total_moles() * breath_percentage) + var/breath_percentage = BREATH_VOLUME / environment.getVolume() + return remove_air(environment.getMoles() * breath_percentage) else return null diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 327dcf0b93a..5acf553e299 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -102,7 +102,7 @@ var/turf/open/bonfire_turf = loc var/datum/gas_mixture/local_gas = bonfire_turf.return_air() if(local_gas) - if(local_gas.has_gas(GAS_OXYGEN, 5)) + if(local_gas.hasGas(GAS_OXYGEN, 5)) return TRUE return FALSE diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 8c5695d6185..fcb15c7bc72 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -697,7 +697,7 @@ /obj/structure/closet/AllowDrop() return TRUE -/obj/structure/closet/return_temperature() +/obj/structure/closet/getTemperature() return /obj/structure/closet/proc/locker_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 9ee3e118680..267cacfa139 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -325,8 +325,8 @@ air_contents = new(50) //liters air_contents.temperature = T20C - air_contents.adjust_gas(GAS_OXYGEN, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.adjust_gas(GAS_N2O, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.adjustGas(GAS_OXYGEN, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjustGas(GAS_N2O, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /obj/structure/closet/body_bag/environmental/prisoner/syndicate/Destroy() if(air_contents) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 67b8ff3951b..84a471a4931 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -58,7 +58,7 @@ update_appearance() update_nearby_tiles(TRUE) -/obj/structure/falsewall/c_airblock(turf/other) +/obj/structure/falsewall/zas_canpass(turf/other) if(QDELETED(src)) return AIR_ALLOWED return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 111ab281c51..63774fa5f9f 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -169,7 +169,7 @@ if(QDELETED(pod)) return var/datum/gas_mixture/floor_mixture = loc.return_air() - pod.air_contents.share_ratio(floor_mixture, 1) + pod.air_contents.shareRatio(floor_mixture, 1) /obj/structure/transit_tube/station/init_tube_dirs() switch(dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index d26ff609d11..680e9063de7 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -14,8 +14,8 @@ /obj/structure/transit_tube_pod/Initialize(mapload) . = ..() - air_contents.adjust_gas(GAS_OXYGEN, MOLES_O2STANDARD) - air_contents.adjust_gas(GAS_NITROGEN, MOLES_N2STANDARD) + air_contents.adjustGas(GAS_OXYGEN, MOLES_O2STANDARD) + air_contents.adjustGas(GAS_NITROGEN, MOLES_N2STANDARD) air_contents.temperature = T20C /obj/structure/transit_tube_pod/Destroy() @@ -203,7 +203,7 @@ return -/obj/structure/transit_tube_pod/return_temperature() +/obj/structure/transit_tube_pod/getTemperature() return air_contents.temperature //special pod made by the dispenser, it fizzles away when reaching a station. diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index a71ddb6ade2..81af20511f0 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -70,7 +70,7 @@ if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) return valid_window_location(loc, mover.dir, is_fulltile = FALSE) -/obj/structure/windoor_assembly/c_airblock(turf/T, vertical = FALSE) +/obj/structure/windoor_assembly/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ceb7ac4f437..4b92b702298 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -353,7 +353,7 @@ if(anchored) move_update_air(T)*/ -/obj/structure/window/c_airblock(turf/T, vertical = FALSE) +/obj/structure/window/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) return AIR_ALLOWED if(!anchored || !density) @@ -385,7 +385,7 @@ /obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if (exposed_temperature > melting_point) - take_damage(round(air.return_volume() / 100), BURN, 0, 0) + take_damage(round(air.getVolume() / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location() return null diff --git a/code/game/sound.dm b/code/game/sound.dm index b544b90401b..735ab0c72c3 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -140,7 +140,7 @@ distance_multiplier - Can be used to multiply the distance at which the sound is var/datum/gas_mixture/source_env = turf_source.return_air() if(hearer_env && source_env) - var/pressure = min(hearer_env.return_pressure(), source_env.return_pressure()) + var/pressure = min(hearer_env.returnPressure(), source_env.returnPressure()) if(pressure < ONE_ATMOSPHERE) pressure_factor = max((pressure - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 0) else //space diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 21a57199504..3d8bad6b65c 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) WF.InheritComponent(slip) if (copy_air) - T.return_air().copy_from(return_air()) + T.return_air().copyFrom(return_air()) //wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself /turf/proc/TerraformTurf(path, new_baseturf, flags) @@ -166,12 +166,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/ChangeTurf(path, list/new_baseturfs, flags) //Resist the temptation to make this default to keeping air. if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) var/datum/gas_mixture/stashed_air = new() - stashed_air.copy_from(air) + stashed_air.copyFrom(air) . = ..() //If path == type this will return us, don't bank on making a new type if (!.) // changeturf failed or didn't do anything return var/turf/open/newTurf = . - newTurf.air.copy_from(stashed_air) + newTurf.air.copyFrom(stashed_air) SSzas.mark_for_update(newTurf) else if(ispath(path,/turf/closed) || ispath(path,/turf/cordon)) @@ -334,7 +334,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/heat_cap = 0 for(var/turf/T in turf_list) var/datum/gas_mixture/turf_mix = T.return_air() - var/capacity = turf_mix.heat_capacity() + var/capacity = turf_mix.getHeatCapacity() energy += turf_mix.temperature * capacity heat_cap += capacity @@ -347,7 +347,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( total_gases[id] /= turf_count for(var/turf/T as anything in turf_list) - T.return_air().copy_from(total) + T.return_air().copyFrom(total) SSzas.mark_for_update(T) */ /* @@ -370,7 +370,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/datum/gas_mixture/turf/mix = T.air //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - var/capacity = mix.heat_capacity() + var/capacity = mix.getHeatCapacity() energy += mix.temperature * capacity heat_cap += capacity @@ -385,7 +385,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/t in turf_list) var/turf/open/T = t - T.air.copy_from(total) + T.air.copyFrom(total) T.update_visuals() SSair.add_to_active(T) */ diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 1ed2a0c8971..cffed90e436 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -178,7 +178,7 @@ */ /turf/open/GetHeatCapacity() - . = air.heat_capacity() + . = air.getHeatCapacity() /turf/open/GetTemperature() . = return_air().temperature diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 1e7179cd9b8..a6e8e7a9864 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -101,7 +101,7 @@ GLOBAL_LIST_EMPTY(station_turfs) // if(!blocks_air || !simulated) // air = new - // air.copy_from(src.return_air()) + // air.copyFrom(src.return_air()) // by default, vis_contents is inherited from the turf that was here before vis_contents.Cut() diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index e57d0a9e79a..ebe90196aa5 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -16,7 +16,7 @@ if(ispath(target)) drip = new /datum/outfit - drip.copy_from(new target) + drip.copyFrom(new target) else if(istype(target)) drip = target else diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 01f9f63ede3..e958300cc35 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -25,7 +25,7 @@ for(var/datum/pipeline/PN as anything in SSairmachines.networks) for(var/datum/gas_mixture/G in list(PN.air) & PN.other_airs) G.gas = list() - G.update_values() + G.updateValues() to_chat(usr, "\[2/5\] - All pipenets purged of gas.") diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 90de5b94a7b..afcb295838a 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -98,7 +98,7 @@ /obj/structure/blob/block_superconductivity() return atmosblock -/obj/structure/blob/c_airblock(turf/T, vertical = FALSE) +/obj/structure/blob/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) return AIR_ALLOWED return atmosblock ? AIR_BLOCKED : AIR_ALLOWED diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2c01006f9d0..0bb31d04922 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -151,8 +151,8 @@ START_PROCESSING(SSobj, src) var/datum/gas_mixture/our_mix = return_air() - var/fuel_moles = our_mix.get_gas(GAS_PLASMA) + our_mix.get_gas(GAS_OXYGEN)/6 - var/datum/gas_mixture/bomb_mixture = our_mix.copy_from() + var/fuel_moles = our_mix.getGroupGas(GAS_PLASMA) + our_mix.getGroupGas(GAS_OXYGEN)/6 + var/datum/gas_mixture/bomb_mixture = our_mix.copyFrom() var/strength = 1 var/turf/ground_zero = get_turf(loc) @@ -202,7 +202,7 @@ /obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. var/datum/gas_mixture/our_mix = return_air() - var/datum/gas_mixture/removed = remove_air(our_mix.total_moles()) + var/datum/gas_mixture/removed = remove_air(our_mix.getMoles()) var/turf/T = get_turf(src) if(!T) return diff --git a/code/modules/atmospherics/Atmospherics.md b/code/modules/atmospherics/Atmospherics.md index 6d61a8cf16b..c5963cf03ff 100644 --- a/code/modules/atmospherics/Atmospherics.md +++ b/code/modules/atmospherics/Atmospherics.md @@ -116,7 +116,7 @@ var/datum/gas_mixture/air = new air.assert_gas(/datum/gas/oxygen) air.gases[/datum/gas/oxygen][MOLES] = 100 world << air.gases[/datum/gas/oxygen][GAS_META][META_GAS_NAME] //outputs "Oxygen" -world << air.gases.heat_capacity() //outputs 2000 (100 mol * 20 J/K/mol) +world << air.gases.getHeatCapacity() //outputs 2000 (100 mol * 20 J/K/mol) air.gases[/datum/gas/oxygen][MOLES] -= 110 air.garbage_collect() //oxygen is now removed from the gases list, since it was empty ``` @@ -128,16 +128,16 @@ Of particular note in this snippet are the two procs assert_gas() and garbage_co * *`/datum/gas_mixture/proc/assert_gas()`* - Used before accessing a particular type of gas. * *`/datum/gas_mixture/proc/assert_gases()`* - Shorthand for calling assert_gas() multiple times. * *`/datum/gas_mixture/proc/garbage_collect()`* - Used after removing any number of moles from a mixture. -* *`/datum/gas_mixture/proc/return_pressure()`* - Pressure is what should be displayed to players to quantify gas; measured in kilopascals. +* *`/datum/gas_mixture/proc/returnPressure()`* - Pressure is what should be displayed to players to quantify gas; measured in kilopascals. * *`/datum/gas_mixture/var/temperature`* - Measured in kelvins. Useful constants are T0C and T20C for 0 and 20 degrees Celsius respectively, and TCMB,the temperature of space and the lower bound for temperature in atmos. * *`/datum/gas_mixture/var/volume`* - Measured in liters. While we're on the subject, `/datum/gas_mixture` has two subtypes. -The first is `/datum/gas_mixture/turf`, which exists for literally one purpose. When a turf is empty, we want it to have the same heat capacity as space. This lets us achieve that by overriding `heat_capacity()` +The first is `/datum/gas_mixture/turf`, which exists for literally one purpose. When a turf is empty, we want it to have the same heat capacity as space. This lets us achieve that by overriding `getHeatCapacity()` The second is `/datum/gas_mixture/immutable`, which itself has two subtypes. The type is built to allow for gasmixtures that serve as infinite sources of "something", which can't be changed or mutated. -It's used by `/datum/gas_mixture/immutable/space`, which implements some particular things for `heat_capacity()` and some optimizations for gas operations. +It's used by `/datum/gas_mixture/immutable/space`, which implements some particular things for `getHeatCapacity()` and some optimizations for gas operations. It's also implemented by `/datum/gas_mixture/immutable/planetary`, which is used for planetary turfs, and has some code that makes actually having a gasmix possible. diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 2834b6c0860..da18ffbaf9c 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -29,7 +29,7 @@ // AIR_BLOCKED - Blocked // ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. // BLOCKED - Blocked, zone boundaries will not cross even if opened. -/atom/proc/c_airblock(turf/other) +/atom/proc/zas_canpass(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif @@ -41,7 +41,7 @@ return (AIR_BLOCKED*!ATMOS_CANPASS_NOTTURF(src)) // This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. -/turf/c_airblock(turf/other) +/turf/zas_canpass(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 0c1ccd8ba0d..125c37c4692 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -156,9 +156,9 @@ Class Procs: erase() return - var/equiv = A.air.share_ratio(B.air, coefficient) + var/equiv = A.air.shareRatio(B.air, coefficient) - var/differential = A.air.return_pressure() - B.air.return_pressure() + var/differential = A.air.returnPressure() - B.air.returnPressure() if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) var/list/attracted var/list/repelled @@ -239,15 +239,15 @@ Class Procs: erase() return - var/equiv = A.air.share_space(air) + var/equiv = A.air.shareSpace(air) - var/differential = A.air.return_pressure() - air.return_pressure() + var/differential = A.air.returnPressure() - air.returnPressure() if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) var/list/attracted = A.movables() flow(attracted, abs(differential), differential < 0) if(equiv) - A.air.copy_from(air) + A.air.copyFrom(air) SSzas.mark_edge_sleeping(src) SSzas.mark_zone_update(A) @@ -262,11 +262,11 @@ Class Procs: /proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 - var/maximum_energy_delta = max(0, min(A.temperature * A.heat_capacity() * A.group_multiplier, B.temperature * B.heat_capacity() * B.group_multiplier)) + var/maximum_energy_delta = max(0, min(A.temperature * A.getHeatCapacity() * A.group_multiplier, B.temperature * B.getHeatCapacity() * B.group_multiplier)) if(maximum_energy_delta > abs(energy_delta)) if(energy_delta < 0) maximum_energy_delta *= -1 energy_delta = maximum_energy_delta - A.temperature -= energy_delta / (A.heat_capacity() * A.group_multiplier) - B.temperature += energy_delta / (B.heat_capacity() * B.group_multiplier) + A.temperature -= energy_delta / (A.getHeatCapacity() * A.group_multiplier) + B.temperature += energy_delta / (B.getHeatCapacity() * B.group_multiplier) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index ef393060332..1ee1b6ac39e 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -6,7 +6,7 @@ else to_chat(mob, span_admin("ZASDBG: No zone here.")) var/datum/gas_mixture/mix = T.return_air() - to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.return_pressure()] kPa [mix.temperature]C")) + to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.returnPressure()] kPa [mix.temperature]C")) for(var/g in mix.gas) to_chat(mob, span_admin("ZASDBG_GAS:[g]: [mix.gas[g]]\n")) else @@ -37,7 +37,7 @@ return if(direction == "N/A") - if(!(T.c_airblock(T) & AIR_BLOCKED)) + if(!(T.zas_canpass(T) & AIR_BLOCKED)) to_chat(mob, "The turf can pass air! :D") else to_chat(mob, "No air passage :x") @@ -48,8 +48,8 @@ if(istype(other_turf, /turf/open/space)) return - //var/t_block = T.c_airblock(other_turf) -// var/o_block = other_turf.c_airblock(T) + //var/t_block = T.zas_canpass(other_turf) +// var/o_block = other_turf.zas_canpass(T) var/t_block ATMOS_CANPASS_TURF(t_block, T, other_turf) var/o_block diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index dd8886ae905..53cacb34388 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -41,7 +41,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return igniting /zone/proc/process_fire() - var/datum/gas_mixture/burn_gas = air.remove_ratio(SSzas.settings.fire_consumption_rate, fire_tiles.len) + var/datum/gas_mixture/burn_gas = air.removeRatio(SSzas.settings.fire_consumption_rate, fire_tiles.len) var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) @@ -166,7 +166,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin set_light_range(3) for(var/mob/living/L in loc) - L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs! + L.FireBurn(firelevel, air_contents.temperature, air_contents.returnPressure()) //Burn the mobs! loc.fire_act(air_contents, air_contents.temperature, air_contents.volume) for(var/atom/A in loc) @@ -282,7 +282,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //get the current thermal energy of the gas mix //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity - var/starting_energy = temperature * heat_capacity() + var/starting_energy = temperature * getHeatCapacity() //determine how far the reaction can progress var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit @@ -324,22 +324,22 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/used_gas_fuel = min(max(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress)), gas_fuel) //remove in proportion to the relative reaction progress var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel) - //remove_by_flag() and adjust_gas() handle the group_multiplier for us. - remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) - var/datum/gas_mixture/burned_fuel = remove_by_flag(XGM_GAS_FUEL, used_gas_fuel) + //removeByFlag() and adjustGas() handle the group_multiplier for us. + removeByFlag(XGM_GAS_OXIDIZER, used_oxidizers) + var/datum/gas_mixture/burned_fuel = removeByFlag(XGM_GAS_FUEL, used_gas_fuel) for(var/g in burned_fuel.gas) - adjust_gas(xgm_gas_data.burn_product[g], burned_fuel.gas[g]) + adjustGas(xgm_gas_data.burn_product[g], burned_fuel.gas[g]) if(zone) zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) //calculate the energy produced by the reaction and then set the new temperature of the mix - temperature = (starting_energy + SSzas.settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity() - update_values() + temperature = (starting_energy + SSzas.settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / getHeatCapacity() + updateValues() #ifdef FIREDBG log_admin("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") - log_admin("new temperature = [temperature]; new pressure = [return_pressure()]") + log_admin("new temperature = [temperature]; new pressure = [returnPressure()]") #endif if (temperature<220) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 30b0bdd6978..cca229a94c7 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -35,13 +35,13 @@ if(!unsim) continue - block = unsim.c_airblock(src) + block = unsim.zas_canpass(src) if(block & AIR_BLOCKED) //unsim.dbg(air_blocked, turn(180,d)) continue - var/r_block = c_airblock(unsim) + var/r_block = zas_canpass(unsim) if(r_block & AIR_BLOCKED) continue @@ -71,13 +71,13 @@ if(!unsim) continue - block = unsim.c_airblock(src) + block = unsim.zas_canpass(src) if(block & AIR_BLOCKED) //unsim.dbg(air_blocked, turn(180,d)) continue - var/r_block = c_airblock(unsim) + var/r_block = zas_canpass(unsim) if(r_block & AIR_BLOCKED) continue @@ -179,7 +179,7 @@ if(!unsim) //edge of map continue - //var/block = unsim.c_airblock(src) + //var/block = unsim.zas_canpass(src) var/block ATMOS_CANPASS_TURF(block, src, unsim) if(block & AIR_BLOCKED) @@ -191,7 +191,7 @@ continue - //var/r_block = c_airblock(unsim) + //var/r_block = zas_canpass(unsim) var/r_block ATMOS_CANPASS_TURF(r_block, unsim, src) if(r_block & AIR_BLOCKED) @@ -328,6 +328,7 @@ my_air.merge(giver) //turf/simulated/assume_gas(gasid, moles, temp = null) ZASTURF +///Basically adjustGasWithTemp() but a turf proc. /turf/proc/assume_gas(gasid, moles, temp = null) if(!simulated) return @@ -335,9 +336,9 @@ var/datum/gas_mixture/my_air = return_air() if(isnull(temp)) - my_air.adjust_gas(gasid, moles) + my_air.adjustGas(gasid, moles) else - my_air.adjust_gas_temp(gasid, moles, temp) + my_air.adjustGasWithTemp(gasid, moles, temp) return 1 @@ -350,7 +351,7 @@ if(initial_gas) GM.gas = initial_gas.Copy() GM.temperature = temperature - GM.update_values() + GM.updateValues() if(zone) if(!zone.invalid) @@ -371,12 +372,12 @@ air.temperature = temperature if(initial_gas) air.gas = initial_gas.Copy() - air.update_values() + air.updateValues() //turf/simulated/proc/c_copy_air() ZASTURF /turf/proc/c_copy_air() if(!air) air = new/datum/gas_mixture - air.copy_from(zone.air) + air.copyFrom(zone.air) air.group_multiplier = 1 /*/turf/open/space/c_copy_air() @@ -390,9 +391,9 @@ var/datum/gas_mixture/new_gas = new var/datum/gas_mixture/existing_gas = return_air() if(isnull(initial_temperature)) - new_gas.adjust_gas(gas_id, amount) + new_gas.adjustGas(gas_id, amount) else - new_gas.adjust_gas_temp(gas_id, amount, initial_temperature) + new_gas.adjustGasWithTemp(gas_id, amount, initial_temperature) existing_gas.merge(new_gas) /turf/open/space/atmos_spawn_air() diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 66dca038ee0..39641ff513b 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -1,18 +1,18 @@ /datum/gas_mixture //Associative list of gas moles. - //Gases with 0 moles are not tracked and are pruned by update_values() + //Gases with 0 moles are not tracked and are pruned by updateValues() var/list/gas = list() //Temperature in Kelvin of this gas mix. var/temperature = 0 - //Sum of all the gas moles in this mix. Updated by update_values() + //Sum of all the gas moles in this mix. Updated by updateValues() var/total_moles = 0 //Volume of this mix. var/volume = CELL_VOLUME //Size of the group this gas_mixture is representing. 1 for singletons. var/group_multiplier = 1 - //List of active tile overlays for this gas_mixture. Updated by check_tile_graphic() + //List of active tile overlays for this gas_mixture. Updated by checkTileGraphic() var/list/graphic = list() //Cache of gas overlay objects var/list/tile_overlay_cache @@ -22,16 +22,16 @@ temperature = _temperature group_multiplier = _group_multiplier -/datum/gas_mixture/proc/get_gas(gasid) +/datum/gas_mixture/proc/getGroupGas(gasid) if(!gas.len) return 0 //if the list is empty BYOND treats it as a non-associative list, which runtimes return gas[gasid] * group_multiplier -/datum/gas_mixture/proc/get_total_moles() +/datum/gas_mixture/proc/getGroupMoles() return total_moles * group_multiplier -//Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. -/datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) +//Takes a gas string and the amount of moles to adjust by. Calls updateValues() if update isn't 0. +/datum/gas_mixture/proc/adjustGas(gasid, moles, update = 1) if(moles == 0) return @@ -41,16 +41,16 @@ gas[gasid] += moles if(update) - update_values() + updateValues() -//Same as adjust_gas(), but takes a temperature which is mixed in with the gas. -/datum/gas_mixture/proc/adjust_gas_temp(gasid, moles, temp, update = 1) +//Same as adjustGas(), but takes a temperature which is mixed in with the gas. +/datum/gas_mixture/proc/adjustGasWithTemp(gasid, moles, temp, update = 1) if(moles == 0) return if(moles > 0 && abs(temperature - temp) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() + var/self_heat_capacity = getHeatCapacity() var/giver_heat_capacity = xgm_gas_data.specific_heat[gasid] * moles var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity != 0) @@ -62,27 +62,27 @@ gas[gasid] += moles if(update) - update_values() + updateValues() -//Variadic version of adjust_gas(). Takes any number of gas and mole pairs and applies them. -/datum/gas_mixture/proc/adjust_multi() +//Variadic version of adjustGas(). Takes any number of gas and mole pairs and applies them. +/datum/gas_mixture/proc/adjustMultipleGases() ASSERT(!(args.len % 2)) - for(var/i = 1; i < args.len; i += 2) - adjust_gas(args[i], args[i+1], update = 0) + for(var/i in 1 to args.len-1 step 2) + adjustGas(args[i], args[i+1], update = 0) - update_values() + updateValues() -//Variadic version of adjust_gas_temp(). Takes any number of gas, mole and temperature associations and applies them. -/datum/gas_mixture/proc/adjust_multi_temp() +//Variadic version of adjustGasWithTemp(). Takes any number of gas, mole and temperature associations and applies them. +/datum/gas_mixture/proc/adjustMultipleGasesWithTemp() ASSERT(!(args.len % 3)) - for(var/i = 1; i < args.len; i += 3) - adjust_gas_temp(args[i], args[i + 1], args[i + 2], update = 0) + for(var/i in 1 to args.len-1 step 3) + adjustGasWithTemp(args[i], args[i + 1], args[i + 2], update = 0) - update_values() + updateValues() //Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly. @@ -92,8 +92,8 @@ return if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = giver.heat_capacity() + var/self_heat_capacity = getHeatCapacity() + var/giver_heat_capacity = giver.getHeatCapacity() var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity != 0) temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity @@ -105,12 +105,12 @@ for(var/g in giver.gas) gas[g] += giver.gas[g] - update_values() + updateValues() // Used to equalize the mixture between two zones before sleeping an edge. /datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) - var/our_heatcap = heat_capacity() - var/share_heatcap = sharer.heat_capacity() + var/our_heatcap = getHeatCapacity() + var/share_heatcap = sharer.getHeatCapacity() // Special exception: there isn't enough air around to be worth processing this edge next tick, zap both to zero. if(total_moles + sharer.total_moles <= MINIMUM_AIR_TO_SUSPEND) @@ -127,14 +127,14 @@ temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) sharer.temperature = temperature - update_values() - sharer.update_values() + updateValues() + sharer.updateValues() return 1 //Returns the heat capacity of the gas mix based on the specific heat of the gases. -/datum/gas_mixture/proc/heat_capacity() +/datum/gas_mixture/proc/getHeatCapacity() . = 0 for(var/g in gas) . += xgm_gas_data.specific_heat[g] * gas[g] @@ -142,12 +142,12 @@ //Adds or removes thermal energy. Returns the actual thermal energy change, as in the case of removing energy we can't go below TCMB. -/datum/gas_mixture/proc/add_thermal_energy(thermal_energy) +/datum/gas_mixture/proc/addThermalEnergy(thermal_energy) if (total_moles == 0) return 0 - var/heat_capacity = heat_capacity() + var/heat_capacity = getHeatCapacity() if (thermal_energy < 0) if (temperature < TCMB) return 0 @@ -157,8 +157,8 @@ return thermal_energy //Returns the thermal energy change required to get to a new temperature -/datum/gas_mixture/proc/get_thermal_energy_change(new_temperature) - return heat_capacity()*(max(new_temperature, 0) - temperature) +/datum/gas_mixture/proc/getThermalEnergyChange(new_temperature) + return getHeatCapacity()*(max(new_temperature, 0) - temperature) //Technically vacuum doesn't have a specific entropy. Just use a really big number (infinity would be ideal) here so that it's easy to add gas to vacuum and hard to take gas out. @@ -166,13 +166,13 @@ //Returns the ideal gas specific entropy of the whole mix. This is the entropy per mole of /mixed/ gas. -/datum/gas_mixture/proc/specific_entropy() +/datum/gas_mixture/proc/specificGroupEntropy() if (!gas.len || total_moles == 0) return SPECIFIC_ENTROPY_VACUUM . = 0 for(var/g in gas) - . += gas[g] * specific_entropy_gas(g) + . += gas[g] * specificEntropyGas(g) . /= total_moles @@ -187,7 +187,7 @@ So returning a constant/(partial pressure) would probably do what most players expect. Although the version I have implemented below is a bit more nuanced than simply 1/P in that it scales in a way which is bit more realistic (natural log), and returns a fairly accurate entropy around room temperatures and pressures. */ -/datum/gas_mixture/proc/specific_entropy_gas(gasid) +/datum/gas_mixture/proc/specificEntropyGas(gasid) if (!(gasid in gas) || gas[gasid] == 0) return SPECIFIC_ENTROPY_VACUUM //that gas isn't here @@ -203,7 +203,7 @@ //Updates the total_moles count and trims any empty gases. -/datum/gas_mixture/proc/update_values() +/datum/gas_mixture/proc/updateValues() total_moles = 0 for(var/g in gas) if(gas[g] <= 0) @@ -212,8 +212,8 @@ total_moles += gas[g] -//Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since update_values() has been called. -/datum/gas_mixture/proc/return_pressure() +//Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since updateValues() has been called. +/datum/gas_mixture/proc/returnPressure() if(volume) return total_moles * R_IDEAL_GAS_EQUATION * temperature / volume return 0 @@ -234,14 +234,14 @@ gas[g] -= removed.gas[g] / group_multiplier removed.temperature = temperature - update_values() - removed.update_values() + updateValues() + removed.updateValues() return removed //Removes a ratio of gas from the mixture and returns a gas_mixture containing the removed air. -/datum/gas_mixture/proc/remove_ratio(ratio, out_group_multiplier = 1) +/datum/gas_mixture/proc/removeRatio(ratio, out_group_multiplier = 1) if(ratio <= 0) return null out_group_multiplier = clamp(out_group_multiplier, 1, group_multiplier) @@ -257,19 +257,19 @@ removed.temperature = temperature removed.volume = volume * group_multiplier / out_group_multiplier - update_values() - removed.update_values() + updateValues() + removed.updateValues() return removed //Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume -/datum/gas_mixture/proc/remove_volume(removed_volume) - var/datum/gas_mixture/removed = remove_ratio(removed_volume/(volume*group_multiplier), 1) +/datum/gas_mixture/proc/removeVolume(removed_volume) + var/datum/gas_mixture/removed = removeRatio(removed_volume/(volume*group_multiplier), 1) removed.volume = removed_volume return removed //Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. -/datum/gas_mixture/proc/remove_by_flag(flag, amount) +/datum/gas_mixture/proc/removeByFlag(flag, amount) var/datum/gas_mixture/removed = new if(!flag || amount <= 0) @@ -286,24 +286,24 @@ gas[g] -= removed.gas[g] / group_multiplier removed.temperature = temperature - update_values() - removed.update_values() + updateValues() + removed.updateValues() return removed //Returns the amount of gas that has the given flag, in moles -/datum/gas_mixture/proc/get_by_flag(flag) +/datum/gas_mixture/proc/getByFlag(flag) . = 0 for(var/g in gas) if(xgm_gas_data.flags[g] & flag) . += gas[g] //Copies gas and temperature from another gas_mixture. -/datum/gas_mixture/proc/copy_from(const/datum/gas_mixture/sample) +/datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample) gas = sample.gas.Copy() temperature = sample.temperature - update_values() + updateValues() return 1 @@ -326,7 +326,7 @@ return 0 marked[g] = 1 - if(abs(return_pressure() - sample.return_pressure()) > MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND) + if(abs(returnPressure() - sample.returnPressure()) > MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND) return 0 for(var/g in sample.gas) @@ -346,14 +346,14 @@ //Rechecks the gas_mixture and adjusts the graphic list if needed. //Two lists can be passed by reference if you need know specifically which graphics were added and removed. -/datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) +/datum/gas_mixture/proc/checkTileGraphic(list/graphic_add = null, list/graphic_remove = null) for(var/obj/effect/gas_overlay/O in graphic) if(gas[O.gas_id] <= xgm_gas_data.overlay_limit[O.gas_id]) LAZYADD(graphic_remove, O) for(var/g in xgm_gas_data.overlay_limit) //Overlay isn't applied for this gas, check if it's valid and needs to be added. if(gas[g] > xgm_gas_data.overlay_limit[g]) - var/tile_overlay = get_tile_overlay(g) + var/tile_overlay = getTileOverlay(g) if(!(tile_overlay in graphic)) LAZYADD(graphic_add, tile_overlay) . = 0 @@ -365,14 +365,14 @@ graphic -= graphic_remove . = 1 if(graphic.len) - var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) + var/pressure_mod = clamp(returnPressure() / ONE_ATMOSPHERE, 0, 2) for(var/obj/effect/gas_overlay/O in graphic) var/concentration_mod = clamp(gas[O.gas_id] / total_moles, 0.1, 1) var/new_alpha = min(240, round(pressure_mod * concentration_mod * 180, 5)) if(new_alpha != O.alpha) O.update_alpha_animation(new_alpha) -/datum/gas_mixture/proc/get_tile_overlay(gas_id) +/datum/gas_mixture/proc/getTileOverlay(gas_id) if(!LAZYACCESS(tile_overlay_cache, gas_id)) LAZYSET(tile_overlay_cache, gas_id, new/obj/effect/gas_overlay(null, gas_id)) return tile_overlay_cache[gas_id] @@ -382,7 +382,7 @@ for(var/g in right_side.gas) gas[g] += right_side.gas[g] - update_values() + updateValues() return 1 @@ -391,7 +391,7 @@ for(var/g in right_side.gas) gas[g] -= right_side.gas[g] - update_values() + updateValues() return 1 @@ -400,7 +400,7 @@ for(var/g in gas) gas[g] *= factor - update_values() + updateValues() return 1 @@ -409,12 +409,12 @@ for(var/g in gas) gas[g] /= factor - update_values() + updateValues() return 1 //Shares gas with another gas_mixture based on the amount of connecting tiles and a fixed lookup table. -/datum/gas_mixture/proc/share_ratio(datum/gas_mixture/other, connecting_tiles, share_size = null, one_way = 0) +/datum/gas_mixture/proc/shareRatio(datum/gas_mixture/other, connecting_tiles, share_size = null, one_way = 0) var/static/list/sharing_lookup_table = list(0.30, 0.40, 0.48, 0.54, 0.60, 0.66) //Shares a specific ratio of gas between mixtures using simple weighted averages. var/ratio = sharing_lookup_table[6] @@ -422,8 +422,8 @@ var/size = max(1, group_multiplier) if(isnull(share_size)) share_size = max(1, other.group_multiplier) - var/full_heat_capacity = heat_capacity() - var/s_full_heat_capacity = other.heat_capacity() + var/full_heat_capacity = getHeatCapacity() + var/s_full_heat_capacity = other.getHeatCapacity() var/list/avg_gas = list() @@ -454,54 +454,55 @@ if(!one_way) other.temperature = max(0, (other.temperature - temp_avg) * (1-ratio) + temp_avg) - update_values() - other.update_values() + updateValues() + other.updateValues() return compare(other) //A wrapper around share_ratio for spacing gas at the same rate as if it were going into a large airless room. -/datum/gas_mixture/proc/share_space(datum/gas_mixture/unsim_air) - return share_ratio(unsim_air, unsim_air.group_multiplier, max(1, max(group_multiplier + 3, 1) + unsim_air.group_multiplier), one_way = 1) +/datum/gas_mixture/proc/shareSpace(datum/gas_mixture/unsim_air) + return shareRatio(unsim_air, unsim_air.group_multiplier, max(1, max(group_multiplier + 3, 1) + unsim_air.group_multiplier), one_way = 1) -/datum/gas_mixture/proc/get_mass() +/datum/gas_mixture/proc/getMass() for(var/g in gas) . += gas[g] * xgm_gas_data.molar_mass[g] * group_multiplier -/datum/gas_mixture/proc/specific_mass() - var/M = get_total_moles() +/datum/gas_mixture/proc/specificGroupMass() + var/M = getGroupMoles() if(M) - return get_mass()/M + return getMass()/M ////LINDA COMPATABILITY PROCS//// -/datum/gas_mixture/proc/return_volume() +/datum/gas_mixture/proc/getVolume() return max(0, volume) -/datum/gas_mixture/proc/return_temperature() +/datum/gas_mixture/proc/getTemperature() return temperature -/datum/gas_mixture/proc/total_moles() - update_values() +/datum/gas_mixture/proc/getMoles() + updateValues() return total_moles -/datum/gas_mixture/proc/has_gas(gas_id, required_amount) - var/amt = get_gas(gas_id) +/datum/gas_mixture/proc/hasGas(gas_id, required_amount) + var/amt = getGroupGas(gas_id) return (amt >= required_amount) -/datum/gas_mixture/proc/get_gases() +///Returns the gas list with an update. +/datum/gas_mixture/proc/getGases() RETURN_TYPE(/list) - update_values() + updateValues() return gas -/datum/gas_mixture/proc/return_visuals() - update_values() - check_tile_graphic() +/datum/gas_mixture/proc/returnVisuals() + updateValues() + checkTileGraphic() return graphic /datum/gas_mixture/proc/copy() RETURN_TYPE(/datum/gas_mixture) var/datum/gas_mixture/new_gas = new - update_values() + updateValues() new_gas.gas = src.gas new_gas.temperature = src.temperature new_gas.total_moles = src.total_moles @@ -509,10 +510,10 @@ /turf/open/proc/copy_air_with_tile(turf/open/target_turf) if(istype(target_turf)) - return_air().copy_from(target_turf.return_air()) + return_air().copyFrom(target_turf.return_air()) /datum/gas_mixture/proc/leak_to_enviroment(datum/gas_mixture/environment) - pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.return_pressure() - environment.return_pressure())) + pump_gas_passive(src, environment, calculate_transfer_moles(src, environment, src.returnPressure() - environment.returnPressure())) /** * Takes the amount of the gas you want to PP as an argument @@ -520,15 +521,15 @@ * eg: * Plas_PP = get_partial_pressure(gas_mixture.plasma) * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp - * get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + * getBreathPartialPressure(gas_pp) --> gas_pp/getMoles()*breath_pp = pp + * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*getMoles() * * 10/20*5 = 2.5 * 10 = 2.5/5*20 */ -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) +/datum/gas_mixture/proc/getBreathPartialPressure(gas_pressure) return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME ///inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) +/datum/gas_mixture/proc/getTrueBreathPressure(partial_pressure) return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm index f1fb6daff8b..25238f32b4b 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm @@ -2,11 +2,11 @@ temperature = TCMB var/initial_temperature = TCMB -/datum/gas_mixture/immutable/update_values() +/datum/gas_mixture/immutable/updateValues() temperature = initial_temperature return ..() -/datum/gas_mixture/immutable/adjust_gas(gasid, moles, update = 1) +/datum/gas_mixture/immutable/adjustGas(gasid, moles, update = 1) return /datum/gas_mixture/immutable/remove() @@ -24,34 +24,34 @@ /datum/gas_mixture/immutable/multiply() return TRUE -/datum/gas_mixture/immutable/adjust_gas_temp(gasid, moles, temp, update = 1) +/datum/gas_mixture/immutable/adjustGasWithTemp(gasid, moles, temp, update = 1) return -/datum/gas_mixture/immutable/adjust_multi() +/datum/gas_mixture/immutable/adjustMultipleGases() return -/datum/gas_mixture/immutable/adjust_multi_temp() +/datum/gas_mixture/immutable/adjustMultipleGasesWithTemp() return /datum/gas_mixture/immutable/merge() return -/datum/gas_mixture/immutable/copy_from() +/datum/gas_mixture/immutable/copyFrom() return -/datum/gas_mixture/immutable/heat_capacity() +/datum/gas_mixture/immutable/getHeatCapacity() return HEAT_CAPACITY_VACUUM -/datum/gas_mixture/immutable/remove_ratio() +/datum/gas_mixture/immutable/removeRatio() return new type -/datum/gas_mixture/immutable/remove_volume() +/datum/gas_mixture/immutable/removeVolume() return new type -/datum/gas_mixture/immutable/remove_by_flag() +/datum/gas_mixture/immutable/removeByFlag() return new type -/datum/gas_mixture/immutable/share_ratio(datum/gas_mixture/other, connecting_tiles, share_size, one_way) +/datum/gas_mixture/immutable/shareRatio(datum/gas_mixture/other, connecting_tiles, share_size, one_way) . = ..() temperature = initial_temperature diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index c1789597927..6b3a544fdea 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -160,7 +160,7 @@ Class Procs: T.create_fire(SSzas.settings.fire_firelevel_multiplier) // Update gas overlays. - if(air.check_tile_graphic(graphic_add, graphic_remove)) + if(air.checkTileGraphic(graphic_add, graphic_remove)) //for(var/turf/simulated/T in contents) for(var/turf/open/T in contents) if(T.simulated) @@ -185,7 +185,7 @@ Class Procs: var/condense_amt = min(air.gas[g], rand(3,5)) if(condense_amt < 1) break - air.adjust_gas(g, -condense_amt) + air.adjustGas(g, -condense_amt) flooding.add_fluid(condense_amt, product) */ @@ -206,7 +206,7 @@ Class Procs: to_chat(M, name) for(var/g in air.gas) to_chat(M, "[xgm_gas_data.name[g]]: [air.gas[g]]") - to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") + to_chat(M, "P: [air.returnPressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[GAS_NITROGEN] ? air.gas[GAS_OXYGEN]/air.gas[GAS_NITROGEN] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") to_chat(M, "Edges: [edges.len]") @@ -219,7 +219,7 @@ Class Procs: else space_edges++ space_coefficient += E.coefficient - to_chat(M, "[E:air:return_pressure()]kPa") + to_chat(M, "[E:air:returnPressure()]kPa") to_chat(M, "Zone Edges: [zone_edges]") to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)\n") diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 95d9efbd07c..4ff8a06286e 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -61,8 +61,8 @@ A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here if (A.debug) - A.visible_message("[A]: source entropy: [round(source.specific_entropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specific_entropy(), 0.01)] J/Kmol") - A.visible_message("[A]: specific entropy change = [round(sink.specific_entropy() - source.specific_entropy(), 0.01)] J/Kmol") + A.visible_message("[A]: source entropy: [round(source.specificGroupEntropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specificGroupEntropy(), 0.01)] J/Kmol") + A.visible_message("[A]: specific entropy change = [round(sink.specificGroupEntropy() - source.specificGroupEntropy(), 0.01)] J/Kmol") A.visible_message("[A]: specific power = [round(specific_power, 0.1)] W/mol") A.visible_message("[A]: moles transferred = [transfer_moles] mol") @@ -178,14 +178,14 @@ transfer_moles = min(transfer_moles, total_transfer_moles*(source.gas[g]/total_filterable_moles)) //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. - source.adjust_gas(g, -transfer_moles, update=0) - sink.adjust_gas_temp(g, transfer_moles, source.temperature, update=0) + source.adjustGas(g, -transfer_moles, update=0) + sink.adjustGasWithTemp(g, transfer_moles, source.temperature, update=0) power_draw += specific_power_gas[g]*transfer_moles //Remix the resulting gases - sink.update_values() - source.update_values() + sink.updateValues() + source.updateValues() return power_draw @@ -205,7 +205,7 @@ var/total_filterable_moles = 0 //the total amount of filterable gas var/total_unfilterable_moles = 0 //the total amount of non-filterable gas var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type - for (var/g in source.get_gases()) + for (var/g in source.getGases()) if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) continue @@ -250,21 +250,21 @@ if (g in filtering) //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. - sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0) - removed.adjust_gas(g, -removed.gas[g], update=0) + sink_filtered.adjustGasWithTemp(g, removed.gas[g], removed.temperature, update=0) + removed.adjustGas(g, -removed.gas[g], update=0) filtered_power_used += power_used else unfiltered_power_used += power_used - sink_filtered.update_values() - removed.update_values() + sink_filtered.updateValues() + removed.updateValues() sink_clean.merge(removed) return filtered_power_used + unfiltered_power_used //For omni devices. Instead filtering is an associative list mapping gasids to gas mixtures. -//I don't like the copypasta, but I decided to keep both versions of gas filtering as filter_gas is slightly faster (doesn't create as many temporary lists, doesn't call update_values() as much) +//I don't like the copypasta, but I decided to keep both versions of gas filtering as filter_gas is slightly faster (doesn't create as many temporary lists, doesn't call updateValues() as much) //filter_gas can be removed and replaced with this proc if need be. /proc/filter_gas_multi(obj/machinery/M, list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink_clean, total_transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing @@ -326,14 +326,14 @@ if (g in filtering) var/datum/gas_mixture/sink_filtered = filtering[g] //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. - sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=1) - removed.adjust_gas(g, -removed.gas[g], update=0) + sink_filtered.adjustGasWithTemp(g, removed.gas[g], removed.temperature, update=1) + removed.adjustGas(g, -removed.gas[g], update=0) if (power_used) filtered_power_used[sink_filtered] = power_used else unfiltered_power_used += power_used - removed.update_values() + removed.updateValues() var/power_draw = unfiltered_power_used for (var/datum/gas_mixture/sink_filtered in filtered_power_used) @@ -422,7 +422,7 @@ /proc/calculate_specific_power(datum/gas_mixture/source, datum/gas_mixture/sink) //Calculate the amount of energy required var/air_temperature = (sink.temperature > 0)? sink.temperature : source.temperature - var/specific_entropy = sink.specific_entropy() - source.specific_entropy() //sink is gaining moles, source is loosing + var/specific_entropy = sink.specificGroupEntropy() - source.specificGroupEntropy() //sink is gaining moles, source is loosing var/specific_power = 0 // W/mol //If specific_entropy is < 0 then power is required to move gas @@ -435,7 +435,7 @@ /proc/calculate_specific_power_gas(gasid, datum/gas_mixture/source, datum/gas_mixture/sink) //Calculate the amount of energy required var/air_temperature = (sink.temperature > 0)? sink.temperature : source.temperature - var/specific_entropy = sink.specific_entropy_gas(gasid) - source.specific_entropy_gas(gasid) //sink is gaining moles, source is loosing + var/specific_entropy = sink.specificEntropyGas(gasid) - source.specificEntropyGas(gasid) //sink is gaining moles, source is loosing var/specific_power = 0 // W/mol //If specific_entropy is < 0 then power is required to move gas @@ -457,8 +457,8 @@ if(sink.total_moles > 0 && sink.temperature > 0) //estimate the final temperature of the sink after transfer var/estimate_moles = pressure_delta*output_volume/(sink.temperature * R_IDEAL_GAS_EQUATION) - var/sink_heat_capacity = sink.heat_capacity() - var/transfer_heat_capacity = source.heat_capacity()*estimate_moles/source_total_moles + var/sink_heat_capacity = sink.getHeatCapacity() + var/transfer_heat_capacity = source.getHeatCapacity()*estimate_moles/source_total_moles air_temperature = (sink.temperature*sink_heat_capacity + source.temperature*transfer_heat_capacity) / (sink_heat_capacity + transfer_heat_capacity) //get the number of moles that would have to be transfered to bring sink to the target pressure @@ -472,8 +472,8 @@ var/source_volume = source.volume * source.group_multiplier var/sink_volume = sink.volume * sink.group_multiplier - var/source_pressure = source.return_pressure() - var/sink_pressure = sink.return_pressure() + var/source_pressure = source.returnPressure() + var/sink_pressure = sink.returnPressure() return (source_pressure - sink_pressure)/(R_IDEAL_GAS_EQUATION * (source.temperature/source_volume + sink.temperature/sink_volume)) @@ -492,7 +492,7 @@ status.Add("Temperature too [atmosphere.temperature > (T0C + 50) ? "high" : "low"].") // Pressure check - var/pressure = atmosphere.return_pressure() + var/pressure = atmosphere.returnPressure() if((pressure > 120) || (pressure < 80)) status.Add("Pressure too [pressure > 120 ? "high" : "low"].") diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm index 1fef439705e..f9d1edb23ce 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -96,7 +96,7 @@ for(var/check_dir in GLOB.cardinals) var/turf/T = get_step(src, check_dir) var/datum/gas_mixture/env = T.return_air() - var/pressure = env.return_pressure() + var/pressure = env.returnPressure() min_pressure = min(min_pressure, pressure) max_pressure = max(max_pressure, pressure) max_local_temp = max(max_local_temp, env.temperature) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index bdd7ebe1601..2b8e4cd9307 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -138,7 +138,7 @@ reference = location.air // Our color and volume will depend on the turf's gasmix //Active mode else - var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) + var/datum/gas_mixture/affected = location.air.removeRatio(volume/location.air.volume) if(affected) //in case volume is 0 reference = affected // Our color and volume will depend on this small sparked gasmix affected.temperature = temperature diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 0225080ca60..e8e572644a8 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -92,11 +92,11 @@ /turf/open/proc/copy_air_with_tile(turf/open/target_turf) if(istype(target_turf)) - air.copy_from(target_turf.air) + air.copyFrom(target_turf.air) /turf/open/proc/copy_air(datum/gas_mixture/copy) if(copy) - air.copy_from(copy) + air.copyFrom(copy) /turf/return_air() RETURN_TYPE(/datum/gas_mixture) @@ -328,7 +328,7 @@ // shares 4/5 of our difference in moles with the atmosphere our_air.share(planetary_mix, 0.8, 0.8) // temperature share with the atmosphere with an inflated heat capacity to simulate faster sharing with a large atmosphere - our_air.temperature_share(planetary_mix, OPEN_HEAT_TRANSFER_COEFFICIENT, planetary_mix.temperature_archived, planetary_mix.heat_capacity() * 5) + our_air.temperature_share(planetary_mix, OPEN_HEAT_TRANSFER_COEFFICIENT, planetary_mix.temperature_archived, planetary_mix.getHeatCapacity() * 5) planetary_mix.garbage_collect() PLANET_SHARE_CHECK @@ -462,12 +462,12 @@ var/datum/gas_mixture/turf/mix = group_member.air if (roundstart && istype(group_member.air, /datum/gas_mixture/immutable)) imumutable_in_group = TRUE - shared_mix.copy_from(group_member.air) //This had better be immutable young man + shared_mix.copyFrom(group_member.air) //This had better be immutable young man shared_gases = shared_mix.gases //update the cache break //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - var/capacity = mix.heat_capacity() + var/capacity = mix.getHeatCapacity() energy += mix.temperature * capacity heat_cap += capacity @@ -484,9 +484,9 @@ for(var/turf/open/group_member as anything in turf_list) if(group_member.planetary_atmos) //We do this as a hack to try and minimize unneeded excited group spread over planetary turfs - group_member.air.copy_from(SSair.planetary[group_member.initial_gas]) //Comes with a cost of "slower" drains, but it's worth it + group_member.air.copyFrom(SSair.planetary[group_member.initial_gas]) //Comes with a cost of "slower" drains, but it's worth it else - group_member.air.copy_from(shared_mix) //Otherwise just set the mix to a copy of our equalized mix + group_member.air.copyFrom(shared_mix) //Otherwise just set the mix to a copy of our equalized mix group_member.update_visuals() if(poke_turfs) //Because we only activate all these once every breakdown, in event of lag due to this code and slow space + vent things, increase the wait time for breakdowns SSair.add_to_active(group_member) @@ -633,7 +633,7 @@ Then we space some of our heat, and think about if we should stop conducting. /turf/open/consider_superconductivity(starting) if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) return FALSE - if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. + if(air.getHeatCapacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. return FALSE return ..() diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7e8146e6a88..4db5c955299 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //PV = nRT ///joules per kelvin -/datum/gas_mixture/proc/heat_capacity(data = MOLES) +/datum/gas_mixture/proc/getHeatCapacity(data = MOLES) var/list/cached_gases = gases . = 0 for(var/id in cached_gases) @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) . += gas_data[data] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] /// Same as above except vacuums return HEAT_CAPACITY_VACUUM -/datum/gas_mixture/turf/heat_capacity(data = MOLES) +/datum/gas_mixture/turf/getHeatCapacity(data = MOLES) var/list/cached_gases = gases . = 0 for(var/id in cached_gases) @@ -93,21 +93,21 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space /// Calculate moles -/datum/gas_mixture/proc/total_moles() +/datum/gas_mixture/proc/getMoles() var/cached_gases = gases TOTAL_MOLES(cached_gases, .) /// Checks to see if gas amount exists in mixture. /// Do NOT use this in code where performance matters! /// It's better to batch calls to garbage_collect(), especially in places where you're checking many gastypes -/datum/gas_mixture/proc/has_gas(gas_id, amount=0) +/datum/gas_mixture/proc/hasGas(gas_id, amount=0) ASSERT_GAS(gas_id, src) var/is_there_gas = amount < gases[gas_id][MOLES] garbage_collect() return is_there_gas /// Calculate pressure in kilopascals -/datum/gas_mixture/proc/return_pressure() +/datum/gas_mixture/proc/returnPressure() if(volume) // to prevent division by zero var/cached_gases = gases TOTAL_MOLES(cached_gases, .) @@ -116,15 +116,15 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return 0 /// Calculate temperature in kelvins -/datum/gas_mixture/proc/return_temperature() +/datum/gas_mixture/proc/getTemperature() return temperature /// Calculate volume in liters -/datum/gas_mixture/proc/return_volume() +/datum/gas_mixture/proc/getVolume() return max(0, volume) /// Gets the gas visuals for everything in this mixture -/datum/gas_mixture/proc/return_visuals() +/datum/gas_mixture/proc/returnVisuals() var/list/output GAS_OVERLAYS(gases, output) return output @@ -150,8 +150,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //heat transfer if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = giver.heat_capacity() + var/self_heat_capacity = getHeatCapacity() + var/giver_heat_capacity = giver.getHeatCapacity() var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity if(combined_heat_capacity) temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) ///Proportionally removes amount of gas from the gas_mixture. ///Returns: gas_mixture with the gases removed -/datum/gas_mixture/proc/remove_ratio(ratio) +/datum/gas_mixture/proc/removeRatio(ratio) if(ratio <= 0) var/datum/gas_mixture/removed = new(volume) return removed @@ -251,10 +251,10 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Returns: bool indicating whether gases moved between the two mixes /datum/gas_mixture/proc/equalize(datum/gas_mixture/other) . = FALSE - if(abs(return_temperature() - other.return_temperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + if(abs(getTemperature() - other.getTemperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) . = TRUE - var/self_heat_cap = heat_capacity() - var/other_heat_cap = other.heat_capacity() + var/self_heat_cap = getHeatCapacity() + var/other_heat_cap = other.getHeatCapacity() var/new_temp = (temperature * self_heat_cap + other.temperature * other_heat_cap) / (self_heat_cap + other_heat_cap) temperature = new_temp other.temperature = new_temp @@ -290,7 +290,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) ///Copies variables from sample, moles multiplicated by partial ///Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample, partial = 1) +/datum/gas_mixture/proc/copyFrom(datum/gas_mixture/sample, partial = 1) var/list/cached_gases = gases //accessing datum vars is slower than proc vars var/list/sample_gases = sample.gases @@ -355,8 +355,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/old_self_heat_capacity = 0 var/old_sharer_heat_capacity = 0 if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - old_self_heat_capacity = heat_capacity() - old_sharer_heat_capacity = sharer.heat_capacity() + old_self_heat_capacity = getHeatCapacity() + old_sharer_heat_capacity = sharer.getHeatCapacity() var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us @@ -439,8 +439,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) sharer_temperature = sharer.temperature_archived var/temperature_delta = temperature_archived - sharer_temperature if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity(ARCHIVE) - sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity(ARCHIVE) + var/self_heat_capacity = getHeatCapacity(ARCHIVE) + sharer_heat_capacity = sharer_heat_capacity || sharer.getHeatCapacity(ARCHIVE) if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) var/heat = conduction_coefficient*temperature_delta* \ @@ -545,17 +545,17 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * eg: * Plas_PP = get_partial_pressure(gas_mixture.plasma) * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp - * get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + * getBreathPartialPressure(gas_pp) --> gas_pp/getMoles()*breath_pp = pp + * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*getMoles() * * 10/20*5 = 2.5 * 10 = 2.5/5*20 */ -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) +/datum/gas_mixture/proc/getBreathPartialPressure(gas_pressure) return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME ///inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) +/datum/gas_mixture/proc/getTrueBreathPressure(partial_pressure) return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) /** @@ -566,9 +566,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * - output_air (gasmix). */ /datum/gas_mixture/proc/gas_pressure_minimum_transfer(datum/gas_mixture/output_air) - var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / total_moles() * thermal_energy()) - var/resulting_capacity = output_air.heat_capacity() + (MOLAR_ACCURACY / total_moles() * heat_capacity()) - return (output_air.total_moles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume + var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / getMoles() * thermal_energy()) + var/resulting_capacity = output_air.getHeatCapacity() + (MOLAR_ACCURACY / getMoles() * getHeatCapacity()) + return (output_air.getMoles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume /** Returns the amount of gas to be pumped to a specific container. @@ -578,15 +578,15 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistant. */ /datum/gas_mixture/proc/gas_pressure_calculate(datum/gas_mixture/output_air, target_pressure, ignore_temperature = FALSE) - if((total_moles() <= 0) || (temperature <= 0)) + if((getMoles() <= 0) || (temperature <= 0)) return FALSE var/pressure_delta = 0 - if((output_air.temperature <= 0) || (output_air.total_moles() <= 0)) + if((output_air.temperature <= 0) || (output_air.getMoles() <= 0)) ignore_temperature = TRUE pressure_delta = target_pressure else - pressure_delta = target_pressure - output_air.return_pressure() + pressure_delta = target_pressure - output_air.returnPressure() if(pressure_delta < 0.01 || gas_pressure_minimum_transfer(output_air) > target_pressure) return FALSE @@ -600,8 +600,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/rt_high = R_IDEAL_GAS_EQUATION * min(temperature, output_air.temperature) // These works by assuming our gas has extremely high heat capacity // and the resultant gasmix will hit either the highest or lowest temperature possible. - var/lower_limit = max((pv / rt_low) - output_air.total_moles(), 0) - var/upper_limit = (pv / rt_high) - output_air.total_moles() // In theory this should never go below zero, the pressure_delta check above should account for this. + var/lower_limit = max((pv / rt_low) - output_air.getMoles(), 0) + var/upper_limit = (pv / rt_high) - output_air.getMoles() // In theory this should never go below zero, the pressure_delta check above should account for this. /* * We have PV=nRT as a nice formula, we can rearrange it into nT = PV/R @@ -627,13 +627,13 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) // Our thermal energy and moles var/w2 = thermal_energy() - var/n2 = total_moles() - var/c2 = heat_capacity() + var/n2 = getMoles() + var/c2 = getHeatCapacity() // Target thermal energy and moles var/w1 = output_air.thermal_energy() - var/n1 = output_air.total_moles() - var/c1 = output_air.heat_capacity() + var/n1 = output_air.getMoles() + var/c1 = output_air.getHeatCapacity() /// The PV/R part in our equation. var/pvr = pv / R_IDEAL_GAS_EQUATION @@ -704,8 +704,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. /datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1) - var/output_starting_pressure = output_air.return_pressure() - var/input_starting_pressure = return_pressure() + var/output_starting_pressure = output_air.returnPressure() + var/input_starting_pressure = returnPressure() //Need at least 10 KPa difference to overcome friction in the mechanism if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index e6cd8f75499..c1db471f3a3 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -31,7 +31,7 @@ /datum/gas_mixture/immutable/copy() return new type //we're immutable, so we can just return a new instance. -/datum/gas_mixture/immutable/copy_from() +/datum/gas_mixture/immutable/copyFrom() return FALSE //we're immutable. /datum/gas_mixture/immutable/copy_from_turf() @@ -48,13 +48,13 @@ /datum/gas_mixture/immutable/space initial_temperature = TCMB -/datum/gas_mixture/immutable/space/heat_capacity() +/datum/gas_mixture/immutable/space/getHeatCapacity() return HEAT_CAPACITY_VACUUM /datum/gas_mixture/immutable/space/remove() return copy() //we're always empty, so we can just return a copy. -/datum/gas_mixture/immutable/space/remove_ratio() +/datum/gas_mixture/immutable/space/removeRatio() return copy() //we're always empty, so we can just return a copy. //planet side stuff diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 33fc13f7094..23f4bc09952 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -138,7 +138,7 @@ /datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases // As the name says it, it needs to be dry - if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor][MOLES] / air.total_moles() > MIASTER_STERILIZATION_MAX_HUMIDITY) + if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor][MOLES] / air.getMoles() > MIASTER_STERILIZATION_MAX_HUMIDITY) return NO_REACTION //Replace miasma with oxygen @@ -204,7 +204,7 @@ if(plasma_burn_rate < MINIMUM_HEAT_CAPACITY) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() plasma_burn_rate = min(plasma_burn_rate, cached_gases[/datum/gas/plasma][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(oxygen_burn_ratio)) //Ensures matter is conserved properly cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate) cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_ratio)) @@ -219,7 +219,7 @@ SET_REACTION_RESULTS((plasma_burn_rate) * (1 + oxygen_burn_ratio)) var/energy_released = FIRE_PLASMA_ENERGY_RELEASED * plasma_burn_rate - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity @@ -256,7 +256,7 @@ /datum/gas_reaction/h2fire/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() var/temperature = air.temperature var/burned_fuel @@ -281,7 +281,7 @@ var/energy_released = FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel * fire_scale if(energy_released > 0) - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity @@ -319,7 +319,7 @@ /datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() var/temperature = air.temperature var/burned_fuel @@ -355,7 +355,7 @@ radiation_pulse(location, max_range = min(TRITIUM_MINIMUM_RADIATION_RANGE + sqrt(burned_fuel * effect_scale / TRITIUM_OXYBURN_MULTIPLIER) / TRITIUM_RADIATION_RANGE_DIVISOR, 20), threshold = TRITIUM_RADIATION_THRESHOLD_BASE * INVERSE(TRITIUM_RADIATION_THRESHOLD_BASE + (burned_fuel * effect_scale / TRITIUM_OXYBURN_MULTIPLIER)), chance = 100 * (1 - 0.5 ** (energy_released / TRITIUM_RADIATION_CHANCE_ENERGY_THRESHOLD_BASE))) if(energy_released > 0) - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity @@ -416,7 +416,7 @@ if (freon_burn_rate < MINIMUM_HEAT_CAPACITY) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() freon_burn_rate = min(freon_burn_rate, cached_gases[/datum/gas/freon][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(oxygen_burn_ratio)) //Ensures matter is conserved properly cached_gases[/datum/gas/freon][MOLES] = QUANTIZE(cached_gases[/datum/gas/freon][MOLES] - freon_burn_rate) cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (freon_burn_rate * oxygen_burn_ratio)) @@ -428,7 +428,7 @@ SET_REACTION_RESULTS(freon_burn_rate * (1 + oxygen_burn_ratio)) var/energy_consumed = FIRE_FREON_ENERGY_CONSUMED * freon_burn_rate - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((temperature * old_heat_capacity - energy_consumed) / new_heat_capacity, TCMB) @@ -471,7 +471,7 @@ if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency * 2 < 0)) return NO_REACTION // Shouldn't produce gas from nothing. - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency * 2 ASSERT_GAS(/datum/gas/nitrous_oxide, air) @@ -479,7 +479,7 @@ SET_REACTION_RESULTS(heat_efficency) var/energy_released = heat_efficency * N2O_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) // The air cools down when reacting. return REACTING @@ -513,7 +513,7 @@ if(cached_gases[/datum/gas/nitrous_oxide][MOLES] - burned_fuel < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/nitrous_oxide][MOLES] -= burned_fuel ASSERT_GAS(/datum/gas/nitrogen, air) cached_gases[/datum/gas/nitrogen][MOLES] += burned_fuel @@ -522,7 +522,7 @@ SET_REACTION_RESULTS(burned_fuel) var/energy_released = N2O_DECOMPOSITION_ENERGY * burned_fuel - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity return REACTING @@ -551,7 +551,7 @@ /datum/gas_reaction/bzformation/react(datum/gas_mixture/air) var/list/cached_gases = air.gases - var/pressure = air.return_pressure() + var/pressure = air.returnPressure() // This slows down in relation to pressure, very quickly. Please don't expect it to be anything more then a snail // Bigger is better for these two values. @@ -563,7 +563,7 @@ if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2 * reaction_efficency) < 0) || reaction_efficency <= 0) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/bz, air) if (reaction_efficency == cached_gases[/datum/gas/nitrous_oxide][MOLES]) ASSERT_GAS(/datum/gas/oxygen, air) @@ -577,7 +577,7 @@ SET_REACTION_RESULTS(reaction_efficency) var/energy_released = 2 * reaction_efficency * FIRE_CARBON_ENERGY_RELEASED - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING @@ -612,7 +612,7 @@ if (produced_amount <= 0 || cached_gases[/datum/gas/carbon_dioxide][MOLES] - produced_amount < 0 || cached_gases[/datum/gas/oxygen][MOLES] - produced_amount * 0.5 < 0 || cached_gases[/datum/gas/tritium][MOLES] - produced_amount * 0.01 < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/carbon_dioxide][MOLES] -= produced_amount cached_gases[/datum/gas/oxygen][MOLES] -= produced_amount * 0.5 cached_gases[/datum/gas/tritium][MOLES] -= produced_amount * 0.01 @@ -623,7 +623,7 @@ SET_REACTION_RESULTS(produced_amount) var/energy_released = produced_amount * PLUOXIUM_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) return REACTING @@ -660,7 +660,7 @@ if( heat_efficency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.05 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/nitrium, air) cached_gases[/datum/gas/tritium][MOLES] -= heat_efficency cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency @@ -669,7 +669,7 @@ SET_REACTION_RESULTS(heat_efficency) var/energy_used = heat_efficency * NITRIUM_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) //the air cools down when reacting return REACTING @@ -705,7 +705,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() air.assert_gases(/datum/gas/nitrogen, /datum/gas/hydrogen) cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency cached_gases[/datum/gas/hydrogen][MOLES] += heat_efficency @@ -713,7 +713,7 @@ SET_REACTION_RESULTS(heat_efficency) var/energy_released = heat_efficency * NITRIUM_DECOMPOSITION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) //the air heats up when reacting return REACTING @@ -746,7 +746,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/plasma][MOLES] - heat_efficency * 1.5 < 0 ) || (cached_gases[/datum/gas/carbon_dioxide][MOLES] - heat_efficency * 0.75 < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/freon, air) cached_gases[/datum/gas/plasma][MOLES] -= heat_efficency * 1.5 // 6 cached_gases[/datum/gas/carbon_dioxide][MOLES] -= heat_efficency * 0.75 // 3 @@ -755,7 +755,7 @@ SET_REACTION_RESULTS(heat_efficency * 2.5) var/energy_used = heat_efficency * FREON_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used)/new_heat_capacity), TCMB) return REACTING @@ -790,7 +790,7 @@ if (nob_formed <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - 5 * nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 10 * nob_formed < 0)) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() air.assert_gases(/datum/gas/hypernoblium, /datum/gas/bz) var/reduction_factor = clamp(cached_gases[/datum/gas/tritium][MOLES]/(cached_gases[/datum/gas/tritium][MOLES] + cached_gases[/datum/gas/bz][MOLES]), 0.001 , 1) //reduces trit consumption in presence of bz upward to 0.1% reduction cached_gases[/datum/gas/tritium][MOLES] -= 5 * nob_formed * reduction_factor @@ -798,7 +798,7 @@ cached_gases[/datum/gas/hypernoblium][MOLES] += nob_formed // I'm not going to nitpick, but N20H10 feels like it should be an explosive more than anything. SET_REACTION_RESULTS(nob_formed) var/energy_released = nob_formed * (NOBLIUM_FORMATION_ENERGY / (max(cached_gases[/datum/gas/bz][MOLES], 1))) - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING @@ -832,7 +832,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficency * 4 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/halon, air) cached_gases[/datum/gas/tritium][MOLES] -= heat_efficency * 4 cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 @@ -840,7 +840,7 @@ SET_REACTION_RESULTS(heat_efficency * 4.25) var/energy_released = heat_efficency * HALON_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING @@ -874,7 +874,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/halon][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency * 20 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/carbon_dioxide, air) cached_gases[/datum/gas/halon][MOLES] -= heat_efficency cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency * 20 @@ -882,7 +882,7 @@ SET_REACTION_RESULTS(heat_efficency * 5) var/energy_used = heat_efficency * HALON_COMBUSTION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) return REACTING @@ -916,7 +916,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/freon][MOLES] - heat_efficency * 2.75 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/healium, air) cached_gases[/datum/gas/freon][MOLES] -= heat_efficency * 2.75 cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 @@ -924,7 +924,7 @@ SET_REACTION_RESULTS(heat_efficency * 3) var/energy_released = heat_efficency * HEALIUM_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING @@ -957,7 +957,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/hypernoblium][MOLES] - heat_efficency * 0.01 < 0 ) || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency * 0.5 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/zauker, air) cached_gases[/datum/gas/hypernoblium][MOLES] -= heat_efficency * 0.01 cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency * 0.5 @@ -965,7 +965,7 @@ SET_REACTION_RESULTS(heat_efficency * 0.5) var/energy_used = heat_efficency * ZAUKER_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) return REACTING @@ -995,7 +995,7 @@ if (burned_fuel <= 0 || cached_gases[/datum/gas/zauker][MOLES] - burned_fuel < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/zauker][MOLES] -= burned_fuel ASSERT_GAS(/datum/gas/oxygen, air) cached_gases[/datum/gas/oxygen][MOLES] += burned_fuel * 0.3 @@ -1004,7 +1004,7 @@ SET_REACTION_RESULTS(burned_fuel) var/energy_released = ZAUKER_DECOMPOSITION_ENERGY * burned_fuel - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) return REACTING @@ -1039,7 +1039,7 @@ if (heat_efficency <= 0 || (cached_gases[/datum/gas/pluoxium][MOLES] - heat_efficency * 0.2 < 0 ) || (cached_gases[/datum/gas/hydrogen][MOLES] - heat_efficency * 2 < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() ASSERT_GAS(/datum/gas/proto_nitrate, air) cached_gases[/datum/gas/hydrogen][MOLES] -= heat_efficency * 2 cached_gases[/datum/gas/pluoxium][MOLES] -= heat_efficency * 0.2 @@ -1047,7 +1047,7 @@ SET_REACTION_RESULTS(heat_efficency * 2.2) var/energy_released = heat_efficency * PN_FORMATION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) return REACTING @@ -1076,13 +1076,13 @@ if (produced_amount <= 0 || cached_gases[/datum/gas/hydrogen][MOLES] - produced_amount < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/hydrogen][MOLES] -= produced_amount cached_gases[/datum/gas/proto_nitrate][MOLES] += produced_amount * 0.5 SET_REACTION_RESULTS(produced_amount * 0.5) var/energy_used = produced_amount * PN_HYDROGEN_CONVERSION_ENERGY - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((air.temperature * old_heat_capacity - energy_used) / new_heat_capacity, TCMB) return REACTING @@ -1115,7 +1115,7 @@ if(cached_gases[/datum/gas/tritium][MOLES] - produced_amount < 0 || cached_gases[/datum/gas/proto_nitrate][MOLES] - produced_amount * 0.01 < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/proto_nitrate][MOLES] -= produced_amount * 0.01 cached_gases[/datum/gas/tritium][MOLES] -= produced_amount ASSERT_GAS(/datum/gas/hydrogen, air) @@ -1133,7 +1133,7 @@ radiation_pulse(location, max_range = min(sqrt(produced_amount) / PN_TRITIUM_RAD_RANGE_DIVISOR, 20), threshold = PN_TRITIUM_RAD_THRESHOLD_BASE * INVERSE(PN_TRITIUM_RAD_THRESHOLD_BASE + produced_amount), chance = 50) if(energy_released) - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) return REACTING @@ -1164,7 +1164,7 @@ if (consumed_amount <= 0 || cached_gases[/datum/gas/bz][MOLES] - consumed_amount < 0) return NO_REACTION - var/old_heat_capacity = air.heat_capacity() + var/old_heat_capacity = air.getHeatCapacity() cached_gases[/datum/gas/bz][MOLES] -= consumed_amount ASSERT_GAS(/datum/gas/nitrogen, air) cached_gases[/datum/gas/nitrogen][MOLES] += consumed_amount * 0.4 @@ -1186,7 +1186,7 @@ for(var/mob/living/carbon/L in location) L.hallucination += consumed_amount - var/new_heat_capacity = air.heat_capacity() + var/new_heat_capacity = air.getHeatCapacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) return REACTING diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 3a0f2c52936..047677f04cf 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -219,7 +219,7 @@ var/datum/tlv/cur_tlv data["environment_data"] = list() - var/pressure = environment.return_pressure() + var/pressure = environment.returnPressure() cur_tlv = TLV["pressure"] data["environment_data"] += list(list( "name" = "Pressure", @@ -235,9 +235,9 @@ "unit" = "K ([round(temperature - T0C, 0.1)]C)", "danger_level" = cur_tlv.get_danger_level(temperature) )) - var/total_moles = environment.total_moles() + var/total_moles = environment.getMoles() var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume - for(var/gas_id in environment.get_gases()) + for(var/gas_id in environment.getGases()) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue cur_tlv = TLV[gas_id] @@ -624,11 +624,11 @@ //cache for sanic speed (lists are references anyways) var/list/cached_tlv = TLV - var/list/env_gases = environment.get_gases() + var/list/env_gases = environment.getGases() //var/partial_pressure = R_IDEAL_GAS_EQUATION * exposed_temperature / environment.volume current_tlv = cached_tlv["pressure"] - var/environment_pressure = environment.return_pressure() + var/environment_pressure = environment.returnPressure() var/pressure_dangerlevel = current_tlv.get_danger_level(environment_pressure) current_tlv = cached_tlv["temperature"] @@ -991,10 +991,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) if(COMPONENT_TRIGGERED_BY(request_data, port)) var/turf/alarm_turf = get_turf(connected_alarm) var/datum/gas_mixture/environment = alarm_turf.return_air() - pressure.set_output(round(environment.return_pressure())) + pressure.set_output(round(environment.returnPressure())) my_temperature.set_output(round(environment.temperature)) if(ispath(options_map[current_option])) - gas_amount.set_output(round(environment.get_gases()[options_map[current_option]])) + gas_amount.set_output(round(environment.getGases()[options_map[current_option]])) return var/datum/tlv/settings = connected_alarm.TLV[options_map[current_option]] diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index d95707ac121..408152718a6 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -367,7 +367,7 @@ add_fingerprint(user) var/unsafe_wrenching = FALSE - var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() + var/internal_pressure = int_air.returnPressure()-env_air.returnPressure() to_chat(user, span_notice("You begin to unfasten \the [src]...")) @@ -413,7 +413,7 @@ if(!pressures) var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() - pressures = int_air.return_pressure() - env_air.return_pressure() + pressures = int_air.returnPressure() - env_air.returnPressure() user.visible_message(span_danger("[user] is sent flying by pressure!"),span_userdanger("The pressure sends you flying!")) diff --git a/code/modules/atmospherics/machinery/bluespace_vendor.dm b/code/modules/atmospherics/machinery/bluespace_vendor.dm index d0ab9135d61..c36d71a8aeb 100644 --- a/code/modules/atmospherics/machinery/bluespace_vendor.dm +++ b/code/modules/atmospherics/machinery/bluespace_vendor.dm @@ -188,7 +188,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) gas_price = temp_price if(attempt_charge(src, user, gas_price) & COMPONENT_OBJ_CANCEL_CHARGE) - var/datum/gas_mixture/remove = working_mix.remove_ratio(1) + var/datum/gas_mixture/remove = working_mix.removeRatio(1) connected_machine.bluespace_network.merge(remove) return connected_machine.credits_gained += gas_price + tank_cost @@ -208,7 +208,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) /obj/machinery/bluespace_vendor/ui_data(mob/user) var/list/data = list() var/list/bluespace_gasdata = list() - if(connected_machine.bluespace_network.total_moles()) + if(connected_machine.bluespace_network.getMoles()) for(var/gas_id in connected_machine.bluespace_network.gases) bluespace_gasdata.Add(list(list( "name" = connected_machine.bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], @@ -233,7 +233,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) var/total_tank_pressure if(internal_tank) var/datum/gas_mixture/working_mix = internal_tank.return_air() - total_tank_pressure = working_mix.return_pressure() + total_tank_pressure = working_mix.returnPressure() else total_tank_pressure = 0 data["tank_full"] = total_tank_pressure diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index d215c8d18f7..38299c8745f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -42,8 +42,8 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - var/output_starting_pressure = air1.return_pressure() - var/input_starting_pressure = air2.return_pressure() + var/output_starting_pressure = air1.returnPressure() + var/input_starting_pressure = air2.returnPressure() if(output_starting_pressure >= input_starting_pressure-10) //Need at least 10 KPa difference to overcome friction in the mechanism diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 45efa9e16e1..a1506654512 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -60,7 +60,7 @@ var/datum/gas_mixture/air2 = airs[2] var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() + var/environment_pressure = environment.returnPressure() if(pump_direction) //input -> external var/pressure_delta = 10000 @@ -68,7 +68,7 @@ if(pressure_checks&EXT_BOUND) pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) if(pressure_checks&INPUT_MIN) - pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) + pressure_delta = min(pressure_delta, (air1.returnPressure() - input_pressure_min)) if(pressure_delta <= 0) return @@ -92,7 +92,7 @@ if(pressure_checks&EXT_BOUND) pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) if(pressure_checks&INPUT_MIN) - pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) + pressure_delta = min(pressure_delta, (output_pressure_max - air2.returnPressure())) if(pressure_delta <= 0) return diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 7d5ce9f6d97..c0c02aee01a 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -57,7 +57,7 @@ Passive gate is similar to the regular pump except: var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - var/input_starting_pressure = air1.return_pressure() + var/input_starting_pressure = air1.returnPressure() var/pressure_delta = input_starting_pressure - target_pressure diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index fa368449795..ec581bc9708 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -55,7 +55,7 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - if(air1.return_pressure() > target_pressure) + if(air1.returnPressure() > target_pressure) var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles if(pump_gas_passive(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) update_parents() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index c9a98bb535f..ef3c491caa8 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -281,7 +281,7 @@ return var/datum/gas_mixture/air_input = connected_pump.airs[1] var/datum/gas_mixture/air_output = connected_pump.airs[2] - input_pressure.set_output(air_input.return_pressure()) - output_pressure.set_output(air_output.return_pressure()) - input_temperature.set_output(air_input.return_temperature()) - output_temperature.set_output(air_output.return_temperature()) + input_pressure.set_output(air_input.returnPressure()) + output_pressure.set_output(air_output.returnPressure()) + input_temperature.set_output(air_input.getTemperature()) + output_temperature.set_output(air_output.getTemperature()) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 742964c2d85..7f6ff5ae65e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -37,16 +37,16 @@ var/datum/gas_mixture/air_input = airs[1] var/datum/gas_mixture/air_output = airs[2] - if(!QUANTIZE(air_input.total_moles()) || !QUANTIZE(air_output.total_moles())) //Don't transfer if there's no gas + if(!QUANTIZE(air_input.getMoles()) || !QUANTIZE(air_output.getMoles())) //Don't transfer if there's no gas return - var/datum/gas_mixture/remove_input = air_input.remove_ratio(0.9) - var/datum/gas_mixture/remove_output = air_output.remove_ratio(0.9) + var/datum/gas_mixture/remove_input = air_input.removeRatio(0.9) + var/datum/gas_mixture/remove_output = air_output.removeRatio(0.9) var/coolant_temperature_delta = remove_input.temperature - remove_output.temperature if(coolant_temperature_delta > 0) - var/input_capacity = remove_input.heat_capacity() - var/output_capacity = remove_output.heat_capacity() + var/input_capacity = remove_input.getHeatCapacity() + var/output_capacity = remove_output.getHeatCapacity() var/cooling_heat_amount = (heat_transfer_rate * 0.01) * coolant_temperature_delta * (input_capacity * output_capacity / (input_capacity + output_capacity)) remove_input.temperature = max(remove_input.temperature - (cooling_heat_amount / input_capacity), TCMB) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 5109e2eb280..df3865955af 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -67,8 +67,8 @@ // Pump mechanism just won't do anything if the pressure is too high/too low unless you overclock it. - var/input_starting_pressure = air1.return_pressure() - var/output_starting_pressure = air2.return_pressure() + var/input_starting_pressure = air1.returnPressure() + var/output_starting_pressure = air2.returnPressure() if((input_starting_pressure < 0.01) || ((output_starting_pressure > 9000))&&!overclocked) return @@ -79,15 +79,15 @@ var/transfer_ratio = transfer_rate / air1.volume - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) + var/datum/gas_mixture/removed = air1.removeRatio(transfer_ratio) - if(!removed.total_moles()) + if(!removed.getMoles()) return if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked var/turf/open/T = loc if(istype(T)) - var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT) + var/datum/gas_mixture/leaked = removed.removeRatio(VOLUME_PUMP_LEAK_AMOUNT) T.assume_air(leaked) air2.merge(removed) @@ -324,7 +324,7 @@ return var/datum/gas_mixture/air_input = connected_pump.airs[1] var/datum/gas_mixture/air_output = connected_pump.airs[2] - input_pressure.set_output(air_input.return_pressure()) - output_pressure.set_output(air_output.return_pressure()) - input_temperature.set_output(air_input.return_temperature()) - output_temperature.set_output(air_output.return_temperature()) + input_pressure.set_output(air_input.returnPressure()) + output_pressure.set_output(air_output.returnPressure()) + input_temperature.set_output(air_input.getTemperature()) + output_temperature.set_output(air_output.getTemperature()) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 6c7551e0c35..c66f9449a28 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -380,8 +380,8 @@ internal_fusion.temperature -= heat_limiter_modifier * 0.01 * delta_time //heat up and output what's in the internal_output into the linked_output port - if(internal_output.total_moles() > 0) - if(moderator_internal.total_moles() > 0) + if(internal_output.getMoles() > 0) + if(moderator_internal.getMoles() > 0) internal_output.temperature = moderator_internal.temperature * HIGH_EFFICIENCY_CONDUCTIVITY else internal_output.temperature = internal_fusion.temperature * METALLIC_VOID_CONDUCTIVITY @@ -410,8 +410,8 @@ if (!power_level) return // All gases in the moderator slowly burn away over time, whether used for production or not - if(moderator_internal.total_moles() > 0) - moderator_internal.remove(moderator_internal.total_moles() * (1 - (1 - 0.0005 * power_level) ** delta_time)) + if(moderator_internal.getMoles() > 0) + moderator_internal.remove(moderator_internal.getMoles() * (1 - (1 - 0.0005 * power_level) ** delta_time)) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_damageheal(delta_time) // Archive current health for damage cap purposes @@ -419,16 +419,16 @@ // If we're operating at an extreme power level, take increasing damage for the amount of fusion mass over a low threshold if(power_level >= HYPERTORUS_OVERFULL_MIN_POWER_LEVEL) - var/overfull_damage_taken = HYPERTORUS_OVERFULL_MOLAR_SLOPE * internal_fusion.total_moles() + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * coolant_temperature + HYPERTORUS_OVERFULL_CONSTANT + var/overfull_damage_taken = HYPERTORUS_OVERFULL_MOLAR_SLOPE * internal_fusion.getMoles() + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * coolant_temperature + HYPERTORUS_OVERFULL_CONSTANT critical_threshold_proximity = max(critical_threshold_proximity + max(overfull_damage_taken * delta_time, 0), 0) // If we're running on a thin fusion mix, heal up - if(internal_fusion.total_moles() < HYPERTORUS_SUBCRITICAL_MOLES && power_level <= 5) - var/subcritical_heal_restore = (internal_fusion.total_moles() - HYPERTORUS_SUBCRITICAL_MOLES) / HYPERTORUS_SUBCRITICAL_SCALE + if(internal_fusion.getMoles() < HYPERTORUS_SUBCRITICAL_MOLES && power_level <= 5) + var/subcritical_heal_restore = (internal_fusion.getMoles() - HYPERTORUS_SUBCRITICAL_MOLES) / HYPERTORUS_SUBCRITICAL_SCALE critical_threshold_proximity = max(critical_threshold_proximity + min(subcritical_heal_restore * delta_time, 0), 0) // If coolant is sufficiently cold, heal up - if(internal_fusion.total_moles() > 0 && (airs[1].total_moles() && coolant_temperature < HYPERTORUS_COLD_COOLANT_THRESHOLD) && power_level <= 4) + if(internal_fusion.getMoles() > 0 && (airs[1].getMoles() && coolant_temperature < HYPERTORUS_COLD_COOLANT_THRESHOLD) && power_level <= 4) var/cold_coolant_heal_restore = log(10, max(coolant_temperature, 1) * HYPERTORUS_COLD_COOLANT_SCALE) - (HYPERTORUS_COLD_COOLANT_MAX_RESTORE * 2) critical_threshold_proximity = max(critical_threshold_proximity + min(cold_coolant_heal_restore * delta_time, 0), 0) @@ -438,8 +438,8 @@ critical_threshold_proximity = min(critical_threshold_proximity_archived + (delta_time * DAMAGE_CAP_MULTIPLIER * melting_point), critical_threshold_proximity) // If we have a preposterous amount of mass in the fusion mix, things get bad extremely fast - if(internal_fusion.total_moles() >= HYPERTORUS_HYPERCRITICAL_MOLES) - var/hypercritical_damage_taken = max((internal_fusion.total_moles() - HYPERTORUS_HYPERCRITICAL_MOLES) * HYPERTORUS_HYPERCRITICAL_SCALE, 0) + if(internal_fusion.getMoles() >= HYPERTORUS_HYPERCRITICAL_MOLES) + var/hypercritical_damage_taken = max((internal_fusion.getMoles() - HYPERTORUS_HYPERCRITICAL_MOLES) * HYPERTORUS_HYPERCRITICAL_SCALE, 0) critical_threshold_proximity = max(critical_threshold_proximity + min(hypercritical_damage_taken, HYPERTORUS_HYPERCRITICAL_MAX_DAMAGE), 0) * delta_time // High power fusion might create other matter other than helium, iron is dangerous inside the machine, damage can be seen @@ -469,7 +469,7 @@ zap_number += 1 var/cutoff = 1500 - cutoff = clamp(3000 - (power_level * (internal_fusion.total_moles() * 0.45)), 450, 3000) + cutoff = clamp(3000 - (power_level * (internal_fusion.getMoles() * 0.45)), 450, 3000) var/zaps_aspect = DEFAULT_ZAP_ICON_STATE var/flags = ZAP_SUPERMATTER_FLAGS @@ -514,29 +514,29 @@ moderator_internal.garbage_collect() /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_internal_cooling(delta_time) - if(moderator_internal.total_moles() > 0 && internal_fusion.total_moles() > 0) + if(moderator_internal.getMoles() > 0 && internal_fusion.getMoles() > 0) //Modifies the moderator_internal temperature based on energy conduction and also the fusion by the same amount var/fusion_temperature_delta = internal_fusion.temperature - moderator_internal.temperature - var/fusion_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * fusion_temperature_delta * (internal_fusion.heat_capacity() * moderator_internal.heat_capacity() / (internal_fusion.heat_capacity() + moderator_internal.heat_capacity())) - internal_fusion.temperature = max(internal_fusion.temperature - fusion_heat_amount / internal_fusion.heat_capacity(), TCMB) - moderator_internal.temperature = max(moderator_internal.temperature + fusion_heat_amount / moderator_internal.heat_capacity(), TCMB) + var/fusion_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * fusion_temperature_delta * (internal_fusion.getHeatCapacity() * moderator_internal.getHeatCapacity() / (internal_fusion.getHeatCapacity() + moderator_internal.getHeatCapacity())) + internal_fusion.temperature = max(internal_fusion.temperature - fusion_heat_amount / internal_fusion.getHeatCapacity(), TCMB) + moderator_internal.temperature = max(moderator_internal.temperature + fusion_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - if(airs[1].total_moles() * 0.05 <= MINIMUM_MOLE_COUNT) + if(airs[1].getMoles() * 0.05 <= MINIMUM_MOLE_COUNT) return var/datum/gas_mixture/cooling_port = airs[1] - var/datum/gas_mixture/cooling_remove = cooling_port.remove(0.05 * cooling_port.total_moles()) + var/datum/gas_mixture/cooling_remove = cooling_port.remove(0.05 * cooling_port.getMoles()) //Cooling of the moderator gases with the cooling loop in and out the core - if(moderator_internal.total_moles() > 0) + if(moderator_internal.getMoles() > 0) var/coolant_temperature_delta = cooling_remove.temperature - moderator_internal.temperature - var/cooling_heat_amount = (1 - (1 - HIGH_EFFICIENCY_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.heat_capacity() * moderator_internal.heat_capacity() / (cooling_remove.heat_capacity() + moderator_internal.heat_capacity())) - cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.heat_capacity(), TCMB) - moderator_internal.temperature = max(moderator_internal.temperature + cooling_heat_amount / moderator_internal.heat_capacity(), TCMB) + var/cooling_heat_amount = (1 - (1 - HIGH_EFFICIENCY_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * moderator_internal.getHeatCapacity() / (cooling_remove.getHeatCapacity() + moderator_internal.getHeatCapacity())) + cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) + moderator_internal.temperature = max(moderator_internal.temperature + cooling_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - else if(internal_fusion.total_moles() > 0) + else if(internal_fusion.getMoles() > 0) var/coolant_temperature_delta = cooling_remove.temperature - internal_fusion.temperature - var/cooling_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.heat_capacity() * internal_fusion.heat_capacity() / (cooling_remove.heat_capacity() + internal_fusion.heat_capacity())) - cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.heat_capacity(), TCMB) - internal_fusion.temperature = max(internal_fusion.temperature + cooling_heat_amount / internal_fusion.heat_capacity(), TCMB) + var/cooling_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * internal_fusion.getHeatCapacity() / (cooling_remove.getHeatCapacity() + internal_fusion.getHeatCapacity())) + cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) + internal_fusion.temperature = max(internal_fusion.temperature + cooling_heat_amount / internal_fusion.getHeatCapacity(), TCMB) cooling_port.merge(cooling_remove) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/inject_from_side_components(delta_time) @@ -544,7 +544,7 @@ //Check and stores the gases from the moderator input in the moderator internal gasmix var/datum/gas_mixture/moderator_port = linked_moderator.airs[1] - if(start_moderator && moderator_port.total_moles()) + if(start_moderator && moderator_port.getMoles()) moderator_internal.merge(moderator_port.remove(moderator_injection_rate * delta_time)) linked_moderator.update_parents() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm index 6d95c1b396c..992afb55152 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm @@ -240,7 +240,7 @@ //Internal Fusion gases var/list/fusion_gasdata = list() - if(connected_core.internal_fusion.total_moles()) + if(connected_core.internal_fusion.getMoles()) for(var/gas_type in connected_core.internal_fusion.gases) var/datum/gas/gas = gas_type fusion_gasdata.Add(list(list( @@ -256,7 +256,7 @@ ))) //Moderator gases var/list/moderator_gasdata = list() - if(connected_core.moderator_internal.total_moles()) + if(connected_core.moderator_internal.getMoles()) for(var/gas_type in connected_core.moderator_internal.gases) var/datum/gas/gas = gas_type moderator_gasdata.Add(list(list( @@ -382,7 +382,7 @@ if(fuel) connected_core.selected_fuel = fuel fuel_mix = fuel.name - if(connected_core.internal_fusion.total_moles()) + if(connected_core.internal_fusion.getMoles()) connected_core.dump_gases() connected_core.update_parents() //prevent the machine from stopping because of the recipe change and the pipenet not updating connected_core.linked_input.update_parents() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index c8085b9c35d..203aa4a2058 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -237,7 +237,7 @@ /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_fuel() if(!selected_fuel) return FALSE - if(!internal_fusion.total_moles()) + if(!internal_fusion.getMoles()) return FALSE for(var/gas_type in selected_fuel.requirements) internal_fusion.assert_gas(gas_type) @@ -267,7 +267,7 @@ ///Removes the gases from the internal gasmix when the recipe is changed /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/dump_gases() - var/datum/gas_mixture/remove = internal_fusion.remove(internal_fusion.total_moles()) + var/datum/gas_mixture/remove = internal_fusion.remove(internal_fusion.getMoles()) linked_output.airs[1].merge(remove) internal_fusion.garbage_collect() linked_input.airs[1].garbage_collect() @@ -476,20 +476,20 @@ around_turfs -= turf continue var/datum/gas_mixture/remove_fusion - if(internal_fusion.total_moles() > 0) - remove_fusion = internal_fusion.remove_ratio(0.2) + if(internal_fusion.getMoles() > 0) + remove_fusion = internal_fusion.removeRatio(0.2) var/datum/gas_mixture/remove for(var/i in 1 to gas_pockets) - remove = remove_fusion.remove_ratio(1/gas_pockets) + remove = remove_fusion.removeRatio(1/gas_pockets) var/turf/local = pick(around_turfs) local.assume_air(remove) loc.assume_air(internal_fusion) var/datum/gas_mixture/remove_moderator - if(moderator_internal.total_moles() > 0) - remove_moderator = moderator_internal.remove_ratio(0.2) + if(moderator_internal.getMoles() > 0) + remove_moderator = moderator_internal.removeRatio(0.2) var/datum/gas_mixture/remove for(var/i in 1 to gas_pockets) - remove = remove_moderator.remove_ratio(1/gas_pockets) + remove = remove_moderator.removeRatio(1/gas_pockets) var/turf/local = pick(around_turfs) local.assume_air(remove) loc.assume_air(moderator_internal) @@ -562,7 +562,7 @@ return part /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/spill_gases(obj/origin, datum/gas_mixture/target_mix, ratio) - var/datum/gas_mixture/remove_mixture = target_mix.remove_ratio(ratio) + var/datum/gas_mixture/remove_mixture = target_mix.removeRatio(ratio) var/turf/origin_turf = origin.loc if(!origin_turf) return @@ -573,12 +573,12 @@ if (cracked_part) // We have an existing crack var/leak_rate - if (moderator_internal.return_pressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) + if (moderator_internal.returnPressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) // Not high pressure, but can still leak if (!prob(HYPERTORUS_WEAK_SPILL_CHANCE)) return leak_rate = HYPERTORUS_WEAK_SPILL_RATE - else if (moderator_internal.return_pressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) + else if (moderator_internal.returnPressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) // Lots of gas in here, out we go leak_rate = HYPERTORUS_MEDIUM_SPILL_RATE else @@ -587,13 +587,13 @@ spill_gases(cracked_part, moderator_internal, ratio = 1 - (1 - leak_rate) ** delta_time) return - if (moderator_internal.total_moles() < HYPERTORUS_HYPERCRITICAL_MOLES) + if (moderator_internal.getMoles() < HYPERTORUS_HYPERCRITICAL_MOLES) return cracked_part = create_crack() // See if we do anything in the initial rupture - if (moderator_internal.return_pressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) + if (moderator_internal.returnPressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) return - if (moderator_internal.return_pressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) + if (moderator_internal.returnPressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) // Medium explosion on initial rupture explosion( origin = cracked_part, diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 261a0c80e52..920e74f2daf 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -144,17 +144,17 @@ if(internal.temperature >= (median_temperature * MIN_DEVIATION_RATE) && internal.temperature <= (median_temperature * MAX_DEVIATION_RATE)) quality_loss = max(quality_loss - progress_amount_to_quality, -85) - internal.temperature = max(internal.temperature + (selected_recipe.energy_release / internal.heat_capacity()), TCMB) + internal.temperature = max(internal.temperature + (selected_recipe.energy_release / internal.getHeatCapacity()), TCMB) update_parents() ///Conduction between the internal gasmix and the moderating (cooling/heating) gasmix. /obj/machinery/atmospherics/components/binary/crystallizer/proc/heat_conduction() var/datum/gas_mixture/cooling_port = airs[1] - if(cooling_port.total_moles() > MINIMUM_MOLE_COUNT) - if(internal.total_moles() > 0) + if(cooling_port.getMoles() > MINIMUM_MOLE_COUNT) + if(internal.getMoles() > 0) var/coolant_temperature_delta = cooling_port.temperature - internal.temperature - var/cooling_heat_capacity = cooling_port.heat_capacity() - var/internal_heat_capacity = internal.heat_capacity() + var/cooling_heat_capacity = cooling_port.getHeatCapacity() + var/internal_heat_capacity = internal.getHeatCapacity() var/cooling_heat_amount = HIGH_CONDUCTIVITY_RATIO * coolant_temperature_delta * (cooling_heat_capacity * internal_heat_capacity / (cooling_heat_capacity + internal_heat_capacity)) cooling_port.temperature = max(cooling_port.temperature - cooling_heat_amount / cooling_heat_capacity, TCMB) internal.temperature = max(internal.temperature + cooling_heat_amount / internal_heat_capacity, TCMB) @@ -169,7 +169,7 @@ ///Removes the gases from the internal gasmix when the recipe is changed /obj/machinery/atmospherics/components/binary/crystallizer/proc/dump_gases() - var/datum/gas_mixture/remove = internal.remove(internal.total_moles()) + var/datum/gas_mixture/remove = internal.remove(internal.getMoles()) airs[2].merge(remove) internal.garbage_collect() @@ -179,7 +179,7 @@ inject_gases() - if(!internal.total_moles()) + if(!internal.getMoles()) return heat_conduction() @@ -266,7 +266,7 @@ data["selected"] = "" var/list/internal_gas_data = list() - if(internal.total_moles()) + if(internal.getMoles()) for(var/gasid in internal.gases) internal_gas_data.Add(list(list( "name"= internal.gases[gasid][GAS_META][META_GAS_NAME], @@ -294,7 +294,7 @@ data["requirements"] = requirements.Join("\n") var/temperature - if(internal.total_moles()) + if(internal.getMoles()) temperature = internal.temperature else temperature = 0 @@ -316,7 +316,7 @@ selected_recipe = null var/recipe_name = "nothing" var/datum/gas_recipe/recipe = GLOB.gas_recipe_meta[params["mode"]] - if(internal.total_moles()) + if(internal.getMoles()) dump_gases() quality_loss = 0 progress_bar = 0 diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index b74318e3fd3..bc19f9aff61 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -136,13 +136,13 @@ var/pressure_limit = max_pressure * safety_margin var/moles_to_add = (pressure_limit * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.adjust_gas(gastype, moles_to_add) + air_contents.adjustGas(gastype, moles_to_add) /obj/machinery/atmospherics/components/tank/process_atmos() if(air_contents.react(src)) update_parents() - if(air_contents.return_pressure() > max_pressure) + if(air_contents.returnPressure() > max_pressure) take_damage(0.1, BRUTE, sound_effect = FALSE) if(prob(40)) playsound(src, pick(breaking_sounds), 30, vary = TRUE) @@ -216,7 +216,7 @@ return var/shares = length(merger.members) + length(leaving_members) - length(joining_members) for(var/obj/machinery/atmospherics/components/tank/leaver as anything in leaving_members) - var/datum/gas_mixture/gas_share = air_contents.remove_ratio(1 / shares--) + var/datum/gas_mixture/gas_share = air_contents.removeRatio(1 / shares--) air_contents.volume -= leaver.volume leaver.air_contents = gas_share leaver.update_appearance() @@ -268,7 +268,7 @@ window = image(icon, icon_state = "window-bg", layer = FLOAT_LAYER) var/list/new_underlays = list() - for(var/obj/effect/gas_overlay/gas as anything in air_contents.return_visuals()) + for(var/obj/effect/gas_overlay/gas as anything in air_contents.returnVisuals()) var/image/new_underlay = image(gas.icon, icon_state = gas.icon_state, layer = FLOAT_LAYER) new_underlay.filters = alpha_mask_filter(icon = icon(icon, icon_state = "window-bg")) new_underlays += new_underlay @@ -322,7 +322,7 @@ var/time_taken = 4 SECONDS var/unsafe = FALSE - var/internal_pressure = air_contents.return_pressure() - airmix.return_pressure() + var/internal_pressure = air_contents.returnPressure() - airmix.returnPressure() if(internal_pressure > 2 * ONE_ATMOSPHERE) time_taken *= 2 to_chat(user, span_warning("The tank seems to be pressurized, are you sure this is a good idea?")) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index a565712f11f..0b246d6d07f 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -79,16 +79,16 @@ // If the side output is full, we try to send the non-filtered gases to the main output port (air3). // Any gas that can't be moved due to its destination being too full is sent back to the input (air1). - var/side_output_full = air2.return_pressure() >= MAX_OUTPUT_PRESSURE - var/main_output_full = air3.return_pressure() >= MAX_OUTPUT_PRESSURE + var/side_output_full = air2.returnPressure() >= MAX_OUTPUT_PRESSURE + var/main_output_full = air3.returnPressure() >= MAX_OUTPUT_PRESSURE // If both output ports are full, there's nothing we can do. Don't bother removing anything from the input. if (side_output_full && main_output_full) return - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) + var/datum/gas_mixture/removed = air1.removeRatio(transfer_ratio) - if(!removed || !removed.total_moles()) + if(!removed || !removed.getMoles()) return var/filtering = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index ce8036ee05a..a2b3a906ef1 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -64,7 +64,7 @@ var/datum/gas_mixture/air3 = airs[3] - var/output_starting_pressure = air3.return_pressure() + var/output_starting_pressure = air3.returnPressure() if(output_starting_pressure >= target_pressure) //No need to mix if target is already full! @@ -76,8 +76,8 @@ var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0 var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0 - var/air1_moles = air1.total_moles() - var/air2_moles = air2.total_moles() + var/air1_moles = air1.getMoles() + var/air2_moles = air2.getMoles() if(!node2_concentration) if(air1.temperature <= 0) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 745176c1b7e..1084c6de03c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -37,7 +37,7 @@ update_appearance() /obj/machinery/atmospherics/components/unary/bluespace_sender/Destroy() - if(bluespace_network.total_moles()) + if(bluespace_network.getMoles()) var/turf/local_turf = get_turf(src) local_turf.assume_air(bluespace_network) return ..() @@ -63,7 +63,7 @@ return var/datum/gas_mixture/content = airs[1] - var/datum/gas_mixture/remove = content.remove_ratio(gas_transfer_rate) + var/datum/gas_mixture/remove = content.removeRatio(gas_transfer_rate) bluespace_network.merge(remove) bluespace_network.temperature = T20C update_parents() @@ -75,7 +75,7 @@ return if(default_change_direction_wrench(user, item)) return - if(item.tool_behaviour == TOOL_CROWBAR && panel_open && bluespace_network.total_moles() > 0) + if(item.tool_behaviour == TOOL_CROWBAR && panel_open && bluespace_network.getMoles() > 0) say("WARNING - Bluespace network can contain hazardous gases, deconstruct with caution!") if(!do_after(user, 3 SECONDS, src)) return @@ -120,7 +120,7 @@ data["on"] = on data["gas_transfer_rate"] = gas_transfer_rate var/list/bluespace_gasdata = list() - if(bluespace_network.total_moles()) + if(bluespace_network.getMoles()) for(var/gas_id in bluespace_network.gases) bluespace_gasdata.Add(list(list( "name" = bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], @@ -170,8 +170,8 @@ . = TRUE if("retrieve") - if(bluespace_network.total_moles() > 0) - var/datum/gas_mixture/remove = bluespace_network.remove(bluespace_network.total_moles()) + if(bluespace_network.getMoles() > 0) + var/datum/gas_mixture/remove = bluespace_network.remove(bluespace_network.getMoles()) airs[1].merge(remove) update_parents() bluespace_network.garbage_collect() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index f7214b4d203..470087c5e84 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -272,7 +272,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/datum/gas_mixture/air1 = airs[1] - if(air1.total_moles() > CRYO_MIN_GAS_MOLES) + if(air1.getMoles() > CRYO_MIN_GAS_MOLES) if(beaker) beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * delta_time, efficiency * CRYO_MULTIPLY_FACTOR, methods = VAPOR) // Transfer reagents. consume_gas = TRUE @@ -287,7 +287,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/datum/gas_mixture/air1 = airs[1] /* PARIAH EDIT REMOVAL - HUGBOX BARGAGE - if(!nodes[1] || !airs[1] || !air1.gas.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. + if(!nodes[1] || !airs[1] || !air1.gas.len || air1.getMoles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. var/msg = "Insufficient cryogenic gas, shutting down." radio.talk_into(src, msg, radio_channel) set_on(FALSE) @@ -304,7 +304,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics cold_protection = H.get_cold_protection(air1.temperature) if(abs(temperature_delta) > 1) - var/air_heat_capacity = air1.heat_capacity() + var/air_heat_capacity = air1.getHeatCapacity() var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) @@ -327,7 +327,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics return null var/datum/gas_mixture/air1 = airs[1] var/breath_percentage = breath_request / air1.volume - return air1.remove(air1.total_moles() * breath_percentage) + return air1.remove(air1.getMoles() * breath_percentage) /obj/machinery/atmospherics/components/unary/cryo_cell/assume_air(datum/gas_mixture/giver) airs[1].merge(giver) @@ -539,10 +539,10 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics /obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() return FALSE // you can't see the pipe network when inside a cryo cell. -/obj/machinery/atmospherics/components/unary/cryo_cell/return_temperature() +/obj/machinery/atmospherics/components/unary/cryo_cell/getTemperature() var/datum/gas_mixture/G = airs[1] - if(G.total_moles() > 10) + if(G.getMoles() > 10) return G.temperature return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 887bd167a35..21bfb75214a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -62,8 +62,8 @@ var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/partnerair_contents = partner.airs[1] - var/air_heat_capacity = air_contents.heat_capacity() - var/other_air_heat_capacity = partnerair_contents.heat_capacity() + var/air_heat_capacity = air_contents.getHeatCapacity() + var/other_air_heat_capacity = partnerair_contents.getHeatCapacity() var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity var/old_temperature = air_contents.temperature diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 2b29c650fc3..5cad9c733b3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -55,7 +55,7 @@ var/datum/gas_mixture/air_contents = airs[1] if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure() * volume_rate) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = (air_contents.returnPressure() * volume_rate) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) if(!transfer_moles) return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 4ce799398aa..5823dbe390a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -143,10 +143,10 @@ // The gas we want to cool/heat var/datum/gas_mixture/port = airs[1] - if(!port.total_moles()) // Nothing to cool? go home lad + if(!port.getMoles()) // Nothing to cool? go home lad return - var/port_capacity = port.heat_capacity() + var/port_capacity = port.getHeatCapacity() // The difference between target and what we need to heat/cool. Positive if heating, negative if cooling. var/temperature_target_delta = target_temperature - port.temperature @@ -269,7 +269,7 @@ var/datum/gas_mixture/port = airs[1] data["temperature"] = port.temperature - data["pressure"] = port.return_pressure() + data["pressure"] = port.returnPressure() return data /obj/machinery/atmospherics/components/unary/thermomachine/ui_act(action, params) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 8a25fd86da3..b616ffb70c9 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -106,7 +106,7 @@ return var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/environment = us.return_air() - var/environment_pressure = environment.return_pressure() + var/environment_pressure = environment.returnPressure() if(pump_direction & RELEASING) // internal -> external var/pressure_delta = 10000 @@ -114,14 +114,14 @@ if(pressure_checks&EXT_BOUND) pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) if(pressure_checks&INT_BOUND) - pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) + pressure_delta = min(pressure_delta, (air_contents.returnPressure() - internal_pressure_bound)) if(pressure_delta > 0) if(air_contents.temperature > 0) var/transfer_moles = (pressure_delta * environment.volume) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - if(!removed || !removed.total_moles()) + if(!removed || !removed.getMoles()) return loc.assume_air(removed) @@ -132,14 +132,14 @@ if(pressure_checks&EXT_BOUND) pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) if(pressure_checks&INT_BOUND) - pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) + pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.returnPressure())) if(pressure_delta > 0 && environment.temperature > 0) var/transfer_moles = (pressure_delta * air_contents.volume) / (environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if(!removed || !removed.total_moles()) //No venting from space 4head + if(!removed || !removed.getMoles()) //No venting from space 4head return air_contents.merge(removed) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index debb3bffdcf..977134d2fda 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -226,7 +226,7 @@ var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/air_contents = airs[1] - if(air_contents.return_pressure() >= 50 * ONE_ATMOSPHERE) + if(air_contents.returnPressure() >= 50 * ONE_ATMOSPHERE) return FALSE if(scrubbing == SCRUBBING) @@ -236,7 +236,7 @@ filtered_out.temperature = environment.temperature var/total_moles_to_remove = 0 - for(var/gas in filter_types & environment.get_gases()) + for(var/gas in filter_types & environment.getGases()) total_moles_to_remove += environment.gas[gas] if(total_moles_to_remove == 0)//sometimes this gets non gc'd values @@ -254,7 +254,7 @@ else //Just siphoning all air - var/transfer_moles = environment.total_moles() * (volume_rate / environment.volume) + var/transfer_moles = environment.getMoles() * (volume_rate / environment.volume) var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 964e364ff77..6e9098c571c 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -182,12 +182,12 @@ for(var/obj/machinery/atmospherics/pipe/member in members) member.air_temporary = new member.air_temporary.volume = member.volume - member.air_temporary.copy_from(air, member.volume / air.volume) + member.air_temporary.copyFrom(air, member.volume / air.volume) member.air_temporary.temperature = air.temperature /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) - var/total_heat_capacity = air.heat_capacity() + var/total_heat_capacity = air.getHeatCapacity() var/partial_heat_capacity = total_heat_capacity * (share_volume / air.volume) var/target_temperature var/target_heat_capacity @@ -250,10 +250,10 @@ var/list/total_gas = list() for(var/datum/gas_mixture/gasmix in gases) total_volume += gasmix.volume - var/temp_heatcap = gasmix.heat_capacity() + var/temp_heatcap = gasmix.getHeatCapacity() total_thermal_energy += gasmix.temperature * temp_heatcap total_heat_capacity += temp_heatcap - for(var/g in gasmix.get_gases()) + for(var/g in gasmix.getGases()) total_gas[g] += gasmix.gas[g] if(total_volume > 0) @@ -263,13 +263,13 @@ //Calculate temperature if(total_heat_capacity > 0) combined.temperature = total_thermal_energy / total_heat_capacity - combined.update_values() + combined.updateValues() //Allow for reactions combined.react() //Average out the gases - for(var/g in combined.get_gases()) + for(var/g in combined.getGases()) combined.gas[g] /= total_volume //Update individual gas_mixtures diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 12d1c0cc355..c32aff0eb6d 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -60,7 +60,7 @@ icon_state = "meter0" return FALSE - var/env_pressure = pipe_air.return_pressure() + var/env_pressure = pipe_air.returnPressure() if(env_pressure <= 0.15 * ONE_ATMOSPHERE) icon_state = "meter0" else if(env_pressure <= 1.8 * ONE_ATMOSPHERE) @@ -106,7 +106,7 @@ if (target) var/datum/gas_mixture/pipe_air = target.return_air() if(pipe_air) - . = "The pressure gauge reads [round(pipe_air.return_pressure(), 0.01)] kPa; [round(pipe_air.temperature,0.01)] K ([round(pipe_air.temperature-T0C,0.01)]°C)." + . = "The pressure gauge reads [round(pipe_air.returnPressure(), 0.01)] kPa; [round(pipe_air.temperature,0.01)] K ([round(pipe_air.temperature-T0C,0.01)]°C)." else . = "The sensor error light is blinking." else @@ -178,7 +178,7 @@ if(!connected_meter) return var/datum/gas_mixture/environment = connected_meter.target.return_air() - pressure.set_output(environment.return_pressure()) + pressure.set_output(environment.returnPressure()) net_temperature.set_output(environment.temperature) // TURF METER - REPORTS A TILE'S AIR CONTENTS diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 1fc59fac0dd..3ee63ba898e 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -56,11 +56,11 @@ set_broken(TRUE) return FALSE var/datum/gas_mixture/G = OT.return_air() - if(G.return_pressure() > (max_ext_kpa - ((spawn_mol*spawn_temp*R_IDEAL_GAS_EQUATION)/(CELL_VOLUME)))) + if(G.returnPressure() > (max_ext_kpa - ((spawn_mol*spawn_temp*R_IDEAL_GAS_EQUATION)/(CELL_VOLUME)))) broken_message = span_boldwarning("EXTERNAL PRESSURE OVER THRESHOLD") set_broken(TRUE) return FALSE - if(G.total_moles() > max_ext_mol) + if(G.getMoles() > max_ext_mol) broken_message = span_boldwarning("EXTERNAL AIR CONCENTRATION OVER THRESHOLD") set_broken(TRUE) return FALSE @@ -84,7 +84,7 @@ active_power_usage = idle_power_usage var/turf/T = get_turf(src) var/datum/gas_mixture/G = T.return_air() - var/P = G.return_pressure() + var/P = G.returnPressure() switch(power_draw) if(GASMINER_POWER_NONE) update_use_power(ACTIVE_POWER_USE, 0) @@ -134,7 +134,7 @@ if(!isopenturf(O)) return FALSE var/datum/gas_mixture/merger = new - merger.adjust_gas_temp(spawn_id, spawn_mol * delta_time, spawn_temp) + merger.adjustGasWithTemp(spawn_id, spawn_mol * delta_time, spawn_temp) O.assume_air(merger) /obj/machinery/atmospherics/miner/attack_ai(mob/living/silicon/user) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 373689d9e13..d63ff0b2e24 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -39,7 +39,7 @@ //heatup/cooldown any mobs buckled to ourselves based on our temperature if(has_buckled_mobs()) - var/hc = pipe_air.heat_capacity() + var/hc = pipe_air.getHeatCapacity() var/mob/living/heat_source = buckled_mobs[1] //Best guess-estimate of the total bodytemperature of all the mobs, since they share the same environment it's ~ok~ to guess like this var/avg_temp = (pipe_air.temperature * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0)) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index a2c111360e8..64b540ecd1a 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -101,7 +101,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) internal_cell = new /obj/item/stock_parts/cell/high(src) if(existing_mixture) - air_contents.copy_from(existing_mixture) + air_contents.copyFrom(existing_mixture) else create_gas() @@ -310,8 +310,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) greyscale_colors = "#9fba6c#3d4680" /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() - air_contents.adjust_gas(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - air_contents.adjust_gas(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjustGas(GAS_OXYGEN, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjustGas(GAS_N2O, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSairmachines.start_processing_machine(src) /** @@ -363,12 +363,12 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return if(starter_temp) air_contents.temperature = starter_temp - air_contents.adjust_gas(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjustGas(gas_type,(maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.adjust_gas(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) - air_contents.adjust_gas(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjustGas(GAS_OXYGEN, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjustGas(GAS_NITROGEN, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSairmachines.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon_state() @@ -395,7 +395,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(connected_port) . += mutable_appearance(canister_overlay_file, "can-connector") - var/air_pressure = air_contents.return_pressure() + var/air_pressure = air_contents.returnPressure() switch(air_pressure) if((40 * ONE_ATMOSPHERE) to INFINITY) @@ -427,7 +427,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) cut_overlay(window) window = image(icon, icon_state="window-base", layer=FLOAT_LAYER) var/list/window_overlays = list() - /*for(var/visual in air_contents.return_visuals()) + /*for(var/visual in air_contents.returnVisuals()) var/image/new_visual = image(visual, layer=FLOAT_LAYER) new_visual.filters = alpha_filter window_overlays += new_visual*/ @@ -492,7 +492,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(!I.tool_start_check(user, amount=0)) return TRUE - var/pressure = air_contents.return_pressure() + var/pressure = air_contents.returnPressure() if(pressure > 300) to_chat(user, span_alert("The pressure gauge on [src] indicates a high pressure inside... maybe you want to reconsider?")) message_admins("[src] deconstructed by [ADMIN_LOOKUPFLW(user)]") @@ -543,7 +543,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) */ /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() - var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) + var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.getMoles()) var/turf/T = get_turf(src) T.assume_air(expelled_gas) @@ -572,8 +572,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/process(delta_time) - var/our_pressure = air_contents.return_pressure() - var/our_temperature = air_contents.return_temperature() + var/our_pressure = air_contents.returnPressure() + var/our_temperature = air_contents.getTemperature() protected_contents = FALSE if(shielding_powered) @@ -608,7 +608,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) else environment = location.return_air() - var/env_pressure = environment.return_pressure() + var/env_pressure = environment.returnPressure() var/pressure_delta = release_pressure - env_pressure if((air_contents.temperature > 0) && (pressure_delta > 0)) @@ -619,8 +619,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) air_contents.react() - var/our_pressure = air_contents.return_pressure() - var/our_temperature = air_contents.return_temperature() + var/our_pressure = air_contents.returnPressure() + var/our_temperature = air_contents.getTemperature() ///function used to check the limit of the canisters and also set the amount of damage that the canister can receive, if the heat and pressure are way higher than the limit the more damage will be done if(!protected_contents && (our_temperature > heat_limit || our_pressure > pressure_limit)) @@ -650,7 +650,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/ui_data() . = list( "portConnected" = !!connected_port, - "tankPressure" = round(air_contents.return_pressure()), + "tankPressure" = round(air_contents.returnPressure()), "releasePressure" = round(release_pressure), "valveOpen" = !!valve_open, "isPrototype" = !!prototype, @@ -673,7 +673,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . += list( "holdingTank" = list( "name" = holding.name, - "tankPressure" = round(holding_mix.return_pressure()) + "tankPressure" = round(holding_mix.returnPressure()) ) ) . += list( @@ -741,7 +741,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(!holding) var/list/gaseslog = list() //list for logging all gases in canister for(var/gas in air_contents.gas) - gaseslog[xgm_gas_data.name[gas]] = air_contents.get_gas(gas) //adds gases to gaseslog + gaseslog[xgm_gas_data.name[gas]] = air_contents.getGroupGas(gas) //adds gases to gaseslog if(!(xgm_gas_data.flags[gas] & XGM_GAS_CONTAMINANT|XGM_GAS_FUEL)) continue danger = TRUE //at least 1 danger gas diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 73915fb4ede..3d1372c44e9 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -44,8 +44,8 @@ . += "siphon-connector" /obj/machinery/portable_atmospherics/pump/process_atmos() - var/pressure = air_contents.return_pressure() - var/temperature = air_contents.return_temperature() + var/pressure = air_contents.returnPressure() + var/temperature = air_contents.getTemperature() ///function used to check the limit of the pumps and also set the amount of damage that the pump can receive, if the heat and pressure are way higher than the limit the more damage will be done if(temperature > heat_limit || pressure > pressure_limit) take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit), 5, 50), BURN, 0) @@ -68,11 +68,11 @@ environment = local_turf.return_air() if(direction == PUMP_OUT) - pressure_delta = target_pressure - environment.return_pressure() + pressure_delta = target_pressure - environment.returnPressure() output_volume = environment.volume * environment.group_multiplier air_temperature = environment.temperature? environment.temperature : air_contents.temperature else - pressure_delta = environment.return_pressure() - target_pressure + pressure_delta = environment.returnPressure() - target_pressure output_volume = air_contents.volume * air_contents.group_multiplier air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature @@ -124,7 +124,7 @@ data["on"] = on data["direction"] = direction == PUMP_IN ? TRUE : FALSE data["connected"] = connected_port ? TRUE : FALSE - data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["pressure"] = round(air_contents.returnPressure() ? air_contents.returnPressure() : 0) data["target_pressure"] = round(target_pressure ? target_pressure : 0) data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE) data["min_pressure"] = round(PUMP_MIN_PRESSURE) @@ -134,7 +134,7 @@ data["holding"] = list() data["holding"]["name"] = holding.name var/datum/gas_mixture/holding_mix = holding.return_air() - data["holding"]["pressure"] = round(holding_mix.return_pressure()) + data["holding"]["pressure"] = round(holding_mix.returnPressure()) else data["holding"] = null return data @@ -149,8 +149,8 @@ if(on) SSairmachines.start_processing_machine(src) if(on && !holding) - var/plasma = air_contents.get_gas(GAS_PLASMA) - var/n2o = air_contents.get_gas(GAS_N2O) + var/plasma = air_contents.getGroupGas(GAS_PLASMA) + var/n2o = air_contents.getGroupGas(GAS_N2O) if(n2o || plasma) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index ebf98047755..1bc15f5519b 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -44,8 +44,8 @@ . += "scrubber-connector" /obj/machinery/portable_atmospherics/scrubber/process_atmos() - var/pressure = air_contents.return_pressure() - var/temperature = air_contents.return_temperature() + var/pressure = air_contents.returnPressure() + var/temperature = air_contents.getTemperature() ///function used to check the limit of the scrubbers and also set the amount of damage that the scrubber can receive, if the heat and pressure are way higher than the limit the more damage will be done if(temperature > heat_limit || pressure > pressure_limit) take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit), 5, 50), BURN, 0) @@ -69,7 +69,7 @@ * * mixture: the gas mixture to be scrubbed */ /obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture) - if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) + if(air_contents.returnPressure() >= overpressure_m * ONE_ATMOSPHERE) return var/transfer_moles = min(1, volume_rate/mixture.volume)*mixture.total_moles @@ -106,7 +106,7 @@ var/data = list() data["on"] = on data["connected"] = connected_port ? 1 : 0 - data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["pressure"] = round(air_contents.returnPressure() ? air_contents.returnPressure() : 0) data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() @@ -117,7 +117,7 @@ data["holding"] = list() data["holding"]["name"] = holding.name var/datum/gas_mixture/holding_mix = holding.return_air() - data["holding"]["pressure"] = round(holding_mix.return_pressure()) + data["holding"]["pressure"] = round(holding_mix.returnPressure()) else data["holding"] = null return data diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 4ed14e40d11..29a349c598f 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -11,9 +11,9 @@ return FALSE var/obj/item/tank/T = O var/datum/gas_mixture/our_mix = T.return_air() - if(!our_mix.get_gas(gas_type)) + if(!our_mix.getGroupGas(gas_type)) return FALSE - return our_mix.get_gas(gas_type) >= moles_required + return our_mix.getGroupGas(gas_type) >= moles_required /datum/bounty/item/engineering/gas/nitrium_tank name = "Full Tank of Nitrium" diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index cc0948b1902..2d4c4b227f8 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -109,8 +109,8 @@ var/list/gases_to_check = GLOB.all_gases for(var/gasID in gases_to_check) - if(canister_mix.get_gas(gasID) > 0) - worth += get_gas_value(gasID, canister_mix.get_gas(gasID)) + if(canister_mix.getGroupGas(gasID) > 0) + worth += get_gas_value(gasID, canister_mix.getGroupGas(gasID)) return worth diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index 6aa40cb46c2..ff59a4f8163 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -56,27 +56,27 @@ for(var/gas_id in breath.gas) if(gas_id in high_filtering_gases) - if(breath.get_gas(gas_id) > HIGH_FILTERING_MOLES) - breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.getGroupGas(gas_id) > HIGH_FILTERING_MOLES) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.5 continue - breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.05 continue if(gas_id in mid_filtering_gases) - if(breath.get_gas(gas_id) > MID_FILTERING_MOLES) - breath.get_gas(gas_id) = max(breath.get_gas(gas_id)- filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.getGroupGas(gas_id) > MID_FILTERING_MOLES) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id)- filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.75 continue - breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.15 continue if(gas_id in low_filtering_gases) - if(breath.get_gas(gas_id)> LOW_FILTERING_MOLES) - breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(breath.getGroupGas(gas_id)> LOW_FILTERING_MOLES) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 1 continue - breath.get_gas(gas_id) = max(breath.get_gas(gas_id) - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.5 continue diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 875a54903bd..330ab7a00bc 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -259,7 +259,7 @@ /obj/item/clothing/head/helmet/space/suicide_act(mob/living/carbon/user) var/datum/gas_mixture/environment = user.loc.return_air() - if(HAS_TRAIT(user, TRAIT_RESISTCOLD) || !environment || environment.return_temperature() >= user.get_body_temp_cold_damage_limit()) + if(HAS_TRAIT(user, TRAIT_RESISTCOLD) || !environment || environment.getTemperature() >= user.get_body_temp_cold_damage_limit()) user.visible_message(span_suicide("[user] is beating [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS user.say("You want proof? I'll give you proof! Here's proof of what'll happen to you if you stay here with your stuff!", forced = "space helmet suicide") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 09d4bbb71e7..e8a0cc199cd 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -265,9 +265,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.get_gas(GAS_OXYGEN)) + if(!gas_mix.getGroupGas(GAS_OXYGEN)) return - gas_mix.gas[GAS_OXYGEN] = max(gas_mix.get_gas(GAS_OXYGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.gas[GAS_OXYGEN] = max(gas_mix.getGroupGas(GAS_OXYGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/nitro_eater name = "Nitrogen consuming" @@ -279,9 +279,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.get_gas(GAS_NITROGEN)) + if(!gas_mix.getGroupGas(GAS_NITROGEN)) return - gas_mix.gas[GAS_NITROGEN] = max(gas_mix.get_gas(GAS_NITROGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.gas[GAS_NITROGEN] = max(gas_mix.getGroupGas(GAS_NITROGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -293,9 +293,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.get_gas(GAS_OXYGEN)) + if(!gas_mix.getGroupGas(GAS_OXYGEN)) return - gas_mix.gas[GAS_CO2] = max(gas_mix.get_gas(GAS_CO2) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.gas[GAS_CO2] = max(gas_mix.getGroupGas(GAS_CO2) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/plasma_eater name = "Plasma consuming" @@ -307,9 +307,9 @@ var/turf/open/floor/turf = holder.loc if(istype(turf)) var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.get_gas(GAS_PLASMA)) + if(!gas_mix.getGroupGas(GAS_PLASMA)) return - gas_mix.gas[GAS_PLASMA] = max(gas_mix.get_gas(GAS_PLASMA) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.gas[GAS_PLASMA] = max(gas_mix.getGroupGas(GAS_PLASMA) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) /datum/spacevine_mutation/thorns name = "Thorny" diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index e413cf7438c..56232c8058f 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -135,7 +135,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(V == "air") var/turf/open/O1 = B var/turf/open/O2 = T - O1.air.copy_from(O2.return_air()) + O1.air.copyFrom(O2.return_air()) continue B.vars[V] = T.vars[V] toupdate += B diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 225eef969fe..c0f632cb62a 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -622,11 +622,11 @@ return var/turf/tray_turf = get_turf(tray) - if(abs(ONE_ATMOSPHERE - tray_turf.return_air().return_pressure()) > (seed.potency / 10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos + if(abs(ONE_ATMOSPHERE - tray_turf.return_air().returnPressure()) > (seed.potency / 10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos return var/datum/gas_mixture/stank = new - stank.adjust_gas(GAS_METHANE, (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + stank.adjustGas(GAS_METHANE, (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * delta_time) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier tray_turf.assume_air(stank) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 67b89bd6b4c..dbfa064f262 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) - if(breath && breath.total_moles() > 0 && !sneaking) + if(breath && breath.getMoles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) ..() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 67fe76feebc..7408cbcc100 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -6,7 +6,7 @@ if(status_flags & GODMODE) return - if(!breath || (breath.total_moles() == 0)) + if(!breath || (breath.getMoles() == 0)) //Aliens breathe in vaccuum return 0 @@ -15,23 +15,23 @@ var/plasma_used = 0 var/plas_detect_threshold = 0.02 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + var/breath_pressure = (breath.getMoles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME //Partial pressure of the plasma in our breath - var/Plasma_pp = (breath.get_gas(GAS_PLASMA)/breath.total_moles())*breath_pressure + var/Plasma_pp = (breath.getGroupGas(GAS_PLASMA)/breath.getMoles())*breath_pressure if(Plasma_pp > plas_detect_threshold) // Detect plasma in air - adjustPlasma(breath.get_gas(GAS_PLASMA)*250) + adjustPlasma(breath.getGroupGas(GAS_PLASMA)*250) throw_alert(ALERT_XENO_PLASMA, /atom/movable/screen/alert/alien_plas) - plasma_used = breath.get_gas(GAS_PLASMA) + plasma_used = breath.getGroupGas(GAS_PLASMA) else clear_alert(ALERT_XENO_PLASMA) //Breathe in plasma and out oxygen - breath.adjust_gas(GAS_PLASMA, -plasma_used) - breath.adjust_gas(GAS_OXYGEN, plasma_used) + breath.adjustGas(GAS_PLASMA, -plasma_used) + breath.adjustGas(GAS_OXYGEN, plasma_used) //BREATH TEMPERATURE handle_breath_temperature(breath) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b9248b8e037..acd58215ac5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -82,7 +82,7 @@ else . += "" . += "Internal Atmosphere Info: [internal.name]" - . += "Tank Pressure: [internal_air.return_pressure()]" + . += "Tank Pressure: [internal_air.returnPressure()]" . += "Distribution Pressure: [internal.distribute_pressure]" if(istype(wear_suit, /obj/item/clothing/suit/space)) var/obj/item/clothing/suit/space/S = wear_suit diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index f928edb7c68..36fd0e5e952 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1664,7 +1664,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /// Handle the air pressure of the environment /datum/species/proc/handle_environment_pressure(mob/living/carbon/human/H, datum/gas_mixture/environment, delta_time, times_fired) - var/pressure = environment.return_pressure() + var/pressure = environment.returnPressure() var/adjusted_pressure = H.calculate_affecting_pressure(pressure) // Set alerts and apply damage based on the amount of pressure diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 3b11d3b4818..056f6beac98 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -73,12 +73,12 @@ return if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves))) var/datum/gas_mixture/environment = H.loc.return_air() - if(environment?.total_moles()) + if(environment?.getMoles()) /*if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) if(H.on_fire && H.fire_stacks > 0) H.adjust_fire_stacks(-10 * delta_time)*/ if(!HAS_TRAIT(H, TRAIT_NOFIRE) && !HAS_TRAIT(H, TRAIT_NOSELFIGNITION)) - if(environment.has_gas(GAS_OXYGEN, 1)) //Same threshhold that extinguishes fire + if(environment.hasGas(GAS_OXYGEN, 1)) //Same threshhold that extinguishes fire H.adjust_fire_stacks(0.25 * delta_time) if(!H.on_fire && H.fire_stacks > 0) H.visible_message(span_danger("[H]'s body reacts with the atmosphere and bursts into flames!"),span_userdanger("Your body reacts with the atmosphere and bursts into flame!")) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4b1f085542e..a02a3b748fa 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -108,7 +108,7 @@ else if(isturf(loc)) //Breathe from loc as turf var/breath_moles = 0 if(environment) - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + breath_moles = environment.getMoles()*BREATH_PERCENTAGE breath = loc.remove_air(breath_moles) else //Breathe from loc as obj again @@ -128,12 +128,12 @@ // Little bit of sanity so we aren't trying to add 0.0000000001 units of CO2, and so we don't end up with 99999 units of CO2. if(reagent_amount >= 0.05) reagents.add_reagent(breathed_product, reagent_amount) - breath.adjust_gas(gasname, -breath.gas[gasname], update = 0) //update after + breath.adjustGas(gasname, -breath.gas[gasname], update = 0) //update after check_breath(breath) if(breath) - breath.update_values() + breath.updateValues() loc.assume_air(breath) /mob/living/carbon/proc/has_smoke_protection() @@ -200,8 +200,8 @@ oxygen_used = breath_gases[GAS_OXYGEN] clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - breath.adjust_gas(GAS_OXYGEN, -oxygen_used, update = 0) - breath.adjust_gas(GAS_CO2, oxygen_used, update = 0) + breath.adjustGas(GAS_OXYGEN, -oxygen_used, update = 0) + breath.adjustGas(GAS_CO2, oxygen_used, update = 0) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -250,7 +250,7 @@ //BZ (Facepunch port of their Agent B) /* if(breath_gases[/datum/gas/bz]) - var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.total_moles())*breath_pressure + var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.getMoles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) @@ -259,7 +259,7 @@ //NITRIUM /* if(breath_gases[/datum/gas/nitrium]) - var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.total_moles())*breath_pressure + var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.getMoles())*breath_pressure if(nitrium_partialpressure > 0.5) adjustFireLoss(nitrium_partialpressure * 0.15) if(nitrium_partialpressure > 5) @@ -267,12 +267,12 @@ //FREON if(breath_gases[/datum/gas/freon]) - var/freon_partialpressure = (breath_gases[/datum/gas/freon][MOLES]/breath.total_moles())*breath_pressure + var/freon_partialpressure = (breath_gases[/datum/gas/freon][MOLES]/breath.getMoles())*breath_pressure adjustFireLoss(freon_partialpressure * 0.25) //MIASMA if(breath_gases[/datum/gas/miasma]) - var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.total_moles())*breath_pressure + var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.getMoles())*breath_pressure if(prob(1 * miasma_partialpressure)) var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b7245d9b6f2..0b3de9b55b8 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ extinguish_mob() return TRUE //mob was put out, on_fire = FALSE via extinguish_mob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(!G.has_gas(GAS_OXYGEN, 1)) + if(!G.hasGas(GAS_OXYGEN, 1)) extinguish_mob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 10d312c653b..06038317da6 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1125,7 +1125,7 @@ var/loc_temp = environment ? environment.temperature : T0C if(isobj(loc)) var/obj/oloc = loc - var/obj_temp = oloc.return_temperature() + var/obj_temp = oloc.getTemperature() if(obj_temp != null) loc_temp = obj_temp else if(isspaceturf(get_turf(src))) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 48b9fdf8ca0..d79923f707c 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -39,7 +39,7 @@ /mob/living/proc/get_ear_protection() var/turf/current_turf = get_turf(src) var/datum/gas_mixture/environment = current_turf.return_air() - var/pressure = environment ? environment.return_pressure() : 0 + var/pressure = environment ? environment.returnPressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE) //space is empty return 1 return 0 diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index a2b6f06d765..a6a219116b3 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -263,7 +263,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( //No screams in space, unless you're next to someone. var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() - var/pressure = (environment)? environment.return_pressure() : 0 + var/pressure = (environment)? environment.returnPressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE && !HAS_TRAIT(H, TRAIT_SIGN_LANG)) message_range = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 2d48c3130f3..6e5873f385f 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -116,9 +116,9 @@ /mob/living/simple_animal/hostile/regalrat/handle_environment(datum/gas_mixture/environment) . = ..() - if(stat == DEAD || !environment || !environment.get_gas(GAS_METHANE)) + if(stat == DEAD || !environment || !environment.getGroupGas(GAS_METHANE)) return - var/miasma_percentage = environment.gas[GAS_METHANE] / environment.total_moles() + var/miasma_percentage = environment.gas[GAS_METHANE] / environment.getMoles() if(miasma_percentage>=0.25) heal_bodypart_damage(1) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index e9bcf6f4fc6..323c2eb6b3f 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -56,13 +56,13 @@ if(!is_tree || !isopenturf(loc)) return var/turf/open/T = src.loc - if(!T.air || !T.air.has_gas(GAS_CO2)) + if(!T.air || !T.air.hasGas(GAS_CO2)) return - var/co2 = T.air.get_gas(GAS_CO2) + var/co2 = T.air.getGroupGas(GAS_CO2) if(co2 > 0 && DT_PROB(13, delta_time)) var/amt = min(co2, 9) - T.air.adjust_gas(GAS_CO2, -amt) + T.air.adjustGas(GAS_CO2, -amt) T.atmos_spawn_air(GAS_OXYGEN, amt) /mob/living/simple_animal/hostile/tree/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 182d6f615c7..6396d572acd 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -319,10 +319,10 @@ if(ST.air) var/datum/gas_mixture/muhair = ST.return_air() - var/plas = muhair.get_gas(GAS_PLASMA) - var/oxy = muhair.get_gas(GAS_OXYGEN) - var/n2 = muhair.get_gas(GAS_NITROGEN) - var/co2 = muhair.get_gas(GAS_CO2) + var/plas = muhair.getGroupGas(GAS_PLASMA) + var/oxy = muhair.getGroupGas(GAS_OXYGEN) + var/n2 = muhair.getGroupGas(GAS_NITROGEN) + var/co2 = muhair.getGroupGas(GAS_CO2) if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 1e544408ae6..8a6246b8c5c 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -145,7 +145,7 @@ if(stat != DEAD) var/bz_percentage =0 if(environment.gases[/datum/gas/bz]) - bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles() + bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.getMoles() var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis switch(stat) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4f5444e59dc..d9ec4e9bb9e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -127,8 +127,8 @@ var/t = "[span_notice("Coordinates: [x],[y] ")]\n" t += "[span_danger("Temperature: [environment.temperature] ")]\n" for(var/id in environment.gas) - if(!environment.get_gas(id)) - t+="[span_notice("[xgm_gas_data.name[environment.gas]]: [environment.get_gas(id)] ")]\n" + if(!environment.getGroupGas(id)) + t+="[span_notice("[xgm_gas_data.name[environment.gas]]: [environment.getGroupGas(id)] ")]\n" to_chat(usr, t) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index c4fb0c2c9df..8cca877253d 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -53,8 +53,8 @@ if(cold_air && hot_air) - var/cold_air_heat_capacity = cold_air.heat_capacity() - var/hot_air_heat_capacity = hot_air.heat_capacity() + var/cold_air_heat_capacity = cold_air.getHeatCapacity() + var/hot_air_heat_capacity = hot_air.getHeatCapacity() var/delta_temperature = hot_air.temperature - cold_air.temperature @@ -116,11 +116,11 @@ t += "<B><font color='blue'>Cold loop</font></B><BR>" t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K<BR>" - t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa<BR>" + t += "Pressure Inlet: [round(cold_circ_air2.returnPressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.returnPressure(), 0.1)] kPa<BR>" t += "<B><font color='red'>Hot loop</font></B><BR>" t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K<BR>" - t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa<BR>" + t += "Pressure Inlet: [round(hot_circ_air2.returnPressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.returnPressure(), 0.1)] kPa<BR>" t += "</div>" else if(!hot_circ && cold_circ) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index f45a52590a7..2a40addf9d9 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -331,7 +331,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) data["SM_integrity"] = get_integrity_percent() data["SM_power"] = power data["SM_ambienttemp"] = air.temperature - data["SM_ambientpressure"] = air.return_pressure() + data["SM_ambientpressure"] = air.returnPressure() data["SM_bad_moles_amount"] = MOLE_PENALTY_THRESHOLD / gasefficency data["SM_moles"] = 0 data["SM_uid"] = uid @@ -340,12 +340,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/gasdata = list() - if(air.total_moles()) - data["SM_moles"] = air.total_moles() + if(air.getMoles()) + data["SM_moles"] = air.getMoles() for(var/gasid in air.gases) gasdata.Add(list(list( "name"= air.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = round(100*air.gases[gasid][MOLES]/air.total_moles(),0.01)))) + "amount" = round(100*air.gases[gasid][MOLES]/air.getMoles(),0.01)))) else for(var/gasid in air.gases) @@ -653,7 +653,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/turf/target_turf = get_turf(target) var/pressure = 1 if(target_turf?.return_air()) - pressure = max(1,target_turf.return_air().return_pressure()) + pressure = max(1,target_turf.return_air().returnPressure()) //We get our range with the strength of the zap and the pressure, the higher the former and the lower the latter the better var/new_range = clamp(zap_str / pressure * 10, 2, 7) var/zap_count = 1 diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index e5f7a0e98d1..fea9fa5303b 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -22,7 +22,7 @@ var/datum/gas_mixture/removed if(produces_gas) //Remove gas from surrounding area - removed = env.remove(gasefficency * env.total_moles()) + removed = env.remove(gasefficency * env.getMoles()) else // Pass all the gas related code an empty gas container removed = new() @@ -35,7 +35,7 @@ else psy_overlay = FALSE damage_archived = damage - if(!removed || !removed.total_moles() || isspaceturf(local_turf)) //we're in space or there is no gas to process + if(!removed || !removed.getMoles() || isspaceturf(local_turf)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage if(!istype(env, /datum/gas_mixture/immutable) && produces_gas && power) //There is no gas to process, but we are not in a space turf. Lets make them. @@ -113,7 +113,7 @@ //((((some value between 0.5 and 1 * temp - ((273.15 + 40) * some values between 1 and 10)) * some number between 0.25 and knock your socks off / 150) * 0.25 //Heat and mols account for each other, a lot of hot mols are more damaging then a few //Mols start to have a positive effect on damage after 350 - damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(clamp(removed.getMoles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) //Power only starts affecting damage when it is above 5000 damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0) //Molar count only starts affecting damage when it is above 1800 @@ -151,7 +151,7 @@ //calculating gas related values //Wanna know a secret? See that max() to zero? it's used for error checking. If we get a mol count in the negative, we'll get a divide by zero error //Old me, you're insane - combined_gas = max(removed.total_moles(), 0) + combined_gas = max(removed.getMoles(), 0) //This is more error prevention, according to all known laws of atmos, gas_mix.remove() should never make negative mol values. //But this is tg @@ -197,7 +197,7 @@ /obj/machinery/power/supermatter_crystal/proc/special_gases_interactions(datum/gas_mixture/env, datum/gas_mixture/removed) //Miasma is really just microscopic particulate. It gets consumed like anything else that touches the crystal. if(gas_comp[/datum/gas/miasma]) - var/miasma_pp = env.return_pressure() * gas_comp[/datum/gas/miasma] + var/miasma_pp = env.returnPressure() * gas_comp[/datum/gas/miasma] var/consumed_miasma = clamp(((miasma_pp - MIASMA_CONSUMPTION_PP) / (miasma_pp + MIASMA_PRESSURE_SCALING)) * (1 + (gasmix_power_ratio * MIASMA_GASMIX_SCALING)), MIASMA_CONSUMPTION_RATIO_MIN, MIASMA_CONSUMPTION_RATIO_MAX) consumed_miasma *= gas_comp[/datum/gas/miasma] * combined_gas if(consumed_miasma) @@ -206,7 +206,7 @@ //Let's say that the CO2 touches the SM surface and the radiation turns it into Pluoxium. if(gas_comp[/datum/gas/carbon_dioxide] && gas_comp[/datum/gas/oxygen]) - var/carbon_dioxide_pp = env.return_pressure() * gas_comp[/datum/gas/carbon_dioxide] + var/carbon_dioxide_pp = env.returnPressure() * gas_comp[/datum/gas/carbon_dioxide] var/consumed_carbon_dioxide = clamp(((carbon_dioxide_pp - CO2_CONSUMPTION_PP) / (carbon_dioxide_pp + CO2_PRESSURE_SCALING)), CO2_CONSUMPTION_RATIO_MIN, CO2_CONSUMPTION_RATIO_MAX) consumed_carbon_dioxide = min(consumed_carbon_dioxide * gas_comp[/datum/gas/carbon_dioxide] * combined_gas, removed.gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(0.5), removed.gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5)) if(consumed_carbon_dioxide) @@ -265,7 +265,7 @@ //(1 + (tritRad + pluoxDampen * bzDampen * o2Rad * plasmaRad / (10 - bzrads))) * freonbonus playsound(src, 'sound/weapons/emitter2.ogg', 70, TRUE) var/power_multiplier = max(0, (1 + (power_transmission_bonus / (10 - (gas_comp[/datum/gas/bz] * BZ_RADIOACTIVITY_MODIFIER)))) * freonbonus)// RadModBZ(500%) - var/pressure_multiplier = max((1 / ((env.return_pressure() ** pressure_bonus_curve_angle) + 1) * pressure_bonus_derived_steepness) + pressure_bonus_derived_constant, 1) + var/pressure_multiplier = max((1 / ((env.returnPressure() ** pressure_bonus_curve_angle) + 1) * pressure_bonus_derived_steepness) + pressure_bonus_derived_constant, 1) var/co2_power_increase = max(gas_comp[/datum/gas/carbon_dioxide] * 2, 1) supermatter_zap( zapstart = src, @@ -334,12 +334,12 @@ return var/range = 4 zap_cutoff = 1500 - if(removed && removed.return_pressure() > 0 && removed.return_temperature() > 0) + if(removed && removed.returnPressure() > 0 && removed.getTemperature() > 0) //You may be able to freeze the zapstate of the engine with good planning, we'll see - zap_cutoff = clamp(3000 - (power * (removed.total_moles()) / 10) / removed.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(3000 - (power * (removed.getMoles()) / 10) / removed.getTemperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details - range = clamp(power / removed.return_pressure() * 10, 2, 7) + range = clamp(power / removed.returnPressure() * 10, 2, 7) var/flags = ZAP_SUPERMATTER_FLAGS var/zap_count = 0 //Deal with power zaps diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 3aed2d1daa3..249263ed9ed 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -515,7 +515,7 @@ //the temperature and pressure rises up, you can regulate this to increase/decrease the amount of gas moved in. var/compressor_work = do_calculations(input_turf_mixture, compressor.machine_gasmix, regulated = TRUE) input_turf.//air_update_turf(TRUE) - var/compressor_pressure = max(compressor.machine_gasmix.return_pressure(), 0.01) + var/compressor_pressure = max(compressor.machine_gasmix.returnPressure(), 0.01) //the rotor moves the gases that expands from 1000 L to 3000 L, they cool down and both temperature and pressure lowers var/rotor_work = do_calculations(compressor.machine_gasmix, machine_gasmix, compressor_work) @@ -523,10 +523,10 @@ //the turbine expands the gases more from 3000 L to 6000 L, cooling them down further. var/turbine_work = do_calculations(machine_gasmix, turbine.machine_gasmix, abs(rotor_work)) - var/turbine_pressure = max(turbine.machine_gasmix.return_pressure(), 0.01) + var/turbine_pressure = max(turbine.machine_gasmix.returnPressure(), 0.01) //the total work done by the gas - var/work_done = turbine.machine_gasmix.total_moles() * R_IDEAL_GAS_EQUATION * turbine.machine_gasmix.temperature * log(compressor_pressure / turbine_pressure) + var/work_done = turbine.machine_gasmix.getMoles() * R_IDEAL_GAS_EQUATION * turbine.machine_gasmix.temperature * log(compressor_pressure / turbine_pressure) //removing the work needed to move the compressor but adding back the turbine work that is the one generating most of the power. work_done = max(work_done - compressor_work * TURBINE_COMPRESSOR_STATOR_INTERACTION_MULTIPLIER - turbine_work, 0) @@ -538,14 +538,14 @@ add_avail(produced_energy) - turbine.machine_gasmix.pump_gas_to(output_turf.air, turbine.machine_gasmix.return_pressure()) + turbine.machine_gasmix.pump_gas_to(output_turf.air, turbine.machine_gasmix.returnPressure()) output_turf.//air_update_turf(TRUE) /** * Handles all the calculations needed for the gases, work done, temperature increase/decrease */ /obj/machinery/power/turbine/core_rotor/proc/do_calculations(datum/gas_mixture/input_mix, datum/gas_mixture/output_mix, work_amount_to_remove, regulated = FALSE) - var/work_done = input_mix.total_moles() * R_IDEAL_GAS_EQUATION * input_mix.temperature * log((input_mix.volume * max(input_mix.return_pressure(), 0.01)) / (output_mix.volume * max(output_mix.return_pressure(), 0.01))) * TURBINE_WORK_CONVERSION_MULTIPLIER + var/work_done = input_mix.getMoles() * R_IDEAL_GAS_EQUATION * input_mix.temperature * log((input_mix.volume * max(input_mix.returnPressure(), 0.01)) / (output_mix.volume * max(output_mix.returnPressure(), 0.01))) * TURBINE_WORK_CONVERSION_MULTIPLIER if(work_amount_to_remove) work_done = work_done - work_amount_to_remove @@ -553,11 +553,11 @@ if(regulated) intake_size = intake_regulator - input_mix.pump_gas_to(output_mix, input_mix.return_pressure() * intake_size) - var/output_mix_heat_capacity = output_mix.heat_capacity() + input_mix.pump_gas_to(output_mix, input_mix.returnPressure() * intake_size) + var/output_mix_heat_capacity = output_mix.getHeatCapacity() if(!output_mix_heat_capacity) return 0 - output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * output_mix.total_moles() * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) + output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * output_mix.getMoles() * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) return work_done /obj/item/paper/guides/jobs/atmos/turbine diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a8bb76d18d7..663d084403e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -223,7 +223,7 @@ iter_reagent.on_merge(data, amount) if(reagtemp != cached_temp) - var/new_heat_capacity = heat_capacity() + var/new_heat_capacity = getHeatCapacity() if(new_heat_capacity) set_temperature(((old_heat_capacity * cached_temp) + (iter_reagent.specific_heat * amount * reagtemp)) / new_heat_capacity) else @@ -252,7 +252,7 @@ update_total() if(reagtemp != cached_temp) - var/new_heat_capacity = heat_capacity() + var/new_heat_capacity = getHeatCapacity() if(new_heat_capacity) set_temperature(((old_heat_capacity * cached_temp) + (new_reagent.specific_heat * amount * reagtemp)) / new_heat_capacity) else @@ -1359,7 +1359,7 @@ /// Returns the total heat capacity for all of the reagents currently in this holder. -/datum/reagents/proc/heat_capacity() +/datum/reagents/proc/getHeatCapacity() . = 0 var/list/cached_reagents = reagent_list //cache reagents for(var/datum/reagent/reagent in cached_reagents) @@ -1373,7 +1373,7 @@ * - max_temp: The maximum temperature that can be reached. */ /datum/reagents/proc/adjust_thermal_energy(delta_energy, min_temp = 2.7, max_temp = 1000) - var/heat_capacity = heat_capacity() + var/heat_capacity = getHeatCapacity() if(!heat_capacity) return // no div/0 please set_temperature(clamp(chem_temp + (delta_energy / heat_capacity), min_temp, max_temp)) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index db74f2a29f5..82f3c17d7c5 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -332,7 +332,7 @@ var/turf/open/exposed_open_turf = exposed_turf exposed_open_turf.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=100, wet_time_to_add=reac_volume SECONDS) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. var/temperature = exposed_open_turf.air.temperature - var/heat_capacity = exposed_open_turf.air.heat_capacity() + var/heat_capacity = exposed_open_turf.air.getHeatCapacity() exposed_open_turf.air.temperature = max(exposed_open_turf.air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit. if(reac_volume < 5) return @@ -478,7 +478,7 @@ exposed_turf.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) if(hotspot) - var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.total_moles()) + var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.getMoles()) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react(src) exposed_turf.assume_air(lowertemp) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index d97894d1462..94c4b71524e 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -78,7 +78,7 @@ //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it var/turf/L = loc var/datum/gas_mixture/env = new - env.copy_from(L.return_air()) + env.copyFrom(L.return_air()) var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) air_contents.merge(removed) trunk_check() @@ -314,7 +314,7 @@ data["full_pressure"] = full_pressure data["pressure_charging"] = pressure_charging data["panel_open"] = panel_open - data["per"] = CLAMP01(air_contents.return_pressure() / (SEND_PRESSURE)) + data["per"] = CLAMP01(air_contents.returnPressure() / (SEND_PRESSURE)) data["isai"] = isAI(user) return data @@ -416,7 +416,7 @@ do_flush() flush_count = 0 - if(flush && air_contents.return_pressure() >= SEND_PRESSURE) // flush can happen even without power + if(flush && air_contents.returnPressure() >= SEND_PRESSURE) // flush can happen even without power do_flush() if(machine_stat & NOPOWER) // won't charge if no power @@ -435,7 +435,7 @@ var/datum/gas_mixture/env = L.return_air() if(!env.temperature) return - var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure() + var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.returnPressure() var/transfer_moles = 0.05 * delta_time * (pressure_delta*air_contents.volume)/(env.temperature * R_IDEAL_GAS_EQUATION) @@ -445,7 +445,7 @@ //air_update_turf(FALSE, FALSE) //if full enough, switch to ready mode - if(air_contents.return_pressure() >= SEND_PRESSURE) + if(air_contents.returnPressure() >= SEND_PRESSURE) full_pressure = TRUE pressure_charging = FALSE update_appearance() diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 56c573be631..e908d09ebf9 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -368,10 +368,10 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message(span_warning("[src] malfunctions, melting [exp_on] and leaking hot air!")) var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() + var/transfer_moles = 0.25 * env.getMoles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) - var/heat_capacity = removed.heat_capacity() + var/heat_capacity = removed.getHeatCapacity() if(heat_capacity == 0 || heat_capacity == null) heat_capacity = 1 removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000) @@ -414,10 +414,10 @@ else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message(span_warning("[src] malfunctions, shattering [exp_on] and leaking cold air!")) var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() + var/transfer_moles = 0.25 * env.getMoles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) - var/heat_capacity = removed.heat_capacity() + var/heat_capacity = removed.getHeatCapacity() if(heat_capacity == 0 || heat_capacity == null) heat_capacity = 1 removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 70c785dd5a7..3ace3f14b5c 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -125,22 +125,22 @@ /// Glorified volume pump. /obj/machinery/atmospherics/components/binary/tank_compressor/process_atmos() var/datum/gas_mixture/input_air = airs[2] - if(!input_air?.total_moles() || !active || !transfer_rate || !inserted_tank) + if(!input_air?.getMoles() || !active || !transfer_rate || !inserted_tank) return var/datum/gas_mixture/tank_air = inserted_tank.return_air() if(!tank_air) return - if(input_air.return_pressure() < 0.01 || tank_air.return_pressure() > TANK_COMPRESSOR_PRESSURE_LIMIT) + if(input_air.returnPressure() < 0.01 || tank_air.returnPressure() > TANK_COMPRESSOR_PRESSURE_LIMIT) return /// Prevent pumping if tank is taking damage but still below pressure limit. Here to prevent exploiting the buffer system. - if((inserted_tank.leaking) && (tank_air.return_pressure() <= TANK_LEAK_PRESSURE)) + if((inserted_tank.leaking) && (tank_air.returnPressure() <= TANK_LEAK_PRESSURE)) active = FALSE return - var/datum/gas_mixture/removed = input_air.remove_ratio(transfer_rate / input_air.volume) + var/datum/gas_mixture/removed = input_air.removeRatio(transfer_rate / input_air.volume) if(!removed) return @@ -160,7 +160,7 @@ return flush_buffer() var/datum/gas_mixture/tank_air = inserted_tank.return_air() - last_recorded_pressure = tank_air.return_pressure() + last_recorded_pressure = tank_air.returnPressure() active = FALSE return @@ -176,13 +176,13 @@ * Mole requirements in experiments are tracked by buffer data. */ /obj/machinery/atmospherics/components/binary/tank_compressor/proc/flush_buffer() - if(!leaked_gas_buffer.total_moles()) + if(!leaked_gas_buffer.getMoles()) return - if(leaked_gas_buffer.total_moles() > SIGNIFICANT_AMOUNT_OF_MOLES) + if(leaked_gas_buffer.getMoles() > SIGNIFICANT_AMOUNT_OF_MOLES) record_data() else say("Buffer data discarded. Required moles for storage: [SIGNIFICANT_AMOUNT_OF_MOLES] moles.") - var/datum/gas_mixture/removed = leaked_gas_buffer.remove_ratio(1) + var/datum/gas_mixture/removed = leaked_gas_buffer.removeRatio(1) airs[1].merge(removed) say("Gas stored in buffer flushed to output port. Compressor ready to start the next experiment.") @@ -229,7 +229,7 @@ if(!inserted_tank) return FALSE var/datum/gas_mixture/tank_air = inserted_tank.return_air() - if(!tank_air.return_pressure() >= PUMP_MAX_PRESSURE) + if(!tank_air.returnPressure() >= PUMP_MAX_PRESSURE) return FALSE flush_buffer() if(user) @@ -335,7 +335,7 @@ var/list/data = list() data["tankPresent"] = inserted_tank ? TRUE : FALSE var/datum/gas_mixture/tank_air = inserted_tank?.return_air() - data["tankPressure"] = tank_air?.return_pressure() + data["tankPressure"] = tank_air?.returnPressure() data["leaking"] = inserted_tank?.leaking data["active"] = active diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 4e277b433e7..4e42bcc2bdc 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -95,13 +95,13 @@ var/datum/gas_mixture/env = L.return_air() if(env.temperature < (heat_amt+T0C)) - var/transfer_moles = 0.25 * env.total_moles() + var/transfer_moles = 0.25 * env.getMoles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) - var/heat_capacity = removed.heat_capacity() + var/heat_capacity = removed.getHeatCapacity() if(heat_capacity == 0 || heat_capacity == null) heat_capacity = 1 removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 40b43cdc428..9406fc579a9 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -107,7 +107,7 @@ /obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure() for(var/I in SSjob.latejoin_trackers) var/turf/open/T = get_turf(I) - var/pressure = T.return_air().return_pressure() + var/pressure = T.return_air().returnPressure() if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check return TRUE return FALSE diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 7d3f569911a..ce365c53fe2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -212,7 +212,7 @@ // Priority 1: use air from environment. var/datum/gas_mixture/environment = owner_turf.return_air() - if(environment && environment.return_pressure() > 30) + if(environment && environment.returnPressure() > 30) ion_trail.generate_effect() return TRUE @@ -225,9 +225,9 @@ // Priority 3: use internals tank. var/datum/gas_mixture/internal_mix = owner.internal.return_air() - if(internal_mix && internal_mix.total_moles() > num) + if(internal_mix && internal_mix.getMoles() > num) var/datum/gas_mixture/removed = internal_mix.remove(num) - if(removed.total_moles() > 0.005) + if(removed.getMoles() > 0.005) owner_turf.assume_air(removed) ion_trail.generate_effect() return TRUE diff --git a/code/modules/surgery/organs/external/wings.dm b/code/modules/surgery/organs/external/wings.dm index bca39659054..594e1cdde5a 100644 --- a/code/modules/surgery/organs/external/wings.dm +++ b/code/modules/surgery/organs/external/wings.dm @@ -78,7 +78,7 @@ return FALSE var/datum/gas_mixture/environment = location.return_air() - if(environment?.return_pressure() < HAZARD_LOW_PRESSURE + 10) + if(environment?.returnPressure() < HAZARD_LOW_PRESSURE + 10) to_chat(human, span_warning("The atmosphere is too thin for you to fly!")) return FALSE else @@ -202,7 +202,7 @@ if(!isspaceturf(owner.loc) && !burnt) var/datum/gas_mixture/current = owner.loc.return_air() - if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible + if(current && (current.returnPressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible ADD_TRAIT(owner, TRAIT_FREE_FLOAT_MOVEMENT, src) return diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 1e181c59afa..7e12d528e46 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -125,10 +125,10 @@ var/plasma_moles = breath.gas[GAS_PLASMA] var/CO2_moles = breath.gas[GAS_CO2] - var/O2_pp = breath.get_breath_partial_pressure(O2_moles)//+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium][MOLES])) - var/N2_pp = breath.get_breath_partial_pressure(N2_moles) - var/Plasma_pp = breath.get_breath_partial_pressure(plasma_moles) - var/CO2_pp = breath.get_breath_partial_pressure(CO2_moles) + var/O2_pp = breath.getBreathPartialPressure(O2_moles)//+(8*breath.getBreathPartialPressure(breath_gases[/datum/gas/pluoxium][MOLES])) + var/N2_pp = breath.getBreathPartialPressure(N2_moles) + var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) + var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) //Vars for n2o and healium induced euphorias. var/n2o_euphoria = EUPHORIA_LAST_FLAG var/healium_euphoria = EUPHORIA_LAST_FLAG @@ -157,8 +157,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) //Exhale - breath.adjust_gas(GAS_OXYGEN, -gas_breathed) - breath.adjust_gas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_OXYGEN, -gas_breathed) + breath.adjustGas(GAS_CO2, gas_breathed) gas_breathed = 0 //-- Nitrogen --// @@ -185,8 +185,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_NITRO) //Exhale - breath.adjust_gas(GAS_NITROGEN, -gas_breathed) - breath.adjust_gas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_NITROGEN, -gas_breathed) + breath.adjustGas(GAS_CO2, gas_breathed) gas_breathed = 0 //-- CO2 --// @@ -222,8 +222,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_CO2) //Exhale - breath.adjust_gas(GAS_CO2, -gas_breathed) - breath.adjust_gas(GAS_OXYGEN, gas_breathed) + breath.adjustGas(GAS_CO2, -gas_breathed) + breath.adjustGas(GAS_OXYGEN, gas_breathed) gas_breathed = 0 @@ -252,8 +252,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_PLASMA) //Exhale - breath.adjust_gas(GAS_PLASMA, -gas_breathed) - breath.adjust_gas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_PLASMA, -gas_breathed) + breath.adjustGas(GAS_CO2, gas_breathed) gas_breathed = 0 @@ -262,8 +262,8 @@ if(breath) // If there's some other shit in the air lets deal with it here. // N2O - var/n2o_moles = breath.get_gas(GAS_N2O) - var/SA_pp = breath.get_breath_partial_pressure(n2o_moles) + var/n2o_moles = breath.getGroupGas(GAS_N2O) + var/SA_pp = breath.getBreathPartialPressure(n2o_moles) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) breather.Unconscious(60) // 60 gives them one second to wake up and run away a bit! @@ -281,7 +281,7 @@ /* // BZ - var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) + var/bz_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/bz][MOLES]) if(bz_pp > BZ_trip_balls_min) breather.hallucination += 10 breather.reagents.add_reagent(/datum/reagent/bz_metabolites,5) @@ -289,7 +289,7 @@ breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) // Tritium - var/trit_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/tritium][MOLES]) + var/trit_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/tritium][MOLES]) // If you're breathing in half an atmosphere of radioactive gas, you fucked up. if (trit_pp > tritium_irradiation_moles_min && SSradiation.can_irradiate_basic(breather)) var/lerp_scale = min(tritium_irradiation_moles_max, trit_pp - tritium_irradiation_moles_min) / (tritium_irradiation_moles_max - tritium_irradiation_moles_min) @@ -306,7 +306,7 @@ breath_gases[/datum/gas/tritium][MOLES] -= gas_breathed // Nitrium - var/nitrium_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrium][MOLES]) + var/nitrium_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/nitrium][MOLES]) if (prob(nitrium_pp) && nitrium_pp > 15) breather.adjustOrganLoss(ORGAN_SLOT_LUNGS, nitrium_pp * 0.1) to_chat(breather, "<span class='notice'>You feel a burning sensation in your chest</span>") @@ -321,7 +321,7 @@ breath_gases[/datum/gas/nitrium][MOLES] -= gas_breathed // Freon - var/freon_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/freon][MOLES]) + var/freon_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/freon][MOLES]) if (prob(freon_pp)) to_chat(breather, span_alert("Your mouth feels like it's burning!")) if (freon_pp >40) @@ -339,7 +339,7 @@ breath_gases[/datum/gas/freon][MOLES]-=gas_breathed // Healium - var/healium_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/healium][MOLES]) + var/healium_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/healium][MOLES]) if(healium_pp > gas_stimulation_min) if(prob(15)) to_chat(breather, span_alert("Your head starts spinning and your lungs burn!")) @@ -359,7 +359,7 @@ // Proto Nitrate // Inert // Zauker - var/zauker_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/zauker][MOLES]) + var/zauker_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/zauker][MOLES]) if(zauker_pp > gas_stimulation_min) var/existing = breather.reagents.get_reagent_amount(/datum/reagent/zauker) breather.reagents.add_reagent(/datum/reagent/zauker, max(0, 1 - existing)) @@ -367,7 +367,7 @@ breath_gases[/datum/gas/zauker][MOLES]-=gas_breathed // Halon - var/halon_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/halon][MOLES]) + var/halon_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/halon][MOLES]) if(halon_pp > gas_stimulation_min) breather.adjustOxyLoss(5) var/existing = breather.reagents.get_reagent_amount(/datum/reagent/halon) @@ -384,7 +384,7 @@ // Miasma if (breath_gases[/datum/gas/miasma] && suffers_miasma) - var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma][MOLES]) + var/miasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/miasma][MOLES]) //Miasma sickness if(prob(0.5 * miasma_pp)) @@ -438,7 +438,7 @@ // Activate mood on first flag, remove on second, do nothing on third. handle_breath_temperature(breath, breather) - breath.update_values() + breath.updateValues() return TRUE @@ -526,8 +526,8 @@ /obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) . = ..() - if (breath.get_gas(GAS_PLASMA)) - var/plasma_pp = breath.get_breath_partial_pressure(breath.get_gas(GAS_PLASMA)) + if (breath.getGroupGas(GAS_PLASMA)) + var/plasma_pp = breath.getBreathPartialPressure(breath.getGroupGas(GAS_PLASMA)) owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/cybernetic @@ -586,19 +586,19 @@ var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] - if(!mix?.total_moles()) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE + if(!mix?.getMoles()) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE return // Take a "breath" of the air - var/datum/gas_mixture/breath = mix.remove(mix.total_moles() * BREATH_PERCENTAGE) + var/datum/gas_mixture/breath = mix.remove(mix.getMoles() * BREATH_PERCENTAGE) - var/oxygen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen][MOLES]) - var/nitrogen_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen][MOLES]) - var/plasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma][MOLES]) - var/carbon_dioxide_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) + var/oxygen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/oxygen][MOLES]) + var/nitrogen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/nitrogen][MOLES]) + var/plasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/plasma][MOLES]) + var/carbon_dioxide_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) /* - var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) - var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma][MOLES]) + var/bz_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/bz][MOLES]) + var/miasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/miasma][MOLES]) */ safe_oxygen_min = max(0, oxygen_pp - GAS_TOLERANCE) diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index 02224722411..81ebfae7313 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -26,7 +26,7 @@ //Prep the floor to_fill.initial_gas = OPENTURF_DEFAULT_ATMOS to_fill.air = new - to_fill.air.copy_from(to_fill.return_air()) + to_fill.air.copyFrom(to_fill.return_air()) lab_rat.breathe() @@ -66,7 +66,7 @@ //Prep the floor to_fill.initial_gas = LAVALAND_DEFAULT_ATMOS to_fill.air = new - to_fill.air.copy_from(to_fill.return_air()) + to_fill.air.copyFrom(to_fill.return_air()) lab_rat.breathe() diff --git a/code/modules/unit_tests/gas_transfer.dm b/code/modules/unit_tests/gas_transfer.dm index 9a7b4a78d62..52634f090fe 100644 --- a/code/modules/unit_tests/gas_transfer.dm +++ b/code/modules/unit_tests/gas_transfer.dm @@ -9,12 +9,12 @@ first_mix.volume = 200 second_mix.volume = 200 - first_mix.adjust_gas(GAS_OXYGEN, tempNmoles) - second_mix.adjust_gas(GAS_NITROGEN, 200) + first_mix.adjustGas(GAS_OXYGEN, tempNmoles) + second_mix.adjustGas(GAS_NITROGEN, 200) first_mix.temperature = tempNmoles second_mix.temperature = T20C - var/initial_pressure = second_mix.return_pressure() + var/initial_pressure = second_mix.returnPressure() // A constant value would be nicer but there will be cases when even MOLAR_ACCURACY amounts would far exceed the pressure so we need to scale it somewhat. var/additional_pressure = (tempNmoles / 1000) + 500 @@ -25,7 +25,7 @@ var/error_margin = first_mix.gas_pressure_minimum_transfer(second_mix) - initial_pressure first_mix.pump_gas_to(second_mix, (initial_pressure + additional_pressure)) - var/margin = abs(second_mix.return_pressure() - (initial_pressure+additional_pressure)) + var/margin = abs(second_mix.returnPressure() - (initial_pressure+additional_pressure)) - TEST_ASSERT(margin<=error_margin, "Gas pressure pumping test failed for [tempNmoles]. Expected pressure = [initial_pressure+additional_pressure] +/- [error_margin]. Got [second_mix.return_pressure()].") + TEST_ASSERT(margin<=error_margin, "Gas pressure pumping test failed for [tempNmoles]. Expected pressure = [initial_pressure+additional_pressure] +/- [error_margin]. Got [second_mix.returnPressure()].") */ diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index d9ee9618b83..6fecaea4cc4 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -215,7 +215,7 @@ cabin_air = new cabin_air.volume = 200 cabin_air.temperature = T20C - cabin_air.adjust_multi(GAS_OXYGEN, (O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)), GAS_NITROGEN, (N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature))) + cabin_air.adjustMultipleGases(GAS_OXYGEN, (O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)), GAS_NITROGEN, (N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature))) add_cell() add_scanmod() @@ -427,20 +427,20 @@ clear_internal_damage(MECHA_INT_FIRE) if(internal_tank) var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) + if(int_tank_air.returnPressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) set_internal_damage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents + if(int_tank_air && int_tank_air.getVolume() > 0) //heat the air_contents int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*delta_time) - if(cabin_air && cabin_air.return_volume()>0) - cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(5,7.5)*delta_time) - if(cabin_air.return_temperature() > max_temperature/2) - take_damage(delta_time*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) + if(cabin_air && cabin_air.getVolume()>0) + cabin_air.temperature = min(6000+T0C, cabin_air.getTemperature()+rand(5,7.5)*delta_time) + if(cabin_air.getTemperature() > max_temperature/2) + take_damage(delta_time*2/round(max_temperature/cabin_air.getTemperature(),0.1), BURN, 0, 0) if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank if(internal_tank) var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(DT_PROB_RATE(0.05, delta_time)) + var/datum/gas_mixture/leaked_gas = int_tank_air.removeRatio(DT_PROB_RATE(0.05, delta_time)) if(loc) loc.assume_air(leaked_gas) else @@ -453,7 +453,7 @@ cell.maxcharge -= min(10 * delta_time, cell.maxcharge) if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) - if(cabin_air && cabin_air.return_volume() > 0) + if(cabin_air && cabin_air.getVolume() > 0) var/delta = cabin_air.temperature - T20C cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * delta_time @@ -461,8 +461,8 @@ var/datum/gas_mixture/tank_air = internal_tank.return_air() var/release_pressure = internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) + var/cabin_pressure = cabin_air.returnPressure() + var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.returnPressure() - cabin_pressure)/2) var/transfer_moles = 0 if(pressure_delta > 0) //cabin pressure lower than release pressure if(tank_air.temperature > 0) @@ -473,7 +473,7 @@ var/datum/gas_mixture/t_air = return_air() pressure_delta = cabin_pressure - release_pressure if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) + pressure_delta = min(cabin_pressure - t_air.returnPressure(), pressure_delta) if(pressure_delta > 0) //if location pressure is lower than cabin pressure transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) @@ -1232,12 +1232,12 @@ return cabin_air ///fetches pressure of the gas mixture we are using -/obj/vehicle/sealed/mecha/proc/return_pressure() +/obj/vehicle/sealed/mecha/proc/returnPressure() var/datum/gas_mixture/air = return_air() - return air?.return_pressure() + return air?.returnPressure() ///fetches temp of the gas mixture we are using -/obj/vehicle/sealed/mecha/return_temperature() +/obj/vehicle/sealed/mecha/getTemperature() var/datum/gas_mixture/air = return_air() return air?.temperature diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index eef2a1de549..0f10ed65ae1 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -29,7 +29,7 @@ name = M.name, integrity = round((M.get_integrity() / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, - airtank = M.internal_tank ? M.return_pressure() : null, + airtank = M.internal_tank ? M.returnPressure() : null, pilot = M.return_drivers(), location = get_area_name(M, TRUE), emp_recharging = MT.recharging, @@ -96,7 +96,7 @@ var/answer = {"<b>Name:</b> [chassis.name]<br> <b>Integrity:</b> [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%<br> <b>Cell Charge:</b> [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]<br> - <b>Airtank:</b> [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa<br> + <b>Airtank:</b> [chassis.internal_tank ? "[round(chassis.returnPressure(), 0.01)]" : "Not Equipped"] kPa<br> <b>Pilot:</b> [chassis.return_drivers() || "None"]<br> <b>Location:</b> [get_area_name(chassis, TRUE) || "Unknown"]"} if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 35fcc68a3a5..3b4906ca291 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -116,11 +116,11 @@ data["mecha_flags"] = mecha_flags data["internal_damage"] = internal_damage data["air_source"] = use_internal_tank ? "Internal Airtank" : "Environment" - data["airtank_pressure"] = int_tank_air ? round(int_tank_air.return_pressure(), 0.01) : null + data["airtank_pressure"] = int_tank_air ? round(int_tank_air.returnPressure(), 0.01) : null data["airtank_temp"] = int_tank_air?.temperature data["port_connected"] = internal_tank?.connected_port ? TRUE : FALSE - data["cabin_pressure"] = round(return_pressure(), 0.01) - data["cabin_temp"] = return_temperature() + data["cabin_pressure"] = round(returnPressure(), 0.01) + data["cabin_temp"] = getTemperature() data["dna_lock"] = dna_lock data["mech_view"] = ui_view.assigned_map if(radio) diff --git a/code/modules/wiremod/components/sensors/pressuresensor.dm b/code/modules/wiremod/components/sensors/pressuresensor.dm index c0509aac6f2..7d733f369d8 100644 --- a/code/modules/wiremod/components/sensors/pressuresensor.dm +++ b/code/modules/wiremod/components/sensors/pressuresensor.dm @@ -25,7 +25,7 @@ //Get environment info var/datum/gas_mixture/environment = location.return_air() var/total_moles = environment.total_moles - var/pressure = environment.return_pressure() + var/pressure = environment.returnPressure() if(total_moles) //If there's atmos, return pressure result.set_output(round(pressure,1)) diff --git a/html/changelogs/archive/2020-03.yml b/html/changelogs/archive/2020-03.yml index bae4ee0a1e0..8b9b02ab488 100644 --- a/html/changelogs/archive/2020-03.yml +++ b/html/changelogs/archive/2020-03.yml @@ -737,7 +737,7 @@ - bugfix: Fixed runtime on donutstation caused by mistype in dmm file 2020-03-26: Dennok: - - code_imp: now copy_from(target, partial) can copy part of target gas moles + - code_imp: now copyFrom(target, partial) can copy part of target gas moles Detective-Google: - code_imp: shotgun's weapon_weight variable being defined twice Fikou: From 1053fb3207c85fb4a8dad228eaab3875144e5463 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 1 May 2022 16:45:56 -0400 Subject: [PATCH 061/200] Clean up, fixes reconcile_air(), recode copyFrom() --- code/__HELPERS/_logging.dm | 2 +- code/__HELPERS/atmospherics.dm | 4 +- code/datums/components/wet_floor.dm | 2 +- code/datums/elements/atmos_requirements.dm | 10 ++--- code/datums/helper_datums/teleport.dm | 8 ++-- code/game/atoms.dm | 2 +- .../effects/effect_system/effects_foam.dm | 4 +- .../effects/effect_system/effects_smoke.dm | 2 +- .../items/devices/scanners/gas_analyzer.dm | 8 ++-- code/game/objects/items/flamethrower.dm | 3 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 4 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/game/objects/objs.dm | 4 +- .../structures/crates_lockers/closets.dm | 3 -- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/open/lava.dm | 2 +- .../heretic/knowledge/void_lore.dm | 4 +- code/modules/assembly/bomb.dm | 2 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 45 +++++++++++++------ .../atmospherics/gasmixtures/gas_mixture.dm | 32 ++++++------- .../atmospherics/gasmixtures/reactions.dm | 2 +- .../atmospherics/machinery/airalarm.dm | 2 +- .../machinery/bluespace_vendor.dm | 2 +- .../components/binary_devices/pump.dm | 4 +- .../binary_devices/temperature_pump.dm | 2 +- .../components/binary_devices/volume_pump.dm | 6 +-- .../components/fusion/hfr_main_processes.dm | 34 +++++++------- .../machinery/components/fusion/hfr_parts.dm | 6 +-- .../machinery/components/fusion/hfr_procs.dm | 10 ++--- .../gas_recipe_machines/crystallizer.dm | 14 +++--- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 4 +- .../unary_devices/bluespace_sender.dm | 10 ++--- .../components/unary_devices/cryo.dm | 10 ++--- .../components/unary_devices/thermomachine.dm | 2 +- .../components/unary_devices/vent_pump.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 2 +- .../atmospherics/machinery/datum_pipeline.dm | 32 ++++++++++++- .../atmospherics/machinery/other/miner.dm | 2 +- .../machinery/pipes/heat_exchange/he_pipes.dm | 2 +- .../machinery/portable/canister.dm | 8 ++-- .../atmospherics/machinery/portable/pump.dm | 2 +- .../machinery/portable/scrubber.dm | 2 +- code/modules/clothing/masks/gas_filter.dm | 24 +++++----- .../clothing/spacesuits/_spacesuits.dm | 2 +- code/modules/events/spacevine.dm | 8 ++-- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- code/modules/mob/living/carbon/alien/life.dm | 6 +-- .../carbon/human/species_types/golems.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 2 +- code/modules/mob/living/carbon/life.dm | 10 ++--- code/modules/mob/living/living.dm | 2 +- .../living/simple_animal/hostile/regalrat.dm | 2 +- .../mob/living/simple_animal/hostile/tree.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 10 ++--- .../mob/living/simple_animal/slime/life.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 6 +-- .../power/supermatter/supermatter_process.dm | 12 ++--- code/modules/power/turbine/turbine.dm | 6 +-- .../chemistry/reagents/food_reagents.dm | 2 +- code/modules/research/experimentor.dm | 4 +- .../research/ordnance/tank_compressor.dm | 6 +-- code/modules/research/server.dm | 2 +- .../xenobiology/crossbreeding/chilling.dm | 2 +- code/modules/surgery/organic_steps.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 4 +- code/modules/surgery/organs/lungs.dm | 7 +-- code/modules/vehicles/mecha/_mecha.dm | 14 +++--- code/modules/vehicles/mecha/mecha_ui.dm | 2 +- 72 files changed, 251 insertions(+), 207 deletions(-) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8c9b1bab955..84cbbcf2bd5 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /// Logs the contents of the gasmix to the game log, prefixed by text /proc/log_atmos(text, datum/gas_mixture/mix) var/message = text - message += "TEMP=[mix.getTemperature()],MOL=[mix.getMoles()],VOL=[mix.volume]" + message += "TEMP=[mix.get_temperature()],MOL=[mix.get_moles()],VOL=[mix.volume]" for(var/key in mix.getGases()) message += "[key]=[mix.getGroupGas(key)];" log_game(message) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 250dabd386e..32684a61295 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -45,7 +45,7 @@ .["gases"] += list(list( "[gas_path]", "[gas_path]", - gasmix.getGroupGas(gas_path), + gasmix.gas[gas_path], )) //.for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results) .["reactions"] += list(list( @@ -53,7 +53,7 @@ "UNIMPLIMENTED", "UNIMPLIMENTED", )) - .["total_moles"] = gasmix.getMoles() + .["total_moles"] = gasmix.get_moles() .["temperature"] = gasmix.temperature .["volume"] = gasmix.volume .["pressure"] = gasmix.returnPressure() diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 9a63f6b2951..2ffee547cf7 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -114,7 +114,7 @@ var/turf/open/T = parent var/diff = world.time - last_process var/decrease = 0 - var/t = T.GetTemperature() + var/t = T.return_temperature() switch(t) if(-INFINITY to T0C) add_wet(TURF_WET_ICE, max_time_left()) //Water freezes into ice! diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 1737b7e4b6c..735c78e1230 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -46,13 +46,13 @@ if(!open_turf.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) return FALSE - var/datum/gas_mixture/open_turf_gases = open_turf.return_air() + var/datum/gas_mixture/open_turf_gases = open_turf.return_air().getGases() - var/plas = open_turf_gases.getGroupGas(GAS_PLASMA) - var/oxy = open_turf_gases.getGroupGas(GAS_OXYGEN) - var/n2 = open_turf_gases.getGroupGas(GAS_NITROGEN) - var/co2 = open_turf_gases.getGroupGas(GAS_CO2) + var/plas = open_turf_gases[GAS_PLASMA] + var/oxy = open_turf_gases[GAS_OXYGEN] + var/n2 = open_turf_gases[GAS_NITROGEN] + var/co2 = open_turf_gases[GAS_CO2] . = TRUE if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index aa9c1d8b516..adb5e927175 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -135,16 +135,16 @@ if(no_teleport && (destination_area.area_flags & NOTELEPORT)) return - var/datum/gas_mixture/floor_gases= floor_turf.return_air() + var/datum/gas_mixture/floor_gases= floor_turf.return_air()?.getGases() if(!floor_gases) return - if(!(floor_gases.getGroupGas(GAS_OXYGEN) >= 16)) + if(!(floor_gases[GAS_OXYGEN] >= 16)) return - if(floor_gases.getGroupGas(GAS_PLASMA)) + if(floor_gases[GAS_PLASMA]) return - if(floor_gases.getGroupGas(GAS_CO2) >= 10) + if(floor_gases[GAS_CO2] >= 10) return // Aim for goldilocks temperatures and pressure diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 2267052fbc0..eebd9b8367f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1370,7 +1370,7 @@ SEND_SIGNAL(src, COMSIG_ATOM_EXITED, gone, direction) ///Return atom temperature -/atom/proc/getTemperature() +/atom/proc/return_temperature() return /** diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 0574d52fc52..b8de7717ac4 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -41,11 +41,11 @@ var/turf/open/T = get_turf(src) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && istype(T) && T.air) + if(hotspot && istype(T) && T.zone) qdel(hotspot) var/datum/gas_mixture/G = T.return_air() if(G.getGroupGas(GAS_PLASMA)) - var/plas_amt = min(30, G.getGroupGas(GAS_PLASMA)) //Absorb some plasma + var/plas_amt = min(30, G.gas[GAS_PLASMA]) //Absorb some plasma G.adjustGas(GAS_PLASMA, -plas_amt) absorbed_plasma += plas_amt if(G.temperature > T20C) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 0272ef5309a..c498d78fbf2 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -177,7 +177,7 @@ for(var/obj/effect/hotspot/H in T) qdel(H) if(G.getGroupGas(GAS_PLASMA)) - G.adjustGas(GAS_NITROGEN, G.getGroupGas(GAS_PLASMA)) + G.adjustGas(GAS_NITROGEN, G.gas[GAS_PLASMA]) G.adjustGas(GAS_PLASMA, -G.gas[GAS_PLASMA]) if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index bb781cc76ee..1b84260dda5 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -150,17 +150,17 @@ message += span_boldnotice("Node [mix_number]") mix_name += " - Node [mix_number]" - var/total_moles = air.getMoles() + var/total_moles = air.get_moles() var/pressure = air.returnPressure() - var/volume = air.getVolume() //could just do mixture.volume... but safety, I guess? - var/temperature = air.getTemperature() + var/volume = air.get_volume() //could just do mixture.volume... but safety, I guess? + var/temperature = air.get_temperature() if(total_moles > 0) message += span_notice("Moles: [round(total_moles, 0.01)] mol") var/list/cached_gases = air.gas for(var/id in cached_gases) - var/gas_concentration = air.getGroupGas(id)/total_moles + var/gas_concentration = cached_gases[id]/total_moles message += span_notice("[id]: [round(air.getGroupGas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 18bfd33c663..005988ebd8d 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -266,7 +266,6 @@ SIGNAL_HANDLER if(ptank) var/datum/gas_mixture/tank_mix = ptank.return_air() - tank_mix.gas[GAS_PLASMA] = (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C) - else + tank_mix.setGasMoles(GAS_PLASMA,(10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C)) ptank = new /obj/item/tank/internals/plasma/full(src) update_appearance() diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 2e00422b02f..72700022e5b 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -92,7 +92,7 @@ target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punches you!")) return - /*if(!molar_cmp_equals(gasused.getMoles(), gasperfist * fisto_setting)) + /*if(!molar_cmp_equals(gasused.get_moles(), gasperfist * fisto_setting)) to_chat(user, span_warning("\The [src]'s piston-ram lets out a weak hiss, it needs more gas!")) playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE) target.apply_damage((force / 2), BRUTE) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 82a57bd66bf..b6d359da97b 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -123,12 +123,12 @@ return COMSIG_MOVABLE_STOP_SPACEMOVE /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) - if((num < 0.005 || air_contents.getMoles() < num)) + if((num < 0.005 || air_contents.get_moles() < num)) turn_off(user) return var/datum/gas_mixture/removed = remove_air(num) - if(removed.getMoles() < 0.005) + if(removed.get_moles() < 0.005) turn_off(user) return diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 83e63904caf..d77e02a152d 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -292,7 +292,7 @@ return FALSE var/pressure = air_contents.returnPressure() - var/temperature = air_contents.getTemperature() + var/temperature = air_contents.get_temperature() if(temperature >= TANK_MELT_TEMPERATURE) var/temperature_damage_ratio = (temperature - TANK_MELT_TEMPERATURE) / temperature take_damage(max_integrity * temperature_damage_ratio * delta_time, BURN, FIRE, FALSE, NONE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b1ae29d5e90..71eec65afd6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -119,8 +119,8 @@ if(breath_request>0) var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.getVolume() - return remove_air(environment.getMoles() * breath_percentage) + var/breath_percentage = BREATH_VOLUME / environment.get_volume() + return remove_air(environment.get_moles() * breath_percentage) else return null diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index fcb15c7bc72..f169e6a6d28 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -697,9 +697,6 @@ /obj/structure/closet/AllowDrop() return TRUE -/obj/structure/closet/getTemperature() - return - /obj/structure/closet/proc/locker_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) SIGNAL_HANDLER if(!opened && (locked || welded)) //Yes this could be less code, no I don't care diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 680e9063de7..6006a945626 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -203,7 +203,7 @@ return -/obj/structure/transit_tube_pod/getTemperature() +/obj/structure/transit_tube_pod/return_temperature() return air_contents.temperature //special pod made by the dispenser, it fizzles away when reaching a station. diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4b92b702298..16991ccc204 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -385,7 +385,7 @@ /obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if (exposed_temperature > melting_point) - take_damage(round(air.getVolume() / 100), BURN, 0, 0) + take_damage(round(air.get_volume() / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location() return null diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index cffed90e436..b081387af5d 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -180,7 +180,7 @@ /turf/open/GetHeatCapacity() . = air.getHeatCapacity() -/turf/open/GetTemperature() +/turf/open/return_temperature() . = return_air().temperature /turf/open/TakeTemperature(temp) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 4dbdc4e6c44..15a9f4b23cc 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -100,7 +100,7 @@ /turf/open/lava/GetHeatCapacity() . = 700000 -/turf/open/lava/GetTemperature() +/turf/open/lava/return_temperature() . = 5000 /turf/open/lava/TakeTemperature(temp) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index d7542b55b02..b9b977f4f03 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -48,7 +48,7 @@ return FALSE var/turf/open/our_turf = loc - if(our_turf.GetTemperature() > T0C) + if(our_turf.return_temperature() > T0C) loc.balloon_alert(user, "ritual failed, not cold enough!") return FALSE @@ -189,7 +189,7 @@ return FALSE var/turf/open/our_turf = loc - if(our_turf.GetTemperature() > T0C) + if(our_turf.return_temperature() > T0C) loc.balloon_alert(user, "ritual failed, not cold enough!") return FALSE diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 0bb31d04922..f32083ae17d 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -202,7 +202,7 @@ /obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. var/datum/gas_mixture/our_mix = return_air() - var/datum/gas_mixture/removed = remove_air(our_mix.getMoles()) + var/datum/gas_mixture/removed = remove_air(our_mix.get_moles()) var/turf/T = get_turf(src) if(!T) return diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 39641ff513b..0911fae8b97 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -31,7 +31,7 @@ return total_moles * group_multiplier //Takes a gas string and the amount of moles to adjust by. Calls updateValues() if update isn't 0. -/datum/gas_mixture/proc/adjustGas(gasid, moles, update = 1) +/datum/gas_mixture/proc/adjustGas(gasid, moles, update = TRUE) if(moles == 0) return @@ -43,6 +43,18 @@ if(update) updateValues() +/datum/gas_mixture/proc/setGasMoles(gasid, moles, update = TRUE, divide_among_group = FALSE) + if(moles == 0) + return + + //Generally setGasMoles actions pre-calculate, just in case. + if(divide_among_group && group_multiplier != 1) + gas[gasid] = moles/group_multiplier + else + gas[gasid] = moles + + if(update) + updateValues() //Same as adjustGas(), but takes a temperature which is mixed in with the gas. /datum/gas_mixture/proc/adjustGasWithTemp(gasid, moles, temp, update = 1) @@ -299,10 +311,16 @@ . += gas[g] //Copies gas and temperature from another gas_mixture. -/datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample) - gas = sample.gas.Copy() - temperature = sample.temperature +/datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample, partial = 1) + var/list/cached_gas = gas + var/list/sample_gas = sample.gas.Copy() + + //remove all gases not in the sample + cached_gas &= sample_gas + temperature = sample.temperature + for(var/id in sample_gas) + cached_gas[id] = sample_gas[id] * partial updateValues() return 1 @@ -473,20 +491,21 @@ if(M) return getMass()/M +/datum/gas_mixture/proc/hasGas(gas_id, required_amount) + var/amt = getGroupGas(gas_id) + return (amt >= required_amount) + ////LINDA COMPATABILITY PROCS//// -/datum/gas_mixture/proc/getVolume() +/datum/gas_mixture/proc/get_volume() return max(0, volume) -/datum/gas_mixture/proc/getTemperature() +/datum/gas_mixture/proc/get_temperature() return temperature -/datum/gas_mixture/proc/getMoles() +/datum/gas_mixture/proc/get_moles() updateValues() return total_moles - -/datum/gas_mixture/proc/hasGas(gas_id, required_amount) - var/amt = getGroupGas(gas_id) - return (amt >= required_amount) +////END LINDA COMPATABILITY//// ///Returns the gas list with an update. /datum/gas_mixture/proc/getGases() @@ -521,8 +540,8 @@ * eg: * Plas_PP = get_partial_pressure(gas_mixture.plasma) * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * getBreathPartialPressure(gas_pp) --> gas_pp/getMoles()*breath_pp = pp - * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*getMoles() + * getBreathPartialPressure(gas_pp) --> gas_pp/get_moles()*breath_pp = pp + * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*get_moles() * * 10/20*5 = 2.5 * 10 = 2.5/5*20 diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 4db5c955299..45ddb2dd398 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -93,7 +93,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space /// Calculate moles -/datum/gas_mixture/proc/getMoles() +/datum/gas_mixture/proc/get_moles() var/cached_gases = gases TOTAL_MOLES(cached_gases, .) @@ -116,11 +116,11 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return 0 /// Calculate temperature in kelvins -/datum/gas_mixture/proc/getTemperature() +/datum/gas_mixture/proc/get_temperature() return temperature /// Calculate volume in liters -/datum/gas_mixture/proc/getVolume() +/datum/gas_mixture/proc/get_volume() return max(0, volume) /// Gets the gas visuals for everything in this mixture @@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Returns: bool indicating whether gases moved between the two mixes /datum/gas_mixture/proc/equalize(datum/gas_mixture/other) . = FALSE - if(abs(getTemperature() - other.getTemperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + if(abs(get_temperature() - other.get_temperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) . = TRUE var/self_heat_cap = getHeatCapacity() var/other_heat_cap = other.getHeatCapacity() @@ -290,7 +290,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) ///Copies variables from sample, moles multiplicated by partial ///Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/copyFrom(datum/gas_mixture/sample, partial = 1) +/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample, partial = 1) var/list/cached_gases = gases //accessing datum vars is slower than proc vars var/list/sample_gases = sample.gases @@ -545,8 +545,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * eg: * Plas_PP = get_partial_pressure(gas_mixture.plasma) * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * getBreathPartialPressure(gas_pp) --> gas_pp/getMoles()*breath_pp = pp - * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*getMoles() + * getBreathPartialPressure(gas_pp) --> gas_pp/get_moles()*breath_pp = pp + * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*get_moles() * * 10/20*5 = 2.5 * 10 = 2.5/5*20 @@ -566,9 +566,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * - output_air (gasmix). */ /datum/gas_mixture/proc/gas_pressure_minimum_transfer(datum/gas_mixture/output_air) - var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / getMoles() * thermal_energy()) - var/resulting_capacity = output_air.getHeatCapacity() + (MOLAR_ACCURACY / getMoles() * getHeatCapacity()) - return (output_air.getMoles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume + var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / get_moles() * thermal_energy()) + var/resulting_capacity = output_air.getHeatCapacity() + (MOLAR_ACCURACY / get_moles() * getHeatCapacity()) + return (output_air.get_moles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume /** Returns the amount of gas to be pumped to a specific container. @@ -578,11 +578,11 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistant. */ /datum/gas_mixture/proc/gas_pressure_calculate(datum/gas_mixture/output_air, target_pressure, ignore_temperature = FALSE) - if((getMoles() <= 0) || (temperature <= 0)) + if((get_moles() <= 0) || (temperature <= 0)) return FALSE var/pressure_delta = 0 - if((output_air.temperature <= 0) || (output_air.getMoles() <= 0)) + if((output_air.temperature <= 0) || (output_air.get_moles() <= 0)) ignore_temperature = TRUE pressure_delta = target_pressure else @@ -600,8 +600,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/rt_high = R_IDEAL_GAS_EQUATION * min(temperature, output_air.temperature) // These works by assuming our gas has extremely high heat capacity // and the resultant gasmix will hit either the highest or lowest temperature possible. - var/lower_limit = max((pv / rt_low) - output_air.getMoles(), 0) - var/upper_limit = (pv / rt_high) - output_air.getMoles() // In theory this should never go below zero, the pressure_delta check above should account for this. + var/lower_limit = max((pv / rt_low) - output_air.get_moles(), 0) + var/upper_limit = (pv / rt_high) - output_air.get_moles() // In theory this should never go below zero, the pressure_delta check above should account for this. /* * We have PV=nRT as a nice formula, we can rearrange it into nT = PV/R @@ -627,12 +627,12 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) // Our thermal energy and moles var/w2 = thermal_energy() - var/n2 = getMoles() + var/n2 = get_moles() var/c2 = getHeatCapacity() // Target thermal energy and moles var/w1 = output_air.thermal_energy() - var/n1 = output_air.getMoles() + var/n1 = output_air.get_moles() var/c1 = output_air.getHeatCapacity() /// The PV/R part in our equation. diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 23f4bc09952..1c960c98452 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -138,7 +138,7 @@ /datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases // As the name says it, it needs to be dry - if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor][MOLES] / air.getMoles() > MIASTER_STERILIZATION_MAX_HUMIDITY) + if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor][MOLES] / air.get_moles() > MIASTER_STERILIZATION_MAX_HUMIDITY) return NO_REACTION //Replace miasma with oxygen diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 047677f04cf..ef635f0ce5e 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -235,7 +235,7 @@ "unit" = "K ([round(temperature - T0C, 0.1)]C)", "danger_level" = cur_tlv.get_danger_level(temperature) )) - var/total_moles = environment.getMoles() + var/total_moles = environment.get_moles() var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume for(var/gas_id in environment.getGases()) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. diff --git a/code/modules/atmospherics/machinery/bluespace_vendor.dm b/code/modules/atmospherics/machinery/bluespace_vendor.dm index c36d71a8aeb..ad817e8666e 100644 --- a/code/modules/atmospherics/machinery/bluespace_vendor.dm +++ b/code/modules/atmospherics/machinery/bluespace_vendor.dm @@ -208,7 +208,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) /obj/machinery/bluespace_vendor/ui_data(mob/user) var/list/data = list() var/list/bluespace_gasdata = list() - if(connected_machine.bluespace_network.getMoles()) + if(connected_machine.bluespace_network.get_moles()) for(var/gas_id in connected_machine.bluespace_network.gases) bluespace_gasdata.Add(list(list( "name" = connected_machine.bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index ef3c491caa8..673c33b2e1b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -283,5 +283,5 @@ var/datum/gas_mixture/air_output = connected_pump.airs[2] input_pressure.set_output(air_input.returnPressure()) output_pressure.set_output(air_output.returnPressure()) - input_temperature.set_output(air_input.getTemperature()) - output_temperature.set_output(air_output.getTemperature()) + input_temperature.set_output(air_input.get_temperature()) + output_temperature.set_output(air_output.get_temperature()) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 7f6ff5ae65e..0948bea9e08 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -37,7 +37,7 @@ var/datum/gas_mixture/air_input = airs[1] var/datum/gas_mixture/air_output = airs[2] - if(!QUANTIZE(air_input.getMoles()) || !QUANTIZE(air_output.getMoles())) //Don't transfer if there's no gas + if(!QUANTIZE(air_input.get_moles()) || !QUANTIZE(air_output.get_moles())) //Don't transfer if there's no gas return var/datum/gas_mixture/remove_input = air_input.removeRatio(0.9) var/datum/gas_mixture/remove_output = air_output.removeRatio(0.9) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index df3865955af..82b65c908bb 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -81,7 +81,7 @@ var/datum/gas_mixture/removed = air1.removeRatio(transfer_ratio) - if(!removed.getMoles()) + if(!removed.get_moles()) return if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked @@ -326,5 +326,5 @@ var/datum/gas_mixture/air_output = connected_pump.airs[2] input_pressure.set_output(air_input.returnPressure()) output_pressure.set_output(air_output.returnPressure()) - input_temperature.set_output(air_input.getTemperature()) - output_temperature.set_output(air_output.getTemperature()) + input_temperature.set_output(air_input.get_temperature()) + output_temperature.set_output(air_output.get_temperature()) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index c66f9449a28..6f671aebc7c 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -380,8 +380,8 @@ internal_fusion.temperature -= heat_limiter_modifier * 0.01 * delta_time //heat up and output what's in the internal_output into the linked_output port - if(internal_output.getMoles() > 0) - if(moderator_internal.getMoles() > 0) + if(internal_output.get_moles() > 0) + if(moderator_internal.get_moles() > 0) internal_output.temperature = moderator_internal.temperature * HIGH_EFFICIENCY_CONDUCTIVITY else internal_output.temperature = internal_fusion.temperature * METALLIC_VOID_CONDUCTIVITY @@ -410,8 +410,8 @@ if (!power_level) return // All gases in the moderator slowly burn away over time, whether used for production or not - if(moderator_internal.getMoles() > 0) - moderator_internal.remove(moderator_internal.getMoles() * (1 - (1 - 0.0005 * power_level) ** delta_time)) + if(moderator_internal.get_moles() > 0) + moderator_internal.remove(moderator_internal.get_moles() * (1 - (1 - 0.0005 * power_level) ** delta_time)) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_damageheal(delta_time) // Archive current health for damage cap purposes @@ -419,16 +419,16 @@ // If we're operating at an extreme power level, take increasing damage for the amount of fusion mass over a low threshold if(power_level >= HYPERTORUS_OVERFULL_MIN_POWER_LEVEL) - var/overfull_damage_taken = HYPERTORUS_OVERFULL_MOLAR_SLOPE * internal_fusion.getMoles() + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * coolant_temperature + HYPERTORUS_OVERFULL_CONSTANT + var/overfull_damage_taken = HYPERTORUS_OVERFULL_MOLAR_SLOPE * internal_fusion.get_moles() + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * coolant_temperature + HYPERTORUS_OVERFULL_CONSTANT critical_threshold_proximity = max(critical_threshold_proximity + max(overfull_damage_taken * delta_time, 0), 0) // If we're running on a thin fusion mix, heal up - if(internal_fusion.getMoles() < HYPERTORUS_SUBCRITICAL_MOLES && power_level <= 5) - var/subcritical_heal_restore = (internal_fusion.getMoles() - HYPERTORUS_SUBCRITICAL_MOLES) / HYPERTORUS_SUBCRITICAL_SCALE + if(internal_fusion.get_moles() < HYPERTORUS_SUBCRITICAL_MOLES && power_level <= 5) + var/subcritical_heal_restore = (internal_fusion.get_moles() - HYPERTORUS_SUBCRITICAL_MOLES) / HYPERTORUS_SUBCRITICAL_SCALE critical_threshold_proximity = max(critical_threshold_proximity + min(subcritical_heal_restore * delta_time, 0), 0) // If coolant is sufficiently cold, heal up - if(internal_fusion.getMoles() > 0 && (airs[1].getMoles() && coolant_temperature < HYPERTORUS_COLD_COOLANT_THRESHOLD) && power_level <= 4) + if(internal_fusion.get_moles() > 0 && (airs[1].get_moles() && coolant_temperature < HYPERTORUS_COLD_COOLANT_THRESHOLD) && power_level <= 4) var/cold_coolant_heal_restore = log(10, max(coolant_temperature, 1) * HYPERTORUS_COLD_COOLANT_SCALE) - (HYPERTORUS_COLD_COOLANT_MAX_RESTORE * 2) critical_threshold_proximity = max(critical_threshold_proximity + min(cold_coolant_heal_restore * delta_time, 0), 0) @@ -438,8 +438,8 @@ critical_threshold_proximity = min(critical_threshold_proximity_archived + (delta_time * DAMAGE_CAP_MULTIPLIER * melting_point), critical_threshold_proximity) // If we have a preposterous amount of mass in the fusion mix, things get bad extremely fast - if(internal_fusion.getMoles() >= HYPERTORUS_HYPERCRITICAL_MOLES) - var/hypercritical_damage_taken = max((internal_fusion.getMoles() - HYPERTORUS_HYPERCRITICAL_MOLES) * HYPERTORUS_HYPERCRITICAL_SCALE, 0) + if(internal_fusion.get_moles() >= HYPERTORUS_HYPERCRITICAL_MOLES) + var/hypercritical_damage_taken = max((internal_fusion.get_moles() - HYPERTORUS_HYPERCRITICAL_MOLES) * HYPERTORUS_HYPERCRITICAL_SCALE, 0) critical_threshold_proximity = max(critical_threshold_proximity + min(hypercritical_damage_taken, HYPERTORUS_HYPERCRITICAL_MAX_DAMAGE), 0) * delta_time // High power fusion might create other matter other than helium, iron is dangerous inside the machine, damage can be seen @@ -469,7 +469,7 @@ zap_number += 1 var/cutoff = 1500 - cutoff = clamp(3000 - (power_level * (internal_fusion.getMoles() * 0.45)), 450, 3000) + cutoff = clamp(3000 - (power_level * (internal_fusion.get_moles() * 0.45)), 450, 3000) var/zaps_aspect = DEFAULT_ZAP_ICON_STATE var/flags = ZAP_SUPERMATTER_FLAGS @@ -514,25 +514,25 @@ moderator_internal.garbage_collect() /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_internal_cooling(delta_time) - if(moderator_internal.getMoles() > 0 && internal_fusion.getMoles() > 0) + if(moderator_internal.get_moles() > 0 && internal_fusion.get_moles() > 0) //Modifies the moderator_internal temperature based on energy conduction and also the fusion by the same amount var/fusion_temperature_delta = internal_fusion.temperature - moderator_internal.temperature var/fusion_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * fusion_temperature_delta * (internal_fusion.getHeatCapacity() * moderator_internal.getHeatCapacity() / (internal_fusion.getHeatCapacity() + moderator_internal.getHeatCapacity())) internal_fusion.temperature = max(internal_fusion.temperature - fusion_heat_amount / internal_fusion.getHeatCapacity(), TCMB) moderator_internal.temperature = max(moderator_internal.temperature + fusion_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - if(airs[1].getMoles() * 0.05 <= MINIMUM_MOLE_COUNT) + if(airs[1].get_moles() * 0.05 <= MINIMUM_MOLE_COUNT) return var/datum/gas_mixture/cooling_port = airs[1] - var/datum/gas_mixture/cooling_remove = cooling_port.remove(0.05 * cooling_port.getMoles()) + var/datum/gas_mixture/cooling_remove = cooling_port.remove(0.05 * cooling_port.get_moles()) //Cooling of the moderator gases with the cooling loop in and out the core - if(moderator_internal.getMoles() > 0) + if(moderator_internal.get_moles() > 0) var/coolant_temperature_delta = cooling_remove.temperature - moderator_internal.temperature var/cooling_heat_amount = (1 - (1 - HIGH_EFFICIENCY_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * moderator_internal.getHeatCapacity() / (cooling_remove.getHeatCapacity() + moderator_internal.getHeatCapacity())) cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) moderator_internal.temperature = max(moderator_internal.temperature + cooling_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - else if(internal_fusion.getMoles() > 0) + else if(internal_fusion.get_moles() > 0) var/coolant_temperature_delta = cooling_remove.temperature - internal_fusion.temperature var/cooling_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * internal_fusion.getHeatCapacity() / (cooling_remove.getHeatCapacity() + internal_fusion.getHeatCapacity())) cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) @@ -544,7 +544,7 @@ //Check and stores the gases from the moderator input in the moderator internal gasmix var/datum/gas_mixture/moderator_port = linked_moderator.airs[1] - if(start_moderator && moderator_port.getMoles()) + if(start_moderator && moderator_port.get_moles()) moderator_internal.merge(moderator_port.remove(moderator_injection_rate * delta_time)) linked_moderator.update_parents() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm index 992afb55152..d7c2bab399c 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm @@ -240,7 +240,7 @@ //Internal Fusion gases var/list/fusion_gasdata = list() - if(connected_core.internal_fusion.getMoles()) + if(connected_core.internal_fusion.get_moles()) for(var/gas_type in connected_core.internal_fusion.gases) var/datum/gas/gas = gas_type fusion_gasdata.Add(list(list( @@ -256,7 +256,7 @@ ))) //Moderator gases var/list/moderator_gasdata = list() - if(connected_core.moderator_internal.getMoles()) + if(connected_core.moderator_internal.get_moles()) for(var/gas_type in connected_core.moderator_internal.gases) var/datum/gas/gas = gas_type moderator_gasdata.Add(list(list( @@ -382,7 +382,7 @@ if(fuel) connected_core.selected_fuel = fuel fuel_mix = fuel.name - if(connected_core.internal_fusion.getMoles()) + if(connected_core.internal_fusion.get_moles()) connected_core.dump_gases() connected_core.update_parents() //prevent the machine from stopping because of the recipe change and the pipenet not updating connected_core.linked_input.update_parents() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index 203aa4a2058..80174808f65 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -237,7 +237,7 @@ /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_fuel() if(!selected_fuel) return FALSE - if(!internal_fusion.getMoles()) + if(!internal_fusion.get_moles()) return FALSE for(var/gas_type in selected_fuel.requirements) internal_fusion.assert_gas(gas_type) @@ -267,7 +267,7 @@ ///Removes the gases from the internal gasmix when the recipe is changed /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/dump_gases() - var/datum/gas_mixture/remove = internal_fusion.remove(internal_fusion.getMoles()) + var/datum/gas_mixture/remove = internal_fusion.remove(internal_fusion.get_moles()) linked_output.airs[1].merge(remove) internal_fusion.garbage_collect() linked_input.airs[1].garbage_collect() @@ -476,7 +476,7 @@ around_turfs -= turf continue var/datum/gas_mixture/remove_fusion - if(internal_fusion.getMoles() > 0) + if(internal_fusion.get_moles() > 0) remove_fusion = internal_fusion.removeRatio(0.2) var/datum/gas_mixture/remove for(var/i in 1 to gas_pockets) @@ -485,7 +485,7 @@ local.assume_air(remove) loc.assume_air(internal_fusion) var/datum/gas_mixture/remove_moderator - if(moderator_internal.getMoles() > 0) + if(moderator_internal.get_moles() > 0) remove_moderator = moderator_internal.removeRatio(0.2) var/datum/gas_mixture/remove for(var/i in 1 to gas_pockets) @@ -587,7 +587,7 @@ spill_gases(cracked_part, moderator_internal, ratio = 1 - (1 - leak_rate) ** delta_time) return - if (moderator_internal.getMoles() < HYPERTORUS_HYPERCRITICAL_MOLES) + if (moderator_internal.get_moles() < HYPERTORUS_HYPERCRITICAL_MOLES) return cracked_part = create_crack() // See if we do anything in the initial rupture diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 920e74f2daf..cbd6b1d06e0 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -150,8 +150,8 @@ ///Conduction between the internal gasmix and the moderating (cooling/heating) gasmix. /obj/machinery/atmospherics/components/binary/crystallizer/proc/heat_conduction() var/datum/gas_mixture/cooling_port = airs[1] - if(cooling_port.getMoles() > MINIMUM_MOLE_COUNT) - if(internal.getMoles() > 0) + if(cooling_port.get_moles() > MINIMUM_MOLE_COUNT) + if(internal.get_moles() > 0) var/coolant_temperature_delta = cooling_port.temperature - internal.temperature var/cooling_heat_capacity = cooling_port.getHeatCapacity() var/internal_heat_capacity = internal.getHeatCapacity() @@ -169,7 +169,7 @@ ///Removes the gases from the internal gasmix when the recipe is changed /obj/machinery/atmospherics/components/binary/crystallizer/proc/dump_gases() - var/datum/gas_mixture/remove = internal.remove(internal.getMoles()) + var/datum/gas_mixture/remove = internal.remove(internal.get_moles()) airs[2].merge(remove) internal.garbage_collect() @@ -179,7 +179,7 @@ inject_gases() - if(!internal.getMoles()) + if(!internal.get_moles()) return heat_conduction() @@ -266,7 +266,7 @@ data["selected"] = "" var/list/internal_gas_data = list() - if(internal.getMoles()) + if(internal.get_moles()) for(var/gasid in internal.gases) internal_gas_data.Add(list(list( "name"= internal.gases[gasid][GAS_META][META_GAS_NAME], @@ -294,7 +294,7 @@ data["requirements"] = requirements.Join("\n") var/temperature - if(internal.getMoles()) + if(internal.get_moles()) temperature = internal.temperature else temperature = 0 @@ -316,7 +316,7 @@ selected_recipe = null var/recipe_name = "nothing" var/datum/gas_recipe/recipe = GLOB.gas_recipe_meta[params["mode"]] - if(internal.getMoles()) + if(internal.get_moles()) dump_gases() quality_loss = 0 progress_bar = 0 diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 0b246d6d07f..be97241e43a 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -88,7 +88,7 @@ var/datum/gas_mixture/removed = air1.removeRatio(transfer_ratio) - if(!removed || !removed.getMoles()) + if(!removed || !removed.get_moles()) return var/filtering = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index a2b3a906ef1..06df3448db1 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -76,8 +76,8 @@ var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0 var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0 - var/air1_moles = air1.getMoles() - var/air2_moles = air2.getMoles() + var/air1_moles = air1.get_moles() + var/air2_moles = air2.get_moles() if(!node2_concentration) if(air1.temperature <= 0) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 1084c6de03c..2860ed39e97 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -37,7 +37,7 @@ update_appearance() /obj/machinery/atmospherics/components/unary/bluespace_sender/Destroy() - if(bluespace_network.getMoles()) + if(bluespace_network.get_moles()) var/turf/local_turf = get_turf(src) local_turf.assume_air(bluespace_network) return ..() @@ -75,7 +75,7 @@ return if(default_change_direction_wrench(user, item)) return - if(item.tool_behaviour == TOOL_CROWBAR && panel_open && bluespace_network.getMoles() > 0) + if(item.tool_behaviour == TOOL_CROWBAR && panel_open && bluespace_network.get_moles() > 0) say("WARNING - Bluespace network can contain hazardous gases, deconstruct with caution!") if(!do_after(user, 3 SECONDS, src)) return @@ -120,7 +120,7 @@ data["on"] = on data["gas_transfer_rate"] = gas_transfer_rate var/list/bluespace_gasdata = list() - if(bluespace_network.getMoles()) + if(bluespace_network.get_moles()) for(var/gas_id in bluespace_network.gases) bluespace_gasdata.Add(list(list( "name" = bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], @@ -170,8 +170,8 @@ . = TRUE if("retrieve") - if(bluespace_network.getMoles() > 0) - var/datum/gas_mixture/remove = bluespace_network.remove(bluespace_network.getMoles()) + if(bluespace_network.get_moles() > 0) + var/datum/gas_mixture/remove = bluespace_network.remove(bluespace_network.get_moles()) airs[1].merge(remove) update_parents() bluespace_network.garbage_collect() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 470087c5e84..aaf25208977 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -272,7 +272,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/datum/gas_mixture/air1 = airs[1] - if(air1.getMoles() > CRYO_MIN_GAS_MOLES) + if(air1.get_moles() > CRYO_MIN_GAS_MOLES) if(beaker) beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * delta_time, efficiency * CRYO_MULTIPLY_FACTOR, methods = VAPOR) // Transfer reagents. consume_gas = TRUE @@ -287,7 +287,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/datum/gas_mixture/air1 = airs[1] /* PARIAH EDIT REMOVAL - HUGBOX BARGAGE - if(!nodes[1] || !airs[1] || !air1.gas.len || air1.getMoles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. + if(!nodes[1] || !airs[1] || !air1.gas.len || air1.get_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. var/msg = "Insufficient cryogenic gas, shutting down." radio.talk_into(src, msg, radio_channel) set_on(FALSE) @@ -327,7 +327,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics return null var/datum/gas_mixture/air1 = airs[1] var/breath_percentage = breath_request / air1.volume - return air1.remove(air1.getMoles() * breath_percentage) + return air1.remove(air1.get_moles() * breath_percentage) /obj/machinery/atmospherics/components/unary/cryo_cell/assume_air(datum/gas_mixture/giver) airs[1].merge(giver) @@ -539,10 +539,10 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics /obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() return FALSE // you can't see the pipe network when inside a cryo cell. -/obj/machinery/atmospherics/components/unary/cryo_cell/getTemperature() +/obj/machinery/atmospherics/components/unary/cryo_cell/return_temperature() var/datum/gas_mixture/G = airs[1] - if(G.getMoles() > 10) + if(G.get_moles() > 10) return G.temperature return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 5823dbe390a..04799bd414d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -143,7 +143,7 @@ // The gas we want to cool/heat var/datum/gas_mixture/port = airs[1] - if(!port.getMoles()) // Nothing to cool? go home lad + if(!port.get_moles()) // Nothing to cool? go home lad return var/port_capacity = port.getHeatCapacity() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index b616ffb70c9..44f3aab9e51 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -121,7 +121,7 @@ var/transfer_moles = (pressure_delta * environment.volume) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - if(!removed || !removed.getMoles()) + if(!removed || !removed.get_moles()) return loc.assume_air(removed) @@ -139,7 +139,7 @@ var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if(!removed || !removed.getMoles()) //No venting from space 4head + if(!removed || !removed.get_moles()) //No venting from space 4head return air_contents.merge(removed) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 977134d2fda..7593168ceef 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -254,7 +254,7 @@ else //Just siphoning all air - var/transfer_moles = environment.getMoles() * (volume_rate / environment.volume) + var/transfer_moles = environment.get_moles() * (volume_rate / environment.volume) var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 6e9098c571c..3152100da0a 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -194,7 +194,7 @@ var/turf/modeled_location = target - target_temperature = modeled_location.GetTemperature() + target_temperature = modeled_location.return_temperature() target_heat_capacity = modeled_location.GetHeatCapacity() var/delta_temperature = air.temperature - target_temperature @@ -238,9 +238,36 @@ pipeline_list |= atmos_machine.return_pipenets_for_reconcilation(src) gas_mixture_list |= atmos_machine.return_airs_for_reconcilation(src) - equalize_gases(gas_mixture_list) + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + var/datum/gas_mixture/total_gas_mixture = new + + var/list/total_gases = total_gas_mixture.gas + + for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) + total_gas_mixture.volume += gas_mixture.volume + + // This is sort of a combined merge + heat_capacity calculation + + var/list/giver_gases = gas_mixture.gas + //gas transfer + for(var/giver_id in giver_gases) + var/moles = giver_gases[giver_id] + total_gas_mixture.adjustGas(giver_id, moles) + + total_thermal_energy += THERMAL_ENERGY(gas_mixture) + + total_heat_capacity = total_gas_mixture.getHeatCapacity() + total_gas_mixture.temperature = total_heat_capacity ? (total_thermal_energy / total_heat_capacity) : 0 + + if(total_gas_mixture.volume > 0) + //Update individual gas_mixtures by volume ratio + for(var/mixture in gas_mixture_list) + var/datum/gas_mixture/gas_mixture = mixture + gas_mixture.copyFrom(total_gas_mixture, gas_mixture.volume / total_gas_mixture.volume) +/* /proc/equalize_gases(list/datum/gas_mixture/gases) //Calculate totals from individual components var/total_volume = 0 @@ -279,3 +306,4 @@ gasmix.multiply(gasmix.volume) return 1 +*/ diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 3ee63ba898e..500ff56c50b 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -60,7 +60,7 @@ broken_message = span_boldwarning("EXTERNAL PRESSURE OVER THRESHOLD") set_broken(TRUE) return FALSE - if(G.getMoles() > max_ext_mol) + if(G.get_moles() > max_ext_mol) broken_message = span_boldwarning("EXTERNAL AIR CONCENTRATION OVER THRESHOLD") set_broken(TRUE) return FALSE diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index d63ff0b2e24..ac0ac32ae1c 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -30,7 +30,7 @@ environment_temperature = local_turf.temperature else var/turf/open/open_local = local_turf - environment_temperature = open_local.GetTemperature() + environment_temperature = open_local.return_temperature() else environment_temperature = local_turf.temperature if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 64b540ecd1a..4b672388494 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -543,7 +543,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) */ /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() - var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.getMoles()) + var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.get_moles()) var/turf/T = get_turf(src) T.assume_air(expelled_gas) @@ -573,7 +573,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/process(delta_time) var/our_pressure = air_contents.returnPressure() - var/our_temperature = air_contents.getTemperature() + var/our_temperature = air_contents.get_temperature() protected_contents = FALSE if(shielding_powered) @@ -620,7 +620,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) air_contents.react() var/our_pressure = air_contents.returnPressure() - var/our_temperature = air_contents.getTemperature() + var/our_temperature = air_contents.get_temperature() ///function used to check the limit of the canisters and also set the amount of damage that the canister can receive, if the heat and pressure are way higher than the limit the more damage will be done if(!protected_contents && (our_temperature > heat_limit || our_pressure > pressure_limit)) @@ -741,7 +741,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(!holding) var/list/gaseslog = list() //list for logging all gases in canister for(var/gas in air_contents.gas) - gaseslog[xgm_gas_data.name[gas]] = air_contents.getGroupGas(gas) //adds gases to gaseslog + gaseslog[xgm_gas_data.name[gas]] = air_contents.gas[gas] //adds gases to gaseslog if(!(xgm_gas_data.flags[gas] & XGM_GAS_CONTAMINANT|XGM_GAS_FUEL)) continue danger = TRUE //at least 1 danger gas diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 3d1372c44e9..22b8413db86 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -45,7 +45,7 @@ /obj/machinery/portable_atmospherics/pump/process_atmos() var/pressure = air_contents.returnPressure() - var/temperature = air_contents.getTemperature() + var/temperature = air_contents.get_temperature() ///function used to check the limit of the pumps and also set the amount of damage that the pump can receive, if the heat and pressure are way higher than the limit the more damage will be done if(temperature > heat_limit || pressure > pressure_limit) take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit), 5, 50), BURN, 0) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 1bc15f5519b..e7c8abbcee5 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -45,7 +45,7 @@ /obj/machinery/portable_atmospherics/scrubber/process_atmos() var/pressure = air_contents.returnPressure() - var/temperature = air_contents.getTemperature() + var/temperature = air_contents.get_temperature() ///function used to check the limit of the scrubbers and also set the amount of damage that the scrubber can receive, if the heat and pressure are way higher than the limit the more damage will be done if(temperature > heat_limit || pressure > pressure_limit) take_damage(clamp((temperature/heat_limit) * (pressure/pressure_limit), 5, 50), BURN, 0) diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index ff59a4f8163..0f11dc967b0 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -51,38 +51,38 @@ * */ /obj/item/gas_filter/proc/reduce_filter_status(datum/gas_mixture/breath) -/* + var/list/gases = breath.getGases() var/danger_points = 0 - for(var/gas_id in breath.gas) + for(var/gas_id in gases) if(gas_id in high_filtering_gases) - if(breath.getGroupGas(gas_id) > HIGH_FILTERING_MOLES) - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(gases[gas_id] > HIGH_FILTERING_MOLES) + gases[gas_id] = max(gases[gas_id] - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.5 continue - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) + gases[gas_id] = max(gases[gas_id] - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.05 continue if(gas_id in mid_filtering_gases) - if(breath.getGroupGas(gas_id) > MID_FILTERING_MOLES) - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id)- filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(gases[gas_id] > MID_FILTERING_MOLES) + gases[gas_id] = max(gases[gas_id]- filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 0.75 continue - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) + gases[gas_id] = max(gases[gas_id] - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.15 continue if(gas_id in low_filtering_gases) - if(breath.getGroupGas(gas_id)> LOW_FILTERING_MOLES) - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) + if(gases[gas_id] > LOW_FILTERING_MOLES) + gases[gas_id] = max(gases[gas_id] - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) danger_points += 1 continue - breath.getGroupGas(gas_id) = max(breath.getGroupGas(gas_id) - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) + gases[gas_id] = max(gases[gas_id] - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) danger_points += 0.5 continue filter_status = max(filter_status - danger_points - FILTERS_CONSTANT_WEAR, 0) return breath -*/ + /obj/item/gas_filter/damaged name = "damaged gas filter" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 330ab7a00bc..d559b4372bd 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -259,7 +259,7 @@ /obj/item/clothing/head/helmet/space/suicide_act(mob/living/carbon/user) var/datum/gas_mixture/environment = user.loc.return_air() - if(HAS_TRAIT(user, TRAIT_RESISTCOLD) || !environment || environment.getTemperature() >= user.get_body_temp_cold_damage_limit()) + if(HAS_TRAIT(user, TRAIT_RESISTCOLD) || !environment || environment.get_temperature() >= user.get_body_temp_cold_damage_limit()) user.visible_message(span_suicide("[user] is beating [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS user.say("You want proof? I'll give you proof! Here's proof of what'll happen to you if you stay here with your stuff!", forced = "space helmet suicide") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index e8a0cc199cd..3fcaf759832 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -267,7 +267,7 @@ var/datum/gas_mixture/gas_mix = turf.air if(!gas_mix.getGroupGas(GAS_OXYGEN)) return - gas_mix.gas[GAS_OXYGEN] = max(gas_mix.getGroupGas(GAS_OXYGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.setGasMoles(GAS_OXYGEN, max(gas_mix.gas[GAS_OXYGEN] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0)) /datum/spacevine_mutation/nitro_eater name = "Nitrogen consuming" @@ -281,7 +281,7 @@ var/datum/gas_mixture/gas_mix = turf.air if(!gas_mix.getGroupGas(GAS_NITROGEN)) return - gas_mix.gas[GAS_NITROGEN] = max(gas_mix.getGroupGas(GAS_NITROGEN) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.setGasMoles(GAS_NITROGEN, max(gas_mix.gas[GAS_NITROGEN] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0)) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -295,7 +295,7 @@ var/datum/gas_mixture/gas_mix = turf.air if(!gas_mix.getGroupGas(GAS_OXYGEN)) return - gas_mix.gas[GAS_CO2] = max(gas_mix.getGroupGas(GAS_CO2) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.setGasMoles(GAS_CO2, max(gas_mix.gas[GAS_CO2] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0)) /datum/spacevine_mutation/plasma_eater name = "Plasma consuming" @@ -309,7 +309,7 @@ var/datum/gas_mixture/gas_mix = turf.air if(!gas_mix.getGroupGas(GAS_PLASMA)) return - gas_mix.gas[GAS_PLASMA] = max(gas_mix.getGroupGas(GAS_PLASMA) - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0) + gas_mix.setGasMoles(GAS_PLASMA, max(gas_mix.gas[GAS_PLASMA] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.energy, 0)) /datum/spacevine_mutation/thorns name = "Thorny" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index dbfa064f262..64917ada9af 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) - if(breath && breath.getMoles() > 0 && !sneaking) + if(breath && breath.get_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) ..() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 7408cbcc100..f3c267e7102 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -6,7 +6,7 @@ if(status_flags & GODMODE) return - if(!breath || (breath.getMoles() == 0)) + if(!breath || (breath.get_moles() == 0)) //Aliens breathe in vaccuum return 0 @@ -15,10 +15,10 @@ var/plasma_used = 0 var/plas_detect_threshold = 0.02 - var/breath_pressure = (breath.getMoles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + var/breath_pressure = (breath.get_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME //Partial pressure of the plasma in our breath - var/Plasma_pp = (breath.getGroupGas(GAS_PLASMA)/breath.getMoles())*breath_pressure + var/Plasma_pp = (breath.getGroupGas(GAS_PLASMA)/breath.get_moles())*breath_pressure if(Plasma_pp > plas_detect_threshold) // Detect plasma in air adjustPlasma(breath.getGroupGas(GAS_PLASMA)*250) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 1563e36e5f7..dbf39d46237 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -552,7 +552,7 @@ var/cooldown = 150 var/last_teleport = 0 ///Set to true upon action activation to prevent spamming teleport callbacks while the first is still occurring. - var/is_charging = FALSE + var/is_charging = FALSE /datum/action/innate/unstable_teleport/IsAvailable() . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 056f6beac98..1732d7ef210 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -73,7 +73,7 @@ return if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves))) var/datum/gas_mixture/environment = H.loc.return_air() - if(environment?.getMoles()) + if(environment?.get_moles()) /*if(environment.gases[/datum/gas/hypernoblium] && (environment.gases[/datum/gas/hypernoblium][MOLES]) >= 5) if(H.on_fire && H.fire_stacks > 0) H.adjust_fire_stacks(-10 * delta_time)*/ diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index a02a3b748fa..498462805b8 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -108,7 +108,7 @@ else if(isturf(loc)) //Breathe from loc as turf var/breath_moles = 0 if(environment) - breath_moles = environment.getMoles()*BREATH_PERCENTAGE + breath_moles = environment.get_moles()*BREATH_PERCENTAGE breath = loc.remove_air(breath_moles) else //Breathe from loc as obj again @@ -250,7 +250,7 @@ //BZ (Facepunch port of their Agent B) /* if(breath_gases[/datum/gas/bz]) - var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.getMoles())*breath_pressure + var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.get_moles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) @@ -259,7 +259,7 @@ //NITRIUM /* if(breath_gases[/datum/gas/nitrium]) - var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.getMoles())*breath_pressure + var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.get_moles())*breath_pressure if(nitrium_partialpressure > 0.5) adjustFireLoss(nitrium_partialpressure * 0.15) if(nitrium_partialpressure > 5) @@ -267,12 +267,12 @@ //FREON if(breath_gases[/datum/gas/freon]) - var/freon_partialpressure = (breath_gases[/datum/gas/freon][MOLES]/breath.getMoles())*breath_pressure + var/freon_partialpressure = (breath_gases[/datum/gas/freon][MOLES]/breath.get_moles())*breath_pressure adjustFireLoss(freon_partialpressure * 0.25) //MIASMA if(breath_gases[/datum/gas/miasma]) - var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.getMoles())*breath_pressure + var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.get_moles())*breath_pressure if(prob(1 * miasma_partialpressure)) var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 06038317da6..10d312c653b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1125,7 +1125,7 @@ var/loc_temp = environment ? environment.temperature : T0C if(isobj(loc)) var/obj/oloc = loc - var/obj_temp = oloc.getTemperature() + var/obj_temp = oloc.return_temperature() if(obj_temp != null) loc_temp = obj_temp else if(isspaceturf(get_turf(src))) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 6e5873f385f..819ddf41558 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -118,7 +118,7 @@ . = ..() if(stat == DEAD || !environment || !environment.getGroupGas(GAS_METHANE)) return - var/miasma_percentage = environment.gas[GAS_METHANE] / environment.getMoles() + var/miasma_percentage = environment.gas[GAS_METHANE] / environment.get_moles() if(miasma_percentage>=0.25) heal_bodypart_damage(1) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 323c2eb6b3f..47e70ea99b7 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -59,7 +59,7 @@ if(!T.air || !T.air.hasGas(GAS_CO2)) return - var/co2 = T.air.getGroupGas(GAS_CO2) + var/co2 = T.air.gas[GAS_CO2] if(co2 > 0 && DT_PROB(13, delta_time)) var/amt = min(co2, 9) T.air.adjustGas(GAS_CO2, -amt) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6396d572acd..2390d9e5664 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -317,12 +317,12 @@ if(isturf(loc) && isopenturf(loc)) var/turf/open/ST = loc if(ST.air) - var/datum/gas_mixture/muhair = ST.return_air() + var/datum/gas_mixture/muhair = ST.return_air().getGases() - var/plas = muhair.getGroupGas(GAS_PLASMA) - var/oxy = muhair.getGroupGas(GAS_OXYGEN) - var/n2 = muhair.getGroupGas(GAS_NITROGEN) - var/co2 = muhair.getGroupGas(GAS_CO2) + var/plas = muhair[GAS_PLASMA] + var/oxy = muhair[GAS_OXYGEN] + var/n2 = muhair[GAS_NITROGEN] + var/co2 = muhair[GAS_CO2] if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 8a6246b8c5c..fa762eae317 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -145,7 +145,7 @@ if(stat != DEAD) var/bz_percentage =0 if(environment.gases[/datum/gas/bz]) - bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.getMoles() + bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.get_moles() var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis switch(stat) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 2a40addf9d9..a3622673254 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -340,12 +340,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/gasdata = list() - if(air.getMoles()) - data["SM_moles"] = air.getMoles() + if(air.get_moles()) + data["SM_moles"] = air.get_moles() for(var/gasid in air.gases) gasdata.Add(list(list( "name"= air.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = round(100*air.gases[gasid][MOLES]/air.getMoles(),0.01)))) + "amount" = round(100*air.gases[gasid][MOLES]/air.get_moles(),0.01)))) else for(var/gasid in air.gases) diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index fea9fa5303b..d343f452258 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -22,7 +22,7 @@ var/datum/gas_mixture/removed if(produces_gas) //Remove gas from surrounding area - removed = env.remove(gasefficency * env.getMoles()) + removed = env.remove(gasefficency * env.get_moles()) else // Pass all the gas related code an empty gas container removed = new() @@ -35,7 +35,7 @@ else psy_overlay = FALSE damage_archived = damage - if(!removed || !removed.getMoles() || isspaceturf(local_turf)) //we're in space or there is no gas to process + if(!removed || !removed.get_moles() || isspaceturf(local_turf)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage if(!istype(env, /datum/gas_mixture/immutable) && produces_gas && power) //There is no gas to process, but we are not in a space turf. Lets make them. @@ -113,7 +113,7 @@ //((((some value between 0.5 and 1 * temp - ((273.15 + 40) * some values between 1 and 10)) * some number between 0.25 and knock your socks off / 150) * 0.25 //Heat and mols account for each other, a lot of hot mols are more damaging then a few //Mols start to have a positive effect on damage after 350 - damage = max(damage + (max(clamp(removed.getMoles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(clamp(removed.get_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) //Power only starts affecting damage when it is above 5000 damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0) //Molar count only starts affecting damage when it is above 1800 @@ -151,7 +151,7 @@ //calculating gas related values //Wanna know a secret? See that max() to zero? it's used for error checking. If we get a mol count in the negative, we'll get a divide by zero error //Old me, you're insane - combined_gas = max(removed.getMoles(), 0) + combined_gas = max(removed.get_moles(), 0) //This is more error prevention, according to all known laws of atmos, gas_mix.remove() should never make negative mol values. //But this is tg @@ -334,9 +334,9 @@ return var/range = 4 zap_cutoff = 1500 - if(removed && removed.returnPressure() > 0 && removed.getTemperature() > 0) + if(removed && removed.returnPressure() > 0 && removed.get_temperature() > 0) //You may be able to freeze the zapstate of the engine with good planning, we'll see - zap_cutoff = clamp(3000 - (power * (removed.getMoles()) / 10) / removed.getTemperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(3000 - (power * (removed.get_moles()) / 10) / removed.get_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details range = clamp(power / removed.returnPressure() * 10, 2, 7) diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 249263ed9ed..a13ec413f22 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -526,7 +526,7 @@ var/turbine_pressure = max(turbine.machine_gasmix.returnPressure(), 0.01) //the total work done by the gas - var/work_done = turbine.machine_gasmix.getMoles() * R_IDEAL_GAS_EQUATION * turbine.machine_gasmix.temperature * log(compressor_pressure / turbine_pressure) + var/work_done = turbine.machine_gasmix.get_moles() * R_IDEAL_GAS_EQUATION * turbine.machine_gasmix.temperature * log(compressor_pressure / turbine_pressure) //removing the work needed to move the compressor but adding back the turbine work that is the one generating most of the power. work_done = max(work_done - compressor_work * TURBINE_COMPRESSOR_STATOR_INTERACTION_MULTIPLIER - turbine_work, 0) @@ -545,7 +545,7 @@ * Handles all the calculations needed for the gases, work done, temperature increase/decrease */ /obj/machinery/power/turbine/core_rotor/proc/do_calculations(datum/gas_mixture/input_mix, datum/gas_mixture/output_mix, work_amount_to_remove, regulated = FALSE) - var/work_done = input_mix.getMoles() * R_IDEAL_GAS_EQUATION * input_mix.temperature * log((input_mix.volume * max(input_mix.returnPressure(), 0.01)) / (output_mix.volume * max(output_mix.returnPressure(), 0.01))) * TURBINE_WORK_CONVERSION_MULTIPLIER + var/work_done = input_mix.get_moles() * R_IDEAL_GAS_EQUATION * input_mix.temperature * log((input_mix.volume * max(input_mix.returnPressure(), 0.01)) / (output_mix.volume * max(output_mix.returnPressure(), 0.01))) * TURBINE_WORK_CONVERSION_MULTIPLIER if(work_amount_to_remove) work_done = work_done - work_amount_to_remove @@ -557,7 +557,7 @@ var/output_mix_heat_capacity = output_mix.getHeatCapacity() if(!output_mix_heat_capacity) return 0 - output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * output_mix.getMoles() * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) + output_mix.temperature = max((output_mix.temperature * output_mix_heat_capacity + work_done * output_mix.get_moles() * TURBINE_HEAT_CONVERSION_MULTIPLIER) / output_mix_heat_capacity, TCMB) return work_done /obj/item/paper/guides/jobs/atmos/turbine diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 82f3c17d7c5..bdc3161c00a 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -478,7 +478,7 @@ exposed_turf.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) if(hotspot) - var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.getMoles()) + var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.air.get_moles()) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react(src) exposed_turf.assume_air(lowertemp) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e908d09ebf9..3f6c7257c71 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -368,7 +368,7 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message(span_warning("[src] malfunctions, melting [exp_on] and leaking hot air!")) var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.getMoles() + var/transfer_moles = 0.25 * env.get_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) var/heat_capacity = removed.getHeatCapacity() @@ -414,7 +414,7 @@ else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message(span_warning("[src] malfunctions, shattering [exp_on] and leaking cold air!")) var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.getMoles() + var/transfer_moles = 0.25 * env.get_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) if(removed) var/heat_capacity = removed.getHeatCapacity() diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 3ace3f14b5c..f66c66b725e 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -125,7 +125,7 @@ /// Glorified volume pump. /obj/machinery/atmospherics/components/binary/tank_compressor/process_atmos() var/datum/gas_mixture/input_air = airs[2] - if(!input_air?.getMoles() || !active || !transfer_rate || !inserted_tank) + if(!input_air?.get_moles() || !active || !transfer_rate || !inserted_tank) return var/datum/gas_mixture/tank_air = inserted_tank.return_air() @@ -176,9 +176,9 @@ * Mole requirements in experiments are tracked by buffer data. */ /obj/machinery/atmospherics/components/binary/tank_compressor/proc/flush_buffer() - if(!leaked_gas_buffer.getMoles()) + if(!leaked_gas_buffer.get_moles()) return - if(leaked_gas_buffer.getMoles() > SIGNIFICANT_AMOUNT_OF_MOLES) + if(leaked_gas_buffer.get_moles() > SIGNIFICANT_AMOUNT_OF_MOLES) record_data() else say("Buffer data discarded. Required moles for storage: [SIGNIFICANT_AMOUNT_OF_MOLES] moles.") diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 4e42bcc2bdc..bac86d937f5 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -95,7 +95,7 @@ var/datum/gas_mixture/env = L.return_air() if(env.temperature < (heat_amt+T0C)) - var/transfer_moles = 0.25 * env.getMoles() + var/transfer_moles = 0.25 * env.get_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 9a2933e81f1..5f7b88442cb 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -108,7 +108,7 @@ Chilling extracts: for(var/turf/T in A) var/datum/gas_mixture/G = T.air if(istype(G)) - G.gas[GAS_PLASMA] = 0 + G.setGasMoles(GAS_PLASMA, 0) filtered = TRUE //T.air_update_turf(FALSE, FALSE) if(filtered) diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 36afbd35010..a56a14fcd3a 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -141,7 +141,7 @@ /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', /obj/item/knife/butcher = 'sound/surgery/scalpel1.ogg', /obj/item = 'sound/surgery/scalpel1.ogg', - ) + ) success_sound = 'sound/surgery/organ2.ogg' /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index ce365c53fe2..47f0f73e13a 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -225,9 +225,9 @@ // Priority 3: use internals tank. var/datum/gas_mixture/internal_mix = owner.internal.return_air() - if(internal_mix && internal_mix.getMoles() > num) + if(internal_mix && internal_mix.get_moles() > num) var/datum/gas_mixture/removed = internal_mix.remove(num) - if(removed.getMoles() > 0.005) + if(removed.get_moles() > 0.005) owner_turf.assume_air(removed) ion_trail.generate_effect() return TRUE diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 7e12d528e46..9a1a904d4a8 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -129,6 +129,7 @@ var/N2_pp = breath.getBreathPartialPressure(N2_moles) var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) + //Vars for n2o and healium induced euphorias. var/n2o_euphoria = EUPHORIA_LAST_FLAG var/healium_euphoria = EUPHORIA_LAST_FLAG @@ -262,7 +263,7 @@ if(breath) // If there's some other shit in the air lets deal with it here. // N2O - var/n2o_moles = breath.getGroupGas(GAS_N2O) + var/n2o_moles = breath.gas[GAS_N2O] var/SA_pp = breath.getBreathPartialPressure(n2o_moles) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) @@ -586,11 +587,11 @@ var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] - if(!mix?.getMoles()) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE + if(!mix?.get_moles()) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE return // Take a "breath" of the air - var/datum/gas_mixture/breath = mix.remove(mix.getMoles() * BREATH_PERCENTAGE) + var/datum/gas_mixture/breath = mix.remove(mix.get_moles() * BREATH_PERCENTAGE) var/oxygen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/oxygen][MOLES]) var/nitrogen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/nitrogen][MOLES]) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 6fecaea4cc4..e15966ed724 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -429,12 +429,12 @@ var/datum/gas_mixture/int_tank_air = internal_tank.return_air() if(int_tank_air.returnPressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) set_internal_damage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.getVolume() > 0) //heat the air_contents + if(int_tank_air && int_tank_air.get_volume() > 0) //heat the air_contents int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*delta_time) - if(cabin_air && cabin_air.getVolume()>0) - cabin_air.temperature = min(6000+T0C, cabin_air.getTemperature()+rand(5,7.5)*delta_time) - if(cabin_air.getTemperature() > max_temperature/2) - take_damage(delta_time*2/round(max_temperature/cabin_air.getTemperature(),0.1), BURN, 0, 0) + if(cabin_air && cabin_air.get_volume()>0) + cabin_air.temperature = min(6000+T0C, cabin_air.get_temperature()+rand(5,7.5)*delta_time) + if(cabin_air.get_temperature() > max_temperature/2) + take_damage(delta_time*2/round(max_temperature/cabin_air.get_temperature(),0.1), BURN, 0, 0) if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank @@ -453,7 +453,7 @@ cell.maxcharge -= min(10 * delta_time, cell.maxcharge) if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) - if(cabin_air && cabin_air.getVolume() > 0) + if(cabin_air && cabin_air.get_volume() > 0) var/delta = cabin_air.temperature - T20C cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * delta_time @@ -1237,7 +1237,7 @@ return air?.returnPressure() ///fetches temp of the gas mixture we are using -/obj/vehicle/sealed/mecha/getTemperature() +/obj/vehicle/sealed/mecha/return_temperature() var/datum/gas_mixture/air = return_air() return air?.temperature diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 3b4906ca291..0182b5b8f69 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -120,7 +120,7 @@ data["airtank_temp"] = int_tank_air?.temperature data["port_connected"] = internal_tank?.connected_port ? TRUE : FALSE data["cabin_pressure"] = round(returnPressure(), 0.01) - data["cabin_temp"] = getTemperature() + data["cabin_temp"] = return_temperature() data["dna_lock"] = dna_lock data["mech_view"] = ui_view.assigned_map if(radio) From b8e472ebb24b82a3f42e5a2961b6f11236192cc8 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 1 May 2022 23:39:30 -0400 Subject: [PATCH 062/200] Fixes critical math errors. --- .../atmospherics/machinery/components/binary_devices/pump.dm | 5 +++-- code/modules/atmospherics/machinery/datum_pipeline.dm | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 673c33b2e1b..1f65b89e936 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -64,8 +64,9 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] - var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles - if(pump_gas(air1, air2, calculate_transfer_moles(air1, air2, transfer_moles))) + //var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles + var/transfer_moles = calculate_transfer_moles(air1, air2, target_pressure - air2.returnPressure(), air2 ? air2.volume : 0) + if(pump_gas(air1, air2, transfer_moles)) update_parents() /** diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 3152100da0a..e9ea7937732 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -241,9 +241,7 @@ var/total_thermal_energy = 0 var/total_heat_capacity = 0 - var/datum/gas_mixture/total_gas_mixture = new - - var/list/total_gases = total_gas_mixture.gas + var/datum/gas_mixture/total_gas_mixture = new(0) for(var/datum/gas_mixture/gas_mixture as anything in gas_mixture_list) total_gas_mixture.volume += gas_mixture.volume From 930417ca7dc2f85e0b3c4ab4d9addf1a1712e4ea Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Mon, 2 May 2022 01:20:13 -0400 Subject: [PATCH 063/200] More equipment to test. --- _maps/map_files/debug/atmos_mintest.dmm | 87 ++++++++++++++++--------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index fc78cf65a19..a4e9a68562a 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -33,7 +33,7 @@ "aG" = (/obj/machinery/button/door{id = "c2vent"; name = "c2vent"},/turf/open/floor/iron,/area/hallway/primary/central) "aH" = (/obj/machinery/button/door{id = "c3vent"; name = "c3vent"},/turf/open/floor/iron,/area/hallway/primary/central) "aI" = (/obj/structure/cable,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"aJ" = (/turf/open/floor/plating,/area/hallway/primary/central) +"aJ" = (/obj/machinery/atmospherics/components/unary/portables_connector,/turf/open/floor/iron,/area/hallway/primary/central) "aK" = (/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) "aL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) "aM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) @@ -105,16 +105,21 @@ "ca" = (/obj/machinery/light/floor,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) "cb" = (/obj/machinery/door/airlock/public/glass{name = "Basic Equipment Tests"},/turf/open/floor/iron,/area/hallway/primary/central) "cc" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/heat_exchanging/junction{icon_state = "pipe11-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) -"ch" = (/turf/open/space/basic,/area/hallway/primary/central) -"ci" = (/obj/machinery/atmospherics/components/unary/portables_connector,/turf/open/floor/plating,/area/hallway/primary/central) -"cj" = (/obj/machinery/atmospherics/components/binary/thermomachine/freezer,/turf/open/floor/plating,/area/hallway/primary/central) -"ck" = (/obj/machinery/atmospherics/components/binary/thermomachine/heater,/turf/open/floor/plating,/area/hallway/primary/central) +"cd" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/turf/open/floor/iron,/area/hallway/primary/central) +"ce" = (/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{icon_state = "manifold-3"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) +"cf" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cg" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/iron,/area/hallway/primary/central) +"ch" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/open/floor/iron,/area/hallway/primary/central) +"ci" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cj" = (/obj/machinery/atmospherics/components/unary/thermomachine/freezer,/turf/open/floor/plating,/area/hallway/primary/central) +"ck" = (/turf/open/floor/plating,/area/hallway/primary/central) "cl" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) "cm" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 6},/turf/open/space/basic,/area/space) "cn" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 10},/turf/open/space/basic,/area/space) "co" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/turf/open/space/basic,/area/space) "cp" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 5},/turf/open/space/basic,/area/space) "cq" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 9},/turf/open/space/basic,/area/space) +"cr" = (/obj/machinery/atmospherics/components/unary/thermomachine/heater,/turf/open/floor/plating,/area/hallway/primary/central) "cs" = (/obj/structure/table/reinforced,/obj/item/analyzer,/turf/open/floor/iron,/area/hallway/primary/central) "ct" = (/obj/effect/landmark/start/assistant,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) "cu" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/turf/open/floor/iron,/area/hallway/primary/central) @@ -123,41 +128,63 @@ "cx" = (/obj/structure/table/reinforced,/obj/item/mod/control/pre_equipped/debug,/turf/open/floor/iron,/area/hallway/primary/central) "cy" = (/obj/structure/table/reinforced,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/turf/open/floor/iron,/area/hallway/primary/central) "cz" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Gravgen"},/turf/open/floor/iron,/area/hallway/primary/central) +"cA" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) +"cB" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cC" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) +"cD" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cE" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) +"cF" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cG" = (/obj/machinery/atmospherics/components/binary/volume_pump,/turf/open/floor/iron,/area/hallway/primary/central) +"cH" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/obj/machinery/portable_atmospherics/canister,/turf/open/floor/iron,/area/hallway/primary/central) +"cI" = (/obj/machinery/light/floor,/obj/machinery/atmospherics/components/unary/passive_vent,/turf/open/floor/iron,/area/hallway/primary/central) +"cJ" = (/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"cK" = (/obj/machinery/door/airlock/public/glass,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/iron,/area/hallway/primary/central) +"cL" = (/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/open/floor/iron,/area/hallway/primary/central) +"cM" = (/obj/machinery/light/floor,/obj/machinery/atmospherics/components/unary/passive_vent{icon_state = "passive_vent_map-3"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) +"cN" = (/obj/machinery/atmospherics/components/unary/heat_exchanger{icon_state = "he1"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) +"cO" = (/obj/machinery/atmospherics/components/unary/heat_exchanger{icon_state = "he1"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) +"cP" = (/obj/machinery/atmospherics/components/binary/circulator/cold{icon_state = "circ-off-0"; dir = 4},/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"cQ" = (/obj/machinery/power/generator,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"cR" = (/obj/machinery/atmospherics/components/binary/circulator{icon_state = "circ-off-0"; dir = 8},/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) +"cS" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) +"cT" = (/obj/machinery/atmospherics/components/trinary/mixer,/turf/open/floor/iron,/area/hallway/primary/central) +"cU" = (/obj/machinery/atmospherics/components/binary/tank_compressor,/turf/open/floor/iron,/area/hallway/primary/central) +"cV" = (/obj/item/storage/toolbox/mechanical,/turf/open/floor/iron,/area/hallway/primary/central) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaababacacacabababadadadabababaeaeaeabababafafafabababacacacababaaaaaaaaaaaaaaaa -aaabagagagagagabaUahahahaUabaVaiaiaiaVabaWajajajaWabaqagagagaqabaacmcncmcnaaaaaa -aaacagalagalagacahahahahahamaiaiaiaiaianajajajajajacagagagagagacaacocococoaaaaaa +aaabagagagagagabaUahahahaUabaVaiaiaiaVabaWajajajaWabaqagagagaqabaaaaaaaaaaaaaaaa +aaacagalagalagacahahahahahamaiaiaiaiaianajajajajajacagagagagagacaacmcncmcnaaaaaa aaacagaNaqaNagacahaharahahamaiaiaiaiaianajajasajajacagagagagagacaacocococoaaaaaa -aaacagalapalapacahahauahahamaiavbIavaianajawbJawajacagagaTagagacaacocococoaaaaaa -aaabagagapagayabaUbKazahaUabaVbLaAaiaVabaWbMaBajaWabaqagapagaqabaacocpcqcoaaaaaa -aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacabababccacacccababaa -aaabctagapagakabaKbQaFbRagagagbSaGbTagagagbUaHbVagagaqagapagagaqcsbXaKaKbXaqabaa -aaacctagapagaoacaKbWagagagagagbSagagagagagbUagagagagagagapagagagagagagagagagabaa -aaacctagbAagatacaLbXagagagagagbXagagagagagbXagagagagagagapagagagagagagagagagabaa +aaacagalapalapacahahauahahamaiavbIavaianajawbJawajacagagaTagagacaacocpcqcoaaaaaa +aaabagagapagayabaUbKazahaUabaVbLaAaiaVabaWbMaBajaWabaqagapagaqababccacacccababaa +aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacababcsbXaKaKbXaqabaa +aaabctagapagakabaKbQaFbRagagagbSaGbTagagagbUaHbVagagaqagapagagaqagagagagagagacaa +aaacctagapagaoacaKbWagagagagagbSagagagagagbUagagagagagagapagagagagagagagagagacaa +aaacctagbAagatacaLbXagagagagagbXagagagagagbXagagagagagagapagagagagagagagagagacaa aaacctagapagaxacaLagagaqagagagagaqagagagagagaqagagagaqagapagaqagagagaqagagagabaa -aaacctagbAagaCacaLagagagagagagagagagagagagagagagagagagagapagagagagagagagagagabaa -aaacctagapagcuacaMagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa -aaacctagbAagcvacaMagagaqagagagagaqagagagagagaqagagagaqagapagaqagagagaqagagagacaa -aaacctagapagcwacaMagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa +aaacctagbAagaCacaLagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa +aaacctagapagcuacaMagagagagagagagagagagagagagagaJagaJagagapagagagagagagagagagacaa +aaacctagbAagcvacaMagagaqagagagagaqagagagagagaqcPcQcRcaapapagaqagagagaqagagagacaa +aaacctagapagcwacaMagagagagagagagagagagagagagagbXcVbXagagapagagagagagagagagagacaa aaacctagbAagcxabbeagagagagagagagaqagagagagagagagagagagagapagagagagagagagagagabaa -aaacctagapagcyababbDbEaqagagagbBbBbBagagagagaqagagagaqagapagaqagagagaqagagagabaa -aaacctagbAagagabbFbGbHagagagagagapagagagagagagagagagagagapagagagagagagagagagabaa +aaacctagapagcyababbDbEaqagagagbBbBbBagagagagaqagagagaqagapagaqagagagaqagagagacaa +aaacctagbAagagabbFbGbHagagagagagapagagagagagagagagagagagapagagagagagagagagagacaa aaacagaIapapbCbZapapaIapapapapapaIapapapapapaIapapapcaapapagaqagagagaqagagagacaa aaabagagagagagabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagaqabaa aaababacacacabababacacacacabcbcbcbabacacacacacacacacacacabacacacabacacacabababaa -aaabaJaJaJaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeacagagagacagagagacchchaa -aaacaJbfaJaJaJaJaJbfaJaJaJbgagaqagagagagaqagagagagagaqagbzagaqagbzagaqagaSaaaaaa -aaacbhbhbhbibjbkbiblbkbibmbnagagagagagagagagagagagagagagacagagagacagagagacaaaaaa -aaacagagagagagagagagagagagagagagagagagagagagciciagagagagabacbzacabacbzacabaaaaaa -aaacbobpagbqbqagagaqagbrbsbtagaqagagagagaqagcjckagagaqagacagagagacagagagacaaaaaa -aaacboboagbqbqagagagaXbuaJbvaZagagagagagagagclclagagagagbzagaqagbzagaqagaSaaaaaa -aaacboboagbqbqagagagagbwbxbyagagagagagagagagagagagagagagacagagagacagagagacaaaaaa -aaacboboagbqbqagagagagagagagagagagagagagagagagagagagagagabacbzacabacbzacabaaaaaa -aaacbobpagbqbqagagaqagagagagagaqagagagagaqagagagagagaqagacagagagagagagagacaaaaaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagbzagaqagagagaqagaSaaaaaa -aaabagagagagagagagagagagagagagagagagagagagagagagagagagagacagagagagagagagacaaaaaa +aaabckckckaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeacagagagacagagagacaaaaaa +aaacckbfckckckckckbfckckckbgagaqagagagagaqagagagagagaqagbzagcIagbzagaqagaSaaaaaa +aaacbhbhbhbibjbkbiblbkbibmbnagagagaJaJagagagagagagagagagacaPcJagacaPagagacaaaaaa +aaacagagagagagagagagagagagagagagcdcecfcgagagagagagagagagabaccKacabacbzacabaaaaaa +aaacbobpagbqbqagagaqagbrbsbtagaqchcecicgaqagcjcragcLaqagacagcJagacagagagacaaaaaa +aaacboboagbqbqagagagaXbuckbvaZagcAcecBcgagagclclagbXagagbzagcMagbzagaqagaSaaaaaa +aaacboboagbqbqagagagagbwbxbyagagcCcecDcgagagagagagagagagacaPagagacaPagagacaaaaaa +aaacboboagbqbqagagagagagagagaJagcEcecFcgagaXcNcOaZagagagabacbzacabacbzacabaaaaaa +aaacbobpagbqbqagagaqagagagcScTaqagcGbXagaqagagagagagaqagacagagagagagagagacaaaaaa +aaabagagagagagagagagagagagagbXagagcHagagagagagagagagagagbzagaqagaPagaqagaSaaaaaa +aaabagagagagagagagagagagagagagagagagagagagagcUagagagagagacagagagagagagagacaaaaaa aaababacbzacabababacacbzacacabababacbzacacabababacbzacababacacacabacacacabaaaaaa aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa From c92728bd56334bb5408b926ef0250748f97f1c3d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 01:20:58 -0400 Subject: [PATCH 064/200] Fixes gas anal. --- code/__DEFINES/atmospherics/ZAS.dm | 8 +++----- code/game/objects/items/devices/scanners/gas_analyzer.dm | 3 ++- code/modules/atmospherics/ZAS/Diagnostic.dm | 5 +---- code/modules/atmospherics/ZAS/Turf.dm | 3 +++ 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index e6e6962c118..54da47543c2 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -47,8 +47,7 @@ GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } \ else if (A.contents.len) { \ ret = 0;\ - for (var/thing in A) { \ - var/atom/movable/AM = thing; \ + for (var/atom/movable/AM as anything in A) { \ switch (AM.can_atmos_pass) { \ if (CANPASS_ALWAYS) { \ continue; \ @@ -84,8 +83,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) } \ else if (A.contents.len) { \ ret = 0;\ - for (var/thing in A) { \ - var/atom/movable/AM = thing; \ + for (var/atom/movable/AM as anything in A) { \ switch (AM.can_atmos_pass) { \ if (CANPASS_ALWAYS) { \ continue; \ @@ -256,7 +254,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) -GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) +GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 1b84260dda5..a783192826a 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -161,7 +161,8 @@ var/list/cached_gases = air.gas for(var/id in cached_gases) var/gas_concentration = cached_gases[id]/total_moles - message += span_notice("[id]: [round(air.getGroupGas(id), 0.01)] mol ([round(gas_concentration*100, 0.01)] %)") + var/amount = round(air.gas[id], 0.01) + message += span_notice("[xgm_gas_data.name[id]]: [amount >= 0.01 ? "[amount] mol" : "Trace amounts." ] ([round(gas_concentration*100, 0.01)] %)") message += span_notice("Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") message += span_notice("Volume: [volume] L") message += span_notice("Pressure: [round(pressure, 0.01)] kPa") diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 1ee1b6ac39e..7a366d9ac68 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -8,7 +8,7 @@ var/datum/gas_mixture/mix = T.return_air() to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.returnPressure()] kPa [mix.temperature]C")) for(var/g in mix.gas) - to_chat(mob, span_admin("ZASDBG_GAS:[g]: [mix.gas[g]]\n")) + to_chat(mob, span_admin("ZASDBG_GAS: [g]: [mix.gas[g]]\n")) else if(zone_debug_images) for(var/zone in zone_debug_images) @@ -43,13 +43,10 @@ to_chat(mob, "No air passage :x") return - //var/turf/simulated/other_turf = get_step(T, direction_list[direction]) ZASTURF var/turf/other_turf = get_step(T, direction_list[direction]) if(istype(other_turf, /turf/open/space)) return - //var/t_block = T.zas_canpass(other_turf) -// var/o_block = other_turf.zas_canpass(T) var/t_block ATMOS_CANPASS_TURF(t_block, T, other_turf) var/o_block diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index cca229a94c7..5d4e1a33ebc 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -423,3 +423,6 @@ if(open_directions & dir) adjacent_turfs += get_step(src, dir) return length(adjacent_turfs) ? adjacent_turfs : null + +/turf/open/return_analyzable_air() + return return_air() From 006dbff5e79e7b08036e721f64e07a05fb1b8c21 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 04:01:22 -0400 Subject: [PATCH 065/200] Fix atmos filters. Quantize gas during filtering --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/controllers/subsystem/statpanel.dm | 6 +- .../atmospherics/ZAS/atmos_primitives.dm | 4 +- .../components/trinary_devices/filter.dm | 17 ++-- tgui/packages/tgui/constants.js | 82 +++++++++++++++++-- 5 files changed, 91 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 54da47543c2..56b5bd809ef 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -250,7 +250,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define GAS_CHLORINE "chlorine" #define GAS_SULFUR "sulfurdioxide" #define GAS_STEAM "water" -#define GAS_PLASMA "phoron" +#define GAS_PLASMA "plasma" GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 790ecbdc9a0..3be33fb0384 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -28,13 +28,13 @@ SUBSYSTEM_DEF(statpanels) cached ? "Next Map: [cached.map_name]" : null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)", - "\n", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]", + "\n", + "Station Time: [station_time_timestamp()]", "Internal Round Timer: [SSticker.round_start_time ? time2text(world.time - SSticker.round_start_time, "hh:mm:ss", 0) : "The round hasn't started yet!"]", "Actual Round Timer: [SSticker.round_start_timeofday ? time2text(REALTIMEOFDAY - SSticker.round_start_timeofday, "hh:mm:ss", 0) : "The round hasn't started yet!"]", - "Station Time: [station_time_timestamp()]", "\n", - "Connected/Playing: [length(GLOB.clients)]/[get_active_player_count()]" + "Playes Playing/Connected: [get_active_player_count()]/[length(GLOB.clients)]" ) if(SSshuttle.emergency) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 4ff8a06286e..44a966949ab 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -22,7 +22,7 @@ // Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. #define MINIMUM_MOLES_TO_PUMP 0.01 -#define MINIMUM_MOLES_TO_FILTER 0.04 +#define MINIMUM_MOLES_TO_FILTER 0.04 //0.04 /obj/machinery/atmospherics/var/debug = 0 @@ -206,6 +206,7 @@ var/total_unfilterable_moles = 0 //the total amount of non-filterable gas var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type for (var/g in source.getGases()) + source.gas[g] = QUANTIZE(source.gas[g]) //Reforged note: Gas can no longer leak through filters. Thats actually "intentional" behavior, but it annoyed the fuck out of me and i need sterile testing environments. if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) continue @@ -247,7 +248,6 @@ var/unfiltered_power_used = 0 //power used to move unfilterable gas to sink_clean for (var/g in removed.gas) var/power_used = specific_power_gas[g]*removed.gas[g] - if (g in filtering) //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop. sink_filtered.adjustGasWithTemp(g, removed.gas[g], removed.temperature, update=0) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index be97241e43a..09d09ae9e98 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -99,13 +99,18 @@ // If no filter is set, we just try to forward everything to air3 to avoid gas being outright lost. if(filtering) var/datum/gas_mixture/filtered_out = new - filter_gas(filtering, removed, filtered_out, removed, null, INFINITY) - // Send things to the side output if we can, return them to the input if we can't. + var/datum/gas_mixture/merge_to + // Send things to the side output if we can, return them to the input if we can't. // This means that other gases continue to flow to the main output if the side output is blocked. if (side_output_full) - air1.merge(filtered_out) + merge_to = air1 else - air2.merge(filtered_out) + merge_to = air2 + var/transfer_moles = calculate_transfer_moles(removed, merge_to, transfer_rate - merge_to.returnPressure()) + filter_gas(filter_type, removed, filtered_out, removed, transfer_moles) + // Send things to the side output if we can, return them to the input if we can't. + // This means that other gases continue to flow to the main output if the side output is blocked. + merge_to.merge(filtered_out) // Make sure we don't send any now-empty gas entries to the main output // Send things to the main output if we can, return them to the input if we can't. @@ -135,8 +140,8 @@ data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - for(var/gas in GLOB.all_gases) - data["filter_types"] += list(list("name" = xgm_gas_data[gas], "enabled" = (gas in filter_type))) + for(var/gas in GLOB.common_gases) + data["filter_types"] += list(list("name" = xgm_gas_data.name[gas], "gas_id" = gas, "enabled" = (gas in filter_type))) return data diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 495c04d8a0e..482560f90b6 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -140,19 +140,19 @@ export const RADIO_CHANNELS = [ const GASES = [ { - 'id': 'o2', + 'id': 'oxygen', 'name': 'Oxygen', 'label': 'O₂', 'color': 'blue', }, { - 'id': 'n2', + 'id': 'nitrogen', 'name': 'Nitrogen', 'label': 'N₂', 'color': 'red', }, { - 'id': 'co2', + 'id': 'carbon_dioxide', 'name': 'Carbon Dioxide', 'label': 'CO₂', 'color': 'grey', @@ -164,7 +164,7 @@ const GASES = [ 'color': 'pink', }, { - 'id': 'water_vapor', + 'id': 'steam', 'name': 'Water Vapor', 'label': 'H₂O', 'color': 'lightsteelblue', @@ -176,15 +176,15 @@ const GASES = [ 'color': 'teal', }, { - 'id': 'n2o', + 'id': 'sleeping_agent', 'name': 'Nitrous Oxide', 'label': 'N₂O', 'color': 'bisque', }, { - 'id': 'no2', - 'name': 'Nitrium', - 'label': 'Nitrium', + 'id': 'nitrodioxide', + 'name': 'Nitrogen Dioxide', + 'label': 'Nitrodioxide', 'color': 'brown', }, { @@ -259,6 +259,72 @@ const GASES = [ 'label': 'Anti-Noblium', 'color': 'maroon', }, + { + 'id': 'carbon_monoxide', + 'name': 'Carbon Monoxide', + 'label': 'CO', + 'color': 'maroon', + }, + { + 'id': 'methyl_bromide', + 'name': 'Methyl Bromide', + 'label': 'NO₂', + 'color': 'maroon', + }, + { + 'id': 'methane', + 'name': 'Methane', + 'label': 'CH₄', + 'color': 'maroon', + }, + { + 'id': 'methane', + 'name': 'Methane', + 'label': 'CH₄', + 'color': 'maroon', + }, + { + 'id': 'argon', + 'name': 'Argon', + 'label': 'Ar', + 'color': 'maroon', + }, + { + 'id': 'krypton', + 'name': 'Krypton', + 'label': 'Kr', + 'color': 'maroon', + }, + { + 'id': 'xenon', + 'name': 'Xenon', + 'label': 'Xe', + 'color': 'maroon', + }, + { + 'id': 'neon', + 'name': 'Neon', + 'label': 'Ne', + 'color': 'maroon', + }, + { + 'id': 'ammonia', + 'name': 'Ammonia', + 'label': 'NH₃', + 'color': 'maroon', + }, + { + 'id': 'chlorine', + 'name': 'Chlorine', + 'label': 'Cl', + 'color': 'maroon', + }, + { + 'id': 'sulfurdioxide', + 'name': 'Chlorine', + 'label': 'SO₂', + 'color': 'maroon', + }, ]; export const getGasLabel = (gasId, fallbackValue) => { From 5d5d9599905189b0916950f49a6a69afe52f2801 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 14:41:00 -0400 Subject: [PATCH 066/200] Slightly better fix --- code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 2 ++ code/modules/atmospherics/ZAS/atmos_primitives.dm | 10 +--------- .../machinery/components/trinary_devices/filter.dm | 5 ++--- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 0911fae8b97..586c665a329 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -244,6 +244,8 @@ for(var/g in gas) removed.gas[g] = QUANTIZE((gas[g] / total_moles) * amount) gas[g] -= removed.gas[g] / group_multiplier + if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation + gas[g] = 0 removed.temperature = temperature updateValues() diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 44a966949ab..a854e90baba 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -205,8 +205,7 @@ var/total_filterable_moles = 0 //the total amount of filterable gas var/total_unfilterable_moles = 0 //the total amount of non-filterable gas var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type - for (var/g in source.getGases()) - source.gas[g] = QUANTIZE(source.gas[g]) //Reforged note: Gas can no longer leak through filters. Thats actually "intentional" behavior, but it annoyed the fuck out of me and i need sterile testing environments. + for (var/g in source.gas) if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) continue @@ -233,13 +232,6 @@ if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 - //Update flow rate var - /* - if (istype(M, /obj/machinery/atmospherics)) - var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - */ - var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case return -1 diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 09d09ae9e98..14c3824a143 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -100,14 +100,13 @@ if(filtering) var/datum/gas_mixture/filtered_out = new var/datum/gas_mixture/merge_to - // Send things to the side output if we can, return them to the input if we can't. + // Send things to the side output if we can, return them to the input if we can't. // This means that other gases continue to flow to the main output if the side output is blocked. if (side_output_full) merge_to = air1 else merge_to = air2 - var/transfer_moles = calculate_transfer_moles(removed, merge_to, transfer_rate - merge_to.returnPressure()) - filter_gas(filter_type, removed, filtered_out, removed, transfer_moles) + filter_gas(filter_type, removed, filtered_out, removed) // Send things to the side output if we can, return them to the input if we can't. // This means that other gases continue to flow to the main output if the side output is blocked. merge_to.merge(filtered_out) From a8dc3a062610e74d72292c4fbc023df12a08e667 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 18:45:08 -0400 Subject: [PATCH 067/200] Fixes an error in verb permission. --- code/modules/admin/verbs/commandreport.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index 8cf537a61ff..8b03674258f 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -27,7 +27,7 @@ set category = "Admin.Events" set name = "Create Command Report" - if(!check_rights(R_ADMIN) || !check_rights(R_DEBUG)) + if(!check_rights(R_ADMIN) && !check_rights(R_DEBUG)) return SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From 082bf108458f2ff88a6e28c9b3c4dcc4d5c48009 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 18:47:39 -0400 Subject: [PATCH 068/200] TYPO --- code/controllers/subsystem/statpanel.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 3be33fb0384..dab29696abc 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -34,7 +34,7 @@ SUBSYSTEM_DEF(statpanels) "Internal Round Timer: [SSticker.round_start_time ? time2text(world.time - SSticker.round_start_time, "hh:mm:ss", 0) : "The round hasn't started yet!"]", "Actual Round Timer: [SSticker.round_start_timeofday ? time2text(REALTIMEOFDAY - SSticker.round_start_timeofday, "hh:mm:ss", 0) : "The round hasn't started yet!"]", "\n", - "Playes Playing/Connected: [get_active_player_count()]/[length(GLOB.clients)]" + "Players Playing/Connected: [get_active_player_count()]/[length(GLOB.clients)]" ) if(SSshuttle.emergency) From 09b7e25bb159dd8a53835b96f9b18eb0e688bd1b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 19:03:13 -0400 Subject: [PATCH 069/200] Bring back pre-init messages --- code/controllers/master.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a3d228709d1..e84fd902c61 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -241,6 +241,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (subsystem.flags & SS_NO_INIT || subsystem.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized continue current_initializing_subsystem = subsystem + to_chat(world, span_blue(span_bold("Initializing [subsystem.name]..."))) subsystem.Initialize(REALTIMEOFDAY) CHECK_TICK current_initializing_subsystem = null From 7d15d92f5d6a1bddb19535321cb9453bd430e28c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 20:44:50 -0400 Subject: [PATCH 070/200] Fix some bugs --- code/game/objects/effects/decals/cleanable.dm | 2 +- code/game/objects/effects/decals/decal.dm | 2 +- code/game/objects/structures/windoor_assembly.dm | 12 ++++++------ code/game/objects/structures/window.dm | 7 ++++++- code/game/turfs/open/asteroid.dm | 1 + code/modules/reagents/reagent_containers.dm | 4 ++-- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index e4dacb783d2..247e5b0ab18 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -83,7 +83,7 @@ else return ..() -/obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume) +/obj/effect/decal/cleanable/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(reagents) reagents.expose_temperature(exposed_temperature) ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 309fc091388..6bfd03aec75 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -20,7 +20,7 @@ /obj/effect/decal/ex_act(severity, target) qdel(src) -/obj/effect/decal/fire_act(exposed_temperature, exposed_volume) +/obj/effect/decal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava qdel(src) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 81af20511f0..091c31988c1 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -33,7 +33,7 @@ . = ..() if(set_dir) setDir(set_dir) - //air_update_turf(TRUE, TRUE) + update_nearby_tiles(TRUE) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = .proc/on_exit, @@ -47,12 +47,12 @@ set_density(FALSE) update_nearby_tiles() return ..() -/* +/ /obj/structure/windoor_assembly/Move() - var/turf/T = loc + update_nearby_tiles() . = ..() - move_update_air(T) -*/ + update_nearby_tiles() + /obj/structure/windoor_assembly/update_icon_state() icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" return ..() @@ -74,7 +74,7 @@ if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) - return density ? AIR_BLOCKED : ZONE_BLOCKED + return density ? AIR_BLOCKED|ZONE_BLOCKED : ZONE_BLOCKED else return ZONE_BLOCKED diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 16991ccc204..5f2345328c5 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -358,7 +358,12 @@ return AIR_ALLOWED if(!anchored || !density) return ZONE_BLOCKED - return (fulltile || dir == get_dir(loc, T)) ? AIR_BLOCKED : ZONE_BLOCKED + if(!fulltile) + if(get_dir(loc, T) & dir) + return AIR_BLOCKED|ZONE_BLOCKED + else + return AIR_ALLOWED + return AIR_BLOCKED|ZONE_BLOCKED //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 3bf86c2ab4b..6bcae95964b 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -148,6 +148,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/airless initial_gas = AIRLESS_ATMOS + temperature = T0C baseturfs = /turf/open/misc/asteroid/airless turf_type = /turf/open/misc/asteroid/airless diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 0980f89d9b5..23666e3dd7b 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -154,7 +154,7 @@ return ..() -/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) +/obj/item/reagent_containers/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) ..() @@ -207,7 +207,7 @@ reagents.expose_temperature(1000) ..() -/obj/item/reagent_containers/fire_act(temperature, volume) +/obj/item/reagent_containers/fire_act(datum/gas_mixture/air, temperature, volume) reagents.expose_temperature(temperature) /// Updates the icon of the container when the reagents change. Eats signal args From 8cd2837dbbc1a16d09b12369ca40192b116b9f0c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 2 May 2022 21:51:28 -0400 Subject: [PATCH 071/200] HAHAHAHAHAHHA WHOOPS --- code/game/objects/structures/windoor_assembly.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 091c31988c1..4539b8ff00f 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -47,7 +47,7 @@ set_density(FALSE) update_nearby_tiles() return ..() -/ + /obj/structure/windoor_assembly/Move() update_nearby_tiles() . = ..() From 5a55f2095354bd14a73aabd896e53bb223cba885 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 02:31:45 -0400 Subject: [PATCH 072/200] Fixes kilo. The great unspace-ening --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- .../atmospherics/atmos_mapping_helpers.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/change_turf.dm | 2 +- code/game/turfs/open/asteroid.dm | 14 +++++++++---- code/game/turfs/open/space/space.dm | 4 ++-- code/modules/atmospherics/ZAS/Atom.dm | 6 +----- code/modules/atmospherics/ZAS/Connection.dm | 4 ++-- code/modules/atmospherics/ZAS/Diagnostic.dm | 6 +++--- code/modules/atmospherics/ZAS/Turf.dm | 20 +++++++------------ tgstation.dme | 2 +- 11 files changed, 30 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 56b5bd809ef..990d6429367 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -24,7 +24,7 @@ //#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) ZASTURF -#define TURF_HAS_VALID_ZONE(T) (!istype(T, /turf/open/space) && T:zone && !T:zone:invalid) +#define TURF_HAS_VALID_ZONE(T) (T.simulated && T:zone && !T:zone:invalid) #ifdef MULTIZAS GLOBAL_REAL(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm index 07d1d30fa44..0c9f2c49110 100644 --- a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -43,7 +43,7 @@ //ATMOS MIX IDS //#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" #define LAVALAND_DEFAULT_ATMOS OPENTURF_LOW_PRESSURE -#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS" +#define ICEMOON_DEFAULT_ATMOS OPENTURF_LOW_PRESSURE ; temperature = 180 //AIRLOCK CONTROLLER TAGS diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5f2345328c5..78a27df4fb1 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -390,7 +390,7 @@ /obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if (exposed_temperature > melting_point) - take_damage(round(air.get_volume() / 100), BURN, 0, 0) + take_damage(round(air.get_volume() / 100), BURN, 0, 0) //The max of 9 is to ensure it takes 4 ticks to destroy, which is incredibly dramatic /obj/structure/window/get_dumping_location() return null diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 3d8bad6b65c..6ac60a6b9a4 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( changing_turf = TRUE if(connections) connections.erase_all() - if(!istype(src, /turf/open/space)) + if(simulated) //Yeah, we're just going to rebuild the whole thing. //Despite this being called a bunch during explosions, //the zone will only really do heavy lifting once. diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 6bcae95964b..9201e54213c 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -14,7 +14,7 @@ clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - simulated = FALSE //OHHH HELLLL NAW + simulated = TRUE //Kilostation /// Base turf type to be created by the tunnel var/turf_type = /turf/open/misc/asteroid @@ -108,6 +108,9 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) digResult = /obj/item/stack/ore/glass/basalt broken_state = "basalt_dug" + initial_gas = LAVALAND_DEFAULT_ATMOS + simulated = FALSE //OH *FUCK* NO. + /turf/open/misc/asteroid/basalt/getDug() set_light(0) GLOB.dug_up_basalt |= src @@ -149,6 +152,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/airless initial_gas = AIRLESS_ATMOS temperature = T0C + baseturfs = /turf/open/misc/asteroid/airless turf_type = /turf/open/misc/asteroid/airless @@ -164,6 +168,10 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) temperature = 180 slowdown = 2 flags_1 = NONE + + simulated = FALSE + initial_gas = ICEMOON_DEFAULT_ATMOS + planetary_atmos = TRUE bullet_sizzle = TRUE bullet_bounce_sound = null @@ -181,11 +189,9 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/icemoon baseturfs = /turf/open/openspace/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS slowdown = 0 /turf/open/lava/plasma/ice_moon - initial_gas = ICEMOON_DEFAULT_ATMOS baseturfs = /turf/open/lava/plasma/ice_moon planetary_atmos = TRUE @@ -206,7 +212,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS planetary_atmos = TRUE slowdown = 0 @@ -229,4 +234,5 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/standard_air initial_gas = OPENTURF_DEFAULT_ATMOS + temperature = T0C planetary_atmos = FALSE diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index b938edd3bbd..5e11964b1f9 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -14,7 +14,8 @@ var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space_gas = new + initial_gas = AIRLESS_ATMOS + // run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER @@ -35,7 +36,6 @@ /turf/open/space/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) icon_state = SPACE_ICON_STATE - air = space_gas vis_contents.Cut() //removes inherited overlays visibilityChanged() diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index da18ffbaf9c..d1787e7a055 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -17,7 +17,7 @@ /atom/movable/proc/update_nearby_tiles(need_rebuild) //for(var/turf/simulated/turf in locs) ZASTURF for(var/turf/turf in locs) - if(istype(turf, /turf/open/space)) + if(!turf.simulated) continue SSzas.mark_for_update(turf) @@ -35,10 +35,6 @@ #endif if(can_atmos_pass == CANPASS_PROC) CRASH("Atmos pass assigned proc when proc doesn't exist.") - //var/direction = get_dir(src, other) - //return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) - //return (AIR_BLOCKED*!CanPass(other, direction, 0))|(ZONE_BLOCKED*!CanPass(other, direction, 1)) - return (AIR_BLOCKED*!ATMOS_CANPASS_NOTTURF(src)) // This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. /turf/zas_canpass(turf/other) diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 36b3d2d42ca..bfd782b3e61 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -107,7 +107,7 @@ Class Procs: /connection/proc/update() // log_admin("Updated, \...") - if(istype(A,/turf/open/space)) + if(!A.simulated) // log_admin("Invalid A.") erase() return @@ -122,7 +122,7 @@ Class Procs: else mark_direct() - var/b_is_space = istype(B,/turf/open/space) + var/b_is_space = !B.simulated if(state & CONNECTION_SPACE) if(!b_is_space) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 7a366d9ac68..2a08a3cf268 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -1,7 +1,7 @@ /client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" if(T) - if(!istype(T,/turf/open/space) && T:zone) //ZASTURF + if(T.simulated && T:zone) //ZASTURF T:zone:dbg_data(src) else to_chat(mob, span_admin("ZASDBG: No zone here.")) @@ -19,7 +19,7 @@ /client/proc/Test_ZAS_Connection(turf/T as turf) //ZASTURF set category = "Debug" - if(istype(T, /turf/open/space)) //ZASTURF + if(!T.simulated) //ZASTURF return var/direction_list = list(\ @@ -44,7 +44,7 @@ return var/turf/other_turf = get_step(T, direction_list[direction]) - if(istype(other_turf, /turf/open/space)) + if(!other_turf.simulated) return var/t_block diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 5d4e1a33ebc..162fc4e9389 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -51,7 +51,7 @@ //var/turf/simulated/sim = unsim if(TURF_HAS_VALID_ZONE(unsim)) SSzas.connect(unsim, src) - +/* ///Yes. Massive copy paste. Pain. /turf/open/space/update_air_properties() var/block @@ -82,10 +82,11 @@ if(r_block & AIR_BLOCKED) continue - if(!istype(unsim, /turf/open/space)) + if(unsim.simulated) var/turf/sim = unsim if(TURF_HAS_VALID_ZONE(sim)) SSzas.connect(sim, src) +*/ // Helper for can_safely_remove_from_zone(). //ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT @@ -94,7 +95,7 @@ if (T.zone) { \ for (var/_gzn_dir in gzn_check) { \ var/turf/other = get_step(T, _gzn_dir); \ - if (!istype(other, /turf/open/space) && other.zone == T.zone) { \ + if (other.simulated && other.zone == T.zone) { \ var/block; \ ATMOS_CANPASS_TURF(block, other, T); \ if (!(block & AIR_BLOCKED)) { \ @@ -125,7 +126,7 @@ //var/turf/simulated/T = get_step(src, dir) ZASTURF var/turf/T = get_step(src, dir) //if (!istype(T)) ZASTURF - if (istype(T, /turf/open/space) || !T.simulated) + if (!T.simulated) . &= ~dir continue @@ -204,7 +205,7 @@ //Check that our zone hasn't been cut off recently. //This happens when windows move or are constructed. We need to rebuild. //if((previously_open & d) && istype(unsim, /turf/simulated)) ZAS - if((previously_open & d) && !istype(unsim, /turf/open/space)) + if((previously_open & d) && unsim.simulated) var/turf/sim = unsim if(zone && sim.zone == zone) zone.rebuild() @@ -215,7 +216,7 @@ open_directions |= d //if(istype(unsim, /turf/simulated)) ZASTURF - if(!istype(unsim, /turf/open/space)) + if(unsim.simulated) var/turf/sim = unsim sim.open_directions |= GLOB.reverse_dir[d] @@ -313,9 +314,6 @@ make_air() return air -/turf/open/space/return_air() - return air - /turf/remove_air(amount as num) var/datum/gas_mixture/GM = return_air() return GM.remove(amount) @@ -374,15 +372,11 @@ air.gas = initial_gas.Copy() air.updateValues() -//turf/simulated/proc/c_copy_air() ZASTURF /turf/proc/c_copy_air() if(!air) air = new/datum/gas_mixture air.copyFrom(zone.air) air.group_multiplier = 1 -/*/turf/open/space/c_copy_air() - return -*/ //turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) ZASTURF /turf/proc/atmos_spawn_air(gas_id, amount, initial_temperature) diff --git a/tgstation.dme b/tgstation.dme index 563008c2080..cacf4a22626 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -682,7 +682,7 @@ #include "code\datums\announcers\intern_announcer.dm" #include "code\datums\announcers\medbot_announcer.dm" #include "code\datums\atmosphere\_atmosphere.dm" -#include "code\datums\atmosphere\planetary.dm" +//#include "code\datums\atmosphere\planetary.dm" #include "code\datums\brain_damage\brain_trauma.dm" #include "code\datums\brain_damage\creepy_trauma.dm" #include "code\datums\brain_damage\hypnosis.dm" From 64c2243e9c212532709a8401f7ec7152600988ea Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 13:21:47 -0400 Subject: [PATCH 073/200] Third times the charm --- code/modules/admin/verbs/commandreport.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index 8b03674258f..c93bd401f73 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -27,7 +27,7 @@ set category = "Admin.Events" set name = "Create Command Report" - if(!check_rights(R_ADMIN) && !check_rights(R_DEBUG)) + if(!check_rights(R_DEBUG|R_ADMIN)) return SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From 226616708505ae86248201044369d2ca229ae99b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 13:27:32 -0400 Subject: [PATCH 074/200] Fixes atmos resin. --- code/game/objects/effects/effect_system/effects_foam.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index b8de7717ac4..7bb557f86f2 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -355,8 +355,8 @@ if(isopenturf(loc)) var/turf/open/O = loc O.ClearWet() - if(O.air) - var/datum/gas_mixture/G = O.air + if(O.return_air()) + var/datum/gas_mixture/G = O.return_air() G.temperature = 293.15 for(var/obj/effect/hotspot/H in O) qdel(H) From 9eab2a76f9b42d055cb533048ab467a647333812 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 13:42:51 -0400 Subject: [PATCH 075/200] Fixes the portable air pump. I hope. --- code/modules/atmospherics/machinery/portable/pump.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 22b8413db86..c11e1788e9d 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -80,9 +80,9 @@ if (pressure_delta > 0.01) if (direction == PUMP_OUT) - pump_gas(src, air_contents, environment, transfer_moles) + pump_gas(air_contents, environment, transfer_moles) else - pump_gas(src, environment, air_contents, transfer_moles) + pump_gas(environment, air_contents, transfer_moles) //air_update_turf(FALSE, FALSE) // Update the environment if needed. return ..() From 7db37f2256e3026166a00214860fa4c0b2405c25 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 14:20:03 -0400 Subject: [PATCH 076/200] Grammar --- code/modules/atmospherics/ZAS/Airflow.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 8b403e224b2..dc0a04b5291 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -160,7 +160,7 @@ Contains helper procs for airflow, handled in /connection_group. /atom/proc/airflow_hit_act(atom/movable/flying) src.visible_message( - span_danger("A flying [flying] slams into \the [src]!"), + span_danger("A flying \improper [flying] slams into \the [src]!"), span_danger("You're hit by a flying [flying]!"), span_danger("You hear a loud slam!") ) From 2e0fac5e3cb67963eb87284208d943ec55441847 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 14:28:30 -0400 Subject: [PATCH 077/200] stupid language --- code/modules/atmospherics/ZAS/Airflow.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index dc0a04b5291..b03121201bf 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -160,7 +160,7 @@ Contains helper procs for airflow, handled in /connection_group. /atom/proc/airflow_hit_act(atom/movable/flying) src.visible_message( - span_danger("A flying \improper [flying] slams into \the [src]!"), + span_danger("A flying [flying.name] slams into \the [src]!"), span_danger("You're hit by a flying [flying]!"), span_danger("You hear a loud slam!") ) From 415c954aeb004fedac58fe5e0a62c2b55e6acf7f Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 16:13:06 -0400 Subject: [PATCH 078/200] Makes some gases purchasable. Oops. --- code/modules/admin/verbs/commandreport.dm | 2 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index c93bd401f73..4d5d60f4034 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -27,7 +27,7 @@ set category = "Admin.Events" set name = "Create Command Report" - if(!check_rights(R_DEBUG|R_ADMIN)) + if(!holder) return SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 3088e31548f..8fadf055b41 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -6,7 +6,7 @@ flags = XGM_GAS_OXIDIZER | XGM_GAS_FUSION_FUEL symbol_html = "O<sub>2</sub>" symbol = "O2" - + purchaseable = TRUE /datum/xgm_gas/nitrogen id = GAS_NITROGEN @@ -15,6 +15,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N<sub>2</sub>" symbol = "N2" + purchaseable = TRUE /datum/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -23,6 +24,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "CO<sub>2</sub>" symbol = "CO2" + purchaseable = TRUE /datum/xgm_gas/methyl_bromide id = GAS_METHYL_BROMIDE @@ -140,6 +142,7 @@ molar_mass = 0.018 // kg/mol symbol_html = "Ar" symbol = "Ar" + purchaseable = TRUE // If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. /datum/xgm_gas/krypton @@ -149,7 +152,7 @@ molar_mass = 0.036 // kg/mol symbol_html = "Kr" symbol = "Kr" - + purchaseable = TRUE /datum/xgm_gas/neon id = GAS_NEON name = "Neon" @@ -157,6 +160,7 @@ molar_mass = 0.01 // kg/mol symbol_html = "Ne" symbol = "Ne" + purchaseable = TRUE /datum/xgm_gas/xenon id = GAS_XENON From 0b338daaf3301dc04c7b4f4ca1f187f7e3ffdb12 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 16:49:55 -0400 Subject: [PATCH 079/200] Purchaseable air canisters. I hope. --- code/modules/atmospherics/ZAS/XGM/gases.dm | 13 ++++ .../machinery/portable/canister.dm | 69 ++++++++----------- code/modules/cargo/packs.dm | 11 +++ 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 8fadf055b41..f577c975734 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -7,6 +7,7 @@ symbol_html = "O<sub>2</sub>" symbol = "O2" purchaseable = TRUE + base_value = 0.2 /datum/xgm_gas/nitrogen id = GAS_NITROGEN @@ -16,6 +17,7 @@ symbol_html = "N<sub>2</sub>" symbol = "N2" purchaseable = TRUE + base_value = 0.1 /datum/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -25,6 +27,7 @@ symbol_html = "CO<sub>2</sub>" symbol = "CO2" purchaseable = TRUE + base_value = 0.2 /datum/xgm_gas/methyl_bromide id = GAS_METHYL_BROMIDE @@ -55,6 +58,7 @@ breathed_product = /datum/reagent/toxin/plasma symbol_html = "Ph" symbol = "Ph" + base_value = 2 /datum/xgm_gas/sleeping_agent id = GAS_N2O @@ -66,6 +70,7 @@ breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" symbol = "N2O" + base_value = 3 /datum/xgm_gas/methane id = GAS_METHANE @@ -143,6 +148,7 @@ symbol_html = "Ar" symbol = "Ar" purchaseable = TRUE + base_value = 0.2 // If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. /datum/xgm_gas/krypton @@ -153,6 +159,8 @@ symbol_html = "Kr" symbol = "Kr" purchaseable = TRUE + base_value = 0.2 + /datum/xgm_gas/neon id = GAS_NEON name = "Neon" @@ -161,6 +169,7 @@ symbol_html = "Ne" symbol = "Ne" purchaseable = TRUE + base_value = 0.2 /datum/xgm_gas/xenon id = GAS_XENON @@ -170,6 +179,8 @@ breathed_product = /datum/reagent/nitrous_oxide/xenon symbol_html = "Xe" symbol = "Xe" + purchaseable = TRUE + base_value = 5 /datum/xgm_gas/nitrodioxide id = GAS_NO2 @@ -204,6 +215,8 @@ breathed_product = /datum/reagent/chlorine symbol_html = "Cl" symbol = "Cl" + purchaseable = TRUE + base_value = 7 /datum/xgm_gas/vapor id = GAS_STEAM diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 4b672388494..8abffa6444c 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -10,6 +10,11 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) GAS_CO2 = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, GAS_PLASMA = /obj/machinery/portable_atmospherics/canister/plasma, GAS_N2O = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, + GAS_XENON = /obj/machinery/portable_atmospherics/canister/xenon, + GAS_KRYPTON = /obj/machinery/portable_atmospherics/canister/krypton, + GAS_ARGON = /obj/machinery/portable_atmospherics/canister/argon, + GAS_CHLORINE = /obj/machinery/portable_atmospherics/canister/chlorine, + GAS_NEON = /obj/machinery/portable_atmospherics/canister/neon, /*"nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, "bz" = /obj/machinery/portable_atmospherics/canister/bz, "air" = /obj/machinery/portable_atmospherics/canister/air, @@ -166,50 +171,19 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = GAS_CO greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#808080" -/* -/obj/machinery/portable_atmospherics/canister/freon - name = "Freon canister" - gas_type = /datum/gas/freon - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#6696ee#fefb30" - -/obj/machinery/portable_atmospherics/canister/halon - name = "Halon canister" - gas_type = /datum/gas/halon - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#9b5d7f#368bff" -/obj/machinery/portable_atmospherics/canister/healium - name = "Healium canister" - gas_type = /datum/gas/healium - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#009823#ff0e00" +/obj/machinery/portable_atmospherics/canister/xenon + name = "Xenon canister" + gas_type = GAS_XENON + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#808080" -/obj/machinery/portable_atmospherics/canister/helium - name = "Helium canister" - gas_type = /datum/gas/helium - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#9b5d7f#368bff" -*/ -/* -/obj/machinery/portable_atmospherics/canister/hydrogen - name = "Hydrogen canister" - gas_type = GAS_HYDROGEN - filled = 1 - greyscale_config = /datum/greyscale_config/canister/stripe - greyscale_colors = "#bdc2c0#ffffff" +/obj/machinery/portable_atmospherics/canister/krypton + name = "Krypton canister" + gas_type = GAS_KRYPTON + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#44E022" -/obj/machinery/portable_atmospherics/canister/miasma - name = "Miasma canister" - gas_type = /datum/gas/miasma - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#009823#f7d5d3" -*/ /obj/machinery/portable_atmospherics/canister/nitrogen name = "Nitrogen canister" gas_type = GAS_NITROGEN @@ -227,6 +201,19 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = GAS_CHLORINE greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#b9d41b" + +/obj/machinery/portable_atmospherics/canister/argon + name = "Argon canister" + gas_type = GAS_ARGON + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#CC4DCD" + +/obj/machinery/portable_atmospherics/canister/neon + name = "Neon canister" + gas_type = GAS_NEON + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#FF825C" + /* /obj/machinery/portable_atmospherics/canister/nitrium name = "Nitrium canister" diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 29a39a780ba..bd6a1e0fb0b 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1134,6 +1134,17 @@ canister_packs += pack + ////AIRMIX SPECIAL BABY + var/datum/supply_pack/materials/airpack = new + airpack.name = "Airmix Canister" + airpack.desc = "Contains a canister of breathable air." + airpack.crate_name = "airmix canister crate" + airpack.id = "[type](airmix)" + airpack.cost = 3000 + airpack.contains = list(/obj/machinery/portable_atmospherics/canister/air) + airpack.crate_type = crate_type + canister_packs += airpack + return canister_packs ////////////////////////////////////////////////////////////////////////////// From 34362b55fe1fa51c392b39b6f30ac6c87ea098bb Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 17:15:01 -0400 Subject: [PATCH 080/200] Fixes roundstart plasma --- code/__DEFINES/atmospherics/ZAS.dm | 4 ++-- code/modules/atmospherics/ZAS/XGM/gases.dm | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 990d6429367..1715a22e750 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -218,8 +218,8 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define ATMOSTANK_NITROGEN list(GAS_NITROGEN = 90000) // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it #define ATMOSTANK_OXYGEN list(GAS_OXYGEN = 50000) // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. #define ATMOSTANK_CO2 list(GAS_CO2 = 60000) // CO2 is used for the GUP, Charon, and Torch as the primary fuel propellant, and we need lots to stick around. -#define ATMOSTANK_PLASMA list(GAS_PHORON = 25000) -#define ATMOSTANK_PLASMA_FUEL list(GAS_PHORON = 15000) +#define ATMOSTANK_PLASMA list(GAS_PLASMA = 25000) +#define ATMOSTANK_PLASMA_FUEL list(GAS_PLASMA = 15000) #define ATMOSTANK_HYDROGEN list(GAS_HYDROGEN = 50000) #define ATMOSTANK_HYDROGEN_FUEL list(GAS_HYDROGEN = 25000) #define ATMOSTANK_NITROUSOXIDE list(GAS_N2O = 10000) // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index f577c975734..82aece0cd2a 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -51,7 +51,6 @@ //and following a N/Z ratio of 1.5, the molar mass of a monatomic gas is: molar_mass = 0.405 // kg/mol - //tile_overlay = "phoron" tile_overlay = "plasma" overlay_limit = 0.7 flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL From 21bf1f4292b137cca928347ef35536a11b7c641a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 18:13:18 -0400 Subject: [PATCH 081/200] Canisters have the correct heat resistence --- code/modules/atmospherics/machinery/portable/canister.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 8abffa6444c..c4d6cef1498 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -425,7 +425,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return (exposed_temperature > temperature_resistance && !shielding_powered) /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(exposed_temperature > heat_limit) + if(exposed_temperature > temperature_resistance &&!shielding_powered) take_damage(5, BURN, 0) /obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) From 7235a71b2fdce91a5018559e1b932aaa0b8e4e89 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 19:09:18 -0400 Subject: [PATCH 082/200] Fixes? directional windows blocking atmos due to being constructed on unsimulated turfs --- code/game/objects/structures/window.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 78a27df4fb1..9c0defcbc21 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -344,6 +344,12 @@ update_nearby_icons() can_atmos_pass = CANPASS_ALWAYS //hacky-sacky update_nearby_tiles() + + if(!fulltile) + var/turf/open/T = get_step(src, dir) + if(istype(T)) + SSzas.mark_for_update(T) + . = ..() /obj/structure/window/Move() From cb965651e11b3e7f1b523ac316cf36cf6b229831 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 3 May 2022 21:01:10 -0400 Subject: [PATCH 083/200] Fixes N2O not knocking you the fuck out --- code/modules/atmospherics/ZAS/XGM/gases.dm | 2 +- code/modules/mob/living/carbon/life.dm | 3 +-- code/modules/surgery/organs/lungs.dm | 26 +++++++++++----------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 82aece0cd2a..af011c8def7 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -66,7 +66,7 @@ molar_mass = 0.044 // kg/mol. N2O tile_overlay = "sleeping_agent" flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer - breathed_product = /datum/reagent/nitrous_oxide + //breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" symbol = "N2O" base_value = 3 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 498462805b8..3119924232c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -131,8 +131,7 @@ breath.adjustGas(gasname, -breath.gas[gasname], update = 0) //update after check_breath(breath) - - if(breath) + if(breath.total_moles) breath.updateValues() loc.assume_air(breath) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 7500c628663..c0809b2f8c0 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -124,12 +124,14 @@ var/N2_moles = breath.gas[GAS_NITROGEN] var/plasma_moles = breath.gas[GAS_PLASMA] var/CO2_moles = breath.gas[GAS_CO2] + var/SA_moles = breath.gas[GAS_N2O] + var/O2_pp = breath.getBreathPartialPressure(O2_moles)//+(8*breath.getBreathPartialPressure(breath_gases[/datum/gas/pluoxium][MOLES])) var/N2_pp = breath.getBreathPartialPressure(N2_moles) var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) - + var/SA_pp = breath.getBreathPartialPressure(SA_moles) //Vars for n2o and healium induced euphorias. var/n2o_euphoria = EUPHORIA_LAST_FLAG var/healium_euphoria = EUPHORIA_LAST_FLAG @@ -158,8 +160,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) //Exhale - breath.adjustGas(GAS_OXYGEN, -gas_breathed) - breath.adjustGas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_OXYGEN, -gas_breathed, FALSE) + breath.adjustGas(GAS_CO2, gas_breathed, FALSE) gas_breathed = 0 //-- Nitrogen --// @@ -186,8 +188,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_NITRO) //Exhale - breath.adjustGas(GAS_NITROGEN, -gas_breathed) - breath.adjustGas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_NITROGEN, -gas_breathed, FALSE) + breath.adjustGas(GAS_CO2, gas_breathed, FALSE) gas_breathed = 0 //-- CO2 --// @@ -223,8 +225,8 @@ breather.clear_alert(ALERT_NOT_ENOUGH_CO2) //Exhale - breath.adjustGas(GAS_CO2, -gas_breathed) - breath.adjustGas(GAS_OXYGEN, gas_breathed) + breath.adjustGas(GAS_CO2, -gas_breathed, FALSE) + breath.adjustGas(GAS_OXYGEN, gas_breathed, FALSE) gas_breathed = 0 @@ -253,18 +255,16 @@ breather.clear_alert(ALERT_NOT_ENOUGH_PLASMA) //Exhale - breath.adjustGas(GAS_PLASMA, -gas_breathed) - breath.adjustGas(GAS_CO2, gas_breathed) + breath.adjustGas(GAS_PLASMA, -gas_breathed, FALSE) + breath.adjustGas(GAS_CO2, gas_breathed, FALSE) gas_breathed = 0 //-- TRACES --// - - if(breath) // If there's some other shit in the air lets deal with it here. + breath.updateValues() + if(breath.total_moles) // If there's some other shit in the air lets deal with it here. // N2O - var/n2o_moles = breath.gas[GAS_N2O] - var/SA_pp = breath.getBreathPartialPressure(n2o_moles) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit breather.throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) breather.Unconscious(60) // 60 gives them one second to wake up and run away a bit! From a63a9a79d8eacac455322c221ece034195228286 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 4 May 2022 00:08:01 -0400 Subject: [PATCH 084/200] Fixes atmos consoles and n2o overlays --- code/__HELPERS/atmospherics.dm | 73 +------------------ .../atmos_computers/_atmos_control.dm | 1 - code/modules/atmospherics/ZAS/XGM/gases.dm | 1 + .../tgui/interfaces/AtmosControlConsole.tsx | 11 +-- .../tgui/interfaces/common/GasmixParser.tsx | 37 +--------- 5 files changed, 4 insertions(+), 119 deletions(-) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 32684a61295..711c18f7fda 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -44,15 +44,9 @@ for(var/gas_path in gasmix.getGases()) .["gases"] += list(list( "[gas_path]", - "[gas_path]", + xgm_gas_data.name[gas_path], gasmix.gas[gas_path], )) - //.for(var/datum/gas_reaction/reaction_result as anything in gasmix.reaction_results) - .["reactions"] += list(list( - "UNIMPLIMENTED", - "UNIMPLIMENTED", - "UNIMPLIMENTED", - )) .["total_moles"] = gasmix.get_moles() .["temperature"] = gasmix.temperature .["volume"] = gasmix.volume @@ -61,68 +55,3 @@ GLOBAL_LIST_EMPTY(reaction_handbook) GLOBAL_LIST_EMPTY(gas_handbook) - -/// Automatically populates gas_handbook and reaction_handbook. They are formatted lists containing information regarding gases and reactions they participate in. -/// Structure can be found in TS form at AtmosHandbook.tsx -/*/proc/atmos_handbooks_init() - if(length(GLOB.reaction_handbook)) - GLOB.reaction_handbook = list() - if(length(GLOB.gas_handbook)) - GLOB.gas_handbook = list() - - /// Final product is a numbered list, this one is assoc just so we can generate the "reactions" entry easily. - var/list/momentary_gas_list = list() - - for (var/datum/gas/gas_path as anything in subtypesof(/datum/gas)) - var/list/gas_info = list() - var/list/meta_information = GLOB.meta_gas_info[gas_path] - if(!meta_information) - continue - gas_info["id"] = meta_information[META_GAS_ID] - gas_info["name"] = meta_information[META_GAS_NAME] - gas_info["description"] = meta_information[META_GAS_DESC] - gas_info["specific_heat"] = meta_information[META_GAS_SPECIFIC_HEAT] - gas_info["reactions"] = list() - momentary_gas_list[gas_path] = gas_info - - for (var/datum/gas_reaction/reaction_path as anything in subtypesof(/datum/gas_reaction)) - var/datum/gas_reaction/reaction = new reaction_path - var/list/reaction_info = list() - reaction_info["id"] = reaction.id - reaction_info["name"] = reaction.name - reaction_info["description"] = reaction.desc - reaction_info["factors"] = list() - for (var/factor in reaction.factor) - var/list/factor_info = list() - factor_info["desc"] = reaction.factor[factor] - - if(factor in momentary_gas_list) - momentary_gas_list[factor]["reactions"] += list(reaction.id = reaction.name) - factor_info["factor_id"] = momentary_gas_list[factor]["id"] //Gas id - factor_info["factor_type"] = "gas" - factor_info["factor_name"] = momentary_gas_list[factor]["name"] //Common name - else - factor_info["factor_name"] = factor - factor_info["factor_type"] = "misc" - if(factor == "Temperature" || factor == "Pressure") - factor_info["tooltip"] = "Reaction is influenced by the [lowertext(factor)] of the place where the reaction is occuring." - else if(factor == "Energy") - factor_info["tooltip"] = "Energy released by the reaction, may or may not result in linear temperature change depending on a slew of other factors." - else if(factor == "Radiation") - factor_info["tooltip"] = "This reaction emits dangerous radiation! Take precautions." - else if (factor == "Location") - factor_info["tooltip"] = "This reaction has special behaviour when occuring in specific locations." - else if(factor == "Hot Ice") - factor_info["tooltip"] = "Hot ice are solidified stacks of plasma. Ignition of one will result in a raging fire." - reaction_info["factors"] += list(factor_info) - GLOB.reaction_handbook += list(reaction_info) - qdel(reaction) - - for (var/gas_info_index in momentary_gas_list) - GLOB.gas_handbook += list(momentary_gas_list[gas_info_index]) - -/// Returns an assoc list of the gas handbook and the reaction handbook. -/// For UIs, simply do data += return_atmos_handbooks() to use. -/proc/return_atmos_handbooks() - return list("gasInfo" = GLOB.gas_handbook, "reactionInfo" = GLOB.reaction_handbook) -*/ diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm index 719d7468775..cdc6d448ca9 100644 --- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm +++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm @@ -134,7 +134,6 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) data["maxOutput"] = MAX_OUTPUT_PRESSURE data["control"] = control data["reconnecting"] = reconnecting - //data += return_atmos_handbooks() return data /obj/machinery/computer/atmos_control/ui_data(mob/user) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index af011c8def7..6b46f1c169e 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -65,6 +65,7 @@ specific_heat = 40 // J/(mol*K) molar_mass = 0.044 // kg/mol. N2O tile_overlay = "sleeping_agent" + overlay_limit = 0.5 flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer //breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" diff --git a/tgui/packages/tgui/interfaces/AtmosControlConsole.tsx b/tgui/packages/tgui/interfaces/AtmosControlConsole.tsx index 3322705d090..38232b228f6 100644 --- a/tgui/packages/tgui/interfaces/AtmosControlConsole.tsx +++ b/tgui/packages/tgui/interfaces/AtmosControlConsole.tsx @@ -9,10 +9,6 @@ import { Stack, } from '../components'; import { Window } from '../layouts'; -import { - AtmosHandbookContent, - atmosHandbookHooks, -} from './common/AtmosHandbook'; import { Gasmix, GasmixParser } from './common/GasmixParser'; type Chamber = { @@ -41,7 +37,6 @@ export const AtmosControlConsole = (props, context) => { = chambers.length === 1 ? chambers[0] : chambers.find((chamber) => chamber.id === chamberId); - const [setActiveGasId, setActiveReactionId] = atmosHandbookHooks(context); return ( <Window width={550} height={350}> <Window.Content scrollable> @@ -70,10 +65,7 @@ export const AtmosControlConsole = (props, context) => { }> {!!selectedChamber && !!selectedChamber.gasmix ? ( <GasmixParser - gasmix={selectedChamber.gasmix} - gasesOnClick={setActiveGasId} - reactionOnClick={setActiveReactionId} - /> + gasmix={selectedChamber.gasmix} /> ) : ( <Box italic> {'No Sensors Detected!'}</Box> )} @@ -171,7 +163,6 @@ export const AtmosControlConsole = (props, context) => { </Stack> </Section> )} - <AtmosHandbookContent /> </Window.Content> </Window> ); diff --git a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx index cc1a8b0bb24..a6fe672080d 100644 --- a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx +++ b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx @@ -7,7 +7,6 @@ export type Gasmix = { volume: number; pressure: number; total_moles: number; - reactions: [string, string, number][]; // ID, name, and amount. reference: string; }; @@ -18,8 +17,6 @@ type GasmixParserProps = { volumeOnClick?: () => void; pressureOnClick?: () => void; reactionOnClick?: (reaction_id: string) => void; - // Whether we need to show the number of the reaction or not - detailedReactions?: boolean; }; export const GasmixParser = (props: GasmixParserProps, context) => { @@ -30,11 +27,10 @@ export const GasmixParser = (props: GasmixParserProps, context) => { volumeOnClick, pressureOnClick, reactionOnClick, - detailedReactions, ...rest } = props; - const { gases, temperature, volume, pressure, total_moles, reactions } + const { gases, temperature, volume, pressure, total_moles } = gasmix; return !total_moles ? ( @@ -84,37 +80,6 @@ export const GasmixParser = (props: GasmixParserProps, context) => { }> {(total_moles ? pressure.toFixed(2) : '-') + ' kPa'} </LabeledList.Item> - {detailedReactions ? ( - reactions.map((reaction) => ( - <LabeledList.Item - key={`${gasmix.reference}-${reaction[0]}`} - label={ - reactionOnClick ? ( - <Button - content={reaction[1]} - onClick={reactionOnClick(reaction[0])} - /> - ) : (reaction[1]) - }> - {reaction[2]} - </LabeledList.Item> - )) - ) : ( - <LabeledList.Item label="Gas Reactions"> - {reactions.length - ? reactions.map((reaction) => - reactionOnClick ? ( - <Box mb="0.5em"> - <Button - content={reaction[1]} - onClick={() => reactionOnClick(reaction[0])} - /> - </Box> - ) : (reaction[1]) - ) - : 'No reactions detected'} - </LabeledList.Item> - )} </LabeledList> ); }; From aa11037a7dc1e07c0c2fffec3b1490cc00460b2c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 4 May 2022 01:36:50 -0400 Subject: [PATCH 085/200] Rewrites vent pumps --- .../components/unary_devices/vent_pump.dm | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 44f3aab9e51..726b57e9a99 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -5,6 +5,7 @@ #define SIPHONING 0 #define RELEASING 1 +#define DEFAULT_PRESSURE_DELTA 10000 /obj/machinery/atmospherics/components/unary/vent_pump icon_state = "vent_map-3" @@ -41,6 +42,8 @@ var/radio_filter_out ///Radio connection from the air alarm var/radio_filter_in + ///Optimization + COOLDOWN_DECLARE(sleeping) /obj/machinery/atmospherics/components/unary/vent_pump/New() if(!id_tag) @@ -101,50 +104,49 @@ on = FALSE if(!on || welded) return + if(!COOLDOWN_FINISHED(src, sleeping)) + return var/turf/open/us = loc if(!istype(us)) return + var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/environment = us.return_air() - var/environment_pressure = environment.returnPressure() - - if(pump_direction & RELEASING) // internal -> external - var/pressure_delta = 10000 - - if(pressure_checks&EXT_BOUND) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&INT_BOUND) - pressure_delta = min(pressure_delta, (air_contents.returnPressure() - internal_pressure_bound)) - - if(pressure_delta > 0) - if(air_contents.temperature > 0) - var/transfer_moles = (pressure_delta * environment.volume) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - if(!removed || !removed.get_moles()) - return - - loc.assume_air(removed) - update_parents() - - else // external -> internal - var/pressure_delta = 10000 - if(pressure_checks&EXT_BOUND) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&INT_BOUND) - pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.returnPressure())) - - if(pressure_delta > 0 && environment.temperature > 0) - var/transfer_moles = (pressure_delta * air_contents.volume) / (environment.temperature * R_IDEAL_GAS_EQUATION) + var/pressure_delta = get_pressure_delta(environment) + if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5) + if(pump_direction & RELEASING) //internal -> external + var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) + pump_gas(air_contents, environment, transfer_moles) + update_parents() + else //external -> internal + var/transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta) - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + //limit flow rate from turfs + transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here + pump_gas(environment, air_contents, transfer_moles) + update_parents() - if(!removed || !removed.get_moles()) //No venting from space 4head - return + else + if(pump_direction && (pressure_checks&EXT_BOUND)) + COOLDOWN_START(src, sleeping, 15 SECONDS) - air_contents.merge(removed) - update_parents() +/obj/machinery/atmospherics/components/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment) + var/pressure_delta = DEFAULT_PRESSURE_DELTA + var/environment_pressure = environment.returnPressure() + var/datum/gas_mixture/air_contents = airs[1] + if(pump_direction) //internal -> external + if(pressure_checks & EXT_BOUND) + pressure_delta = min(pressure_delta, external_pressure_bound - environment_pressure) //increasing the pressure here + if(pressure_checks & INT_BOUND) + pressure_delta = min(pressure_delta, air_contents.returnPressure() - internal_pressure_bound) //decreasing the pressure here + else //external -> internal + if(pressure_checks & EXT_BOUND) + pressure_delta = min(pressure_delta, environment_pressure - external_pressure_bound) //decreasing the pressure here + if(pressure_checks & INT_BOUND) + pressure_delta = min(pressure_delta, internal_pressure_bound - air_contents.returnPressure()) //increasing the pressure here + + return pressure_delta //Radio remote control /obj/machinery/atmospherics/components/unary/vent_pump/proc/set_frequency(new_frequency) From 859b5905bc628b7526464d9249be6bd9cea71b6f Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 4 May 2022 15:17:29 -0400 Subject: [PATCH 086/200] Tweaks, mainly to airflow --- code/controllers/subsystem/zas.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 35 ++++-------------------- code/modules/mob/camera/camera.dm | 2 ++ code/modules/projectiles/projectile.dm | 2 ++ 4 files changed, 10 insertions(+), 31 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 1015394c253..5e7262ad25b 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -377,7 +377,7 @@ SUBSYSTEM_DEF(zas) //datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) //ZASTURF /datum/controller/subsystem/zas/proc/connect(turf/A, turf/B) #ifdef ZASDBG - ASSERT(!istype(A, /turf/open/space)) + ASSERT(A.simulated) ASSERT(isturf(B)) ASSERT(A.zone) ASSERT(!A.zone.invalid) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index b03121201bf..011f0b6b64b 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -9,10 +9,12 @@ Contains helper procs for airflow, handled in /connection_group. /mob/living/airflow_stun() if(stat == 2) return 0 - if(last_airflow_stun > world.time - SSzas.settings.airflow_stun_cooldown) return 0 + if(last_airflow_stun > world.time - SSzas.settings.airflow_stun_cooldown) + to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") + return 0 if(!(status_flags & CANSTUN) && !(status_flags & CANKNOCKDOWN)) - to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>") + to_chat(src, "<span class='notice'>Air suddenly rushes past you, but you manage to keep your footing!</span>") return 0 if(buckled) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") @@ -20,7 +22,7 @@ Contains helper procs for airflow, handled in /connection_group. if(!body_position == LYING_DOWN) to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") - Knockdown(5) + Knockdown(SSzas.settings.airflow_stun SECONDS) last_airflow_stun = world.time /mob/living/silicon/airflow_stun() @@ -29,36 +31,9 @@ Contains helper procs for airflow, handled in /connection_group. /mob/living/carbon/slime/airflow_stun() return -/mob/living/carbon/human/airflow_stun() - if(!slip_chance()) - to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") - return 0 - ..() - /atom/movable/proc/experience_pressure_difference() return -/mob/proc/slip_chance() - return - -/mob/living/carbon/human/slip_chance(prob_slip = 50) - if(stat) - return FALSE - if(buckled) - return FALSE - if(shoes) - var/obj/item/clothing/myshoes = shoes - if(myshoes.clothing_flags & NOSLIP|NOSLIP_ICE) - return FALSE - - if(m_intent == MOVE_INTENT_RUN) //No running in the halls! - prob_slip *= 2 - - if(HAS_TRAIT(src, TRAIT_NOSLIPALL)) - return - - return prob(prob_slip) - /atom/movable/proc/check_airflow_movable(n) if(anchored && !ismob(src)) return 0 diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 70474c2753d..c68f68b2b2e 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -10,6 +10,7 @@ invisibility = INVISIBILITY_ABSTRACT // No one can see us sight = SEE_SELF move_on_shuttle = FALSE + simulated = FALSE /mob/camera/Initialize(mapload) . = ..() @@ -18,6 +19,7 @@ /mob/camera/experience_pressure_difference() return */ + /mob/camera/canUseStorage() return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index de6a269e464..4c033de1cd5 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -15,6 +15,8 @@ blocks_emissive = EMISSIVE_BLOCK_GENERIC layer = MOB_LAYER plane = GAME_PLANE_FOV_HIDDEN + simulated = FALSE + //The sound this plays on impact. var/hitsound = 'sound/weapons/pierce.ogg' var/hitsound_wall = "" From e90923115e558506fe3fb1e2d066b420623c1d22 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 6 May 2022 23:59:21 -0400 Subject: [PATCH 087/200] Hibernation, filters, optimizations. --- code/controllers/subsystem/airmachines.dm | 9 +++- code/datums/components/gas_leaker.dm | 3 ++ code/game/machinery/_machinery.dm | 3 ++ code/modules/atmospherics/ZAS/Temperature.dm | 9 ++-- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 4 +- .../atmospherics/ZAS/atmos_primitives.dm | 17 ------- .../components/unary_devices/vent_pump.dm | 13 +++--- .../components/unary_devices/vent_scrubber.dm | 46 +++++++++++-------- 8 files changed, 53 insertions(+), 51 deletions(-) diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index 7973428b70e..af1a499ce78 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -13,6 +13,7 @@ SUBSYSTEM_DEF(airmachines) var/list/rebuild_queue = list() var/list/expansion_queue = list() var/list/atmos_machinery = list() + var/sleeping_machines = 0 var/list/current_run = list() var/list/current_process = SSAIRMACH_PIPENETS @@ -21,6 +22,7 @@ SUBSYSTEM_DEF(airmachines) var/cost_pipenets var/cost_atmos_machinery + /datum/controller/subsystem/airmachines/Initialize(timeofday) var/starttime = REALTIMEOFDAY to_chat(world, span_boldannounce("Airmachines: Setting up atmospheric machinery...")) @@ -36,8 +38,9 @@ SUBSYSTEM_DEF(airmachines) msg += "CR: [cost_rebuilds ? cost_rebuilds : 0]|" msg += "CPN: [cost_pipenets]|" msg += "CAM: [cost_atmos_machinery]|" - msg += "NN: [length(networks)]|" + msg += "NPN: [length(networks)]|" msg += "NAM: [length(atmos_machinery)]|" + msg += "NSM: [sleeping_machines]|" msg += "RQ: [length(rebuild_queue)]|" msg += "EQ: [length(expansion_queue)]" return ..() @@ -136,11 +139,15 @@ SUBSYSTEM_DEF(airmachines) src.current_run = atmos_machinery.Copy() //cache for sanic speed (lists are references anyways) var/list/current_run = src.current_run + sleeping_machines = 0 while(current_run.len) var/obj/machinery/M = current_run[current_run.len] current_run.len-- if(!M) atmos_machinery -= M + if(!COOLDOWN_FINISHED(M, hibernating)) + sleeping_machines++ + continue if(M.process_atmos() == PROCESS_KILL) stop_processing_machine(M) if(MC_TICK_CHECK) diff --git a/code/datums/components/gas_leaker.dm b/code/datums/components/gas_leaker.dm index 29e676c3bcb..a7ca0b5e4e0 100644 --- a/code/datums/components/gas_leaker.dm +++ b/code/datums/components/gas_leaker.dm @@ -16,6 +16,9 @@ /// Mirror of the machine var signifying whether this is live in the air subsystem var/atmos_processing = FALSE + ///Mirror of the machine var, unused for gas_leaker specifically. + COOLDOWN_DECLARE(hibernating) + /datum/component/gas_leaker/Initialize(integrity_leak_percent=0.9, leak_rate=1) . = ..() if(istype(parent, /obj/machinery/atmospherics/components)) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 3a5fd60e4dc..6f7f1b87333 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -144,6 +144,9 @@ /// Mobtype of last user. Typecast to [/mob/living] for initial() usage var/mob/living/last_user_mobtype + ///Used by SSairmachines for optimizing scrubbers and vent pumps. + COOLDOWN_DECLARE(hibernating) + /obj/machinery/Initialize(mapload) if(!armor) armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index f5c43e0aea0..a362dc5c88c 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -29,26 +29,23 @@ . = ..() temperature_coefficient = isnull(temperature_coefficient) ? clamp(MAX_TEMPERATURE_COEFFICIENT - FLOOR(mob_size/4, 1), MIN_TEMPERATURE_COEFFICIENT, MAX_TEMPERATURE_COEFFICIENT) : temperature_coefficient -/atom/proc/process_atmos_exposure() +/atom/proc/process_atmos_exposure(delta_time) // Get our location temperature if possible. // Nullspace is room temperature, clearly. var/adjust_temp var/datum/gas_mixture/local_air if(loc) - if(!loc.simulated) + if(!isturf(loc)) adjust_temp = loc.temperature else - //var/turf/simulated/T = loc var/turf/T = get_turf(loc) - if(!istype(T)) - return if(T.zone && T.zone.air) adjust_temp = T.zone.air.temperature SEND_SIGNAL(T, COMSIG_TURF_EXPOSE, T.zone.air, T.zone.air.temperature) atmos_expose(T.zone.air, T.zone.air.temperature) local_air = T.zone.air else - adjust_temp = T20C + adjust_temp = T.temperature else adjust_temp = T20C diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 586c665a329..13237f5fd7a 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -505,14 +505,14 @@ return temperature /datum/gas_mixture/proc/get_moles() - updateValues() + //updateValues() return total_moles ////END LINDA COMPATABILITY//// ///Returns the gas list with an update. /datum/gas_mixture/proc/getGases() RETURN_TYPE(/list) - updateValues() + //updateValues() return gas /datum/gas_mixture/proc/returnVisuals() diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index a854e90baba..d4106022c69 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -54,23 +54,6 @@ if (transfer_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing return -1 - /* - //Update flow rate meter - if (istype(M, /obj/machinery/atmospherics)) - var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - - if (A.debug) - A.visible_message("[A]: source entropy: [round(source.specificGroupEntropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specificGroupEntropy(), 0.01)] J/Kmol") - A.visible_message("[A]: specific entropy change = [round(sink.specificGroupEntropy() - source.specificGroupEntropy(), 0.01)] J/Kmol") - A.visible_message("[A]: specific power = [round(specific_power, 0.1)] W/mol") - A.visible_message("[A]: moles transferred = [transfer_moles] mol") - - if (istype(M, /obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - */ - var/datum/gas_mixture/removed = source.remove(transfer_moles) if (!removed) //Just in case return -1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 726b57e9a99..8cf8e756e5b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -42,8 +42,6 @@ var/radio_filter_out ///Radio connection from the air alarm var/radio_filter_in - ///Optimization - COOLDOWN_DECLARE(sleeping) /obj/machinery/atmospherics/components/unary/vent_pump/New() if(!id_tag) @@ -104,8 +102,6 @@ on = FALSE if(!on || welded) return - if(!COOLDOWN_FINISHED(src, sleeping)) - return var/turf/open/us = loc if(!istype(us)) return @@ -116,19 +112,22 @@ if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5) if(pump_direction & RELEASING) //internal -> external var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) - pump_gas(air_contents, environment, transfer_moles) + if(pump_gas(air_contents, environment, transfer_moles) == -1) + COOLDOWN_START(src, hibernating, 15 SECONDS) update_parents() + else //external -> internal var/transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta) //limit flow rate from turfs transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here - pump_gas(environment, air_contents, transfer_moles) + if(pump_gas(environment, air_contents, transfer_moles) == -1) + COOLDOWN_START(src, hibernating, 15 SECONDS) update_parents() else if(pump_direction && (pressure_checks&EXT_BOUND)) - COOLDOWN_START(src, sleeping, 15 SECONDS) + COOLDOWN_START(src, hibernating, 15 SECONDS) /obj/machinery/atmospherics/components/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment) var/pressure_delta = DEFAULT_PRESSURE_DELTA diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 7593168ceef..ed2b2fc3b6b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -38,8 +38,6 @@ ///Radio connection from the air alarm var/radio_filter_in - COOLDOWN_DECLARE(check_turfs_cooldown) - /obj/machinery/atmospherics/components/unary/vent_scrubber/New() if(!id_tag) id_tag = SSnetworks.assign_random_name() @@ -70,16 +68,19 @@ if(!islist(filter_or_filters)) filter_or_filters = list(filter_or_filters) - var/turf/open/our_turf = get_turf(src) + for(var/gas_to_filter in filter_or_filters) + filter_types |= gas_to_filter + + var/turf/our_turf = get_turf(src) - if(!isopenturf(our_turf)) + if(!our_turf.simulated) return FALSE var/datum/gas_mixture/turf_gas = our_turf.air if(!turf_gas) return FALSE - COOLDOWN_RESET(src, check_turfs_cooldown) + COOLDOWN_RESET(src, hibernating) return TRUE ///remove a gas or list of gases from our filter_types.used so that the scrubber can check if its supposed to be processing after each change @@ -87,17 +88,19 @@ if(!islist(filter_or_filters)) filter_or_filters = list(filter_or_filters) + for(var/gas_to_filter in filter_or_filters) + filter_types -= gas_to_filter - var/turf/open/our_turf = get_turf(src) + var/turf/our_turf = get_turf(src) var/datum/gas_mixture/turf_gas - if(isopenturf(our_turf)) - turf_gas = our_turf.air + if(our_turf.simulated) + turf_gas = our_turf.return_air() if(!turf_gas) return FALSE - COOLDOWN_RESET(src, check_turfs_cooldown) + COOLDOWN_RESET(src, hibernating) return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/toggle_filters(filter_or_filters) @@ -105,16 +108,21 @@ filter_or_filters = list(filter_or_filters) for(var/gas_to_filter in filter_or_filters) + if(gas_to_filter in filter_types) + filter_types -= gas_to_filter + else + filter_types |= gas_to_filter - var/turf/open/our_turf = get_turf(src) + var/turf/our_turf = get_turf(src) - if(!isopenturf(our_turf)) + if(!our_turf.simulated) return FALSE var/datum/gas_mixture/turf_gas = our_turf.return_air() if(!turf_gas) return FALSE + COOLDOWN_RESET(src, hibernating) return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() @@ -197,24 +205,26 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() if(welded || !is_operational) return +// if(!COOLDOWN_FINISHED(src, hibernating)) +// return if(!on || !nodes[1]) on = FALSE return - if(!COOLDOWN_FINISHED(src, check_turfs_cooldown)) - return var/turf/open/us = loc if(!istype(us)) return + var/should_cooldown = TRUE if(scrub(us)) should_cooldown = FALSE if(widenet) check_turfs() for(var/turf/tile in adjacent_turfs) - if(scrub(tile)) + if(scrub(tile) && should_cooldown) should_cooldown = FALSE if(should_cooldown) - COOLDOWN_START(src, check_turfs_cooldown, 5 SECONDS) + COOLDOWN_START(src, hibernating, 15 SECONDS) + return TRUE ///filtered gases at or below this amount automatically get removed from the mix @@ -245,8 +255,8 @@ //take this gases portion of removal_ratio of the turfs air, or all of that gas if less than or equal to MINIMUM_MOLES_TO_SCRUB //var/transfer_moles = min(environment.total_moles, volume_rate/environment.volume)*environment.total_moles var/transfer_moles = min(environment.total_moles, environment.total_moles*volume_rate/environment.volume) - scrub_gas(filter_types, environment, filtered_out, transfer_moles, INFINITY) - + if(scrub_gas(filter_types, environment, filtered_out, transfer_moles, INFINITY) == -1) + . = FALSE //Remix the resulting gases air_contents.merge(filtered_out) @@ -260,8 +270,8 @@ air_contents.merge(removed) update_parents() + return TRUE - return TRUE #undef MINIMUM_MOLES_TO_SCRUB From e7c113479509cc5659fd23118c275413b6ca5c36 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 10 May 2022 15:44:17 -0400 Subject: [PATCH 088/200] Disables ZASDBG and adds last process --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/controllers/subsystem/zas.dm | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 1715a22e750..cf679748770 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,4 +1,4 @@ -#define ZASDBG +//#define ZASDBG //#define MULTIZAS #define AIR_ALLOWED 0 diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 5e7262ad25b..a7d1973a472 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -102,6 +102,7 @@ SUBSYSTEM_DEF(zas) var/tmp/list/processing_hotspots var/tmp/list/processing_zones + var/last_process var/active_zones = 0 var/next_id = 1 @@ -197,6 +198,7 @@ SUBSYSTEM_DEF(zas) var/list/curr_hotspot = processing_hotspots var/list/curr_zones = zones_to_update + last_process = "TILES" /////////TILES////////// cached_cost = 0 @@ -240,6 +242,7 @@ SUBSYSTEM_DEF(zas) cost_tiles = MC_AVERAGE(cost_tiles, TICK_DELTA_TO_MS(cached_cost)) //////////DEFERRED TILES////////// + last_process = "DEFERRED TILES" timer = TICK_USAGE_REAL cached_cost = 0 while (curr_defer.len) @@ -262,7 +265,7 @@ SUBSYSTEM_DEF(zas) cost_deferred_tiles = MC_AVERAGE(cost_deferred_tiles, TICK_DELTA_TO_MS(cached_cost)) //////////EDGES////////// - + last_process = "EDGES" timer = TICK_USAGE_REAL cached_cost = 0 while (curr_edges.len) @@ -287,6 +290,7 @@ SUBSYSTEM_DEF(zas) cost_edges = MC_AVERAGE(cost_edges, TICK_DELTA_TO_MS(cached_cost)) //////////FIRES////////// + last_process = "FIRES" timer = TICK_USAGE_REAL cached_cost = 0 while (curr_fire.len) @@ -304,6 +308,7 @@ SUBSYSTEM_DEF(zas) cost_fires= MC_AVERAGE(cost_fires, TICK_DELTA_TO_MS(cached_cost)) //////////HOTSPOTS////////// + last_process = "HOTSPOTS" timer = TICK_USAGE_REAL cached_cost = 0 while (curr_hotspot.len) From cd17c647a71ba8f74e875bb28f1e0c5205c6e8bf Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 12:22:12 -0400 Subject: [PATCH 089/200] Unfucks varedits, optimizes updateValues() by making it a macro --- .../IceRuins/icemoon_surface_asteroid.dmm | 10 +- ...cemoon_underground_abandoned_homestead.dmm | 81 ++- ..._underground_abandoned_plasma_facility.dmm | 105 ++- .../icemoon_underground_frozen_comms.dmm | 66 +- .../IceRuins/icemoon_underground_lavaland.dmm | 8 +- .../IceRuins/icemoon_underground_library.dmm | 144 +++-- .../icemoon_underground_wendigo_cave.dmm | 9 +- .../lavaland_surface_biodome_winter.dmm | 6 +- .../LavaRuins/lavaland_surface_cultaltar.dmm | 16 +- .../LavaRuins/lavaland_surface_hermit.dmm | 2 +- .../LavaRuins/lavaland_surface_pizzaparty.dmm | 72 +-- .../LavaRuins/lavaland_surface_ufo_crash.dmm | 26 +- _maps/RandomRuins/SpaceRuins/TheDerelict.dmm | 10 +- .../RandomRuins/SpaceRuins/caravanambush.dmm | 22 +- .../RandomRuins/SpaceRuins/thelizardsgas.dmm | 12 +- _maps/RandomRuins/SpaceRuins/vaporwave.dmm | 12 +- _maps/RandomZLevels/caves.dmm | 609 ++++++++++++------ _maps/RandomZLevels/moonoutpost19.dmm | 338 +++++----- _maps/RandomZLevels/undergroundoutpost45.dmm | 98 +-- .../map_files/Deltastation/DeltaStation2.dmm | 4 +- .../IcemoonUnderground_Above.dmm | 36 +- _maps/map_files/MetaStation/MetaStation.dmm | 6 +- _maps/map_files/generic/CentCom.dmm | 64 +- .../maintenance_miningsolar_3.dmm | 2 +- _maps/shuttles/ruin_caravan_victim.dmm | 38 +- _maps/templates/battlecruiser_starfury.dmm | 6 +- .../templates/heretic_sacrifice_template.dmm | 118 ++-- code/__DEFINES/atmospherics/ZAS.dm | 17 + code/__DEFINES/subsystems.dm | 5 +- code/controllers/subsystem/airflow.dm | 6 +- code/controllers/subsystem/zas.dm | 9 +- .../effects/effect_system/effects_foam.dm | 2 +- .../effects/effect_system/effects_water.dm | 1 - code/game/turfs/open/ashplanet.dm | 1 - code/game/turfs/open/floor/glass.dm | 2 +- code/modules/admin/verbs/fix_air.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 51 +- .../atmospherics/ZAS/ConnectionGroup.dm | 12 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 2 +- code/modules/atmospherics/ZAS/Fire.dm | 26 +- code/modules/atmospherics/ZAS/Plasma.dm | 20 +- code/modules/atmospherics/ZAS/Turf.dm | 7 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 4 +- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 62 +- code/modules/atmospherics/ZAS/Zone.dm | 2 +- .../atmospherics/ZAS/atmos_primitives.dm | 10 +- code/modules/mob/living/carbon/life.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 1 + code/modules/surgery/organs/lungs.dm | 3 +- 49 files changed, 1254 insertions(+), 913 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm index 26856fe193f..341180c0013 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm @@ -12,7 +12,7 @@ /obj/item/clothing/shoes/bronze, /obj/item/clothing/head/bronze, /turf/open/floor/bronze{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/icemoon/surface) "m" = ( @@ -20,12 +20,12 @@ name = "empowered bronze spear" }, /turf/open/floor/bronze{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/icemoon/surface) "o" = ( /turf/open/floor/bronze{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/icemoon/surface) "A" = ( @@ -66,7 +66,7 @@ "L" = ( /mob/living/simple_animal/hostile/megafauna/clockwork_defender, /turf/open/floor/bronze{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/icemoon/surface) "M" = ( @@ -95,7 +95,7 @@ }, /obj/item/pen, /turf/open/floor/bronze{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/icemoon/surface) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm index 9fc33f694ed..bc85e22296c 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm @@ -6,7 +6,8 @@ "cP" = ( /mob/living/simple_animal/hostile/asteroid/polarbear, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "dy" = ( @@ -27,7 +28,8 @@ }, /obj/item/plate, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "ht" = ( @@ -38,7 +40,8 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "kj" = ( @@ -58,7 +61,8 @@ /area/icemoon/underground/explored) "ng" = ( /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "nq" = ( @@ -78,7 +82,8 @@ dir = 8 }, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "qd" = ( @@ -103,14 +108,16 @@ pixel_y = 11 }, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "uA" = ( /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "uG" = ( @@ -128,7 +135,8 @@ /obj/item/ammo_casing/shotgun/buckshot, /obj/item/ammo_casing/shotgun/buckshot, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "vk" = ( @@ -153,7 +161,8 @@ pixel_y = 3 }, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "wl" = ( @@ -163,7 +172,8 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/mineral_door/wood, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "wN" = ( @@ -174,7 +184,8 @@ dir = 4 }, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "yO" = ( @@ -190,13 +201,15 @@ "zT" = ( /obj/structure/bed/dogbed, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Cv" = ( /obj/structure/bookcase/random/religion, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Ea" = ( @@ -212,7 +225,8 @@ pixel_y = 5 }, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "El" = ( @@ -221,7 +235,8 @@ }, /obj/item/flashlight/lantern, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Ez" = ( @@ -249,14 +264,16 @@ dir = 8 }, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Hy" = ( /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "HF" = ( @@ -268,7 +285,8 @@ pixel_y = -8 }, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Iz" = ( @@ -280,7 +298,8 @@ pixel_y = -7 }, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Mf" = ( @@ -294,7 +313,8 @@ /obj/structure/bed, /obj/item/bedsheet/patriot, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "NP" = ( @@ -312,12 +332,14 @@ /obj/item/seeds/coffee, /obj/item/seeds/coffee, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "QI" = ( /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Rf" = ( @@ -336,7 +358,8 @@ /obj/structure/mineral_door/wood, /obj/item/assembly/mousetrap/armed, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Sv" = ( @@ -365,14 +388,16 @@ /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Vf" = ( /obj/structure/barricade/wooden/snowed, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "VV" = ( @@ -384,7 +409,8 @@ dir = 8 }, /turf/open/floor/stone{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Zg" = ( @@ -394,7 +420,8 @@ }, /obj/structure/mineral_door/wood, /turf/open/floor/wood/large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 3d95d429115..bf28ba25c77 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -307,7 +307,8 @@ /obj/item/storage/toolbox/electrical, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "dY" = ( @@ -450,7 +451,8 @@ dir = 8 }, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "gD" = ( @@ -501,7 +503,8 @@ /obj/item/pickaxe, /obj/item/clothing/head/hardhat/weldhat/orange, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "hd" = ( @@ -509,7 +512,8 @@ /obj/structure/closet/crate, /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "hr" = ( @@ -651,7 +655,8 @@ }, /obj/structure/plasticflaps, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "ja" = ( @@ -679,7 +684,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/west, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "jN" = ( @@ -719,7 +725,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "ku" = ( @@ -801,7 +808,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "lG" = ( @@ -851,7 +859,8 @@ /obj/item/flashlight/lantern, /obj/machinery/light/small/built/directional/west, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "ms" = ( @@ -876,7 +885,8 @@ "mA" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "mG" = ( @@ -969,7 +979,8 @@ name = "Interior Access" }, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "oc" = ( @@ -1005,7 +1016,8 @@ dir = 8 }, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "oE" = ( @@ -1141,7 +1153,8 @@ /obj/machinery/atmospherics/components/tank/plasma, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "qP" = ( @@ -1226,7 +1239,8 @@ }, /obj/item/stack/sheet/mineral/plasma/thirty, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "sq" = ( @@ -1376,7 +1390,8 @@ }, /mob/living/simple_animal/hostile/asteroid/wolf, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "uq" = ( @@ -1414,7 +1429,8 @@ /obj/item/tank/internals/emergency_oxygen/empty, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "ve" = ( @@ -1447,7 +1463,8 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "wc" = ( @@ -1469,7 +1486,8 @@ /obj/machinery/atmospherics/components/tank/air, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "wu" = ( @@ -1615,7 +1633,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Ae" = ( @@ -1698,7 +1717,8 @@ dir = 8 }, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "BJ" = ( @@ -1781,14 +1801,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "CJ" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "CU" = ( @@ -2034,7 +2056,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Id" = ( @@ -2101,7 +2124,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/built/directional/west, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "Jp" = ( @@ -2138,7 +2162,8 @@ /mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Jy" = ( @@ -2360,7 +2385,8 @@ /obj/machinery/power/smes/engineering, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "MU" = ( @@ -2442,7 +2468,8 @@ /obj/machinery/light/small/directional/north, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Ny" = ( @@ -2516,7 +2543,8 @@ "OF" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "OJ" = ( @@ -2526,7 +2554,8 @@ }, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "OM" = ( @@ -2564,7 +2593,8 @@ dir = 1 }, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180 }, /area/ruin/plasma_facility/operations) "Px" = ( @@ -2648,7 +2678,8 @@ /obj/machinery/door/airlock/external/glass/ruin, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "Qn" = ( @@ -2696,7 +2727,8 @@ /obj/structure/rack, /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Rf" = ( @@ -2970,7 +3002,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "Xj" = ( @@ -2984,7 +3017,8 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/operations) "XC" = ( @@ -2992,7 +3026,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/plasma_facility/commons) "XI" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index e23841cab79..fe80e769202 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -19,7 +19,8 @@ /obj/structure/table/reinforced/rglass, /obj/item/radio/intercom, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "cO" = ( @@ -40,7 +41,8 @@ }, /obj/machinery/door/airlock/external/glass/ruin, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "gz" = ( @@ -57,7 +59,8 @@ /area/icemoon/underground/unexplored/rivers) "kr" = ( /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "oj" = ( @@ -65,18 +68,21 @@ /obj/structure/bed, /obj/item/bedsheet/dorms, /turf/open/floor/iron/grimy{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "oD" = ( /mob/living/simple_animal/hostile/asteroid/wolf, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "oT" = ( /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "qS" = ( @@ -89,13 +95,15 @@ pixel_y = 7 }, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "rm" = ( /obj/structure/table/reinforced/rglass, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "rn" = ( @@ -110,7 +118,8 @@ "st" = ( /obj/machinery/door/airlock/public, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "sM" = ( @@ -132,13 +141,15 @@ "uz" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "vh" = ( /obj/item/chair/plastic, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "wg" = ( @@ -152,7 +163,8 @@ pixel_y = 20 }, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "wP" = ( @@ -166,7 +178,8 @@ /obj/structure/closet/wardrobe/grey, /obj/item/clothing/gloves/color/plasmaman, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "yW" = ( @@ -185,7 +198,8 @@ /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/mask/breath, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "zk" = ( @@ -220,7 +234,8 @@ /obj/item/toy/crayon/spraycan, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Cu" = ( @@ -265,7 +280,8 @@ /obj/structure/dresser, /obj/machinery/light/small/broken/directional/west, /turf/open/floor/iron/grimy{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "GH" = ( @@ -286,7 +302,8 @@ /obj/structure/closet/wardrobe/grey, /obj/effect/spawner/random/maintenance/three, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Jh" = ( @@ -330,13 +347,15 @@ /obj/effect/turf_decal/siding/wood, /obj/machinery/door/airlock/shuttle, /turf/open/floor/iron/grimy{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "NO" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Oi" = ( @@ -379,7 +398,8 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/door/airlock/external/ruin, /turf/open/floor/iron/smooth{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "SR" = ( @@ -412,14 +432,16 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Ws" = ( /obj/structure/closet/wardrobe/grey, /obj/item/clothing/under/plasmaman, /turf/open/floor/iron/showroomfloor{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/powered/shuttle) "Zd" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm index 7746d05bf10..97192b89955 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm @@ -12,7 +12,7 @@ }, /obj/item/pen, /turf/open/misc/asteroid{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/icemoon/underground) "q" = ( @@ -34,7 +34,7 @@ "A" = ( /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/icemoon/underground) "E" = ( @@ -56,12 +56,12 @@ "V" = ( /obj/item/storage/toolbox/mechanical/old/clean, /turf/open/misc/asteroid{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/icemoon/underground) "Z" = ( /turf/open/misc/asteroid{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/icemoon/underground) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index dd90c127cbd..61147284c5e 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -16,25 +16,29 @@ /area/icemoon/underground/unexplored) "ae" = ( /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "af" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ag" = ( /obj/item/feather, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ah" = ( /obj/structure/bookcase/random, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ai" = ( @@ -64,21 +68,24 @@ "ao" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ap" = ( /obj/item/stack/sheet/mineral/wood, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aq" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ar" = ( @@ -87,7 +94,8 @@ "at" = ( /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "au" = ( @@ -108,7 +116,8 @@ "az" = ( /obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aA" = ( @@ -118,7 +127,8 @@ "aB" = ( /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aC" = ( @@ -127,28 +137,32 @@ /area/ruin/unpowered/buried_library) "aD" = ( /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aE" = ( /obj/item/stack/sheet/mineral/wood, /obj/item/book/manual/random, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aG" = ( /obj/structure/table/bronze, /obj/item/stack/ore/slag, /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aH" = ( /obj/structure/table/bronze, /obj/item/statuebust/hippocratic, /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aI" = ( @@ -169,7 +183,8 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aM" = ( @@ -180,13 +195,15 @@ "aN" = ( /obj/structure/statue/sandstone/venus, /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aO" = ( /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aP" = ( @@ -197,13 +214,15 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aR" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aS" = ( @@ -219,7 +238,8 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aU" = ( @@ -230,7 +250,8 @@ /obj/item/stack/sheet/mineral/wood, /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "aW" = ( @@ -250,7 +271,8 @@ /obj/structure/fluff/paper/stack, /obj/structure/fluff/paper, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "ba" = ( @@ -268,7 +290,8 @@ dir = 1 }, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bd" = ( @@ -278,7 +301,8 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "be" = ( @@ -286,7 +310,8 @@ dir = 5 }, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bf" = ( @@ -295,7 +320,8 @@ dir = 4 }, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bg" = ( @@ -306,7 +332,8 @@ /obj/effect/decal/cleanable/dirt/dust, /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bi" = ( @@ -321,7 +348,8 @@ /obj/structure/fluff/paper/stack, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bl" = ( @@ -345,7 +373,8 @@ /obj/structure/mineral_door/wood, /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "br" = ( @@ -368,26 +397,30 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bw" = ( /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bx" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "by" = ( /obj/structure/statue/bronze/marx, /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bz" = ( @@ -403,7 +436,8 @@ "bB" = ( /obj/structure/fluff/paper/stack, /turf/open/floor/carpet/black{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bC" = ( @@ -413,34 +447,39 @@ }, /mob/living/simple_animal/pet/fox, /turf/open/floor/wood{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bD" = ( /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bE" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bF" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bG" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken6"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bH" = ( @@ -448,28 +487,32 @@ /obj/structure/fluff/paper, /turf/open/floor/wood{ icon_state = "wood-broken4"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bI" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bJ" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ icon_state = "wood-broken2"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bK" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bL" = ( @@ -478,7 +521,8 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bM" = ( @@ -487,7 +531,8 @@ }, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bN" = ( @@ -495,20 +540,23 @@ /obj/structure/fluff/paper, /turf/open/floor/wood{ icon_state = "wood-broken5"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bP" = ( /obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, /turf/open/floor/wood{ icon_state = "wood-broken3"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) "bQ" = ( /turf/open/floor/wood{ icon_state = "wood-broken7"; - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/ruin/unpowered/buried_library) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm index e58ad558b34..51113917779 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -15,7 +15,8 @@ "q" = ( /mob/living/simple_animal/hostile/megafauna/wendigo, /turf/open/indestructible/necropolis{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "z" = ( @@ -23,7 +24,8 @@ id = "wendigo arena" }, /turf/open/indestructible/necropolis{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "K" = ( @@ -34,7 +36,8 @@ /area/icemoon/underground/unexplored) "N" = ( /turf/open/indestructible/necropolis{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "U" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index cd6d52fab41..df10ceff550 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -204,7 +204,7 @@ dir = 1 }, /turf/open/floor/wood{ - initial_gas = "o2=22;n2=82;TEMP=180"; + temperature = 180; name = "bridge" }, /area/ruin/powered/snow_biodome) @@ -276,7 +276,7 @@ /obj/machinery/light/built/directional/north, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/pod/dark{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/powered/snow_biodome) "og" = ( @@ -423,7 +423,7 @@ "PM" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood{ - initial_gas = "o2=22;n2=82;TEMP=180"; + temperature = 180; name = "bridge" }, /area/ruin/powered/snow_biodome) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index 553b09f55fc..24698a1bcc8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "c" = ( @@ -24,21 +24,21 @@ "g" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "i" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "k" = ( /obj/effect/decal/remains/human, /obj/item/melee/cultblade, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "l" = ( @@ -46,13 +46,13 @@ /obj/item/clothing/shoes/cult, /obj/item/clothing/suit/hooded/cultrobes, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "m" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "o" = ( @@ -74,7 +74,7 @@ name = "ohfuck" }, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "q" = ( @@ -83,7 +83,7 @@ /obj/item/clothing/suit/hooded/cultrobes, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered/cultaltar) "s" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 5ec32d26957..c97be0bfd36 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -164,7 +164,7 @@ "J" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/powered) "L" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 1bb066f4c07..b2210954e53 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -15,14 +15,14 @@ "e" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "f" = ( /obj/structure/table/wood, /obj/item/storage/box/cups, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "g" = ( @@ -32,27 +32,27 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "h" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "i" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "j" = ( /obj/item/food/pizzaslice/mushroom, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "k" = ( @@ -60,7 +60,7 @@ /obj/effect/spawner/random/food_or_drink/pizzaparty, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "l" = ( @@ -70,42 +70,42 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "m" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "n" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "o" = ( /obj/item/plate, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "p" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "q" = ( /obj/item/chair/wood/wings, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "r" = ( @@ -116,25 +116,25 @@ name = "party hat" }, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "s" = ( /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "t" = ( /obj/structure/chair/wood/wings, /obj/effect/decal/remains/human, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "u" = ( /obj/structure/glowshroom/single, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "v" = ( @@ -146,21 +146,21 @@ /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "x" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/pizzaparty, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "y" = ( /obj/structure/table/wood, /obj/item/plate, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "z" = ( @@ -168,7 +168,7 @@ /obj/structure/glowshroom/single, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "A" = ( @@ -176,7 +176,7 @@ /obj/item/plate, /obj/item/kitchen/fork, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "C" = ( @@ -185,7 +185,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "D" = ( @@ -193,47 +193,47 @@ /obj/item/food/pizzaslice/margherita, /obj/item/plate, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "E" = ( /obj/structure/table/wood, /obj/item/food/pizzaslice/meat, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "F" = ( /obj/structure/table/wood, /obj/item/food/cake/birthday, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "G" = ( /obj/structure/table/wood, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "H" = ( /obj/item/chair/wood/wings, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "I" = ( /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "J" = ( /obj/structure/glowshroom/single, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "K" = ( @@ -243,21 +243,21 @@ /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "L" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "M" = ( /obj/effect/decal/cleanable/dirt, /obj/item/a_gift, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "N" = ( @@ -269,19 +269,19 @@ /obj/item/knife/kitchen, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "P" = ( /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "Q" = ( /turf/open/floor/plating{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index e06a4ff91d2..b19e02fa0b7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -16,12 +16,12 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "k" = ( /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "l" = ( @@ -29,59 +29,59 @@ team_number = 100 }, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "o" = ( /obj/item/hemostat/alien, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "p" = ( /obj/effect/mob_spawn/corpse/human/abductor, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "q" = ( /obj/structure/closet/abductor, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "s" = ( /obj/structure/table/optable/abductor, /obj/item/cautery/alien, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "t" = ( /obj/structure/table/abductor, /obj/item/storage/box/alienhandcuffs, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "v" = ( /obj/item/scalpel/alien, /obj/item/surgical_drapes, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "w" = ( /obj/item/retractor/alien, /obj/item/paper/guides/antag/abductor, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "y" = ( /obj/machinery/abductor/gland_dispenser, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "z" = ( @@ -89,13 +89,13 @@ /obj/item/surgicaldrill/alien, /obj/item/circular_saw/alien, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) "A" = ( /obj/structure/bed/abductor, /turf/open/floor/plating/abductor{ - initial_gas = "LAVALAND_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30) }, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 641d1197db0..a304d11c8df 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -2240,7 +2240,7 @@ "lw" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/engine/air{ - initial_gas = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = list("oxygen" = 20000, "nitrogen" = 80000) }, /area/ruin/space/derelict/atmospherics) "lx" = ( @@ -2309,7 +2309,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = list("oxygen" = 20000, "nitrogen" = 80000) }, /area/ruin/space/derelict/atmospherics) "lO" = ( @@ -2317,7 +2317,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = list("oxygen" = 20000, "nitrogen" = 80000) }, /area/ruin/space/derelict/atmospherics) "lP" = ( @@ -2429,7 +2429,7 @@ "mq" = ( /turf/open/floor/iron{ icon_state = "damaged2"; - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/space/derelict/atmospherics) "mr" = ( @@ -2923,7 +2923,7 @@ chamber_id = "ks13" }, /turf/open/floor/engine/air{ - initial_gas = "o2=20000;n2=80000;TEMP=293.15" + initial_gas = list("oxygen" = 20000, "nitrogen" = 80000) }, /area/ruin/space/derelict/atmospherics) "rc" = ( diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 269f8102e67..3d53d7b92e4 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -112,7 +112,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "aD" = ( @@ -132,7 +132,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "aI" = ( @@ -148,14 +148,14 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "aM" = ( /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "aN" = ( @@ -193,7 +193,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "aR" = ( @@ -486,7 +486,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "gY" = ( @@ -513,7 +513,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "hm" = ( @@ -610,7 +610,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "hB" = ( @@ -813,7 +813,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter2) "ix" = ( @@ -883,7 +883,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter3) "iT" = ( @@ -923,7 +923,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter2) "ja" = ( diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index 38d60e8b95c..737f6c386d0 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -118,7 +118,7 @@ chamber_id = "lizardgas" }, /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "mN" = ( @@ -295,7 +295,7 @@ /area/template_noop) "DG" = ( /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "Es" = ( @@ -423,7 +423,7 @@ "OQ" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "Pb" = ( @@ -457,7 +457,7 @@ name = "Zingo" }, /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "RB" = ( @@ -499,7 +499,7 @@ dir = 4 }, /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "Um" = ( @@ -549,7 +549,7 @@ chamber_id = "lizardgas" }, /turf/open/floor/engine/plasma{ - initial_gas = "plasma=35000;TEMP=293.15" + initial_gas = list("plasma" = 35000) }, /area/ruin/space/has_grav/thelizardsgas) "Ys" = ( diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index f20af636567..143cab36278 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -118,13 +118,13 @@ /obj/effect/turf_decal/sand, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) "B" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) "C" = ( @@ -135,7 +135,7 @@ }, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) "D" = ( @@ -155,14 +155,14 @@ }, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) "G" = ( /obj/effect/turf_decal/stripes/asteroid/line, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) "H" = ( @@ -216,7 +216,7 @@ /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/ruin/unpowered/no_grav) diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index c192680e2b0..9c71e541102 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -11,14 +11,16 @@ "ad" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) "ah" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_three) @@ -27,25 +29,29 @@ /area/awaymission/caves/bmp_asteroid/level_three) "ao" = ( /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "ap" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "ar" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "as" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "au" = ( @@ -58,7 +64,8 @@ /obj/item/clothing/mask/gas/clown_hat, /obj/item/organ/heart/demon, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "av" = ( @@ -67,13 +74,15 @@ name = "shock rune" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aw" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "ax" = ( @@ -87,39 +96,45 @@ }, /obj/item/coin/antagtoken, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "az" = ( /obj/structure/constructshell, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aA" = ( /obj/structure/girder/cult, /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aB" = ( /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aC" = ( /obj/structure/bed, /obj/item/bedsheet/cult, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aD" = ( /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aE" = ( @@ -132,7 +147,8 @@ name = "\proper an extremely flamboyant book" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aF" = ( @@ -143,13 +159,15 @@ name = "weak forcefield" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aG" = ( /obj/item/ectoplasm, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aH" = ( @@ -158,7 +176,8 @@ "aI" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "aJ" = ( @@ -166,7 +185,8 @@ /area/awaymission/caves/bmp_asteroid/level_three) "aK" = ( /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "aM" = ( @@ -175,7 +195,8 @@ id = "minedeep" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "aP" = ( @@ -185,33 +206,38 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aR" = ( /obj/effect/forcefield/cult, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aS" = ( /obj/structure/girder/cult, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "aV" = ( /obj/effect/forcefield/cult, /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) "aW" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "aX" = ( @@ -225,7 +251,8 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "aZ" = ( @@ -234,26 +261,30 @@ name = "flame rune" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "ba" = ( /obj/structure/destructible/cult/item_dispenser/altar, /obj/item/book/granter/martial/plasma_fist/nobomb, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bf" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bl" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "bm" = ( @@ -261,7 +292,8 @@ calibrated = 0 }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bn" = ( @@ -272,14 +304,16 @@ /obj/effect/decal/cleanable/blood, /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bz" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bA" = ( @@ -287,25 +321,29 @@ /obj/item/necromantic_stone, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bC" = ( /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "bD" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "bE" = ( /obj/structure/destructible/cult/pylon, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "bF" = ( @@ -315,7 +353,8 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "bK" = ( @@ -327,7 +366,8 @@ "bM" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid) @@ -337,7 +377,8 @@ "bO" = ( /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_two) @@ -350,12 +391,14 @@ "bS" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "bT" = ( /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "bU" = ( @@ -369,19 +412,22 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "bY" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "ca" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "ce" = ( @@ -390,12 +436,14 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "cf" = ( /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "cg" = ( @@ -407,7 +455,8 @@ "cl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "cm" = ( @@ -415,24 +464,28 @@ /area/awaymission/caves/bmp_asteroid/level_two) "cn" = ( /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cp" = ( /obj/structure/table, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cr" = ( /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cs" = ( /obj/item/shard, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "ct" = ( @@ -440,36 +493,42 @@ /obj/item/stack/rods, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cu" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cv" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cw" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cx" = ( /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "cA" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cB" = ( @@ -478,7 +537,8 @@ }, /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cC" = ( @@ -486,13 +546,15 @@ /obj/item/restraints/handcuffs/cable, /obj/item/restraints/handcuffs/cable, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cD" = ( /obj/effect/decal/remains/human, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cE" = ( @@ -502,19 +564,22 @@ }, /obj/item/stack/rods, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cH" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "cK" = ( @@ -528,7 +593,8 @@ /obj/machinery/door/window/left/directional/east, /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cO" = ( @@ -537,19 +603,22 @@ }, /obj/machinery/door/window/left/directional/east, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cP" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cR" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cS" = ( @@ -559,7 +628,8 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cT" = ( @@ -570,13 +640,15 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cV" = ( /obj/effect/decal/cleanable/xenoblood/xgibs, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cW" = ( @@ -584,20 +656,23 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cX" = ( /obj/structure/table, /obj/item/melee/baton/security, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cY" = ( /obj/structure/glowshroom/single, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "cZ" = ( @@ -606,7 +681,8 @@ pixel_x = 32 }, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "db" = ( @@ -614,13 +690,15 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "dd" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "df" = ( @@ -631,7 +709,8 @@ /obj/item/grenade/syndieminibomb/concussion, /obj/item/grenade/syndieminibomb/concussion, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "dg" = ( @@ -645,7 +724,8 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "dh" = ( @@ -832,20 +912,23 @@ /area/awaymission/caves/northblock) "ec" = ( /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "ed" = ( /obj/structure/bed, /obj/effect/landmark/awaystart, /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "ee" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "eg" = ( @@ -882,24 +965,28 @@ "em" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "en" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "eo" = ( /obj/item/stack/rods, /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "ep" = ( /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "er" = ( @@ -917,7 +1004,8 @@ "et" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "ev" = ( @@ -1076,18 +1164,21 @@ name = "light of the tunnel" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "fy" = ( /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "fz" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "fA" = ( @@ -1131,7 +1222,8 @@ /area/awaymission/caves/bmp_asteroid) "fQ" = ( /turf/open/floor/plating/elevatorshaft{ - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; name = "elevator flooring" }, /area/awaymission/caves/bmp_asteroid) @@ -1142,14 +1234,16 @@ "fU" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating/elevatorshaft{ - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; name = "elevator flooring" }, /area/awaymission/caves/bmp_asteroid) "fW" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "fY" = ( @@ -1163,7 +1257,8 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gb" = ( @@ -1173,7 +1268,8 @@ "gc" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gf" = ( @@ -1185,20 +1281,23 @@ /obj/structure/table/reinforced, /obj/item/storage/box/donkpockets, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gh" = ( /obj/structure/table/reinforced, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gi" = ( /obj/structure/table/reinforced, /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gj" = ( @@ -1218,13 +1317,15 @@ "go" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gp" = ( /obj/structure/table_frame, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gq" = ( @@ -1272,7 +1373,8 @@ "gB" = ( /obj/machinery/mech_bay_recharge_port, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gC" = ( @@ -1284,7 +1386,8 @@ /obj/item/storage/toolbox/mechanical, /obj/item/clothing/glasses/material, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gG" = ( @@ -1300,12 +1403,14 @@ "gI" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gJ" = ( /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gK" = ( @@ -1323,19 +1428,22 @@ "gN" = ( /obj/structure/holohoop, /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gO" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gP" = ( /obj/item/toy/beach_ball/holoball, /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gU" = ( @@ -1343,7 +1451,8 @@ dir = 1 }, /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "gX" = ( @@ -1354,7 +1463,8 @@ /obj/effect/baseturf_helper/lava, /turf/open/lava/smooth{ desc = "Looks hot."; - initial_gas = "n2=23;o2=14;TEMP=2.7"; + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; luminosity = 5 }, /area/awaymission/caves/bmp_asteroid/level_four) @@ -1372,19 +1482,22 @@ /area/awaymission/caves/northblock) "hq" = ( /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "hr" = ( /obj/structure/spider/stickyweb, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "hw" = ( /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "hQ" = ( @@ -1394,19 +1507,22 @@ "hT" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "jH" = ( /obj/structure/spawner/mining/basilisk, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "jU" = ( /obj/structure/spawner/mining/basilisk, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "ki" = ( @@ -1418,7 +1534,8 @@ /obj/item/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "kw" = ( @@ -1426,7 +1543,8 @@ pixel_y = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( @@ -1447,13 +1565,15 @@ "ml" = ( /mob/living/simple_animal/hostile/asteroid/fugu, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "ms" = ( /obj/structure/spawner/mining/goliath, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "mX" = ( @@ -1461,7 +1581,8 @@ name = "Mining cart" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "nw" = ( @@ -1475,18 +1596,21 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "nY" = ( /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "oI" = ( /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "pc" = ( @@ -1498,13 +1622,15 @@ /obj/item/mjollnir, /mob/living/simple_animal/hostile/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "qD" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "qE" = ( @@ -1514,7 +1640,8 @@ "ra" = ( /obj/structure/glowshroom/single, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "rl" = ( @@ -1525,12 +1652,14 @@ amount = 12 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "rv" = ( /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "rF" = ( @@ -1540,7 +1669,8 @@ "sl" = ( /obj/structure/spawner/mining/hivelord, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "sw" = ( @@ -1550,19 +1680,22 @@ "sE" = ( /obj/item/greentext, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "sI" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "sT" = ( /obj/structure/spawner/mining/hivelord, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "tz" = ( @@ -1573,7 +1706,8 @@ "tU" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "uN" = ( @@ -1593,13 +1727,15 @@ "vX" = ( /obj/effect/forcefield/cult, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "wl" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "ww" = ( @@ -1608,13 +1744,15 @@ "wT" = ( /obj/structure/destructible/cult/pylon, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "xs" = ( /obj/item/bedsheet/patriot, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "yS" = ( @@ -1630,50 +1768,58 @@ /obj/item/slimepotion/fireproof, /obj/item/clothing/glasses/thermal, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "yV" = ( /obj/structure/flora/rock, /obj/item/soulstone/anybody, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "zn" = ( /obj/effect/landmark/awaystart, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "zH" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "zN" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "zR" = ( /obj/effect/decal/cleanable/ash, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "zS" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Aj" = ( /obj/structure/grille, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "AN" = ( @@ -1682,13 +1828,15 @@ name = "shock rune" }, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "AZ" = ( /obj/structure/girder, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Bd" = ( @@ -1697,54 +1845,63 @@ name = "flame rune" }, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "Bo" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Bs" = ( /obj/effect/landmark/awaystart, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( /mob/living/simple_animal/hostile/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "BH" = ( /obj/structure/spawner/skeleton, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "BK" = ( /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "BL" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "BQ" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Cc" = ( /obj/item/gun/energy/laser/captain/scattershot, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "CB" = ( @@ -1753,7 +1910,8 @@ name = "Cave Bat" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Ds" = ( @@ -1761,7 +1919,8 @@ pixel_x = 5 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "DH" = ( @@ -1772,7 +1931,8 @@ pixel_x = 5 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "DO" = ( @@ -1783,7 +1943,8 @@ }, /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Fj" = ( @@ -1792,13 +1953,15 @@ desc = "It's a beachball with a face crudely drawn onto it with some soot." }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "FI" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "FS" = ( @@ -1810,7 +1973,8 @@ "FV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Gt" = ( @@ -1824,31 +1988,36 @@ "HK" = ( /obj/structure/destructible/cult/pylon, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "Ik" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "IN" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "IY" = ( /obj/structure/spider/cocoon, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "IZ" = ( /obj/item/clothing/head/collectable/wizard, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "Jp" = ( @@ -1859,26 +2028,30 @@ pixel_x = 32 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "JD" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "Kh" = ( /obj/machinery/light/small/built/directional/west, /turf/open/floor/wood{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/northblock) "KY" = ( /obj/structure/table, /obj/item/paper/crumpled/awaymissions/caves/unsafe_area, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Ls" = ( @@ -1886,7 +2059,8 @@ pixel_x = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Ly" = ( @@ -1900,7 +2074,8 @@ amount = 15 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Mk" = ( @@ -1910,19 +2085,22 @@ "Mq" = ( /obj/structure/flora/rock, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Mw" = ( /obj/item/shard, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "MB" = ( /obj/item/grown/log, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "MC" = ( @@ -1935,7 +2113,8 @@ "MM" = ( /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Np" = ( @@ -1944,7 +2123,8 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "NO" = ( @@ -1952,25 +2132,29 @@ /obj/structure/filingcabinet, /obj/item/paper/fluff/awaymissions/caves/omega, /turf/open/floor/iron{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "NX" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "OA" = ( /obj/item/gun/ballistic/automatic/pistol/deagle/gold, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "OE" = ( /obj/machinery/light/directional/west, /turf/open/floor/plating{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/research) "OJ" = ( @@ -1979,7 +2163,8 @@ name = "Cave Bat" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "OX" = ( @@ -2001,7 +2186,8 @@ "Rm" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "Rp" = ( @@ -2012,38 +2198,44 @@ }, /obj/machinery/light/small/built/directional/east, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Ry" = ( /obj/structure/grille, /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "RJ" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "SV" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "Tj" = ( /obj/item/assembly/igniter, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "TT" = ( /obj/item/ectoplasm, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "Uu" = ( @@ -2056,7 +2248,8 @@ /obj/effect/decal/remains/human, /obj/item/clothing/under/misc/patriotsuit, /turf/open/misc/asteroid/basalt/lava{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_four) "VK" = ( @@ -2064,7 +2257,8 @@ name = "spooky skeleton remains" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Wj" = ( @@ -2086,13 +2280,15 @@ pixel_x = -32 }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "Xs" = ( /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "XG" = ( @@ -2101,44 +2297,51 @@ name = "rusted mine" }, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "XN" = ( /obj/item/grenade/syndieminibomb/concussion, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "YG" = ( /obj/item/organ/brain/alien, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "YZ" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) "Zj" = ( /obj/effect/decal/remains/human, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid) "ZS" = ( /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt{ - initial_gas = "n2=23;o2=14;TEMP=2.7" + initial_gas = list("nitrogen" = 23, "oxygen" = 14); + temperature = 2.7; }, /area/awaymission/caves/bmp_asteroid/level_three) diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 1710b8109ce..c914c8d9d21 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -549,7 +549,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -563,7 +563,7 @@ /obj/structure/alien/weeds, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "bZ" = ( @@ -576,7 +576,7 @@ /obj/structure/alien/weeds, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -584,7 +584,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -597,7 +597,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -611,7 +611,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -626,7 +626,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -640,7 +640,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -652,7 +652,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -665,7 +665,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -678,7 +678,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -748,14 +748,14 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cp" = ( /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "cq" = ( @@ -765,7 +765,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -783,7 +783,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "cs" = ( @@ -795,7 +795,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -803,7 +803,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "cu" = ( @@ -811,7 +811,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -823,7 +823,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -880,7 +880,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -897,7 +897,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -909,7 +909,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -921,7 +921,7 @@ /obj/structure/alien/weeds, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "cH" = ( @@ -934,7 +934,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -946,7 +946,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -957,7 +957,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -975,7 +975,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -990,7 +990,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1045,7 +1045,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1054,7 +1054,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1071,7 +1071,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1088,7 +1088,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "cU" = ( @@ -1107,7 +1107,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1116,7 +1116,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1125,7 +1125,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1142,7 +1142,7 @@ /turf/open/floor/iron{ dir = 1; heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1161,14 +1161,14 @@ }, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "da" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "db" = ( @@ -1200,7 +1200,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1222,7 +1222,7 @@ /turf/open/floor/iron{ dir = 1; heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1236,14 +1236,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "di" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "dj" = ( @@ -1268,7 +1268,7 @@ /obj/structure/alien/weeds, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1279,7 +1279,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1289,7 +1289,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1298,7 +1298,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1312,7 +1312,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1325,7 +1325,7 @@ }, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "dr" = ( @@ -1337,7 +1337,7 @@ /obj/item/suppressor, /turf/open/floor/wood{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "ds" = ( @@ -1374,7 +1374,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "dw" = ( @@ -1387,7 +1387,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1395,7 +1395,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/syndicate) "dy" = ( @@ -1409,7 +1409,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1428,7 +1428,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1436,7 +1436,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1448,7 +1448,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1467,7 +1467,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1476,7 +1476,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -1484,7 +1484,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -1840,7 +1840,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/research) "fc" = ( @@ -2306,7 +2306,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "gf" = ( @@ -3608,7 +3608,7 @@ /obj/item/shard, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "iU" = ( @@ -3883,7 +3883,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -3891,14 +3891,14 @@ /obj/structure/grille, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "jC" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "jD" = ( @@ -4102,7 +4102,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4112,7 +4112,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4122,7 +4122,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4132,7 +4132,7 @@ /obj/structure/cable, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4142,7 +4142,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4151,7 +4151,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4161,7 +4161,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged3"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4326,14 +4326,14 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kC" = ( /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "kD" = ( @@ -4345,7 +4345,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged4"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4353,7 +4353,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4362,7 +4362,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged5"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4371,7 +4371,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4452,7 +4452,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "kQ" = ( @@ -4461,7 +4461,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4615,7 +4615,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4627,7 +4627,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4767,7 +4767,7 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4801,7 +4801,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4811,7 +4811,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -4940,7 +4940,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5081,7 +5081,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5223,7 +5223,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5237,7 +5237,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5308,7 +5308,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5363,7 +5363,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5373,7 +5373,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5404,7 +5404,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "no" = ( @@ -5429,7 +5429,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5460,7 +5460,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5468,7 +5468,7 @@ /obj/item/pickaxe/drill, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "nw" = ( @@ -5481,7 +5481,7 @@ }, /turf/open/floor/iron/cafeteria{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5503,7 +5503,7 @@ }, /turf/open/floor/iron/cafeteria{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5516,7 +5516,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5552,7 +5552,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5565,7 +5565,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; icon_state = "platingdmg3"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5578,7 +5578,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5591,7 +5591,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5656,7 +5656,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5667,7 +5667,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5711,7 +5711,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5746,7 +5746,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5758,7 +5758,7 @@ dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5768,7 +5768,7 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5781,7 +5781,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5789,7 +5789,7 @@ /obj/structure/chair/comfy/black, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "ob" = ( @@ -5803,7 +5803,7 @@ }, /turf/open/floor/iron{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -5815,7 +5815,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5827,7 +5827,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "oz" = ( @@ -5835,7 +5835,7 @@ /obj/structure/alien/egg/burst, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "oJ" = ( @@ -5845,7 +5845,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "oT" = ( @@ -5883,7 +5883,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "qw" = ( @@ -5894,7 +5894,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "qD" = ( @@ -5904,7 +5904,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "qK" = ( @@ -5912,7 +5912,7 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5926,7 +5926,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "rk" = ( @@ -5940,7 +5940,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -5950,14 +5950,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "rD" = ( /obj/item/trash/candy, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "sb" = ( @@ -5967,7 +5967,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "si" = ( @@ -5975,7 +5975,7 @@ /mob/living/simple_animal/hostile/alien/sentinel, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "sy" = ( @@ -5985,7 +5985,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "sM" = ( @@ -5995,7 +5995,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "tb" = ( @@ -6003,7 +6003,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "tK" = ( @@ -6016,7 +6016,7 @@ /obj/item/clothing/glasses/night, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "uf" = ( @@ -6030,14 +6030,14 @@ /obj/structure/alien/egg, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "uR" = ( /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "vm" = ( @@ -6045,7 +6045,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "vJ" = ( @@ -6055,7 +6055,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6070,7 +6070,7 @@ /obj/item/clothing/mask/facehugger/impregnated, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "vV" = ( @@ -6085,7 +6085,7 @@ "wq" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "wx" = ( @@ -6094,7 +6094,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "wT" = ( @@ -6104,14 +6104,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "xI" = ( /obj/item/storage/bag/ore, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "yz" = ( @@ -6120,7 +6120,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "zp" = ( @@ -6129,7 +6129,7 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "zF" = ( @@ -6151,7 +6151,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "BH" = ( @@ -6159,7 +6159,7 @@ /obj/structure/bed/nest, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "CY" = ( @@ -6167,7 +6167,7 @@ /obj/effect/decal/cleanable/blood/gibs, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "DF" = ( @@ -6184,7 +6184,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6222,7 +6222,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6240,7 +6240,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6253,7 +6253,7 @@ /obj/item/mining_scanner, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "Ku" = ( @@ -6261,7 +6261,7 @@ /mob/living/simple_animal/hostile/alien, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "KG" = ( @@ -6272,7 +6272,7 @@ /obj/item/gun/ballistic/automatic/pistol, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "Li" = ( @@ -6312,7 +6312,7 @@ /obj/item/clothing/head/helmet, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "OO" = ( @@ -6320,7 +6320,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "Pn" = ( @@ -6345,14 +6345,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "PS" = ( /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "Rm" = ( @@ -6366,14 +6366,14 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "Sg" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "SE" = ( @@ -6387,7 +6387,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6403,7 +6403,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "Uq" = ( @@ -6411,14 +6411,14 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "UY" = ( /obj/structure/alien/weeds/node, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "VE" = ( @@ -6429,7 +6429,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) @@ -6437,7 +6437,7 @@ /obj/structure/alien/weeds/node, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) "Wf" = ( @@ -6454,7 +6454,7 @@ /mob/living/simple_animal/hostile/alien, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "Yn" = ( @@ -6464,7 +6464,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6474,7 +6474,7 @@ /obj/effect/decal/cleanable/blood, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/hive) "Zf" = ( @@ -6484,7 +6484,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); temperature = 251 }, /area/awaymission/moonoutpost19/main) @@ -6511,14 +6511,14 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "Zz" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/arrivals) "ZZ" = ( @@ -6528,7 +6528,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) }, /area/awaymission/moonoutpost19/main) diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index aae9ed8d76d..2ef2a42ace9 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -29,7 +29,7 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8) temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -827,7 +827,7 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -4187,7 +4187,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11481,7 +11481,7 @@ /obj/structure/alien/resin/wall, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11489,7 +11489,7 @@ "zq" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11519,7 +11519,7 @@ /obj/structure/bed/nest, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11528,7 +11528,7 @@ /obj/effect/decal/cleanable/blood/gibs/up, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11563,7 +11563,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11595,7 +11595,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11615,7 +11615,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11626,7 +11626,7 @@ /obj/effect/decal/cleanable/blood/gibs/down, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11635,7 +11635,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11653,7 +11653,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11699,7 +11699,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11720,7 +11720,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -11784,7 +11784,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11795,7 +11795,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11813,7 +11813,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11822,7 +11822,7 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11859,7 +11859,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11889,7 +11889,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11929,7 +11929,7 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11938,7 +11938,7 @@ /obj/structure/closet/crate, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11955,7 +11955,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11965,7 +11965,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -11973,7 +11973,7 @@ "Lz" = ( /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 351.9 }, @@ -11988,7 +11988,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12011,7 +12011,7 @@ /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12020,7 +12020,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12029,7 +12029,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12038,7 +12038,7 @@ /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12083,7 +12083,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12092,7 +12092,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12124,7 +12124,7 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -12188,7 +12188,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12223,7 +12223,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12253,7 +12253,7 @@ /obj/machinery/light/small/directional/south, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12265,7 +12265,7 @@ }, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12281,7 +12281,7 @@ /obj/structure/alien/resin/membrane, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12298,7 +12298,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12308,7 +12308,7 @@ /obj/effect/decal/cleanable/blood/gibs/down, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12320,7 +12320,7 @@ }, /turf/open/floor/plating{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) @@ -12329,7 +12329,7 @@ /obj/structure/alien/weeds, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12350,7 +12350,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 351.9 }, @@ -12373,7 +12373,7 @@ /obj/structure/ore_box, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12404,7 +12404,7 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12415,7 +12415,7 @@ /obj/effect/mob_spawn/corpse/human, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12455,7 +12455,7 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, @@ -12465,7 +12465,7 @@ /obj/effect/decal/cleanable/blood/gibs/core, /turf/open/misc/asteroid{ heat_capacity = 1e+006; - initial_gas = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; + initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); name = "Cave Floor"; temperature = 363.9 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 3ecf61db7a2..df6521acd6b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -4149,7 +4149,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_gas = list(); luminosity = 2; temperature = 2.7 }, @@ -4405,7 +4405,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas = "o2=0.01;n2=0.01;TEMP=2.7"; + initial_gas = list(); luminosity = 2; temperature = 2.7 }, diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm index 2490b1eff02..60464a86396 100644 --- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm +++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm @@ -558,7 +558,8 @@ /area/medical/virology) "bE" = ( /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "bF" = ( @@ -1337,7 +1338,8 @@ dir = 9 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "dP" = ( @@ -2261,7 +2263,8 @@ "gv" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "gw" = ( @@ -4935,7 +4938,8 @@ /area/medical/virology) "nB" = ( /turf/open/misc/dirt/dark{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "nC" = ( @@ -5947,7 +5951,8 @@ dir = 8 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "qq" = ( @@ -5999,7 +6004,8 @@ dir = 6 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "qy" = ( @@ -7465,7 +7471,8 @@ dir = 5 }, /turf/open/misc/dirt/dark{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "ux" = ( @@ -9737,7 +9744,8 @@ dir = 4 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "Bv" = ( @@ -9775,7 +9783,8 @@ "BA" = ( /obj/structure/closet/crate/grave, /turf/open/misc/dirt/dark{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "BB" = ( @@ -13523,7 +13532,8 @@ dir = 10 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "LO" = ( @@ -14589,7 +14599,8 @@ "ON" = ( /obj/structure/closet/crate/grave, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "OO" = ( @@ -17427,7 +17438,8 @@ pixel_y = 32 }, /turf/open/misc/dirt{ - initial_gas = "ICEMOON_ATMOS" + initial_gas = list("oxygen" = 14, "nitrogen" = 30); + temperature = 180; }, /area/icemoon/underground/explored) "Wt" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index cf13b361025..d4ea290adb3 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -17725,7 +17725,7 @@ "ffP" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating/foam{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/space/nearstation) "ffR" = ( @@ -31006,7 +31006,7 @@ "kiE" = ( /obj/item/book/manual/nuclear, /turf/open/floor/plating/foam{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/space/nearstation) "kiM" = ( @@ -51626,7 +51626,7 @@ /area/security/checkpoint/supply) "rLv" = ( /turf/open/floor/plating/foam{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/space/nearstation) "rLz" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 4fde5a72eb5..073981f327d 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -281,7 +281,7 @@ "aU" = ( /obj/structure/flora/tree/dead, /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "aV" = ( @@ -1955,10 +1955,7 @@ icon_state = "ladder10"; invisibility = 100 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0 - }, +/turf/open/misc/ashplanet/wateryrock, /area/awaymission/errorroom) "fA" = ( /obj/machinery/vending/cola, @@ -2550,7 +2547,7 @@ /area/syndicate_mothership/control) "hs" = ( /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "ht" = ( @@ -2897,10 +2894,7 @@ /turf/open/floor/iron, /area/syndicate_mothership/control) "ik" = ( -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0 - }, +/turf/open/misc/ashplanet/wateryrock, /area/awaymission/errorroom) "il" = ( /turf/closed/indestructible/riveted, @@ -5394,9 +5388,7 @@ pixel_x = -4; pixel_y = 4 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "pi" = ( /obj/structure/table/reinforced, @@ -5703,9 +5695,7 @@ /turf/open/floor/iron/dark, /area/tdome/administration) "qe" = ( -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "qf" = ( /obj/structure/chair/comfy/black{ @@ -8548,10 +8538,7 @@ /area/centcom/supply) "zi" = ( /obj/item/rupee, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0 - }, +/turf/open/misc/ashplanet/wateryrock, /area/awaymission/errorroom) "zk" = ( /obj/machinery/door/airlock/medical/glass{ @@ -8951,9 +8938,7 @@ pixel_x = 4; pixel_y = -4 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "Ak" = ( /obj/effect/turf_decal/tile/bar, @@ -11393,9 +11378,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "Hj" = ( /obj/structure/closet/crate/bin, @@ -12290,7 +12273,7 @@ /obj/item/flashlight/lantern, /turf/open/misc/ironsand{ color = "#525252"; - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "JZ" = ( @@ -12567,9 +12550,7 @@ /obj/structure/flora/rock/pile/largejungle{ pixel_y = -3 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "KU" = ( /obj/structure/closet/emcloset, @@ -13512,7 +13493,7 @@ "NS" = ( /turf/open/misc/ironsand{ color = "#525252"; - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "NU" = ( @@ -13797,7 +13778,7 @@ "OC" = ( /obj/structure/flora/rock/pile, /turf/open/misc/asteroid/basalt/wasteland{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "OD" = ( @@ -14091,9 +14072,7 @@ pixel_x = -4; pixel_y = -4 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "Pq" = ( /turf/open/floor/iron/grimy, @@ -14852,9 +14831,7 @@ /turf/open/floor/iron/dark, /area/centcom/evacuation) "Rt" = ( -/turf/open/water{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/water, /area/centcom/holding) "Ru" = ( /obj/effect/turf_decal/stripes/line{ @@ -16091,9 +16068,7 @@ pixel_x = 4; pixel_y = 4 }, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15" - }, +/turf/open/misc/ashplanet/wateryrock, /area/centcom/holding) "UM" = ( /obj/effect/turf_decal/tile/brown{ @@ -16247,7 +16222,7 @@ /obj/structure/flora/rock/pile, /turf/open/misc/ironsand{ color = "#525252"; - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/centcom/holding) "Vg" = ( @@ -17947,10 +17922,7 @@ /area/syndicate_mothership/expansion_bombthreat) "ZE" = ( /obj/effect/landmark/error, -/turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0 - }, +/turf/open/misc/ashplanet/wateryrock, /area/awaymission/errorroom) "ZF" = ( /obj/structure/dresser, diff --git a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm index 79b829540f0..3df2c6d61ac 100644 --- a/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm +++ b/_maps/map_files/tramstation/modular_pieces/maintenance_miningsolar_3.dmm @@ -35,7 +35,7 @@ "z" = ( /obj/structure/mecha_wreckage/ripley, /turf/open/floor/iron/recharge_floor/asteroid{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/mine/explored) "B" = ( diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 8cc0f305110..83653916cb3 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -79,7 +79,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "ct" = ( @@ -98,7 +98,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "cX" = ( @@ -108,7 +108,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "ec" = ( @@ -170,7 +170,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "gw" = ( @@ -182,7 +182,7 @@ /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "gH" = ( @@ -207,7 +207,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "kv" = ( @@ -282,7 +282,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "mZ" = ( @@ -300,7 +300,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "od" = ( @@ -355,7 +355,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "qp" = ( @@ -366,7 +366,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "qM" = ( @@ -504,7 +504,7 @@ specialfunctions = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "zd" = ( @@ -596,7 +596,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "DQ" = ( @@ -625,7 +625,7 @@ }, /mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "EQ" = ( @@ -640,7 +640,7 @@ }, /mob/living/simple_animal/hostile/syndicate/ranged/smg/space, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "EW" = ( @@ -657,7 +657,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "Fv" = ( @@ -727,7 +727,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "Ko" = ( @@ -739,7 +739,7 @@ dir = 4 }, /turf/open/floor/iron{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "KC" = ( @@ -817,7 +817,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "Ov" = ( @@ -839,7 +839,7 @@ dir = 8 }, /turf/open/floor/iron/dark{ - initial_gas = "TEMP=2.7" + temperature = 2.7 }, /area/shuttle/caravan/freighter1) "OK" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 784830bfe9f..5672670ffda 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -34,7 +34,7 @@ }, /obj/machinery/computer/med_data/syndie, /turf/open/floor/iron/dark{ - initial_gas = "n2=100;TEMP=80"; + initial_gas = list("nitrogen" = 100); temperature = 80 }, /area/shuttle/sbc_starfury) @@ -158,7 +158,7 @@ dir = 4 }, /turf/open/floor/iron/dark{ - initial_gas = "n2=100;TEMP=80"; + initial_gas = list("nitrogen" = 100); temperature = 80 }, /area/shuttle/sbc_starfury) @@ -2054,7 +2054,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark{ - initial_gas = "n2=100;TEMP=80"; + initial_gas = list("nitrogen" = 100); temperature = 80 }, /area/shuttle/sbc_starfury) diff --git a/_maps/templates/heretic_sacrifice_template.dmm b/_maps/templates/heretic_sacrifice_template.dmm index c11ea116bc0..16a296233ef 100644 --- a/_maps/templates/heretic_sacrifice_template.dmm +++ b/_maps/templates/heretic_sacrifice_template.dmm @@ -9,7 +9,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -25,8 +25,8 @@ "dX" = ( /obj/effect/decal/cleanable/oil, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -43,7 +43,7 @@ "gJ" = ( /obj/effect/decal/remains/human, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -63,8 +63,8 @@ "lz" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -94,7 +94,7 @@ "nG" = ( /obj/structure/bonfire/prelit, /turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -106,8 +106,8 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -116,7 +116,7 @@ dir = 8 }, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -141,8 +141,8 @@ }, /obj/effect/decal/cleanable/oil, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -153,8 +153,8 @@ "qu" = ( /obj/effect/turf_decal/weather/dirt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -165,8 +165,8 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -178,8 +178,8 @@ "sb" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -188,8 +188,8 @@ dir = 9 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -211,7 +211,7 @@ dir = 1 }, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -220,8 +220,8 @@ dir = 4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -230,19 +230,19 @@ dir = 1 }, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) "wE" = ( /turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) "wS" = ( /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -262,8 +262,8 @@ /obj/structure/stone_tile/slab, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -294,8 +294,8 @@ /area/heretic_sacrifice/rust) "Bw" = ( /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -327,7 +327,7 @@ /obj/effect/decal/cleanable/plasma, /obj/effect/landmark/heretic/ash, /turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -336,7 +336,7 @@ dir = 4 }, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -351,8 +351,8 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -378,8 +378,8 @@ }, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -388,8 +388,8 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -402,8 +402,8 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -420,14 +420,14 @@ dir = 4 }, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) "Kz" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -440,8 +440,8 @@ "KP" = ( /obj/structure/stone_tile/surrounding_tile, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -459,7 +459,7 @@ /obj/effect/decal/cleanable/ash/large, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -476,8 +476,8 @@ "NA" = ( /obj/structure/stone_tile/burnt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -486,15 +486,15 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) "OD" = ( /obj/effect/landmark/heretic, /turf/open/misc/dirt/jungle/wasteland{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -503,8 +503,8 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -513,15 +513,15 @@ dir = 6 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = "o2=22;n2=82;TEMP=293.15"; - planetary_atmos = 0; + initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) "Qi" = ( /obj/structure/stone_tile, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -532,7 +532,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -559,7 +559,7 @@ "Sy" = ( /obj/structure/stone_tile/block, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -570,7 +570,7 @@ "TC" = ( /obj/effect/decal/cleanable/ash, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) @@ -600,7 +600,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/dirt/jungle/dark{ - planetary_atmos = 0; + simulated = 1; slowdown = 0 }, /area/heretic_sacrifice/ash) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index cf679748770..7d831e1d802 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -22,6 +22,23 @@ #define SOUTHDOWN (SOUTH|DOWN) #define WESTDOWN (WEST|DOWN) + +#define AIR_UPDATE_VALUES(air) \ + do{ \ + var/list/cache = air.gas; \ + air.total_moles = 0; \ + for(var/g in cache) { \ + if(cache[g] <= 0) { \ + cache -= g \ + } \ + else { \ + air.total_moles += cache[g]; \ + } \ + } \ + } while(FALSE) + + + //#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) ZASTURF #define TURF_HAS_VALID_ZONE(T) (T.simulated && T:zone && !T:zone:invalid) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index b074ca7cf08..3532338174e 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -150,7 +150,7 @@ #define INIT_ORDER_SKILLS 15 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 -#define INIT_ORDER_AIR -1 +//#define INIT_ORDER_AIR -1 #define INIT_ORDER_PERSISTENCE -2 #define INIT_ORDER_PERSISTENT_PAINTINGS -3 // Assets relies on this #define INIT_ORDER_ASSETS -4 @@ -162,8 +162,9 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_DECAY -61 //PARIAH ADDITION +#define INIT_ORDER_DECAY -61 #define INIT_ORDER_EXPLOSIONS -69 +#define INIT_ORDER_AIR -70 #define INIT_ORDER_STATPANELS -98 #define INIT_ORDER_INIT_PROFILER -99 //Near the end, logs the costs of initialize #define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index f3d98230e2b..b2b2b769182 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -56,7 +56,7 @@ SUBSYSTEM_DEF(airflow) else if (target.airflow_process_delay) target.airflow_process_delay = 0 target.airflow_speed = min(target.airflow_speed, 15) - target.airflow_speed -= SSzas.settings.airflow_speed_decay + target.airflow_speed -= zas_settings.airflow_speed_decay if (!target.airflow_skip_speedcheck) if (target.airflow_speed > 7) if (target.airflow_time++ >= target.airflow_speed - 7) @@ -103,7 +103,7 @@ SUBSYSTEM_DEF(airflow) if (ismob(target)) var/mob/M = target - M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, SSzas.settings.airflow_mob_slowdown) + M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, zas_settings.airflow_mob_slowdown) addtimer(CALLBACK(M, /mob/proc/remove_movespeed_modifier, /datum/movespeed_modifier/atmos_pressure, TRUE), 3 SECONDS, flags = TIMER_DELETE_ME) if (MC_TICK_CHECK) current.Cut(i) @@ -120,7 +120,7 @@ SUBSYSTEM_DEF(airflow) /atom/movable/proc/prepare_airflow(strength) - if (!airflow_dest || airflow_speed < 0 || last_airflow > world.time - SSzas.settings.airflow_delay) + if (!airflow_dest || airflow_speed < 0 || last_airflow > world.time - zas_settings.airflow_delay) return FALSE if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index a7d1973a472..178725b864f 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -60,6 +60,7 @@ Class Procs: Called when an edge is erased. Removes it from processing. */ +GLOBAL_REAL(zas_settings, /datum/zas_controller) = new SUBSYSTEM_DEF(zas) name = "Air Core" @@ -118,6 +119,8 @@ SUBSYSTEM_DEF(zas) while (state != SS_IDLE) stoplag() + zas_settings = new //Reset the global zas settings + while (zones.len) var/zone/zone = zones[zones.len] zones.len-- @@ -152,7 +155,7 @@ SUBSYSTEM_DEF(zas) /datum/controller/subsystem/zas/Initialize(timeofday, simulate = TRUE) var/starttime = REALTIMEOFDAY - settings = new + settings = zas_settings gas_data = xgm_gas_data to_chat(world, span_boldannounce("ZAS: Processing Geometry...")) @@ -544,11 +547,11 @@ SUBSYSTEM_DEF(zas) amount = CEILING(amount, 0.1) mix_real.gas[gastype] += amount - mix_real.updateValues() + AIR_UPDATE_VALUES(mix_real) while(mix_real.returnPressure() > target_pressure) mix_real.gas[gastype] -= mix_real.gas[gastype] * 0.1 - mix_real.updateValues() + AIR_UPDATE_VALUES(mix_real) mix_real.gas[gastype] = FLOOR(mix_real.gas[gastype], 0.1) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 7bb557f86f2..abe6c7f88cf 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -365,7 +365,7 @@ if(I == GAS_OXYGEN || I == GAS_NITROGEN) continue G_gases[I] = 0 - G.updateValues() + AIR_UPDATE_VALUES(G) for(var/obj/machinery/atmospherics/components/unary/U in O) if(!U.welded) U.welded = TRUE diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 990dd7d62ec..c7e4da45759 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -18,7 +18,6 @@ if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(env.temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * diff_temp), 0) env.temperature = (diff_temp > 0) ? min(temperature, altered_temp) : max(temperature, altered_temp) - env.updateValues() if (--src.life < 1) qdel(src) diff --git a/code/game/turfs/open/ashplanet.dm b/code/game/turfs/open/ashplanet.dm index a83fd860e3f..2087bd32200 100644 --- a/code/game/turfs/open/ashplanet.dm +++ b/code/game/turfs/open/ashplanet.dm @@ -8,7 +8,6 @@ desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/misc/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface initial_gas = LAVALAND_DEFAULT_ATMOS - planetary_atmos = TRUE footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm index b40b05ea29a..fb75dfc0774 100644 --- a/code/game/turfs/open/floor/glass.dm +++ b/code/game/turfs/open/floor/glass.dm @@ -46,7 +46,7 @@ icon_state = "reinf_glass-0" base_icon_state = "reinf_glass" floor_tile = /obj/item/stack/tile/rglass - initial_gas = "ICEMOON_ATMOS" + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/glass/reinforced/setup_broken_states() return list("reinf_glass-damaged1", "reinf_glass-damaged2", "reinf_glass-damaged3") diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index e958300cc35..8dab77c9d09 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -25,7 +25,7 @@ for(var/datum/pipeline/PN as anything in SSairmachines.networks) for(var/datum/gas_mixture/G in list(PN.air) & PN.other_airs) G.gas = list() - G.updateValues() + AIR_UPDATE_VALUES(G) to_chat(usr, "\[2/5\] - All pipenets purged of gas.") diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 011f0b6b64b..0e5412aa686 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -1,28 +1,27 @@ /* Contains helper procs for airflow, handled in /connection_group. */ -#define AIRBORNE_DAMAGE(airborne_thing) (min(airborne_thing.airflow_speed, (airborne_thing.airborne_acceleration*2)) * SSzas.settings.airflow_damage) +#define AIRBORNE_DAMAGE(airborne_thing) (min(airborne_thing.airflow_speed, (airborne_thing.airborne_acceleration*2)) * zas_settings.airflow_damage) /mob/var/tmp/last_airflow_stun = 0 /mob/proc/airflow_stun() return /mob/living/airflow_stun() if(stat == 2) - return 0 - if(last_airflow_stun > world.time - SSzas.settings.airflow_stun_cooldown) + return FALSE + if(last_airflow_stun > world.time - zas_settings.airflow_stun_cooldown) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") - return 0 - + return FALSE if(!(status_flags & CANSTUN) && !(status_flags & CANKNOCKDOWN)) to_chat(src, "<span class='notice'>Air suddenly rushes past you, but you manage to keep your footing!</span>") - return 0 + return FALSE if(buckled) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") - return 0 + return FALSE if(!body_position == LYING_DOWN) to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") - Knockdown(SSzas.settings.airflow_stun SECONDS) + Knockdown(zas_settings.airflow_stun SECONDS) last_airflow_stun = world.time /mob/living/silicon/airflow_stun() @@ -38,35 +37,37 @@ Contains helper procs for airflow, handled in /connection_group. if(anchored && !ismob(src)) return 0 - if(!isobj(src) && n < SSzas.settings.airflow_dense_pressure) return 0 + if(!isobj(src) && n < zas_settings.airflow_dense_pressure) return 0 return 1 /mob/check_airflow_movable(n) - if(n < SSzas.settings.airflow_heavy_pressure) - return 0 - return 1 + if(n < zas_settings.airflow_heavy_pressure) + return FALSE + if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) //Magboots + return FALSE + return TRUE /mob/living/silicon/check_airflow_movable() return 0 /obj/check_airflow_movable(n) - if(n < SSzas.settings.airflow_dense_pressure) return 0 + if(n < zas_settings.airflow_dense_pressure) return 0 return ..() /obj/item/check_airflow_movable(n) switch(w_class) if(1,2) - if(n < SSzas.settings.airflow_lightest_pressure) return 0 + if(n < zas_settings.airflow_lightest_pressure) return 0 if(3) - if(n < SSzas.settings.airflow_light_pressure) return 0 + if(n < zas_settings.airflow_light_pressure) return 0 if(4,5) - if(n < SSzas.settings.airflow_medium_pressure) return 0 + if(n < zas_settings.airflow_medium_pressure) return 0 if(6) - if(n < SSzas.settings.airflow_heavy_pressure) return 0 + if(n < zas_settings.airflow_heavy_pressure) return 0 if(7 to INFINITY) - if(n < SSzas.settings.airflow_dense_pressure) return 0 + if(n < zas_settings.airflow_dense_pressure) return 0 return ..() @@ -120,10 +121,10 @@ Contains helper procs for airflow, handled in /connection_group. apply_damage(b_loss, BRUTE) if(istype(A, /obj/structure) || iswallturf(A)) if(airflow_speed > 10) - Paralyze(round(airflow_speed * SSzas.settings.airflow_stun)) - Stun(round(airflow_speed * SSzas.settings.airflow_stun) + 3) + Paralyze(round(airflow_speed * zas_settings.airflow_stun)) + Stun(round(airflow_speed * zas_settings.airflow_stun) + 3) else - Stun(round(airflow_speed * SSzas.settings.airflow_stun/2)) + Stun(round(airflow_speed * zas_settings.airflow_stun/2)) return ..() @@ -160,7 +161,7 @@ Contains helper procs for airflow, handled in /connection_group. if(!uses_integrity) return - take_damage(SSzas.settings.airflow_damage, BRUTE) + take_damage(zas_settings.airflow_damage, BRUTE) /mob/living/carbon/human/airflow_hit_act(atom/movable/flying) . = ..() @@ -175,10 +176,10 @@ Contains helper procs for airflow, handled in /connection_group. if(airflow_speed > 10) - Paralyze(round(flying.airflow_speed * SSzas.settings.airflow_stun)) - Stun(round(flying.airflow_speed * SSzas.settings.airflow_stun) + 3) + Paralyze(round(flying.airflow_speed * zas_settings.airflow_stun)) + Stun(round(flying.airflow_speed * zas_settings.airflow_stun) + 3) else - Stun(round(flying.airflow_speed * SSzas.settings.airflow_stun/2)) + Stun(round(flying.airflow_speed * zas_settings.airflow_stun/2)) /zone/proc/movables() RETURN_TYPE(/list) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 125c37c4692..ba6a7269008 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -49,7 +49,7 @@ Class Procs: flow(list/movable, differential, repelled) Airflow proc causing all objects in movable to be checked against a pressure differential. If repelled is true, the objects move away from any turf in connecting_turfs, otherwise they approach. - A check against SSzas.settings.lightest_airflow_pressure should generally be performed before calling this. + A check against zas_settings.lightest_airflow_pressure should generally be performed before calling this. get_connected_zone(zone/from) Helper proc that allows getting the other zone of an edge given one of them. @@ -99,11 +99,11 @@ Class Procs: var/atom/movable/M = movable[i] //If they're already being tossed, don't do it again. - if(M.last_airflow > world.time - SSzas.settings.airflow_delay) continue + if(M.last_airflow > world.time - zas_settings.airflow_delay) continue if(M.airflow_speed) continue //Check for knocking people over - if(ismob(M) && differential > SSzas.settings.airflow_stun_pressure) + if(ismob(M) && differential > zas_settings.airflow_stun_pressure) if(M:status_flags & GODMODE) continue M:airflow_stun() @@ -159,7 +159,7 @@ Class Procs: var/equiv = A.air.shareRatio(B.air, coefficient) var/differential = A.air.returnPressure() - B.air.returnPressure() - if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) + if(abs(differential) >= zas_settings.airflow_lightest_pressure) var/list/attracted var/list/repelled if(differential > 0) @@ -172,7 +172,7 @@ Class Procs: if(REALTIMEOFDAY > last_woosh + 2 SECONDS) playsound( pick(connecting_turfs), - abs(differential) > SSzas.settings.airflow_heavy_pressure ? 'modular_pariah/master_files/sound/effects/space_wind_big.ogg' : 'modular_pariah/master_files/sound/effects/space_wind.ogg', + abs(differential) > zas_settings.airflow_heavy_pressure ? 'modular_pariah/master_files/sound/effects/space_wind_big.ogg' : 'modular_pariah/master_files/sound/effects/space_wind.ogg', 100, TRUE, null, @@ -242,7 +242,7 @@ Class Procs: var/equiv = A.air.shareSpace(air) var/differential = A.air.returnPressure() - air.returnPressure() - if(abs(differential) >= SSzas.settings.airflow_lightest_pressure) + if(abs(differential) >= zas_settings.airflow_lightest_pressure) var/list/attracted = A.movables() flow(attracted, abs(differential), differential < 0) diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 2a08a3cf268..aeb088d7ad9 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -82,5 +82,5 @@ /client/proc/ZASSettings() set category = "Debug" - SSzas.settings.SetDefault(mob) + zas_settings.SetDefault(mob) */ diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 53cacb34388..6a1dc3e08a2 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -41,7 +41,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return igniting /zone/proc/process_fire() - var/datum/gas_mixture/burn_gas = air.removeRatio(SSzas.settings.fire_consumption_rate, fire_tiles.len) + var/datum/gas_mixture/burn_gas = air.removeRatio(zas_settings.fire_consumption_rate, fire_tiles.len) var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) @@ -195,7 +195,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //Spread the fire. //Atmos Canpass probably needs to be checked here - if(prob(50 + 50 * (firelevel/SSzas.settings.fire_firelevel_multiplier))) + if(prob(50 + 50 * (firelevel/zas_settings.fire_firelevel_multiplier))) enemy_tile.create_fire(firelevel) else @@ -222,7 +222,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin SSzas.active_hotspots.Add(src) /obj/effect/hotspot/proc/fire_color(env_temperature) - var/temperature = max(4000*sqrt(firelevel/SSzas.settings.fire_firelevel_multiplier), env_temperature) + var/temperature = max(4000*sqrt(firelevel/zas_settings.fire_firelevel_multiplier), env_temperature) return heat2color(temperature) /obj/effect/hotspot/Destroy() @@ -288,12 +288,12 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) - var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / SSzas.settings.fire_firelevel_multiplier + var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / zas_settings.fire_firelevel_multiplier var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast var/gas_reaction_progress = min(max(min_burn, gas_firelevel*gas_fuel)*FIRE_GAS_BURNRATE_MULT, gas_fuel) //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area. - var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / SSzas.settings.fire_firelevel_multiplier + var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / zas_settings.fire_firelevel_multiplier var/liquid_reaction_progress = min((liquid_firelevel*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT, liquid_fuel) var/firelevel = (gas_fuel*gas_firelevel + liquid_fuel*liquid_firelevel)/total_fuel @@ -334,8 +334,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) //calculate the energy produced by the reaction and then set the new temperature of the mix - temperature = (starting_energy + SSzas.settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / getHeatCapacity() - updateValues() + temperature = (starting_energy + zas_settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / getHeatCapacity() + AIR_UPDATE_VALUES(src) #ifdef FIREDBG log_admin("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") @@ -369,7 +369,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/oil/liquid) . = 0 for(var/g in gas) - if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * SSzas.settings.fire_consumption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * zas_settings.fire_consumption_rate) >= 0.1) . = 1 break @@ -381,11 +381,11 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin . = 0 for(var/g in gas) - if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * SSzas.settings.fire_consumption_rate) >= 0.1) + if(xgm_gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * zas_settings.fire_consumption_rate) >= 0.1) . = 1 break -//returns a value between 0 and SSzas.settings.fire_firelevel_multiplier +//returns a value between 0 and zas_settings.fire_firelevel_multiplier /datum/gas_mixture/proc/calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, gas_volume) //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. var/firelevel = 0 @@ -410,13 +410,13 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin #endif //toss everything together -- should produce a value between 0 and fire_firelevel_multiplier - firelevel = SSzas.settings.fire_firelevel_multiplier * mix_multiplier * damping_multiplier + firelevel = zas_settings.fire_firelevel_multiplier * mix_multiplier * damping_multiplier return max( 0, firelevel) /mob/living/proc/FireBurn(firelevel, last_temperature, pressure) - var/mx = 5 * firelevel/SSzas.settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + var/mx = 5 * firelevel/zas_settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) apply_damage(2.5*mx, BURN) return mx @@ -446,7 +446,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(C.body_parts_covered & ARMS) arms_exposure = 0 //minimize this for low-pressure environments - var/mx = 5 * firelevel/SSzas.settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) + var/mx = 5 * firelevel/zas_settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index c494c753e0d..faa22877f91 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -81,7 +81,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi //Handles all the bad things phoron can do. //Contamination - if(SSzas.settings.plc.cloth_contamination) + if(zas_settings.plc.cloth_contamination) contaminate() //Anything else requires them to not be dead. @@ -89,7 +89,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi return //Burn skin if exposed. - if(SSzas.settings.plc.skin_burns) + if(zas_settings.plc.skin_burns) if(!pl_head_protected() || !pl_suit_protected()) //burn_skin(0.75) if(prob(20)) @@ -97,13 +97,13 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi updatehealth() //Burn eyes if exposed. - if(SSzas.settings.plc.eye_burns) + if(zas_settings.plc.eye_burns) if(!is_eyes_covered()) burn_eyes() //Genetic Corruption - if(SSzas.settings.plc.genetic_corruption) - if(rand(1,10000) < SSzas.settings.plc.genetic_corruption) + if(zas_settings.plc.genetic_corruption) + if(rand(1,10000) < zas_settings.plc.genetic_corruption) easy_random_mutate(NEGATIVE) to_chat(src, "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>") domutcheck(src, null) @@ -125,7 +125,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi /mob/living/carbon/human/proc/pl_head_protected() //Checks if the head is adequately sealed. if(head) - if(SSzas.settings.plc.plasmaguard_only) + if(zas_settings.plc.plasmaguard_only) if(head.obj_flags & PLASMAGUARD) return TRUE else if(is_eyes_covered()) @@ -140,15 +140,15 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi continue if(istype(protection, /obj/item/clothing)) var/obj/item/clothing/clothing_item = protection - if(SSzas.settings.plc.plasmaguard_only && !((clothing_item.clothing_flags & THICKMATERIAL) || (clothing_item.clothing_flags & GAS_FILTERING) || (clothing_item.obj_flags & PLASMAGUARD))) + if(zas_settings.plc.plasmaguard_only && !((clothing_item.clothing_flags & THICKMATERIAL) || (clothing_item.clothing_flags & GAS_FILTERING) || (clothing_item.obj_flags & PLASMAGUARD))) return FALSE - else if(SSzas.settings.plc.plasmaguard_only && !(protection.obj_flags & PLASMAGUARD)) + else if(zas_settings.plc.plasmaguard_only && !(protection.obj_flags & PLASMAGUARD)) return FALSE coverage |= protection.body_parts_covered - if(SSzas.settings.plc.plasmaguard_only) + if(zas_settings.plc.plasmaguard_only) return TRUE return (~(coverage) & (CHEST|LEGS|FEET|ARMS|HANDS) == 0) @@ -166,7 +166,7 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi /turf/Entered(obj/item/I) . = ..() //Items that are in plasma, but not on a mob, can still be contaminated. - if(istype(I) && SSzas && SSzas.settings?.plc.cloth_contamination && I.can_contaminate()) + if(istype(I) && SSzas && zas_settings?.plc.cloth_contamination && I.can_contaminate()) var/datum/gas_mixture/env = return_air() if(!env) return diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 162fc4e9389..f2443e22dae 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -344,12 +344,15 @@ /turf/return_air() RETURN_TYPE(/datum/gas_mixture) if(!simulated) + if(air) + return air var/datum/gas_mixture/GM = new if(initial_gas) GM.gas = initial_gas.Copy() GM.temperature = temperature - GM.updateValues() + AIR_UPDATE_VALUES(GM) + air = GM if(zone) if(!zone.invalid) @@ -370,7 +373,7 @@ air.temperature = temperature if(initial_gas) air.gas = initial_gas.Copy() - air.updateValues() + AIR_UPDATE_VALUES(air) /turf/proc/c_copy_air() if(!air) air = new/datum/gas_mixture diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 6b46f1c169e..23f9a084f58 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -122,8 +122,8 @@ /datum/xgm_gas/hydrogen/deuterium id = GAS_DEUTERIUM name = "Deuterium" - symbol_html = "D" - symbol = "D" + symbol_html = "<sup>2</sup>H" + symbol = "2H" /datum/xgm_gas/hydrogen/tritium id = GAS_TRITIUM diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 13237f5fd7a..d77064fa71f 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -41,7 +41,7 @@ gas[gasid] += moles if(update) - updateValues() + AIR_UPDATE_VALUES(src) /datum/gas_mixture/proc/setGasMoles(gasid, moles, update = TRUE, divide_among_group = FALSE) if(moles == 0) @@ -54,7 +54,7 @@ gas[gasid] = moles if(update) - updateValues() + AIR_UPDATE_VALUES(src) //Same as adjustGas(), but takes a temperature which is mixed in with the gas. /datum/gas_mixture/proc/adjustGasWithTemp(gasid, moles, temp, update = 1) @@ -74,7 +74,7 @@ gas[gasid] += moles if(update) - updateValues() + AIR_UPDATE_VALUES(src) //Variadic version of adjustGas(). Takes any number of gas and mole pairs and applies them. @@ -84,7 +84,7 @@ for(var/i in 1 to args.len-1 step 2) adjustGas(args[i], args[i+1], update = 0) - updateValues() + AIR_UPDATE_VALUES(src) //Variadic version of adjustGasWithTemp(). Takes any number of gas, mole and temperature associations and applies them. @@ -94,7 +94,7 @@ for(var/i in 1 to args.len-1 step 3) adjustGasWithTemp(args[i], args[i + 1], args[i + 2], update = 0) - updateValues() + AIR_UPDATE_VALUES(src) //Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly. @@ -117,7 +117,7 @@ for(var/g in giver.gas) gas[g] += giver.gas[g] - updateValues() + AIR_UPDATE_VALUES(src) // Used to equalize the mixture between two zones before sleeping an edge. /datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) @@ -139,8 +139,8 @@ temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) sharer.temperature = temperature - updateValues() - sharer.updateValues() + AIR_UPDATE_VALUES(src) + AIR_UPDATE_VALUES(sharer) return 1 @@ -209,19 +209,15 @@ var/safe_temp = max(temperature, TCMB) // We're about to divide by this. return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) - //alternative, simpler equation - //var/partial_pressure = gas[gasid] * R_IDEAL_GAS_EQUATION * temperature / volume - //return R_IDEAL_GAS_EQUATION * ( log (1 + IDEAL_GAS_ENTROPY_CONSTANT/partial_pressure) + 20 ) - - -//Updates the total_moles count and trims any empty gases. +///Updates the total_moles count and trims any empty gases. DO NOT USE. USE AIR_UPDATE_VALUES(air)!!! /datum/gas_mixture/proc/updateValues() + var/list/cached_gas = gas total_moles = 0 - for(var/g in gas) - if(gas[g] <= 0) - gas -= g + for(var/g in cached_gas) + if(cached_gas[g] <= 0) + cached_gas -= g else - total_moles += gas[g] + total_moles += cached_gas[g] //Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since updateValues() has been called. @@ -248,8 +244,8 @@ gas[g] = 0 removed.temperature = temperature - updateValues() - removed.updateValues() + AIR_UPDATE_VALUES(src) + AIR_UPDATE_VALUES(removed) return removed @@ -271,8 +267,8 @@ removed.temperature = temperature removed.volume = volume * group_multiplier / out_group_multiplier - updateValues() - removed.updateValues() + AIR_UPDATE_VALUES(src) + AIR_UPDATE_VALUES(removed) return removed @@ -300,8 +296,8 @@ gas[g] -= removed.gas[g] / group_multiplier removed.temperature = temperature - updateValues() - removed.updateValues() + AIR_UPDATE_VALUES(src) + AIR_UPDATE_VALUES(removed) return removed @@ -323,7 +319,7 @@ temperature = sample.temperature for(var/id in sample_gas) cached_gas[id] = sample_gas[id] * partial - updateValues() + AIR_UPDATE_VALUES(src) return 1 @@ -402,7 +398,7 @@ for(var/g in right_side.gas) gas[g] += right_side.gas[g] - updateValues() + AIR_UPDATE_VALUES(src) return 1 @@ -411,7 +407,7 @@ for(var/g in right_side.gas) gas[g] -= right_side.gas[g] - updateValues() + AIR_UPDATE_VALUES(src) return 1 @@ -420,7 +416,7 @@ for(var/g in gas) gas[g] *= factor - updateValues() + AIR_UPDATE_VALUES(src) return 1 @@ -429,7 +425,7 @@ for(var/g in gas) gas[g] /= factor - updateValues() + AIR_UPDATE_VALUES(src) return 1 @@ -474,8 +470,8 @@ if(!one_way) other.temperature = max(0, (other.temperature - temp_avg) * (1-ratio) + temp_avg) - updateValues() - other.updateValues() + AIR_UPDATE_VALUES(src) + AIR_UPDATE_VALUES(other) return compare(other) @@ -516,14 +512,14 @@ return gas /datum/gas_mixture/proc/returnVisuals() - updateValues() + AIR_UPDATE_VALUES(src) checkTileGraphic() return graphic /datum/gas_mixture/proc/copy() RETURN_TYPE(/datum/gas_mixture) var/datum/gas_mixture/new_gas = new - updateValues() + AIR_UPDATE_VALUES(src) new_gas.gas = src.gas new_gas.temperature = src.temperature new_gas.total_moles = src.total_moles diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 6b3a544fdea..d3e84ca15ee 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -157,7 +157,7 @@ Class Procs: if(air.temperature >= PHORON_FLASHPOINT && !(src in SSzas.active_fire_zones) && air.check_combustability() && contents.len) var/turf/T = pick(contents) if(istype(T)) - T.create_fire(SSzas.settings.fire_firelevel_multiplier) + T.create_fire(zas_settings.fire_firelevel_multiplier) // Update gas overlays. if(air.checkTileGraphic(graphic_add, graphic_remove)) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index d4106022c69..59c79cc6501 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -167,8 +167,8 @@ power_draw += specific_power_gas[g]*transfer_moles //Remix the resulting gases - sink.updateValues() - source.updateValues() + AIR_UPDATE_VALUES(sink) + AIR_UPDATE_VALUES(source) return power_draw @@ -231,8 +231,8 @@ else unfiltered_power_used += power_used - sink_filtered.updateValues() - removed.updateValues() + AIR_UPDATE_VALUES(sink_filtered) + AIR_UPDATE_VALUES(removed) sink_clean.merge(removed) @@ -308,7 +308,7 @@ else unfiltered_power_used += power_used - removed.updateValues() + AIR_UPDATE_VALUES(removed) var/power_draw = unfiltered_power_used for (var/datum/gas_mixture/sink_filtered in filtered_power_used) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 3119924232c..8852d634b82 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -132,7 +132,7 @@ check_breath(breath) if(breath.total_moles) - breath.updateValues() + AIR_UPDATE_VALUES(breath) loc.assume_air(breath) /mob/living/carbon/proc/has_smoke_protection() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2390d9e5664..308c1b70549 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -7,6 +7,7 @@ gender = PLURAL //placeholder living_flags = MOVES_ON_ITS_OWN status_flags = CANPUSH + simulated = FALSE var/icon_living = "" ///Icon when the animal is dead. Don't use animated icons for this. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index c0809b2f8c0..8ccf4824e59 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -261,7 +261,7 @@ //-- TRACES --// - breath.updateValues() + AIR_UPDATE_VALUES(breath) if(breath.total_moles) // If there's some other shit in the air lets deal with it here. // N2O @@ -439,7 +439,6 @@ // Activate mood on first flag, remove on second, do nothing on third. handle_breath_temperature(breath, breather) - breath.updateValues() return TRUE From b5229d57282790c6640db661581a938de5b103a3 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 21:29:17 -0400 Subject: [PATCH 090/200] lets see if this works i guess --- code/controllers/subsystem/minor_mapping.dm | 2 +- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/atmos_moles_tests.dm | 267 +++++++++++++++++++ 3 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 code/modules/unit_tests/atmos_moles_tests.dm diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 022ab58fa61..153eff015ee 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(minor_mapping) mouse.forceMove(proposed_turf) else mouse = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) - if(proposed_turf.air.hasGas(GAS_OXYGEN, 5)) + if(proposed_turf.return_air().hasGas(GAS_OXYGEN, 5)) num_mice -= 1 mouse = null diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 793e54e4364..b51d8975c70 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -46,6 +46,7 @@ #include "achievements.dm" #include "anchored_mobs.dm" #include "anonymous_themes.dm" +#include "atmos_moles_tests.dm" #include "autowiki.dm" #include "bespoke_id.dm" #include "binary_insert.dm" diff --git a/code/modules/unit_tests/atmos_moles_tests.dm b/code/modules/unit_tests/atmos_moles_tests.dm new file mode 100644 index 00000000000..28e68258a8b --- /dev/null +++ b/code/modules/unit_tests/atmos_moles_tests.dm @@ -0,0 +1,267 @@ +#define ALL_GASIDS xgm_gas_data.gases + +/datum/unit_test/atmos_machinery + //template = /datum/unit_test/atmos_machinery + var/list/test_cases = list() + +/datum/unit_test/atmos_machinery/proc/create_gas_mixes(gas_mix_data) + var/list/gas_mixes = list() + for(var/mix_name in gas_mix_data) + var/list/mix_data = gas_mix_data[mix_name] + + var/datum/gas_mixture/gas_mix = new (CELL_VOLUME, mix_data["temperature"]) + + var/list/initial_gas = mix_data["initial_gas"] + if(initial_gas.len) + var/list/gas_args = list() + for(var/gasid in initial_gas) + gas_args += gasid + gas_args += initial_gas[gasid] + gas_mix.adjustMultipleGases(arglist(gas_args)) + + gas_mixes[mix_name] = gas_mix + return gas_mixes + +/datum/unit_test/atmos_machinery/proc/gas_amount_changes(var/list/before_gas_mixes, var/list/after_gas_mixes) + var/list/result = list() + for(var/mix_name in before_gas_mixes & after_gas_mixes) + var/change = list() + + var/datum/gas_mixture/before = before_gas_mixes[mix_name] + var/datum/gas_mixture/after = after_gas_mixes[mix_name] + + var/list/all_gases = before.gas | after.gas + for(var/gasid in all_gases) + change[gasid] = after.getGroupGas(gasid) - before.getGroupGas(gasid) + + result[mix_name] = change + + return result + +/datum/unit_test/atmos_machinery/proc/check_moles_conserved(var/case_name, var/list/before_gas_mixes, var/list/after_gas_mixes) + var/failed = FALSE + for(var/gasid in xgm_gas_data.gases) + var/before = 0 + for(var/gasmix in before_gas_mixes) + var/datum/gas_mixture/G = before_gas_mixes[gasmix] + before += G.getGroupGas(gasid) + + var/after = 0 + for(var/gasmix in after_gas_mixes) + var/datum/gas_mixture/G = after_gas_mixes[gasmix] + after += G.getGroupGas(gasid) + + if(abs(before - after) > ATMOS_PRECISION) + Fail("expected [before] moles of [gasid], found [after] moles.") + failed |= TRUE + + if(!failed) + pass("conserved moles of each gas ID.") + +/datum/unit_test/atmos_machinery/conserve_moles + //template = /datum/unit_test/atmos_machinery/conserve_moles + test_cases = list( + uphill = list( + source = list( + initial_gas = list( + GAS_OXYGEN = 5, + GAS_NITROGEN = 10, + GAS_CO2 = 5, + GAS_PHORON = 10, + GAS_N2O = 5, + ), + temperature = T20C - 5, + ), + sink = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C + 5, + ) + ), + downhill = list( + source = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C + 5, + ), + sink = list( + initial_gas = list( + GAS_OXYGEN = 5, + GAS_NITROGEN = 10, + GAS_CO2 = 5, + GAS_PHORON = 10, + GAS_N2O = 5, + ), + temperature = T20C - 5, + ), + ), + flat = list( + source = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C, + ), + sink = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C, + ), + ), + vacuum_sink = list( + source = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C, + ), + sink = list( + initial_gas = list(), + temperature = 0, + ), + ), + vacuum_source = list( + source = list( + initial_gas = list(), + temperature = 0, + ), + sink = list( + initial_gas = list( + GAS_OXYGEN = 10, + GAS_NITROGEN = 20, + GAS_CO2 = 10, + GAS_PHORON = 20, + GAS_N2O = 10, + ), + temperature = T20C, + ), + ), + ) + + +/datum/unit_test/atmos_machinery/conserve_moles/pump_gas + //name = "ATMOS MACHINERY: pump_gas() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/pump_gas/Run() + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + pump_gas(after_gas_mixes["source"], after_gas_mixes["sink"], null, INFINITY) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 + +/datum/unit_test/atmos_machinery/conserve_moles/pump_gas_passive + //name = "ATMOS MACHINERY: pump_gas_passive() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/pump_gas_passive/Run() + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + pump_gas_passive(after_gas_mixes["source"], after_gas_mixes["sink"], null) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 + +/datum/unit_test/atmos_machinery/conserve_moles/scrub_gas + //name = "ATMOS MACHINERY: scrub_gas() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/scrub_gas/Run() + var/list/filtering = xgm_gas_data.gases + + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + scrub_gas(filtering, after_gas_mixes["source"], after_gas_mixes["sink"], null, INFINITY) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 + +/datum/unit_test/atmos_machinery/conserve_moles/filter_gas +// name = "ATMOS MACHINERY: filter_gas() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/filter_gas/Run() + var/list/filtering = xgm_gas_data.gases + + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + filter_gas(filtering, after_gas_mixes["source"], after_gas_mixes["sink"], after_gas_mixes["source"], null, INFINITY) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 + +/datum/unit_test/atmos_machinery/conserve_moles/filter_gas_multi + //name = "ATMOS MACHINERY: filter_gas_multi() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/filter_gas_multi/Run() + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + var/list/filtering = list() + for(var/gasid in xgm_gas_data.gases) + filtering[gasid] = after_gas_mixes["sink"] //just filter everything to sink + + filter_gas_multi(filtering, after_gas_mixes["source"], after_gas_mixes["sink"], null, INFINITY) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 + +/datum/unit_test/atmos_machinery/conserve_moles/mix_gas + //name = "ATMOS MACHINERY: mix_gas() Conserves Moles" + +/datum/unit_test/atmos_machinery/conserve_moles/mix_gas/Run() + for(var/case_name in test_cases) + var/gas_mix_data = test_cases[case_name] + var/list/before_gas_mixes = create_gas_mixes(gas_mix_data) + var/list/after_gas_mixes = create_gas_mixes(gas_mix_data) + + var/list/mix_sources = list() + for(var/gasid in ALL_GASIDS) + var/datum/gas_mixture/mix_source = after_gas_mixes["sink"] + mix_sources[mix_source] = 1.0/xgm_gas_data.gases.len //doesn't work as a macro for some reason + + mix_gas(null, mix_sources, after_gas_mixes["sink"], null, INFINITY) + + check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) + + return 1 +#undef ALL_GASIDS From f2d7edee6539a8af300eab502c0c2971920b99c6 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 22:05:51 -0400 Subject: [PATCH 091/200] Unit Test BS --- code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 4 ++-- code/modules/atmospherics/ZAS/atmos_primitives.dm | 12 +----------- code/modules/unit_tests/atmos_moles_tests.dm | 7 ++++++- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index d77064fa71f..f2b940afcbb 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -240,8 +240,8 @@ for(var/g in gas) removed.gas[g] = QUANTIZE((gas[g] / total_moles) * amount) gas[g] -= removed.gas[g] / group_multiplier - if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation - gas[g] = 0 + /*if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation + gas[g] = 0*/ removed.temperature = temperature AIR_UPDATE_VALUES(src) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 59c79cc6501..db72e47c9f7 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -241,7 +241,7 @@ //For omni devices. Instead filtering is an associative list mapping gasids to gas mixtures. //I don't like the copypasta, but I decided to keep both versions of gas filtering as filter_gas is slightly faster (doesn't create as many temporary lists, doesn't call updateValues() as much) //filter_gas can be removed and replaced with this proc if need be. -/proc/filter_gas_multi(obj/machinery/M, list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink_clean, total_transfer_moles = null, available_power = null) +/proc/filter_gas_multi(list/filtering, datum/gas_mixture/source, datum/gas_mixture/sink_clean, total_transfer_moles = null, available_power = null) if (source.total_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 @@ -279,16 +279,6 @@ if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 - /* - //Update Flow Rate var - if (istype(M, /obj/machinery/atmospherics)) - var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - if (istype(M, /obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - */ - var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case return -1 diff --git a/code/modules/unit_tests/atmos_moles_tests.dm b/code/modules/unit_tests/atmos_moles_tests.dm index 28e68258a8b..5a3c108f915 100644 --- a/code/modules/unit_tests/atmos_moles_tests.dm +++ b/code/modules/unit_tests/atmos_moles_tests.dm @@ -4,6 +4,9 @@ //template = /datum/unit_test/atmos_machinery var/list/test_cases = list() +/datum/unit_test/atmos_machinery/Run() + return + /datum/unit_test/atmos_machinery/proc/create_gas_mixes(gas_mix_data) var/list/gas_mixes = list() for(var/mix_name in gas_mix_data) @@ -161,6 +164,8 @@ ), ) +/datum/unit_test/atmos_machinery/conserve_moles/Run() + return /datum/unit_test/atmos_machinery/conserve_moles/pump_gas //name = "ATMOS MACHINERY: pump_gas() Conserves Moles" @@ -259,7 +264,7 @@ var/datum/gas_mixture/mix_source = after_gas_mixes["sink"] mix_sources[mix_source] = 1.0/xgm_gas_data.gases.len //doesn't work as a macro for some reason - mix_gas(null, mix_sources, after_gas_mixes["sink"], null, INFINITY) + mix_gas(mix_sources, after_gas_mixes["sink"], null, INFINITY) check_moles_conserved(case_name, before_gas_mixes, after_gas_mixes) From 5330368aaa4946fd04069ebf97642dea6de5fef8 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 22:24:31 -0400 Subject: [PATCH 092/200] linter appeasement --- code/modules/unit_tests/atmos_moles_tests.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/unit_tests/atmos_moles_tests.dm b/code/modules/unit_tests/atmos_moles_tests.dm index 5a3c108f915..927c3a68655 100644 --- a/code/modules/unit_tests/atmos_moles_tests.dm +++ b/code/modules/unit_tests/atmos_moles_tests.dm @@ -25,7 +25,7 @@ gas_mixes[mix_name] = gas_mix return gas_mixes -/datum/unit_test/atmos_machinery/proc/gas_amount_changes(var/list/before_gas_mixes, var/list/after_gas_mixes) +/datum/unit_test/atmos_machinery/proc/gas_amount_changes(list/before_gas_mixes, list/after_gas_mixes) var/list/result = list() for(var/mix_name in before_gas_mixes & after_gas_mixes) var/change = list() @@ -41,7 +41,7 @@ return result -/datum/unit_test/atmos_machinery/proc/check_moles_conserved(var/case_name, var/list/before_gas_mixes, var/list/after_gas_mixes) +/datum/unit_test/atmos_machinery/proc/check_moles_conserved(case_name, list/before_gas_mixes, list/after_gas_mixes) var/failed = FALSE for(var/gasid in xgm_gas_data.gases) var/before = 0 From 9ed2125698db51662d059002e664284cc0b230d8 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 22:30:02 -0400 Subject: [PATCH 093/200] TGM format --- _maps/map_files/debug/atmos_mintest.dmm | 2783 +++++++++++++++++++++-- 1 file changed, 2590 insertions(+), 193 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index a4e9a68562a..1ed2380d184 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -1,196 +1,2593 @@ -"aa" = (/turf/open/space/basic,/area/space) -"ab" = (/turf/closed/wall/r_wall,/area/hallway/primary/central) -"ac" = (/obj/effect/spawner/structure/window/plasma,/turf/open/floor/plating,/area/hallway/primary/central) -"ad" = (/obj/machinery/door/poddoor{id = "c1vent"; name = "c1vent"},/turf/open/floor/plating,/area/hallway/primary/central) -"ae" = (/obj/machinery/door/poddoor{id = "c2vent"; name = "c2vent"},/turf/open/floor/plating,/area/hallway/primary/central) -"af" = (/obj/machinery/door/poddoor{id = "c3vent"; name = "c3vent"},/turf/open/floor/plating,/area/hallway/primary/central) -"ag" = (/turf/open/floor/iron,/area/hallway/primary/central) -"ah" = (/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"ai" = (/turf/open/floor/engine/airless,/area/hallway/primary/central) -"aj" = (/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"ak" = (/obj/item/card/id/advanced/debug,/obj/structure/rack,/turf/open/floor/iron,/area/hallway/primary/central) -"al" = (/obj/machinery/power/rtg/debug,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"am" = (/obj/machinery/door/poddoor{id = "c1toc2"; name = "c1toc2"},/turf/open/floor/plating,/area/hallway/primary/central) -"an" = (/obj/machinery/door/poddoor{id = "c2toc3"; name = "c2toc3"},/turf/open/floor/plating,/area/hallway/primary/central) -"ao" = (/obj/effect/landmark/latejoin,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) -"ap" = (/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"aq" = (/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"ar" = (/obj/machinery/atmospherics/miner/plasma,/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"as" = (/obj/machinery/atmospherics/miner/n2o,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"at" = (/obj/effect/landmark/observer_start,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) -"au" = (/obj/effect/turf_decal/trimline,/obj/machinery/air_sensor/plasma_tank,/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"av" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/airless,/area/hallway/primary/central) -"aw" = (/obj/effect/turf_decal/trimline,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"ax" = (/obj/effect/turf_decal/bot_red,/obj/effect/landmark/start/assistant,/turf/open/floor/iron,/area/hallway/primary/central) -"ay" = (/obj/machinery/power/apc/auto_name/directional/east,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"az" = (/obj/machinery/meter/turf,/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"aA" = (/obj/machinery/meter/turf,/turf/open/floor/engine/airless,/area/hallway/primary/central) -"aB" = (/obj/machinery/meter/turf,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"aC" = (/obj/item/card/id/advanced/gold/captains_spare,/obj/item/card/id/advanced/gold/captains_spare,/obj/item/card/id/advanced/gold/captains_spare,/obj/structure/rack,/turf/open/floor/iron,/area/hallway/primary/central) -"aD" = (/obj/machinery/button/door{id = "c1toc2"; name = "c1toc2"},/turf/closed/wall/r_wall,/area/hallway/primary/central) -"aE" = (/obj/machinery/button/door{id = "c2toc3"; name = "c2toc3"},/turf/closed/wall/r_wall,/area/hallway/primary/central) -"aF" = (/obj/machinery/button/door{id = "c1vent"; name = "c1vent"},/turf/open/floor/iron,/area/hallway/primary/central) -"aG" = (/obj/machinery/button/door{id = "c2vent"; name = "c2vent"},/turf/open/floor/iron,/area/hallway/primary/central) -"aH" = (/obj/machinery/button/door{id = "c3vent"; name = "c3vent"},/turf/open/floor/iron,/area/hallway/primary/central) -"aI" = (/obj/structure/cable,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"aJ" = (/obj/machinery/atmospherics/components/unary/portables_connector,/turf/open/floor/iron,/area/hallway/primary/central) -"aK" = (/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) -"aL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) -"aM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) -"aN" = (/obj/structure/cable,/obj/machinery/power/rtg/debug,/turf/open/floor/iron,/area/hallway/primary/central) -"aO" = (/turf/open/floor/iron/red,/area/hallway/primary/central) -"aP" = (/obj/machinery/meter/turf,/turf/open/floor/iron,/area/hallway/primary/central) -"aQ" = (/obj/machinery/meter/turf,/turf/open/floor/iron/red,/area/hallway/primary/central) -"aR" = (/obj/machinery/light/floor,/turf/open/floor/iron/red,/area/hallway/primary/central) -"aS" = (/obj/machinery/door/airlock/external/glass,/turf/open/floor/plating,/area/hallway/primary/central) -"aT" = (/obj/machinery/gravity_generator/main/station,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"aU" = (/obj/machinery/light/floor,/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"aV" = (/obj/machinery/light/floor,/turf/open/floor/engine/airless,/area/hallway/primary/central) -"aW" = (/obj/machinery/light/floor,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"aX" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) -"aY" = (/obj/machinery/atmospherics/components/binary/pump{icon_state = "pump_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"aZ" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"ba" = (/obj/machinery/atmospherics/components/binary/volume_pump{icon_state = "volpump_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bb" = (/obj/machinery/atmospherics/components/binary/valve{dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bc" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bd" = (/obj/item/pipe_dispenser,/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/door_remote/omni,/turf/open/floor/iron,/area/hallway/primary/central) -"be" = (/obj/machinery/pipedispenser,/turf/open/floor/iron,/area/hallway/primary/central) -"bf" = (/obj/machinery/light/floor,/turf/open/floor/plating,/area/hallway/primary/central) -"bg" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) -"bh" = (/obj/effect/turf_decal/stripes/red/line,/turf/open/floor/plating,/area/hallway/primary/central) -"bi" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) -"bj" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bk" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bl" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/binary/valve/digital{icon_state = "dvalve_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bm" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/components/binary/passive_gate{icon_state = "passgate_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bn" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 9},/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"bo" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/turf_decal/trimline/yellow/filled,/turf/open/floor/iron,/area/hallway/primary/central) -"bp" = (/obj/machinery/light/floor,/obj/machinery/portable_atmospherics/canister,/obj/effect/turf_decal/trimline/yellow/filled,/turf/open/floor/iron,/area/hallway/primary/central) -"bq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/turf_decal/trimline/blue/filled,/turf/open/floor/iron,/area/hallway/primary/central) -"br" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 6},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bs" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 1},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/obj/machinery/meter,/turf/open/floor/plating,/area/hallway/primary/central) -"bt" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 10},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bu" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 8},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bv" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 4},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bw" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 5},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bx" = (/obj/effect/turf_decal/stripes/red/line,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/obj/machinery/meter,/turf/open/floor/plating,/area/hallway/primary/central) -"by" = (/obj/effect/turf_decal/stripes/red/line{icon_state = "warningline_red"; dir = 9},/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bz" = (/obj/machinery/door/airlock/public/glass,/turf/open/floor/iron,/area/hallway/primary/central) -"bA" = (/obj/structure/cable,/obj/effect/turf_decal/arrows,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"bB" = (/obj/structure/cable,/turf/open/floor/plating,/area/hallway/primary/central) -"bC" = (/obj/structure/cable,/obj/effect/turf_decal/arrows{icon_state = "arrows"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) -"bD" = (/obj/item/pipe_dispenser,/obj/structure/table/reinforced,/turf/open/floor/iron,/area/hallway/primary/central) -"bE" = (/obj/item/holosign_creator/atmos,/obj/structure/table/reinforced,/turf/open/floor/iron,/area/hallway/primary/central) -"bF" = (/obj/machinery/portable_atmospherics/pump,/turf/open/floor/iron,/area/hallway/primary/central) -"bG" = (/obj/machinery/portable_atmospherics/scrubber,/turf/open/floor/iron,/area/hallway/primary/central) -"bH" = (/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/door_remote/omni,/turf/open/floor/iron,/area/hallway/primary/central) -"bI" = (/obj/machinery/air_sensor/mix_tank,/turf/open/floor/engine/airless,/area/hallway/primary/central) -"bJ" = (/obj/effect/turf_decal/trimline,/obj/machinery/air_sensor/nitrous_tank,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"bK" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output,/turf/open/floor/engine/plasma,/area/hallway/primary/central) -"bL" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output,/turf/open/floor/engine/airless,/area/hallway/primary/central) -"bM" = (/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output,/turf/open/floor/engine/n2o,/area/hallway/primary/central) -"bN" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bO" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bP" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/smart/simple/pink/visible,/turf/open/floor/plating,/area/hallway/primary/central) -"bQ" = (/obj/machinery/portable_atmospherics/canister/plasma,/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"bR" = (/obj/machinery/computer/atmos_control/plasma_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"bS" = (/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"bT" = (/obj/machinery/computer/atmos_control/mix_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"bU" = (/obj/machinery/atmospherics/pipe/smart/simple/pink/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"bV" = (/obj/machinery/computer/atmos_control/nitrous_tank,/obj/machinery/light/floor,/turf/open/floor/iron,/area/hallway/primary/central) -"bW" = (/obj/machinery/atmospherics/pipe/smart/simple/orange/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"bX" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"bY" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Power"},/turf/open/floor/iron,/area/hallway/primary/central) -"bZ" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Main Floor"},/turf/open/floor/iron,/area/hallway/primary/central) -"ca" = (/obj/machinery/light/floor,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"cb" = (/obj/machinery/door/airlock/public/glass{name = "Basic Equipment Tests"},/turf/open/floor/iron,/area/hallway/primary/central) -"cc" = (/obj/effect/spawner/structure/window/plasma,/obj/machinery/atmospherics/pipe/heat_exchanging/junction{icon_state = "pipe11-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) -"cd" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/turf/open/floor/iron,/area/hallway/primary/central) -"ce" = (/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{icon_state = "manifold-3"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) -"cf" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cg" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 8},/turf/open/floor/iron,/area/hallway/primary/central) -"ch" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/open/floor/iron,/area/hallway/primary/central) -"ci" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cj" = (/obj/machinery/atmospherics/components/unary/thermomachine/freezer,/turf/open/floor/plating,/area/hallway/primary/central) -"ck" = (/turf/open/floor/plating,/area/hallway/primary/central) -"cl" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/turf/open/floor/plating,/area/hallway/primary/central) -"cm" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 6},/turf/open/space/basic,/area/space) -"cn" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 10},/turf/open/space/basic,/area/space) -"co" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/turf/open/space/basic,/area/space) -"cp" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 5},/turf/open/space/basic,/area/space) -"cq" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{icon_state = "pipe11-3"; dir = 9},/turf/open/space/basic,/area/space) -"cr" = (/obj/machinery/atmospherics/components/unary/thermomachine/heater,/turf/open/floor/plating,/area/hallway/primary/central) -"cs" = (/obj/structure/table/reinforced,/obj/item/analyzer,/turf/open/floor/iron,/area/hallway/primary/central) -"ct" = (/obj/effect/landmark/start/assistant,/obj/effect/turf_decal/bot_red,/turf/open/floor/iron,/area/hallway/primary/central) -"cu" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/obj/item/clothing/glasses/debug,/turf/open/floor/iron,/area/hallway/primary/central) -"cv" = (/obj/structure/table/reinforced,/obj/item/debug/omnitool,/obj/item/debug/omnitool,/obj/item/debug/omnitool,/turf/open/floor/iron,/area/hallway/primary/central) -"cw" = (/obj/structure/table/reinforced,/obj/item/gun/magic/wand/death/debug,/obj/item/gun/magic/wand/death/debug,/obj/item/gun/magic/wand/resurrection/debug,/obj/item/gun/magic/wand/safety/debug,/obj/item/gun/magic/wand/safety/debug,/turf/open/floor/iron,/area/hallway/primary/central) -"cx" = (/obj/structure/table/reinforced,/obj/item/mod/control/pre_equipped/debug,/turf/open/floor/iron,/area/hallway/primary/central) -"cy" = (/obj/structure/table/reinforced,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/obj/item/storage/box/debugtools,/turf/open/floor/iron,/area/hallway/primary/central) -"cz" = (/obj/structure/cable,/obj/machinery/door/airlock/public/glass{name = "Gravgen"},/turf/open/floor/iron,/area/hallway/primary/central) -"cA" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/open/floor/iron,/area/hallway/primary/central) -"cB" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cC" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/iron,/area/hallway/primary/central) -"cD" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cE" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/obj/machinery/portable_atmospherics/canister/plasma,/turf/open/floor/iron,/area/hallway/primary/central) -"cF" = (/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{icon_state = "filter_on-0_f"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cG" = (/obj/machinery/atmospherics/components/binary/volume_pump,/turf/open/floor/iron,/area/hallway/primary/central) -"cH" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 1},/obj/machinery/portable_atmospherics/canister,/turf/open/floor/iron,/area/hallway/primary/central) -"cI" = (/obj/machinery/light/floor,/obj/machinery/atmospherics/components/unary/passive_vent,/turf/open/floor/iron,/area/hallway/primary/central) -"cJ" = (/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"cK" = (/obj/machinery/door/airlock/public/glass,/obj/machinery/atmospherics/pipe/smart/simple/general/visible,/turf/open/floor/iron,/area/hallway/primary/central) -"cL" = (/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/open/floor/iron,/area/hallway/primary/central) -"cM" = (/obj/machinery/light/floor,/obj/machinery/atmospherics/components/unary/passive_vent{icon_state = "passive_vent_map-3"; dir = 1},/turf/open/floor/iron,/area/hallway/primary/central) -"cN" = (/obj/machinery/atmospherics/components/unary/heat_exchanger{icon_state = "he1"; dir = 8},/turf/open/floor/plating,/area/hallway/primary/central) -"cO" = (/obj/machinery/atmospherics/components/unary/heat_exchanger{icon_state = "he1"; dir = 4},/turf/open/floor/plating,/area/hallway/primary/central) -"cP" = (/obj/machinery/atmospherics/components/binary/circulator/cold{icon_state = "circ-off-0"; dir = 4},/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"cQ" = (/obj/machinery/power/generator,/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"cR" = (/obj/machinery/atmospherics/components/binary/circulator{icon_state = "circ-off-0"; dir = 8},/obj/structure/cable,/turf/open/floor/iron,/area/hallway/primary/central) -"cS" = (/obj/machinery/atmospherics/components/unary/portables_connector{icon_state = "connector_map-3"; dir = 4},/turf/open/floor/iron,/area/hallway/primary/central) -"cT" = (/obj/machinery/atmospherics/components/trinary/mixer,/turf/open/floor/iron,/area/hallway/primary/central) -"cU" = (/obj/machinery/atmospherics/components/binary/tank_compressor,/turf/open/floor/iron,/area/hallway/primary/central) -"cV" = (/obj/item/storage/toolbox/mechanical,/turf/open/floor/iron,/area/hallway/primary/central) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"ac" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ad" = ( +/obj/machinery/door/poddoor{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ae" = ( +/obj/machinery/door/poddoor{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"af" = ( +/obj/machinery/door/poddoor{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ag" = ( +/turf/open/floor/iron, +/area/hallway/primary/central) +"ah" = ( +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"ai" = ( +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aj" = ( +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"ak" = ( +/obj/item/card/id/advanced/debug, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"al" = ( +/obj/machinery/power/rtg/debug, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"am" = ( +/obj/machinery/door/poddoor{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"an" = ( +/obj/machinery/door/poddoor{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ao" = ( +/obj/effect/landmark/latejoin, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ap" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aq" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ar" = ( +/obj/machinery/atmospherics/miner/plasma, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"as" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"at" = ( +/obj/effect/landmark/observer_start, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"au" = ( +/obj/effect/turf_decal/trimline, +/obj/machinery/air_sensor/plasma_tank, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"av" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aw" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"ax" = ( +/obj/effect/turf_decal/bot_red, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ay" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"az" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"aA" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aB" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"aC" = ( +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aD" = ( +/obj/machinery/button/door{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"aE" = ( +/obj/machinery/button/door{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"aF" = ( +/obj/machinery/button/door{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aG" = ( +/obj/machinery/button/door{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aH" = ( +/obj/machinery/button/door{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aI" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aJ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aK" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aL" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aM" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aN" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aO" = ( +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aP" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aQ" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aR" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aS" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aT" = ( +/obj/machinery/gravity_generator/main/station, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aU" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"aV" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aW" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"aX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aY" = ( +/obj/machinery/atmospherics/components/binary/pump{ + icon_state = "pump_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aZ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ba" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + icon_state = "volpump_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bb" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bc" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bd" = ( +/obj/item/pipe_dispenser, +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/door_remote/omni, +/turf/open/floor/iron, +/area/hallway/primary/central) +"be" = ( +/obj/machinery/pipedispenser, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bf" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bg" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bh" = ( +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bi" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bj" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bk" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bl" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/binary/valve/digital{ + icon_state = "dvalve_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bm" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/binary/passive_gate{ + icon_state = "passgate_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bn" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bo" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/trimline/yellow/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bp" = ( +/obj/machinery/light/floor, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/trimline/yellow/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bq" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/trimline/blue/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"br" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bs" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bt" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bu" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bv" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bw" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bx" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/hallway/primary/central) +"by" = ( +/obj/effect/turf_decal/stripes/red/line{ + icon_state = "warningline_red"; + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bz" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bA" = ( +/obj/structure/cable, +/obj/effect/turf_decal/arrows, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bB" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/arrows{ + icon_state = "arrows"; + dir = 4 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bD" = ( +/obj/item/pipe_dispenser, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bE" = ( +/obj/item/holosign_creator/atmos, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bF" = ( +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bG" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bH" = ( +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/door_remote/omni, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bI" = ( +/obj/machinery/air_sensor/mix_tank, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"bJ" = ( +/obj/effect/turf_decal/trimline, +/obj/machinery/air_sensor/nitrous_tank, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"bK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"bL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"bM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"bN" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bO" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bP" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bQ" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bR" = ( +/obj/machinery/computer/atmos_control/plasma_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bT" = ( +/obj/machinery/computer/atmos_control/mix_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bV" = ( +/obj/machinery/computer/atmos_control/nitrous_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bY" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Power" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bZ" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Main Floor" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ca" = ( +/obj/machinery/light/floor, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Basic Equipment Tests" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cc" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + icon_state = "pipe11-3"; + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cd" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ce" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + icon_state = "manifold-3"; + dir = 4 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cf" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + icon_state = "filter_on-0_f"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 8 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ch" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ci" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{ + icon_state = "filter_on-0_f"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cj" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ck" = ( +/turf/open/floor/plating, +/area/hallway/primary/central) +"cl" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + icon_state = "pipe11-3"; + dir = 6 + }, +/turf/open/space/basic, +/area/space) +"cn" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + icon_state = "pipe11-3"; + dir = 10 + }, +/turf/open/space/basic, +/area/space) +"co" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space) +"cp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + icon_state = "pipe11-3"; + dir = 5 + }, +/turf/open/space/basic, +/area/space) +"cq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + icon_state = "pipe11-3"; + dir = 9 + }, +/turf/open/space/basic, +/area/space) +"cr" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cs" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ct" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cu" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cv" = ( +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/debug/omnitool, +/obj/item/debug/omnitool, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cw" = ( +/obj/structure/table/reinforced, +/obj/item/gun/magic/wand/death/debug, +/obj/item/gun/magic/wand/death/debug, +/obj/item/gun/magic/wand/resurrection/debug, +/obj/item/gun/magic/wand/safety/debug, +/obj/item/gun/magic/wand/safety/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cx" = ( +/obj/structure/table/reinforced, +/obj/item/mod/control/pre_equipped/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cy" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cz" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Gravgen" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ + icon_state = "filter_on-0_f"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cC" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cD" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ + icon_state = "filter_on-0_f"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cE" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cF" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + icon_state = "filter_on-0_f"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cG" = ( +/obj/machinery/atmospherics/components/binary/volume_pump, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cI" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cK" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cL" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cM" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent{ + icon_state = "passive_vent_map-3"; + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cN" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + icon_state = "he1"; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cO" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + icon_state = "he1"; + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cP" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + icon_state = "circ-off-0"; + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cQ" = ( +/obj/machinery/power/generator, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cR" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + icon_state = "circ-off-0"; + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cS" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + icon_state = "connector_map-3"; + dir = 4 + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cT" = ( +/obj/machinery/atmospherics/components/trinary/mixer, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cU" = ( +/obj/machinery/atmospherics/components/binary/tank_compressor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cV" = ( +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron, +/area/hallway/primary/central) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaababacacacabababadadadabababaeaeaeabababafafafabababacacacababaaaaaaaaaaaaaaaa -aaabagagagagagabaUahahahaUabaVaiaiaiaVabaWajajajaWabaqagagagaqabaaaaaaaaaaaaaaaa -aaacagalagalagacahahahahahamaiaiaiaiaianajajajajajacagagagagagacaacmcncmcnaaaaaa -aaacagaNaqaNagacahaharahahamaiaiaiaiaianajajasajajacagagagagagacaacocococoaaaaaa -aaacagalapalapacahahauahahamaiavbIavaianajawbJawajacagagaTagagacaacocpcqcoaaaaaa -aaabagagapagayabaUbKazahaUabaVbLaAaiaVabaWbMaBajaWabaqagapagaqababccacacccababaa -aaababacbYacabababbNacacabaDabbOacacabaEabbPacacabababacczacababcsbXaKaKbXaqabaa -aaabctagapagakabaKbQaFbRagagagbSaGbTagagagbUaHbVagagaqagapagagaqagagagagagagacaa -aaacctagapagaoacaKbWagagagagagbSagagagagagbUagagagagagagapagagagagagagagagagacaa -aaacctagbAagatacaLbXagagagagagbXagagagagagbXagagagagagagapagagagagagagagagagacaa -aaacctagapagaxacaLagagaqagagagagaqagagagagagaqagagagaqagapagaqagagagaqagagagabaa -aaacctagbAagaCacaLagagagagagagagagagagagagagagagagagagagapagagagagagagagagagacaa -aaacctagapagcuacaMagagagagagagagagagagagagagagaJagaJagagapagagagagagagagagagacaa -aaacctagbAagcvacaMagagaqagagagagaqagagagagagaqcPcQcRcaapapagaqagagagaqagagagacaa -aaacctagapagcwacaMagagagagagagagagagagagagagagbXcVbXagagapagagagagagagagagagacaa -aaacctagbAagcxabbeagagagagagagagaqagagagagagagagagagagagapagagagagagagagagagabaa -aaacctagapagcyababbDbEaqagagagbBbBbBagagagagaqagagagaqagapagaqagagagaqagagagacaa -aaacctagbAagagabbFbGbHagagagagagapagagagagagagagagagagagapagagagagagagagagagacaa -aaacagaIapapbCbZapapaIapapapapapaIapapapapapaIapapapcaapapagaqagagagaqagagagacaa -aaabagagagagagabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagaqabaa -aaababacacacabababacacacacabcbcbcbabacacacacacacacacacacabacacacabacacacabababaa -aaabckckckaXaYaZaXbaaZaXbbbcagagagbdaKaKaKaLaLaLaMaMaMbeacagagagacagagagacaaaaaa -aaacckbfckckckckckbfckckckbgagaqagagagagaqagagagagagaqagbzagcIagbzagaqagaSaaaaaa -aaacbhbhbhbibjbkbiblbkbibmbnagagagaJaJagagagagagagagagagacaPcJagacaPagagacaaaaaa -aaacagagagagagagagagagagagagagagcdcecfcgagagagagagagagagabaccKacabacbzacabaaaaaa -aaacbobpagbqbqagagaqagbrbsbtagaqchcecicgaqagcjcragcLaqagacagcJagacagagagacaaaaaa -aaacboboagbqbqagagagaXbuckbvaZagcAcecBcgagagclclagbXagagbzagcMagbzagaqagaSaaaaaa -aaacboboagbqbqagagagagbwbxbyagagcCcecDcgagagagagagagagagacaPagagacaPagagacaaaaaa -aaacboboagbqbqagagagagagagagaJagcEcecFcgagaXcNcOaZagagagabacbzacabacbzacabaaaaaa -aaacbobpagbqbqagagaqagagagcScTaqagcGbXagaqagagagagagaqagacagagagagagagagacaaaaaa -aaabagagagagagagagagagagagagbXagagcHagagagagagagagagagagbzagaqagaPagaqagaSaaaaaa -aaabagagagagagagagagagagagagagagagagagagagagcUagagagagagacagagagagagagagacaaaaaa -aaababacbzacabababacacbzacacabababacbzacacabababacbzacababacacacabacacacabaaaaaa -aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa -aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa -aaacagaqaPagagbzagagagaPaqagagbzagagaqaPagagbzaOaOaQaRaOaSaaaaaaaaaaaaaaaaaaaaaa -aaacagagagagagacagagagagagagagacagagagagagagacaOaOaOaOaOacaaaaaaaaaaaaaaaaaaaaaa -aaabagagagagagabagagagagagagagabagagagagagagabaOaOaOaOaOabaaaaaaaaaaaaaaaaaaaaaa -aaababacacacabababacacacacacabababacacacacabababacaSacababaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ab +ac +ac +ac +ab +ab +aa +"} +(3,1,1) = {" +aa +ab +ag +ag +ag +ag +ag +ab +ct +ct +ct +ct +ct +ct +ct +ct +ct +ct +ct +ag +ag +ab +ck +ck +bh +ag +bo +bo +bo +bo +bo +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(4,1,1) = {" +aa +ac +ag +al +aN +al +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +aI +ag +ac +ck +bf +bh +ag +bp +bo +bo +bo +bp +ag +ag +ac +ag +ag +aq +ag +ag +ac +aa +"} +(5,1,1) = {" +aa +ac +ag +ag +aq +ap +ap +bY +ap +ap +bA +ap +bA +ap +bA +ap +bA +ap +bA +ap +ag +ac +ck +ck +bh +ag +ag +ag +ag +ag +ag +ag +ag +bz +ag +ag +aP +ag +ag +ac +aa +"} +(6,1,1) = {" +aa +ac +ag +al +aN +al +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aX +ck +bi +ag +bq +bq +bq +bq +bq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(7,1,1) = {" +aa +ab +ag +ag +ag +ap +ay +ab +ak +ao +at +ax +aC +cu +cv +cw +cx +cy +ag +bC +ag +ab +aY +ck +bj +ag +bq +bq +bq +bq +bq +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(8,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +bZ +ab +ab +aZ +ck +bk +ag +ag +ag +ag +ag +ag +ag +ag +ab +ab +ac +bz +ac +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +aU +ah +ah +ah +aU +ab +aK +aK +aL +aL +aL +aM +aM +aM +be +ab +bF +ap +ag +ab +aX +ck +bi +ag +ag +ag +ag +ag +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(10,1,1) = {" +aa +ad +ah +ah +ah +ah +bK +bN +bQ +bW +bX +ag +ag +ag +ag +ag +ag +bD +bG +ap +ag +ac +ba +bf +bl +ag +aq +ag +ag +ag +aq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(11,1,1) = {" +aa +ad +ah +ah +ar +au +az +ac +aF +ag +ag +ag +ag +ag +ag +ag +ag +bE +bH +aI +ag +ac +aZ +ck +bk +ag +ag +aX +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(12,1,1) = {" +aa +ad +ah +ah +ah +ah +ah +ac +bR +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +ap +ag +ac +aX +ck +bi +ag +br +bu +bw +ag +ag +ag +ag +bz +ag +ag +aP +ag +ag +ac +aa +"} +(13,1,1) = {" +aa +ab +aU +ah +ah +ah +aU +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +bb +ck +bm +ag +bs +ck +bx +ag +ag +ag +ag +ac +ag +ag +aq +ag +ag +ac +aa +"} +(14,1,1) = {" +aa +ab +ab +am +am +am +ab +aD +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ab +bc +bg +bn +ag +bt +bv +by +ag +cS +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(15,1,1) = {" +aa +ab +aV +ai +ai +ai +aV +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +cb +ag +ag +ag +ag +ag +aZ +ag +aJ +cT +bX +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(16,1,1) = {" +aa +ae +ai +ai +ai +av +bL +bO +bS +bS +bX +ag +ag +ag +ag +ag +ag +bB +ag +ap +ag +cb +ag +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ab +ab +ac +bz +ac +ab +ab +aa +"} +(17,1,1) = {" +aa +ae +ai +ai +ai +bI +aA +ac +aG +ag +ag +aq +ag +ag +aq +ag +aq +bB +ap +aI +ag +cb +ag +ag +ag +cd +ch +cA +cC +cE +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(18,1,1) = {" +aa +ae +ai +ai +ai +av +ai +ac +bT +ag +ag +ag +ag +ag +ag +ag +ag +bB +ag +ap +ag +ab +bd +ag +aJ +ce +ce +ce +ce +ce +cG +cH +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(19,1,1) = {" +aa +ab +aV +ai +ai +ai +aV +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +ag +aJ +cf +ci +cB +cD +cF +bX +ag +ag +bz +ag +ag +aq +ag +ag +ac +aa +"} +(20,1,1) = {" +aa +ab +ab +an +an +an +ab +aE +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +ag +ag +cg +cg +cg +cg +cg +ag +ag +ag +ac +ag +ag +aP +ag +ag +ac +aa +"} +(21,1,1) = {" +aa +ab +aW +aj +aj +aj +aW +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(22,1,1) = {" +aa +af +aj +aj +aj +aw +bM +bP +bU +bU +bX +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aL +ag +ag +ag +ag +ag +ag +aX +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(23,1,1) = {" +aa +af +aj +aj +as +bJ +aB +ac +aH +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aI +ag +ac +aL +ag +ag +ag +cj +cl +ag +cN +ag +ag +cU +ab +ab +ac +bz +ac +ab +ab +aa +"} +(24,1,1) = {" +aa +af +aj +aj +aj +aw +aj +ac +bV +ag +ag +ag +ag +aJ +cP +bX +ag +ag +ag +ap +ag +ac +aL +ag +ag +ag +cr +cl +ag +cO +ag +ag +ag +ab +aO +aO +aO +aO +aO +ab +aa +"} +(25,1,1) = {" +aa +ab +aW +aj +aj +aj +aW +ab +ag +ag +ag +ag +ag +ag +cQ +cV +ag +ag +ag +ap +ag +ac +aM +ag +ag +ag +ag +ag +ag +aZ +ag +ag +ag +ac +aO +aO +aO +aO +aO +ac +aa +"} +(26,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ag +ag +ag +ag +ag +aJ +cR +bX +ag +ag +ag +ap +ag +ac +aM +ag +ag +ag +cL +bX +ag +ag +ag +ag +ag +bz +aO +aO +aQ +aO +aO +aS +aa +"} +(27,1,1) = {" +aa +ab +aq +ag +ag +ag +aq +ab +aq +ag +ag +aq +ag +ag +ca +ag +ag +aq +ag +ca +ag +ac +aM +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ac +aO +aO +aR +aO +aO +ac +aa +"} +(28,1,1) = {" +aa +ac +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ag +ap +ag +ag +ag +ag +ap +ag +ac +be +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +aO +aO +aO +aO +aO +ab +aa +"} +(29,1,1) = {" +aa +ac +ag +ag +ag +aT +ap +cz +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ag +ab +ac +bz +ac +ab +ac +bz +ac +ab +ac +bz +ac +ab +ab +ac +aS +ac +ab +ab +aa +"} +(30,1,1) = {" +aa +ac +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +aP +ac +ag +ag +aP +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +ab +aq +ag +ag +ag +aq +ab +ag +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aq +ag +ac +ag +cI +cJ +cK +cJ +cM +ag +bz +ag +aq +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +aq +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +cs +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +ac +bz +ac +ab +ac +bz +ac +ab +ag +aP +ag +ab +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +cm +co +co +cc +bX +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +aP +ac +ag +ag +aP +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +cn +co +cp +ac +aK +ag +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aq +ag +ac +ag +aq +ag +bz +ag +aq +ag +bz +ag +aq +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +cm +co +cq +ac +aK +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +cn +co +co +cc +bX +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +ac +aS +ac +ab +ac +aS +ac +ab +ac +aS +ac +ab +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +aq +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +aq +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ac +ac +ac +ab +ac +ac +ac +ac +ab +ac +ac +ac +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} From bc8aa4c26320dff648727617c1ff1e036ada18b7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 14 May 2022 22:38:35 -0400 Subject: [PATCH 094/200] Whoops --- .../templates/heretic_sacrifice_template.dmm | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/_maps/templates/heretic_sacrifice_template.dmm b/_maps/templates/heretic_sacrifice_template.dmm index 16a296233ef..97f9b0a3b6c 100644 --- a/_maps/templates/heretic_sacrifice_template.dmm +++ b/_maps/templates/heretic_sacrifice_template.dmm @@ -63,7 +63,7 @@ "lz" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -106,7 +106,7 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -141,7 +141,7 @@ }, /obj/effect/decal/cleanable/oil, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -153,7 +153,7 @@ "qu" = ( /obj/effect/turf_decal/weather/dirt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -165,7 +165,7 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -178,7 +178,7 @@ "sb" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -188,7 +188,7 @@ dir = 9 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -220,7 +220,7 @@ dir = 4 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -262,7 +262,7 @@ /obj/structure/stone_tile/slab, /obj/effect/decal/cleanable/dirt/dust, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -294,7 +294,7 @@ /area/heretic_sacrifice/rust) "Bw" = ( /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -351,7 +351,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -378,7 +378,7 @@ }, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -388,7 +388,7 @@ dir = 5 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -402,7 +402,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -440,7 +440,7 @@ "KP" = ( /obj/structure/stone_tile/surrounding_tile, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -476,7 +476,7 @@ "NA" = ( /obj/structure/stone_tile/burnt, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -486,7 +486,7 @@ dir = 1 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -503,7 +503,7 @@ dir = 10 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, @@ -513,7 +513,7 @@ dir = 6 }, /turf/open/misc/ashplanet/wateryrock{ - initial_gas = list("oxygen" = 22, "nitrogen" = 82)"; + initial_gas = list("oxygen" = 22, "nitrogen" = 82); simulated = 1; slowdown = 0 }, From d656a682836e01a1140fe69a0d06b15d28b829e6 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 17 May 2022 16:14:37 -0400 Subject: [PATCH 095/200] brings back precision clean up --- code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index f2b940afcbb..0c97d56a13a 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -240,8 +240,8 @@ for(var/g in gas) removed.gas[g] = QUANTIZE((gas[g] / total_moles) * amount) gas[g] -= removed.gas[g] / group_multiplier - /*if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation - gas[g] = 0*/ + if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation + gas -= g removed.temperature = temperature AIR_UPDATE_VALUES(src) From 9f1807eee56e06d707f7cb9c444555102748eae7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 18 May 2022 07:46:16 -0400 Subject: [PATCH 096/200] Pushing this so dreammaker doesnt eat my ass --- .../modules/atmospherics/rust/reactor_core.dm | 15 + .../atmospherics/rust/reactor_em_field.dm | 505 ++++++++++++++++++ icons/obj/machines/rust/fusion.dmi | Bin 0 -> 3681 bytes icons/obj/machines/rust/fusion_core.dmi | Bin 0 -> 6470 bytes tgstation.dme | 2 + 5 files changed, 522 insertions(+) create mode 100644 code/modules/atmospherics/rust/reactor_core.dm create mode 100644 code/modules/atmospherics/rust/reactor_em_field.dm create mode 100644 icons/obj/machines/rust/fusion.dmi create mode 100644 icons/obj/machines/rust/fusion_core.dmi diff --git a/code/modules/atmospherics/rust/reactor_core.dm b/code/modules/atmospherics/rust/reactor_core.dm new file mode 100644 index 00000000000..a581e5ad4d3 --- /dev/null +++ b/code/modules/atmospherics/rust/reactor_core.dm @@ -0,0 +1,15 @@ +#define MAX_FIELD_STR 10000 +#define MIN_FIELD_STR 1 + +/obj/machinery/reactor_core + name = "\improper R-UST Mk. 10 Tokamak Reactor" + desc = "An enormous solenoid for generating extremely high power electromagnetic fields." + icon = 'icons/obj/machines/rust/fusion_core.dmi' + icon_state = "core0" + use_power = POWER_USE_IDLE + idle_power_usage = 100 + active_power_usage = 1000 //multiplied by field strength + anchored = FALSE + + var/obj/effect/fusion_em_field/owned_field + var/field_strength = 1//0.01 diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm new file mode 100644 index 00000000000..d3478f841eb --- /dev/null +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -0,0 +1,505 @@ +//the em field is where the fun happens +/* +Deuterium-deuterium fusion : 40 x 10^7 K +Deuterium-tritium fusion: 4.5 x 10^7 K +*/ + +//#DEFINE MAX_STORED_ENERGY (held_plasma[GAS_PLASMA] * held_plasma[GAS_PLASMA] * SPECIFIC_HEAT_TOXIN) +//#define FUSIONDBG + +#define FUSION_ENERGY_PER_K 20 +#define FUSION_INSTABILITY_DIVISOR 50000 +#define FUSION_RUPTURE_THRESHOLD 10000 +#define FUSION_REACTANT_CAP 10000 + +/obj/effect/reactor_em_field + name = "electromagnetic field" + desc = "A coruscating, barely visible field of energy. It is shaped like a slightly flattened torus." + icon = 'icons/obj/machines/rust/fusion.dmi' + icon_state = "emfield_s1" + alpha = 30 + layer = 4 + light_color = COLOR_RED + color = COLOR_RED + + var/size = 1 + var/energy = 0 + var/plasma_temperature = 0 + var/radiation = 0 + var/field_strength = 0.01 + var/tick_instability = 0 + var/percent_unstable = 0 + + var/obj/machinery/reactor_core/owned_core + var/list/reactants = list() + var/list/particle_catchers = list() + + var/list/ignore_types = list( + /obj/item/projectile, + /obj/effect, + /obj/structure/cable, + /obj/machinery/atmospherics + ) + + var/light_min_range = 2 + var/light_min_power = 0.2 + var/light_max_range = 18 + var/light_max_power = 1 + + var/last_range + var/last_power + +/obj/effect/fusion_em_field/New(loc, var/obj/machinery/power/fusion_core/new_owned_core) + ..() + + set_light(light_min_power, light_min_range / 10, light_min_range) + last_range = light_min_range + last_power = light_min_power + + owned_core = new_owned_core + if(!owned_core) + qdel(src) + + //create the gimmicky things to handle field collisions + var/obj/effect/fusion_particle_catcher/catcher + + catcher = new (locate(src.x,src.y,src.z)) + catcher.parent = src + catcher.SetSize(1) + particle_catchers.Add(catcher) + + for(var/iter=1,iter<=6,iter++) + catcher = new (locate(src.x-iter,src.y,src.z)) + catcher.parent = src + catcher.SetSize((iter*2)+1) + particle_catchers.Add(catcher) + + catcher = new (locate(src.x+iter,src.y,src.z)) + catcher.parent = src + catcher.SetSize((iter*2)+1) + particle_catchers.Add(catcher) + + catcher = new (locate(src.x,src.y+iter,src.z)) + catcher.parent = src + catcher.SetSize((iter*2)+1) + particle_catchers.Add(catcher) + + catcher = new (locate(src.x,src.y-iter,src.z)) + catcher.parent = src + catcher.SetSize((iter*2)+1) + particle_catchers.Add(catcher) + + START_PROCESSING(SSobj, src) + +/obj/effect/fusion_em_field/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/update_light_colors), 10 SECONDS, TIMER_LOOP) + +/obj/effect/fusion_em_field/proc/update_light_colors() + var/use_range + var/use_power + switch (plasma_temperature) + if (-INFINITY to 1000) + light_color = COLOR_RED + use_range = light_min_range + use_power = light_min_power + alpha = 30 + if (100000 to INFINITY) + light_color = COLOR_VIOLET + use_range = light_max_range + use_power = light_max_power + alpha = 230 + else + var/temp_mod = ((plasma_temperature-5000)/20000) + use_range = light_min_range + Ceil((light_max_range-light_min_range)*temp_mod) + use_power = light_min_power + Ceil((light_max_power-light_min_power)*temp_mod) + switch (plasma_temperature) + if (1000 to 6000) + light_color = COLOR_ORANGE + alpha = 50 + if (6000 to 20000) + light_color = COLOR_YELLOW + alpha = 80 + if (20000 to 50000) + light_color = COLOR_GREEN + alpha = 120 + if (50000 to 70000) + light_color = COLOR_CYAN + alpha = 160 + if (70000 to 100000) + light_color = COLOR_BLUE + alpha = 200 + + if (last_range != use_range || last_power != use_power || color != light_color) + color = light_color + set_light(min(use_power, 1), use_range / 6, use_range) //cap first arg at 1 to avoid breaking lighting stuff. + last_range = use_range + last_power = use_power + +/obj/effect/fusion_em_field/Process() + //make sure the field generator is still intact + if(QDELETED(owned_core)) + qdel(src) + return + + // Take some gas up from our environment. + var/added_particles = FALSE + var/datum/gas_mixture/uptake_gas = owned_core.loc.return_air() + if(uptake_gas) + uptake_gas = uptake_gas.remove_by_flag(XGM_GAS_FUSION_FUEL, rand(50,100)) + if(uptake_gas && uptake_gas.total_moles) + for(var/gasname in uptake_gas.gas) + if(uptake_gas.gas[gasname]*10 > reactants[gasname]) + AddParticles(gasname, uptake_gas.gas[gasname]*10) + uptake_gas.adjust_gas(gasname, -(uptake_gas.gas[gasname]), update=FALSE) + added_particles = TRUE + if(added_particles) + uptake_gas.update_values() + + //let the particles inside the field react + React() + + // Dump power to our powernet. + owned_core.add_avail(FUSION_ENERGY_PER_K * plasma_temperature) + + // Energy decay. + if(plasma_temperature >= 1) + var/lost = plasma_temperature*0.01 + radiation += lost + plasma_temperature -= lost + + //handle some reactants formatting + for(var/reactant in reactants) + var/amount = reactants[reactant] + if(amount < 1) + reactants.Remove(reactant) + else if(amount >= FUSION_REACTANT_CAP) + var/radiate = rand(3 * amount / 4, amount / 4) + reactants[reactant] -= radiate + radiation += radiate + + check_instability() + Radiate() + if(radiation) + SSradiation.radiate(src, round(radiation*0.001)) + return 1 + +/obj/effect/fusion_em_field/proc/check_instability() + if(tick_instability > 0) + percent_unstable += (tick_instability*size)/FUSION_INSTABILITY_DIVISOR + tick_instability = 0 + else + if(percent_unstable < 0) + percent_unstable = 0 + else + if(percent_unstable > 1) + percent_unstable = 1 + if(percent_unstable > 0) + percent_unstable = max(0, percent_unstable-rand(0.01,0.03)) + + if(percent_unstable >= 1) + owned_core.Shutdown(force_rupture=1) + else + if(percent_unstable > 0.5 && prob(percent_unstable*100)) + if(plasma_temperature < FUSION_RUPTURE_THRESHOLD) + visible_message("<span class='danger'>\The [src] ripples uneasily, like a disturbed pond.</span>") + else + var/flare + var/fuel_loss + var/rupture + if(percent_unstable < 0.7) + visible_message("<span class='danger'>\The [src] ripples uneasily, like a disturbed pond.</span>") + fuel_loss = prob(5) + else if(percent_unstable < 0.9) + visible_message("<span class='danger'>\The [src] undulates violently, shedding plumes of plasma!</span>") + flare = prob(50) + fuel_loss = prob(20) + rupture = prob(5) + else + visible_message("<span class='danger'>\The [src] is wracked by a series of horrendous distortions, buckling and twisting like a living thing!</span>") + flare = 1 + fuel_loss = prob(50) + rupture = prob(25) + + if(rupture) + owned_core.Shutdown(force_rupture=1) + else + var/lost_plasma = (plasma_temperature*percent_unstable) + radiation += lost_plasma + if(flare) + radiation += plasma_temperature/2 + plasma_temperature -= lost_plasma + + if(fuel_loss) + for(var/particle in reactants) + var/lost_fuel = reactants[particle]*percent_unstable + radiation += lost_fuel + reactants[particle] -= lost_fuel + if(reactants[particle] <= 0) + reactants.Remove(particle) + Radiate() + return + +/obj/effect/fusion_em_field/proc/is_shutdown_safe() + return plasma_temperature < 1000 + +/obj/effect/fusion_em_field/proc/Rupture() + visible_message("<span class='danger'>\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!</span>") + set_light(1, 0.1, 15, 2, "#ccccff") + empulse(get_turf(src), Ceil(plasma_temperature/1000), Ceil(plasma_temperature/300)) + sleep(5) + RadiateAll() + explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows. + return + +/obj/effect/fusion_em_field/proc/ChangeFieldStrength(var/new_strength) + var/calc_size = 1 + if(new_strength <= 50) + calc_size = 1 + else if(new_strength <= 200) + calc_size = 3 + else if(new_strength <= 500) + calc_size = 5 + else if(new_strength <= 1000) + calc_size = 7 + else if(new_strength <= 2000) + calc_size = 9 + else if(new_strength <= 5000) + calc_size = 11 + else + calc_size = 13 + field_strength = new_strength + change_size(calc_size) + +/obj/effect/fusion_em_field/proc/AddEnergy(var/a_energy, var/a_plasma_temperature) + energy += a_energy + plasma_temperature += a_plasma_temperature + if(a_energy && percent_unstable > 0) + percent_unstable -= a_energy/10000 + if(percent_unstable < 0) + percent_unstable = 0 + while(energy >= 100) + energy -= 100 + plasma_temperature += 1 + +/obj/effect/fusion_em_field/proc/AddParticles(var/name, var/quantity = 1) + if(name in reactants) + reactants[name] += quantity + else if(name != "proton" && name != "electron" && name != "neutron") + reactants.Add(name) + reactants[name] = quantity + +/obj/effect/fusion_em_field/proc/RadiateAll(var/ratio_lost = 1) + + // Create our plasma field and dump it into our environment. + var/turf/T = get_turf(src) + if(istype(T)) + var/datum/gas_mixture/plasma + for(var/reactant in reactants) + if(!gas_data.name[reactant]) + continue + if(!plasma) + plasma = new + plasma.adjust_gas(reactant, max(1,round(reactants[reactant]*0.1)), 0) // *0.1 to compensate for *10 when uptaking gas. + if(!plasma) + return + plasma.temperature = (plasma_temperature/2) + plasma.update_values() + T.assume_air(plasma) + T.hotspot_expose(plasma_temperature) + plasma = null + + // Radiate all our unspent fuel and energy. + for(var/particle in reactants) + radiation += reactants[particle] + reactants.Remove(particle) + radiation += plasma_temperature/2 + plasma_temperature = 0 + + SSradiation.radiate(src, round(radiation*0.001)) + Radiate() + +/obj/effect/fusion_em_field/proc/Radiate() + if(istype(loc, /turf)) + var/empsev = max(1, min(3, Ceil(size/2))) + for(var/atom/movable/AM in range(max(1,Floor(size/2)), loc)) + + if(AM == src || AM == owned_core || !AM.simulated) + continue + + var/skip_obstacle + for(var/ignore_path in ignore_types) + if(istype(AM, ignore_path)) + skip_obstacle = TRUE + break + if(skip_obstacle) + continue + + AM.visible_message("<span class='danger'>The field buckles visibly around \the [AM]!</span>") + tick_instability += rand(30,50) + AM.emp_act(empsev) + + if(owned_core && owned_core.loc) + var/datum/gas_mixture/environment = owned_core.loc.return_air() + if(environment && environment.temperature < (T0C+1000)) // Putting an upper bound on it to stop it being used in a TEG. + environment.add_thermal_energy(plasma_temperature*20000) + radiation = 0 + +/obj/effect/fusion_em_field/proc/change_size(var/newsize = 1) + var/changed = 0 + var/static/list/size_to_icon = list( + "3" = 'icons/effects/96x96.dmi', + "5" = 'icons/effects/160x160.dmi', + "7" = 'icons/effects/224x224.dmi', + "9" = 'icons/effects/288x288.dmi', + "11" = 'icons/effects/352x352.dmi', + "13" = 'icons/effects/416x416.dmi' + ) + + if( ((newsize-1)%2==0) && (newsize<=13) ) + icon = 'icons/obj/machines/power/fusion.dmi' + if(newsize>1) + icon = size_to_icon["[newsize]"] + icon_state = "emfield_s[newsize]" + pixel_x = ((newsize-1) * -16) * PIXEL_MULTIPLIER + pixel_y = ((newsize-1) * -16) * PIXEL_MULTIPLIER + size = newsize + changed = newsize + + for(var/obj/effect/fusion_particle_catcher/catcher in particle_catchers) + catcher.UpdateSize() + return changed + +//the !!fun!! part +/obj/effect/fusion_em_field/proc/React() + //loop through the reactants in random order + var/list/react_pool = reactants.Copy() + + //cant have any reactions if there aren't any reactants present + if(react_pool.len) + //determine a random amount to actually react this cycle, and remove it from the standard pool + //this is a hack, and quite nonrealistic :( + for(var/reactant in react_pool) + react_pool[reactant] = rand(Floor(react_pool[reactant]/2),react_pool[reactant]) + reactants[reactant] -= react_pool[reactant] + if(!react_pool[reactant]) + react_pool -= reactant + + //loop through all the reacting reagents, picking out random reactions for them + var/list/produced_reactants = new/list + var/list/p_react_pool = react_pool.Copy() + while(p_react_pool.len) + //pick one of the unprocessed reacting reagents randomly + var/cur_p_react = pick(p_react_pool) + p_react_pool.Remove(cur_p_react) + + //grab all the possible reactants to have a reaction with + var/list/possible_s_reacts = react_pool.Copy() + //if there is only one of a particular reactant, then it can not react with itself so remove it + possible_s_reacts[cur_p_react] -= 1 + if(possible_s_reacts[cur_p_react] < 1) + possible_s_reacts.Remove(cur_p_react) + + //loop through and work out all the possible reactions + var/list/possible_reactions + for(var/cur_s_react in possible_s_reacts) + if(possible_s_reacts[cur_s_react] < 1) + continue + var/decl/fusion_reaction/cur_reaction = get_fusion_reaction(cur_p_react, cur_s_react) + if(cur_reaction && plasma_temperature >= cur_reaction.minimum_energy_level) + LAZYDISTINCTADD(possible_reactions, cur_reaction) + + //if there are no possible reactions here, abandon this primary reactant and move on + if(!LAZYLEN(possible_reactions)) + continue + + /// Sort based on reaction priority to avoid deut-deut eating all the deut before deut-trit can run etc. + sortTim(possible_reactions, /proc/cmp_fusion_reaction_des) + + //split up the reacting atoms between the possible reactions + while(possible_reactions.len) + var/decl/fusion_reaction/cur_reaction = possible_reactions[1] + possible_reactions.Remove(cur_reaction) + + //set the randmax to be the lower of the two involved reactants + var/max_num_reactants = react_pool[cur_reaction.p_react] > react_pool[cur_reaction.s_react] ? \ + react_pool[cur_reaction.s_react] : react_pool[cur_reaction.p_react] + if(max_num_reactants < 1) + continue + + //make sure we have enough energy + if(plasma_temperature < cur_reaction.minimum_reaction_temperature) + continue + + if(plasma_temperature < max_num_reactants * cur_reaction.energy_consumption) + max_num_reactants = round(plasma_temperature / cur_reaction.energy_consumption) + if(max_num_reactants < 1) + continue + + //randomly determined amount to react + var/amount_reacting = rand(1, max_num_reactants) + + //removing the reacting substances from the list of substances that are primed to react this cycle + //if there aren't enough of that substance (there should be) then modify the reactant amounts accordingly + if( react_pool[cur_reaction.p_react] - amount_reacting >= 0 ) + react_pool[cur_reaction.p_react] -= amount_reacting + else + amount_reacting = react_pool[cur_reaction.p_react] + react_pool[cur_reaction.p_react] = 0 + //same again for secondary reactant + if(react_pool[cur_reaction.s_react] - amount_reacting >= 0 ) + react_pool[cur_reaction.s_react] -= amount_reacting + else + react_pool[cur_reaction.p_react] += amount_reacting - react_pool[cur_reaction.p_react] + amount_reacting = react_pool[cur_reaction.s_react] + react_pool[cur_reaction.s_react] = 0 + + plasma_temperature -= max_num_reactants * cur_reaction.energy_consumption // Remove the consumed energy. + plasma_temperature += max_num_reactants * cur_reaction.energy_production // Add any produced energy. + radiation += max_num_reactants * cur_reaction.radiation // Add any produced radiation. + tick_instability += max_num_reactants * cur_reaction.instability + + // Create the reaction products. + for(var/reactant in cur_reaction.products) + var/success = 0 + for(var/check_reactant in produced_reactants) + if(check_reactant == reactant) + produced_reactants[reactant] += cur_reaction.products[reactant] * amount_reacting + success = 1 + break + if(!success) + produced_reactants[reactant] = cur_reaction.products[reactant] * amount_reacting + + // Handle anything special. If this proc returns true, abort the current reaction. + if(cur_reaction.handle_reaction_special(src)) + return + + // This reaction is done, and can't be repeated this sub-cycle. + possible_reactions.Remove(cur_reaction.s_react) + + // Loop through the newly produced reactants and add them to the pool. + for(var/reactant in produced_reactants) + AddParticles(reactant, produced_reactants[reactant]) + + // Check whether there are reactants left, and add them back to the pool. + for(var/reactant in react_pool) + AddParticles(reactant, react_pool[reactant]) + +/obj/effect/fusion_em_field/Destroy() + set_light(0) + RadiateAll() + QDEL_NULL_LIST(particle_catchers) + if(owned_core) + owned_core.owned_field = null + owned_core = null + STOP_PROCESSING(SSobj, src) + . = ..() + +/obj/effect/fusion_em_field/bullet_act(var/obj/item/projectile/Proj) + AddEnergy(Proj.damage) + update_icon() + return 0 + +#undef FUSION_INSTABILITY_DIVISOR +#undef FUSION_RUPTURE_THRESHOLD +#undef FUSION_REACTANT_CAP diff --git a/icons/obj/machines/rust/fusion.dmi b/icons/obj/machines/rust/fusion.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bd1131a1e6a80a9f7549f6311d445403285a5691 GIT binary patch literal 3681 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/fusion_core.dmi b/icons/obj/machines/rust/fusion_core.dmi new file mode 100644 index 0000000000000000000000000000000000000000..76904a1200d5b0a5f17d30b9ceb50707678169f3 GIT binary patch literal 6470 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index dc901c532c9..909c90b2aef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2347,6 +2347,8 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" +#include "code\modules\atmospherics\rust\reactor_core.dm" +#include "code\modules\atmospherics\rust\reactor_core.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" From 0ab65cb22cc183922fe25176808178f2c1d77d22 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 18 May 2022 10:55:05 -0400 Subject: [PATCH 097/200] more R-UST work --- code/__DEFINES/maths.dm | 2 + code/__HELPERS/_lists.dm | 2 + code/__HELPERS/cmp.dm | 4 + code/__HELPERS/maths.dm | 125 ++++++++++++++ code/game/atoms.dm | 2 +- code/game/machinery/doors/door.dm | 3 +- code/modules/atmospherics/ZAS/Atom.dm | 15 -- code/modules/atmospherics/ZAS/XGM/gases.dm | 2 +- .../atmospherics/rust/fusion_reactions.dm | 28 ++++ .../atmospherics/rust/particle_catcher.dm | 42 +++++ .../modules/atmospherics/rust/reactor_core.dm | 109 +++++++++++- .../atmospherics/rust/reactor_em_field.dm | 158 +++++++++--------- .../projectile/energy/nuclear_particle.dm | 6 + tgstation.dme | 5 +- 14 files changed, 402 insertions(+), 101 deletions(-) create mode 100644 code/modules/atmospherics/rust/fusion_reactions.dm create mode 100644 code/modules/atmospherics/rust/particle_catcher.dm diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 6a2ae4fa531..62c1af9d200 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -17,6 +17,8 @@ #define SHORT_REAL_LIMIT 16777216 +#define LIGHT_SPEED 299792458 // meters per second + //"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks //percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) //collapsed to percent_of_tick_used * tick_lag diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 3c3857924d7..9aea5c6bd9e 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -19,6 +19,8 @@ #define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } } ///Add an item to the list, if the list is null it will initialize it #define LAZYADD(L, I) if(!L) { L = list(); } L += I; +///Adds an item to the list, initalizing the list if necessary, if the item is not already in the list +#define LAZYDISTINCTADD(L, I) if(!L) { L = list(); } L |= I; ///Add an item to the list if not already present, if the list is null it will initialize it #define LAZYOR(L, I) if(!L) { L = list(); } L |= I; ///Returns the key of the submitted item in the list diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 8545b04d6f3..8f2d8e79d08 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -167,3 +167,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") /// Orders heretic knowledge by priority /proc/cmp_heretic_knowledge(datum/heretic_knowledge/knowledge_a, datum/heretic_knowledge/knowledge_b) return initial(knowledge_b.priority) - initial(knowledge_a.priority) + +///Orders R-UST fusion by priority +/proc/cmp_fusion_reaction_des(var/decl/fusion_reaction/A, var/decl/fusion_reaction/B) + return B.priority - A.priority diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 41b2532999c..33aea99ad99 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -134,5 +134,130 @@ else //It gets too tedious to use latin prefixes from here. return "[number]-tuple" +/// Multiplier for converting degrees to radians +#define DEG_TO_RAD 0.0174532925 + + +/// Multiplier for converting radians to degrees +#define RAD_TO_DEG 57.2957795 + + /// A random real number between low and high inclusive #define Frand(low, high) ( rand() * ((high) - (low)) + (low) ) + + +/// Value or the next integer in a positive direction: Ceil(-1.5) = -1 , Ceil(1.5) = 2 +#define Ceil(value) ( -round(-(value)) ) + + +/// Value or the next multiple of divisor in a positive direction. Ceilm(-1.5, 0.3) = -1.5 , Ceilm(-1.5, 0.4) = -1.2 +#define Ceilm(value, divisor) ( -round(-(value) / (divisor)) * (divisor) ) + + +/// Value or the nearest power of power in a positive direction: Ceilp(3, 2) = 4 , Ceilp(5, 3) = 9 +#define Ceilp(value, power) ( (power) ** -round(-log((power), (value))) ) + + +/// Value or the next integer in a negative direction: Floor(-1.5) = -2 , Floor(1.5) = 1 +#define Floor(value) round(value) + + +/// Value or the next multiple of divisor in a negative direction: Floorm(-1.5, 0.3) = -1.5 , Floorm(-1.5, 0.4) = -1.6 +#define Floorm(value, divisor) ( round((value) / (divisor)) * (divisor) ) + + +/// Value or the nearest integer in either direction +#define Round(value) round((value), 1) + + +/// Value or the nearest multiple of divisor in either direction +#define Roundm(value, divisor) round((value), (divisor)) + + +/// The percentage of value in max, rounded to places: 1 = nearest 0.1 , 0 = nearest 1 , -1 = nearest 10, etc +#define Percent(value, max, places) round((value) / (max) * 100, !(places) || 10 ** -(places)) + + +/// True if value is an integer number. +#define IsInteger(value) (round(value) == (value)) + + +//NB: Not actually truly all powers of 2 but this behavior is currently expected +/// True if value is a non-negative integer that is 0 or has a single bit set. 0, 1, 2, 4, 8 ... +#define IsPowerOfTwo(value) ( IsInteger(value) && !((value) & ((value) - 1)) ) + + +/// True if value is an integer that is not zero and does not have the 1 bit set +#define IsEven(value) ( (value) && IsPowerOfTwo(value) ) + + +/// True if value is an integer that has the 1 bit set. +#define IsOdd(value) ( IsInteger(value) && ((value) & 0x1) ) + + +/// True if value is a multiple of divisor +#define IsMultiple(value, divisor) ((value) % (divisor) == 0) + + +/// True if value is between low and high inclusive +#define IsInRange(value, low, high) ( (value) >= (low) && (value) <= (high) ) + + +/// The cosecant of degrees +#define Csc(degrees) (1 / sin(degrees)) + + +/// The secant of degrees +#define Sec(degrees) (1 / cos(degrees)) + + +/// The cotangent of degrees +#define Cot(degrees) (1 / tan(degrees)) + + +/// The 2-argument arctangent of x and y +/proc/Atan2(x, y) + if (!x && !y) + return 0 + var/a = arccos(x / sqrt(x * x + y * y)) + return y >= 0 ? a : -a + + +/// Returns a linear interpolation from a to b according to weight. weight 0 is a, weight 1 is b, weight 0.5 is half-way between the two. +/proc/Interpolate(a, b, weight = 0.5) + return a + (b - a) * weight + + +/// Returns the mean of either a list or variadic arguments: Mean(list(1, 2, 3)) = 2 , Mean(1, 2, 3) = 2 +/proc/Mean(...) + var/list/values = args + if (islist(values[1])) + values = values[1] + var/sum = 0 + if (values.len) + for (var/value in values) + sum += value + sum /= values.len + return sum + + +/// Returns the euclidian square magnitude of a vector of either a list or variadic arguments: VecSquareMag(list(1, 2, 3)) = 14 , VecSquareMag(1, 2, 3) = 14 +/proc/VecSquareMag(...) + var/list/parts = args + if (islist(parts[1])) + parts = parts[1] + var/sum = 0 + for (var/part in parts) + sum += part * part + return sum + + +/// Returns the euclidian magnitude of a vector of either a list or variadic arguments: VecMag(list(3, 4)) = 5 , VecMag(3, 4) = 5 +/proc/VecMag(...) + var/squareMag = VecSquareMag(arglist(args)) + return sqrt(squareMag) + + +/// Returns the angle of the matrix according to atan2 on the b, a parts +/matrix/proc/get_angle() + return Atan2(b, a) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 97591449146..7c92bef3e40 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -337,7 +337,7 @@ return TRUE /// Whether the mover object can avoid being blocked by this atom, while arriving from (or leaving through) the border_dir. -/atom/proc/CanPass(atom/movable/mover, border_dir, air_group) +/atom/proc/CanPass(atom/movable/mover, border_dir) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) if(!mover) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 27fa24f363e..22fdee4329b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -183,9 +183,8 @@ . = ..() -/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir, air_group) +/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(air_group) return !block_air_zones if(.) return // Snowflake handling for PASSGLASS. diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index d1787e7a055..501d16e1cab 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -1,18 +1,3 @@ -/*/turf/CanPass(atom/movable/mover, border_dir, height=1.5,air_group=0) - if(target.blocks_air||blocks_air) - return 0 - - for(var/obj/obstacle in src) - if(!obstacle.CanPass(mover, target, height, air_group)) - return 0 - if(target != src) - for(var/obj/obstacle in target) - if(!obstacle.CanPass(mover, src, height, air_group)) - return 0 - - return ..() -*/ - //Convenience function for atoms to update turfs they occupy /atom/movable/proc/update_nearby_tiles(need_rebuild) //for(var/turf/simulated/turf in locs) ZASTURF diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 23f9a084f58..51fd293b931 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -33,7 +33,7 @@ id = GAS_METHYL_BROMIDE name = "Methyl Bromide" specific_heat = 42.59 // J/(mol*K) - molar_mass = 0.095 // kg/mol + molar_mass = 0.095 // kg/mol //breathed_product = /datum/reagent/toxin/methyl_bromide symbol_html = "CH<sub>3</sub>Br" symbol = "CH3Br" diff --git a/code/modules/atmospherics/rust/fusion_reactions.dm b/code/modules/atmospherics/rust/fusion_reactions.dm new file mode 100644 index 00000000000..fd5346a7e7a --- /dev/null +++ b/code/modules/atmospherics/rust/fusion_reactions.dm @@ -0,0 +1,28 @@ +GLOBAL_LIST_EMPTY(fusion_reactions) + +/datum/fusion_reaction + var/p_react = "" // Primary reactant. + var/s_react = "" // Secondary reactant. + var/minimum_energy_level = 1 + var/energy_consumption = 0 + var/energy_production = 0 + var/radiation = 0 + var/instability = 0 + var/list/products = list() + var/minimum_reaction_temperature = 100 + var/priority = 100 + +/datum/fusion_reaction/proc/handle_reaction_special(obj/effect/reactor_em_field/holder) + return 0 + +/proc/get_fusion_reaction(p_react, s_react) + return GLOB.fusion_reactions[p_react]?[s_react] + +/datum/fusion_reaction/deuterium_lithium + p_react = GAS_DEUTERIUM + s_react = "lithium" + energy_consumption = 2 + energy_production = 0 + radiation = 3 + products = list(GAS_TRITIUM= 1) + instability = 1 diff --git a/code/modules/atmospherics/rust/particle_catcher.dm b/code/modules/atmospherics/rust/particle_catcher.dm new file mode 100644 index 00000000000..b8757a813db --- /dev/null +++ b/code/modules/atmospherics/rust/particle_catcher.dm @@ -0,0 +1,42 @@ +/obj/effect/fusion_particle_catcher + density = TRUE + anchored = TRUE + invisibility = 101 + light_color = COLOR_BLUE + ///Typecache of particles that can interact with this field. + var/static/list/particle_cache = typecacheof(/obj/projectile/energy/nuclear_particle) + var/obj/effect/reactor_em_field/parent + var/mysize = 0 + +/obj/effect/fusion_particle_catcher/Destroy() + . =..() + parent.particle_catchers -= src + parent = null + +/obj/effect/fusion_particle_catcher/proc/set_size(newsize) + name = "collector [newsize]" + mysize = newsize + update_size() + +/obj/effect/fusion_particle_catcher/proc/add_particles(name, quantity = 1) + if(parent && parent.size >= mysize) + parent.add_particles(name, quantity) + return 1 + return 0 + +/obj/effect/fusion_particle_catcher/proc/update_size() + if(parent.size >= mysize) + set_density(1) + name = "collector [mysize] ON" + else + set_density(0) + name = "collector [mysize] OFF" + +/obj/effect/fusion_particle_catcher/bullet_act(obj/projectile/Proj) + parent.add_energy(Proj.damage) + update_icon() + return 0 + +/obj/effect/fusion_particle_catcher/CanAllowThrough(atom/movable/mover, border_dir) + ..() + return !particle_cache[mover.type] diff --git a/code/modules/atmospherics/rust/reactor_core.dm b/code/modules/atmospherics/rust/reactor_core.dm index a581e5ad4d3..68f9c1fa89d 100644 --- a/code/modules/atmospherics/rust/reactor_core.dm +++ b/code/modules/atmospherics/rust/reactor_core.dm @@ -1,15 +1,114 @@ #define MAX_FIELD_STR 10000 #define MIN_FIELD_STR 1 -/obj/machinery/reactor_core +/obj/machinery/power/reactor_core name = "\improper R-UST Mk. 10 Tokamak Reactor" desc = "An enormous solenoid for generating extremely high power electromagnetic fields." - icon = 'icons/obj/machines/rust/fusion_core.dmi' + icon = 'icons/obj/machines/rust/reactor_core.dmi' icon_state = "core0" - use_power = POWER_USE_IDLE - idle_power_usage = 100 + density = TRUE + use_power = IDLE_POWER_USE active_power_usage = 1000 //multiplied by field strength anchored = FALSE - var/obj/effect/fusion_em_field/owned_field + var/obj/effect/reactor_em_field/owned_field var/field_strength = 1//0.01 + var/initial_id_tag + +/obj/machinery/power/reactor_core/mapped + anchored = TRUE + +/obj/machinery/power/reactor_core/process() + if((machine_stat & BROKEN) || !powernet || !owned_field) + Shutdown() +/* +/obj/machinery/power/reactor_core/Topic(href, href_list) + if(..()) + return 1 + if(href_list["str"]) + var/dif = text2num(href_list["str"]) + field_strength = min(max(field_strength + dif, MIN_FIELD_STR), MAX_FIELD_STR) + change_power_consumption(500 * field_strength, POWER_USE_ACTIVE) + if(owned_field) + owned_field.ChangeFieldStrength(field_strength) +*/ + +/obj/machinery/power/reactor_core/proc/Startup() + if(owned_field) + return + owned_field = new(loc, src) + owned_field.set_field_strength(field_strength) + icon_state = "core1" + update_use_power(ACTIVE_POWER_USE) + return TRUE + +/obj/machinery/power/reactor_core/proc/Shutdown(force_rupture) + if(owned_field) + icon_state = "core0" + if(force_rupture || owned_field.plasma_temperature > 1000) + owned_field.rupture() + else + owned_field.radiate_all() + qdel(owned_field) + owned_field = null + update_use_power(IDLE_POWER_USE) + +/obj/machinery/power/reactor_core/proc/add_particles(var/name, var/quantity = 1) + if(owned_field) + owned_field.add_particles(name, quantity) + return TRUE + +/obj/machinery/power/reactor_core/bullet_act(obj/projectile/Proj) + if(owned_field) + . = owned_field.bullet_act(Proj) + +/obj/machinery/power/reactor_core/proc/set_strength(var/value) + value = clamp(value, MIN_FIELD_STR, MAX_FIELD_STR) + field_strength = value + active_power_usage = value*5 + if(owned_field) + owned_field.set_field_strength(value) + +/obj/machinery/power/reactor_core/attack_hand(mob/user) + visible_message("<span class='notice'>\The [user] hugs \the [src] to make it feel better!</span>") + if(owned_field) + Shutdown() + return TRUE +/obj/machinery/power/reactor_core/tool_act(mob/living/user, obj/item/tool, tool_type) + . = ..() + +/obj/machinery/power/reactor_core/attackby(var/obj/item/W, var/mob/user) + + if(owned_field) + to_chat(user,"<span class='warning'>Shut \the [src] off first!</span>") + return + + if(W.tool_behaviour & TOOL_WRENCH) + anchored = !anchored + if(W.use_tool(user, 4 SECONDS)) + if(anchored) + user.visible_message("[user.name] secures [src.name] to the floor.", \ + "You secure the [src.name] to the floor.", \ + "You hear a ratchet.") + else + user.visible_message("[user.name] unsecures [src.name] from the floor.", \ + "You unsecure the [src.name] from the floor.", \ + "You hear a ratchet.") + return + + return ..() + +/obj/machinery/power/reactor_core/proc/jumpstart(var/field_temperature) + field_strength = 501 // Generally a good size. + Startup() + if(!owned_field) + return FALSE + owned_field.plasma_temperature = field_temperature + return TRUE + +/obj/machinery/power/reactor_core/proc/check_core_status() + if(machine_stat & BROKEN) + return FALSE + if(idle_power_usage > avail()) + return FALSE + return TRUE diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index d3478f841eb..29e9f00b8ce 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -18,10 +18,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K icon = 'icons/obj/machines/rust/fusion.dmi' icon_state = "emfield_s1" alpha = 30 - layer = 4 + layer = RIPPLE_LAYER light_color = COLOR_RED color = COLOR_RED - + anchored = TRUE //STOP FUCKING DRAGGING THE ELECTROMAGNETIC FIELD var/size = 1 var/energy = 0 var/plasma_temperature = 0 @@ -30,16 +30,16 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/tick_instability = 0 var/percent_unstable = 0 - var/obj/machinery/reactor_core/owned_core + var/obj/machinery/power/reactor_core/owned_core var/list/reactants = list() var/list/particle_catchers = list() - var/list/ignore_types = list( - /obj/item/projectile, + var/list/ignore_types = typecacheof(list( + /obj/projectile, /obj/effect, /obj/structure/cable, /obj/machinery/atmospherics - ) + )) var/light_min_range = 2 var/light_min_power = 0.2 @@ -49,7 +49,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/last_range var/last_power -/obj/effect/fusion_em_field/New(loc, var/obj/machinery/power/fusion_core/new_owned_core) +/obj/effect/reactor_em_field/New(loc, var/obj/machinery/power/reactor_core/new_owned_core) ..() set_light(light_min_power, light_min_range / 10, light_min_range) @@ -65,37 +65,47 @@ Deuterium-tritium fusion: 4.5 x 10^7 K catcher = new (locate(src.x,src.y,src.z)) catcher.parent = src - catcher.SetSize(1) + catcher.set_size(1) particle_catchers.Add(catcher) - for(var/iter=1,iter<=6,iter++) + for(var/iter in 1 to 6) catcher = new (locate(src.x-iter,src.y,src.z)) catcher.parent = src - catcher.SetSize((iter*2)+1) + catcher.set_size((iter*2)+1) particle_catchers.Add(catcher) catcher = new (locate(src.x+iter,src.y,src.z)) catcher.parent = src - catcher.SetSize((iter*2)+1) + catcher.set_size((iter*2)+1) particle_catchers.Add(catcher) catcher = new (locate(src.x,src.y+iter,src.z)) catcher.parent = src - catcher.SetSize((iter*2)+1) + catcher.set_size((iter*2)+1) particle_catchers.Add(catcher) catcher = new (locate(src.x,src.y-iter,src.z)) catcher.parent = src - catcher.SetSize((iter*2)+1) + catcher.set_size((iter*2)+1) particle_catchers.Add(catcher) START_PROCESSING(SSobj, src) -/obj/effect/fusion_em_field/Initialize() +/obj/effect/reactor_em_field/Initialize() . = ..() addtimer(CALLBACK(src, .proc/update_light_colors), 10 SECONDS, TIMER_LOOP) - -/obj/effect/fusion_em_field/proc/update_light_colors() + if(!GLOB.fusion_reactions.len) + GLOB.fusion_reactions = list() + for(var/rtype in subtypesof(/datum/fusion_reaction)) + var/datum/fusion_reaction/cur_reaction = new rtype() + if(!GLOB.fusion_reactions[cur_reaction.p_react]) + GLOB.fusion_reactions[cur_reaction.p_react] = list() + GLOB.fusion_reactions[cur_reaction.p_react][cur_reaction.s_react] = cur_reaction + if(!GLOB.fusion_reactions[cur_reaction.s_react]) + GLOB.fusion_reactions[cur_reaction.s_react] = list() + GLOB.fusion_reactions[cur_reaction.s_react][cur_reaction.p_react] = cur_reaction + +/obj/effect/reactor_em_field/proc/update_light_colors() var/use_range var/use_power switch (plasma_temperature) @@ -136,7 +146,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K last_range = use_range last_power = use_power -/obj/effect/fusion_em_field/Process() +/obj/effect/reactor_em_field/process() //make sure the field generator is still intact if(QDELETED(owned_core)) qdel(src) @@ -146,18 +156,18 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/added_particles = FALSE var/datum/gas_mixture/uptake_gas = owned_core.loc.return_air() if(uptake_gas) - uptake_gas = uptake_gas.remove_by_flag(XGM_GAS_FUSION_FUEL, rand(50,100)) + uptake_gas = uptake_gas.removeByFlag(XGM_GAS_FUSION_FUEL, rand(50,100)) if(uptake_gas && uptake_gas.total_moles) for(var/gasname in uptake_gas.gas) if(uptake_gas.gas[gasname]*10 > reactants[gasname]) - AddParticles(gasname, uptake_gas.gas[gasname]*10) - uptake_gas.adjust_gas(gasname, -(uptake_gas.gas[gasname]), update=FALSE) + add_particles(gasname, uptake_gas.gas[gasname]*10) + uptake_gas.adjustGas(gasname, -(uptake_gas.gas[gasname]), update=FALSE) added_particles = TRUE if(added_particles) - uptake_gas.update_values() + AIR_UPDATE_VALUES(uptake_gas) //let the particles inside the field react - React() + react() // Dump power to our powernet. owned_core.add_avail(FUSION_ENERGY_PER_K * plasma_temperature) @@ -179,12 +189,12 @@ Deuterium-tritium fusion: 4.5 x 10^7 K radiation += radiate check_instability() - Radiate() + radiate() if(radiation) - SSradiation.radiate(src, round(radiation*0.001)) + radiation_pulse(src, src.size/2, RAD_FULL_INSULATION, 100) return 1 -/obj/effect/fusion_em_field/proc/check_instability() +/obj/effect/reactor_em_field/proc/check_instability() if(tick_instability > 0) percent_unstable += (tick_instability*size)/FUSION_INSTABILITY_DIVISOR tick_instability = 0 @@ -237,22 +247,27 @@ Deuterium-tritium fusion: 4.5 x 10^7 K reactants[particle] -= lost_fuel if(reactants[particle] <= 0) reactants.Remove(particle) - Radiate() + radiate() return -/obj/effect/fusion_em_field/proc/is_shutdown_safe() +/obj/effect/reactor_em_field/proc/is_shutdown_safe() return plasma_temperature < 1000 -/obj/effect/fusion_em_field/proc/Rupture() - visible_message("<span class='danger'>\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!</span>") +/obj/effect/reactor_em_field/proc/rupture() + visible_message( + span_danger("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!"), + null, + span_hear("You hear a horrifying resonant crash. Oh no.") + ) set_light(1, 0.1, 15, 2, "#ccccff") empulse(get_turf(src), Ceil(plasma_temperature/1000), Ceil(plasma_temperature/300)) - sleep(5) - RadiateAll() + addtimer(CALLBACK(src, .proc/kaboom), 5 SECONDS) + +/obj/effect/reactor_em_field/proc/kaboom() + radiate_all() explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows. - return -/obj/effect/fusion_em_field/proc/ChangeFieldStrength(var/new_strength) +/obj/effect/reactor_em_field/proc/set_field_strength(var/new_strength) var/calc_size = 1 if(new_strength <= 50) calc_size = 1 @@ -271,40 +286,39 @@ Deuterium-tritium fusion: 4.5 x 10^7 K field_strength = new_strength change_size(calc_size) -/obj/effect/fusion_em_field/proc/AddEnergy(var/a_energy, var/a_plasma_temperature) - energy += a_energy - plasma_temperature += a_plasma_temperature - if(a_energy && percent_unstable > 0) - percent_unstable -= a_energy/10000 +/obj/effect/reactor_em_field/proc/add_energy(added_energy, added_plasma_temperature) + energy += added_energy + plasma_temperature += added_plasma_temperature + if(added_energy && percent_unstable > 0) + percent_unstable -= added_energy/10000 if(percent_unstable < 0) percent_unstable = 0 while(energy >= 100) energy -= 100 plasma_temperature += 1 -/obj/effect/fusion_em_field/proc/AddParticles(var/name, var/quantity = 1) +/obj/effect/reactor_em_field/proc/add_particles(name, quantity = 1) if(name in reactants) reactants[name] += quantity else if(name != "proton" && name != "electron" && name != "neutron") reactants.Add(name) reactants[name] = quantity -/obj/effect/fusion_em_field/proc/RadiateAll(var/ratio_lost = 1) - +/obj/effect/reactor_em_field/proc/radiate_all(ratio_lost = 1) // Create our plasma field and dump it into our environment. var/turf/T = get_turf(src) if(istype(T)) var/datum/gas_mixture/plasma for(var/reactant in reactants) - if(!gas_data.name[reactant]) + if(!xgm_gas_data.name[reactant]) continue if(!plasma) plasma = new - plasma.adjust_gas(reactant, max(1,round(reactants[reactant]*0.1)), 0) // *0.1 to compensate for *10 when uptaking gas. + plasma.adjustGas(reactant, max(1,round(reactants[reactant]*0.1)), 0) // *0.1 to compensate for *10 when uptaking gas. if(!plasma) return plasma.temperature = (plasma_temperature/2) - plasma.update_values() + AIR_UPDATE_VALUES(plasma) T.assume_air(plasma) T.hotspot_expose(plasma_temperature) plasma = null @@ -316,36 +330,28 @@ Deuterium-tritium fusion: 4.5 x 10^7 K radiation += plasma_temperature/2 plasma_temperature = 0 - SSradiation.radiate(src, round(radiation*0.001)) - Radiate() + radiation_pulse(src, src.size/2, RAD_FULL_INSULATION, 100) + radiate() -/obj/effect/fusion_em_field/proc/Radiate() - if(istype(loc, /turf)) +/obj/effect/reactor_em_field/proc/radiate() + if(isturf(loc)) + var/list/cache4speed = ignore_types var/empsev = max(1, min(3, Ceil(size/2))) for(var/atom/movable/AM in range(max(1,Floor(size/2)), loc)) - - if(AM == src || AM == owned_core || !AM.simulated) - continue - - var/skip_obstacle - for(var/ignore_path in ignore_types) - if(istype(AM, ignore_path)) - skip_obstacle = TRUE - break - if(skip_obstacle) + if(AM == src || AM == owned_core || !AM.simulated || cache4speed[AM.type]) continue - AM.visible_message("<span class='danger'>The field buckles visibly around \the [AM]!</span>") + AM.visible_message(span_danger("The field buckles visibly around \the [AM]!")) tick_instability += rand(30,50) AM.emp_act(empsev) if(owned_core && owned_core.loc) var/datum/gas_mixture/environment = owned_core.loc.return_air() if(environment && environment.temperature < (T0C+1000)) // Putting an upper bound on it to stop it being used in a TEG. - environment.add_thermal_energy(plasma_temperature*20000) + environment.addThermalEnergy(plasma_temperature*20000) radiation = 0 -/obj/effect/fusion_em_field/proc/change_size(var/newsize = 1) +/obj/effect/reactor_em_field/proc/change_size(var/newsize = 1) var/changed = 0 var/static/list/size_to_icon = list( "3" = 'icons/effects/96x96.dmi', @@ -361,17 +367,17 @@ Deuterium-tritium fusion: 4.5 x 10^7 K if(newsize>1) icon = size_to_icon["[newsize]"] icon_state = "emfield_s[newsize]" - pixel_x = ((newsize-1) * -16) * PIXEL_MULTIPLIER - pixel_y = ((newsize-1) * -16) * PIXEL_MULTIPLIER + pixel_x = ((newsize-1) * -16) + pixel_y = ((newsize-1) * -16) size = newsize changed = newsize - for(var/obj/effect/fusion_particle_catcher/catcher in particle_catchers) - catcher.UpdateSize() + for(var/obj/effect/fusion_particle_catcher/catcher as anything in particle_catchers) + catcher.update_size() return changed //the !!fun!! part -/obj/effect/fusion_em_field/proc/React() +/obj/effect/reactor_em_field/proc/react() //loop through the reactants in random order var/list/react_pool = reactants.Copy() @@ -405,7 +411,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K for(var/cur_s_react in possible_s_reacts) if(possible_s_reacts[cur_s_react] < 1) continue - var/decl/fusion_reaction/cur_reaction = get_fusion_reaction(cur_p_react, cur_s_react) + var/datum/fusion_reaction/cur_reaction = get_fusion_reaction(cur_p_react, cur_s_react) if(cur_reaction && plasma_temperature >= cur_reaction.minimum_energy_level) LAZYDISTINCTADD(possible_reactions, cur_reaction) @@ -418,7 +424,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K //split up the reacting atoms between the possible reactions while(possible_reactions.len) - var/decl/fusion_reaction/cur_reaction = possible_reactions[1] + var/datum/fusion_reaction/cur_reaction = possible_reactions[1] possible_reactions.Remove(cur_reaction) //set the randmax to be the lower of the two involved reactants @@ -479,24 +485,24 @@ Deuterium-tritium fusion: 4.5 x 10^7 K // Loop through the newly produced reactants and add them to the pool. for(var/reactant in produced_reactants) - AddParticles(reactant, produced_reactants[reactant]) + add_particles(reactant, produced_reactants[reactant]) // Check whether there are reactants left, and add them back to the pool. for(var/reactant in react_pool) - AddParticles(reactant, react_pool[reactant]) + add_particles(reactant, react_pool[reactant]) -/obj/effect/fusion_em_field/Destroy() +/obj/effect/reactor_em_field/Destroy() set_light(0) - RadiateAll() - QDEL_NULL_LIST(particle_catchers) + radiate_all() + QDEL_LIST(particle_catchers) if(owned_core) owned_core.owned_field = null owned_core = null STOP_PROCESSING(SSobj, src) - . = ..() + return ..() -/obj/effect/fusion_em_field/bullet_act(var/obj/item/projectile/Proj) - AddEnergy(Proj.damage) +/obj/effect/reactor_em_field/bullet_act(obj/projectile/proj) + add_energy(proj.damage) update_icon() return 0 diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index f8e518bdb8b..2942350ea10 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -1,6 +1,7 @@ //Nuclear particle projectile - a deadly side effect of fusion /obj/projectile/energy/nuclear_particle name = "nuclear particle" + desc = "Wow, that's moving pretty fast!" icon_state = "nuclear_particle" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE armor_flag = ENERGY @@ -9,6 +10,11 @@ speed = 0.4 hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray + var/energy = 10 //energy in eV + var/mega_energy = 0 //energy in MeV + var/particle_type + var/additional_particles = 0 + var/static/list/particle_colors = list( "red" = "#FF0000", "blue" = "#00FF00", diff --git a/tgstation.dme b/tgstation.dme index 909c90b2aef..538ba3a0d06 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2327,6 +2327,7 @@ #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" */ +#include "code\modules\atmospherics\rust\fusion_reactions.dm" /* #include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" #include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" @@ -2336,6 +2337,7 @@ #include "code\modules\atmospherics\machinery\components\fusion\hfr_procs.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" +#include "code\modules\atmospherics\rust\particle_catcher.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" */ #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" @@ -2348,7 +2350,8 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" #include "code\modules\atmospherics\rust\reactor_core.dm" -#include "code\modules\atmospherics\rust\reactor_core.dm" +#include "code\modules\atmospherics\rust\reactor_em_field.dm" +#include "code\modules\atmospherics\rust\particle_catcher.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" From 50cbfafec76a6fb6a98465c15d3095b2219b4c47 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 18 May 2022 17:11:47 -0400 Subject: [PATCH 098/200] R-UST progress --- code/__HELPERS/cmp.dm | 2 +- code/controllers/subsystem/explosions.dm | 9 ++--- code/game/objects/structures/window.dm | 3 ++ .../atmospherics/rust/fusion_reactions.dm | 7 ++-- .../modules/atmospherics/rust/reactor_core.dm | 29 ++++++++------ .../atmospherics/rust/reactor_em_field.dm | 37 ++++++++++-------- code/modules/power/rtg.dm | 10 +++++ icons/obj/machines/rust/160x160.dmi | Bin 0 -> 55319 bytes icons/obj/machines/rust/224x224.dmi | Bin 0 -> 100371 bytes icons/obj/machines/rust/288x288.dmi | Bin 0 -> 174457 bytes icons/obj/machines/rust/352x352.dmi | Bin 0 -> 264884 bytes icons/obj/machines/rust/416x416.dmi | Bin 0 -> 366124 bytes icons/obj/machines/rust/96x96.dmi | Bin 0 -> 23151 bytes 13 files changed, 59 insertions(+), 38 deletions(-) create mode 100644 icons/obj/machines/rust/160x160.dmi create mode 100644 icons/obj/machines/rust/224x224.dmi create mode 100644 icons/obj/machines/rust/288x288.dmi create mode 100644 icons/obj/machines/rust/352x352.dmi create mode 100644 icons/obj/machines/rust/416x416.dmi create mode 100644 icons/obj/machines/rust/96x96.dmi diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 8f2d8e79d08..045664f6c97 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -169,5 +169,5 @@ GLOBAL_VAR_INIT(cmp_field, "name") return initial(knowledge_b.priority) - initial(knowledge_a.priority) ///Orders R-UST fusion by priority -/proc/cmp_fusion_reaction_des(var/decl/fusion_reaction/A, var/decl/fusion_reaction/B) +/proc/cmp_fusion_reaction_des(datum/fusion_reaction/A, datum/fusion_reaction/B) return B.priority - A.priority diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 337180125ae..0ca718862ca 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -389,8 +389,7 @@ SUBSYSTEM_DEF(explosions) //lists are guaranteed to contain at least 1 turf at this point - for(var/TI in affected_turfs) - var/turf/T = TI + for(var/turf/T as anything in affected_turfs) var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) var/dist = init_dist @@ -414,12 +413,10 @@ SUBSYSTEM_DEF(explosions) if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag var/list/items = list() - for(var/I in T) - var/atom/A = I + for(var/atom/A in T) if (length(A.contents) && !(A.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't. items += A.get_all_contents(ignore_flag_1 = PREVENT_CONTENTS_EXPLOSION_1) - for(var/thing in items) - var/atom/movable/movable_thing = thing + for(var/atom/movable/movable_thing as anything in items) if(QDELETED(movable_thing)) continue switch(dist) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9c0defcbc21..73cd11da7c8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -307,6 +307,9 @@ if(BURN) playsound(src, 'sound/items/welder.ogg', 100, TRUE) +/obj/structure/window/ex_act(severity, target) + return ..(min(EXPLODE_DEVASTATE, severity + 1), target) + /obj/structure/window/deconstruct(disassembled = TRUE) if(QDELETED(src)) diff --git a/code/modules/atmospherics/rust/fusion_reactions.dm b/code/modules/atmospherics/rust/fusion_reactions.dm index fd5346a7e7a..55ea238a82f 100644 --- a/code/modules/atmospherics/rust/fusion_reactions.dm +++ b/code/modules/atmospherics/rust/fusion_reactions.dm @@ -20,9 +20,10 @@ GLOBAL_LIST_EMPTY(fusion_reactions) /datum/fusion_reaction/deuterium_lithium p_react = GAS_DEUTERIUM - s_react = "lithium" - energy_consumption = 2 - energy_production = 0 + //s_react = "lithium" + s_react = GAS_NEON //DEBUG PURPOSES + energy_consumption = 0 + energy_production = 2 radiation = 3 products = list(GAS_TRITIUM= 1) instability = 1 diff --git a/code/modules/atmospherics/rust/reactor_core.dm b/code/modules/atmospherics/rust/reactor_core.dm index 68f9c1fa89d..5c5246e2fe1 100644 --- a/code/modules/atmospherics/rust/reactor_core.dm +++ b/code/modules/atmospherics/rust/reactor_core.dm @@ -4,13 +4,16 @@ /obj/machinery/power/reactor_core name = "\improper R-UST Mk. 10 Tokamak Reactor" desc = "An enormous solenoid for generating extremely high power electromagnetic fields." - icon = 'icons/obj/machines/rust/reactor_core.dmi' + icon = 'icons/obj/machines/rust/fusion_core.dmi' icon_state = "core0" + layer = ABOVE_ALL_MOB_LAYER density = TRUE use_power = IDLE_POWER_USE + idle_power_usage = IDLE_POWER_USE active_power_usage = 1000 //multiplied by field strength anchored = FALSE + var/is_on = FALSE var/obj/effect/reactor_em_field/owned_field var/field_strength = 1//0.01 var/initial_id_tag @@ -19,8 +22,9 @@ anchored = TRUE /obj/machinery/power/reactor_core/process() - if((machine_stat & BROKEN) || !powernet || !owned_field) - Shutdown() + if((machine_stat & BROKEN) || !use_power_from_net(use_power) || !owned_field) + if(is_on) + Shutdown() /* /obj/machinery/power/reactor_core/Topic(href, href_list) if(..()) @@ -40,6 +44,7 @@ owned_field.set_field_strength(field_strength) icon_state = "core1" update_use_power(ACTIVE_POWER_USE) + is_on = TRUE return TRUE /obj/machinery/power/reactor_core/proc/Shutdown(force_rupture) @@ -52,6 +57,7 @@ qdel(owned_field) owned_field = null update_use_power(IDLE_POWER_USE) + is_on = FALSE /obj/machinery/power/reactor_core/proc/add_particles(var/name, var/quantity = 1) if(owned_field) @@ -70,15 +76,14 @@ owned_field.set_field_strength(value) /obj/machinery/power/reactor_core/attack_hand(mob/user) - visible_message("<span class='notice'>\The [user] hugs \the [src] to make it feel better!</span>") - if(owned_field) - Shutdown() - return TRUE -/obj/machinery/power/reactor_core/tool_act(mob/living/user, obj/item/tool, tool_type) . = ..() + if(!.) + visible_message("<span class='notice'>\The [user] hugs \the [src] to make it feel better!</span>") + if(owned_field) + Shutdown() + return TRUE /obj/machinery/power/reactor_core/attackby(var/obj/item/W, var/mob/user) - if(owned_field) to_chat(user,"<span class='warning'>Shut \the [src] off first!</span>") return @@ -98,7 +103,7 @@ return ..() -/obj/machinery/power/reactor_core/proc/jumpstart(var/field_temperature) +/obj/machinery/power/reactor_core/proc/Jumpstart(var/field_temperature) field_strength = 501 // Generally a good size. Startup() if(!owned_field) @@ -109,6 +114,6 @@ /obj/machinery/power/reactor_core/proc/check_core_status() if(machine_stat & BROKEN) return FALSE - if(idle_power_usage > avail()) - return FALSE + /*if(idle_power_usage > avail()) + return FALSE*/ return TRUE diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index 29e9f00b8ce..44b86fc0279 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -34,12 +34,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/list/reactants = list() var/list/particle_catchers = list() - var/list/ignore_types = typecacheof(list( - /obj/projectile, - /obj/effect, - /obj/structure/cable, - /obj/machinery/atmospherics - )) + var/static/list/ignore_types var/light_min_range = 2 var/light_min_power = 0.2 @@ -51,8 +46,17 @@ Deuterium-tritium fusion: 4.5 x 10^7 K /obj/effect/reactor_em_field/New(loc, var/obj/machinery/power/reactor_core/new_owned_core) ..() + if(!ignore_types) + ignore_types = typecacheof( + list( + /obj/projectile, + /obj/effect, + /obj/structure/cable, + /obj/machinery/atmospherics + ) + ) - set_light(light_min_power, light_min_range / 10, light_min_range) + set_light(light_min_range, light_min_power, light_color, TRUE) last_range = light_min_range last_power = light_min_power @@ -142,7 +146,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K if (last_range != use_range || last_power != use_power || color != light_color) color = light_color - set_light(min(use_power, 1), use_range / 6, use_range) //cap first arg at 1 to avoid breaking lighting stuff. + set_light(use_range, min(use_power, 1), light_color) //cap first arg at 1 to avoid breaking lighting stuff. last_range = use_range last_power = use_power @@ -259,7 +263,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K null, span_hear("You hear a horrifying resonant crash. Oh no.") ) - set_light(1, 0.1, 15, 2, "#ccccff") + set_light(15, 1, "#ccccff") empulse(get_turf(src), Ceil(plasma_temperature/1000), Ceil(plasma_temperature/300)) addtimer(CALLBACK(src, .proc/kaboom), 5 SECONDS) @@ -354,16 +358,16 @@ Deuterium-tritium fusion: 4.5 x 10^7 K /obj/effect/reactor_em_field/proc/change_size(var/newsize = 1) var/changed = 0 var/static/list/size_to_icon = list( - "3" = 'icons/effects/96x96.dmi', - "5" = 'icons/effects/160x160.dmi', - "7" = 'icons/effects/224x224.dmi', - "9" = 'icons/effects/288x288.dmi', - "11" = 'icons/effects/352x352.dmi', - "13" = 'icons/effects/416x416.dmi' + "3" = 'icons/obj/machines/rust/96x96.dmi', + "5" = 'icons/obj/machines/rust//160x160.dmi', + "7" = 'icons/obj/machines/rust/224x224.dmi', + "9" = 'icons/obj/machines/rust/288x288.dmi', + "11" = 'icons/obj/machines/rust/352x352.dmi', + "13" = 'icons/obj/machines/rust/416x416.dmi' ) if( ((newsize-1)%2==0) && (newsize<=13) ) - icon = 'icons/obj/machines/power/fusion.dmi' + icon = 'icons/obj/machines/rust/fusion.dmi' if(newsize>1) icon = size_to_icon["[newsize]"] icon_state = "emfield_s[newsize]" @@ -395,6 +399,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/list/produced_reactants = new/list var/list/p_react_pool = react_pool.Copy() while(p_react_pool.len) + //for(var/i = 1; i <= p_react_pool.len; i++) //pick one of the unprocessed reacting reagents randomly var/cur_p_react = pick(p_react_pool) p_react_pool.Remove(cur_p_react) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index f2772304f23..64f1527b1aa 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -107,6 +107,16 @@ SHOULD_CALL_PARENT(FALSE) return +/obj/machinery/power/rtg/debug/station + name = "Debug RTG" + power_gen = 400000 + +/obj/machinery/power/rtg/debug/station/Initialize(mapload) + . = ..() + var/joke = pick("Singularity", "Supermatter Shard", "Tesla Coil") + name = "Totally a [joke]." + desc = "Yup. That's a [joke]." + /obj/machinery/power/rtg/lavaland name = "Lava powered RTG" desc = "This device only works when exposed to the toxic fumes of Lavaland" diff --git a/icons/obj/machines/rust/160x160.dmi b/icons/obj/machines/rust/160x160.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4d1c433dc5d41b8a16df4fc90c310106ce8d9999 GIT binary patch literal 55319 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 Lyi%@Hw2b^8ep6H% literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/224x224.dmi b/icons/obj/machines/rust/224x224.dmi new file mode 100644 index 0000000000000000000000000000000000000000..14ac5100a9ab0978ae68a4700a63f01f98b407d5 GIT binary patch literal 100371 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	(yOHUITnfTEIj) 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%0D0CH%G>PyU7)_9yK zgMwJ_m{mbs*fD1}Y`aCHuSywkf$kP2&*w{n0dWKEZYjs<YYIsJ7Yaoap*c~|!Os-d zp8F2DH<rqt{g0ywJSXpu(ntWveM$dI_xo+7@cVZq{rAc^fp?XK34XnMk3UnEO(STI z{Ka|NyeP~NjSX4xv=$oTWiEZLxDOq)@1b)1Jn7vdKR4B1-*chuBo-i@3seL=@I=xd zDF*&y<<dJu-%(%hwt~qMQhZ;j@kssPm$AIQ*WKzwap5Or{@*qAL(U=08<M`FV6r&L zDb~9z>F+4RwwY813TAdsNr)BVaQFeJ1b^dG<qGjn6n#yQ2iD|=-Tfab1+x2t@J$lY z+tN5;k_&++%6;c)ZmIF?6ZOOU(KPSdbqE2LVIjnx`_Qku$^rrl(?U<ss`5i>!*%r| zKY4fjXIGT496=T+Ir~aWn1BT-EyeoZCwcB!_hRnXe#QcHh+2v{x~>p3yze^-;U|T# zlcayBTy**qWhCNb<zm&i7`*JD&uy#`k700u&AC(-A}(U0;0=!zG)FG)RKX8!cK6y) zq)oYnilsYm8xk7FF#u)>Nzf&C#h^quj4P$3>@vjBL+0ZJrSFt6_c=I~27|)pYKyP{ zD<k;x?%UytXNrMFNWvT;DppM(@B`roangY9W-*>u#h6-9PwjjLaH6dLNfB)F@4lya zxAznZ!Y##mV}H53$A2#A-%#J8af=V(R1;8LXsy}r9Yxd`4)=+2jX)SXX%m~u^aqmW zsZ_%vxr|M<q^dS~(s4M>^-Id|bSY~w5|Un_T`8F4p3-7yF*8p?={?sO2!f%{c}A+* z{9NguQg{5ZVtj8Z&<B{0beOr$3wOWjRuK&;tfF(uB=@P(XN`;Eio(ZE`%}eSeyWVR zt`VQ)@A>jXZjl_=x745O?gMmTxvX$80PWpV7yv8X|KC*<!MLQDi&U#&9YN3*(l=Og z&0C8e7v1JT-LTe41tX<lNeSyx>T%bu<J_sTA{Oo+k9VlN_tf$LYXg&aKZ6SlU$YH= zl$4W}<3My?RmQ`grQtjv+AJYiJF<muAGNja@hxR#krxW61%CpOV0RSI%<n6fPT5sh z&L|2FySlJ*O~|z_*ZL?v@J*#=`?k_CeMt$4p;3D=ZI(#d>aOEG)!25ecUG(Cw61Z+ z!e_|ptj+x~Fh-KYfv13#sXzf?;)f-F&<VI{)t>T75FYhQAP2!@=ajjd9!-gb%X*xo z5iqAfX$b2lnVJ6pW#Adcp6{f6<H0tyk>iJwNrj|)-SN68HMMj>RLKAHMY#FT6$Ncv zQ(AFY|E`F;aQ1g)&Onz`nAz&~{Zl3UO7t;4=dUUe7my;^Gorw?@}p0?c@(WbA4&d1 zf|5qUJClw?t|Wrq^9ZG!^SFB4<#FV85(w0rW8=Iy43Wv?)%7XKB=zA!cOJ85+m8BH zqibJd?Nv;Oqu|iD6foOG#YF#>0_WdX5Y~4TRvG@M-&6SaKGop}PyzsIi271FhV=t+ z;7|Ck6#m6?N`ZE<dyajDwLtPO{u9Ol7-F8jkv+#rF?+urM(RG%+FXP5`G_EJC1R?C zhKcrrxuJP_!t=UjD^;i2oHoeMy061|WA1x@qV&^{>$#^49$_4v`8bW!7ehQ`mSCLs z+*xyo_4Jk$w8R>i*LApXG<lx*da)E;_@R({upSBa_*3a0kI?pc?=;C={7k91-%{is z-d6S{e3KRCQBtPLLis4ItTDP|-$$|jj?(`}y_ctUK}Ya>6i<As&?@}}&+%wpcWXEw zkmgso2iu}7K!@Le4!A$LZ7f0Ja1EXGsZx{kV@!%w+s{DPV1|~qIS*8NR3<&|`4q#x zsCd6+g$8<GA^6@>E^>?G7~kJS(QjD25URsjJc|<nK@Ci(C56zH5)!(mgp8<5darw) zCFS_7DPg9My6eB(cuycA#@_|itTvDJz`J=E_K@a>76}AQVQ_pW`*xi(E|yLjitKX* z?5qhvluW757$}s!rDT|2QKq+0`xQSlbz>2d9#G;6tye1<YSTH+nYYcNH;3uT!Fxw- z_?9_Ar5oOv`LLxBoUE%!=|PI4e_xS?L~Tzm&qm+TU+c>1EmB%KtTJ&)nO4L+UF)9V zO7|Q@qT-*Ha{d7^4xuNnbDq{*Jm`~tz-ZZ0R?R^OQZAGE2#n12q`kbbdoPR@Pcli@ zm3TW$Ny_{-9J&`2FNrmWrjE%E+yaB6GqH3Cx`44G^*!mbLS#cQUF-L({j-j>8WDDv z6#Z~pv5p`9h8<<SKa>y_)`aOu>6cqm!o>8;YWXIR10p)Fh<>}Hs8GM67>irVV!uR# zUQ=3oF#Kf&5n@pQkJi?jLt~1?QTo3^O6;oyUg1(H2~W!Kb6^!$qE?j!zp(_IXc2_c z$*tN&H;2F68iBE_E9=R=P$qukiy{G@D*gDpunu8VKw7JIe`%Pu=Ix_JFlp#zT``Xj z6u!?^yQ{wS>h2e4>0eMNgRGDN6JA%Yo4Ko?4KMM?Hw8d&bx>jGHx&HvoPsaBr~a5t z74z_G-RD|&9XYu}t%Zin+vYJ4=HaD7<BcLEr2@rrTN7ol3v{-kj5yx6d-(5#3czDo zfL$VP4NWC?iiG!l1+&Gc!Z}zA2s-kN5RO<fXaY1|+;L@??>ul!HJ^{$=D7y~<45W{ zf3eK4aIY)U6aIlh7&>g_{+%_2K)bIL^xil085$@s1X?lw{Xju@H<b~fSCmD7FDNJI zx`JUaL5Cm~hbB(is&G3l>{y?NYB=l4bP@#mQ^kAI?*t&Yh3QP{EDAs=tr;nwm2@No z#AC&rJf~ptSCj|@RyO|OXX@wkVl9J4cnw_d?^$zUs1Ii;O+(iJu~E(FQTLv|P)7Q` zqsaRsfXV&9xMGOj{#|AI2yOuwE;M#o{dpuM<cUHB8bN8ZHA#P4(gzB9`-MFRRv^&) z<L=qtRt9cyZfzcTQuohND#!MZDVQz6NQA$;!JJ3&oCnI%f*wf=55ua)-BbU^Q@~E# zP6|_a$2im2P%;=8iwDU-NZx5wJ-DG9Xpgvq;40K0r9i3AH1D(5eXaB6xt>PUC&3j= z-l|nzl=QDi`u7z?wPYWd5(GjN;}vCrU9|U2^(|$>hFR-QN{#fdcmMYt<+^~6mHt6| zW<Y2k**kia;H-Y0)t5&ZC%5j0?m5pmQRN230v{j{3v(30Wh|JlQeOc(?dI=X6Ze6B z5pb84{yr&a^i#zc@2DRUOv6Ijw0-WEnb+^sVw%To+=GO4_u1Z7f5mnRRsXRf4d{tt zZeLbdbKg}UAm<dq<{ia5-R#aGhZzfx2x(u240Og9j(%asuPNyDV+F1KN8SGr?DrL= zLc)@8tXj`}TvHY(sLcx*oV3jvCs)2b%9U%D2JXQ&P`vD1#?F0%lX9=>4_sI~sQ`57 z#i2=(Oo2(4mFtkfK+vW<#2oWi>PMg9gFwsT*;^g&?I_IIj~$m_r;3UHsj|>5!VIen zA|k=_e^)rf@iQRU&MPf4FWAiL=0tb`xlnJA{26yDQ&Ik^Lc>+JpA{nTC$NkRsVL{w zFPSz^Fih>gdHQmmadIoH3dO3SdNmFjRxU~xxmB)hy0z_*$|!ATN%+xtXAcvHUYwbL zzCbIFl?qL3$sHKK`_h1_yg$aCYu0nu^X64RU1>&OlMaEeh*f5wCzfTqpny65mJ%I7 zfuAY_(ifG=Bc;rEUsp=E6tq`;rt}lJZSN=qED8#c>O0+kEhz-<*VI>1Sg2Y$tZck4 z1$5|qzH6XL^}W{npSNu+UsoPn$PuW<yk1m*-OF~;AQ+es%*h?(YYHulr9RLmk@Uba z4x!;YJEy}DTpo5kOY<BfDu+|p_I<PN>;I31in+g{Osd5JjANH~C(816caM7tC=`b| zMVu$yJ{HHkYxi~tXQ{jQ6(!MKRWf^?jbgN)Dbg*b%A|bO0fg|p3=srBv<!=<q_|)j z>(6<Z-xy)Kqr9F^fp6v*`v|f2=uYM;?{}ae(5b>|kTM#NU>TIVv(V~Xb|L1%aH@EB z7|yCP{RNkW)DJGI+Pu?BRXB!}oH6D+uaCHO9?GQGd_}or3<=m_+_~<VLK%|M<=_eJ zYl;diD2Nx85V@y3cwZdYF&0}!_&ry^ugjAD4<+hC<n0wjU=54pvIH6nU=y^|>YG_@ zkqW5P4@h%F#x2mH|AfCweP|PbPYF1mx1d&RpTytUY>P~U2X;Y<?<#Z3Jf{jt4uir0 zkMP`9S{jx3T>JFn^;tBqe-`1*V%i>MS8;BvjtwQu_DC6Q@Q$+l4~_h*hf2r=hc^nv zR}}#>Ys%%Nr04_w^O8cN{YMI7Cy#PlAzZO|t|`Xn-&FV_9xI?BA~}I52)+TT#Tu=B zi(qlf$fH5$)#&|LYfM%4SIEcD!J6Zp2mk@4z<&kwiO+$&%nJ&}NDvcn7L3#({e}4= z#@fb>_b=|;{@~HbDQLuQ6-zm1@jEXmEDn&C74_$vM|*O-jtBF8s<beNtdqL!&*a-j zQ9%7XkATL70{=k?J*O<bzp8-#*CqXZWz`r@m3eIUL_t8X5pjw@LZS8aA)XV|$Jfq$ zAnE^7_~EH4^gG=%ttb=U>0?|;Lv@jBo27Wtj;esR{<|VFEkC5}n6G;%_5I0iMS^z0 zS6#U#nDRs`KzLh}0Q3pX3lZ^%iHiVpZDy)0uLaWtHf(jeYwbgV&yS61HZ9^CB1GTs zgAB8kvfLIc8nYA%@Dghs-ct0#C583%$F`4}j8gg^h{*era;1qCg<!j;5Ma9sLRwOW zS7S-;b?2g)ezSX))$U#-NnciK&exPF99I+q0V|${P(ZNMl$2JRCD?|}Z;dsK*DY6w z4TuUxzG3IG4~9AE-tn?R)BjWTR{-DB;YhTxcU*XzA^d1C6#B*81qiiwm9%wNS&aFa z(gz5%*9t(u3UWn6<($`{fVx7=xR4gbxDj#q&2HZ>6mb97B>k_7QfNSS1i;+4YuA;G z7<2%uZe2k`n~JJU|Be!waTksAm-9-+>u1V>_yhp{mQs*YgaCs9UnT;V=k>m6Z4dS1 z*s*yPP@;yV!*s!z)c@lBDb5Ze0l%#4F1kSUG#t>cp+KLx+oJLSU6}0JHbl9t)UY5L z0yfr_PG=&|DAVN{Xcbygd$1}2*6U|!phMaY?VxO9nMr-vc2}9#M|2%EHm`KwKT@s^ zaiD-FsiZLN?)Nv8`ILW8>B|9H{em)NeOW=6ch#?LiH7@7L41E#ITl2!Z7C-$6B<kQ znzEiD4Sxqhr)r<Ae)nT)>}#DrG}b&T<ALABA<KFXm_LL|z=Ge?VQorgp}2Ws^O)d% zT@6bGh=_Si(Q7Q$9mO2;KDnw)c_3W^M$Me56_+a1#WTE41=L%$#HcL7_qFc$*A=dY z`wHaamOcCB?*5OJLXXNT^ef5~$}C0y|4w(_y9&QQv<Ymt)%^#>tlhsV1>Jo~A(U?` zi*8Sp={o0?fg--3HYkm^)>wF3qyj2?pVmDpLPCHGD2)3<;fc@{0gnX!T~;VC+e&&J z<JWVyMOuJ#0*uIgRQMS@4FVt8HDw`QFnq#>TTIahr4@!PwFhqKxrcs_wSD_$(A)t$ zRR;Ya7|tt%2yo&}g|z`OlAJ3=-(8mUuSxow-M;_A?z^SbPH_^eyPgO&tjQ}%qJ3K# z{6Mi}@+*DePV(aXeb&4GYWV_TK=ZUZCbPy!>MI?dC+d~tJ)#)mY0Vqba#j?u^hb*M z_ejwPK=z-hU%d#6@hk{FZ_p9`CK^f$meQ^QEx4-i{i2{!^uQxsy{}rz=TTe`i&jAW zTr5)HY7|JU6O^`F%G#3$N<Oop5J33k-4#QQGnNR6+z7>=N&1f^{U=Jqfz=%DE8Pd@ z)DPw(#S3e3qDZi(j2q{`S6H`^u|=@pdhoIE_No+6|BYYHA^4$txRS;gA}8?wEqDEJ zTNzV<OXj;>KY29liRtjz0?-!aqzyUaVP2TAFdxE-s~-jCJj7^R(6$`)^AO;W);T5w zxt~v5{@*LuVBz8vN0>|$)*2Jxrldcy^WDF>rSKE{o)VIKpkQiP&eU<l;`>DDQ}sn| zzoA?O0_*&uQuFm-q??NH@K(Pg%$e{^Q0cI+8EP#eWP5BJVL<dT#0F&KiRxIUtyMEt z>>Lj$g3(-4^z&Usf4P-eA)SeII!hrHx|=E?TWYql-kp^1>}3T}wqW%5i<#Fbr1b;L zSZTKUe=6;@+DQ~pKi})N60PaMc%P~7cbC$7+EOS!ca)Iab)}H}PWSnNf>zfRFzScO zWy5|?(yw*j_#UAzic4JX&cCdzR)b#=1s0_hUpsS?XjGs-5GSmtqek){M*($yzNh{* zF0?u3wLamI6!NCB4ofBx!!T7S4$$Yif_H5z6t@jUu+Ts2j)C-?s4WTtmD&u=10oQF zt}S5VK2};#K!EFN6Jbk$jcF-k1URn-Djg<H28wO+AiZSKL>XZ>RS>}C?l%#MSYX>q zhP0tvpq14OHk8Y`>?nlQKd;c{FG%{Yl>stuDS{o&chC6U?tUaiGcie_AS@d#wDuEz zTC92|y`NLB84_rI{ygJT@8^VuM$g9`>-E3!o3O;qj)FOQ9ZZPS6Q*6^azQ+mPG=>E zhVpr!4Ew*P7-x_A#FE9&_o)(c@&FkYbC%j;<Mcd4Yh#M(q7+bC4Y>!^z#^jp5RttU zzQ$Jw{Qs76Me-ZnJ3LV!1UDr8Pzh)LZN&oC2;ARM^f$1v6m<0ODbt%Cs*f&6=}Sb2 z6WMxBF?PHsL2X$2E#BJVg{^j61(a`;e&`KBRuv+~K;3)0)jLtYW-n2>TM8)oiNa!k zp@@&bSo)~@FY=aWz3W_UQ37ycACD4~GMW&9!O92}?7gA%kui|Z)fXf%unN7j2C5!! zo!=t57J;?e(6vAwL+w-LI%O;eLYl}k1rcJ+Jhgq76oT!UVqz>Q7uNir6_ett3c<Rg z&}iwaJBq%(sjw7D1pZ8YhyI#k^0gMZMKhNAsRt0kQLy-V#%oNWkq$>W!gL*mZQbKZ z_l?B^6Fg7`EJ<02;ko+%3uGgug?Sd53mhyV0+wL<EB2cux=0u&hxEMKu<=x>aCp98 z{cqX#P(+|Nr^8B9tu~Lf$TPYS|G5%cBU+PwVw<3oCkkQ5oPQ|ke^b!o+ub$)V|T9? z3i`R(-REOv(Sg6IpvM=={$^eg6$%2z{GBRj{ar<Wf26|+=boN~GT5S#F@Yxa$7`s+ zhv={>g$Tl-|MhyQEO_8~x)bG^i}#f)bl`Hp7w_=?!lJJiApkwv4lRZk15RN=va|>1 z?<pqentj0U(bzc;_zvbyRHHOogQ=a>8qi9BmB8x$N`yd7>?apZ>I-k2-M|`7h}XN{ zKT#0FUsX(s&2FDtF+WpUkoOdX_)SH0+kry(O%?rrT>;}TS%F&KQ@^wj&xo@f#z!)| z=hY#IswLQ(n6n6QXng89>?6p*HPSI<$H$p--I67=dRGB&Ri%hVAACo#=<{he7dTVp z0@Ifju-u<2l@#|Yc^zLVb3F-&xukx7y4430_W$<a8m@7udT2bP!+kxE0?IWWY3XqX z%u}M5m(?!<@8`YO-Qzt4ZGK|^abFpbcU@uWeX5|TYh53HL!qdWFZf82NBD`7X|F5h z%#Rdwijo3C16}j(D+&aMM1SVE3&09R&eJMg)%`=f)6d;2*H!DYUW346Z9nD{W3Zy& zH=ihL(K>xzP>g}U??Qy1v={*hGekqKmLRz^>k5bSj^d@(lmQu@uZ6WiMCeqh4WP+7 z)ANrr<*~u6gVrLz7W0!Gs|3vCWZ$yVqVj7gN%cZOFa&HMFu$iPuXJBQOgQZ6Tl#EM z=@)#Wm_(kJcR``K0{M9*7gn1foZGEeG*ePpyl!h{Z2sQfKP}=JQ%q(NpZ^BFI<ViI z)0!8YL!irJ^?iV7nv|UKIZ>bUK;evE7!jVZ`MgEJd8+W0Kr?(ibR2;Jbho2~;&^9P zF2J`2UCYjC3ArKV(SO(LkE4LLn$N{&$~j7q7d|wiJ%N62DEQOwDihan$y`#uu*6hJ ze<<+(vI6q_L`kDWfj?I$u$L7A^QK~qn2YDsuS+T=T1Im^1BDst*V<aN=KII)<L9^^ z99}>~^^mf2UNH{a%G^v8rneMh@Mp?sWoQ_*iB&h)*Lv?`w-X7#&KKcC1p#8&5Tt-0 z#0gJz6DGc=JV2P6N`DNKo^6O3XYv>`9s8(k&(cI&L|Ct3qO6tcCf)mNDhS~d<+3PP zw)DYYQ&=Lvn-A2_jUiv}oTR_f?fY0^{V@(}iV1dAVHsXgKsqGyVj0$aFMm&%9(cZ| zxX}Ff(8Qcqu#E{Yj&U5NgAc(OQYO1|-BX1!!TbY)_mBH2c&}E1_e}U@<Hq|NlJ<9Q zf3Q1t-YaO%l>GU3lvbbAM^g5cxmOe02SVX~?&Hu^>-TXLP`{tU-R_U~eQzsMkI2b= zR{<|RR9`9hky5etVjdG^;dl@#;M6ZG0yB0MeS1gAlThYwbkFptd#+mwq4&-1ya(NV zsRc}{?uDhYzbYc$TH{gA9pjlpziB|THD4QKre2SAOM&rQ%B9%6a+9wC>k;-21^4p6 zPwIbPbRMA8A2jl+t|}(uJ>^8k|1ecd&KpXm#eEPO_$ge#cr@D3U=1<Z79q~#i<rj` z0i5JflIr?l)6O}s9ALuL_Z5?4M?s_)6gf;kR>F|LI%uX>yYt^sKsZ<eL^|$u_q?f$ zZp805RB(VsUK9->;ccG2KFYa6<H$BB1Hl{2B@cX|2s!f$Slu1*ybFo$Hxx>T6ZVj> zYr&&0+s^F|780R0)*68@Jde8<cvpNboDVYxouLn>>aW>}pLAZqchpZ6YV#<d?01E* zMZZ!Oqn3S3A$&-gAU~P;f<nzA$*f^Vv^2bjx%GVoE&o*gDnTCHMr9`a%p3Mi0gCEM zXes?Zrkv;349&?|f^FW9%Ktkeg{6ydcKX4`ibZ{;JNHi4Kjhki?6~skW88|yK2cj_ z6sXjPKY3`D_qeT?6uSy*g-~k-mB5#6#pH8;6GX|RBgJ4yD;<hN^VTB7mUUBGB~Y$g zYWxPO^hrazq=Y0tRuCCEd_caB6@<$Aeh4IpmGWw=K982=uqCTo|4>QLloWcT!v(G@ zQPn)7;}YMP@Ef|uEj~V2C=dsXf$JbduT%l-;$@h89=%YOup?@%Wf`}|@vJoF9Rkmp z2T`I@!rcT+5djSR={|atiB{z2Jj`+)COag+TJvI}`NsgrQ_AIysCtCIoqMv>7`0xd z6i&Y>=^rX9JxK}G;b-4eSe6uA$ET0GhV}m*Dc4Em9pCP@L5EuJ44<ySS1kp0Xe^|o zjmxa_5K<`o&>M;t7B|r6M8VHkA;=3CpopTRO8w|=H;i7s&my9)7cBr`KvLrC2m_X$ zA(9NOl+b?`=R^y@8OnzVxN7$w5`b##t3t8m;~8V}8aUP>U}r|85Ul9%{iXETOqG@l z(PT6dY%g@@-&a_EE8V`UijZN5`qS=zFDZm1lj;i!ONSC@F8o@ARJVr+Luv3MP5=NP z07*naROR;&@y$C{{_%jD77-HSk5x=!H-g}4_rAcQz@R&J{;tB}rYJc1U|v;b-~OXo z!Dp!r1t*~l_^JhN6>_X99W~N$-ZY1?xuCLt5ele37rA!S;-%c1L%J&0UstBX;9LK0 z*H2$nSa^ir!^7|ceo2u(ds(^gHH`>VeC?N%X&Ij?19UdkxAu58-<JANwZFrVFqlWE z4V^#ssa7D{9-!tl_EZ^hO)82j`%89TFX0FLxv<DjZ;MQWkdi=PK4>fFl(j7{Dm0*b z-T4>Phd0sEaJ&;41Y`%p<M%uS>5*zJ!W$#P`hKl_V?t0m93;Xs6YfmNJqiJe0L+X@ zMe$yghIQqlrV}NkMJ^$Q1}Ni2DEB4xwaw!SKR;)dz^m5|3BRG^^;`rR)~>@NE4B|I z>F2tp3ef_IT~YKC!ADmWzSKWa)?<A6o~Mxr@BiJwpmi=w?Z6}i#Z#q1^`82{FkF96 zSqhIFU3|y%>q+3zMJu2%Nw@A%zE|uxOm`!1si{H$5`|3xco3Pdbm#v>!N<HB5qY#E zr+-0NP@DgKqzvj?RtC4ct#C{53@9Kqu*?;bG5=qypT~|3(O?UCsUIx9=XMX2cb*a7 zGA;?y-LRmcOZVO5pO^al-TCsuXzo?`0BJr^A1a;8TS{NlW#z)0tguWCO*)YY=Fm(n zlhzV~9<AulIYx*o=eLMWjeV{6mkw)bt|?8G&fbl34mCVksFdmyQbw>*S^cJhS)+AQ zM(vtXNU#*sQzh|{6EzgUIo4XjY3TZ+5Z=5W`T|7(e=rVphfiRJEB5U*Bq1_j)Atm@ zj{G@%s~(gf>2!tPKy&|?*YSitsQ826r^s_<cralKuS0v42|1n35{7E*TciT&3M2CY zpB{}O@y`@<;4M4Gy{{{C{9H)BtKeJE3raq|_S*{O{w?L=w-pvdID2j_zE^(^pnB#k ziVN>n`(hq}CmkM#dftJ3x9-uRL4?+t61hVWLGU5ufIe|~ktyIXr_VpoMDhpye;3kD zEC7o$p2^6Ehh-qYt#pR&DJ>G5pyUD`C>LeDs{S$~5E@I_VC^^|vRw&c7G&zg*CIr3 z^_}ZI*yjYuAg|ePm^cgBK2iEQFDnUTN$H=!V%}Ex_V8gj6ML*IvQ0=f!taq13S?1T zo?lAAP#I4pFyEes@y$BdiO?CN297&1z{Guw?{)7&@o}J+3(5*RR3d_q|4{vfhz}Iw z@Uww_I7`j7Wt1QHmlJ3J?CV17L#1E(K$#}9Z}&&>B*<#kI1bU<kPwvmeS1^|6k3D% zdXzX3o%jHuKwiJAT)0UIZ!Re<nQi4NF87tu*95eon18D~E@fUc3I|E^_#Q7Rg<q@j z%oXOWeXg>tfqnDPW$T)Q@;yYOAaS)Gu;(rkRqK42X!OfU=$UbGCDyCWyo5m)rF<^h z2PpL=IB5_>o&8WzMI8YLJV!B9hz&u(D$b7-ljporn8Eyjw504HCOOYC%ZabDJ+Bs8 z&vjz-2?0TP883u2C6+u$14zZIy%QuvbSXY6Eaykc{`6<`h)-vT^bwQSEx~HJ*6(=; zXcn=}D+p;VD`jf?$yuAKPc%R>z*<z^LBo8g^h3bh2wtLI>Ypm-@u>>GjT`S@lC-jO z`-8g!r?_C@9f8K(C;wcDBH%NF@x!oKuaZ`MZDZS2_`Plg6h1+PDYwKZQ0@P9PGQAu zC<}`N@l6%<c2l7stte~9;&-RUDpA(-`L06f)wKlqZ;SzavP66PyYDyl%_HRIq1hq2 zJ1E=ka!@&!ZLd3v5CdiMR0rnPw7VZwb1-VWooydrXZ?Y9do-TZhXD2!8u{-ltEAI; zH}(Iwcc$HOUDug@t3VI{!AX=9NV1$|C+@hD?*0w@EB>kGx9-&+k{;r8B0Gr`(-KUP z;(&Rm>JR5W-0$5u_f`P}hyv>FwQAL!hjY(+_PkFNA0F91rG%tlau3xuXJrXwV#hio z>;s`H%g}kGP+y*^J?H>V+MEx|fOM=73S4;LSR&dUDrUGw`<2Q-jugr@ku+fh#|kMH zrhvws2cVj%p{u=W`+fbqOm7yD9hirTbPw0`dH#`t!67UWw(TZU`tellL}>=GYh`>! z(+=jB8G#h-Ku{H03tGx6g_)3wBp!Trr0@euXTMeU!RL0I#rV4V(}xP6^nC;xsVz9; z1Dq&QknqnT<j^Mc6|RLK<#7vA<ojXryQkvX@j9&eJ*9~3M&PY6I*<13V`l2veqJoP z6)*Rvj6u#pkfN>7>L@zl!uFRce)j_vvoTX1J-7F8;p_eTU8d{dvP_^-d%%Q=AxV4P zMIWgCx!L}e+CDFLY`d>&)wW}QcOb6VvF8DyD$A-YXX=tzVL-V9A@NYH{+>NE5~mbJ zeYsX9!q~|(Vj3efpEX56V2`TB1iGpSHj+JKjyS9Ne7cq|^H-BX^E&?wFsCZoFu@2g zcuaXPJHSnU%ax4KgpO4z{7aR(pV#I8n=v_V?tfBX1%dLON|`N8z(mawwGG2SYF||` zA#W(c*-zA-B-a1EzxMg%=f&Se1yI_+qt5+2pNN}z=GM}&XpZ>oz~v)_z>vwO3)@oZ zldf%M;#s|vqSEoRFsP1g7r~t;px3U!nC#yLrGua$awew=?7{eO^Zc<n?y<s0_&_0u z<ZqhW<WlG|O`xd2&Iog-cN5&M$^gWKj|6eRIFR6W6=qUE=1Jw;qs#nKTbJ5Q)`2Ru z8-7-!_c1{_H=W9zzA$v|hocupF58z0$2-sMd2C3ZPDJ_n_2_6&mvf!}i!i^wW4ajI zJo}vqdh#sR21?Cki51h=sfzjPI|Wm8KLY~+z|8}~!jSpkGh^VrVT9o7L`Ca)q^SAo zeZ#BBU=n?!@XZjkh2T|VetFw<2%ydc5elV<HDDZhpcug2G>4Ui_aQ1Brs)=zE+XRd zP{le!U1UtN1pDRZzf26C_s6rKePvwcadTqJ8wzU-!Z%EhZ4?uDqiE}?O5hoMz{{)U z_PA8KEEA~I29I=>A-NsdeGvqAtgBs#AD`H&N<-063FsKv{oF*5!RO{Msr>={Icor% zx8eJI7d&5Pyl(eLW5GY@zJe}-fx0u_8J$z@J!mKCY&p5U|H}kkALE;({k8R}VnFiB zF3hHZ8TqlDi@6=Z68wOq$~U;9`m-$r8SdO{=S(mQg;L;wv=4-!dusbyVEkxB6kqV# zyl6n)w`nKuPuDGgay_riM4l-0Nb&u_1j+GC*_MTbT98<cyeI)l;IzA2u^=}$%a$*K z!M<a<1WYIkkGXH;3PKZwdEMXnj=~~^kjl5&S6C9hRIv!+s>wK)=IamVq7Pz#>swDh zSLr0DX_q%14@?JiP>|>6CBc57VscTlK2;20bV#&A8tb9m6N%413^XfL+rcQ+8~Z%I z2><t5l{~BaOws&mRY<ZK6!T4=1lre8e6Sm*V=uz|)Umw}bbb5tfLa49?MIpi{pe63 zMN)q1N0syj*Y5tH;se81!FKMwrV;_j%<%8~_#&h~@C@r)Pq$QjCs1Z4QhUH*-CYml zwqY7(vRJenQX&XSW6-9(JT*XSe<x>jHAeU`1kgP0sB%2-&Af_Z6~^a2Eic6HX(oN- zL1*+eEL>AN=0h=fk>7bNFWD*rlXD9SmMDslyWiD+KAXlHwew5q7x~$;B6BJ9p~bLY zu$(l(Y{p|d9gR*gQRK@=Wzc$|HlU^|QaX*auL9VIYHLvLVD(@Kzm5Yhn`E-Y?54{6 z9)7;lEG9Tk%Wk?N0xY+i-xKmWsPmE^i)2<ayL17ukNM5R(E6BQO|z>3rzRCrs*CUH z<;~Cnrz!*ZYei-HS9VQL`vAB;w_;5~UKDzp65@T3;CbErM{#=69p2fo2w(UMJqU<I zc%q6Kket!E_L9H(Jf_gg5I`MsjyI`Y+tjb)+M)Zw2@<0ZU_SLav^5{SKc9aOpAT=f za;z_(hxw^vdlw$hgICsJcrFBRPb@C1qe<h3hdDl1^dT>9!fX(<Gh=#IqAp$dyi6Zp zmwL)Jv>Tu37C`K(y!@uhED4xp03>sqIWPg9S9xF{tZ8~u8-Q7w=rY6Pck=aFOt40I zKS0ItTe~MVc?M^x8+f(zYx`>V>H{DD^D@6#KywYE2EZB!k;J9;z&lY)bURg;(D7B_ zbZ2G&0zd#Jk&g^eL_?m*KUzTAk*dY9rD!)y>IjSsW`9=9M1X%D6V^KgzFeS0x+fsS zzncqnH8+Gy@mD2)D(!c?*D!{42F))M=Q+dj6sKAJ!UbQ<hJD!c<$0Okc^KM71yFzH z14U#tR+mE+ykR{cxCm<uMHq;5f2E@AeAOJgWA~~uzpJ3jWPoU3Qh8`EHN^nFukzwV zRBfq9qJL7D7<}$Bu8U^KM<BtQ<4GYvI+fjbs`hhq0k8%{>FftM55uczfi(cv0O4SE zAtFC}jT~gPXU^L$0=~RH57V2)5WAN1x@>tz;YVP~qkR>jYE3csANhdH^zG4Uvg<xp zXnxr|yb$J3ry0)!4s$|0?MB%BLlqqUsAv<?n$UU>ETj+^Jf-GNTJ~?7nIPMpu37-i z7<7zebEcn9KdUjvKH?hAI1zNa#+R;lzX<c2g~b}S+y~xw4&QiRZDA5C)?JnHngRf? z6&V4aD<W$>o$JpEfz#h_)>!vJbZHFmVEfsL^xhPj9~LQ;pahr<K8WuXC6`uJ8e(4s zU_>;&QRENih&`_D(RzF+mr~s%ngIySl0s`z>3L}u(^O@DO%gsy+sA3YFW2swkLd#A zJPfd=vE}VG;C1Z-P}8)HcScfl3ji}*07{mLT=bB4mo(7;xZbZ-lA^!sXq!c*Ec|%e zfd`o4NaekMP^rrFSOuS?lAs|=5y(Ihdaot}p1kDOTH1Hr0%+IyQ^hz)pYtFYn3g}! z8Np}<`PjoX{JCZ^!FljE57X=0=YdqG=_fmmIa<M+2l5b`ajYU>Z75PesE@j%q6Cq? z^ja}X#3bFT_3f@g_`HfrFqu5!lb4yO3`GA!Mf$`h?sjC%TI*_0W5Q&VM+$9mQ=xWy zf_eVUGQ(sL_A$YHZKru9QwM-Ab6gig%lo>H@ohDb_3iHh;(5SUV}i9~x|pRDfN~!J z`|%?Xdd+MPXed<X$O*Yfut=^h`Myyp)<C*M4)9u7s+1*^&i4PBnG&ItDT6qUfHM4o zQZR@Ooy8R2jyChUqnQbGneacB04kjo3~K>I({v6DB1ca9IN;~|SR-}2I%;_1e;x+d zW#;S?K>g>>!Mk{EPng_+3Z`%qAOxZHpQzMK#eaHa*F3drOjRQLxrVoe=U7hCzDuP` zXMo8ekMty!2G~&h1Ck$uc>yyOz~SZH`HUkUX&s4l)6VT;fJ*;;T40t$FABWO`1&N) zzVkkWYEp0C@+|P3N7AgBGiwa821u4kSobzTbK6(c62zZ}fQA175PDHw`VQKTKR2bE zr0{_uoZSTSft~jO8(u5|JWW(^NYwS3B4=%^60!GKks2YjzYVjF!1##nM$2?22yWd) zah(EaW^nG?>tbqM*sN{q5_0o7mnndD38J&`n(;_KIaOhL^d;WQHT=6OeTcm62P#1? zuM`3%x!wq>m_QM>=wDY_{><q^C8=5Dsx>d|rKRBhE-^AN0m280l!mt|ehSoZ8pr1` z>-%*Ly17HllAzAZ1ZqEZEYH*7`)Jm^F2daAd7myYb+y~9@8TdJXNm~mpPJuGg@12H zQSE<MVd`XnKe1~PA&Pkv9QZvw5)EcJYSIoCmds4#|GdAq1Hv8Q|1iKq#gt`Isdc%b z@b5fQI|16;3_R2BtY<+6Z9C)B1(7a6>byVASfBU2KK#sk>{UGHEUbEa`nSs1o23~} z6xIQ9Z}U8^{&P)_f(lHIPT$zG?ao-?8B^Q#%k{0NwFvnSqAM|hRwB~8MyE%WN#!Mx zs8$rykpQ@f9q(Y~BdjURRU`Ya{ibT0bELDHU``&cNuaZskQ47WFU>NQp69-O+iJ^w z%+Z(UWqvhbq7QiPcbKYOri^Gaz~jXdJbBgwJ^b0ZJ|<H75!F5L0eZV2<$Av68{Hi8 zcX4TbMJ4eV^RZ75e4yh0{9GZ3`uB0>hcyOVP1GJ!-0bCApyP|<{5$cy95=Ro^9b$p zU@mKa`MZ0c&(@<^_nv3_Ed23*9)>te0F~<4^W!s<L~-$UM;OHnPX9sh#7qu@V^(-H zy!?!Zww*GMxqbfqVEdW(nM<LM;RDRcve~DC<VZ)uE<90@@b?t<WK5lV3a02~hA@LV z6J((DBEaV{gZlC)Ewc_yZTn?WjUm?7YxkT7biO<f)AMb8Qu;g+W^EtLhPKZGDD6*# z8GVQCRPxUftosptwurG}nkgT!dDpSjN<2T*f>TFIgcQ-BZ&h-ym|=xT#Rm#u;@?!F zw0Cs23?bhFVE_h*^iQ940fy=)xq6Ia(0y=S0_eO<5c*I7l;=4wrWaKJt?hU0IsWqT zF2E2JMGoMOg3*y2f2^1R-u?G3Xu9yqGxW91rP5V1K!510@g1k*kT5BAwx<Y3|3tw! zVQv7-=LPggCQ>8teN5G!o+xXAHOfGp#~+d3zvctDY^q7CzP+~I)yd8aygqRCF~6># z(mL0G*?B1@G(xY`;^F>M^cBy4lWp^e$E=;uC*RYer9sR|U}dBT6hnZ(z3@sg2`sf5 zNk_s=N+Isg6hUbSm{PkW9fKLn)$w1OwIkCa37~%c^Uxv-pgF?YnH)kO<0}Fs0t!<* zQM3fiZ79-=7<+kU?nyxt<|K9I=araRbXB;!G6vW&QEqN<q(+#O=h{3{3~YOfhG)=| zqQV6X?}fsQipGc3iS+7uINsP@4P0}^cLC6;i{W`&TqaO!lF~c??E9a^1iJt@5A(~C zW(Fs}y=I%w&*sH)-RD3aC`E|J3W?MUTf0Bd2j;0=_kG{ENldRp^OK^Da6>TAkuq{u z?Gk)GP0tHO0K=-CO9VEI5(W#N!HE>@>9sHC6+pp?7rKBJK>+QdMHWEa$E}WIFm1Zl z4xY%heXOX;g|FTViEk(bS6o*=m-MY7HG+5KnWf7O0_>!ZVFIlU_zZwPXBXh3F!p_g zr0SJDus=&tqG?U-dAPWTgCc7gnH+4HM(G%5d>Mc>FkT1vxNq0`EXL={^MbDixGoS% zXMKKd0^vA(5Tr8TlVc!s;2o(HRUrRwq6l{3JLUHqsr{_$3V+y*BWKnYjqUI310Z-o zARH^I;m}_{QyI`)GsxeU;58EF`7v;!b>hZ2k57$f<5<@o7fAr^dWNp`>kvTse#dG1 zC>@h)<1+S=&^}TGtxOeV20vF=Onj;>Fiz^xKd7B=>On7=5nd@>DFaL?5xfxLu2LD8 zn1>91-Kk1a?p;MWCI&`kMR&6opaQ&7i4+|xW|44^a_=q>)*9ZQd6pR_U&{fX!B+!g z2IfV9x(MLw0^zi>&VcOFCJF2#h2M8WWzc?Y*PyN^PWK!@K_Bs&j?NIgAp4%}yHVO- zri8zov@V^kwzRK;7mmRf&m`2Z)z<bH2pQ<m{t!sG{(*|-=%%$<vz=t(euDryp8%S% zS7U78BS$}zzCu|u@af|=-+kM*b3QXays`VPsVFsnQhV}qf1b?zt{i(;$^biR6Xt=( zLF4AhQ<X@ymue@-Q}WEEmv<^3iZVNI)i%{^DgY>TgTbFI18AJKJM)_bLT7}tB-6a? z&ovK-Yn`SBJYTMX&X?x}UKbcoE64a?II?|wGdEd|6xu(g)BCo5sE|%43Snog$Sq|) zyRBy1cXp2&!@tqYFOj#s3u~A_>6<V)YKPuYX{V9GqzsPeiwG_IY8P0aC<-ToYuDnX zvpA~}-_ze?5J1nb{pI(V*uUd3y9mH0#Yi40>UI)9hFSX$3RC%}3eG6Dek$od)b{&H zF<lZkt+kidx1N4>u>I^uT{5lw<~P5&>}$TKlihE1=l(Bp=W%nQgMn=;DuWb&p*G{1 zEl(9@DkfV*H7Ak{Ku;C^4S$xb0cKO!xN>Z!^8%v}1bxfCZCcsawSAuJe~9GS1-vfi zR|DIz?I$FEM-c$U<iEQL^Vg}$K#gf_RYg#eqL4GD&x2<BuT&DcH&i6k*LE$BO1o9e zuY$pBf<)N#_a)uIi)Z6U_245nox+I53LnshU2|&Jg`v%|!qCV1qCU?n6n1^rzGJ$u z)pebDn4d3Sg#g-Rb>Z5zQiE=V!T(1ec%KWaf*oo%(}!NEU>1u3)ne#7I|{2ELM+P9 zuN7_%o(KA}Id}bJ_uES^MsejnKnovt2@Aqhg4B<l_&WvT`a&Vu({Mx~;SXdV#e9)C za}|6vP9~9cDafVMkzI#p281=n*(Zrk(=pS^a+d^3TXkuSeRN(4)R!me*o#P>wdHJT z!OV6yZ6_~?ygdRnUNz4|ZqbH{z_X$<cOO$7d9BZBv;KQYU#o3m|3(qAeQT-WitvFD zMkmGKgt>UP*+#A{1J;^Cz{IRZG^uObd|SQ)<~H};Lj*`jXR(znFZ|E4zI0h)e7O&M zU5r_2Utj;ZZUMB5A@U9cl<{3WPjA(ZhxxD#h9wn-h&$?@qB_&aj`az2x#v^`uN2Pa zdQKBbI@o^ps<Q8c>0<=J)QHY=s9-plK?y>jF}4-b$40a7jRJH44KVDfd<1-dQ?(@y z_vd+J=TvP#o!YTAZSXv%(0Q4lD$7zEIDHat4Tu+!K4$@OUdhvs>0*9-ze)N>8U#4G z#2ui#r=sy;Do2QVpzuK)s8pMOt1z{Hs&)Zhz<O)6zYg+u^T80|&wYh15Mn{uP(*)D z71P|Ds(go26*C!gzERf^ocV;-M|K~u>1ERVTQ8FU+K0i52%t6ViwnB$6X#nJ1q{yc zje7~fBNgViW9Pn9d%^?CR!XHE?=|N!1>U4N$8&RAee^2vc;yVRkvu)8M=CGqegve> zLzVh*ltJ56k@}|!ZBYt4^Bu*9xNAQe5x>QrVjjX8VMdecOwgaZ2E-Z|=VgNVTC)Jy z)fxJjrmy$?&nty?F~C0HWdOqXyyJU;UCc04``J^>`G>i5q%xBT)#U-+ri$f&ej`Qr z_Fi+|AJqo_Jf^hUKzSf`^XH!0%q@TOQx(C&HMt`drbwONw+beRsgyiI_vJ}}Gf$oe za}$LNW0n9awQ+e91<+Z{@S*}}#vRKi={!#nav@X-%rV;vRu-%?6Wf2Nh{R`lGORgZ z`q1t(QMk2Q%&)Orz&x*nK8gl-u>I^*Ix|&Ljd8F%RcW9fn&n4|dW82?8jO05QoB~< z1C@q+rzoK9j(hHd$_~(A&^~BprtOs~vj4-E=V5}XY_AQ*zFld%Kie#3*$2L^<%=@E z8WVKCA7)NKh%Z5Ex49Jc1NUt|z$031tT4UcZ}_u9`$MyYNlF23zT+<?eREs2zn%$m zVSsK9!yO=ndw@wzIhKirrz-9KxeAW>He7p6#pI0UEw$(V^ghS8M|*HL1jlq~g0l7N z5I{36iU3;k^Z9Y7ij)QqOxsi21d33CHb~$TT0D`|rwSnm?6L1eZ6=%FrN#W3e|-B_ zLLbcs$a2LOv7)H-f?p5q>p-D$f7x8-KNKGX^_uCB$TLBWf2ESg1bIhBip4)Don;dK zbKvpZS?cuV+Ar_#17Tjy&))^a%s{#rU;g(FIH_zuFZeuc+9gES{H2H#L?B_%bA}0H z^L{};xvMh39;s-9E^$s309{p>=xWdVjh2UU-|_xPo56U9s6A4_)0T>9d8~q4tSfgF z6Ai=c(CWQ#0l4wOIZqLk1yFF}8l(%LO2>5xqE{(^*63pjpj|lh@w7`ARoX}3ihn1* z9o2rAA;mR2uH}<SXJ(s=P;@dsNm}1}`siT$*_GAb{pdcx!~~^aRA>PNCEy^RH2ZP1 zvhNeM9ql89+P<k0F*;VHNB}HMq23|0nw>kG&u~4qW86gJKym=e)}=NeHRC@szj>t3 z+A)_Qedf;Uz{yf)KF_622PA@uYlWUWbfTjDGl;G$e0#4ILeRG2d;8$%X%lPdUT45} zTeZI)qOG1N0$%t&YWCe%eD6a^|Ej<rVew3>#JOvVK$$~3pX;I(+)-F|cpiT?XUblv zqNW8-Y}qmSu?5h){UQSBMHpb0<s}QH{KMcfGlZE<6uGzW6fOtX<naZf5yBkz6#+5s z&#ygutGy~1%mV$T(sc#FNbMI#LiEZW*p`tFN4B3vrqPcS^9nvxXoD*%W*ST`ZW8rb zp7}sNUs`_7JWrT2yDW*W*gij}3y^*P>R9iiE)dQGzzjqO)5x~f7+?*68H`+athVXp zROK6@y{)MXj=L(~<)PhoT`_COJH<S9f2A@&zgB2{m~+rhs?2X0sHaFa5qo@JzO8H0 zQv16*!#hw!a58X$Cl^9S3Uex!9r}!uGd;(h`{Z5F$pR<WoW%e&<NqQ8DEF_eUzPyc z#{^x_<liT?b%r-h>!cxpOCosJ6=_L(iUQa$QP=kFt6-8EqNjE*&+*RhTcv~TXYac9 zT?Sog9$*)B<R&=-@xr~Xak#{mQxvH9;SPNKg6?a`+L+Yt5YDXp7$*l;?zC>U@j*Y+ zWlM$^{bgq0+q1u*2Dp=SPW}<3L}6XbCJcri6tk{~0+tHs$oJb&NppFw2#9&5_--$n zW4}@v(2ts9zE&}f?yK#4XfeNK(f$(l_=l-&s9i9EeVC-j3LiT{<(kTO!SBPjCU|L6 zfmKY<2q#(4^b&Vn0$(3)e0x5w_I)pdF<k{7Pt$tM`jW9(TgLumEOY<>AOJ~3K~(3R zBP<!CPSdY8wV3ZC2!`X_6~S>>TJ9=*gtVQTK+k-S>%ic3YJg5O4vz1UN|^fRDq6ur z5h(;fDX%1j-;V}-(yYHxTho)GT-KV3rpR1yFf@1k_H|S~`q<W8$^pne_hFwDT4T5u z(E@9OL0;|x^&}me+dyh-0hmmrFj4srfcP{-q%~lQW)fBgQ@}%bH3KbEtpL6kin3>` zY6nFDw3jM@RBqNgBa|!)^MfjG2q}E64;6TT(b13ZsYKWQQ876xIhj)ho|qMYeocS5 zrx0wVHly_bv#j-H7erom47xTrRU2#b;O=8vV7i!VHWAi@&wOl6`1IU5udYPkAi*vO zCSDeBU!^^NQq10PVAuCC@SY+jV?|}`{zTIMZLa^HRIvVy!X?F+er*`MHU`+?3-m$w zl}aQZPWXumxSl8`T^uR$hH$R4Pb&Ti7|@1dW(byvcH_gN@>2nU94GIX<Tg1F9e7f7 zNIFOt7*$#J|GZpVhx#O3Uv@_3`!W;k0^=;{HUB)gNs4wts9~_BdJn+BOh)@L`@1tz za?Pkw$z+<CV30ubGrVt?Wn+FF#J4+E_*SK8e}oV;2^ik03YIu$q%ycYY4-0Z66EPu zZq*^!25ry_Sh)KmpI2joqssCu#<yq!XkJGE$nJ;C1alyZWA8-e8?g-yj_bK^e9!)+ zGJYa}Ab8?JLI7fX+*R}wuJ@|hexg!{;^&h7v#nn{U8@FIVS;>UKqj@F<qs7Ny`eJT zp;5rFD2?Xik)B>np6!^}Mhd4c+9<`CeO@yM*tFx{rK3Io&MSdx#&*b=vTy79?*m|F zd^IyD<dI!&9;LDb109-%JKYgRc2vG8^#vcRXnF`DQurbG255mlYxe!IITlUd&8+^O z1M@4C2WY;j*Jx#%SB9Z|rwWrNf+IrBio#qyRk7;eqLA7`DEWduRnwZ<ImF%<YXT_S zXK8;mEOM@N7Gr%((P>`h=kJo=t4kB?()jv>PYQ+5|92EAD&UUFECeFnZ;th#s9lA7 z>5ht3g_%UQnq&T-LKuCe60MI3cG_%vsq#&I`?ccm+D)Jx<`}7fhCrA#6={U}jUIjE z0P%dUsUn&FL`5B+sx<r~yAKoaVs-%pUaqH>i0hhN%@mU*(s?D(+P~kstFv&QY;K*0 z`Q`OKCYT3C_Z2E_ug&g&*=(wItxk^h$|0{+z;{nk6oJ8)!4)&gu8N5TDHh;oX?b9J z{p3~*`Z&z&K+^w_^xqV<SH~*fW~ceV3=tZM2qaP)hWAMEEf5qZwv1-e#~ipn=hpBx zuK>zBPwkpY*HhZowa&J@{2>A;xa$%`yM7+{f@OqzQD+z5te1>@q!1o=6~0_b)~%?R z!?6lbWP<UR>5x3(eQMXdcIGE700Zoxdn$>^|JbZ=sD!$svNJI*W>L(RQZbw2KO~77 z@Hx2XIM}aYf}3hHUphDTaONrG+!M7;q7D|1V4X(_Rpmb~*N9G(nO@$1Ug<Lf5&wW+ z*R?$Srwn8st$SiW{1b#vqscQf0U$b7(fUtSCeVDTFvU<d4-*~dySB#wc!sVUc-Kjd z!1<L*aFDlyw_E<9(Z5ys7QblD|6OwqVeeQ{_?CWMkKzV1K4XOJ{<7^|{j!FU4;4VU zw)gYA-v!ayy3=_D(5&scFzIdK=6sfGCQxuIyAJ6O`15%F*9s*8YYmK-$;J;<Fga2g zTUS*A)6f`Upzcd_2Kc@W76F3`!2pvM2vhk+@!^;T1A8^WErecE5oBHMMBG({)(Fsu zGK3kDZ%9Y_Nin#N)vg|bHtC_i+#mmin^dH3@JRuBfA`D)Yu9n|fgt<!^72I(;AuM7 z^Raw>y_#kSxL{ONkwCNX_QFiIrw~5)KD&ylBS@F@gG03$D?TJl<5`kkda@Ezql4{d z6T@D%Fz}sl8}N-^OZpduCXVK?uE3fU-_-rTn7I*T8H}Z<`Rf5uJQuzutOP!FT21@o zIW8iAp4v6~B2xS4Jow8(W&VLP$Con}&$T380zvRZW&GqG4^`U#2bJ$fYS^J74dRZ9 z!m+2AUFW4e$Mfb|Cn`eE4{A@VRkIFdhQAQB5DYNUL}40pCO}RR9n?*hNRrGMhwlf_ z;P}mxJ8mfE3Z$b`*!4&e$%Yp3P7$t8?Zc4*l%5zrR(pW=ADzG>+%Q+v%red_W>F1z zzI;*b&zD^)bzdLP=^Y=l3Co;^zm|45P?R&H?RHdvhu_F&dhls^JiMCw)g(_ziy?Vl zHyvz0`=PSArp?f{K84XE74z5c)fR>bdRbQpI$(0D@*PKN*X-R_U}>uOzF1FOC`PzB zRWMmJO7EXg7yfDtP#xP`sPyeMa%RkW*Z(w~<J&X-Xg^OM0Ao@+ch*gg&V*ogn<@;^ zCzSq4!8qUAv+y2&R!nilOdnFw3J(=IfzGhA>C@kTVKBHb3@|0>dV{(7C2L7EE)0!o z1rHUuU`RJU?airOk6DV{Ji|O@8wzd23vasyNQZFW2h%Nilxb#wD|QUq+<%vW=Miyz zbf&Xaw$IB1yO`fp5e4R^6#N4t+Xo0<sqL%bojuQpQ2YC~{W}GyXn&XZ-2{rT;96^L z$AS9EnIJ!WJk$bxq7XvRmZbP5OomDrK6s&$5855u8Q48o&Fj2k`tx#I{EyZ4;iGMW z<r>5DNMu#EdwycZ+$;u2pUc|xhYFzJVO-e{LxPEcJzN4rZXT(Ob#E1}32=+H?8WHO z?spaWf#iF-%fSUumb2Am;h3MaKn&0*OQCF|Q~AKj$CkoeDit3E$DrK-G_(l@R6_CB z6;i3}Sin!oCZ5G34BZdtK{;+lp+g|Kx`f4h)$-M9X3;)!%||+$r^qq0K-kCp5GF`F zfhiFx&vZ8~eNGg!IRKP53bQr2nMnJmDv~Lw4DLLiDm3nW+vifR?4S2vDDW)`RVu{P zm>}Q#P}1M4MBS3VNeT)Y$hXZtYP)jHS9Z>)3iksT;~5Bqa^?qq(RMI_f*}Iq#tIXu zS9o#;IJNcDv_1QbM;*&u<d_+!?Y{p!0w`_a<A@8G2<Pt<d420DjEjhAqAyveZZho& zLxchHJrH)YZx6=lg|4&7b0PhHP7B2VZSq{H-6?ZtK@!6BCWZP=0_FpSo!k9&L_%>7 z24x0q7%71rpQ#-gI#C4HxZ~cz<3TcjEJwEaen2ZbcAT!w^LK&JwI8nG=hqnEc_dK( z=i1Er>{2R&&{PpBPZ>G@w5#^u_fp||JyK}!FBJ^dwS-m0v@Dr1GN65;V(NMS&Wi@V zMWPNS=*tXpXavty+8Ch+s|kZO|BgQj6|AY4;G|N>e5zoU^dT6RGe7o^6$$r@1Mln{ zj^}+mn$`WC2%TfK&8V)y)gr+A$lERZ&(FgI!4$%uPxFSg3qb%456w<$Yv57{`y<6S zBZgu}kzVEujd$?K(QHw1fs?V!t3$ni??uGlLNUM!Wk5P(K_ZcYkuVn(A9zc}ga&ZO z3KiZ>ik~WM*&8ZM4`xCwN;)GN5I#h-pA7|=T<gQMhxv%$3_4=g1pQs-l}x>3`Har) zi#(6^mo-3-9K$q%SsBv_cK<x(5dKjq1_VqsM3uc%`7QwGrD6&sG;M%};K4rngw(F$ z^HQdbFCzFBf!4R4jt{n<wc02#LT3hO7gF0YLM|DmH1|b$KpFjt;0bW*{S}u5*Fy{R zL3pZmU>bO#pPkrsUBIjb#T?moC~J#K`?_dq&zv#G|0Eqhwezx-%iq(l<0eWEJ|q5t zv5IX7By96QGXxXHCHFHr<3-Tr8m<9y9^<iVfeTFw$p9N5PHi$>8gf;ok^m8+{=rb= zf3M=8|C!prnyL({nCdXIzziQN%yT=<`fl^1w3A<p4n(p%9nnn{01V~`Gx6wE*?s9W z_#sAV8^GxLZVoV(Jz!`a#s}kdCMZR50+<jLbqHhtAYK3$36yt+L2*6IoL(=K@8~8O z+Kxe&ZM+|Cej@2_RdUtd4>SYw>n50A+E&ZW^}gf&vxy25;#=@733x(q+f>o)!Gins z>1+5IH`E@y(GXpOL^GjC0={SN=R%VQ%sKO8V9x<B9`K{IKMSkgHuPU91nztc?@IfE z8xI<zVwE#Sm>TBXb-RwYr>7;Y*fkI+TnNYYfE5iZm}`QJH>Y+i`1a>^OH7OTEi(Q_ zzy0lRulpH#$)r&_H-0(%dvtDmLI7w};ZwS&cKH3OLIR~K{fc6W7pa(1nVRQ;!tsxJ z;Kc6tKw*x7!ScM>0T1JFQw+zs)GFKV8l%((AJ=q=)$5|tDZ5OnE@{F{JnY>;NXK8X zV@?&5&$_88gKMOsX`kBfjY=fho`SiOYli0Ma|n9dyWfvCa(`0`bc+naMWuv2{^^r2 z9Vu|g{x#bN{ytHpE}<1t-RV;W!yp>?u5IHVA&iP8FanRbc43G<fmZ6iKo^`D17yc{ z`Q7un<AZe%r0LQG`R&^>&w?OvSHV!g8-)cXiqs&U8!Hx3nS2uhR`AbbmZoro)Gkzy z5bKp>MvA~fZ#&wXAQ^W@EIjTOQUi2K(kLI@3tYQz%|AHR4elxc0g!wkC%uB4roUEz z?nDumkM{D3BJz{xz>Gpc=7$P15S^N18L-_P!@IZyE49Izo$8Ql!45X=laHx^5P;Ag z_||yt?AyciNpu+R!nH|o&(bT*-wT?*Yxd;{H9e{frjBXMB~bT2oMC(l=l?+Gq=Y@k zApMYUBHQkjd{*oj{7-jO7#x_}RZMk-f061xcbnrk?Vc`FQTEVH{gZU86ijMeZQM!G zmw2C%t!E~fg-2(ku2pg@V+iKTQRNyQImvZ62h6S6egePn0W#){ns!`Q86y!qcs^21 zV2=F8D#8STFJ3d3YCS$p8P5)rpQseN{wIa`^+qs1=>{-Bsk3mln<cXJ#r_o)kWk^} zjv{cwJKU#=8k1ge0ke!Vzz1s2Wd;~u+Ohb(c;34T@WG6;FG7`N{>ibUV@mDFFpt7w zkjVmqhfmX19`(hsJlm-q<2iQ#i==ip$8eoJyEgA}paR<MX4_*$fD3bnp#i#ylb=tX ziV4R<-)qe8OKY2#8t9^w&3%099osflyI!uFr%&uWzU2eOfc&jWWttxp0WR6{z`%}Q z%FTYx0JG(V=Q&o}RpH|VX1^?udIWZE2Y+uj<GS@E*AK1<pgfyT?9KS$K`-Q3j_nw) zTIIqhQQByI+>7mxRd7gq?5Y&1W_mHk#~)Of>e$YOIs3EyFSQF#+z93;-4F&SRhb|k z!=+O<<Dq3>-bA%Wioy&^q#{1Q9~A>RgR%RsD7A*h=MH5lrdM)bAHed!o6H2!6#L9h z9+`D)&*ZlEY)ZXj+p{?a#>27uc0FgRQkcA$kpXb=jGlw!{s`I-3Gz@yi#}F~1Vqb* z!MZ=e?|*F9bIp)<c@H=X=J>wpH;*;Yg{WyiR$UWf0Cd5MfsuilZ^;x(98X`nuh0(B zXeg=XmYsct3DcuByO^J+3*gtHKV_lQBd|T71WnR0n;9VF41wroFbbw?k&)oYO9?tA zDa5~{2;N&&5gzcnW(y0~W=sKdIU*F3B{2$8+pWQQ)K11N!8hT)-228cKS^4-jtOxu zN|lLpA(y87|Bj?zsQ`^KKR!<xAJ1p7{!w9$0}u~XIsuOOpPGHlX$Od40t5lz>m%Cj zKxd~{^1&nfvhw@5lihu7R8~RSMiR|ZuuI_+#T<Jh#k_84wC=+LKo1ns_ny7)jxC?4 z)QDu32DE6HoKyz5*R~xndR~$<z>RdAGe7yVgYRVbTmC(gZlH5g5ALMU!tqO?;Zgq1 ztqfkGkUr#rPEs42SX^LYV-;qKuL>)SV}#{*w(XtTRs%oIBfH0GpI<X$=Oo=1%#Z9| z<H~vd<9+GRK7lO)CT3xTY8cU~icgMIFR5*AT}jt+>>!llFPtj;@Cc$0)b=T&EVx_a z3<hr!^OJ6n1_)Iu#<+Il+K^N};0u)imRHR-d|a6B9yH6;n><uuc9<_tRhS~vx_qX{ zSHo}U(NHXp6!WA}hK;1}Y@!*Z?Yx`RmO4iYQz6&F)I!Gw08)S(h63|<-+@mC%(LH7 zRAX`J@_R*IB*8&E%PU1tkcYBkqEWN_GZihG`h?^kAtn1W12&)8VJ71n=<=zOB7v4M zQ52+S!1f9;e9IL(7U2=h&~GpSK5q8!s|@mAD6~Qb-+OAi0kS5@<huxQ^lf~AXkH#| z{ZQ?B56Q1{e>&uD11wBa+lN3c+g>w)qBUZ|^y)bXq#neF*7zp98#AU%6}V&~Tlbki zRs{HMt6=Mm3Vs<A5H@HB66ihBli&MxxrrFOaSTxEOxn$z6dU+AijIMQ4&d;Ci6jH4 zm@#oKQ$uu5r2{djQ!F-zEW;o@&<2J8Ffna-`8Ah<YyVQ1Cfo$&5n`T~Cxuq!z8J6O zK)a1p7{B`gVXWlcy=|To3IEuxvDw_~dxhDDKp{5+9XI#+SG6@hA4H`#14LSuz4v>% ziNL!h1aouqr&}=i_8w>g=J0LfuHbqMs%So>B;8e*?xYCb=rV!Ae7&|M%$eH2xsK>q zfoJwRX1s8|6nz|=IJS-yk)<`J=i6Y;ZmuQB?46?03s^v~1XI~>PJLsvHwsaVRopjw zDw^YwigNISy(fapCn{yr_#RpC^!3S2#o&!(fKoL=O^VJWh4}$6BE7&Y+}2MiG^D>5 zcAV^bD=M7@hVfVtEeQj~G)Uyyp`rpliSJ$@m=N+~yRP38a%Onf_IdCL<{dOy08H5V zTLr+-x;Vy7AGG7DO7MvLR%uhfNBg}~RE75`Zg>{VIIk7eczAXXS$77QO`Yx&lr%8E zk4;Gv1bYn5QkywAWAXm#R+6#WLJomy^v_iV=3s0SMKz%(YL8>2M_|=K;FTiKP4+x6 zZmtVM^KyRN8;s&6!0hW97Vk*02v0wvJY05tP=LcR&h?I(_HZoRRS_b+3?OFCsX|B~ zNa=p_Lu=+8m_zf#u8qa&g@W;Js7z1yjiQ1NbfYUQ-B<>gs0KPIq@iD^%v<JuJwORS zPE|}GD=Gst(xHQQUB#?`nPE+lmorv`3&T`==4^^QAKNtu^@h24qPf%t1@FnTFaWsp z$UEb2^iGX^-~E(Qn0PRCzE(KJ@$c>1vCkEQ!e`C$8x_qDGYNwX`H_?@!{myY6QFxg z4U)PC4e*@?ljj0Zvc9+v%eT2unoWb?5EG++_j@`!n+t{15v-)}x$ml7M4M<yu>VK} z&sZOJ>|CCY^eFt$Yj(|?6z|I%Pk(hLj#f)0DK}}Z*ts5XC&g56$BKgUFgYwcUaT8G zDh!inW=z6TgNwqoygSYP5I%XfLzNlb5l$JyYJogAnr<`$tVp9-8=R_y_maRVwWGVF zwxjxObG(~rq_d_znB(`&abK&QuS3`}W(fd!ps>%A#EO)K$rde@@>2JjXLzSz#&r5e z3f~BW%dXnyT%U{2O-uM*cz+_$h|asC$kB822+WW0=`Wi0g-POL1(cYsJQ|I`YGT** zHa@a_?$^DMj`rI`4c5L;(aNN@MxOoG?w0VBm2BA{-%pA`mtq#+75@}{dR0YWm4cDr zlP7-_v*kUtXD=adm&j6Qz+8{ow2#uW!k8g~#OR+e!Yu_J_nLdH+3}1M9;o9!L0mAj zujdi2sa-)P#{nFuVA!kY?5Hp`TpYMDhyj2B!f^Td^SLSXMr(f1jb?yQB`^jFl#cR^ z!Yq-^Et`q~d#Ymh1{|0QNNHf(9To7sPys4FMV#44rJh9Yj_P$4O$+meC)A^z5@C9v zV3uP=&<IQtZPBH;J9a+jQS}C<!n@!j*|g_jrssQVGa~+(7jdEx0tlQzV#HsA28q;7 zBq;3y$lQ$7<trJO-!)Uy{@=6SQ$QP{Kd&jw-t<GhJ^Ni?%oTv}ry(TL*C|s-sJ>$n z?Z^G?n+ohvQ2VVN=ZXA`AH2tDbL>5}E2>Dr?C&)1`CKtCB0?*S-7Pl=e69hnDl}IL zdJq)Ec=YcI%L@KR%%FD^(;gv&dVABhFk{G>UdAEsc&q4EFhHrw1kpGcoG~v-ZF2^> zXmr4-%0T{KR3xSYg^2^-)w)U~6;d7M3bZ(wnTJ+Oq1FAQu<K*8z!Zd*hVKK@h!j8} zS(wxXq(8Q!5z-b?NVG0R9yRa8-~vcjRKUYP;r^X<MXr(*V4;0nt0S<-nWCFfFiR<2 z%T2voO*;(CZ*l1_Rf^7MLSXVi9!4Uyeb9XOV-@^8Y?dD@eC-=5t_&~PwXcFj`aU&e ziS*oQ&cjp*!#!2$$4{F3A)vbZ!2N!tQox|ylEPGK_{vFVc&)JVpiR<;(P+U0jE{+D z5x%ipkydr261_=VArLdxVOnJ@!q0x1u8Gx!F$Y231zl%?@98$-@YXOu=}ce@&fwoG zG%<I)`$u;F8Nm2fZD%~D8l3C@sBpsHRS6a$V)Sbj2@HP(bq%K~gZZw)pFs!rppR^; z=h<K$gpxCGc-jKj0{ovg+t50x;Qvwq(6PdY_et{(e^Ps{KL#qmb7I>7KG!<3?L^eo zOsTZDe-D>7SDN?wrApN3Knq6AVEC=ns||Vp8dZeoD-6_bj-M#<{m|lmuV7I08LSKw zMPG%f!icEn%Rv7|!L;zn;}Usc>zD-}E0`%-)2Ry6#SL(*f-`dTI3^2o>xzhU80n4z z+piS@_I(9|+-%mF;e?b3w+2bU{M=s%-iWw`>Cq;%3vJ;QU0TfVHZeZvRxv=S>KAm0 z3UZAGt%hhcq@?fF?z|+suPdDDFdj^d1dse^=c1(n@>PYz`a;nGiFhL?${D#&PKh6l z<H>1!qyQ}b%qMDVf@4Kwm=_X%+w3RVA8nCAX|vh>y#ipETG4iSrcGOCpEGy-q0a1b zZjm#=Z=~A^zS}_STTe%P8~;Yh8UuMh$eIRG$5QFj|5F7AKT|}8qH&GXW-jzuDN=4o z1b?T(SRSZgm7*6Lb__x<zPiokUMGt59<(DE+(=<P!qk6Y$MKK$ccfxb`n1`8-?o!y zhgJu6K5338mE=!qms=#*>?;-A|8KRE{$0R?$sXIX2kyL38;9cmHe>JBF+iweN*5{2 zFwWfe6h1SGUwfLux*bdBf27j!0Oh9&$?>(KW3eAQJ^n;5zXTvX>Ju{zDGHQyLt;k4 zlR`p$*xdV#!cWQjvmNOXzX=72ahf9`;;W=|*=vPK1rUCr0!pbJAd`byT;rqNoxyt) z;jNZ9ZyR-eql!xc@&G64thEF4BuwCi0zX`DtfCEatzCuBp8&4Ekn~4Il=dA-e^B&Y za6XarS8DgaADiQ;5sW1Q?6?^dtxIaB@o*kY6XtfTg7X7KMJetJ#*bC-w%WXhGc@7> zJc0j>3SOC0(<7!`!-YZ1o-GR$w_fXWy0r{Y>I7jcl1ZiGe5#_A{Z8R4@TfIX8qg@I z$M=m2Abzd3>EwY5aH-Y+&^YFIY6sNd=fJ$`zC?h-;6St{CLX{*ioug+8xfpessN2r zNBHkfRm`yutjS<ntG0~v3-A~S?lkZCN^OZ3kYi?%+L9%vpQ+Aje(&kF18-TVlCPWd z<>(_>^Os^$WWxG62JGYtG?*!WuF?m;Q1MM}s`TF-#b8e#9w{PP(dMM^K}x}ReVQ}; zd_<JqSHuWl)gi(ZW{%eO&em5I)s--b!kjRPQgp+kKGAZgDn7yQ6dGX`{M{Wfv2EV& zOUL}ATh0Kb&Js?t<r9@b9216v&=YmtTyvn(;c^hn_bL;zj#bKi5h+QK3MLVl*QyGG z@&r}PIWUJ^Mff-815VC?NfY+{Me|Ot)h^d2g$Y%*PLL21>F3S)@9g~^t6doaP{ND> zln2G|4q3xPde0`8r2yTsP~}^KA(o{W%n44Rzkm~j&n<<IjzRyfA`1G6f?-ZoY5@O1 zrJrFD!G%F37{<RJ6()Zoz&(&m3jg671@j@01?}}G1tvWL945~`s<<F9Q;`L{PgO8H zRk$?%!P<jyWkr#T>@&Q(@6S!lS>POLNf{rs@Dt)*CM74m6rB)oc%&Np&<5A-9NBrE zpnF%+->3lbxdPY#0yE7-F-6h?6+g#w6;tD>Lh_>%Q$YeoN3{#IDf|cb6%+G*De2#u zeN?Pqu<>Ml-W844qgW{mhY9!xg+>Td_mFA^IM1Jy+EIR40Fks@pj%dI@R!q-r09cg z<-kgS$(+1EOqXmY&-K0{bpYnz%oObn?Gb?uUpfr%p2BbUxq?Z)R0MKi-o*S#aS1d# z)-mUDFUAal>2NcUeC`FQ*PCbgthwgjE3`=%+-h@;S8A7tBkGfT=a`2o4wn&ww_XEu z>d*!~OdCnfb9(?Ji~)&L3X>*&g>@CC1Ct;p2+eM4+kM`yM+(ODR#7PiiP0rz%r0C5 z5Mp}$3l;72g(6JcBR6>#o}0m9WX}zFXd|AT5Obc3w!-J<lI7p10F&7>vgH4smJxW% zNNH*%sjY>`{yp`F?L=ft!6@%a`a2bu0x3L>39L76iud}oT+1V^9dG3P-Bsz!1cOnZ z6Rdbu8J~ogiZWQ5h%LZW`A!A1f7z_#UU}CX^HybS_!mVi0r#9L%&?yNv7r!lbFf)8 ztwCB|3@#M|getzl3^+H(AaS`_BWq48b{-uRLQ-`gdfp!9M5Iy}kym%gW(%}8sV&jI zQ!$xL724Xq-G^s8R7usqyvl%rIVYP<JRrv-%aEP{po8l>g*nGfpzmo}LAT5_!zCfL z1v0QBg<qMnWoS~zDwdNU6v8DYfA^82nYn3#UMK(n2D?c_K~z90g@DVPh4{K*q+kxK z$Du;&d!WLkJVnUUG{~6+7oK_mvn5qyLq&MqZk`L={jRwO*n~N=?2HZ!XA`LGyfd`S zI9y5wDD_6ERqf&mbEa#FY|9MO&%=y*Z0mr<tHm$_g-2)cliizhxW`E0Apes>Lwv0O z34nL)?ztj&&?DD)zKPnJp!-1?RHVqm@@JKzXzm$_bD04*P$9#g<ISxKRE~j(No|(` zjO4%Dc9<H>@zB=Yr?{aKDDy*ej{_AZL|OyP4Xtfm1yfX)fk|&G1W2yGuF%%V)1#!D z&$sC&Tr@d~%8ymBNe&}Ic+Q_y+V1VinA5BAt#3W`I;u-YOUnSI>a<Ey05MBT4p7#m zh-~xFe)p-l`C+WHK&M0hO42{6os23)%7RZT<B}<5qcDm11h?E5bLxp*_nl&nM1Mvq z#5mY^j%+fn`4;?oEgBf#Ku%46aE*}u;elF?Gyiut1%z*ol6w<74u(VU$}5!u3(pl5 zj|k}UV(c)?U6q9YuT_}Sj-AKz+-r^{7{<%D<pg=EJyFi>pm`?ni$9U~%IQSzqVOUV zE<n%3q@;=GaxNP!9Rpn7dip@p_+b0loAs@ypDIi$R6~)@c9!fj^vF<`O1;Q0<{Gbd zKels6D)xP<#qX&AVXBD6L^E^A)@M_gD02PWMB*Bv*Z=e9b*V2iWCvXKAM^pM6GY1j zuz}_y(@3PVOpk58?rBBde-TLCO#zlDN4Bd{OY_evKE#)bQeqRk7D6YQo0~W(pXNDw z<oe=fkV+8CzFi+CMl>hI>+z*CPUNU+&rQzeOgFJ+OU!%RA@DmEmmQZ&6$RQw6)mtv zE}_<<N&UxhIbj!n15Ao2(k~QMT=o@=*nI_lZ#q2lg1uCmx%mXNlXNc9ZT8F6G}^57 zaa;{FRWs)@OP2#(oGMc;Nnt^uuRGp6nv*`vIc}XH6~fC35;%e@!TtOBAACJh5meFG zzy}PF>)?9ug8NGEk=J2%JckGIaI7=AY9R?|z+X2lod#H=MlyP$q8a|^`^-=A3zY~@ zsm=(q$&`Jbp952&lY6A-*UffvmjFS|l|!pUGIf)w13jBkVY&`}fQzZe-_50IXQEP_ z0ZKYs4r>74Ko_A7AAPnwWCr4Od!;s$L?}cvqxdrk;zVJ)3&U|vuorHEuT=5}(L%kd z)I<emJ9a)oq-$|*5pvwQd%-c9qg6YF(gAn#(Vzj&N$XorR}QwHo!WX$3#|Do#+B_b z7g8BMRmlbXXGPQ|6<^%OUz3U*Amg;%qrkZDmWsxhbMtD0jCz(^Gyra(tE3b#lc|Oa zmUCbYfh}J&>$OsTFecn1U#T!NYUbWkF`e!xrdlIc5pyZH<vLy-(3zd*_qxVcHDl^5 z<7?4?!}HO=055@Nm{1*rtYZdspCL10PZiS$;a~?elzu{sWIzBAo{k}%l{5i2*QjZ& z4$y(&4YY97gSX5iy8>qrFtL!Jd+U4IatH8^cqP-sGPzW)&CK-=x?f-Q0`A$qR@=Y$ zRH5G!`E41%jVl=jjd4s@t>TUDU-2;wVz_pA-_kO@{x|dgIJ{i5dG_ODR@%0Hs(-_$ zY6Q=ZT-1M&_tH}bZqKPPP8#3S3!cC3sXQ}fUZK|QzWw>fw>_TLAnBERoo!#OKHL1Y z8vlGEwcjYMI{jo$>UT-L5<e-E1KP_ZFRjvl-eDekEuHl>!vUEGMnPBP?*xDUYOJWr ze<puHtIBud^MYrdNnO|R*?H|me}m++i)XG09p7lYOK<X0_N7n%-n>(N?2mQAr^A^E z4e~ReC3Hkuua<qj?93bK7|+|;4y(diUMynFV7}|}>Oj<V`H8i$w-3lHyBMWXy3a0f zaqTs+Ka;Mee2FqC{T!#we)~Mz+V{*rgRZ+2FN^yUC_mwI;jHHo-Ftq&0_O0~{FOTz z*`idM8s{iKJvlww$8YM}pxu9N?vb$FK4Is+uU|d`mkH>fD?aCt4m84iPTEqbGqbxc zOmV4t?=7)qU*oi1t)1<b{O7-WmOk6IjH7SmrG~Xf7dA5TeVGTGKQsDzYWBfBMi(|s zGCZ`?)M9z#!Mie25)T}7VQU>{zpm?RWRuERuzK0YH_mKPYEm=qJ23NZ(J?VN02XhY zHi?bR;sQ|2<U-J;0}SjywLtfJflL93Ie2?AGs}R)q%t&tE(D7)>#Fkd6oADREL{S0 k3{V}=P~eCXenWr#f1gms__gI&6ax@=y85}Sb4q9e004zrZ~y=R literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/288x288.dmi b/icons/obj/machines/rust/288x288.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d2169ef032a1507c6e827dbe25affb0ad421f0c6 GIT binary patch literal 174457 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≦cTj%(@}ecxdT(gLVhCS*cuWpi4E73` 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%0Dsgy7sQDBZzw0AMk_=VCiUnhFYpy1 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/352x352.dmi b/icons/obj/machines/rust/352x352.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b5e369d91d36513778871d1ea756f27a604d5b8a GIT binary patch literal 264884 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ê>jO{Lu$WDV)mTtT=xC8@@H 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/416x416.dmi b/icons/obj/machines/rust/416x416.dmi new file mode 100644 index 0000000000000000000000000000000000000000..93f4ba7d521491a8bda88bbb41e9b3557684c48d GIT binary patch literal 366124 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%0A~NSyE6ewV?xSGH7{I(m_~E@!=HbTrvD#ezT+J05 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 JWt~$(69DNHwuJxy literal 0 HcmV?d00001 diff --git a/icons/obj/machines/rust/96x96.dmi b/icons/obj/machines/rust/96x96.dmi new file mode 100644 index 0000000000000000000000000000000000000000..764f03c19165da3b64a986d8830af00a2c8c409f GIT binary patch literal 23151 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 a`u_oKeR_8gU+j$l0000<MNUMnLSTXmo2(T8 literal 0 HcmV?d00001 From fea32ecf719ff5a06e4dbbe6868197e02817e697 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 19 May 2022 00:48:40 -0400 Subject: [PATCH 099/200] Mo shit --- code/__DEFINES/atmospherics/reactor.dm | 6 ++ .../ZAS/XGM/xgm_immutable_gas_mixture.dm | 58 ------------------ code/modules/atmospherics/ZAS/Zone.dm | 2 - code/modules/atmospherics/rust/fuel_rod.dm | 45 ++++++++++++++ .../modules/atmospherics/rust/reactor_core.dm | 13 ++-- .../atmospherics/rust/reactor_em_field.dm | 6 +- icons/obj/machines/rust/fuel_rod.dmi | Bin 0 -> 223 bytes tgstation.dme | 4 +- 8 files changed, 65 insertions(+), 69 deletions(-) create mode 100644 code/__DEFINES/atmospherics/reactor.dm delete mode 100644 code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm create mode 100644 code/modules/atmospherics/rust/fuel_rod.dm create mode 100644 icons/obj/machines/rust/fuel_rod.dmi diff --git a/code/__DEFINES/atmospherics/reactor.dm b/code/__DEFINES/atmospherics/reactor.dm new file mode 100644 index 00000000000..5cda280fcf0 --- /dev/null +++ b/code/__DEFINES/atmospherics/reactor.dm @@ -0,0 +1,6 @@ +#define FUEL_ROD_GAS_VOLUME (CELL_VOLUME/2) +#define FUEL_ROD_REAGENT_VOLUME 200 + +#define ROD_FUEL (1<<0) +#define ROD_MODERATOR (1<<1) +#define ROD_CONTROL (1<<2) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm deleted file mode 100644 index 25238f32b4b..00000000000 --- a/code/modules/atmospherics/ZAS/XGM/xgm_immutable_gas_mixture.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/gas_mixture/immutable - temperature = TCMB - var/initial_temperature = TCMB - -/datum/gas_mixture/immutable/updateValues() - temperature = initial_temperature - return ..() - -/datum/gas_mixture/immutable/adjustGas(gasid, moles, update = 1) - return - -/datum/gas_mixture/immutable/remove() - return new type - -/datum/gas_mixture/immutable/add() - return TRUE - -/datum/gas_mixture/immutable/subtract() - return TRUE - -/datum/gas_mixture/immutable/divide() - return TRUE - -/datum/gas_mixture/immutable/multiply() - return TRUE - -/datum/gas_mixture/immutable/adjustGasWithTemp(gasid, moles, temp, update = 1) - return - -/datum/gas_mixture/immutable/adjustMultipleGases() - return - -/datum/gas_mixture/immutable/adjustMultipleGasesWithTemp() - return - -/datum/gas_mixture/immutable/merge() - return - -/datum/gas_mixture/immutable/copyFrom() - return - -/datum/gas_mixture/immutable/getHeatCapacity() - return HEAT_CAPACITY_VACUUM - -/datum/gas_mixture/immutable/removeRatio() - return new type - -/datum/gas_mixture/immutable/removeVolume() - return new type - -/datum/gas_mixture/immutable/removeByFlag() - return new type - -/datum/gas_mixture/immutable/shareRatio(datum/gas_mixture/other, connecting_tiles, share_size, one_way) - . = ..() - temperature = initial_temperature - - diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index d3e84ca15ee..59079017a4a 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -161,7 +161,6 @@ Class Procs: // Update gas overlays. if(air.checkTileGraphic(graphic_add, graphic_remove)) - //for(var/turf/simulated/T in contents) for(var/turf/open/T in contents) if(T.simulated) T.update_graphic(graphic_add, graphic_remove) @@ -192,7 +191,6 @@ Class Procs: // Update atom temperature. if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) last_air_temperature = air.temperature - //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) if(!T.simulated) continue diff --git a/code/modules/atmospherics/rust/fuel_rod.dm b/code/modules/atmospherics/rust/fuel_rod.dm new file mode 100644 index 00000000000..98e7f7cf46f --- /dev/null +++ b/code/modules/atmospherics/rust/fuel_rod.dm @@ -0,0 +1,45 @@ +/obj/item/fuel_rod + name = "fuel rod" + desc = "A heavy container filled with a reactive substance" + icon = 'icons/obj/machines/rust/fuel_rod.dmi' + flags_1 = CONDUCT_1 + hitsound = 'sound/weapons/smash.ogg' + force = 5 + throwforce = 10 + throw_speed = 1 + throw_range = 4 + custom_materials = list(/datum/material/iron = 500) + + var/obj/machinery/power/reactor_core/parent + var/max_volume + ///The amount of contents being exposed to the air, as a decimal + var/exposure_rate = 0 + +/obj/item/fuel_rod/proc/return_volume() + return + +/obj/item/fuel_rod/gas + name = "fuel rod (gas)" + desc = "A long and heavy container used for storing highly compressed gas." + + max_volume = FUEL_ROD_GAS_VOLUME + var/datum/gas_mixture/air_contents = null + +/obj/item/fuel_rod/gas/Initialize(mapload) + . = ..() + air_contents = new(max_volume) + +/obj/item/fuel_rod/gas/return_volume() + return air_contents.removeVolume(exposure_rate * air_contents.volume) + +/obj/item/fuel_rod/reagent + name = "fuel rod (reagent)" + + max_volume = FUEL_ROD_REAGENT_VOLUME + +/obj/item/fuel_rod/reagent/Initialize(mapload) + . = ..() + create_reagents(max_volume, TRANSPARENT) + +/obj/item/fuel_rod/reagent/return_volume() + return reagents.trans_to(parent, max_volume * exposure_rate, show_message = FALSE) diff --git a/code/modules/atmospherics/rust/reactor_core.dm b/code/modules/atmospherics/rust/reactor_core.dm index 5c5246e2fe1..402f037c4fb 100644 --- a/code/modules/atmospherics/rust/reactor_core.dm +++ b/code/modules/atmospherics/rust/reactor_core.dm @@ -18,6 +18,11 @@ var/field_strength = 1//0.01 var/initial_id_tag + var/list/all_rods = list() + var/list/control_rods = list() + var/list/moderator_rods = list() + var/list/fuel_rods = list() + /obj/machinery/power/reactor_core/mapped anchored = TRUE @@ -59,7 +64,7 @@ update_use_power(IDLE_POWER_USE) is_on = FALSE -/obj/machinery/power/reactor_core/proc/add_particles(var/name, var/quantity = 1) +/obj/machinery/power/reactor_core/proc/add_particles(name, quantity = 1) if(owned_field) owned_field.add_particles(name, quantity) return TRUE @@ -68,7 +73,7 @@ if(owned_field) . = owned_field.bullet_act(Proj) -/obj/machinery/power/reactor_core/proc/set_strength(var/value) +/obj/machinery/power/reactor_core/proc/set_strength(value) value = clamp(value, MIN_FIELD_STR, MAX_FIELD_STR) field_strength = value active_power_usage = value*5 @@ -83,7 +88,7 @@ Shutdown() return TRUE -/obj/machinery/power/reactor_core/attackby(var/obj/item/W, var/mob/user) +/obj/machinery/power/reactor_core/attackby(obj/item/W, mob/user) if(owned_field) to_chat(user,"<span class='warning'>Shut \the [src] off first!</span>") return @@ -103,7 +108,7 @@ return ..() -/obj/machinery/power/reactor_core/proc/Jumpstart(var/field_temperature) +/obj/machinery/power/reactor_core/proc/Jumpstart(field_temperature) field_strength = 501 // Generally a good size. Startup() if(!owned_field) diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index 44b86fc0279..111ec69fd40 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -271,7 +271,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K radiate_all() explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows. -/obj/effect/reactor_em_field/proc/set_field_strength(var/new_strength) +/obj/effect/reactor_em_field/proc/set_field_strength(new_strength) var/calc_size = 1 if(new_strength <= 50) calc_size = 1 @@ -355,11 +355,11 @@ Deuterium-tritium fusion: 4.5 x 10^7 K environment.addThermalEnergy(plasma_temperature*20000) radiation = 0 -/obj/effect/reactor_em_field/proc/change_size(var/newsize = 1) +/obj/effect/reactor_em_field/proc/change_size(newsize = 1) var/changed = 0 var/static/list/size_to_icon = list( "3" = 'icons/obj/machines/rust/96x96.dmi', - "5" = 'icons/obj/machines/rust//160x160.dmi', + "5" = 'icons/obj/machines/rust/160x160.dmi', "7" = 'icons/obj/machines/rust/224x224.dmi', "9" = 'icons/obj/machines/rust/288x288.dmi', "11" = 'icons/obj/machines/rust/352x352.dmi', diff --git a/icons/obj/machines/rust/fuel_rod.dmi b/icons/obj/machines/rust/fuel_rod.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7e48b39f9ca61ff847caeeb25237d5d14bb01342 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)Tn`*L@SlNUs{d4Ppa^40 zkY6x^!?PP{Ku&g5NJNQCYH@N=W<g12ejWou#hl=<f}+yzUxEuhetn|lt*dqJ%=zFA zp#~R?A3V}I@1uE=p{S>KhlO#F@nvH#g*lHV9hnrO5Ugoys=rmkII^?bSatIX35}!^ zM`wmjnK7FyQCoY*ubmCNYz*aprCxaIye$V>E8ywk7{W0#Ibp*8g9i*MI2mp(Q+lZR SU9=Y{$KdJe=d#Wzp$Pz5=}_YU literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 538ba3a0d06..653026cb969 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -196,6 +196,7 @@ #include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\atmospherics\atmos_piping.dm" +#include "code\__DEFINES\atmospherics\reactor.dm" #include "code\__DEFINES\atmospherics\temperature.dm" #include "code\__DEFINES\atmospherics\ZAS.dm" #include "code\__DEFINES\atmospherics\ZAS_math.dm" @@ -2337,7 +2338,6 @@ #include "code\modules\atmospherics\machinery\components\fusion\hfr_procs.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" -#include "code\modules\atmospherics\rust\particle_catcher.dm" #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" */ #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" @@ -2352,6 +2352,7 @@ #include "code\modules\atmospherics\rust\reactor_core.dm" #include "code\modules\atmospherics\rust\reactor_em_field.dm" #include "code\modules\atmospherics\rust\particle_catcher.dm" +#include "code\modules\atmospherics\rust\fuel_rod.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" @@ -2382,7 +2383,6 @@ #include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" #include "code\modules\atmospherics\ZAS\Turf.dm" #include "code\modules\atmospherics\ZAS\XGM\gases.dm" -#include "code\modules\atmospherics\ZAS\XGM\xgm_immutable_gas_mixture.dm" #include "code\modules\atmospherics\ZAS\Zone.dm" #include "code\modules\atmospherics\ZAS\zas_extras\inflatable.dm" #include "code\modules\atmospherics\ZAS\_docs.dm" From 25528355422f23878dc078c9fbd1fd892a8c0b83 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 19 May 2022 01:39:16 -0400 Subject: [PATCH 100/200] more fuel rod stuff --- code/__DEFINES/atmospherics/reactor.dm | 10 +++++ code/modules/atmospherics/rust/fuel_rod.dm | 44 +++++++++++++++++++ .../modules/atmospherics/rust/reactor_core.dm | 12 +++++ .../atmospherics/rust/reactor_em_field.dm | 2 +- 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/atmospherics/reactor.dm b/code/__DEFINES/atmospherics/reactor.dm index 5cda280fcf0..55d2c4afc27 100644 --- a/code/__DEFINES/atmospherics/reactor.dm +++ b/code/__DEFINES/atmospherics/reactor.dm @@ -4,3 +4,13 @@ #define ROD_FUEL (1<<0) #define ROD_MODERATOR (1<<1) #define ROD_CONTROL (1<<2) + +#define REACTOR_SLOT_1 "one" +#define REACTOR_SLOT_2 "two" +#define REACTOR_SLOT_3 "three" +#define REACTOR_SLOT_4 "four" +#define REACTOR_SLOT_5 "five" +#define REACTOR_SLOT_6 "six" +#define REACTOR_SLOT_7 "seven" +#define REACTOR_SLOT_8 "eight" +#define REACTOR_SLOT_9 "nine" diff --git a/code/modules/atmospherics/rust/fuel_rod.dm b/code/modules/atmospherics/rust/fuel_rod.dm index 98e7f7cf46f..be5c0d26304 100644 --- a/code/modules/atmospherics/rust/fuel_rod.dm +++ b/code/modules/atmospherics/rust/fuel_rod.dm @@ -11,6 +11,10 @@ custom_materials = list(/datum/material/iron = 500) var/obj/machinery/power/reactor_core/parent + ///Fuel, Control, Moderator + var/rod_type + ///The reactor slot this rod occupies + var/occupied_slot var/max_volume ///The amount of contents being exposed to the air, as a decimal var/exposure_rate = 0 @@ -18,6 +22,46 @@ /obj/item/fuel_rod/proc/return_volume() return +/obj/item/fuel_rod/proc/insert(obj/machinery/power/reactor_core/reactor, slot, mob/user) // No, you can't put two in one slot. Im sorry. + if(reactor.rods_by_slot[slot]) + to_chat(user, span_notice("There is already a fuel rod in that slot.")) + return + + parent = reactor + parent.rods_by_slot[slot] = src + parent.all_rods += src + occupied_slot = slot + + switch(rod_type) + if(ROD_FUEL) + parent.fuel_rods += src + if(ROD_CONTROL) + parent.control_rods += src + if(ROD_MODERATOR) + parent.moderator_rods += src + + +/obj/item/fuel_rod/proc/remove(mob/user) // PULL OUT PULL OUT + if(!parent) + CRASH("Fuel rod remove() called with no parent") + + if(user) + user.put_in_hands(src) + else + forceMove(get_turf(parent)) + + parent.rods_by_slot[occupied_slot] = null + parent.all_rods -= src + occupied_slot = null + switch(rod_type) + if(ROD_FUEL) + parent.fuel_rods -= src + if(ROD_CONTROL) + parent.control_rods -= src + if(ROD_MODERATOR) + parent.moderator_rods -= src + parent = null + /obj/item/fuel_rod/gas name = "fuel rod (gas)" desc = "A long and heavy container used for storing highly compressed gas." diff --git a/code/modules/atmospherics/rust/reactor_core.dm b/code/modules/atmospherics/rust/reactor_core.dm index 402f037c4fb..e615e1a3831 100644 --- a/code/modules/atmospherics/rust/reactor_core.dm +++ b/code/modules/atmospherics/rust/reactor_core.dm @@ -23,6 +23,18 @@ var/list/moderator_rods = list() var/list/fuel_rods = list() + var/list/rods_by_slot = list( + REACTOR_SLOT_1 = null, + REACTOR_SLOT_2 = null, + REACTOR_SLOT_3 = null, + REACTOR_SLOT_4 = null, + REACTOR_SLOT_5 = null, + REACTOR_SLOT_6 = null, + REACTOR_SLOT_7 = null, + REACTOR_SLOT_8 = null, + REACTOR_SLOT_9 = null + ) + /obj/machinery/power/reactor_core/mapped anchored = TRUE diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index 111ec69fd40..742e14a0fc7 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -44,7 +44,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K var/last_range var/last_power -/obj/effect/reactor_em_field/New(loc, var/obj/machinery/power/reactor_core/new_owned_core) +/obj/effect/reactor_em_field/New(loc, obj/machinery/power/reactor_core/new_owned_core) ..() if(!ignore_types) ignore_types = typecacheof( From bb78a5c795cf5e1485f39fb88e77e84ffa572289 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 19 May 2022 01:41:08 -0400 Subject: [PATCH 101/200] softdel my rod --- code/modules/atmospherics/rust/fuel_rod.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/atmospherics/rust/fuel_rod.dm b/code/modules/atmospherics/rust/fuel_rod.dm index be5c0d26304..7bf6ee830ce 100644 --- a/code/modules/atmospherics/rust/fuel_rod.dm +++ b/code/modules/atmospherics/rust/fuel_rod.dm @@ -19,6 +19,11 @@ ///The amount of contents being exposed to the air, as a decimal var/exposure_rate = 0 +/obj/item/fuel_rod/proc/Destroy(force) + if(parent) + remove(parent) + return ..() + /obj/item/fuel_rod/proc/return_volume() return From 796069baf04c861d6618629a75da132ee8e9256e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 19 May 2022 01:53:58 -0400 Subject: [PATCH 102/200] grumble --- code/modules/atmospherics/rust/fuel_rod.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/rust/fuel_rod.dm b/code/modules/atmospherics/rust/fuel_rod.dm index 7bf6ee830ce..b9f3470a350 100644 --- a/code/modules/atmospherics/rust/fuel_rod.dm +++ b/code/modules/atmospherics/rust/fuel_rod.dm @@ -19,7 +19,7 @@ ///The amount of contents being exposed to the air, as a decimal var/exposure_rate = 0 -/obj/item/fuel_rod/proc/Destroy(force) +/obj/item/fuel_rod/Destroy(force) if(parent) remove(parent) return ..() @@ -51,7 +51,7 @@ CRASH("Fuel rod remove() called with no parent") if(user) - user.put_in_hands(src) + INVOKE_ASYNC(user, /mob.proc/put_in_hands, src) else forceMove(get_turf(parent)) From 18696594275ecf42cf2f8c184487217d4af33dbd Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 1 Jun 2022 14:40:59 -0400 Subject: [PATCH 103/200] This is probably fine. --- code/__DEFINES/atmospherics/ZAS.dm | 10 +++---- code/controllers/subsystem/zas.dm | 4 +-- code/game/turfs/closed/_closed.dm | 2 +- code/modules/atmospherics/ZAS/Atom.dm | 5 +++- code/modules/atmospherics/ZAS/Turf.dm | 38 +-------------------------- 5 files changed, 13 insertions(+), 46 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 7d831e1d802..e840fa15297 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,10 +1,10 @@ -//#define ZASDBG +#define ZASDBG //#define MULTIZAS -#define AIR_ALLOWED 0 -#define AIR_BLOCKED 1 -#define ZONE_BLOCKED 2 -#define BLOCKED 3 +#define AIR_ALLOWED (0<<0) +#define AIR_BLOCKED (1<<0) +#define ZONE_BLOCKED (1<<1) +#define BLOCKED (1<<2) #define ZONE_MIN_SIZE 14 //zones with less than this many turfs will always merge, even if the connection is not direct diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 178725b864f..cf92662952b 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -362,8 +362,8 @@ SUBSYSTEM_DEF(zas) #endif var/ablock ATMOS_CANPASS_TURF(ablock, A, B) - if(ablock == BLOCKED) - return BLOCKED + if(ablock & BLOCKED) + return AIR_BLOCKED ATMOS_CANPASS_TURF(., B, A) return ablock | . diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 6b63d1f4c13..f269032d350 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -3,7 +3,7 @@ turf_flags = IS_SOLID opacity = TRUE density = TRUE - blocks_air = TRUE + blocks_air = AIR_BLOCKED rad_insulation = RAD_MEDIUM_INSULATION pass_flags_self = PASSCLOSEDTURF /* diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 501d16e1cab..9c15a00e3a2 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -8,18 +8,21 @@ return 1 -//Basically another way of calling CanPass(null, other, 0, 0) and CanPass(null, other, 1.5, 1). + //Returns: // 0 - Not blocked // AIR_BLOCKED - Blocked // ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. // BLOCKED - Blocked, zone boundaries will not cross even if opened. +///Checks whether or not ZAS can occupy this atom's turf. Invoked by the ATMOS_CANPASS_TURF macro. /atom/proc/zas_canpass(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif if(can_atmos_pass == CANPASS_PROC) CRASH("Atmos pass assigned proc when proc doesn't exist.") + else + CRASH("FUCK. zas_canpass() invoked when the atom doesn't even use it") // This is a legacy proc only here for compatibility - you probably should just use ATMOS_CANPASS_TURF directly. /turf/zas_canpass(turf/other) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index f2443e22dae..42267c2f595 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -20,7 +20,7 @@ /turf/proc/update_air_properties() var/block ATMOS_CANPASS_TURF(block, src, src) - if(block & AIR_BLOCKED) + if(block & AIR_BLOCKED || block & BLOCKED) //dbg(blocked) return 1 @@ -51,42 +51,6 @@ //var/turf/simulated/sim = unsim if(TURF_HAS_VALID_ZONE(unsim)) SSzas.connect(unsim, src) -/* -///Yes. Massive copy paste. Pain. -/turf/open/space/update_air_properties() - var/block - ATMOS_CANPASS_TURF(block, src, src) - if(block & AIR_BLOCKED) - //dbg(blocked) - return 1 - - #ifdef MULTIZAS - for(var/d = 1, d < 64, d *= 2) - #else - for(var/d = 1, d < 16, d *= 2) - #endif - - var/turf/unsim = get_step(src, d) - - if(!unsim) - continue - - block = unsim.zas_canpass(src) - - if(block & AIR_BLOCKED) - //unsim.dbg(air_blocked, turn(180,d)) - continue - - var/r_block = zas_canpass(unsim) - - if(r_block & AIR_BLOCKED) - continue - - if(unsim.simulated) - var/turf/sim = unsim - if(TURF_HAS_VALID_ZONE(sim)) - SSzas.connect(sim, src) -*/ // Helper for can_safely_remove_from_zone(). //ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT From 6cb73e8ca0dbd1c623005ccded0d2d9bbc9c293b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 2 Jun 2022 02:20:47 -0400 Subject: [PATCH 104/200] Alot of progress. Still fighting the selfmerge bug --- code/__DEFINES/atmospherics/ZAS.dm | 23 ++- code/controllers/subsystem/zas.dm | 5 +- code/game/atoms_movable.dm | 2 +- code/game/machinery/doors/door.dm | 4 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/shieldgen.dm | 2 +- .../effects/effect_system/effects_foam.dm | 4 +- code/game/objects/structures/false_walls.dm | 4 +- code/game/objects/structures/holosign.dm | 2 +- .../objects/structures/windoor_assembly.dm | 4 +- code/game/objects/structures/window.dm | 7 +- code/game/turfs/change_turf.dm | 15 +- code/game/turfs/turf.dm | 16 ++ code/modules/admin/verbs/fix_air.dm | 1 - .../antagonists/blob/structures/_blob.dm | 2 +- code/modules/atmospherics/ZAS/Atom.dm | 14 +- code/modules/atmospherics/ZAS/Connection.dm | 19 +- code/modules/atmospherics/ZAS/Debug.dm | 63 ++++++- code/modules/atmospherics/ZAS/Diagnostic.dm | 12 +- code/modules/atmospherics/ZAS/Fire.dm | 9 - code/modules/atmospherics/ZAS/Turf.dm | 171 +++++++++--------- code/modules/atmospherics/ZAS/Zone.dm | 8 +- .../atmospherics/ZAS/zas_extras/inflatable.dm | 2 +- 23 files changed, 205 insertions(+), 186 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index e840fa15297..a2c4ebee8c0 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -4,7 +4,6 @@ #define AIR_ALLOWED (0<<0) #define AIR_BLOCKED (1<<0) #define ZONE_BLOCKED (1<<1) -#define BLOCKED (1<<2) #define ZONE_MIN_SIZE 14 //zones with less than this many turfs will always merge, even if the connection is not direct @@ -37,16 +36,15 @@ } \ } while(FALSE) - - -//#define TURF_HAS_VALID_ZONE(T) (istype(T, /turf/simulated) && T:zone && !T:zone:invalid) ZASTURF - -#define TURF_HAS_VALID_ZONE(T) (T.simulated && T:zone && !T:zone:invalid) +#define TURF_HAS_VALID_ZONE(T) (T.simulated && T.zone && !T.zone.invalid) #ifdef MULTIZAS +///"Can safely remove from zone" GLOBAL_REAL(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) +///"Get zone neighbors" GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) +///Can air move from B to A? #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ ret = BLOCKED; \ @@ -78,10 +76,10 @@ GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) ret |= AM.zas_canpass(B); \ } \ if (CANPASS_NEVER) { \ - ret = BLOCKED; \ + ret = AIR_BLOCKED; \ } \ } \ - if (ret == BLOCKED) { \ + if (ret == AIR_BLOCKED) { \ break;\ }\ }\ @@ -91,9 +89,10 @@ GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) GLOBAL_REAL_VAR(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) +///Can air move from B to A? #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ - ret = BLOCKED; \ + ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ ret = ZONE_BLOCKED; \ @@ -107,17 +106,17 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) } \ if (CANPASS_DENSITY) { \ if (AM.density) { \ - ret |= AIR_BLOCKED; \ + ret |= AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ if (CANPASS_PROC) { \ ret |= AM.zas_canpass(B); \ } \ if (CANPASS_NEVER) { \ - ret = BLOCKED; \ + ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ - if (ret == BLOCKED) { \ + if (ret & AIR_BLOCKED) { \ break;\ }\ }\ diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index cf92662952b..7fd44b7f4dd 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -161,7 +161,7 @@ SUBSYSTEM_DEF(zas) to_chat(world, span_boldannounce("ZAS: Processing Geometry...")) var/simulated_turf_count = 0 - //for(var/turf/simulated/S) ZASTURF + for(var/turf/S) if(!S.simulated) continue @@ -362,7 +362,7 @@ SUBSYSTEM_DEF(zas) #endif var/ablock ATMOS_CANPASS_TURF(ablock, A, B) - if(ablock & BLOCKED) + if(ablock & AIR_BLOCKED) return AIR_BLOCKED ATMOS_CANPASS_TURF(., B, A) return ablock | . @@ -382,7 +382,6 @@ SUBSYSTEM_DEF(zas) B.c_merge(A) mark_zone_update(A) -//datum/controller/subsystem/zas/proc/connect(turf/simulated/A, turf/simulated/B) //ZASTURF /datum/controller/subsystem/zas/proc/connect(turf/A, turf/B) #ifdef ZASDBG ASSERT(A.simulated) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f561262a0ca..c66453dea45 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -113,7 +113,7 @@ unbuckle_all_mobs(force = TRUE) if(loc) - //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) + //Restore air flow if we were blocking it (movables with zas_canpass() will need to do this manually if necessary) if(((can_atmos_pass == CANPASS_DENSITY && density) || can_atmos_pass == CANPASS_NEVER) && isturf(loc)) can_atmos_pass = CANPASS_ALWAYS update_nearby_tiles() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 22fdee4329b..442193cd7c5 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -61,7 +61,7 @@ else flags_1 &= ~PREVENT_CLICK_UNDER_1 - update_nearby_tiles(TRUE) + update_nearby_tiles() //doors only block while dense though so we have to use the proc real_explosion_block = explosion_block explosion_block = EXPLOSION_BLOCK_PROC @@ -179,7 +179,7 @@ return /obj/machinery/door/Move() - update_nearby_tiles(TRUE) + update_nearby_tiles() . = ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7ddcd91cb5c..3ee24b2a485 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -60,7 +60,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/machinery/door/window/ComponentInitialize() . = ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 7798c13477f..12beef1bc21 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -14,7 +14,7 @@ /obj/structure/emergency_shield/Initialize(mapload) . = ..() setDir(pick(GLOB.cardinals)) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/emergency_shield/Destroy() update_nearby_tiles() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index abe6c7f88cf..c1d02254383 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -279,11 +279,11 @@ /obj/structure/foamedmetal/Initialize(mapload) . = ..() - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/foamedmetal/Destroy() set_density(0) - update_nearby_tiles(TRUE) + update_nearby_tiles() . = ..() /obj/structure/foamedmetal/Move() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 84a471a4931..121425c57a0 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -31,7 +31,7 @@ var/obj/item/stack/initialized_mineral = new mineral // Okay this kinda sucks. set_custom_materials(initialized_mineral.mats_per_unit, mineral_amount) qdel(initialized_mineral) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/falsewall/attack_hand(mob/user, list/modifiers) @@ -56,7 +56,7 @@ set_opacity(density) opening = FALSE update_appearance() - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/falsewall/zas_canpass(turf/other) if(QDELETED(src)) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index f2875d4c213..a851d1ea07c 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -106,7 +106,7 @@ . = ..() var/turf/local = get_turf(loc) ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/holosign/barrier/atmos/block_superconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players. return TRUE diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4539b8ff00f..449a1480076 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -33,7 +33,7 @@ . = ..() if(set_dir) setDir(set_dir) - update_nearby_tiles(TRUE) + update_nearby_tiles() var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = .proc/on_exit, @@ -41,7 +41,7 @@ AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/windoor_assembly/Destroy() set_density(FALSE) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 73cd11da7c8..a44021cf73d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -62,7 +62,7 @@ if(reinf && anchored) state = RWINDOW_SECURE - update_nearby_tiles(TRUE) + update_nearby_tiles() if(fulltile) setDir() @@ -333,7 +333,7 @@ . += new /obj/item/shard(location) /obj/structure/window/proc/AfterRotation(mob/user, degrees) - update_nearby_tiles(TRUE) + update_nearby_tiles() /obj/structure/window/proc/on_painted(obj/structure/window/source, is_dark_color) SIGNAL_HANDLER @@ -358,9 +358,6 @@ /obj/structure/window/Move() update_nearby_tiles() . = ..() - /* - if(anchored) - move_update_air(T)*/ /obj/structure/window/zas_canpass(turf/T, vertical = FALSE) if(QDELETED(src)) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 6ac60a6b9a4..569a0567f77 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -14,9 +14,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( qdel(thing, force=TRUE) if(turf_type) - var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - SSzas.mark_for_update(newT) - //CALCULATE_ADJACENT_TURFS(newT, KILL_EXCITED) + ChangeTurf(turf_type, baseturf_type, flags) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -81,8 +79,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_bp = blueprint_data blueprint_data = null - - var/list/old_baseturfs = baseturfs var/old_type = type @@ -91,15 +87,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( changing_turf = TRUE - if(connections) connections.erase_all() - if(simulated) - //Yeah, we're just going to rebuild the whole thing. - //Despite this being called a bunch during explosions, - //the zone will only really do heavy lifting once. - var/turf/S = src - if(S.zone) S.zone.rebuild() - qdel(src) //Just get the side effects and call Destroy + //We do this here so anything that doesn't want to persist can clear itself var/list/old_comp_lookup = comp_lookup?.Copy() var/list/old_signal_procs = signal_procs?.Copy() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a6e8e7a9864..356b1aa1781 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -185,10 +185,26 @@ GLOBAL_LIST_EMPTY(station_turfs) for(var/A in B.contents) qdel(A) return + visibilityChanged() QDEL_LIST(blueprint_data) flags_1 &= ~INITIALIZED_1 requires_activation = FALSE + + ///ZAS THINGS + if(connections) + connections.erase_all() + + if(simulated && zone) + ///Try to gracefully remove + if(can_safely_remove_from_zone()) + c_copy_air() + zone.remove(src) + + else //Just rebuild the fucker + zone.rebuild() + ///NO MORE ZAS THINGS + ..() vis_contents.Cut() diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index 8dab77c9d09..a23d19cba78 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -39,7 +39,6 @@ for(var/id in xgm_gas_data.tile_overlay) unsorted_overlays |= xgm_gas_data.tile_overlay[id] - //for(var/turf/simulated/T in world) ZASTURF for(var/turf/T in world) if(!T.simulated) continue diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index afcb295838a..df2b67c1b3d 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -42,7 +42,7 @@ setDir(pick(GLOB.cardinals)) update_appearance() if(atmosblock) - update_nearby_tiles(TRUE) + update_nearby_tiles() ConsumeTile() if(!QDELETED(src)) //Consuming our tile can in rare cases cause us to del AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOB, CELL_VIRUS_TABLE_GENERIC, 2, 2) diff --git a/code/modules/atmospherics/ZAS/Atom.dm b/code/modules/atmospherics/ZAS/Atom.dm index 9c15a00e3a2..c0bb67ae42b 100644 --- a/code/modules/atmospherics/ZAS/Atom.dm +++ b/code/modules/atmospherics/ZAS/Atom.dm @@ -1,6 +1,5 @@ //Convenience function for atoms to update turfs they occupy -/atom/movable/proc/update_nearby_tiles(need_rebuild) - //for(var/turf/simulated/turf in locs) ZASTURF +/atom/movable/proc/update_nearby_tiles() for(var/turf/turf in locs) if(!turf.simulated) continue @@ -10,10 +9,9 @@ //Returns: -// 0 - Not blocked -// AIR_BLOCKED - Blocked -// ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. -// BLOCKED - Blocked, zone boundaries will not cross even if opened. +// 0 / AIR_ALLOWED - Not blocked. Air and zones can mingle with this turf as they please. +// AIR_BLOCKED - Blocked. Air cannot move into, out of, or over this turf. +// ZONE_BLOCKED - Air can flow in this turf, but zones may not merge over it. ///Checks whether or not ZAS can occupy this atom's turf. Invoked by the ATMOS_CANPASS_TURF macro. /atom/proc/zas_canpass(turf/other) #ifdef ZASDBG @@ -32,6 +30,7 @@ . = 0 ATMOS_CANPASS_TURF(., src, other) + stack_trace("Turf ZAS canpass invoked.") /atom/proc/zas_mark_update() var/turf/local_turf = get_turf(loc) @@ -42,6 +41,3 @@ /atom var/simulated = TRUE var/can_atmos_pass = CANPASS_ALWAYS -#ifdef ZASDBG - var/verbose = FALSE -#endif diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index bfd782b3e61..0b5d66fdc1e 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -48,20 +48,17 @@ Class Procs: Makes numerous checks to decide whether the connection is still valid. Erases it automatically if not. */ -/* ZASTURF -/connection/var/turf/simulated/A -/connection/var/turf/simulated/B -*/ -/connection/var/turf/A -/connection/var/turf/B -/connection/var/zone/zoneA -/connection/var/zone/zoneB -/connection/var/connection_edge/edge +/connection/ + var/turf/A + var/turf/B + var/zone/zoneA + var/zone/zoneB + + var/connection_edge/edge -/connection/var/state = 0 + var/state = 0 -//connection/New(turf/simulated/A, turf/simulated/B) ZASTURF /connection/New(turf/A, turf/B) #ifdef ZASDBG //ASSERT(TURF_HAS_VALID_ZONE(A)) diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index 9ec0d209228..961ab554798 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -1,18 +1,37 @@ +#ifdef ZASDBG + GLOBAL_REAL_VAR(obj/effect/zasdbg/assigned/zasdbgovl_assigned) = new GLOBAL_REAL_VAR(obj/effect/zasdbg/created/zasdbgovl_created) = new GLOBAL_REAL_VAR(obj/effect/zasdbg/merged/zasdbgovl_merged) = new GLOBAL_REAL_VAR(obj/effect/zasdbg/invalid_zone/zasdbgovl_invalid_zone) = new -GLOBAL_REAL_VAR(obj/effect/zasdbg/air_blocked/zasdbgovl_air_blocked) = new -GLOBAL_REAL_VAR(obj/effect/zasdbg/zone_blocked/zasdbgovl_zone_blocked) = new GLOBAL_REAL_VAR(obj/effect/zasdbg/blocked/zasdbgovl_blocked) = new GLOBAL_REAL_VAR(obj/effect/zasdbg/mark/zasdbgovl_mark) = new -/connection_edge/var/dbg_out = 0 +GLOBAL_REAL_VAR(list/zasdbgovl_dirblock) = list( + "north" = new /obj/effect/zasdbg/air_blocked/north, + "east" = new /obj/effect/zasdbg/air_blocked/east, + "south" = new /obj/effect/zasdbg/air_blocked/south, + "west" = new /obj/effect/zasdbg/air_blocked/west, +) +///Retrives the directional block indicator overlay for a given direction +#define ZAS_DIRECTIONAL_BLOCKER(d) (zasdbgovl_dirblock[dir2text(d)]) + +GLOBAL_REAL_VAR(list/zasdbgovl_dirzoneblock) = list( + "north" = new /obj/effect/zasdbg/zone_blocked/north, + "east" = new /obj/effect/zasdbg/zone_blocked/east, + "south" = new /obj/effect/zasdbg/zone_blocked/south, + "west" = new /obj/effect/zasdbg/zone_blocked/west, +) +///Retrieves the zone blocked debug overlay for a given direction +#define ZAS_ZONE_BLOCKER(d) (zasdbgovl_dirzoneblock[dir2text(d)]) /obj/effect/zasdbg icon = 'modular_pariah/master_files/icons/testing/Zone.dmi' invisibility = INVISIBILITY_OBSERVER mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plane = ABOVE_GAME_PLANE + layer = FLY_LAYER + vis_flags = NONE /obj/effect/zasdbg/assigned icon_state = "assigned" @@ -22,21 +41,45 @@ GLOBAL_REAL_VAR(obj/effect/zasdbg/mark/zasdbgovl_mark) = new icon_state = "merged" /obj/effect/zasdbg/invalid_zone icon_state = "invalid" -/obj/effect/zasdbg/air_blocked - icon_state = "block" -/obj/effect/zasdbg/zone_blocked - icon_state = "zoneblock" /obj/effect/zasdbg/blocked icon_state = "fullblock" /obj/effect/zasdbg/mark icon_state = "mark" -/turf/var/tmp/dbg_img -/turf/proc/dbg(image/img, d = 0) - if(d > 0) img.dir = d +/obj/effect/zasdbg/zone_blocked + icon_state = "zoneblock" + +/obj/effect/zasdbg/zone_blocked/north + dir = NORTH +/obj/effect/zasdbg/zone_blocked/east + dir = EAST +/obj/effect/zasdbg/zone_blocked/south + dir = SOUTH +/obj/effect/zasdbg/zone_blocked/west + dir = WEST + +/obj/effect/zasdbg/air_blocked + icon_state = "block" + +/obj/effect/zasdbg/air_blocked/north + dir = NORTH +/obj/effect/zasdbg/air_blocked/east + dir = EAST +/obj/effect/zasdbg/air_blocked/south + dir = SOUTH +/obj/effect/zasdbg/air_blocked/west + dir = WEST + + +/turf/var/tmp/obj/effect/zasdbg/dbg_img +/turf/proc/dbg(obj/effect/zasdbg/img) vis_contents -= dbg_img vis_contents += img dbg_img = img /proc/soft_assert(thing,fail) if(!thing) message_admins(fail) + +/turf/proc/zas_log(string) + to_chat(world, "[span_admin("ZAS:")] verbose turf output of [src] at ([src.x], [src.y], [src.z]): [string]") +#endif diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index aeb088d7ad9..17f44c2e459 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -1,8 +1,8 @@ /client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" if(T) - if(T.simulated && T:zone) //ZASTURF - T:zone:dbg_data(src) + if(T.simulated && T.zone) + T.zone.dbg_data(src) else to_chat(mob, span_admin("ZASDBG: No zone here.")) var/datum/gas_mixture/mix = T.return_air() @@ -17,9 +17,9 @@ /client/var/list/zone_debug_images -/client/proc/Test_ZAS_Connection(turf/T as turf) //ZASTURF +/client/proc/Test_ZAS_Connection(turf/T as turf) set category = "Debug" - if(!T.simulated) //ZASTURF + if(!T.simulated) return var/direction_list = list(\ @@ -37,7 +37,9 @@ return if(direction == "N/A") - if(!(T.zas_canpass(T) & AIR_BLOCKED)) + var/canpass_self + ATMOS_CANPASS_TURF(canpass_self, T, T) + if(!(canpass_self & AIR_BLOCKED)) to_chat(mob, "The turf can pass air! :D") else to_chat(mob, "No air passage :x") diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 6a1dc3e08a2..029d1c979a1 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -56,7 +56,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin fire_tiles -= T fuel_objs -= fuel else - //for(var/turf/simulated/T in fire_tiles) ZASTURF for(var/turf/T in fire_tiles) if(istype(T.fire)) qdel(T.fire) @@ -92,7 +91,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/proc/create_fire(fl) return 0 -//turf/simulated/create_fire(fl) ZASTURF /turf/open/create_fire(fl, create_own_fuel) if(!simulated) return @@ -142,7 +140,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(QDELETED(src)) return PROCESS_KILL - //var/turf/simulated/my_tile = loc ZASTURF var/turf/my_tile = loc if(istype(my_tile, /turf/open/space) || !my_tile.zone) if(my_tile && my_tile.fire == src) @@ -174,7 +171,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //spread for(var/direction in GLOB.cardinals) - //var/turf/simulated/enemy_tile = get_step(my_tile, direction) ZASTURF var/turf/enemy_tile = get_step(my_tile, direction) if(!istype(enemy_tile, /turf/open/space)) if(my_tile.open_directions & direction) //Grab all valid bordering tiles @@ -233,12 +229,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin SSzas.active_hotspots.Remove(src) . = ..() -//turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. ZASTURF /turf/var/fire_protection = 0 /turf/proc/apply_fire_protection() fire_protection = world.time -/*/turf/simulated/apply_fire_protection() ZASTURF - fire_protection = world.time*/ /turf/open/space/apply_fire_protection() return @@ -475,11 +468,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin to_be_destroyed = FALSE -//turf/proc/adjacent_fire_act(turf/simulated/floor/source, exposed_temperature, exposed_volume) /turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adj_temp, adj_volume) return -//turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) ZASTURF /turf/open/floor/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) var/dir_to = get_dir(src, adj_turf) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 42267c2f595..a30abfc5ea2 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -9,8 +9,11 @@ var/thermal_conductivity = 0.05 var/list/initial_gas var/planetary_atmos //Let's just let this exist for now. +#ifdef ZASDBG + ///Set to TRUE during debugging to get chat output on the atmos status of this turf + var/verbose = FALSE +#endif -///turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) ZASTURF /turf/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) vis_contents += graphic_add @@ -18,11 +21,11 @@ vis_contents -= graphic_remove /turf/proc/update_air_properties() - var/block - ATMOS_CANPASS_TURF(block, src, src) - if(block & AIR_BLOCKED || block & BLOCKED) - //dbg(blocked) - return 1 + var/self_block + ATMOS_CANPASS_TURF(self_block, src, src) + if(self_block & AIR_BLOCKED) + src.dbg(zasdbgovl_blocked) + return TRUE #ifdef MULTIZAS for(var/d = 1, d < 64, d *= 2) @@ -30,30 +33,29 @@ for(var/d = 1, d < 16, d *= 2) #endif - var/turf/unsim = get_step(src, d) + var/turf/target = get_step(src, d) - if(!unsim) + if(!target) continue + var/us_blocks_target + ATMOS_CANPASS_TURF(us_blocks_target, src, target) - block = unsim.zas_canpass(src) - - if(block & AIR_BLOCKED) - //unsim.dbg(air_blocked, turn(180,d)) + if(us_blocks_target & AIR_BLOCKED) continue - var/r_block = zas_canpass(unsim) - - if(r_block & AIR_BLOCKED) + var/target_blocks_us + ATMOS_CANPASS_TURF(target_blocks_us, target, src) + if(target_blocks_us & AIR_BLOCKED) + #ifdef ZASDBG + target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) + #endif continue - //if(istype(unsim, /turf/simulated)) ZASTURF - if(unsim.simulated) - //var/turf/simulated/sim = unsim - if(TURF_HAS_VALID_ZONE(unsim)) - SSzas.connect(unsim, src) + if(target.simulated) + if(TURF_HAS_VALID_ZONE(target)) + SSzas.connect(target, src) // Helper for can_safely_remove_from_zone(). -//ZASTURF - MACRO IM NOT COMMENTING THIS SHIT OUT #define GET_ZONE_NEIGHBOURS(T, ret) \ ret = 0; \ if (T.zone) { \ @@ -75,7 +77,6 @@ This implementation may produce false negatives but it (hopefully) will not produce any false postiives. */ -///turf/simulated/proc/can_safely_remove_from_zone() ZASTURF /turf/proc/can_safely_remove_from_zone() if(!zone) return 1 @@ -87,9 +88,7 @@ //for each pair of "adjacent" cardinals (e.g. NORTH and WEST, but not NORTH and SOUTH) if((dir & check_dirs) == dir) //check that they are connected by the corner turf - //var/turf/simulated/T = get_step(src, dir) ZASTURF var/turf/T = get_step(src, dir) - //if (!istype(T)) ZASTURF if (!T.simulated) . &= ~dir continue @@ -102,7 +101,6 @@ //it is safe to remove src from the zone if all cardinals are connected by corner turfs . = !. -//turf/simulated/update_air_properties() ZAS /turf/open/update_air_properties() if(!simulated) return ..() @@ -111,12 +109,13 @@ c_copy_air() //not very efficient :( zone = null //Easier than iterating through the list at the zone. - var/s_block - ATMOS_CANPASS_TURF(s_block, src, src) - if(s_block & AIR_BLOCKED) + var/self_block + ATMOS_CANPASS_TURF(self_block, src, src) + if(self_block & AIR_BLOCKED) #ifdef ZASDBG - //if(verbose) log_admin("Self-blocked.") - //dbg(blocked) + if(verbose) + zas_log("Self-blocked.") + src.dbg(zasdbgovl_blocked) #endif if(zone) var/zone/z = zone @@ -133,105 +132,101 @@ open_directions = 0 var/list/postponed + #ifdef MULTIZAS for(var/d = 1, d < 64, d *= 2) #else for(var/d = 1, d < 16, d *= 2) #endif + var/turf/target = get_step(src, d) - var/turf/unsim = get_step(src, d) - - if(!unsim) //edge of map + if(!target) //edge of map continue - //var/block = unsim.zas_canpass(src) - var/block - ATMOS_CANPASS_TURF(block, src, unsim) - if(block & AIR_BLOCKED) - + ///The air mobility of target >> src + var/target_to_us + ATMOS_CANPASS_TURF(target_to_us, src, target) + if(target_to_us & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_admin("[d] is blocked.") - //unsim.dbg(air_blocked, turn(180,d)) + if(verbose) + zas_log("[dir2text(d)] is blocked.") + src.dbg(ZAS_DIRECTIONAL_BLOCKER(d)) #endif continue - //var/r_block = zas_canpass(unsim) - var/r_block - ATMOS_CANPASS_TURF(r_block, unsim, src) - if(r_block & AIR_BLOCKED) - + ///The air mobility of src >> target + var/us_to_target + ATMOS_CANPASS_TURF(us_to_target, target, src) + if(us_to_target & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_admin("[d] is blocked.") - //dbg(air_blocked, d) + if(verbose) + log_admin("[dir2text(d)] is blocked.") + target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) #endif //Check that our zone hasn't been cut off recently. //This happens when windows move or are constructed. We need to rebuild. - //if((previously_open & d) && istype(unsim, /turf/simulated)) ZAS - if((previously_open & d) && unsim.simulated) - var/turf/sim = unsim - if(zone && sim.zone == zone) + if((previously_open & d) && target.simulated) + var/turf/sim_target = target + if(zone && sim_target.zone == zone) zone.rebuild() return - continue open_directions |= d - //if(istype(unsim, /turf/simulated)) ZASTURF - if(unsim.simulated) - - var/turf/sim = unsim - sim.open_directions |= GLOB.reverse_dir[d] - - if(TURF_HAS_VALID_ZONE(sim)) + if(target.simulated) + var/turf/sim_target = target + sim_target.open_directions |= GLOB.reverse_dir[d] + if(TURF_HAS_VALID_ZONE(sim_target)) //Might have assigned a zone, since this happens for each direction. if(!zone) - //We do not merge if // they are blocking us and we are not blocking them, or if // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) + if(((target_to_us & ZONE_BLOCKED) && !(us_to_target & ZONE_BLOCKED)) || ((us_to_target & ZONE_BLOCKED) && !(self_block & ZONE_BLOCKED))) #ifdef ZASDBG - if(verbose) log_admin("[d] is zone blocked.") - - dbg(zasdbgovl_zone_blocked, d) + if(verbose) + zas_log("[dir2text(d)] is zone blocked.") + dbg(ZAS_ZONE_BLOCKER(d)) #endif //Postpone this tile rather than exit, since a connection can still be made. - if(!postponed) postponed = list() - postponed.Add(sim) + if(!postponed) + postponed = list() + postponed.Add(sim_target) else - - sim.zone.add(src) + sim_target.zone.add(src) #ifdef ZASDBG dbg(zasdbgovl_assigned) - if(verbose) log_admin("Added to [zone]") + if(verbose) + zas_log("Added to [zone]") #endif - else if(sim.zone != zone) - + else if(sim_target.zone != zone) #ifdef ZASDBG - if(verbose) log_admin("Connecting to [sim.zone]") + if(verbose) + zas_log("Connecting to [sim_target.zone]") #endif - SSzas.connect(src, sim) - + SSzas.connect(src, sim_target) #ifdef ZASDBG - else if(verbose) log_admin("[d] has same zone.") + else if(verbose) + zas_log("[dir2text(d)] has same zone.") - else if(verbose) log_admin("[d] has invalid zone.") + else if(verbose) + zas_log("[dir2text(d)] has invalid or rebuilding zone.") #endif else - //Postponing connections to tiles until a zone is assured. - if(!postponed) postponed = list() - postponed.Add(unsim) + if(!postponed) + postponed = list() + postponed.Add(target) if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. var/zone/newzone = new/zone() @@ -247,17 +242,16 @@ for(var/turf/T in postponed) if(T.zone == src.zone) + #ifdef ZASDBG + zas_log("This turf tried to merge into itself! Current type: [src.type]") + #endif CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning SSzas.connect(src, T) /turf/proc/post_update_air_properties() - if(connections) connections.update_all() -/* -/turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - return 0*/ + if(connections) + connections.update_all() -/*/turf/proc/assume_gas(gasid, moles, temp = 0) - return 0*/ /atom/movable/proc/block_superconductivity() return @@ -282,14 +276,12 @@ var/datum/gas_mixture/GM = return_air() return GM.remove(amount) -///turf/simulated/assume_air(datum/gas_mixture/giver) ZASTURF /turf/assume_air(datum/gas_mixture/giver) if(!simulated) return var/datum/gas_mixture/my_air = return_air() my_air.merge(giver) -//turf/simulated/assume_gas(gasid, moles, temp = null) ZASTURF ///Basically adjustGasWithTemp() but a turf proc. /turf/proc/assume_gas(gasid, moles, temp = null) if(!simulated) @@ -304,7 +296,6 @@ return 1 -//turf/simulated/return_air() ZASTURF /turf/return_air() RETURN_TYPE(/datum/gas_mixture) if(!simulated) @@ -340,12 +331,12 @@ AIR_UPDATE_VALUES(air) /turf/proc/c_copy_air() - if(!air) air = new/datum/gas_mixture + if(!air) + air = new/datum/gas_mixture air.copyFrom(zone.air) air.group_multiplier = 1 -//turf/simulated/proc/atmos_spawn_air(gas_id, amount, initial_temperature) ZASTURF /turf/proc/atmos_spawn_air(gas_id, amount, initial_temperature) if(!simulated) return diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 59079017a4a..8b8c2e02ed3 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -104,7 +104,7 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() - //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) if(!T.simulated) continue @@ -125,16 +125,16 @@ Class Procs: invalid = 1 SSzas.remove_zone(src) #ifdef ZASDBG - //for(var/turf/simulated/T in contents) ZASTURF for(var/turf/T in contents) if(!T.simulated) T.dbg(zasdbgovl_invalid_zone) #endif /zone/proc/rebuild() - if(invalid) return //Short circuit for explosions where rebuild is called many times over. + if(invalid) + return //Short circuit for explosions where rebuild is called many times over. c_invalidate() - //for(var/turf/simulated/T in contents) ZASTURF + for(var/turf/T in contents) if(!T.simulated) continue diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm index f9d1edb23ce..d5a35bff08b 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -71,7 +71,7 @@ /obj/structure/inflatable/New(location) ..() - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/structure/inflatable/Initialize() . = ..() From 58e2b5ec8134e51273d829ad334def5f97922801 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 2 Jun 2022 13:15:25 -0400 Subject: [PATCH 105/200] ZAS READABILITY UPDATE Adds a ton of comments to ZAS procs, renames some, and greatly improves ZAS debugging tools. --- code/__DEFINES/atmospherics/ZAS.dm | 14 +- code/controllers/subsystem/zas.dm | 35 +++-- code/game/turfs/open/_open.dm | 2 - code/game/turfs/open/asteroid.dm | 10 +- code/game/turfs/open/basalt.dm | 2 +- code/game/turfs/open/chasm.dm | 6 +- code/game/turfs/open/floor/misc_floor.dm | 4 +- .../turfs/open/floor/plating/misc_plating.dm | 6 +- code/game/turfs/open/ice.dm | 4 +- code/game/turfs/open/lava.dm | 2 +- code/game/turfs/open/openspace.dm | 4 +- code/game/turfs/open/planet.dm | 4 +- code/game/turfs/open/snow.dm | 4 +- code/game/turfs/open/water.dm | 3 +- code/game/turfs/turf.dm | 4 +- code/modules/admin/verbs/fix_air.dm | 2 +- code/modules/atmospherics/ZAS/Connection.dm | 122 ++++++++++++++---- .../atmospherics/ZAS/ConnectionGroup.dm | 88 +++++++++---- .../atmospherics/ZAS/ConnectionManager.dm | 16 ++- code/modules/atmospherics/ZAS/Debug.dm | 13 +- code/modules/atmospherics/ZAS/Turf.dm | 61 ++++----- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 62 ++++----- code/modules/atmospherics/ZAS/Zone.dm | 47 +++++-- .../atmospherics/machinery/other/miner.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 2 - .../ruins/icemoonruin_code/hotsprings.dm | 2 +- code/modules/mod/modules/modules_maint.dm | 2 +- 27 files changed, 336 insertions(+), 187 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index a2c4ebee8c0..450fb1d3cf2 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,15 +1,23 @@ -#define ZASDBG +//#define ZASDBG //#define MULTIZAS +///Air and zones freely mingle with this turf under the given conditions #define AIR_ALLOWED (0<<0) +///Neither air nor zones can interact with this turf under the given conditions #define AIR_BLOCKED (1<<0) +///Air can pass through or into this turf, but zones may not merge with it. #define ZONE_BLOCKED (1<<1) -#define ZONE_MIN_SIZE 14 //zones with less than this many turfs will always merge, even if the connection is not direct +///Zones with less than this many turfs will always merge, even if the connection is not direct +#define ZONE_MIN_SIZE 14 +///Air can always pass #define CANPASS_ALWAYS 1 +///Air can only pass if density is FALSE #define CANPASS_DENSITY 2 +///This atom uses /proc/zas_canpass() #define CANPASS_PROC 3 +///Air can never pass #define CANPASS_NEVER 4 #define NORTHUP (NORTH|UP) @@ -21,7 +29,7 @@ #define SOUTHDOWN (SOUTH|DOWN) #define WESTDOWN (WEST|DOWN) - +///A replacement for /datum/gas_mixture/proc/update_values() #define AIR_UPDATE_VALUES(air) \ do{ \ var/list/cache = air.gas; \ diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 7fd44b7f4dd..725c03eb5d1 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -107,7 +107,7 @@ SUBSYSTEM_DEF(zas) var/active_zones = 0 var/next_id = 1 - +///Stops processing while all ZAS-controlled airs and fires are nulled and the subsystem is reinitialized. /datum/controller/subsystem/zas/proc/Reboot() // Stop processing while we rebuild. can_fire = FALSE @@ -125,7 +125,7 @@ SUBSYSTEM_DEF(zas) var/zone/zone = zones[zones.len] zones.len-- - zone.c_invalidate() + zone.invalidate() edges.Cut() tiles_to_update.Cut() @@ -344,17 +344,20 @@ SUBSYSTEM_DEF(zas) cached_cost += TICK_USAGE_REAL - timer cost_zones = MC_AVERAGE(cost_zones, TICK_DELTA_TO_MS(cached_cost)) +///Adds a zone to the subsystem, gives it's identifer, and marks it for update. /datum/controller/subsystem/zas/proc/add_zone(zone/z) zones += z z.name = "Zone [next_id++]" mark_zone_update(z) +///Removes a zone from the subsystem. /datum/controller/subsystem/zas/proc/remove_zone(zone/z) zones -= z zones_to_update -= z if (processing_zones) processing_zones -= z +///Checks to see if air can flow between A and B. /datum/controller/subsystem/zas/proc/air_blocked(turf/A, turf/B) #ifdef ZASDBG ASSERT(isturf(A)) @@ -367,6 +370,7 @@ SUBSYSTEM_DEF(zas) ATMOS_CANPASS_TURF(., B, A) return ablock | . +///Merges two zones. Largest by turf count wins. /datum/controller/subsystem/zas/proc/merge(zone/A, zone/B) #ifdef ZASDBG ASSERT(istype(A)) @@ -376,12 +380,13 @@ SUBSYSTEM_DEF(zas) ASSERT(A != B) #endif if(A.contents.len < B.contents.len) - A.c_merge(B) + A.merge_into(B) mark_zone_update(B) else - B.c_merge(A) + B.merge_into(A) mark_zone_update(A) +///Forms a /connection/ between two turfs. /datum/controller/subsystem/zas/proc/connect(turf/A, turf/B) #ifdef ZASDBG ASSERT(A.simulated) @@ -406,15 +411,17 @@ SUBSYSTEM_DEF(zas) var/a_to_b = get_dir(A,B) var/b_to_a = get_dir(B,A) - if(!A.connections) A.connections = new - if(!B.connections) B.connections = new + if(!A.connections) + A.connections = new + if(!B.connections) + B.connections = new if(A.connections.get(a_to_b)) return if(B.connections.get(b_to_a)) return - if(!space) - if(A.zone == B.zone) return + if(!space && (A.zone == B.zone)) + return var/connection/c = new /connection(A,B) @@ -422,8 +429,10 @@ SUBSYSTEM_DEF(zas) A.connections.place(c, a_to_b) B.connections.place(c, b_to_a) - if(direct) c.mark_direct() + if(direct) + c.mark_direct() +///Marks a turf for update. /datum/controller/subsystem/zas/proc/mark_for_update(turf/T) #ifdef ZASDBG ASSERT(isturf(T)) @@ -436,6 +445,7 @@ SUBSYSTEM_DEF(zas) #endif T.needs_air_update = 1 +///Marks a zone for update. /datum/controller/subsystem/zas/proc/mark_zone_update(zone/Z) #ifdef ZASDBG ASSERT(istype(Z)) @@ -445,6 +455,7 @@ SUBSYSTEM_DEF(zas) zones_to_update += Z Z.needs_update = 1 +///Sleeps an edge, preventing it from processing. /datum/controller/subsystem/zas/proc/mark_edge_sleeping(connection_edge/E) #ifdef ZASDBG ASSERT(istype(E)) @@ -454,6 +465,7 @@ SUBSYSTEM_DEF(zas) active_edges -= E E.sleeping = 1 +///Wakes an edge, adding it to the active process list. /datum/controller/subsystem/zas/proc/mark_edge_active(connection_edge/E) #ifdef ZASDBG ASSERT(istype(E)) @@ -463,9 +475,11 @@ SUBSYSTEM_DEF(zas) active_edges += E E.sleeping = 0 +///Wrapper for zoneA.air.compare(zoneB.air) /datum/controller/subsystem/zas/proc/equivalent_pressure(zone/A, zone/B) return A.air.compare(B.air) +///Returns *AN* edge between zones A and B, if one exists. Calls recheck() on it. /datum/controller/subsystem/zas/proc/get_edge(zone/A, zone/B) if(istype(B)) for(var/connection_edge/zone/edge in A.edges) @@ -484,6 +498,7 @@ SUBSYSTEM_DEF(zas) edge.recheck() return edge +///Compare two turfs to see if they are EXACTLY the same. /datum/controller/subsystem/zas/proc/has_same_air(turf/A, turf/B) if(A.initial_gas) if(!B.initial_gas) @@ -501,6 +516,7 @@ SUBSYSTEM_DEF(zas) return 0 return 1 +///Removes an edge from the subsystem. /datum/controller/subsystem/zas/proc/remove_edge(connection_edge/E) edges -= E if(!E.sleeping) @@ -508,6 +524,7 @@ SUBSYSTEM_DEF(zas) if(processing_edges) processing_edges -= E +///Randomizes the lavaland gas mixture, and sets all lavaland unsimmed turfs to it. /datum/controller/subsystem/zas/proc/fuck_lavaland() var/list/restricted_gases = list() ///No funny gasses allowed diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index b081387af5d..9ed6fe05a38 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -118,7 +118,6 @@ icon = 'icons/turf/boss_floors.dmi' icon_state = "boss" baseturfs = /turf/open/indestructible/boss - planetary_atmos = TRUE initial_gas = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/boss/air @@ -126,7 +125,6 @@ /turf/open/indestructible/hierophant icon = 'icons/turf/floors/hierophant_floor.dmi' - planetary_atmos = TRUE initial_gas = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant smoothing_flags = SMOOTH_CORNERS diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 9201e54213c..b42fc44024a 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -141,7 +141,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/basalt/lava_land_surface initial_gas = LAVALAND_DEFAULT_ATMOS - planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/misc/asteroid/lowpressure @@ -172,7 +171,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) simulated = FALSE initial_gas = ICEMOON_DEFAULT_ATMOS - planetary_atmos = TRUE bullet_sizzle = TRUE bullet_bounce_sound = null digResult = /obj/item/stack/sheet/mineral/snow @@ -193,7 +191,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/lava/plasma/ice_moon baseturfs = /turf/open/lava/plasma/ice_moon - planetary_atmos = TRUE + /turf/open/misc/asteroid/snow/ice name = "icy snow" @@ -212,7 +210,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - planetary_atmos = TRUE + slowdown = 0 /turf/open/misc/asteroid/snow/ice/burn_tile() @@ -230,9 +228,9 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/snow/atmosphere temperature = 180 - planetary_atmos = FALSE + /turf/open/misc/asteroid/snow/standard_air initial_gas = OPENTURF_DEFAULT_ATMOS temperature = T0C - planetary_atmos = FALSE + diff --git a/code/game/turfs/open/basalt.dm b/code/game/turfs/open/basalt.dm index fd4f2f327cf..1c70f46de50 100644 --- a/code/game/turfs/open/basalt.dm +++ b/code/game/turfs/open/basalt.dm @@ -14,4 +14,4 @@ set_basalt_light(src) /turf/open/misc/basalt/safe - planetary_atmos = FALSE + diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 693a5965a68..54bde9b1231 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -78,7 +78,7 @@ // Chasms for Lavaland, with planetary atmos and lava glow /turf/open/chasm/lavaland initial_gas = LAVALAND_DEFAULT_ATMOS - planetary_atmos = TRUE + baseturfs = /turf/open/chasm/lavaland light_range = 1.9 //slightly less range than lava light_power = 0.65 //less bright, too @@ -90,7 +90,7 @@ icon_state = "icechasms-255" base_icon_state = "icechasms" initial_gas = ICEMOON_DEFAULT_ATMOS - planetary_atmos = TRUE + baseturfs = /turf/open/chasm/icemoon light_range = 1.9 light_power = 0.65 @@ -102,7 +102,7 @@ icon_state = "junglechasm-255" base_icon_state = "junglechasm" initial_gas = OPENTURF_LOW_PRESSURE - planetary_atmos = TRUE + baseturfs = /turf/open/chasm/jungle /turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 3879144366b..73bf110c48b 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -156,11 +156,11 @@ floor_tile = /obj/item/stack/tile/bronze/filled /turf/open/floor/bronze/filled/lavaland - planetary_atmos = TRUE + initial_gas = LAVALAND_DEFAULT_ATMOS /turf/open/floor/bronze/filled/icemoon - planetary_atmos = TRUE + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/white diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index 9425673e2cc..f4d3e60a5ae 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -47,7 +47,7 @@ temperature = 180 temperature = 180 attachment_holes = FALSE - planetary_atmos = TRUE + footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND @@ -66,7 +66,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_SNOWED) canSmoothWith = list(SMOOTH_GROUP_FLOOR_SNOWED) - planetary_atmos = TRUE + /turf/open/floor/plating/snowed/temperatre temperature = 255.37 @@ -79,7 +79,7 @@ initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/lavaland_atmos - planetary_atmos = TRUE + baseturfs = /turf/open/lava/smooth/lava_land_surface initial_gas = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index 8cd466fcefb..0ec9348e4dd 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -6,7 +6,7 @@ base_icon_state = "ice_turf-0" temperature = 180 temperature = 180 - planetary_atmos = TRUE + baseturfs = /turf/open/misc/ice slowdown = 1 bullet_sizzle = TRUE @@ -38,4 +38,4 @@ slowdown = 0 /turf/open/misc/ice/icemoon/no_planet_atmos - planetary_atmos = FALSE + diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 15a9f4b23cc..84d032626b6 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -236,7 +236,7 @@ /turf/open/lava/smooth/lava_land_surface initial_gas = LAVALAND_DEFAULT_ATMOS - planetary_atmos = TRUE + baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/lava/smooth/airless diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 154e956b95f..951b06ad0b6 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -27,7 +27,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr initial_gas = AIRLESS_ATMOS /turf/open/openspace/airless/planetary - planetary_atmos = TRUE + /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() @@ -167,7 +167,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr name = "ice chasm" baseturfs = /turf/open/openspace/icemoon initial_gas = ICEMOON_DEFAULT_ATMOS - planetary_atmos = TRUE + var/replacement_turf = /turf/open/misc/asteroid/snow/icemoon /// Replaces itself with replacement_turf if the turf below this one is in a no ruins allowed area (usually ruins themselves) var/protect_ruin = TRUE diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index 30e7a430020..e1166876be0 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -7,7 +7,7 @@ base_icon_state = "dirt" baseturfs = /turf/open/chasm/jungle initial_gas = OPENTURF_LOW_PRESSURE - planetary_atmos = TRUE + footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND @@ -47,7 +47,7 @@ /turf/open/misc/grass/jungle name = "jungle grass" initial_gas = OPENTURF_DEFAULT_ATMOS - planetary_atmos = TRUE + baseturfs = /turf/open/misc/dirt desc = "Greener on the other side." icon_state = "junglegrass" diff --git a/code/game/turfs/open/snow.dm b/code/game/turfs/open/snow.dm index c1504c049cd..bb2ab0eeb52 100644 --- a/code/game/turfs/open/snow.dm +++ b/code/game/turfs/open/snow.dm @@ -4,7 +4,7 @@ icon = 'icons/turf/snow.dmi' desc = "Looks cold." icon_state = "snow" - planetary_atmos = TRUE + temperature = 180 slowdown = 2 bullet_sizzle = TRUE @@ -23,5 +23,5 @@ /turf/open/misc/snow/actually_safe slowdown = 0 - planetary_atmos = FALSE + initial_gas = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 37003cc214d..8965c75b04d 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -5,7 +5,7 @@ icon_state = "riverwater_motion" baseturfs = /turf/open/chasm/lavaland initial_gas = OPENTURF_LOW_PRESSURE - planetary_atmos = TRUE + slowdown = 1 bullet_sizzle = TRUE bullet_bounce_sound = null //needs a splashing sound one day. @@ -20,7 +20,6 @@ initial_gas = OPENTURF_DEFAULT_ATMOS /turf/open/water/beach - planetary_atmos = FALSE gender = PLURAL desc = "You get the feeling that nobody's bothered to actually make this water functional..." icon = 'icons/misc/beach.dmi' diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 356b1aa1781..65db9c9c62c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -198,8 +198,8 @@ GLOBAL_LIST_EMPTY(station_turfs) if(simulated && zone) ///Try to gracefully remove if(can_safely_remove_from_zone()) - c_copy_air() - zone.remove(src) + take_zone_air() + zone.remove_turf(src) else //Just rebuild the fucker zone.rebuild() diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index a23d19cba78..4bf696557e0 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -31,7 +31,7 @@ // Delete all zones. for(var/zone/Z in world) - Z.c_invalidate() + Z.invalidate() to_chat(usr, "\[3/5\] - All ZAS Zones removed.") diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 0b5d66fdc1e..035869985d7 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -49,7 +49,7 @@ Class Procs: */ -/connection/ +/connection var/turf/A var/turf/B var/zone/zoneA @@ -57,8 +57,14 @@ Class Procs: var/connection_edge/edge + ///Invalid or Valid var/state = 0 + #ifdef ZASDBG + ///Set to true during testing to get verbose debug information + var/verbose = FALSE + #endif + /connection/New(turf/A, turf/B) #ifdef ZASDBG //ASSERT(TURF_HAS_VALID_ZONE(A)) @@ -76,45 +82,77 @@ Class Procs: edge = SSzas.get_edge(A.zone,B.zone) edge.add_connection(src) +///Unmarks this connection as direct. Does not update the edge. Called by update() as a correction. /connection/proc/mark_direct() if(!direct()) state |= CONNECTION_DIRECT edge.direct++ -// log_admin("Marked direct.") + #ifdef ZASDBG + if(verbose) + zas_log("Marked direct.") + #endif + +///Unmarks this connection as direct. Does not update the edge. Called by update() as a correction. /connection/proc/mark_indirect() if(direct()) state &= ~CONNECTION_DIRECT edge.direct-- -// log_admin("Marked indirect.") + #ifdef ZASDBG + if(verbose) + zas_log("Marked indirect.") + #endif + +///Marks this connection as unsimulated. Updating the connection will check the validity of this. See file header for more information. /connection/proc/mark_space() state |= CONNECTION_SPACE +///Returns 1 if no doors are in between A and B. /connection/proc/direct() return (state & CONNECTION_DIRECT) +///Returns 1 if the connection has not been erased. /connection/proc/valid() return !(state & CONNECTION_INVALID) +///Called by update() and connection_manager/erase_all(). Marks the connection as erased and removes it from its edge. /connection/proc/erase() edge.remove_connection(src) state |= CONNECTION_INVALID -// log_admin("Connection Erased: [state]") + #ifdef ZASDBG + if(verbose) + zas_log("Connection Erased: [state]") + #endif + +///Makes numerous checks to decide whether the connection is still valid. Erases it automatically if not. /connection/proc/update() -// log_admin("Updated, \...") - if(!A.simulated) -// log_admin("Invalid A.") + #ifdef ZASDBG + if(verbose) + zas_log("Updated, \...") + #endif + + if(!A.simulated) //If turf A isn't simulated, erase this connection. + #ifdef ZASDBG + if(verbose) + zas_log("Invalid A. Erasing...") + #endif + erase() return var/block_status = SSzas.air_blocked(A,B) - if(block_status & AIR_BLOCKED) -// log_admin("Blocked connection.") + if(block_status & AIR_BLOCKED) //If turfs A and B cant mingle, erase this connection + #ifdef ZASDBG + if(verbose) + zas_log("Blocked connection. Erasing...") + #endif + erase() return - else if(block_status & ZONE_BLOCKED) + + else if(block_status & ZONE_BLOCKED) //If they can mingle but they can't merge zones, mark this connection as indirect mark_indirect() else mark_direct() @@ -122,48 +160,78 @@ Class Procs: var/b_is_space = !B.simulated if(state & CONNECTION_SPACE) - if(!b_is_space) -// log_admin("Invalid B.") + if(!b_is_space) //If this is an unsimulated connection and B isn't unsimulated, erase. + #ifdef ZASDBG + if(verbose) + zas_log("Invalid B. Erasing...") + #endif erase() return - if(A.zone != zoneA) -// log_admin("Zone changed, \...") - if(!A.zone) + + if(A.zone != zoneA) //If turf A's zone has changed, attempt to migrate the connection to the new zone. Otherwise, erase. + #ifdef ZASDBG + if(verbose) + zas_log("Zone changed, \...") + #endif + + if(!A.zone) //No zone, erase. erase() -// log_admin("erased.") + + #ifdef ZASDBG + if(verbose) + zas_log("Turf A's zone has disappeared. Erasing...") + #endif return + else edge.remove_connection(src) edge = SSzas.get_edge(A.zone, B) edge.add_connection(src) zoneA = A.zone -// log_admin("valid.") + #ifdef ZASDBG + if(verbose) + zas_log("Connection is valid.") + #endif return - else if(b_is_space) -// log_admin("Invalid B.") + else if(b_is_space) //If B is unsimulated and this isn't an unsimulated connection, erase. + #ifdef ZASDBG + if(verbose) + zas_log("Turf B is unsimulated, but this is a simulated connection. Erasing...") + #endif erase() return - if(A.zone == B.zone) -// log_admin("A == B") + if(A.zone == B.zone) //If both turfs share a zone, erase. + #ifdef ZASDBG + if(verbose) + zas_log("Turf A and Turf B share a zone. Erasing...") + #endif erase() return - if(A.zone != zoneA || (zoneB && (B.zone != zoneB))) + if(A.zone != zoneA || (zoneB && (B.zone != zoneB))) //If either turf's zone changed + #ifdef ZASDBG + if(verbose) + zas_log("Zones changed, \...") + #endif -// log_admin("Zones changed, \...") - if(A.zone && B.zone) + if(A.zone && B.zone) //Find where we're supposed to be and move us there edge.remove_connection(src) edge = SSzas.get_edge(A.zone, B.zone) edge.add_connection(src) zoneA = A.zone zoneB = B.zone else -// log_admin("erased.") + #ifdef ZASDBG + if(verbose) + zas_log("Turf A or B lost it's zone. Erasing...") + #endif ZASDBG erase() return - -// log_admin("valid.") + #ifdef ZASDBG + if(verbose) + zas_log("Connection is valid.") + #endif diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index ba6a7269008..04d3518a912 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -58,42 +58,67 @@ Class Procs: */ -/connection_edge/var/zone/A +/connection_edge + var/zone/A -/connection_edge/var/list/connecting_turfs = list() -/connection_edge/var/direct = 0 -/connection_edge/var/sleeping = 1 + var/list/connecting_turfs = list() + var/direct = 0 + var/sleeping = 1 + var/coefficient = 0 -/connection_edge/var/coefficient = 0 + #ifdef ZASDBG + ///Set this to TRUE during testing to get verbose debug information. + var/verbose = FALSE + #endif /connection_edge/New() CRASH("Cannot make connection edge without specifications.") +///Adds a connection to this edge. Usually increments the coefficient and adds a turf to connecting_turfs. /connection_edge/proc/add_connection(connection/c) coefficient++ - if(c.direct()) direct++ -// log_admin("Connection added: [type] Coefficient: [coefficient]") + if(c.direct()) + direct++ + #ifdef ZASDBG + if(verbose) + zas_log("Connection added: [type] Coefficient: [coefficient]") + #endif +///Removes a connection from this edge. This works even if c is not in the edge, so be careful. /connection_edge/proc/remove_connection(connection/c) -// log_admin("Connection removed: [type] Coefficient: [coefficient-1]") - coefficient-- if(coefficient <= 0) erase() - if(c.direct()) direct-- + if(c.direct()) + direct-- + + #ifdef ZASDBG + if(verbose) + zas_log("Connection removed: [type] Coefficient: [coefficient-1]") + #endif +///Returns true if either A or B is equal to Z. Unsimulated connections return true only on A. /connection_edge/proc/contains_zone(zone/Z) + return +///Removes this connection from processing and zone edge lists. /connection_edge/proc/erase() SSzas.remove_edge(src) -// log_admin("[type] Erased.") - + #ifdef ZASDBG + if(verbose) + zas_log("[type] Erased.") + #endif +///Called every air tick on edges in the processing list. Equalizes gas. /connection_edge/proc/tick() + return +///Checks both connection ends to see if they need to process. /connection_edge/proc/recheck() + return +///Airflow proc causing all objects in movable to be checked against a pressure differential. See file header for more info. /connection_edge/proc/flow(list/movable, differential, repelled) for(var/i in 1 to length(movable)) var/atom/movable/M = movable[i] @@ -122,8 +147,10 @@ Class Procs: -/connection_edge/zone/var/zone/B -/connection_edge/zone/var/last_woosh +/connection_edge/zone + var/zone/B + ///The last time the "woosh" airflow sound played, world.time + var/last_woosh /connection_edge/zone/New(zone/A, zone/B) @@ -132,8 +159,10 @@ Class Procs: A.edges.Add(src) B.edges.Add(src) //id = edge_id(A,B) -// log_admin("New edge between [A] and [B]") - + #ifdef ZASDBG + if(verbose) + zas_log("New edge between [A] and [B]") + #endif /connection_edge/zone/add_connection(connection/c) . = ..() @@ -141,7 +170,7 @@ Class Procs: /connection_edge/zone/remove_connection(connection/c) connecting_turfs.Remove(c.A) - . = ..() + return ..() /connection_edge/zone/contains_zone(zone/Z) return A == Z || B == Z @@ -149,7 +178,7 @@ Class Procs: /connection_edge/zone/erase() A.edges.Remove(src) B.edges.Remove(src) - . = ..() + return ..() /connection_edge/zone/tick() if(A.invalid || B.invalid) @@ -200,21 +229,26 @@ Class Procs: // Edges with only one side being vacuum need processing no matter how close. SSzas.mark_edge_active(src) -//Helper proc to get connections for a zone. +///Helper proc to get connections for a zone. /connection_edge/zone/proc/get_connected_zone(zone/from) - if(A == from) return B - else return A + if(A == from) + return B + else + return A -/connection_edge/unsimulated/var/turf/B -/connection_edge/unsimulated/var/datum/gas_mixture/air +/connection_edge/unsimulated + var/turf/B + var/datum/gas_mixture/air /connection_edge/unsimulated/New(zone/A, turf/B) src.A = A src.B = B A.edges.Add(src) air = B.return_air() - //id = 52*A.id -// log_admin("New edge from [A] to [B].") + #ifdef ZASDBG + if(verbose) + log_admin("New edge from [A] to [B] ([B.x], [B.y], [B.z]).") + #endif /connection_edge/unsimulated/add_connection(connection/c) @@ -225,11 +259,11 @@ Class Procs: /connection_edge/unsimulated/remove_connection(connection/c) connecting_turfs.Remove(c.B) air.group_multiplier = coefficient - . = ..() + return ..() /connection_edge/unsimulated/erase() A.edges.Remove(src) - . = ..() + return ..() /connection_edge/unsimulated/contains_zone(zone/Z) return A == Z diff --git a/code/modules/atmospherics/ZAS/ConnectionManager.dm b/code/modules/atmospherics/ZAS/ConnectionManager.dm index 3890cd85f5c..c54099da70d 100644 --- a/code/modules/atmospherics/ZAS/ConnectionManager.dm +++ b/code/modules/atmospherics/ZAS/ConnectionManager.dm @@ -34,16 +34,18 @@ Macros: // macro-ized to cut down on proc calls #define check(c) (c && c.valid()) -/turf/var/tmp/connection_manager/connections +/turf + var/tmp/connection_manager/connections -/connection_manager/var/connection/N -/connection_manager/var/connection/S -/connection_manager/var/connection/E -/connection_manager/var/connection/W +/connection_manager/ + var/connection/N + var/connection/S + var/connection/E + var/connection/W #ifdef MULTIZAS -/connection_manager/var/connection/U -/connection_manager/var/connection/D + var/connection/U + var/connection/D #endif /connection_manager/proc/get(d) diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index 961ab554798..b9e6b571f6a 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -80,6 +80,15 @@ GLOBAL_REAL_VAR(list/zasdbgovl_dirzoneblock) = list( /proc/soft_assert(thing,fail) if(!thing) message_admins(fail) -/turf/proc/zas_log(string) - to_chat(world, "[span_admin("ZAS:")] verbose turf output of [src] at ([src.x], [src.y], [src.z]): [string]") +/datum/proc/zas_log(string) + return + +/turf/zas_log(string) + to_chat(world, "[span_admin("ZAS:")] Turf output of [src] at ([src.x], [src.y], [src.z]): [string]") + +/connection/zas_log(string) + to_chat(world, "[span_admin("ZAS:")] Verbose connection output: [string]") + +/connection_edge/zas_log(string) + to_chat(world, "[span_admin("ZAS:")] Verbose connection edge output: [string]") #endif diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index a30abfc5ea2..35c0c3b6540 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -1,25 +1,31 @@ /turf + ///The turf's current zone parent. var/zone/zone + ///All directions in which a turf that can contain air is present. var/open_directions /turf + ///Does this turf need to be ran through SSzas? (SSzas.mark_for_update(turf) OR turf.update_nearby_tiles()) var/needs_air_update = 0 + ///The local gas mixture of this turf. Use return_air(). This will always exist even if not in use, because GCing air contents would be too expensive. var/datum/gas_mixture/air var/heat_capacity = 1 var/thermal_conductivity = 0.05 + ///A gas_mixture gas list to be used as the initial value. Ex: list(GAS_OXYGEN = 50) var/list/initial_gas - var/planetary_atmos //Let's just let this exist for now. #ifdef ZASDBG ///Set to TRUE during debugging to get chat output on the atmos status of this turf var/verbose = FALSE #endif +///Adds the graphic_add list to vis_contents, removes graphic_remove. /turf/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) vis_contents += graphic_add if(graphic_remove && graphic_remove.len) vis_contents -= graphic_remove +///Updates the turf's air source properties, breaking or creating zone connections as necessary. /turf/proc/update_air_properties() var/self_block ATMOS_CANPASS_TURF(self_block, src, src) @@ -76,7 +82,7 @@ Instead of analyzing the entire zone, we only check the nearest 3x3 turfs surrounding the src turf. This implementation may produce false negatives but it (hopefully) will not produce any false postiives. */ - +///Simple heuristic for determining if removing the turf from it's zone will not partition the zone (A very bad thing). /turf/proc/can_safely_remove_from_zone() if(!zone) return 1 @@ -106,7 +112,7 @@ return ..() if(zone && zone.invalid) //this turf's zone is in the process of being rebuilt - c_copy_air() //not very efficient :( + take_zone_air() //not very efficient :( zone = null //Easier than iterating through the list at the zone. var/self_block @@ -121,8 +127,8 @@ var/zone/z = zone if(can_safely_remove_from_zone()) //Helps normal airlocks avoid rebuilding zones all the time - c_copy_air() //we aren't rebuilding, but hold onto the old air so it can be readded - z.remove(src) + take_zone_air() //we aren't rebuilding, but hold onto the old air so it can be readded + z.remove_turf(src) else z.rebuild() @@ -161,7 +167,7 @@ if(us_to_target & AIR_BLOCKED) #ifdef ZASDBG if(verbose) - log_admin("[dir2text(d)] is blocked.") + zas_log("[dir2text(d)] is blocked.") target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) #endif @@ -199,7 +205,7 @@ postponed.Add(sim_target) else - sim_target.zone.add(src) + sim_target.zone.add_turf(src) #ifdef ZASDBG dbg(zasdbgovl_assigned) @@ -230,7 +236,7 @@ if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. var/zone/newzone = new/zone() - newzone.add(src) + newzone.add_turf(src) #ifdef ZASDBG dbg(zasdbgovl_created) @@ -243,7 +249,8 @@ for(var/turf/T in postponed) if(T.zone == src.zone) #ifdef ZASDBG - zas_log("This turf tried to merge into itself! Current type: [src.type]") + if(verbose) + zas_log("This turf tried to merge into itself! Current type: [src.type]") #endif CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning SSzas.connect(src, T) @@ -252,30 +259,16 @@ if(connections) connections.update_all() +///Currently unused. /atom/movable/proc/block_superconductivity() return -/turf/return_air() - RETURN_TYPE(/datum/gas_mixture) - //Create gas mixture to hold data for passing - if(zone) - if(!zone.invalid) - SSzas.mark_zone_update(zone) - return zone.air - else - if(!air) - make_air() - c_copy_air() - return air - else - if(!air) - make_air() - return air - +///Wrapper for [/datum/gas_mixture/proc/remove()] /turf/remove_air(amount as num) var/datum/gas_mixture/GM = return_air() return GM.remove(amount) +///Merges a given gas mixture with the turf's current air source. /turf/assume_air(datum/gas_mixture/giver) if(!simulated) return @@ -296,6 +289,7 @@ return 1 +///Return the currently used gas_mixture datum. /turf/return_air() RETURN_TYPE(/datum/gas_mixture) if(!simulated) @@ -316,13 +310,14 @@ else if(!air) make_air() - c_copy_air() + take_zone_air() return air else if(!air) make_air() return air +///Initializes the turf's "air" datum to it's initial values. /turf/proc/make_air() air = new/datum/gas_mixture air.temperature = temperature @@ -330,13 +325,14 @@ air.gas = initial_gas.Copy() AIR_UPDATE_VALUES(air) -/turf/proc/c_copy_air() +///Takes this turf's group share from the zone. Usually used before removing it from the zone. +/turf/proc/take_zone_air() if(!air) air = new/datum/gas_mixture air.copyFrom(zone.air) air.group_multiplier = 1 - +///Creates a gas_mixture datum with the given parameters and merges it into the turf's air source. /turf/proc/atmos_spawn_air(gas_id, amount, initial_temperature) if(!simulated) return @@ -351,9 +347,7 @@ /turf/open/space/atmos_spawn_air() return -/proc/turf_contains_dense_objects(turf/T) - return T.contains_dense_objects() - +///Checks a turf to see if any of it's contents are dense. Is NOT recursive. /turf/proc/contains_dense_objects() if(density) return 1 @@ -366,9 +360,10 @@ /turf/proc/TryGetNonDenseNeighbour() for(var/d in GLOB.cardinals) var/turf/T = get_step(src, d) - if (T && !turf_contains_dense_objects(T)) + if (T && !T.contains_dense_objects()) return T +///Returns a list of adjacent turfs that can contain air. Returns null if none. /turf/proc/get_atmos_adjacent_turfs() var/list/adjacent_turfs = list() for(var/dir in GLOB.cardinals) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 0c97d56a13a..51aaa3f0563 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -22,15 +22,17 @@ temperature = _temperature group_multiplier = _group_multiplier +///Returns the volume of a specific gas within the entire zone. /datum/gas_mixture/proc/getGroupGas(gasid) if(!gas.len) return 0 //if the list is empty BYOND treats it as a non-associative list, which runtimes return gas[gasid] * group_multiplier +///Returns the volume of the entire zone's gas contents. /datum/gas_mixture/proc/getGroupMoles() return total_moles * group_multiplier -//Takes a gas string and the amount of moles to adjust by. Calls updateValues() if update isn't 0. +///Takes a gas string and the amount of moles to adjust by. Calls updateValues() if update isn't 0. /datum/gas_mixture/proc/adjustGas(gasid, moles, update = TRUE) if(moles == 0) return @@ -43,6 +45,7 @@ if(update) AIR_UPDATE_VALUES(src) +///Sets the given gas id's mole count to the specified amount. /datum/gas_mixture/proc/setGasMoles(gasid, moles, update = TRUE, divide_among_group = FALSE) if(moles == 0) return @@ -56,7 +59,7 @@ if(update) AIR_UPDATE_VALUES(src) -//Same as adjustGas(), but takes a temperature which is mixed in with the gas. +///Same as adjustGas(), but takes a temperature which is mixed in with the gas. /datum/gas_mixture/proc/adjustGasWithTemp(gasid, moles, temp, update = 1) if(moles == 0) return @@ -77,7 +80,7 @@ AIR_UPDATE_VALUES(src) -//Variadic version of adjustGas(). Takes any number of gas and mole pairs and applies them. +///Variadic version of adjustGas(). Takes any number of gas and mole pairs and applies them. /datum/gas_mixture/proc/adjustMultipleGases() ASSERT(!(args.len % 2)) @@ -87,7 +90,7 @@ AIR_UPDATE_VALUES(src) -//Variadic version of adjustGasWithTemp(). Takes any number of gas, mole and temperature associations and applies them. +///Variadic version of adjustGasWithTemp(). Takes any number of gas, mole and temperature associations and applies them. /datum/gas_mixture/proc/adjustMultipleGasesWithTemp() ASSERT(!(args.len % 3)) @@ -97,8 +100,7 @@ AIR_UPDATE_VALUES(src) -//Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly. -//Does not modify giver in any way. +///Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly. Does not modify giver in any way. /datum/gas_mixture/proc/merge(const/datum/gas_mixture/giver) if(!giver) return @@ -119,7 +121,7 @@ AIR_UPDATE_VALUES(src) -// Used to equalize the mixture between two zones before sleeping an edge. +///Used to equalize the mixture between two zones before sleeping an edge. /datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) var/our_heatcap = getHeatCapacity() var/share_heatcap = sharer.getHeatCapacity() @@ -145,7 +147,7 @@ return 1 -//Returns the heat capacity of the gas mix based on the specific heat of the gases. +///Returns the heat capacity of the gas mix based on the specific heat of the gases. /datum/gas_mixture/proc/getHeatCapacity() . = 0 for(var/g in gas) @@ -153,7 +155,7 @@ . *= group_multiplier -//Adds or removes thermal energy. Returns the actual thermal energy change, as in the case of removing energy we can't go below TCMB. +///Adds or removes thermal energy. Returns the actual thermal energy change, as in the case of removing energy we can't go below TCMB. /datum/gas_mixture/proc/addThermalEnergy(thermal_energy) if (total_moles == 0) @@ -168,16 +170,16 @@ temperature += thermal_energy/heat_capacity return thermal_energy -//Returns the thermal energy change required to get to a new temperature +///Returns the thermal energy change required to get to a new temperature /datum/gas_mixture/proc/getThermalEnergyChange(new_temperature) return getHeatCapacity()*(max(new_temperature, 0) - temperature) -//Technically vacuum doesn't have a specific entropy. Just use a really big number (infinity would be ideal) here so that it's easy to add gas to vacuum and hard to take gas out. +///Technically vacuum doesn't have a specific entropy. Just use a really big number (infinity would be ideal) here so that it's easy to add gas to vacuum and hard to take gas out. #define SPECIFIC_ENTROPY_VACUUM 150000 -//Returns the ideal gas specific entropy of the whole mix. This is the entropy per mole of /mixed/ gas. +///Returns the ideal gas specific entropy of the whole mix. This is the entropy per mole of /mixed/ gas. /datum/gas_mixture/proc/specificGroupEntropy() if (!gas.len || total_moles == 0) return SPECIFIC_ENTROPY_VACUUM @@ -220,14 +222,14 @@ total_moles += cached_gas[g] -//Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since updateValues() has been called. +///Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since updateValues() has been called. /datum/gas_mixture/proc/returnPressure() if(volume) return total_moles * R_IDEAL_GAS_EQUATION * temperature / volume return 0 -//Removes moles from the gas mixture and returns a gas_mixture containing the removed air. +///Removes moles from the gas mixture and returns a gas_mixture containing the removed air. /datum/gas_mixture/proc/remove(amount) RETURN_TYPE(/datum/gas_mixture) @@ -250,7 +252,7 @@ return removed -//Removes a ratio of gas from the mixture and returns a gas_mixture containing the removed air. +///Removes a ratio of gas from the mixture and returns a gas_mixture containing the removed air. /datum/gas_mixture/proc/removeRatio(ratio, out_group_multiplier = 1) if(ratio <= 0) return null @@ -272,13 +274,13 @@ return removed -//Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume +///Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume/ /datum/gas_mixture/proc/removeVolume(removed_volume) var/datum/gas_mixture/removed = removeRatio(removed_volume/(volume*group_multiplier), 1) removed.volume = removed_volume return removed -//Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. +///Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. /datum/gas_mixture/proc/removeByFlag(flag, amount) var/datum/gas_mixture/removed = new @@ -301,14 +303,14 @@ return removed -//Returns the amount of gas that has the given flag, in moles +///Returns the amount of gas that has the given flag, in moles.. /datum/gas_mixture/proc/getByFlag(flag) . = 0 for(var/g in gas) if(xgm_gas_data.flags[g] & flag) . += gas[g] -//Copies gas and temperature from another gas_mixture. +///Copies gas and temperature from another gas_mixture. /datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample, partial = 1) var/list/cached_gas = gas var/list/sample_gas = sample.gas.Copy() @@ -323,7 +325,7 @@ return 1 -//Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. +///Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. /datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample, vacuum_exception = 0) if(!sample) return 0 @@ -360,8 +362,7 @@ return 1 -//Rechecks the gas_mixture and adjusts the graphic list if needed. -//Two lists can be passed by reference if you need know specifically which graphics were added and removed. +///Rechecks the gas_mixture and adjusts the graphic list if needed. ///Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/checkTileGraphic(list/graphic_add = null, list/graphic_remove = null) for(var/obj/effect/gas_overlay/O in graphic) if(gas[O.gas_id] <= xgm_gas_data.overlay_limit[O.gas_id]) @@ -393,7 +394,7 @@ LAZYSET(tile_overlay_cache, gas_id, new/obj/effect/gas_overlay(null, gas_id)) return tile_overlay_cache[gas_id] -//Simpler version of merge(), adjusts gas amounts directly and doesn't account for temperature or group_multiplier. +///Simpler version of merge(), adjusts gas amounts directly and doesn't account for temperature or group_multiplier. /datum/gas_mixture/proc/add(datum/gas_mixture/right_side) for(var/g in right_side.gas) gas[g] += right_side.gas[g] @@ -402,7 +403,7 @@ return 1 -//Simpler version of remove(), adjusts gas amounts directly and doesn't account for group_multiplier. +///Simpler version of remove(), adjusts gas amounts directly and doesn't account for group_multiplier. /datum/gas_mixture/proc/subtract(datum/gas_mixture/right_side) for(var/g in right_side.gas) gas[g] -= right_side.gas[g] @@ -411,7 +412,7 @@ return 1 -//Multiply all gas amounts by a factor. +///Multiply all gas amounts by a factor. /datum/gas_mixture/proc/multiply(factor) for(var/g in gas) gas[g] *= factor @@ -420,7 +421,7 @@ return 1 -//Divide all gas amounts by a factor. +///Divide all gas amounts by a factor. /datum/gas_mixture/proc/divide(factor) for(var/g in gas) gas[g] /= factor @@ -429,7 +430,7 @@ return 1 -//Shares gas with another gas_mixture based on the amount of connecting tiles and a fixed lookup table. +///Shares gas with another gas_mixture based on the amount of connecting tiles and a fixed lookup table. /datum/gas_mixture/proc/shareRatio(datum/gas_mixture/other, connecting_tiles, share_size = null, one_way = 0) var/static/list/sharing_lookup_table = list(0.30, 0.40, 0.48, 0.54, 0.60, 0.66) //Shares a specific ratio of gas between mixtures using simple weighted averages. @@ -476,7 +477,7 @@ return compare(other) -//A wrapper around share_ratio for spacing gas at the same rate as if it were going into a large airless room. +///A wrapper around share_ratio for spacing gas at the same rate as if it were going into a large airless room. /datum/gas_mixture/proc/shareSpace(datum/gas_mixture/unsim_air) return shareRatio(unsim_air, unsim_air.group_multiplier, max(1, max(group_multiplier + 3, 1) + unsim_air.group_multiplier), one_way = 1) @@ -489,8 +490,9 @@ if(M) return getMass()/M +///Returns TRUE if the given gas has a volume equal to or greater than the given amount in one group share of gas. /datum/gas_mixture/proc/hasGas(gas_id, required_amount) - var/amt = getGroupGas(gas_id) + var/amt = gas[gas_id] return (amt >= required_amount) ////LINDA COMPATABILITY PROCS//// @@ -503,6 +505,7 @@ /datum/gas_mixture/proc/get_moles() //updateValues() return total_moles + ////END LINDA COMPATABILITY//// ///Returns the gas list with an update. @@ -516,6 +519,7 @@ checkTileGraphic() return graphic +///Returns a gas_mixture datum with identical contents. /datum/gas_mixture/proc/copy() RETURN_TYPE(/datum/gas_mixture) var/datum/gas_mixture/new_gas = new diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 8b8c2e02ed3..79a1753efd1 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -12,17 +12,17 @@ Class Vars: air - The gas mixture that any turfs in this zone will return. Values are per-tile with a group multiplier. Class Procs: - add(turf/simulated/T) + add_turf(turf/T) Adds a turf to the contents, sets its zone and merges its air. - remove(turf/simulated/T) + remove_turf(turf/T) Removes a turf, sets its zone to null and erases any gas graphics. Invalidates the zone if it has no more tiles. - c_merge(zone/into) + merge_into(zone/into) Invalidates this zone and adds all its former contents to into. - c_invalidate() + invalidate() Marks this zone as invalid and removes it from processing. rebuild() @@ -41,15 +41,24 @@ Class Procs: /zone + ///A simple numerical value var/name + ///If a zone is "invalid" it will not process var/invalid = 0 var/list/contents = list() + ///All fire tiles in this zone var/list/fire_tiles = list() + ///All physical sources of fire fuel in this zone var/list/fuel_objs = list() + ///Does SSzas need to update this zone? (SSzas.mark_zone_update(zone)) var/needs_update = 0 + ///A list of /connection_edge/ var/list/edges = list() + ///The zone's gas contents var/datum/gas_mixture/air = new + ///Air overlays to add next process var/list/graphic_add = list() + ///Air overlays to remove next process var/list/graphic_remove = list() var/last_air_temperature = TCMB @@ -59,7 +68,8 @@ Class Procs: air.group_multiplier = 1 air.volume = CELL_VOLUME -/zone/proc/add(turf/T) +///Adds the given turf to the zone +/zone/proc/add_turf(turf/T) #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) @@ -77,7 +87,8 @@ Class Procs: if(fuel) fuel_objs += fuel T.update_graphic(air.graphic) -/zone/proc/remove(turf/T) +///Removes the given turf from the zone. Will invalidate the zone if it was the last turf. +/zone/proc/remove_turf(turf/T) #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) @@ -94,21 +105,22 @@ Class Procs: if(contents.len) air.group_multiplier = contents.len else - c_invalidate() + invalidate() -/zone/proc/c_merge(zone/into) +///Merges src into the given zone +/zone/proc/merge_into(zone/into) #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(into)) ASSERT(into != src) ASSERT(!into.invalid) #endif - c_invalidate() + invalidate() for(var/turf/T in contents) if(!T.simulated) continue - into.add(T) + into.add_turf(T) T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG T.dbg(zasdbgovl_merged) @@ -121,7 +133,8 @@ Class Procs: for(var/turf/T in E.connecting_turfs) SSzas.mark_for_update(T) -/zone/proc/c_invalidate() +///Marks the zone as invalid, removing it from the SSzas zone list. +/zone/proc/invalidate() invalid = 1 SSzas.remove_zone(src) #ifdef ZASDBG @@ -130,27 +143,31 @@ Class Procs: T.dbg(zasdbgovl_invalid_zone) #endif +///Invalidates the zone and marks all of it's contents for update. /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. - c_invalidate() + invalidate() for(var/turf/T in contents) if(!T.simulated) continue T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + #ifdef ZASDBG //T.dbg(invalid_zone) + #endif T.needs_air_update = 0 //Reset the marker so that it will be added to the list. SSzas.mark_for_update(T) +///Assumes a given gas mixture, dividing it amongst the zone. /zone/proc/add_tile_air(datum/gas_mixture/tile_air) - //air.volume += CELL_VOLUME air.group_multiplier = 1 air.multiply(contents.len) air.merge(tile_air) air.divide(contents.len+1) air.group_multiplier = contents.len+1 +///Zone's process proc. /zone/proc/tick() // Update fires. @@ -200,6 +217,7 @@ Class Procs: QUEUE_TEMPERATURE_ATOMS(checking) CHECK_TICK +///Prints debug information to the given mob. Used by the "Zone Info" verb. Does not require ZASDBG compile define. /zone/proc/dbg_data(mob/M) to_chat(M, name) for(var/g in air.gas) @@ -213,7 +231,8 @@ Class Procs: var/space_edges = 0 var/space_coefficient = 0 for(var/connection_edge/E in edges) - if(E.type == /connection_edge/zone) zone_edges++ + if(E.type == /connection_edge/zone) + zone_edges++ else space_edges++ space_coefficient += E.coefficient diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 500ff56c50b..bf142a0b058 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -47,7 +47,7 @@ set_broken(TRUE) return FALSE var/turf/open/OT = T - if(OT.planetary_atmos) + if(!OT.simulated) broken_message = span_boldwarning("DEVICE NOT ENCLOSED IN A PRESSURIZED ENVIRONMENT") set_broken(TRUE) return FALSE diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 6db9ee158a9..a83c6ce77a8 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -158,8 +158,6 @@ /turf/open/floor/iron/dark/snowdin temperature = 180 - planetary_atmos = 1 - temperature = 180 /turf/open/lava/plasma name = "liquid plasma" diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm b/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm index af9be4f5989..e56594df2d3 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm @@ -12,7 +12,7 @@ /turf/open/water/cursed_spring baseturfs = /turf/open/water/cursed_spring - planetary_atmos = TRUE + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/water/cursed_spring/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 3b9f075b585..a851581f33e 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -315,7 +315,7 @@ var/turf/open/openspace/turf_above = get_step_multiz(mod.wearer, UP) if(current_turf && istype(turf_above)) current_turf.zFall(mod.wearer) - else if(!turf_above && istype(current_turf) && current_turf.planetary_atmos) //nothing holding you down + else if(!turf_above && istype(current_turf) && !current_turf.simulated) //nothing holding you down INVOKE_ASYNC(src, .proc/fly_away) else if(!(step_count % 2)) playsound(current_turf, 'sound/items/modsuit/atrocinator_step.ogg', 50) From e06daa964e537150de8f17195d31e07bc661154f Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 2 Jun 2022 16:53:00 -0400 Subject: [PATCH 106/200] REALLY hacky fix to shuttle movement --- code/modules/atmospherics/ZAS/Turf.dm | 2 +- code/modules/shuttle/docking.dm | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 35c0c3b6540..cad7834802c 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -226,7 +226,7 @@ zas_log("[dir2text(d)] has same zone.") else if(verbose) - zas_log("[dir2text(d)] has invalid or rebuilding zone.") + zas_log("[dir2text(d)] has an invalid or rebuilding zone.") #endif else //Postponing connections to tiles until a zone is assured. diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index 13c8fe5410b..c085cad12d7 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -216,3 +216,8 @@ continue var/turf/oldT = moved_atoms[moved_object] moved_object.lateShuttleMove(oldT, movement_force, movement_direction) + + + ///THIS IS PROBABLY NOT THE ANSWER. BUT IT WORKS AND ISN'T TERRIBLY EXPENSIVE. + for(var/turf/T as anything in new_turfs) + SSzas.mark_for_update(T) From bb96173ad8221d195f22e2d3d96e3bcfd36f2a6b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 2 Jun 2022 17:09:13 -0400 Subject: [PATCH 107/200] Compile stuff + misleading proc name change --- code/game/turfs/turf.dm | 2 +- code/modules/atmospherics/ZAS/Connection.dm | 2 +- code/modules/atmospherics/ZAS/Turf.dm | 12 +++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 65db9c9c62c..a0493a0ab10 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -198,7 +198,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(simulated && zone) ///Try to gracefully remove if(can_safely_remove_from_zone()) - take_zone_air() + copy_zone_air() zone.remove_turf(src) else //Just rebuild the fucker diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 035869985d7..fb8a596bdf2 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -227,7 +227,7 @@ Class Procs: #ifdef ZASDBG if(verbose) zas_log("Turf A or B lost it's zone. Erasing...") - #endif ZASDBG + #endif erase() return diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index cad7834802c..3bd87c160a1 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -30,7 +30,9 @@ var/self_block ATMOS_CANPASS_TURF(self_block, src, src) if(self_block & AIR_BLOCKED) + #ifdef ZASDBG src.dbg(zasdbgovl_blocked) + #endif return TRUE #ifdef MULTIZAS @@ -112,7 +114,7 @@ return ..() if(zone && zone.invalid) //this turf's zone is in the process of being rebuilt - take_zone_air() //not very efficient :( + copy_zone_air() //not very efficient :( zone = null //Easier than iterating through the list at the zone. var/self_block @@ -127,7 +129,7 @@ var/zone/z = zone if(can_safely_remove_from_zone()) //Helps normal airlocks avoid rebuilding zones all the time - take_zone_air() //we aren't rebuilding, but hold onto the old air so it can be readded + copy_zone_air() //we aren't rebuilding, but hold onto the old air so it can be readded z.remove_turf(src) else z.rebuild() @@ -310,7 +312,7 @@ else if(!air) make_air() - take_zone_air() + copy_zone_air() return air else if(!air) @@ -325,8 +327,8 @@ air.gas = initial_gas.Copy() AIR_UPDATE_VALUES(air) -///Takes this turf's group share from the zone. Usually used before removing it from the zone. -/turf/proc/take_zone_air() +///Copies this turf's group share from the zone. Usually used before removing it from the zone. +/turf/proc/copy_zone_air() if(!air) air = new/datum/gas_mixture air.copyFrom(zone.air) From d3feb67278572f6ab629074b46113eb9479fb88f Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Fri, 3 Jun 2022 21:35:49 -0400 Subject: [PATCH 108/200] multizas testing map --- _maps/atmostest_multiz.json | 24 + .../multizas_debug/atmos_mintest_mz_1.dmm | 2602 +++++++++++++++++ .../multizas_debug/atmos_mintest_mz_2.dmm | 1845 ++++++++++++ .../multizas_debug/atmos_mintest_mz_3.dmm | 1838 ++++++++++++ 4 files changed, 6309 insertions(+) create mode 100644 _maps/atmostest_multiz.json create mode 100644 _maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm create mode 100644 _maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm create mode 100644 _maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm diff --git a/_maps/atmostest_multiz.json b/_maps/atmostest_multiz.json new file mode 100644 index 00000000000..ad9a259de0f --- /dev/null +++ b/_maps/atmostest_multiz.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "map_name": "MultiZ Zas Testing Rooms", + "map_path": "map_files/multizas_debug", + "map_file": [ + "atmos_mintest_mz_1.dmm", + "atmos_mintest_mz_2.dmm", + "atmos_mintest_mz_3.dmm" + ], + "traits": [{ + "Up": 1, + "Linkage": null + }, + { + "Up": 1, + "Down": -1, + "Linkage": null + }, + { + "Down": -1, + "Linkage": null + } + ] +} \ No newline at end of file diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm new file mode 100644 index 00000000000..7326b841ed6 --- /dev/null +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm @@ -0,0 +1,2602 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"ac" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ad" = ( +/obj/machinery/door/poddoor{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ae" = ( +/obj/machinery/door/poddoor{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"af" = ( +/obj/machinery/door/poddoor{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ag" = ( +/turf/open/floor/iron, +/area/hallway/primary/central) +"ah" = ( +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"ai" = ( +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aj" = ( +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"ak" = ( +/obj/item/card/id/advanced/debug, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"al" = ( +/obj/machinery/power/rtg/debug, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"am" = ( +/obj/machinery/door/poddoor{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"an" = ( +/obj/machinery/door/poddoor{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ao" = ( +/obj/effect/landmark/latejoin, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ap" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aq" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ar" = ( +/obj/machinery/atmospherics/miner/plasma, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"as" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"at" = ( +/obj/effect/landmark/observer_start, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"au" = ( +/obj/effect/turf_decal/trimline, +/obj/machinery/air_sensor/plasma_tank, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"av" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aw" = ( +/obj/effect/turf_decal/trimline, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"ax" = ( +/obj/effect/turf_decal/bot_red, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ay" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"az" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"aA" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aB" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"aC" = ( +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/item/card/id/advanced/gold/captains_spare, +/obj/structure/rack, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aD" = ( +/obj/machinery/button/door{ + id = "c1toc2"; + name = "c1toc2" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"aE" = ( +/obj/machinery/button/door{ + id = "c2toc3"; + name = "c2toc3" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"aF" = ( +/obj/machinery/button/door{ + id = "c1vent"; + name = "c1vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aG" = ( +/obj/machinery/button/door{ + id = "c2vent"; + name = "c2vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aH" = ( +/obj/machinery/button/door{ + id = "c3vent"; + name = "c3vent" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aI" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aJ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aK" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aL" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aM" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aN" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aO" = ( +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aP" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aQ" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aR" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/red, +/area/hallway/primary/central) +"aS" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aT" = ( +/obj/machinery/gravity_generator/main/station, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"aU" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"aV" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"aW" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"aX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aY" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + icon_state = "pump_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aZ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ba" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 8; + icon_state = "volpump_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bb" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bc" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bd" = ( +/obj/item/pipe_dispenser, +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/door_remote/omni, +/turf/open/floor/iron, +/area/hallway/primary/central) +"be" = ( +/obj/machinery/pipedispenser, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bf" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bg" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4; + icon_state = "warningline_red" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bh" = ( +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bi" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bj" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bk" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bl" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 8; + icon_state = "dvalve_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bm" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/components/binary/passive_gate{ + dir = 8; + icon_state = "passgate_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bn" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 9; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bo" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/trimline/yellow/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bp" = ( +/obj/machinery/light/floor, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/trimline/yellow/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bq" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/trimline/blue/filled, +/turf/open/floor/iron, +/area/hallway/primary/central) +"br" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 6; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bs" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bt" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 10; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bu" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bv" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bw" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 5; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bx" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/hallway/primary/central) +"by" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 9; + icon_state = "warningline_red" + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bz" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bA" = ( +/obj/structure/cable, +/obj/effect/turf_decal/arrows, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bB" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/arrows{ + dir = 4; + icon_state = "arrows" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bD" = ( +/obj/item/pipe_dispenser, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bE" = ( +/obj/item/holosign_creator/atmos, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bF" = ( +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bG" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bH" = ( +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/door_remote/omni, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bI" = ( +/obj/machinery/air_sensor/mix_tank, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"bJ" = ( +/obj/effect/turf_decal/trimline, +/obj/machinery/air_sensor/nitrous_tank, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"bK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output, +/turf/open/floor/engine/plasma, +/area/hallway/primary/central) +"bL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output, +/turf/open/floor/engine/airless, +/area/hallway/primary/central) +"bM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output, +/turf/open/floor/engine/n2o, +/area/hallway/primary/central) +"bN" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bO" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bP" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bQ" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bR" = ( +/obj/machinery/computer/atmos_control/plasma_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bT" = ( +/obj/machinery/computer/atmos_control/mix_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bV" = ( +/obj/machinery/computer/atmos_control/nitrous_tank, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + icon_state = "connector_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bY" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Power" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"bZ" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Main Floor" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ca" = ( +/obj/machinery/light/floor, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Basic Equipment Tests" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cc" = ( +/obj/effect/spawner/structure/window/plasma, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1; + icon_state = "pipe11-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cd" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ce" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + dir = 4; + icon_state = "manifold-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cf" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + dir = 1; + icon_state = "filter_on-0_f" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8; + icon_state = "connector_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ch" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ci" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{ + dir = 1; + icon_state = "filter_on-0_f" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cj" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ck" = ( +/turf/open/floor/plating, +/area/hallway/primary/central) +"cl" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + icon_state = "connector_map-3" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6; + icon_state = "pipe11-3" + }, +/turf/open/space/basic, +/area/space) +"cn" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10; + icon_state = "pipe11-3" + }, +/turf/open/space/basic, +/area/space) +"co" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space) +"cp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5; + icon_state = "pipe11-3" + }, +/turf/open/space/basic, +/area/space) +"cq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9; + icon_state = "pipe11-3" + }, +/turf/open/space/basic, +/area/space) +"cr" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cs" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer, +/turf/open/floor/iron, +/area/hallway/primary/central) +"ct" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cu" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/obj/item/clothing/glasses/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cv" = ( +/obj/structure/table/reinforced, +/obj/item/debug/omnitool, +/obj/item/debug/omnitool, +/obj/item/debug/omnitool, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cw" = ( +/obj/structure/table/reinforced, +/obj/item/gun/magic/wand/death/debug, +/obj/item/gun/magic/wand/death/debug, +/obj/item/gun/magic/wand/resurrection/debug, +/obj/item/gun/magic/wand/safety/debug, +/obj/item/gun/magic/wand/safety/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cx" = ( +/obj/structure/table/reinforced, +/obj/item/mod/control/pre_equipped/debug, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cy" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/obj/item/storage/box/debugtools, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cz" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Gravgen" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ + dir = 1; + icon_state = "filter_on-0_f" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cC" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cD" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ + dir = 1; + icon_state = "filter_on-0_f" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cE" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cF" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + dir = 1; + icon_state = "filter_on-0_f" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cG" = ( +/obj/machinery/atmospherics/components/binary/volume_pump, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1; + icon_state = "connector_map-3" + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cI" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cK" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cL" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cM" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1; + icon_state = "passive_vent_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cN" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8; + icon_state = "he1" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cO" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 4; + icon_state = "he1" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cP" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + dir = 4; + icon_state = "circ-off-0" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cQ" = ( +/obj/machinery/power/generator, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cR" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 8; + icon_state = "circ-off-0" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cS" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4; + icon_state = "connector_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cT" = ( +/obj/machinery/atmospherics/components/trinary/mixer, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cU" = ( +/obj/machinery/atmospherics/components/binary/tank_compressor, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cV" = ( +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron, +/area/hallway/primary/central) +"cW" = ( +/obj/structure/cable, +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cX" = ( +/obj/structure/ladder, +/turf/open/floor/iron, +/area/hallway/primary/central) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ab +ac +ac +ac +ab +ab +aa +"} +(3,1,1) = {" +aa +ab +ag +ag +ag +ag +ag +ab +ct +ct +ct +ct +ct +ct +ct +ct +ct +ct +ct +ag +ag +ab +ck +ck +bh +ag +bo +bo +bo +bo +bo +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(4,1,1) = {" +aa +ac +ag +al +aN +al +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +aI +cW +ac +ck +bf +bh +ag +bp +bo +bo +bo +bp +ag +ag +ac +ag +ag +aq +ag +ag +ac +aa +"} +(5,1,1) = {" +aa +ac +ag +ag +aq +ap +ap +bY +ap +ap +bA +ap +bA +ap +bA +ap +bA +ap +bA +ap +ag +ac +ck +ck +bh +ag +ag +ag +ag +ag +ag +ag +ag +bz +ag +ag +aP +ag +ag +ac +aa +"} +(6,1,1) = {" +aa +ac +ag +al +aN +al +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aX +ck +bi +ag +bq +bq +bq +bq +bq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(7,1,1) = {" +aa +ab +ag +ag +ag +ap +ay +ab +ak +ao +at +ax +aC +cu +cv +cw +cx +cy +ag +bC +cX +ab +aY +ck +bj +ag +bq +bq +bq +bq +bq +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(8,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +bZ +ab +ab +aZ +ck +bk +ag +ag +ag +ag +ag +ag +ag +ag +ab +ab +ac +bz +ac +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +aU +ah +ah +ah +aU +ab +aK +aK +aL +aL +aL +aM +aM +aM +be +ab +bF +ap +ag +ab +aX +ck +bi +ag +ag +ag +ag +ag +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(10,1,1) = {" +aa +ad +ah +ah +ah +ah +bK +bN +bQ +bW +bX +ag +ag +ag +ag +ag +ag +bD +bG +ap +ag +ac +ba +bf +bl +ag +aq +ag +ag +ag +aq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(11,1,1) = {" +aa +ad +ah +ah +ar +au +az +ac +aF +ag +ag +ag +ag +ag +ag +ag +ag +bE +bH +aI +ag +ac +aZ +ck +bk +ag +ag +aX +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(12,1,1) = {" +aa +ad +ah +ah +ah +ah +ah +ac +bR +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +ap +ag +ac +aX +ck +bi +ag +br +bu +bw +ag +ag +ag +ag +bz +ag +ag +aP +ag +ag +ac +aa +"} +(13,1,1) = {" +aa +ab +aU +ah +ah +ah +aU +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +bb +ck +bm +ag +bs +ck +bx +ag +ag +ag +ag +ac +ag +ag +aq +ag +ag +ac +aa +"} +(14,1,1) = {" +aa +ab +ab +am +am +am +ab +aD +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ab +bc +bg +bn +ag +bt +bv +by +ag +cS +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(15,1,1) = {" +aa +ab +aV +ai +ai +ai +aV +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +cb +ag +ag +ag +ag +ag +aZ +ag +aJ +cT +bX +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(16,1,1) = {" +aa +ae +ai +ai +ai +av +bL +bO +bS +bS +bX +ag +ag +ag +ag +ag +ag +bB +ag +ap +ag +cb +ag +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ab +ab +ac +bz +ac +ab +ab +aa +"} +(17,1,1) = {" +aa +ae +ai +ai +ai +bI +aA +ac +aG +ag +ag +aq +ag +ag +aq +ag +aq +bB +ap +aI +ag +cb +ag +ag +ag +cd +ch +cA +cC +cE +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(18,1,1) = {" +aa +ae +ai +ai +ai +av +ai +ac +bT +ag +ag +ag +ag +ag +ag +ag +ag +bB +ag +ap +ag +ab +bd +ag +aJ +ce +ce +ce +ce +ce +cG +cH +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(19,1,1) = {" +aa +ab +aV +ai +ai +ai +aV +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +ag +aJ +cf +ci +cB +cD +cF +bX +ag +ag +bz +ag +ag +aq +ag +ag +ac +aa +"} +(20,1,1) = {" +aa +ab +ab +an +an +an +ab +aE +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +ag +ag +cg +cg +cg +cg +cg +ag +ag +ag +ac +ag +ag +aP +ag +ag +ac +aa +"} +(21,1,1) = {" +aa +ab +aW +aj +aj +aj +aW +ab +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aK +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ac +ag +ag +ag +ag +ag +ac +aa +"} +(22,1,1) = {" +aa +af +aj +aj +aj +aw +bM +bP +bU +bU +bX +ag +ag +ag +ag +ag +ag +ag +ag +ap +ag +ac +aL +ag +ag +ag +ag +ag +ag +aX +ag +ag +ag +ab +ag +ag +ag +ag +ag +ab +aa +"} +(23,1,1) = {" +aa +af +aj +aj +as +bJ +aB +ac +aH +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aI +ag +ac +aL +ag +ag +ag +cj +cl +ag +cN +ag +ag +cU +ab +ab +ac +bz +ac +ab +ab +aa +"} +(24,1,1) = {" +aa +af +aj +aj +aj +aw +aj +ac +bV +ag +ag +ag +ag +aJ +cP +bX +ag +ag +ag +ap +ag +ac +aL +ag +ag +ag +cr +cl +ag +cO +ag +ag +ag +ab +aO +aO +aO +aO +aO +ab +aa +"} +(25,1,1) = {" +aa +ab +aW +aj +aj +aj +aW +ab +ag +ag +ag +ag +ag +ag +cQ +cV +ag +ag +ag +ap +ag +ac +aM +ag +ag +ag +ag +ag +ag +aZ +ag +ag +ag +ac +aO +aO +aO +aO +aO +ac +aa +"} +(26,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +ag +ag +ag +ag +ag +aJ +cR +bX +ag +ag +ag +ap +ag +ac +aM +ag +ag +ag +cL +bX +ag +ag +ag +ag +ag +bz +aO +aO +aQ +aO +aO +aS +aa +"} +(27,1,1) = {" +aa +ab +aq +ag +ag +ag +aq +ab +aq +ag +ag +aq +ag +ag +ca +ag +ag +aq +ag +ca +ag +ac +aM +aq +ag +ag +aq +ag +ag +ag +aq +ag +ag +ac +aO +aO +aR +aO +aO +ac +aa +"} +(28,1,1) = {" +aa +ac +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ag +ap +ag +ag +ag +ag +ap +ag +ac +be +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +aO +aO +aO +aO +aO +ab +aa +"} +(29,1,1) = {" +aa +ac +ag +ag +ag +aT +ap +cz +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ap +ag +ab +ac +bz +ac +ab +ac +bz +ac +ab +ac +bz +ac +ab +ab +ac +aS +ac +ab +ab +aa +"} +(30,1,1) = {" +aa +ac +ag +ag +ag +ag +ag +ac +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +aP +ac +ag +ag +aP +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +ab +aq +ag +ag +ag +aq +ab +ag +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aq +ag +ac +ag +cI +cJ +cK +cJ +cM +ag +bz +ag +aq +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +ab +ab +ac +ac +ac +ab +ab +aq +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +cs +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +ac +bz +ac +ab +ac +bz +ac +ab +ag +aP +ag +ab +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +cm +co +co +cc +bX +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +aP +ac +ag +ag +aP +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +cn +co +cp +ac +aK +ag +ag +ag +aq +ag +ag +aq +ag +ag +aq +ag +aq +ag +ac +ag +aq +ag +bz +ag +aq +ag +bz +ag +aq +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +cm +co +cq +ac +aK +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +ag +ag +ag +ac +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +cn +co +co +cc +bX +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ab +ac +aS +ac +ab +ac +aS +ac +ab +ac +aS +ac +ab +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +aq +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +ag +aq +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ac +ac +ac +ab +ac +ac +ac +ac +ab +ac +ac +ac +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm new file mode 100644 index 00000000000..34e9ccacc5f --- /dev/null +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm @@ -0,0 +1,1845 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"b" = ( +/turf/open/floor/engine/airless, +/area/hallway/primary/upper) +"c" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/airless, +/area/hallway/primary/upper) +"d" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/upper) +"e" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating, +/area/hallway/primary/upper) +"f" = ( +/turf/open/floor/iron, +/area/hallway/primary/upper) +"g" = ( +/turf/open/openspace, +/area/hallway/primary/upper) +"h" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"i" = ( +/turf/open/floor/plating, +/area/hallway/primary/upper) +"j" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/primary/upper) +"k" = ( +/obj/machinery/light/floor, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"l" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"m" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Main Floor" + }, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"n" = ( +/obj/machinery/light/floor, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"o" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/cable, +/turf/open/floor/plating, +/area/hallway/primary/upper) +"p" = ( +/obj/structure/ladder, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"q" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Basic Equipment Tests" + }, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"r" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/hallway/primary/upper) +"s" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"t" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"u" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/hallway/primary/upper) +"v" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"w" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"x" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"y" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1; + icon_state = "passive_vent_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/upper) +"z" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/red, +/area/hallway/primary/upper) +"A" = ( +/turf/open/floor/iron/red, +/area/hallway/primary/upper) +"B" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron/red, +/area/hallway/primary/upper) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +d +d +e +e +e +e +e +e +e +e +e +e +e +d +d +d +e +e +e +e +e +e +e +e +d +d +d +d +e +e +e +d +d +a +"} +(3,1,1) = {" +a +b +b +b +b +b +b +d +g +g +g +g +g +g +g +g +g +k +f +f +n +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(4,1,1) = {" +a +b +b +b +b +b +b +e +g +g +g +g +g +g +g +g +g +l +f +f +o +e +i +i +i +f +f +f +f +f +f +f +f +e +f +f +h +f +f +e +a +"} +(5,1,1) = {" +a +b +b +c +b +b +b +e +g +g +g +g +g +g +g +g +g +l +f +f +f +e +i +i +i +f +f +f +f +f +f +f +f +s +f +f +v +f +f +e +a +"} +(6,1,1) = {" +a +b +b +b +b +b +b +e +g +g +g +g +g +g +g +g +g +l +f +f +h +e +i +r +i +f +f +f +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(7,1,1) = {" +a +b +b +b +b +b +b +d +g +g +g +g +g +g +g +g +g +k +f +f +p +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(8,1,1) = {" +a +b +b +b +b +b +b +d +d +i +i +i +i +i +i +i +d +d +d +m +d +d +i +i +i +f +f +f +f +f +f +f +f +d +d +e +s +e +d +d +a +"} +(9,1,1) = {" +a +b +b +c +b +b +b +d +f +f +f +f +f +f +f +f +f +d +f +f +f +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(10,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +g +j +g +g +g +f +f +f +f +f +e +i +i +i +f +f +f +f +f +f +f +f +e +f +f +f +f +f +e +a +"} +(11,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +g +j +g +g +g +f +f +f +f +f +e +i +r +i +f +f +i +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(12,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +f +f +f +g +g +f +h +f +f +f +e +i +i +i +f +i +i +i +f +f +f +f +s +f +f +v +f +f +e +a +"} +(13,1,1) = {" +a +b +b +b +b +b +b +d +h +j +j +f +h +f +j +j +f +f +f +f +f +e +i +i +i +f +i +i +i +f +f +f +f +e +f +f +h +f +f +e +a +"} +(14,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +f +f +f +g +g +f +f +h +f +f +d +i +i +i +f +i +i +i +f +f +f +f +e +f +f +f +f +f +e +a +"} +(15,1,1) = {" +a +b +b +c +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +f +f +q +f +f +f +f +f +i +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(16,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +g +j +g +g +g +f +i +f +f +f +q +f +h +f +f +f +f +h +f +f +h +f +d +d +e +s +e +d +d +a +"} +(17,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +f +f +f +g +g +f +i +f +f +f +q +f +f +f +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(18,1,1) = {" +a +b +b +b +b +b +b +e +h +j +j +f +h +f +j +j +f +i +f +f +f +d +f +f +f +f +f +f +f +f +f +f +f +e +f +f +f +f +f +e +a +"} +(19,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +f +f +f +g +g +f +f +f +h +f +e +f +f +f +f +f +f +f +f +f +f +f +s +f +f +h +f +f +e +a +"} +(20,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +e +f +f +v +f +f +e +a +"} +(21,1,1) = {" +a +b +b +c +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +f +f +e +f +h +f +f +f +f +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +f +f +f +g +g +f +f +f +f +f +e +f +f +f +f +f +f +f +i +f +f +f +d +f +f +f +f +f +d +a +"} +(23,1,1) = {" +a +b +b +b +b +b +b +e +h +j +j +f +h +f +j +j +f +h +f +f +f +e +f +f +f +f +i +i +f +i +f +f +f +d +d +e +s +e +d +d +a +"} +(24,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +f +f +f +g +g +f +f +f +f +f +e +f +f +f +f +i +i +f +i +f +f +f +d +z +A +A +z +B +d +a +"} +(25,1,1) = {" +a +b +b +c +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +h +f +e +f +f +f +f +f +f +f +i +f +f +f +e +A +g +g +g +z +e +a +"} +(26,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +f +f +e +f +h +f +f +f +f +h +f +f +h +f +s +A +g +g +g +A +u +a +"} +(27,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +f +f +f +g +g +f +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +e +A +g +g +g +A +e +a +"} +(28,1,1) = {" +a +b +b +b +b +b +b +e +h +j +j +f +h +f +j +j +f +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +d +z +A +A +A +z +d +a +"} +(29,1,1) = {" +a +b +b +b +b +b +b +e +f +g +g +f +f +f +g +g +f +f +f +f +f +d +e +s +e +d +e +s +e +d +e +s +e +d +d +e +u +e +d +d +a +"} +(30,1,1) = {" +a +b +b +c +b +b +b +e +f +g +g +g +j +g +g +g +f +f +f +h +f +e +f +f +v +e +f +f +v +e +f +f +f +e +a +a +a +a +a +a +a +"} +(31,1,1) = {" +a +b +b +b +b +b +b +d +f +g +g +g +j +g +g +g +f +f +f +f +f +e +f +t +w +x +w +y +f +s +f +h +f +e +a +a +a +a +a +a +a +"} +(32,1,1) = {" +a +b +b +b +b +b +d +d +f +f +f +f +f +f +f +f +f +f +f +f +f +e +f +f +f +e +f +f +f +e +f +f +f +e +a +a +a +a +a +a +a +"} +(33,1,1) = {" +a +a +a +a +a +a +d +f +f +f +f +f +f +f +f +f +f +h +f +f +f +d +e +s +e +d +e +s +e +d +f +v +f +d +a +a +a +a +a +a +a +"} +(34,1,1) = {" +a +a +a +a +a +a +e +f +h +f +f +f +f +f +f +f +f +f +f +f +f +e +g +f +v +e +f +f +v +e +f +f +f +e +a +a +a +a +a +a +a +"} +(35,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +h +f +f +f +f +f +f +f +f +f +e +g +h +f +s +f +h +f +s +f +h +f +e +a +a +a +a +a +a +a +"} +(36,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +h +f +f +f +f +f +e +g +f +f +e +f +f +f +e +f +f +f +e +a +a +a +a +a +a +a +"} +(37,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +f +f +f +f +f +f +d +e +u +e +d +e +u +e +d +e +u +e +d +a +a +a +a +a +a +a +"} +(38,1,1) = {" +a +a +a +a +a +a +d +f +f +f +f +f +f +f +f +f +f +f +f +f +f +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(39,1,1) = {" +a +a +a +a +a +a +d +d +e +e +e +d +e +e +e +e +d +e +e +e +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(40,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm new file mode 100644 index 00000000000..ec204fb4362 --- /dev/null +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm @@ -0,0 +1,1838 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"d" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central/fore) +"e" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating, +/area/hallway/primary/central/fore) +"f" = ( +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"g" = ( +/turf/open/openspace, +/area/hallway/primary/central/fore) +"h" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"i" = ( +/turf/open/floor/plating, +/area/hallway/primary/central/fore) +"j" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/hallway/primary/central/fore) +"k" = ( +/obj/machinery/light/floor, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"l" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"m" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Main Floor" + }, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"n" = ( +/obj/machinery/light/floor, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"o" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/cable, +/turf/open/floor/plating, +/area/hallway/primary/central/fore) +"p" = ( +/obj/structure/ladder, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"q" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Basic Equipment Tests" + }, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"r" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/hallway/primary/central/fore) +"s" = ( +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"t" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"u" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/hallway/primary/central/fore) +"v" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"w" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"x" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"y" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1; + icon_state = "passive_vent_map-3" + }, +/turf/open/floor/iron, +/area/hallway/primary/central/fore) +"z" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/red, +/area/hallway/primary/central/fore) +"A" = ( +/turf/open/floor/iron/red, +/area/hallway/primary/central/fore) +"B" = ( +/obj/machinery/meter/turf, +/turf/open/floor/iron/red, +/area/hallway/primary/central/fore) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +d +d +e +e +e +e +e +e +e +e +e +e +e +d +d +d +e +e +e +e +e +e +e +e +d +d +d +d +e +e +e +d +d +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +d +g +g +g +g +g +g +g +g +g +k +f +f +n +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +e +g +g +g +g +g +g +g +g +g +l +f +f +o +e +i +i +i +f +f +f +f +f +f +f +f +e +f +f +h +f +f +e +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +e +g +g +g +g +g +g +g +g +g +l +f +f +f +e +i +i +i +f +f +f +f +f +f +f +f +s +f +f +v +f +f +e +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +e +g +g +g +g +g +g +g +g +g +l +f +f +h +e +i +r +i +f +f +f +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +d +g +g +g +g +g +g +g +g +g +k +f +f +p +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +d +d +i +i +i +i +i +i +i +d +d +d +m +d +d +i +i +i +f +f +f +f +f +f +f +f +d +d +e +s +e +d +d +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +d +f +f +f +f +f +f +f +f +f +d +f +f +f +d +i +i +i +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +f +f +f +f +f +e +i +i +i +f +f +f +f +f +f +f +f +e +f +f +f +f +f +e +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +f +f +f +f +f +e +i +r +i +f +f +i +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +f +h +f +f +f +e +i +i +i +f +i +i +i +f +f +f +f +s +f +f +v +f +f +e +a +"} +(13,1,1) = {" +a +a +a +a +a +a +a +d +h +f +g +g +g +j +g +g +g +f +f +f +f +e +i +i +i +f +i +i +i +f +f +f +f +e +f +f +h +f +f +e +a +"} +(14,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +g +j +g +g +g +f +h +f +f +d +i +i +i +f +i +i +i +f +f +f +f +e +f +f +f +f +f +e +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +f +f +f +g +g +f +f +f +f +q +f +f +f +f +f +i +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +e +f +f +j +j +f +h +f +j +j +i +f +f +f +q +f +h +f +f +f +f +h +f +f +h +f +d +d +e +s +e +d +d +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +e +f +f +g +g +f +f +f +g +g +i +f +f +f +q +f +f +f +f +f +f +f +f +f +f +f +d +f +f +f +f +f +d +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +e +h +f +g +g +g +j +g +g +g +i +f +f +f +d +f +f +f +f +f +f +f +f +f +f +f +e +f +f +f +f +f +e +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +g +j +g +g +g +f +f +h +f +e +f +f +f +f +f +f +f +f +f +f +f +s +f +f +h +f +f +e +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +f +f +f +g +g +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +e +f +f +v +f +f +e +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +d +f +f +j +j +f +h +f +j +j +f +f +f +f +e +f +h +f +f +f +f +h +f +f +h +f +e +f +f +f +f +f +e +a +"} +(22,1,1) = {" +a +a +a +a +a +a +a +e +f +f +g +g +f +f +f +g +g +f +f +f +f +e +f +f +f +f +f +f +f +i +f +f +f +d +f +f +f +f +f +d +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +e +h +f +g +g +g +j +g +g +g +h +f +f +f +e +f +f +f +f +i +i +f +i +f +f +f +d +d +e +s +e +d +d +a +"} +(24,1,1) = {" +a +a +a +a +a +a +a +e +f +f +g +g +g +j +g +g +g +f +f +f +f +e +f +f +f +f +i +i +f +i +f +f +f +d +z +A +A +z +B +d +a +"} +(25,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +f +f +f +g +g +f +f +h +f +e +f +f +f +f +f +f +f +i +f +f +f +e +A +g +g +g +z +e +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +d +f +f +j +j +f +h +f +j +j +f +f +f +f +e +f +h +f +f +f +f +h +f +f +h +f +s +A +g +g +g +A +u +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +d +f +f +g +g +f +f +f +g +g +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +e +A +g +g +g +A +e +a +"} +(28,1,1) = {" +a +a +a +a +a +a +a +e +h +f +g +g +g +j +g +g +g +f +f +f +f +e +f +f +f +f +f +f +f +f +f +f +f +d +z +A +A +A +z +d +a +"} +(29,1,1) = {" +a +a +a +a +a +a +a +e +f +f +g +g +g +j +g +g +g +f +f +f +f +d +e +s +e +d +e +s +e +d +e +s +e +d +d +e +u +e +d +d +a +"} +(30,1,1) = {" +a +a +a +a +a +a +a +e +f +f +g +g +f +f +f +g +g +f +f +h +f +e +f +f +v +e +f +f +v +e +f +f +f +e +a +a +a +a +a +a +a +"} +(31,1,1) = {" +a +a +a +a +a +a +a +d +f +f +j +j +f +h +f +j +j +f +f +f +f +e +f +t +w +x +w +y +f +s +f +h +f +e +a +a +a +a +a +a +a +"} +(32,1,1) = {" +a +a +a +a +a +a +d +d +f +f +g +g +f +f +f +g +g +f +f +f +f +e +f +f +f +e +f +f +f +e +f +f +f +e +a +a +a +a +a +a +a +"} +(33,1,1) = {" +a +a +a +a +a +a +d +f +f +f +g +g +g +j +g +g +g +h +f +f +f +d +e +s +e +d +e +s +e +d +f +v +f +d +a +a +a +a +a +a +a +"} +(34,1,1) = {" +a +a +a +a +a +a +e +f +h +f +g +g +g +j +g +g +g +f +f +f +f +e +g +f +v +e +f +f +v +e +f +f +f +e +a +a +a +a +a +a +a +"} +(35,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +h +f +f +f +f +f +f +f +f +f +e +g +h +f +s +f +h +f +s +f +h +f +e +a +a +a +a +a +a +a +"} +(36,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +h +f +f +f +f +f +e +g +f +f +e +f +f +f +e +f +f +f +e +a +a +a +a +a +a +a +"} +(37,1,1) = {" +a +a +a +a +a +a +e +f +f +f +f +f +f +f +f +f +f +f +f +f +f +d +e +u +e +d +e +u +e +d +e +u +e +d +a +a +a +a +a +a +a +"} +(38,1,1) = {" +a +a +a +a +a +a +d +f +f +f +f +f +f +f +f +f +f +f +f +f +f +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(39,1,1) = {" +a +a +a +a +a +a +d +d +e +e +e +d +e +e +e +e +d +e +e +e +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(40,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} From 59fef0d39aef93fb1309b469a04dddea1733ee2b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 03:12:50 -0400 Subject: [PATCH 109/200] Enables MultiZAS --- code/__DEFINES/atmospherics/ZAS.dm | 32 +++++++++++++-------- code/__DEFINES/flags.dm | 10 +++++++ code/game/turfs/open/openspace.dm | 7 ++++- code/game/turfs/open/space/space.dm | 3 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 2 ++ code/modules/atmospherics/ZAS/Turf.dm | 10 ++++--- config/maps.txt | 3 ++ 7 files changed, 49 insertions(+), 18 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 450fb1d3cf2..969b12897de 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,5 +1,5 @@ //#define ZASDBG -//#define MULTIZAS +#define MULTIZAS ///Air and zones freely mingle with this turf under the given conditions #define AIR_ALLOWED (0<<0) @@ -45,28 +45,34 @@ } while(FALSE) #define TURF_HAS_VALID_ZONE(T) (T.simulated && T.zone && !T.zone.invalid) -#ifdef MULTIZAS +#ifdef MULTIZAS ///"Can safely remove from zone" -GLOBAL_REAL(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) +GLOBAL_REAL_VAR(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) ///"Get zone neighbors" -GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) +GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) ///Can air move from B to A? #define ATMOS_CANPASS_TURF(ret,A,B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ - ret = BLOCKED; \ + ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ else if (B.z != A.z) { \ - if (B.z < A.z) { \ - ret = (A.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ + var/canpass_dir = get_dir_multiz(B, A); \ + if(canpass_dir) { \ + if (canpass_dir & UP) { \ + ret = ((A.z_flags & Z_ATMOS_IN_DOWN) && (B.z_flags & Z_ATMOS_OUT_UP)) ? ZONE_BLOCKED : AIR_BLOCKED|ZONE_BLOCKED; \ + } \ + else { \ + ret = ((A.z_flags & Z_ATMOS_IN_UP) && (B.z_flags & Z_ATMOS_OUT_DOWN)) ? ZONE_BLOCKED : AIR_BLOCKED|ZONE_BLOCKED; \ + } \ } \ else { \ - ret = (B.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ + ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ - ret = (A.z == B.z) ? ZONE_BLOCKED : AIR_BLOCKED; \ + ret = (A.z == B.z) ? ZONE_BLOCKED : AIR_BLOCKED|ZONE_BLOCKED; \ } \ else if (A.contents.len) { \ ret = 0;\ @@ -77,24 +83,26 @@ GLOBAL_REAL(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } \ if (CANPASS_DENSITY) { \ if (AM.density) { \ - ret |= AIR_BLOCKED; \ + ret |= AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ if (CANPASS_PROC) { \ ret |= AM.zas_canpass(B); \ } \ if (CANPASS_NEVER) { \ - ret = AIR_BLOCKED; \ + ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ - if (ret == AIR_BLOCKED) { \ + if (ret == AIR_BLOCKED|ZONE_BLOCKED) { \ break;\ }\ }\ } #else +///"Can safely remove from zone" GLOBAL_REAL_VAR(list/csrfz_check) = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) +///"Get zone neighbors" GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) ///Can air move from B to A? diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b1139fcf476..154a9078f06 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -288,3 +288,13 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define SPACEVINE_HEAT_RESISTANT (1 << 0) /// Is the spacevine / flower bud cold resistant #define SPACEVINE_COLD_RESISTANT (1 << 1) + +//Z-level flags. Currently only for ZAS +///Allows air to flow IN from higher Z levels +#define Z_ATMOS_IN_UP (1<<0) +///Allows air to flow IN from lower z levels +#define Z_ATMOS_IN_DOWN (1<<1) +///Allows air to flow OUT to higher Z levels +#define Z_ATMOS_OUT_UP (1<<2) +///Allows air to flow OUT to LOWER z levels +#define Z_ATMOS_OUT_DOWN (1<<3) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 951b06ad0b6..2d1d0b25f30 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -18,8 +18,13 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr baseturfs = /turf/open/openspace overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE + #ifndef ZASDBG //Multi-Z zone debugging mouse_opacity = MOUSE_OPACITY_TRANSPARENT + #endif pathing_pass_method = TURF_PATHING_PASS_PROC + + z_flags = Z_ATMOS_IN_DOWN|Z_ATMOS_IN_UP|Z_ATMOS_OUT_DOWN|Z_ATMOS_OUT_UP + var/can_cover_up = TRUE var/can_build_on = TRUE @@ -27,7 +32,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr initial_gas = AIRLESS_ATMOS /turf/open/openspace/airless/planetary - + simulated = FALSE /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 5e11964b1f9..2d68c3082de 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -4,7 +4,7 @@ name = "\proper space" overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE - + z_flags = Z_ATMOS_IN_DOWN|Z_ATMOS_IN_UP|Z_ATMOS_OUT_DOWN|Z_ATMOS_OUT_UP temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 @@ -228,6 +228,7 @@ /turf/open/space/openspace icon = 'icons/turf/floors.dmi' icon_state = "invisible" + simulated = TRUE /turf/open/space/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 17f44c2e459..12b1198674a 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -37,6 +37,7 @@ return if(direction == "N/A") + to_chat(mob, "Testing self-blocking...") var/canpass_self ATMOS_CANPASS_TURF(canpass_self, T, T) if(!(canpass_self & AIR_BLOCKED)) @@ -54,6 +55,7 @@ var/o_block ATMOS_CANPASS_TURF(o_block, other_turf, T) + to_chat(mob, "Testing connection between ([T.x], [T.y], [T.z]) and ([other_turf.x], [other_turf.y], [other_turf.z])...") if(o_block & AIR_BLOCKED) if(t_block & AIR_BLOCKED) to_chat(mob, "Neither turf can connect. :(") diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 3bd87c160a1..aab7eda075f 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -3,6 +3,8 @@ var/zone/zone ///All directions in which a turf that can contain air is present. var/open_directions + ///Can atmos pass down through this turf? + var/z_flags = Z_ATMOS_IN_UP|Z_ATMOS_OUT_UP /turf ///Does this turf need to be ran through SSzas? (SSzas.mark_for_update(turf) OR turf.update_nearby_tiles()) @@ -55,7 +57,7 @@ ATMOS_CANPASS_TURF(target_blocks_us, target, src) if(target_blocks_us & AIR_BLOCKED) #ifdef ZASDBG - target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) + //target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) #endif continue @@ -158,7 +160,7 @@ #ifdef ZASDBG if(verbose) zas_log("[dir2text(d)] is blocked.") - src.dbg(ZAS_DIRECTIONAL_BLOCKER(d)) + //src.dbg(ZAS_DIRECTIONAL_BLOCKER(d)) #endif continue @@ -170,7 +172,7 @@ #ifdef ZASDBG if(verbose) zas_log("[dir2text(d)] is blocked.") - target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) + //target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) #endif //Check that our zone hasn't been cut off recently. @@ -198,7 +200,7 @@ #ifdef ZASDBG if(verbose) zas_log("[dir2text(d)] is zone blocked.") - dbg(ZAS_ZONE_BLOCKER(d)) + //dbg(ZAS_ZONE_BLOCKER(d)) #endif //Postpone this tile rather than exit, since a connection can still be made. diff --git a/config/maps.txt b/config/maps.txt index 87293fd9bca..6d098587b0e 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -45,5 +45,8 @@ endmap map atmostest endmap +map atmostest_multiz +endmap + map multiz_debug endmap From 2850f3b013b7f578d10c2d13bb3328c20c771315 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 12:34:15 -0400 Subject: [PATCH 110/200] Try to fix world bounds issue with ZAS --- code/modules/atmospherics/ZAS/Turf.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index aab7eda075f..4faa1887abd 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -71,7 +71,7 @@ if (T.zone) { \ for (var/_gzn_dir in gzn_check) { \ var/turf/other = get_step(T, _gzn_dir); \ - if (other.simulated && other.zone == T.zone) { \ + if (other && other.simulated && other.zone == T.zone) { \ var/block; \ ATMOS_CANPASS_TURF(block, other, T); \ if (!(block & AIR_BLOCKED)) { \ @@ -99,7 +99,7 @@ if((dir & check_dirs) == dir) //check that they are connected by the corner turf var/turf/T = get_step(src, dir) - if (!T.simulated) + if (!T?.simulated) . &= ~dir continue From 09812a34db6063ea9a70fbed285e58946faf0fa4 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 12:56:22 -0400 Subject: [PATCH 111/200] Runtimes fix --- code/modules/atmospherics/rust/particle_catcher.dm | 2 +- code/modules/mob/living/carbon/life.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/rust/particle_catcher.dm b/code/modules/atmospherics/rust/particle_catcher.dm index b8757a813db..a029ecd1779 100644 --- a/code/modules/atmospherics/rust/particle_catcher.dm +++ b/code/modules/atmospherics/rust/particle_catcher.dm @@ -10,7 +10,7 @@ /obj/effect/fusion_particle_catcher/Destroy() . =..() - parent.particle_catchers -= src + parent?.particle_catchers -= src //This should never actually exist outside of the R-UST, but, unit tests. parent = null /obj/effect/fusion_particle_catcher/proc/set_size(newsize) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8852d634b82..edf8ad1fc3c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -131,7 +131,7 @@ breath.adjustGas(gasname, -breath.gas[gasname], update = 0) //update after check_breath(breath) - if(breath.total_moles) + if(breath?.total_moles) AIR_UPDATE_VALUES(breath) loc.assume_air(breath) From b492c73d2b43943fc2d1a9e1d6c519c500522b73 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 13:11:37 -0400 Subject: [PATCH 112/200] Fixes a hilarious oversight --- code/modules/atmospherics/ZAS/Airflow.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 0e5412aa686..7567fb63841 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -27,7 +27,7 @@ Contains helper procs for airflow, handled in /connection_group. /mob/living/silicon/airflow_stun() return -/mob/living/carbon/slime/airflow_stun() +/mob/living/simple_animal/slime/airflow_stun() return /atom/movable/proc/experience_pressure_difference() From 995c023ccbedef8fa0418f3ea67256a9c0b0af2e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 13:38:13 -0400 Subject: [PATCH 113/200] CI --- _maps/map_files/debug/atmos_mintest.dmm | 4 +++- _maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm | 4 +++- code/modules/atmospherics/ZAS/Turf.dm | 4 +++- code/modules/mapping/map_template.dm | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index 1ed2380d184..c85ea297d00 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -15,7 +15,9 @@ name = "c1vent" }, /turf/open/floor/plating, -/area/hallway/primary/central) +/area/hallway/primary/central, +/obj/effect/landmark/blobstart +) "ae" = ( /obj/machinery/door/poddoor{ id = "c2vent"; diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm index 7326b841ed6..b62bc208916 100644 --- a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm @@ -15,7 +15,9 @@ name = "c1vent" }, /turf/open/floor/plating, -/area/hallway/primary/central) +/area/hallway/primary/central, +/obj/effect/landmark/blobstart +) "ae" = ( /obj/machinery/door/poddoor{ id = "c2vent"; diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 4faa1887abd..e710aea0bd9 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -255,8 +255,10 @@ #ifdef ZASDBG if(verbose) zas_log("This turf tried to merge into itself! Current type: [src.type]") - #endif + CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning + #endif + return //THIS BUG IS SMALL ENOUGH THAT IT IS FINE FOR NOW. I WILL FIX IT IN THE FUTURE. SSzas.connect(src, T) /turf/proc/post_update_air_properties() diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 29bdb96720d..b2398487777 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -155,8 +155,10 @@ return /*var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), - locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z))*/ + locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z))*/\ + #ifdef ZASDBG stack_trace("This is a reminder that kapu touched this code") + #endif /* for(var/L in border) var/turf/turf_to_disable = L From 9234bf61905835a01e3d866bf1ef7e3e0af0a9a3 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 13:50:45 -0400 Subject: [PATCH 114/200] please --- _maps/map_files/debug/atmos_mintest.dmm | 2 +- _maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index c85ea297d00..5d6b4a9ae09 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -16,7 +16,6 @@ }, /turf/open/floor/plating, /area/hallway/primary/central, -/obj/effect/landmark/blobstart ) "ae" = ( /obj/machinery/door/poddoor{ @@ -52,6 +51,7 @@ "al" = ( /obj/machinery/power/rtg/debug, /obj/structure/cable, +/obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/hallway/primary/central) "am" = ( diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm index b62bc208916..59f291fd322 100644 --- a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm @@ -16,7 +16,6 @@ }, /turf/open/floor/plating, /area/hallway/primary/central, -/obj/effect/landmark/blobstart ) "ae" = ( /obj/machinery/door/poddoor{ @@ -33,6 +32,7 @@ /turf/open/floor/plating, /area/hallway/primary/central) "ag" = ( +/obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/hallway/primary/central) "ah" = ( From c399329664cd353e693caeeba14af0c1f02a2d8d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 13:54:59 -0400 Subject: [PATCH 115/200] fix icebox --- .../map_files/IceBoxStation/IcemoonUnderground_Below.dmm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm index 60de0ef835a..90d504fa044 100644 --- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm +++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm @@ -142,7 +142,8 @@ /obj/structure/window/reinforced/spawner, /obj/item/throwing_star/toy, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = list("oxygen" = 22, "nitrogen"=82); + temperature =293.15; }, /area/security/prison/rec) "bz" = ( @@ -2465,7 +2466,8 @@ /obj/structure/flora/ausbushes/sparsegrass, /obj/machinery/light/warm/directional/north, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = list("oxygen" = 22, "nitrogen"=82); + temperature =293.15; }, /area/security/prison/rec) "zD" = ( @@ -4244,7 +4246,8 @@ /obj/structure/flora/junglebush, /obj/structure/flora/ausbushes/sparsegrass, /turf/open/misc/ashplanet/wateryrock{ - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + initial_gas = list("oxygen" = 22, "nitrogen"=82); + temperature =293.15; }, /area/security/prison/rec) "Rs" = ( From 2b627f84e2b598d2d3a1b23b89440944784c40f9 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:28:35 -0400 Subject: [PATCH 116/200] Linter pass attempt 1 --- ..._underground_abandoned_plasma_facility.dmm | 1 - .../lavaland_surface_syndicate_base1.dmm | 11 ------- .../mistake_inevitable.dmm | 2 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- .../map_files/Deltastation/DeltaStation2.dmm | 29 +------------------ .../map_files/IceBoxStation/IceBoxStation.dmm | 21 +------------- .../IcemoonUnderground_Above.dmm | 1 - _maps/map_files/KiloStation/KiloStation.dmm | 22 ++------------ _maps/map_files/MetaStation/MetaStation.dmm | 27 +---------------- _maps/map_files/debug/multiz.dmm | 1 + _maps/map_files/tramstation/tramstation.dmm | 25 +--------------- _maps/shuttles/emergency_supermatter.dmm | 4 +-- 12 files changed, 11 insertions(+), 135 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index bf28ba25c77..cc5c691094d 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -410,7 +410,6 @@ "fO" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, -/obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) "fP" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 65777fe61c5..66e94e9fe85 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -634,10 +634,6 @@ /area/ruin/syndicate_lava_base/engineering) "eM" = ( /obj/machinery/light/small/directional/south, -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "syndie_lavaland_incineratorturbine" - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) @@ -3230,9 +3226,6 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "AB" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) "AD" = ( @@ -4354,10 +4347,6 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "TV" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "syndie_lavaland_incineratorturbine" - }, /obj/structure/cable, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index bb1769f52d8..5419ac4716a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -243,7 +243,7 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "yO" = ( -/obj/machinery/power/supermatter_crystal/shard/syndicate, +/obj/machinery/power/rtg/debug/station, /obj/structure/window/reinforced/plasma/spawner, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 2c4ec370eb6..fb261395aef 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -4771,7 +4771,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "mm" = ( -/obj/machinery/power/supermatter_crystal/shard, +/obj/machinery/power/rtg/debug/station, /obj/structure/closet/crate/engineering{ name = "supermatter shard crate" }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 629c9878aee..d3a94a14fb8 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2342,7 +2342,6 @@ /area/security/courtroom) "aEE" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/water_vapor, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/bot/right, /turf/open/floor/iron/checker, @@ -4203,10 +4202,6 @@ /area/engineering/atmos/pumproom) "bah" = ( /obj/structure/table/reinforced, -/obj/item/hfr_box/body/waste_output, -/obj/item/hfr_box/body/moderator_input, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/fuel_input, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/engineering/atmos/hfr_room) @@ -16311,10 +16306,6 @@ /turf/open/floor/iron, /area/engineering/atmos/storage/gas) "dqJ" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "main_turbine" - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, @@ -27653,7 +27644,6 @@ /turf/open/floor/iron/dark, /area/hallway/secondary/service) "fTx" = ( -/obj/machinery/power/turbine/inlet_compressor, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "fTH" = ( @@ -35266,7 +35256,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron, /area/hallway/primary/port) "iaE" = ( @@ -43563,9 +43552,6 @@ /turf/open/floor/iron/white, /area/medical/virology) "kxl" = ( -/obj/machinery/power/turbine/core_rotor{ - mapping_id = "main_turbine" - }, /obj/structure/cable, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -50384,7 +50370,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/central/aft) "msD" = ( @@ -54008,7 +53993,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron{ heat_capacity = 1e+006 }, @@ -58071,7 +58055,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron/white/corner{ dir = 1 }, @@ -59092,7 +59075,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/starboard) "paR" = ( @@ -66974,7 +66956,6 @@ "rrB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -70146,7 +70127,6 @@ /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron, /area/hallway/primary/central/fore) "smO" = ( @@ -74585,7 +74565,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/port) "txm" = ( @@ -75793,7 +75772,6 @@ /area/engineering/storage_shared) "tRE" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "tRP" = ( @@ -77290,7 +77268,7 @@ /turf/open/floor/iron, /area/medical/virology) "uqa" = ( -/obj/machinery/power/supermatter_crystal/engine, +/obj/machinery/power/rtg/debug/station, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer4, /turf/open/floor/engine, @@ -79304,7 +79282,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/hallway/secondary/entry) "uXJ" = ( @@ -85177,7 +85154,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/commons/dorms) "wOG" = ( @@ -87329,7 +87305,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/central/aft) "xwx" = ( @@ -88159,7 +88134,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/hallway/primary/aft) "xJN" = ( @@ -88182,7 +88156,6 @@ dir = 1 }, /obj/effect/turf_decal/tile/yellow, -/obj/machinery/bluespace_vendor/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/hallway/secondary/entry) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 6e5e4d44ed1..41fa2b2e4da 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1666,7 +1666,6 @@ /turf/open/floor/iron/white/corner, /area/hallway/primary/starboard) "aGk" = ( -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/central) "aGJ" = ( @@ -10228,7 +10227,6 @@ /turf/open/floor/iron, /area/hallway/primary/aft) "dOw" = ( -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/commons/locker) "dOB" = ( @@ -12555,7 +12553,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/secondary/entry) "fbY" = ( @@ -17079,7 +17076,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Fore Primary Hallway" }, @@ -17777,7 +17773,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/commons/dorms) "hzq" = ( @@ -22136,9 +22131,6 @@ /turf/open/floor/plating, /area/security/lockers) "jEN" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 8 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "jET" = ( @@ -23491,10 +23483,6 @@ /turf/open/misc/asteroid/snow/icemoon, /area/ai_monitored/turret_protected/aisat/maint) "kmx" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 8; - mapping_id = "main_turbine" - }, /obj/structure/cable, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -32256,7 +32244,6 @@ /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "oOi" = ( -/obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/iron, /area/service/janitor) "oOj" = ( @@ -36757,7 +36744,6 @@ /area/maintenance/aft/greater) "raT" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/bluespace_vendor/directional/north, /obj/effect/mapping_helpers/trapdoor_placer, /turf/open/floor/iron, /area/hallway/primary/central) @@ -39940,7 +39926,7 @@ /turf/open/floor/iron/showroomfloor, /area/security/processing) "szM" = ( -/obj/machinery/power/supermatter_crystal/engine, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/engine, /area/engineering/supermatter) "szW" = ( @@ -48304,7 +48290,6 @@ /obj/structure/chair{ dir = 8 }, -/obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron, /area/hallway/primary/starboard) "wEX" = ( @@ -48659,10 +48644,6 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "wPs" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "main_turbine" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm index cb4c8511c61..7aa1650b370 100644 --- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm +++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm @@ -8348,7 +8348,6 @@ /turf/open/floor/iron/dark, /area/medical/morgue) "xb" = ( -/obj/machinery/bluespace_vendor/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 14d0d73c955..c3a4f550fd5 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -22599,7 +22599,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron/dark/corner{ dir = 4 }, @@ -26485,7 +26484,6 @@ c_tag = "Port Hallway Firelock"; name = "port camera" }, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron/dark/corner{ dir = 8 }, @@ -43849,7 +43847,6 @@ c_tag = "Fore Hallway Diner"; name = "fore camera" }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/central/fore) "kmJ" = ( @@ -46830,9 +46827,6 @@ /turf/open/floor/iron, /area/maintenance/disposal/incinerator) "lmB" = ( -/obj/machinery/power/turbine/core_rotor{ - mapping_id = "main_turbine" - }, /obj/structure/cable, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -47185,10 +47179,6 @@ name = "atmospherics camera"; network = list("ss13","engine") }, -/obj/item/hfr_box/body/fuel_input, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/moderator_input, -/obj/item/hfr_box/body/waste_output, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) "lrD" = ( @@ -47897,7 +47887,7 @@ /turf/open/floor/wood, /area/service/lawoffice) "lGe" = ( -/obj/machinery/power/supermatter_crystal/engine, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/engine, /area/engineering/supermatter) "lGj" = ( @@ -50104,7 +50094,6 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/hallway/secondary/entry) "moD" = ( @@ -54821,7 +54810,6 @@ /turf/open/floor/plating, /area/cargo/warehouse) "nUs" = ( -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron/dark, /area/service/chapel/monastery) "nUt" = ( @@ -54928,7 +54916,7 @@ /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/south, + /turf/open/floor/iron/dark, /area/service/chapel/monastery) "nVD" = ( @@ -76127,10 +76115,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 }, -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "main_turbine" - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "uXa" = ( @@ -77204,7 +77188,6 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/hallway/primary/central) "vpc" = ( @@ -84298,7 +84281,6 @@ /turf/open/floor/iron, /area/hallway/primary/starboard) "xFO" = ( -/obj/machinery/power/turbine/inlet_compressor, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "xFY" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 6b9dd20b479..45ab5261ff5 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -7709,7 +7709,6 @@ "bWb" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/commons/locker) "bWz" = ( @@ -8962,7 +8961,7 @@ /turf/open/floor/iron, /area/hallway/primary/port) "ctk" = ( -/obj/machinery/power/supermatter_crystal/engine, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/engine, /area/engineering/supermatter) "ctm" = ( @@ -16843,7 +16842,6 @@ dir = 1 }, /obj/structure/cable, -/obj/machinery/bluespace_vendor/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/commons/fitness/recreation) @@ -20959,10 +20957,6 @@ /area/service/kitchen/coldroom) "gql" = ( /obj/structure/table, -/obj/item/hfr_box/body/waste_output, -/obj/item/hfr_box/body/moderator_input, -/obj/item/hfr_box/body/fuel_input, -/obj/item/hfr_box/body/interface, /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/engineering/atmospherics_engine) @@ -28618,7 +28612,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/port) "jpP" = ( @@ -29676,7 +29669,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "jIS" = ( @@ -29967,7 +29959,6 @@ dir = 1 }, /obj/structure/cable, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/commons/dorms) "jOn" = ( @@ -31159,7 +31150,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/central) "kmR" = ( @@ -40096,7 +40086,6 @@ }, /obj/item/pen, /obj/effect/turf_decal/delivery, -/obj/machinery/bluespace_vendor/directional/east, /turf/open/floor/iron, /area/hallway/secondary/command) "nnO" = ( @@ -58421,10 +58410,6 @@ /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) "uuy" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "main_turbine" - }, /obj/structure/cable, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -60485,7 +60470,6 @@ dir = 1 }, /obj/structure/cable, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/port) "vlR" = ( @@ -62415,9 +62399,6 @@ /turf/open/floor/iron, /area/security/prison) "vVR" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "vWe" = ( @@ -62621,7 +62602,6 @@ dir = 8 }, /obj/effect/landmark/start/hangover, -/obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/hallway/primary/central) "waq" = ( @@ -62740,9 +62720,6 @@ "wdO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/computer/turbine_computer{ - mapping_id = "main_turbine" - }, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) "wdQ" = ( @@ -64238,7 +64215,6 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/hallway/primary/fore) "wGZ" = ( @@ -65299,7 +65275,6 @@ /area/command/heads_quarters/cmo) "xaY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/iron, /area/service/janitor) "xbs" = ( diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index 1ae9b65d0b2..b7435ceb1ce 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -647,6 +647,7 @@ /turf/open/floor/iron, /area/commons/storage/primary) "cW" = ( +/obj/effect/landmark/blobstart, /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, /turf/open/floor/iron, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 90917df648c..008764b10b6 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -3500,7 +3500,6 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/north, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -18345,9 +18344,6 @@ /turf/open/floor/iron/dark, /area/command/bridge) "fkD" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "fkQ" = ( @@ -20640,9 +20636,6 @@ /area/maintenance/central/greater) "fZl" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/turbine_computer{ - mapping_id = "main_turbine" - }, /obj/structure/cable/layer1, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) @@ -24824,7 +24817,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/south, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -28929,7 +28921,6 @@ /area/medical/medbay/central) "iZW" = ( /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/water_vapor, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -31653,7 +31644,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/tram/left) "jWc" = ( @@ -37104,7 +37094,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/secondary/exit) "lON" = ( @@ -42581,7 +42570,7 @@ /turf/open/floor/iron/white, /area/science/explab) "nSy" = ( -/obj/machinery/power/supermatter_crystal/engine, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/engine, /area/engineering/supermatter) "nSQ" = ( @@ -54687,10 +54676,6 @@ /obj/effect/turf_decal/bot, /obj/item/stack/sheet/plasteel/fifty, /obj/effect/decal/cleanable/dirt, -/obj/item/hfr_box/body/fuel_input, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/moderator_input, -/obj/item/hfr_box/body/waste_output, /turf/open/floor/iron, /area/engineering/atmospherics_engine) "sop" = ( @@ -55922,7 +55907,6 @@ /obj/structure/chair{ dir = 4 }, -/obj/machinery/bluespace_vendor/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/hallway/secondary/exit/departure_lounge) @@ -58945,7 +58929,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/east, /obj/structure/cable, /turf/open/floor/iron, /area/hallway/secondary/entry) @@ -59169,10 +59152,6 @@ /turf/open/floor/iron, /area/maintenance/tram/left) "tTD" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "main_turbine" - }, /obj/structure/cable/layer1, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -64014,7 +63993,6 @@ /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 }, -/obj/machinery/bluespace_vendor/directional/north, /turf/open/floor/iron, /area/hallway/primary/tram/center) "vLu" = ( @@ -64362,7 +64340,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/bluespace_vendor/directional/east, /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ dir = 1 diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index a6b6e490f8b..c56aadb7554 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aB" = ( -/obj/machinery/power/supermatter_crystal/shard/hugbox/fakecrystal, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/plating, /area/shuttle/escape) "aD" = ( @@ -193,7 +193,7 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "aV" = ( -/obj/machinery/power/supermatter_crystal/shard/hugbox, +/obj/machinery/power/rtg/debug/station, /turf/open/floor/plating/airless, /area/shuttle/escape) "aW" = ( From fb85661c227dbc7b5b9e069a4baa7e727a7c28e2 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:34:39 -0400 Subject: [PATCH 117/200] more unused stuff cleanup --- _maps/map_files/Deltastation/DeltaStation2.dmm | 10 ---------- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 1 - _maps/map_files/KiloStation/KiloStation.dmm | 6 ------ _maps/map_files/MetaStation/MetaStation.dmm | 6 ------ _maps/map_files/tramstation/tramstation.dmm | 6 ------ 5 files changed, 29 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index d3a94a14fb8..a7d1ae5576c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -54697,7 +54697,6 @@ "nNk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/bot, -/obj/machinery/electrolyzer, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/engineering/atmos/project) @@ -67256,14 +67255,6 @@ /area/engineering/atmos) "rvE" = ( /obj/structure/table/reinforced, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/core{ - pixel_x = 3; - pixel_y = 3 - }, /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - HFR"; name = "atmospherics camera" @@ -70772,7 +70763,6 @@ /area/engineering/atmos/hfr_room) "swc" = ( /obj/effect/turf_decal/bot, -/obj/machinery/electrolyzer, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/textured_large, /area/engineering/atmos/project) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 41fa2b2e4da..225a48a5830 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -4540,7 +4540,6 @@ /area/maintenance/disposal/incinerator) "bEy" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) "bEC" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index c3a4f550fd5..b6afa7ea603 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -61249,7 +61249,6 @@ /area/ai_monitored/turret_protected/aisat/atmos) "pZk" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, /turf/open/floor/iron/dark, /area/maintenance/disposal/incinerator) "pZn" = ( @@ -65562,11 +65561,6 @@ dir = 4 }, /obj/structure/table, -/obj/item/hfr_box/core, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) "rou" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 45ab5261ff5..921b87eed7e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -57087,7 +57087,6 @@ /area/engineering/gravity_generator) "tSb" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron, @@ -61462,11 +61461,6 @@ /area/hallway/primary/starboard) "vEF" = ( /obj/structure/table, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/core, /turf/open/floor/iron/dark, /area/engineering/atmospherics_engine) "vEJ" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 008764b10b6..f7e62ec6ecc 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -19149,11 +19149,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, -/obj/item/hfr_box/core, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, -/obj/item/hfr_box/corner, /turf/open/floor/iron/dark, /area/engineering/atmospherics_engine) "fze" = ( @@ -34937,7 +34932,6 @@ dir = 8 }, /obj/machinery/firealarm/directional/west, -/obj/machinery/electrolyzer, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, From 03191c2fef7b38a52fc39c0bf6e5defdf40dfd8a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:39:14 -0400 Subject: [PATCH 118/200] gas id update --- .../lavaland_surface_syndicate_base1/mistake_inevitable.dmm | 2 +- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 +- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/KiloStation/KiloStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index 5419ac4716a..a2dfdbd7520 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -305,7 +305,7 @@ "JO" = ( /obj/machinery/atmospherics/components/trinary/filter/on{ dir = 1; - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /obj/structure/window/reinforced/plasma/spawner, /turf/open/floor/engine, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index a7d1ae5576c..90d4ca0bf39 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -68175,7 +68175,7 @@ "rJL" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/yellow{ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 225a48a5830..e84c75295b0 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -21465,7 +21465,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /turf/open/floor/engine, /area/engineering/supermatter/room) diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index b6afa7ea603..116e91b9f85 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -56068,7 +56068,7 @@ "oqQ" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /obj/effect/turf_decal/stripes/line, /obj/structure/cable, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 921b87eed7e..652b9a1917e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -23842,7 +23842,7 @@ dir = 4 }, /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /turf/open/floor/engine, /area/engineering/supermatter/room) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index f7e62ec6ecc..419c8ab6071 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -59270,7 +59270,7 @@ "tVn" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; - filter_type = list(/datum/gas/nitrogen) + filter_type = list("nitrogen") }, /turf/open/floor/engine, /area/engineering/supermatter/room) From 256f3d63027cbf051ac2faf957b21c98b0918c1d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:44:03 -0400 Subject: [PATCH 119/200] more unused stuff --- .../LavaRuins/lavaland_surface_syndicate_base1.dmm | 3 --- _maps/map_files/Deltastation/DeltaStation2.dmm | 3 --- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 4 ---- .../map_files/IceBoxStation/IcemoonUnderground_Above.dmm | 3 --- _maps/map_files/KiloStation/KiloStation.dmm | 3 --- _maps/map_files/MetaStation/MetaStation.dmm | 8 -------- _maps/map_files/tramstation/tramstation.dmm | 5 ----- _maps/shuttles/pirate_silverscale.dmm | 1 - 8 files changed, 30 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 66e94e9fe85..488356a36a5 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -4041,9 +4041,6 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "OI" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) "OQ" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 90d4ca0bf39..964842551b4 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -68417,7 +68417,6 @@ /turf/open/floor/iron/white, /area/medical/medbay/central) "rMk" = ( -/obj/machinery/portable_atmospherics/canister/bz, /obj/machinery/light/directional/south, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -76438,7 +76437,6 @@ /turf/open/floor/iron, /area/hallway/primary/starboard) "ueV" = ( -/obj/machinery/atmospherics/components/unary/bluespace_sender, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -87403,7 +87401,6 @@ /turf/open/floor/iron, /area/engineering/main) "xyC" = ( -/obj/machinery/power/turbine/turbine_outlet, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "xyE" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index e84c75295b0..00726188a84 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -12188,7 +12188,6 @@ /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "eRO" = ( -/obj/machinery/atmospherics/components/unary/bluespace_sender, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -47835,9 +47834,6 @@ /turf/open/floor/iron/white, /area/medical/medbay/lobby) "wtn" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 8 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "wtr" = ( diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm index 7aa1650b370..639151a26e7 100644 --- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm +++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm @@ -3831,7 +3831,6 @@ /area/security/detectives_office) "kp" = ( /obj/structure/bonfire, -/obj/item/melee/roastingstick, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "kq" = ( @@ -7101,7 +7100,6 @@ /turf/open/floor/iron, /area/service/bar) "tu" = ( -/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/plating, /area/security/prison/safe) "tv" = ( @@ -8018,7 +8016,6 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "wg" = ( -/obj/machinery/portable_atmospherics/canister/bz, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ dir = 10 diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 116e91b9f85..7beeee11f00 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -61649,7 +61649,6 @@ /turf/open/floor/iron/dark, /area/service/hydroponics) "qga" = ( -/obj/machinery/power/turbine/turbine_outlet, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "qge" = ( @@ -73063,7 +73062,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/bz, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -76033,7 +76031,6 @@ /area/service/chapel/dock) "uVC" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron/dark, /area/engineering/atmos) "uVP" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 652b9a1917e..d8836c0b1dc 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -23400,9 +23400,6 @@ /turf/open/floor/iron/dark, /area/engineering/main) "hoj" = ( -/obj/machinery/atmospherics/components/binary/crystallizer{ - dir = 4 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, @@ -25442,7 +25439,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron, /area/engineering/atmos) "ies" = ( @@ -26944,9 +26940,6 @@ /turf/open/floor/iron/dark, /area/ai_monitored/aisat/exterior) "iKn" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "iKr" = ( @@ -44116,7 +44109,6 @@ /area/science/storage) "oRj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/bz, /obj/machinery/light/directional/north, /obj/effect/turf_decal/box, /turf/open/floor/iron, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 419c8ab6071..37c7068b95f 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -35659,7 +35659,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron, /area/engineering/atmos) "lpr" = ( @@ -47761,7 +47760,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/iron/dark, /area/science/xenobiology) "pKr" = ( @@ -51120,9 +51118,6 @@ /turf/open/floor/iron, /area/security/checkpoint) "qYn" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "qYy" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index 03e1630574f..0eb09f930bc 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -920,7 +920,6 @@ amount = 10 }, /obj/item/lighter, -/obj/item/melee/roastingstick, /turf/open/floor/iron/dark/textured, /area/shuttle/pirate) "UJ" = ( From b22f09f8f6c2f62df417d564fb731baac68afe20 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:52:35 -0400 Subject: [PATCH 120/200] mooooore shiit --- _maps/RandomRuins/SpaceRuins/hellfactory.dmm | 3 --- _maps/RandomZLevels/snowdin.dmm | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 15df219c4db..859f70d5789 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -910,9 +910,6 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) "hk" = ( -/obj/machinery/atmospherics/components/tank/water_vapor{ - dir = 8 - }, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hellfactoryoffice) "hv" = ( diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 123f4959e96..5504640208d 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -9405,7 +9405,7 @@ }, /turf/open/floor/mineral/plastitanium{ initial_gas = "o2=22;n2=82;TEMP=180"; - planetary_atmos = 1; + simulated = 0; temperature = 180 }, /area/awaymission/snowdin/cave) @@ -9417,7 +9417,7 @@ /obj/machinery/suit_storage_unit/syndicate, /turf/open/floor/mineral/plastitanium{ initial_gas = "o2=22;n2=82;TEMP=180"; - planetary_atmos = 1; + simulateds = 0; temperature = 180 }, /area/awaymission/snowdin/cave) @@ -9431,7 +9431,7 @@ }, /turf/open/floor/mineral/plastitanium{ initial_gas = "o2=22;n2=82;TEMP=180"; - planetary_atmos = 1; + simulateds = 0; temperature = 180 }, /area/awaymission/snowdin/cave) From b5296151e6b1a557040721e3435725c7531314f2 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 14:56:22 -0400 Subject: [PATCH 121/200] are you fucking kidding me --- _maps/RandomZLevels/snowdin.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 5504640208d..74a9178f641 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -9417,7 +9417,7 @@ /obj/machinery/suit_storage_unit/syndicate, /turf/open/floor/mineral/plastitanium{ initial_gas = "o2=22;n2=82;TEMP=180"; - simulateds = 0; + simulated = 0; temperature = 180 }, /area/awaymission/snowdin/cave) @@ -9431,7 +9431,7 @@ }, /turf/open/floor/mineral/plastitanium{ initial_gas = "o2=22;n2=82;TEMP=180"; - simulateds = 0; + simulated = 0; temperature = 180 }, /area/awaymission/snowdin/cave) From f6db6bcdb2245347f54a766211fa91efcdbd0039 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 15:28:30 -0400 Subject: [PATCH 122/200] please dont make me force push a reset --- code/modules/atmospherics/rust/reactor_em_field.dm | 4 ++++ code/modules/unit_tests/breath.dm | 8 +++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index 742e14a0fc7..c2daf103703 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -109,6 +109,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K GLOB.fusion_reactions[cur_reaction.s_react] = list() GLOB.fusion_reactions[cur_reaction.s_react][cur_reaction.p_react] = cur_reaction +/obj/effect/reactor_em_field/Destroy() + QDEL_LIST(particle_catchers) + return ..() + /obj/effect/reactor_em_field/proc/update_light_colors() var/use_range var/use_power diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index 81ebfae7313..bd3e16becab 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -25,12 +25,11 @@ var/turf/open/to_fill = run_loc_floor_bottom_left //Prep the floor to_fill.initial_gas = OPENTURF_DEFAULT_ATMOS - to_fill.air = new - to_fill.air.copyFrom(to_fill.return_air()) + to_fill.make_air() lab_rat.breathe() - TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Humans can't get a full breath from the standard initial_gas on a turf") + TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Humans can't get a full breath from the standard initial_gas on a turf. Turf: [to_fill.type] | Air: [json_encode(to_fill.air.gas)] | Returned Air: [json_encode(to_fill.return_air().gas)]") /// Tests to make sure plasmaman can breath from their internal tanks /datum/unit_test/breath_sanity_plasmamen @@ -65,8 +64,7 @@ var/turf/open/to_fill = run_loc_floor_bottom_left //Prep the floor to_fill.initial_gas = LAVALAND_DEFAULT_ATMOS - to_fill.air = new - to_fill.air.copyFrom(to_fill.return_air()) + to_fill.make_air() lab_rat.breathe() From a9206890deba9d80866ef829ed66eb0d2f22ea29 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 15:55:16 -0400 Subject: [PATCH 123/200] hard del fix + transfer moles debugging --- code/modules/atmospherics/ZAS/atmos_primitives.dm | 6 ++++++ code/modules/atmospherics/rust/particle_catcher.dm | 2 +- code/modules/atmospherics/rust/reactor_em_field.dm | 4 ---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index db72e47c9f7..87ce211dc09 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -426,6 +426,12 @@ var/transfer_heat_capacity = source.getHeatCapacity()*estimate_moles/source_total_moles air_temperature = (sink.temperature*sink_heat_capacity + source.temperature*transfer_heat_capacity) / (sink_heat_capacity + transfer_heat_capacity) + #ifdef UNIT_TESTS + if(air_temperature == 0) + CRASH("Air temperature is 0. Source: ([json_encode(source.gas)], [source.temperature] | Sink: ([json_encode(sink.gasJ)], [sink.temperature])") + if((output_volume/(air_temperature*R_IDEAL_GAS_EQUATION)) == 0) + CRASH("Transfer moles is about to divide by 0. Source Total Moles: [source_total_moles] | Output Volume: [output_volume]") + #endif //get the number of moles that would have to be transfered to bring sink to the target pressure return pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) diff --git a/code/modules/atmospherics/rust/particle_catcher.dm b/code/modules/atmospherics/rust/particle_catcher.dm index a029ecd1779..d0e214d83e6 100644 --- a/code/modules/atmospherics/rust/particle_catcher.dm +++ b/code/modules/atmospherics/rust/particle_catcher.dm @@ -9,9 +9,9 @@ var/mysize = 0 /obj/effect/fusion_particle_catcher/Destroy() - . =..() parent?.particle_catchers -= src //This should never actually exist outside of the R-UST, but, unit tests. parent = null + return ..() /obj/effect/fusion_particle_catcher/proc/set_size(newsize) name = "collector [newsize]" diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index c2daf103703..742e14a0fc7 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -109,10 +109,6 @@ Deuterium-tritium fusion: 4.5 x 10^7 K GLOB.fusion_reactions[cur_reaction.s_react] = list() GLOB.fusion_reactions[cur_reaction.s_react][cur_reaction.p_react] = cur_reaction -/obj/effect/reactor_em_field/Destroy() - QDEL_LIST(particle_catchers) - return ..() - /obj/effect/reactor_em_field/proc/update_light_colors() var/use_range var/use_power From 8c78bcde1576fbe69a5ca37ed9eaadef1117467c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 16:01:32 -0400 Subject: [PATCH 124/200] typo --- code/modules/atmospherics/ZAS/atmos_primitives.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 87ce211dc09..b370be78301 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -428,7 +428,7 @@ #ifdef UNIT_TESTS if(air_temperature == 0) - CRASH("Air temperature is 0. Source: ([json_encode(source.gas)], [source.temperature] | Sink: ([json_encode(sink.gasJ)], [sink.temperature])") + CRASH("Air temperature is 0. Source: ([json_encode(source.gas)], [source.temperature] | Sink: ([json_encode(sink.gas)], [sink.temperature])") if((output_volume/(air_temperature*R_IDEAL_GAS_EQUATION)) == 0) CRASH("Transfer moles is about to divide by 0. Source Total Moles: [source_total_moles] | Output Volume: [output_volume]") #endif From 6724e21d731a4fd0aeb4af9ed2bf89f7430c7382 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 16:39:59 -0400 Subject: [PATCH 125/200] try to fix reactor hard del --- code/modules/atmospherics/rust/reactor_em_field.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/atmospherics/rust/reactor_em_field.dm b/code/modules/atmospherics/rust/reactor_em_field.dm index 742e14a0fc7..da4c479508a 100644 --- a/code/modules/atmospherics/rust/reactor_em_field.dm +++ b/code/modules/atmospherics/rust/reactor_em_field.dm @@ -63,6 +63,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K owned_core = new_owned_core if(!owned_core) qdel(src) + return //create the gimmicky things to handle field collisions var/obj/effect/fusion_particle_catcher/catcher From 1eaa40704a5dd884215cfc65e7b366d421628352 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 22:14:34 -0400 Subject: [PATCH 126/200] Fix some bugs. fuel_objs no longer leave refs --- code/datums/components/combustible_flooder.dm | 2 +- code/datums/components/thermite.dm | 2 +- code/game/objects/effects/decals/cleanable.dm | 2 +- code/game/objects/effects/decals/decal.dm | 2 +- code/game/objects/structures/window.dm | 4 ++-- code/modules/atmospherics/ZAS/Fire.dm | 11 +++++++---- code/modules/atmospherics/ZAS/Zone.dm | 8 +++++++- .../machinery/components/binary_devices/pump.dm | 2 +- .../food_and_drinks/kitchen_machinery/griddle.dm | 2 +- code/modules/reagents/reagent_containers.dm | 6 +++--- 10 files changed, 25 insertions(+), 16 deletions(-) diff --git a/code/datums/components/combustible_flooder.dm b/code/datums/components/combustible_flooder.dm index cae32ef8f64..361ceeb8778 100644 --- a/code/datums/components/combustible_flooder.dm +++ b/code/datums/components/combustible_flooder.dm @@ -56,7 +56,7 @@ qdel(src) /// fire_act reaction. -/datum/component/combustible_flooder/proc/flame_react(datum/source, exposed_temperature, exposed_volume) +/datum/component/combustible_flooder/proc/flame_react(datum/source, exposed_contents, exposed_temperature, exposed_volume) SIGNAL_HANDLER if(exposed_temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 536f6d36e51..63a29ba3ebd 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -130,7 +130,7 @@ * * exposed_temperature - The temperature of the flame hitting the thermite * * exposed_volume - The volume of the flame */ -/datum/component/thermite/proc/flame_react(datum/source, exposed_temperature, exposed_volume) +/datum/component/thermite/proc/flame_react(datum/source, exposed_contents, exposed_temperature, exposed_volume) SIGNAL_HANDLER if(exposed_temperature > 1922) // This is roughly the real life requirement to ignite thermite diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 247e5b0ab18..e4dacb783d2 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -83,7 +83,7 @@ else return ..() -/obj/effect/decal/cleanable/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume) if(reagents) reagents.expose_temperature(exposed_temperature) ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 6bfd03aec75..309fc091388 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -20,7 +20,7 @@ /obj/effect/decal/ex_act(severity, target) qdel(src) -/obj/effect/decal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/decal/fire_act(exposed_temperature, exposed_volume) if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava qdel(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a44021cf73d..46d71b5d308 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -394,9 +394,9 @@ crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) . += crack_overlay -/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/window/fire_act(exposed_temperature, exposed_volume) if (exposed_temperature > melting_point) - take_damage(round(air.get_volume() / 100), BURN, 0, 0) //The max of 9 is to ensure it takes 4 ticks to destroy, which is incredibly dramatic + take_damage(round(exposed_volume / 100), BURN, 0, 0) //The max of 9 is to ensure it takes 4 ticks to destroy, which is incredibly dramatic /obj/structure/window/get_dumping_location() return null diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 029d1c979a1..9b9ec0a2452 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -60,6 +60,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(istype(T.fire)) qdel(T.fire) fire_tiles.Cut() + //Gotta make sure we don't leave any left over signals + for(var/fuel in fuel_objs) + UnregisterSignal(fuel, COMSIG_PARENT_QDELETING) fuel_objs.Cut() if(!fire_tiles.len) @@ -84,8 +87,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(fuel.reagent_amount <= 0) fuel_objs -= fuel if(remove_fire) - var/turf/T = fuel.loc - if(istype(T) && T.fire) qdel(T.fire) + if(T.fire) + qdel(T.fire) qdel(fuel) /turf/proc/create_fire(fl) @@ -165,9 +168,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin for(var/mob/living/L in loc) L.FireBurn(firelevel, air_contents.temperature, air_contents.returnPressure()) //Burn the mobs! - loc.fire_act(air_contents, air_contents.temperature, air_contents.volume) + loc.fire_act(air_contents.temperature, air_contents.volume) for(var/atom/A in loc) - A.fire_act(air_contents, air_contents.temperature, air_contents.volume) + A.fire_act(air_contents.temperature, air_contents.volume) //spread for(var/direction in GLOB.cardinals) diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 79a1753efd1..f1270bc8d4b 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -84,7 +84,9 @@ Class Procs: var/obj/effect/decal/cleanable/oil/fuel = locate() in T fire_tiles.Add(T) SSzas.active_fire_zones |= src - if(fuel) fuel_objs += fuel + if(fuel) + fuel_objs += fuel + RegisterSignal(fuel, COMSIG_PARENT_QDELETING, .proc/handle_fuel_del) T.update_graphic(air.graphic) ///Removes the given turf from the zone. Will invalidate the zone if it was the last turf. @@ -243,3 +245,7 @@ Class Procs: //for(var/turf/T in unsimulated_contents) // to_chat(M, "[T] at ([T.x],[T.y])") + +///If fuel disappears from anything that isn't a fire burning it out, we gotta clear it's ref +/zone/proc/handle_fuel_del(datum/source) + fuel_objs -= src diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 1f65b89e936..6ef2f5db36f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -65,7 +65,7 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] //var/transfer_moles = (target_pressure/air1.volume)*air1.total_moles - var/transfer_moles = calculate_transfer_moles(air1, air2, target_pressure - air2.returnPressure(), air2 ? air2.volume : 0) + var/transfer_moles = calculate_transfer_moles(air1, air2, target_pressure - air2.returnPressure()) if(pump_gas(air1, air2, transfer_moles)) update_parents() diff --git a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm index 40421e50a35..d0cc81a683c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm @@ -137,7 +137,7 @@ var/obj/item/griddled_item = i if(SEND_SIGNAL(griddled_item, COMSIG_ITEM_GRILLED, src, delta_time) & COMPONENT_HANDLED_GRILLING) continue - griddled_item.fire_act(1000) //Hot hot hot! + griddled_item.fire_act(null, 1000) //Hot hot hot! if(prob(10)) visible_message(span_danger("[griddled_item] doesn't seem to be doing too great on the [src]!")) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 23666e3dd7b..f82a8c17eb3 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -154,7 +154,7 @@ return ..() -/obj/item/reagent_containers/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) ..() @@ -207,8 +207,8 @@ reagents.expose_temperature(1000) ..() -/obj/item/reagent_containers/fire_act(datum/gas_mixture/air, temperature, volume) - reagents.expose_temperature(temperature) +/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) + reagents.expose_temperature(exposed_temperature) /// Updates the icon of the container when the reagents change. Eats signal args /obj/item/reagent_containers/proc/on_reagent_change(datum/reagents/holder, ...) From cc55229ea42a19c6ab4add43be37240b8cda9e57 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 22:24:41 -0400 Subject: [PATCH 127/200] I Am An Idiot (fire compile fix) --- code/modules/atmospherics/ZAS/Fire.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 9b9ec0a2452..895dcf2784d 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -87,7 +87,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(fuel.reagent_amount <= 0) fuel_objs -= fuel if(remove_fire) - if(T.fire) + var/turf/T = fuel.loc + if(istype(T) && T.fire) qdel(T.fire) qdel(fuel) From 951e4e70a1b0ebcf2c5b560fe578b1eafc487cbc Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 4 Jun 2022 23:18:02 -0400 Subject: [PATCH 128/200] Fixes mapping error causing a bad init --- _maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm | 1 - _maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm | 1 - _maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm | 1 - code/modules/mapping/space_management/multiz_helpers.dm | 6 ++++++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm index 59f291fd322..979d678b16a 100644 --- a/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_1.dmm @@ -873,7 +873,6 @@ /turf/open/floor/iron, /area/hallway/primary/central) "cW" = ( -/obj/structure/cable, /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/hallway/primary/central) diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm index 34e9ccacc5f..71450ce61a0 100644 --- a/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_2.dmm @@ -60,7 +60,6 @@ /area/hallway/primary/upper) "o" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/cable, /turf/open/floor/plating, /area/hallway/primary/upper) "p" = ( diff --git a/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm b/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm index ec204fb4362..c80d97fa08f 100644 --- a/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm +++ b/_maps/map_files/multizas_debug/atmos_mintest_mz_3.dmm @@ -53,7 +53,6 @@ /area/hallway/primary/central/fore) "o" = ( /obj/structure/cable/multilayer/multiz, -/obj/structure/cable, /turf/open/floor/plating, /area/hallway/primary/central/fore) "p" = ( diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 4f9174e719f..7e19114ed6f 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -8,6 +8,12 @@ return get_step(ref, dir) /proc/get_dir_multiz(turf/us, turf/them) + ///Type mismatch of "list" at some point, I WILL FIND THIS BUG. + #ifdef UNIT_TESTS + ASSERT(istype(us)) + ASSERT(istype(them)) + #endif + us = get_turf(us) them = get_turf(them) if(!us || !them) From 51cb1f9c198913b84fb20e67b2e7ca1f5c519984 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 00:36:20 -0400 Subject: [PATCH 129/200] docs zas compile options --- code/__DEFINES/atmospherics/ZAS.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 969b12897de..0aa8918112b 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,4 +1,6 @@ +///Enables verbose debugging and the debug overlay. NOTE: Debug Overlay does not report MultiZAS information at this time. //#define ZASDBG +///Enables multi-Z air movement. Zones do not merge across Z levels. #define MULTIZAS ///Air and zones freely mingle with this turf under the given conditions From 0233fb5571adc3b638f3f8968e3fe9d407e599cd Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 01:27:46 -0400 Subject: [PATCH 130/200] Disables SSairflow during unit tests. --- code/modules/unit_tests/unit_test.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 4359d2f1de0..71f5a2bf5a3 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -127,6 +127,8 @@ GLOBAL_LIST_EMPTY(unit_test_mapping_logs) qdel(test) /proc/RunUnitTests() + SSairflow.pause() //Look man, shit's whack. I don't trust airflow to not displace things when it shouldn't. + CHECK_TICK var/list/tests_to_run = subtypesof(/datum/unit_test) From a8697e94e1e19510c3accd9214752267d87befec Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:00:30 -0400 Subject: [PATCH 131/200] Fixes a critical bug, some more bugs, and comments --- code/__DEFINES/atmospherics/ZAS.dm | 53 +++++++++++++++------- code/game/turfs/open/_open.dm | 2 + code/game/turfs/open/floor/iron_floor.dm | 1 + code/game/turfs/open/ice.dm | 2 + code/game/turfs/open/openspace.dm | 1 + code/modules/atmospherics/ZAS/Fire.dm | 3 +- code/modules/atmospherics/ZAS/Turf.dm | 5 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 2 +- 8 files changed, 48 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 0aa8918112b..26498a2186e 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,8 +1,13 @@ ///Enables verbose debugging and the debug overlay. NOTE: Debug Overlay does not report MultiZAS information at this time. -//#define ZASDBG +#define ZASDBG + ///Enables multi-Z air movement. Zones do not merge across Z levels. #define MULTIZAS +#ifdef ZASDBG +#warn ZAS debugging tools are enabled. +#endif + ///Air and zones freely mingle with this turf under the given conditions #define AIR_ALLOWED (0<<0) ///Neither air nor zones can interact with this turf under the given conditions @@ -46,6 +51,7 @@ } \ } while(FALSE) +///Checks is a turf is simulated and has a valid zone. #define TURF_HAS_VALID_ZONE(T) (T.simulated && T.zone && !T.zone.invalid) #ifdef MULTIZAS @@ -95,7 +101,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) ret = AIR_BLOCKED|ZONE_BLOCKED; \ } \ } \ - if (ret == AIR_BLOCKED|ZONE_BLOCKED) { \ + if (ret & AIR_BLOCKED) { \ break;\ }\ }\ @@ -144,35 +150,50 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //#define ATMOS_CANPASS(A, O) ( A.can_atmos_pass == CANPASS_PROC ? A.zas_canpass(O) : ( A.can_atmos_pass == CANPASS_DENSITY? !A.density : A.can_atmos_pass)) #define ATMOS_CANPASS_NOTTURF(A) (A.can_atmos_pass == CANPASS_DENSITY ? !A.density : A.can_atmos_pass) -#define CELL_VOLUME 2500 // Liters in a cell. -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. - -#define O2STANDARD 0.21 // Percentage. +///The volume of a standard cell, in liters. 1 turf is 1 cell. +#define CELL_VOLUME 2500 +///Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) + +///The standard O2 percentage for livable atmos. +#define O2STANDARD 0.21 +///The standard N2 percentage for livable atmos. #define N2STANDARD 0.79 - -#define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible. +///The amount of moles in a standard cell (1 turf) when Plasma starts being visible. +#define MOLES_PHORON_VISIBLE 0.7 +///The standard molar content of Oxygen in a livible cell (turf). #define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%) +///The standard molar content of Nitrogen in a livible cell (turf). #define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%) + #define MOLES_O2ATMOS (MOLES_O2STANDARD*50) #define MOLES_N2ATMOS (MOLES_N2STANDARD*50) -// These are for when a mob breathes poisonous air. +///Minimum damage taken when inhaling an airborne toxin (UNUSED) #define MIN_TOXIN_DAMAGE 1 +///Maximum damage taken when inhaling an airborne toxin (UNUSED) #define MAX_TOXIN_DAMAGE 10 -#define STD_BREATH_VOLUME 12 // Liters in a normal breath. +/// Liters in a normal breath. (UNUSED) +#define STD_BREATH_VOLUME 12 -#define HUMAN_HEAT_CAPACITY 280000 //J/K For 80kg person +///The heat capacity of a meatbag (J/K For 80kg person). +#define HUMAN_HEAT_CAPACITY 280000 +///The minimum pressure for sound to be audible to a human #define SOUND_MINIMUM_PRESSURE 10 -#define PRESSURE_DAMAGE_COEFFICIENT 4 // The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE. +///The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE +#define PRESSURE_DAMAGE_COEFFICIENT 4 #define MAX_HIGH_PRESSURE_DAMAGE 4 // This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( #define LOW_PRESSURE_DAMAGE 0.6 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). -#define MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND (MINIMUM_AIR_TO_SUSPEND*R_IDEAL_GAS_EQUATION*T20C)/CELL_VOLUME // Minimum pressure difference between zones to suspend -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 // Minimum ratio of air that must move to/from a tile to suspend group processing -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Minimum amount of air that has to move before a group processing can be suspended +///If the pressure delta between two zones is below this value, they will not process. +#define MINIMUM_PRESSURE_DIFFERENCE_TO_SUSPEND (MINIMUM_AIR_TO_SUSPEND*R_IDEAL_GAS_EQUATION*T20C)/CELL_VOLUME +///Minimum ratio of air that must move to/from a tile to suspend group processing +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 +///Minimum amount of air that has to move before a group processing can be suspended +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) #define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Either this must be active #define MINIMUM_TEMPERATURE_TO_MOVE (T20C + 100) // or this (or both, obviously) @@ -230,8 +251,8 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define FLOWFRAC 0.99 // Fraction of gas transfered per process. //Flags for zone sleeping -#define ZONE_ACTIVE 1 #define ZONE_SLEEPING 0 +#define ZONE_ACTIVE 1 //OPEN TURF ATMOS /// the default air mix that open turfs spawn diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 9ed6fe05a38..185c457e323 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -2,11 +2,13 @@ plane = FLOOR_PLANE var/slowdown = 0 //negative for faster, positive for slower initial_gas = OPENTURF_DEFAULT_ATMOS + z_flags = Z_ATMOS_IN_UP|Z_ATMOS_OUT_UP var/footstep = null var/barefootstep = null var/clawfootstep = null var/heavyfootstep = null + //direction is direction of travel of A /turf/open/zPassIn(atom/movable/A, direction, turf/source) if(direction == DOWN) diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index af92db181a7..881efa922da 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -36,6 +36,7 @@ /turf/open/floor/iron/icemoon initial_gas = ICEMOON_DEFAULT_ATMOS temperature = 80 + /turf/open/floor/iron/edge icon_state = "floor_edge" base_icon_state = "floor_edge" diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index 0ec9348e4dd..c02c5712f2c 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -36,6 +36,8 @@ baseturfs = /turf/open/openspace/icemoon initial_gas = ICEMOON_DEFAULT_ATMOS slowdown = 0 + simulated = FALSE /turf/open/misc/ice/icemoon/no_planet_atmos + simulated = TRUE diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 2d1d0b25f30..e774eacfacd 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -172,6 +172,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr name = "ice chasm" baseturfs = /turf/open/openspace/icemoon initial_gas = ICEMOON_DEFAULT_ATMOS + simulated = FALSE var/replacement_turf = /turf/open/misc/asteroid/snow/icemoon /// Replaces itself with replacement_turf if the turf below this one is in a no ruins allowed area (usually ruins themselves) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 895dcf2784d..98c624883ed 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -449,7 +449,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD) apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST) - //apply_damage(2,0*mx*groin_exposure, BURN, BODY_ZONE_PRECISE_GROIN) apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG) apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG) apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM) @@ -480,7 +479,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin for(var/obj/structure/window/W in src) if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile) - W.fire_act(adj_air, adj_temp, adj_volume) + W.fire_act(adj_temp, adj_volume) /turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) burn(adj_temp) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index e710aea0bd9..068bc50b251 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -4,7 +4,7 @@ ///All directions in which a turf that can contain air is present. var/open_directions ///Can atmos pass down through this turf? - var/z_flags = Z_ATMOS_IN_UP|Z_ATMOS_OUT_UP + var/z_flags = NONE /turf ///Does this turf need to be ran through SSzas? (SSzas.mark_for_update(turf) OR turf.update_nearby_tiles()) @@ -257,8 +257,9 @@ zas_log("This turf tried to merge into itself! Current type: [src.type]") CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning - #endif + #else return //THIS BUG IS SMALL ENOUGH THAT IT IS FINE FOR NOW. I WILL FIX IT IN THE FUTURE. + #endif SSzas.connect(src, T) /turf/proc/post_update_air_properties() diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 51fd293b931..93576c89f9d 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -52,7 +52,7 @@ molar_mass = 0.405 // kg/mol tile_overlay = "plasma" - overlay_limit = 0.7 + overlay_limit = MOLES_PHORON_VISIBLE flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL breathed_product = /datum/reagent/toxin/plasma symbol_html = "Ph" From ec8c3b6d44d741dcc89f05335ac482ceb1ac4e70 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:01:02 -0400 Subject: [PATCH 132/200] Disables ZASDBG --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 26498a2186e..7dc9dca7034 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,5 +1,5 @@ ///Enables verbose debugging and the debug overlay. NOTE: Debug Overlay does not report MultiZAS information at this time. -#define ZASDBG +//#define ZASDBG ///Enables multi-Z air movement. Zones do not merge across Z levels. #define MULTIZAS From dec488edcef8642e2c02add57b7bf5150d8c44c2 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:41:39 -0400 Subject: [PATCH 133/200] more comments + another attempt to find this bug --- code/modules/atmospherics/ZAS/Airflow.dm | 43 +++++++++++++------ .../atmospherics/ZAS/ConnectionGroup.dm | 1 + .../environmental/LINDA_turf_tile.dm | 2 +- .../mapping/space_management/traits.dm | 6 +++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 7567fb63841..88dff6c3dcd 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -1,11 +1,27 @@ /* Contains helper procs for airflow, handled in /connection_group. +This entire system is an absolute mess. */ #define AIRBORNE_DAMAGE(airborne_thing) (min(airborne_thing.airflow_speed, (airborne_thing.airborne_acceleration*2)) * zas_settings.airflow_damage) -/mob/var/tmp/last_airflow_stun = 0 +/mob + var/tmp/last_airflow_stun = 0 + +/atom/movable + ///The location the atom is trying to step towards during airflow. + var/tmp/turf/airflow_dest + ///The speed the object is travelling during airflow + var/tmp/airflow_speed = 0 + ///Time (ticks) spent in airflow + var/tmp/airflow_time = 0 + ///Time (ticks) since last airflow movement + var/tmp/last_airflow = 0 + var/tmp/airborne_acceleration = 0 + +///Applies the effects of the mob colliding with another movable due to airflow. /mob/proc/airflow_stun() return + /mob/living/airflow_stun() if(stat == 2) return FALSE @@ -30,16 +46,19 @@ Contains helper procs for airflow, handled in /connection_group. /mob/living/simple_animal/slime/airflow_stun() return +///NEEDS IMPLIMENATION, SEE: LINDA_turf_tile.dm /atom/movable/proc/experience_pressure_difference() return +///Checks to see if airflow can move this movable. /atom/movable/proc/check_airflow_movable(n) + if(anchored && !ismob(src)) + return FALSE - if(anchored && !ismob(src)) return 0 - - if(!isobj(src) && n < zas_settings.airflow_dense_pressure) return 0 + if(!isobj(src) && n < zas_settings.airflow_dense_pressure) + return FALSE - return 1 + return TRUE /mob/check_airflow_movable(n) if(n < zas_settings.airflow_heavy_pressure) @@ -52,7 +71,8 @@ Contains helper procs for airflow, handled in /connection_group. return 0 /obj/check_airflow_movable(n) - if(n < zas_settings.airflow_dense_pressure) return 0 + if(n < zas_settings.airflow_dense_pressure) + return FALSE return ..() @@ -70,13 +90,7 @@ Contains helper procs for airflow, handled in /connection_group. if(n < zas_settings.airflow_dense_pressure) return 0 return ..() - -/atom/movable/var/tmp/turf/airflow_dest -/atom/movable/var/tmp/airflow_speed = 0 -/atom/movable/var/tmp/airflow_time = 0 -/atom/movable/var/tmp/last_airflow = 0 -/atom/movable/var/tmp/airborne_acceleration = 0 - +///Seemingly redundant, look to remove. /atom/movable/proc/AirflowCanMove(n) return 1 @@ -111,6 +125,7 @@ Contains helper procs for airflow, handled in /connection_group. airborne_acceleration = 0 . = ..() +///Called when src collides with A during airflow /atom/movable/proc/airflow_hit(atom/A) airflow_speed = 0 airflow_dest = null @@ -133,7 +148,7 @@ Contains helper procs for airflow, handled in /connection_group. loc.add_blood_DNA(return_blood_DNA()) return ..() - +///Called when "flying" calls airflow_hit() on src /atom/proc/airflow_hit_act(atom/movable/flying) src.visible_message( span_danger("A flying [flying.name] slams into \the [src]!"), diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 04d3518a912..0589a4c0434 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -141,6 +141,7 @@ Class Procs: M.airflow_dest = pick(close_turfs) //Pick a random midpoint to fly towards. + //Soul code im too scared to touch if(repelled) spawn if(M) M.RepelAirflowDest(differential/5) else spawn if(M) M.GotoAirflowDest(differential/10) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index e8e572644a8..8d24a5ed94c 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -374,7 +374,7 @@ /atom/movable ///How much delta pressure is needed for us to move - var///pressure_resistance = 10 + var/pressure_resistance = 10 var/last_high_pressure_movement_air_cycle = 0 /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index cd53a3632da..e6269a12009 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -51,6 +51,12 @@ /// Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) + ///Type mismatch of "list" at some point, I WILL FIND THIS BUG. + #ifdef UNIT_TESTS + ASSERT(istype(us)) + ASSERT(istype(them)) + #endif + if (!T) return var/offset = level_trait(T.z, ZTRAIT_DOWN) From 8ae400833b4a7c195e0d36874439a6157a74678b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:50:32 -0400 Subject: [PATCH 134/200] fixes an erroneous return value --- .../modules/mapping/space_management/multiz_helpers.dm | 6 ------ code/modules/mapping/space_management/traits.dm | 10 ++-------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 7e19114ed6f..4f9174e719f 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -8,12 +8,6 @@ return get_step(ref, dir) /proc/get_dir_multiz(turf/us, turf/them) - ///Type mismatch of "list" at some point, I WILL FIND THIS BUG. - #ifdef UNIT_TESTS - ASSERT(istype(us)) - ASSERT(istype(them)) - #endif - us = get_turf(us) them = get_turf(them) if(!us || !them) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index e6269a12009..db9a517139b 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -5,14 +5,14 @@ if (z_list) if (z > z_list.len) stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") - return list() + return FALSE var/datum/space_level/S = get_level(z) return S.traits[trait] else var/list/default = DEFAULT_MAP_TRAITS if (z > default.len) stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") - return list() + return FALSE return default[z][DL_TRAITS][trait] /// Check if levels[z] has any of the specified traits @@ -51,12 +51,6 @@ /// Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - ///Type mismatch of "list" at some point, I WILL FIND THIS BUG. - #ifdef UNIT_TESTS - ASSERT(istype(us)) - ASSERT(istype(them)) - #endif - if (!T) return var/offset = level_trait(T.z, ZTRAIT_DOWN) From 6bd953d5a13b4d9fd5b0a0feabd98b2eaa90d18b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:52:51 -0400 Subject: [PATCH 135/200] Prevents air from moving up/down in hyperspace --- code/game/turfs/open/space/transit.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 9e1e9643b26..a3a659c3070 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -5,6 +5,7 @@ baseturfs = /turf/open/space/transit flags_1 = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry. explosion_block = INFINITY + z_flags = NONE /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) . = ..() From 96bd9bbd26197214d3ad592e31d1e06341bae455 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 6 Jun 2022 17:56:18 -0400 Subject: [PATCH 136/200] Please don't break anything. Adds the Supermatter --- .../mistake_inevitable.dmm | 2 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/KiloStation/KiloStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 2 +- _maps/shuttles/emergency_supermatter.dmm | 4 +- code/__DEFINES/atmospherics/ZAS.dm | 4 +- code/controllers/subsystem/airflow.dm | 10 -- code/game/objects/effects/effects.dm | 3 - code/game/objects/items/RCD.dm | 2 +- code/game/objects/items/melee/misc.dm | 4 +- code/game/objects/structures/bonfire.dm | 4 +- .../turfs/open/floor/plating/misc_plating.dm | 1 - code/modules/atmospherics/ZAS/Airflow.dm | 93 +++++++------ .../atmospherics/ZAS/ConnectionGroup.dm | 2 + code/modules/atmospherics/ZAS/Diagnostic.dm | 5 +- code/modules/atmospherics/ZAS/Plasma.dm | 6 +- code/modules/atmospherics/ZAS/Turf.dm | 7 +- code/modules/atmospherics/ZAS/XGM/gases.dm | 9 ++ code/modules/atmospherics/ZAS/ZAS_Settings.dm | 2 +- .../atmospherics/ZAS/atmos_primitives.dm | 25 ++++ .../atmospherics/machinery/datum_pipeline.dm | 66 +++++++--- .../machinery/pipes/heat_exchange/he_pipes.dm | 13 +- .../machinery/portable/canister.dm | 6 +- code/modules/power/supermatter/supermatter.dm | 124 +++++++----------- .../power/supermatter/supermatter_process.dm | 71 +++++----- code/modules/projectiles/projectile.dm | 3 - code/modules/research/designs/misc_designs.dm | 2 +- code/modules/surgery/organs/lungs.dm | 18 +-- config/admins.txt | 2 + pariah.dme | 2 - 33 files changed, 279 insertions(+), 223 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index a2dfdbd7520..b8c4064a653 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -243,7 +243,7 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "yO" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /obj/structure/window/reinforced/plasma/spawner, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index fb261395aef..79c4ff94141 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -4771,7 +4771,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "mm" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /obj/structure/closet/crate/engineering{ name = "supermatter shard crate" }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 964842551b4..593e362a2d7 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -77256,7 +77256,7 @@ /turf/open/floor/iron, /area/medical/virology) "uqa" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer4, /turf/open/floor/engine, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 00726188a84..66d5f9bedc8 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -39924,7 +39924,7 @@ /turf/open/floor/iron/showroomfloor, /area/security/processing) "szM" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "szW" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 7beeee11f00..00ec48f95a1 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -47887,7 +47887,7 @@ /turf/open/floor/wood, /area/service/lawoffice) "lGe" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "lGj" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d8836c0b1dc..ff8cb0cb369 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -8961,7 +8961,7 @@ /turf/open/floor/iron, /area/hallway/primary/port) "ctk" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "ctm" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 37c7068b95f..e761e21cf3d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -42563,7 +42563,7 @@ /turf/open/floor/iron/white, /area/science/explab) "nSy" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "nSQ" = ( diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index c56aadb7554..d6e69b10923 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aB" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/plating, /area/shuttle/escape) "aD" = ( @@ -193,7 +193,7 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "aV" = ( -/obj/machinery/power/rtg/debug/station, +/obj/machinery/power/obj/machinery/power/supermatter_crystal, /turf/open/floor/plating/airless, /area/shuttle/escape) "aW" = ( diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 7dc9dca7034..4121a6d7411 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -12,7 +12,7 @@ #define AIR_ALLOWED (0<<0) ///Neither air nor zones can interact with this turf under the given conditions #define AIR_BLOCKED (1<<0) -///Air can pass through or into this turf, but zones may not merge with it. +///Air can pass through or into this turf, but zones may not merge with it. Will not block zone merges, if either zone is below ZONE_MIN_SIZE #define ZONE_BLOCKED (1<<1) ///Zones with less than this many turfs will always merge, even if the connection is not direct @@ -306,6 +306,8 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define GAS_SULFUR "sulfurdioxide" #define GAS_STEAM "water" #define GAS_PLASMA "plasma" +//TG GASES - PLAN TO REMOVE +#define GAS_PLUOXIUM "pluoxium" GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index b2b2b769182..5d2e11bd847 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -111,22 +111,12 @@ SUBSYSTEM_DEF(airflow) #undef CLEAR_OBJECT - -/atom/movable/var/tmp/airflow_xo -/atom/movable/var/tmp/airflow_yo -/atom/movable/var/tmp/airflow_originally_not_dense -/atom/movable/var/tmp/airflow_process_delay -/atom/movable/var/tmp/airflow_skip_speedcheck - - /atom/movable/proc/prepare_airflow(strength) if (!airflow_dest || airflow_speed < 0 || last_airflow > world.time - zas_settings.airflow_delay) return FALSE if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) return FALSE - if (!AirflowCanMove(strength)) - return FALSE if (airflow_dest == loc) step_away(src, loc) if (ismob(src)) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 3d084c917a2..01ab5d3e5ec 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -36,9 +36,6 @@ /obj/effect/attack_hulk(mob/living/carbon/human/user) return FALSE -/obj/effect/experience_pressure_difference() - return - /obj/effect/ex_act(severity, target) return FALSE diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index e91e9486b7e..5dc6b045242 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -1005,7 +1005,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) for(var/direction in GLOB.cardinals) var/turf/C = get_step(W, direction) var/list/dupes = checkdupes(C) - if((isspaceturf(C) || C.open_directions) && !dupes.len) + if((isspaceturf(C) || (get_step(src, 0).open_directions & direction)) && !dupes.len) candidates += C if(!candidates.len) to_chat(user, span_warning("Valid target not found...")) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 12a78e769d0..37dc275e1fb 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -295,7 +295,7 @@ var/mob/living/carbon/human/human_target = target human_target.drop_all_held_items() human_target.visible_message(span_danger("[user] disarms [human_target]!"), span_userdanger("[user] disarmed you!")) -/* + /obj/item/melee/roastingstick name = "advanced roasting stick" desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits." @@ -414,7 +414,7 @@ QDEL_NULL(beam) playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) to_chat(user, span_notice("You put [src] away.")) -*/ + /obj/item/melee/cleric_mace name = "cleric mace" diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 5acf553e299..43cfa1e1b1c 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -61,7 +61,7 @@ return ..() if(used_item.get_temperature()) start_burning() - /* + if(grill) if(istype(used_item, /obj/item/melee/roastingstick)) return FALSE @@ -76,7 +76,7 @@ used_item.pixel_x = used_item.base_pixel_x + clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) used_item.pixel_y = used_item.base_pixel_y + clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) else - return ..()*/ + return ..() return ..() diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index f4d3e60a5ae..fbe06d95201 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -45,7 +45,6 @@ icon_state = "snowplating" base_icon_state = "snowplating" temperature = 180 - temperature = 180 attachment_holes = FALSE footstep = FOOTSTEP_SAND diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 88dff6c3dcd..73050dd39c4 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -18,6 +18,13 @@ This entire system is an absolute mess. var/tmp/last_airflow = 0 var/tmp/airborne_acceleration = 0 + var/tmp/airflow_xo + var/tmp/airflow_yo + ///If the movable is dense by default, it won't step into tiles containing other dense objects + var/tmp/airflow_originally_not_dense + var/tmp/airflow_process_delay + var/tmp/airflow_skip_speedcheck + ///Applies the effects of the mob colliding with another movable due to airflow. /mob/proc/airflow_stun() return @@ -34,10 +41,16 @@ This entire system is an absolute mess. if(buckled) to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") return FALSE - if(!body_position == LYING_DOWN) - to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>") + if(body_position == LYING_DOWN) //Lying down protects you from Z A S M O M E N T S + return + + Knockdown(zas_settings.airflow_stun) + visible_message( + span_danger("[src] is thrown to the floor by a gust of air!"), + span_danger("A sudden rush of air knocks you over!"), + span_hear("You hear a gust of air, followed by a soft thud.") + ) - Knockdown(zas_settings.airflow_stun SECONDS) last_airflow_stun = world.time /mob/living/silicon/airflow_stun() @@ -46,34 +59,28 @@ This entire system is an absolute mess. /mob/living/simple_animal/slime/airflow_stun() return -///NEEDS IMPLIMENATION, SEE: LINDA_turf_tile.dm -/atom/movable/proc/experience_pressure_difference() - return - ///Checks to see if airflow can move this movable. /atom/movable/proc/check_airflow_movable(n) - if(anchored && !ismob(src)) - return FALSE - - if(!isobj(src) && n < zas_settings.airflow_dense_pressure) - return FALSE - + //We're just hoping nothing goes wrong return TRUE /mob/check_airflow_movable(n) + if(status_flags & GODMODE) + return FALSE if(n < zas_settings.airflow_heavy_pressure) return FALSE if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) //Magboots return FALSE - return TRUE + return ..() /mob/living/silicon/check_airflow_movable() return 0 /obj/check_airflow_movable(n) + if(anchored) + return FALSE if(n < zas_settings.airflow_dense_pressure) return FALSE - return ..() /obj/item/check_airflow_movable(n) @@ -90,20 +97,6 @@ This entire system is an absolute mess. if(n < zas_settings.airflow_dense_pressure) return 0 return ..() -///Seemingly redundant, look to remove. -/atom/movable/proc/AirflowCanMove(n) - return 1 - -/mob/AirflowCanMove(n) - if(status_flags & GODMODE) - return 0 - if(buckled) - return 0 - var/obj/item/clothing/shoes = get_item_by_slot(ITEM_SLOT_FEET) - if(istype(shoes) && (shoes.clothing_flags & NOSLIP)) - return 0 - return 1 - /atom/movable/Bump(atom/A) if(airflow_speed > 0 && airflow_dest) var/turf/T = get_turf(A) @@ -112,6 +105,12 @@ This entire system is an absolute mess. A.airflow_hit_act(src) else if(istype(src, /mob/living/carbon/human)) to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") + /* + If the turf of the atom we bumped is NOT dense, then we check if the flying object is dense. + We check the special var because flying objects gain density so they can Bump() objects. + If the object is NOT normally dense, we remove our density and the target's density, + enabling us to step into their turf. Then, we set the density back to the way its supposed to be for airflow. + */ if(!T.density) if(ismovable(A) && A:airflow_originally_not_dense) set_density(FALSE) @@ -134,30 +133,42 @@ This entire system is an absolute mess. /mob/living/airflow_hit(atom/A) var/b_loss = AIRBORNE_DAMAGE(src) apply_damage(b_loss, BRUTE) + return ..() + +/mob/living/carbon/airflow_hit(atom/A) if(istype(A, /obj/structure) || iswallturf(A)) if(airflow_speed > 10) Paralyze(round(airflow_speed * zas_settings.airflow_stun)) Stun(round(airflow_speed * zas_settings.airflow_stun) + 3) + loc.add_blood_DNA(return_blood_DNA()) + visible_message( + span_danger("[src] splats against \the [A]!"), + span_userdanger("You slam into \the [A] with tremendous force!"), + span_hear("You hear a loud thud.") + ) + INVOKE_ASYNC(emote("scream")) else Stun(round(airflow_speed * zas_settings.airflow_stun/2)) + visible_message( + span_danger("[src] slams into \the [A]!"), + span_userdanger("You're thrown against \the [A] by pressure!"), + span_hear("You hear a loud thud.") + ) return ..() -/mob/living/carbon/airflow_hit(atom/A) - if (prob(33)) - loc.add_blood_DNA(return_blood_DNA()) - return ..() - ///Called when "flying" calls airflow_hit() on src /atom/proc/airflow_hit_act(atom/movable/flying) + return + +/mob/living/airflow_hit_act(atom/movable/flying) + . = ..() src.visible_message( span_danger("A flying [flying.name] slams into \the [src]!"), span_danger("You're hit by a flying [flying]!"), - span_danger("You hear a loud slam!") + span_danger("You hear a soft thud.") ) -/mob/living/airflow_hit_act(atom/movable/flying) - . = ..() playsound(src.loc, "punch", 25, 1, -1) var/weak_amt if(istype(flying,/obj/item)) @@ -171,6 +182,13 @@ This entire system is an absolute mess. /obj/airflow_hit_act(atom/movable/flying) . = ..() + if(!flying.airflow_originally_not_dense) + src.visible_message( + span_danger("A flying [flying.name] slams into \the [src]!"), + null, + span_danger("You hear a loud slam!") + ) + playsound(src.loc, "smash.ogg", 25, 1, -1) if(!uses_integrity) @@ -180,6 +198,7 @@ This entire system is an absolute mess. /mob/living/carbon/human/airflow_hit_act(atom/movable/flying) . = ..() + if (prob(33)) loc.add_blood_DNA(return_blood_DNA()) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 0589a4c0434..f48bfccb9da 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -122,6 +122,8 @@ Class Procs: /connection_edge/proc/flow(list/movable, differential, repelled) for(var/i in 1 to length(movable)) var/atom/movable/M = movable[i] + //Non simulated objects dont get tossed + if(!M.simulated) continue //If they're already being tossed, don't do it again. if(M.last_airflow > world.time - zas_settings.airflow_delay) continue diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index 12b1198674a..ca0d4543ebe 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -6,9 +6,12 @@ else to_chat(mob, span_admin("ZASDBG: No zone here.")) var/datum/gas_mixture/mix = T.return_air() - to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.returnPressure()] kPa [mix.temperature]C")) + to_chat(mob,span_admin( "ZASDBG_MAIN: [mix.returnPressure()] kPa [mix.temperature] k")) for(var/g in mix.gas) to_chat(mob, span_admin("ZASDBG_GAS: [g]: [mix.gas[g]]\n")) + + if((T.zone && (length(T.zone.contents) > ZONE_MIN_SIZE))) + to_chat(mob, span_notice("This turf's zone is below the minimum size, and will merge over zone blockers.")) else if(zone_debug_images) for(var/zone in zone_debug_images) diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index faa22877f91..a1f1e623b1d 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -5,9 +5,9 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi var/plasma_dmg_name = "Plasma Damage Amount" var/plasma_dmg_desc = "Self Descriptive" - var/cloth_contamination = TRUE - var/cloth_contamination_name = "Cloth Contamination" - var/cloth_contamination_desc = "If this is on, phoron does damage by getting into cloth." + var/cloth_contamination = FALSE + var/cloth_contamination_name = "Phoron Contamination" + var/cloth_contamination_desc = "If this is on, phoron can contiminate items." var/plasmaguard_only = FALSE var/plamaguard_only_name = "\"PlasmaGuard Only\"" diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 068bc50b251..aaa2836b0e2 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -11,7 +11,7 @@ var/needs_air_update = 0 ///The local gas mixture of this turf. Use return_air(). This will always exist even if not in use, because GCing air contents would be too expensive. var/datum/gas_mixture/air - var/heat_capacity = 1 + var/heat_capacity = INFINITY var/thermal_conductivity = 0.05 ///A gas_mixture gas list to be used as the initial value. Ex: list(GAS_OXYGEN = 50) var/list/initial_gas @@ -37,6 +37,9 @@ #endif return TRUE + ///EXPERIMENTAL + open_directions = NONE + #ifdef MULTIZAS for(var/d = 1, d < 64, d *= 2) #else @@ -61,6 +64,8 @@ #endif continue + open_directions |= d + if(target.simulated) if(TURF_HAS_VALID_ZONE(target)) SSzas.connect(target, src) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 93576c89f9d..84639c85774 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -255,3 +255,12 @@ breathed_product = /datum/reagent/carbon_monoxide symbol_html = "CO" symbol = "CO" + +/datum/xgm_gas/pluoxium + id = GAS_PLUOXIUM + name = "Pluoxium" + specific_heat = 80 + molar_mass = 0.002 //Yeah idk, its some kind of super gas or something + base_value = 5 + symbol_html = "Pl" + symbol = "Pl" diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm index f7f6a08d42c..f9975f0a122 100644 --- a/code/modules/atmospherics/ZAS/ZAS_Settings.dm +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -46,7 +46,7 @@ var/airflow_stun_cooldown_NAME = "Aiflow Stunning - Cooldown" var/airflow_stun_cooldown_DESC = "How long, in tenths of a second, to wait before stunning them again." - var/airflow_stun = 1 + var/airflow_stun = 1 SECONDS var/airflow_stun_NAME = "Airflow Impact - Stunning" var/airflow_stun_DESC = "How much a mob is stunned when hit by an object." diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index b370be78301..2ca321410a4 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -502,6 +502,31 @@ else return status.len +//surface must be the surface area in m^2 +/proc/radiate_heat_to_space(datum/gas_mixture/air, surface, thermal_conductivity) + var/gas_density = air.total_moles/air.volume + thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio + + var/heat_gain = get_thermal_radiation(air.temperature, surface, RADIATOR_EXPOSED_SURFACE_AREA_RATIO, thermal_conductivity) + + air.addThermalEnergy(heat_gain) + +//Returns the amount of heat gained while in space due to thermal radiation (usually a negative value) +//surface - the surface area in m^2 +//exposed_surface_ratio - the proportion of the surface that is exposed to sunlight +//thermal_conductivity - a multipler on the heat transfer rate. See OPEN_HEAT_TRANSFER_COEFFICIENT and friends +/proc/get_thermal_radiation(var/surface_temperature, var/surface, var/exposed_surface_ratio, var/thermal_conductivity) + //*** Gain heat from sunlight, then lose heat from radiation. + + // We only get heat from the star on the exposed surface area. + // If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase. + . = AVERAGE_SOLAR_RADIATION * (exposed_surface_ratio * surface) * thermal_conductivity + + // Previously, the temperature would enter equilibrium at 26C or 294K. + // Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on. + // It currently should stabilise at 129.6K or -143.6C + . -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (surface_temperature - COSMIC_RADIATION_TEMPERATURE) ** 4 + #undef MINIMUM_MOLES_TO_PUMP #undef MINIMUM_MOLES_TO_FILTER #undef ATMOS_PUMP_EFFICIENCY diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index e9ea7937732..0db1d72042d 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -188,29 +188,61 @@ /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) var/total_heat_capacity = air.getHeatCapacity() - var/partial_heat_capacity = total_heat_capacity * (share_volume / air.volume) - var/target_temperature - var/target_heat_capacity + var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) + if(target.simulated) + var/turf/modeled_location = target - var/turf/modeled_location = target - target_temperature = modeled_location.return_temperature() - target_heat_capacity = modeled_location.GetHeatCapacity() + if(modeled_location.blocks_air) - var/delta_temperature = air.temperature - target_temperature - var/sharer_heat_capacity = target_heat_capacity + if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - modeled_location.temperature - if((sharer_heat_capacity <= 0) || (partial_heat_capacity <= 0)) - return TRUE - var/heat = thermal_conductivity * delta_temperature * (partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) - var/self_temperature_delta = - heat / total_heat_capacity - var/sharer_temperature_delta = heat / sharer_heat_capacity + air.temperature -= heat/total_heat_capacity + modeled_location.temperature += heat/modeled_location.heat_capacity - air.temperature += self_temperature_delta - modeled_location.TakeTemperature(sharer_temperature_delta) - /*if(modeled_location.blocks_air & AIR_BLOCKED) - modeled_location.temperature_expose(air, modeled_location.temperature)*/ + else + var/delta_temperature = 0 + var/sharer_heat_capacity = 0 + + if(modeled_location.zone) + delta_temperature = (air.temperature - modeled_location.zone.air.temperature) + sharer_heat_capacity = modeled_location.zone.air.getHeatCapacity() + else + delta_temperature = (air.temperature - modeled_location.air.temperature) + sharer_heat_capacity = modeled_location.air.getHeatCapacity() + + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 + + if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + + self_temperature_delta = -heat/total_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity + else + return 1 + + air.temperature += self_temperature_delta + + if(modeled_location.zone) + modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier + else + modeled_location.air.temperature += sharer_temperature_delta + + + else + if((target.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - target.temperature + + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + + air.temperature -= heat/total_heat_capacity update = TRUE diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index ac0ac32ae1c..04369c32521 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -23,7 +23,11 @@ var/datum/gas_mixture/pipe_air = return_air() var/turf/local_turf = loc - if(istype(local_turf)) + if(!istype(local_turf)) + CRASH("Processing HE pipe not in a") + if(isspaceturf(local_turf)) + radiate_heat_to_space(pipe_air, 2, 1) //the magic "2" is the surface area in square meters. + else if(islava(local_turf)) environment_temperature = 5000 //Yuck else if(local_turf.blocks_air) @@ -31,10 +35,9 @@ else var/turf/open/open_local = local_turf environment_temperature = open_local.return_temperature() - else - environment_temperature = local_turf.temperature - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(local_turf, volume, thermal_conductivity) + + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(local_turf, volume, thermal_conductivity) //heatup/cooldown any mobs buckled to ourselves based on our temperature diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c4d6cef1498..c96ad8f415c 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -233,13 +233,13 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) gas_type = GAS_OXYGEN greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#2786e5#e8fefe" -/* + /obj/machinery/portable_atmospherics/canister/pluoxium name = "Pluoxium canister" - gas_type = /datum/gas/pluoxium + gas_type = GAS_PLUOXIUM greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#2786e5" - +/* /obj/machinery/portable_atmospherics/canister/proto_nitrate name = "Proto Nitrate canister" gas_type = /datum/gas/proto_nitrate diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a3622673254..3f6fff19940 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -69,90 +69,58 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/gas_change_rate = 0.05 ///The list of gases we will be interacting with in process_atoms() var/list/gases_we_care_about = list( - /datum/gas/oxygen, - /datum/gas/water_vapor, - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrous_oxide, - /datum/gas/nitrogen, - /datum/gas/pluoxium, - /datum/gas/tritium, - /datum/gas/bz, - /datum/gas/freon, - /datum/gas/hydrogen, - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/zauker, - /datum/gas/miasma + GAS_OXYGEN, + GAS_PLASMA, + GAS_CO2, + GAS_N2O, + GAS_NITROGEN, + GAS_TRITIUM, + GAS_HYDROGEN, + GAS_STEAM, ) ///The list of gases mapped against their current comp. We use this to calculate different values the supermatter uses, like power or heat resistance. It doesn't perfectly match the air around the sm, instead moving up at a rate determined by gas_change_rate per call. Ranges from 0 to 1 var/list/gas_comp = list( - /datum/gas/oxygen = 0, - /datum/gas/water_vapor = 0, - /datum/gas/plasma = 0, - /datum/gas/carbon_dioxide = 0, - /datum/gas/nitrous_oxide = 0, - /datum/gas/nitrogen = 0, - /datum/gas/pluoxium = 0, - /datum/gas/tritium = 0, - /datum/gas/bz = 0, - /datum/gas/freon = 0, - /datum/gas/hydrogen = 0, - /datum/gas/healium = 0, - /datum/gas/proto_nitrate = 0, - /datum/gas/zauker = 0, + GAS_OXYGEN = 0, + GAS_PLASMA = 0, + GAS_CO2 = 0, + GAS_N2O = 0, + GAS_NITROGEN = 0, + GAS_TRITIUM = 0, + GAS_HYDROGEN = 0, + GAS_STEAM = 0, ) ///The list of gases mapped against their transmit values. We use it to determine the effect different gases have on the zaps var/list/gas_trans = list( - /datum/gas/oxygen = OXYGEN_TRANSMIT_MODIFIER, - /datum/gas/water_vapor = H2O_TRANSMIT_MODIFIER, - /datum/gas/plasma = PLASMA_TRANSMIT_MODIFIER, - /datum/gas/pluoxium = PLUOXIUM_TRANSMIT_MODIFIER, - /datum/gas/tritium = TRITIUM_TRANSMIT_MODIFIER, - /datum/gas/bz = BZ_TRANSMIT_MODIFIER, - /datum/gas/hydrogen = HYDROGEN_TRANSMIT_MODIFIER, - /datum/gas/healium = HEALIUM_TRANSMIT_MODIFIER, - /datum/gas/proto_nitrate = PROTO_NITRATE_TRANSMIT_MODIFIER, - /datum/gas/zauker = ZAUKER_TRANSMIT_MODIFIER, + GAS_OXYGEN = OXYGEN_TRANSMIT_MODIFIER, + GAS_PLASMA = PLASMA_TRANSMIT_MODIFIER, + GAS_TRITIUM = TRITIUM_TRANSMIT_MODIFIER, + GAS_HYDROGEN = HYDROGEN_TRANSMIT_MODIFIER, + GAS_STEAM = H2O_TRANSMIT_MODIFIER, ) ///The list of gases mapped against their heat penaltys. We use it to determin molar and heat output var/list/gas_heat = list( - /datum/gas/oxygen = OXYGEN_HEAT_PENALTY, - /datum/gas/water_vapor = H2O_HEAT_PENALTY, - /datum/gas/plasma = PLASMA_HEAT_PENALTY, - /datum/gas/carbon_dioxide = CO2_HEAT_PENALTY, - /datum/gas/nitrogen = NITROGEN_HEAT_PENALTY, - /datum/gas/pluoxium = PLUOXIUM_HEAT_PENALTY, - /datum/gas/tritium = TRITIUM_HEAT_PENALTY, - /datum/gas/bz = BZ_HEAT_PENALTY, - /datum/gas/freon = FREON_HEAT_PENALTY, - /datum/gas/hydrogen = HYDROGEN_HEAT_PENALTY, - /datum/gas/healium = HEALIUM_HEAT_PENALTY, - /datum/gas/proto_nitrate = PROTO_NITRATE_HEAT_PENALTY, - /datum/gas/zauker = ZAUKER_HEAT_PENALTY, + GAS_OXYGEN = OXYGEN_HEAT_PENALTY, + GAS_PLASMA = PLASMA_HEAT_PENALTY, + GAS_CO2 = CO2_HEAT_PENALTY, + GAS_NITROGEN = NITROGEN_HEAT_PENALTY, + GAS_TRITIUM = TRITIUM_HEAT_PENALTY, + GAS_HYDROGEN = HYDROGEN_HEAT_PENALTY, + GAS_STEAM = H2O_HEAT_PENALTY, ) ///The list of gases mapped against their heat resistance. We use it to moderate heat damage. var/list/gas_resist = list( - /datum/gas/nitrous_oxide = N2O_HEAT_RESISTANCE, - /datum/gas/hydrogen = HYDROGEN_HEAT_RESISTANCE, - /datum/gas/proto_nitrate = PROTO_NITRATE_HEAT_RESISTANCE, + GAS_N2O = N2O_HEAT_RESISTANCE, + GAS_HYDROGEN = HYDROGEN_HEAT_RESISTANCE, ) ///The list of gases mapped against their powermix ratio var/list/gas_powermix = list( - /datum/gas/oxygen = 1, - /datum/gas/water_vapor = 1, - /datum/gas/plasma = 1, - /datum/gas/carbon_dioxide = 1, - /datum/gas/nitrogen = -1, - /datum/gas/pluoxium = -1, - /datum/gas/tritium = 1, - /datum/gas/bz = 1, - /datum/gas/freon = -1, - /datum/gas/hydrogen = 1, - /datum/gas/healium = 1, - /datum/gas/proto_nitrate = 1, - /datum/gas/zauker = 1, - /datum/gas/miasma = 0.5, + GAS_OXYGEN = 1, + GAS_STEAM = 1, + GAS_PLASMA = 1, + GAS_CO2 = 1, + GAS_NITROGEN = -1, + GAS_TRITIUM = 1, + GAS_HYDROGEN = 1, ) ///The last air sample's total molar count, will always be above or equal to 0 var/combined_gas = 0 @@ -254,7 +222,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() uid = gl_uid++ - SSair.start_processing_machine(src) + SSairmachines.start_processing_machine(src) countdown = new(src) countdown.start() SSpoints_of_interest.make_point_of_interest(src) @@ -288,7 +256,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Destroy() investigate_log("has been destroyed.", INVESTIGATE_ENGINE) - SSair.stop_processing_machine(src) + SSairmachines.stop_processing_machine(src) QDEL_NULL(radio) QDEL_NULL(countdown) if(is_main_engine && GLOB.main_supermatter_engine == src) @@ -340,17 +308,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/gasdata = list() - if(air.get_moles()) - data["SM_moles"] = air.get_moles() - for(var/gasid in air.gases) + if(air.total_moles) + data["SM_moles"] = air.total_moles + for(var/gasid in air.gas) gasdata.Add(list(list( - "name"= air.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = round(100*air.gases[gasid][MOLES]/air.get_moles(),0.01)))) + "name"= xgm_gas_data.name[air.gas[gasid]], + "amount" = round(100*air.gas[gasid]/air.total_moles,0.01)))) else - for(var/gasid in air.gases) + for(var/gasid in air.gas) gasdata.Add(list(list( - "name"= air.gases[gasid][GAS_META][META_GAS_NAME], + "name"= xgm_gas_data.name[air.gas[gasid]], "amount" = 0))) data["gases"] = gasdata diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index d343f452258..1c273d6e643 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -22,7 +22,7 @@ var/datum/gas_mixture/removed if(produces_gas) //Remove gas from surrounding area - removed = env.remove(gasefficency * env.get_moles()) + removed = env.remove(gasefficency * env.total_moles) else // Pass all the gas related code an empty gas container removed = new() @@ -35,21 +35,19 @@ else psy_overlay = FALSE damage_archived = damage - if(!removed || !removed.get_moles() || isspaceturf(local_turf)) //we're in space or there is no gas to process + if(!removed || !removed.total_moles || isspaceturf(local_turf)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage - if(!istype(env, /datum/gas_mixture/immutable) && produces_gas && power) //There is no gas to process, but we are not in a space turf. Lets make them. + if(local_turf.simulated && produces_gas && power) //There is no gas to process, but we are not in a space turf. Lets make them. //Power * 0.55 * a value between 1 and 0.8 var/device_energy = power * REACTION_POWER_MODIFIER * (1 - (psyCoeff * 0.2)) //Can't do stuff if it's null, so lets make a new gasmix. removed = new() //Since there is no gas to process, we will produce as if heat penalty is 1 and temperature at TCMB. - removed.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) removed.temperature = ((device_energy) / THERMAL_RELEASE_MODIFIER) removed.temperature = max(TCMB, min(removed.temperature, 2500)) - removed.gases[/datum/gas/plasma][MOLES] = max((device_energy) / PLASMA_RELEASE_MODIFIER, 0) - removed.gases[/datum/gas/oxygen][MOLES] = max(((device_energy + TCMB) - T0C) / OXYGEN_RELEASE_MODIFIER, 0) - removed.garbage_collect() + removed.adjustGas(GAS_PLASMA, max((device_energy) / PLASMA_RELEASE_MODIFIER, 0), FALSE) //Don't update just yet + removed.adjustGas(GAS_OXYGEN, max(((device_energy + TCMB) - T0C) / OXYGEN_RELEASE_MODIFIER, 0), TRUE) //Now we update the mixture env.merge(removed) //air_update_turf(FALSE, FALSE) else @@ -59,14 +57,21 @@ //registers the current enviromental gases in the various lists and vars setup_lists(removed) + AIR_UPDATE_VALUES(removed) //some gases can have special interactions special_gases_interactions(env, removed) + AIR_UPDATE_VALUES(removed) + AIR_UPDATE_VALUES(env) //main power calculations proc power_calculations(env, removed) + AIR_UPDATE_VALUES(removed) + AIR_UPDATE_VALUES(env) //irradiate at this point emit_radiation() //handles temperature increase and gases made by the crystal temperature_gas_production(env, removed) + AIR_UPDATE_VALUES(removed) + AIR_UPDATE_VALUES(env) //handles hallucinations and the presence of a psychiatrist psychological_examination() @@ -127,7 +132,7 @@ //Check for holes in the SM inner chamber for(var/turf/open/space/turf_to_check in RANGE_TURFS(1, loc)) - if(LAZYLEN(turf_to_check.atmos_adjacent_turfs)) + if(LAZYLEN(turf_to_check.get_atmos_adjacent_turfs())) var/integrity = get_integrity_percent() if(integrity < 10) damage += clamp((power * 0.0005) * DAMAGE_INCREASE_MULTIPLIER, 0, MAX_SPACE_EXPOSURE_DAMAGE) @@ -145,10 +150,6 @@ damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage) /obj/machinery/power/supermatter_crystal/proc/setup_lists(datum/gas_mixture/removed) - - for(var/gas_id in gases_we_care_about) - removed.assert_gas(gas_id) - //calculating gas related values //Wanna know a secret? See that max() to zero? it's used for error checking. If we get a mol count in the negative, we'll get a divide by zero error //Old me, you're insane combined_gas = max(removed.get_moles(), 0) @@ -159,14 +160,14 @@ //Lets get the proportions of the gasses in the mix for scaling stuff later //They range between 0 and 1 for(var/gas_id in gases_we_care_about) - gas_comp[gas_id] = clamp(removed.gases[gas_id][MOLES] / combined_gas, 0, 1) + gas_comp[gas_id] = clamp(removed.gas[gas_id] / combined_gas, 0, 1) var/list/heat_mod = gases_we_care_about.Copy() var/list/transit_mod = gases_we_care_about.Copy() var/list/resistance_mod = gases_we_care_about.Copy() - var/h2obonus = 1 - (gas_comp[/datum/gas/water_vapor] * 0.25)//At max this value should be 0.75 - freonbonus = (gas_comp[/datum/gas/freon] <= 0.03) //Let's just yeet power output if this shit is high + var/h2obonus = 1 - (gas_comp[GAS_STEAM] * 0.25)//At max this value should be 0.75 + //freonbonus = (gas_comp[/datum/gas/freon] <= 0.03) //Let's just yeet power output if this shit is high //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer @@ -196,30 +197,33 @@ /obj/machinery/power/supermatter_crystal/proc/special_gases_interactions(datum/gas_mixture/env, datum/gas_mixture/removed) //Miasma is really just microscopic particulate. It gets consumed like anything else that touches the crystal. - if(gas_comp[/datum/gas/miasma]) + /*if(gas_comp[/datum/gas/miasma]) var/miasma_pp = env.returnPressure() * gas_comp[/datum/gas/miasma] var/consumed_miasma = clamp(((miasma_pp - MIASMA_CONSUMPTION_PP) / (miasma_pp + MIASMA_PRESSURE_SCALING)) * (1 + (gasmix_power_ratio * MIASMA_GASMIX_SCALING)), MIASMA_CONSUMPTION_RATIO_MIN, MIASMA_CONSUMPTION_RATIO_MAX) consumed_miasma *= gas_comp[/datum/gas/miasma] * combined_gas if(consumed_miasma) removed.gases[/datum/gas/miasma][MOLES] -= consumed_miasma matter_power += consumed_miasma * MIASMA_POWER_GAIN + */ //Let's say that the CO2 touches the SM surface and the radiation turns it into Pluoxium. - if(gas_comp[/datum/gas/carbon_dioxide] && gas_comp[/datum/gas/oxygen]) - var/carbon_dioxide_pp = env.returnPressure() * gas_comp[/datum/gas/carbon_dioxide] + if(gas_comp[GAS_CO2] && gas_comp[GAS_OXYGEN]) + var/carbon_dioxide_pp = env.returnPressure() * gas_comp[GAS_CO2] var/consumed_carbon_dioxide = clamp(((carbon_dioxide_pp - CO2_CONSUMPTION_PP) / (carbon_dioxide_pp + CO2_PRESSURE_SCALING)), CO2_CONSUMPTION_RATIO_MIN, CO2_CONSUMPTION_RATIO_MAX) - consumed_carbon_dioxide = min(consumed_carbon_dioxide * gas_comp[/datum/gas/carbon_dioxide] * combined_gas, removed.gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(0.5), removed.gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5)) + consumed_carbon_dioxide = min(consumed_carbon_dioxide * gas_comp[GAS_CO2] * combined_gas, removed.gas[GAS_CO2] * INVERSE(0.5), removed.gas[GAS_OXYGEN] * INVERSE(0.5)) if(consumed_carbon_dioxide) - removed.gases[/datum/gas/carbon_dioxide][MOLES] -= consumed_carbon_dioxide * 0.5 - removed.gases[/datum/gas/oxygen][MOLES] -= consumed_carbon_dioxide * 0.5 - removed.gases[/datum/gas/pluoxium][MOLES] += consumed_carbon_dioxide * 0.25 + removed.adjustGas(GAS_CO2, -consumed_carbon_dioxide * 0.5, FALSE) + removed.adjustGas(GAS_OXYGEN, -consumed_carbon_dioxide * 0.5, FALSE) + removed.adjustGas(GAS_PLUOXIUM, consumed_carbon_dioxide * 0.25, FALSE) - if(prob(gas_comp[/datum/gas/zauker])) + /*if(prob(gas_comp[/datum/gas/zauker])) playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) supermatter_zap(src, 6, clamp(power * 2, 4000, 20000), ZAP_MOB_STUN, zap_cutoff = src.zap_cutoff, power_level = power, zap_icon = src.zap_icon) + */ - if(gas_comp[/datum/gas/bz] >= 0.4 && prob(30 * gas_comp[/datum/gas/bz])) + /*if(gas_comp[/datum/gas/bz] >= 0.4 && prob(30 * gas_comp[/datum/gas/bz])) fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick + */ /obj/machinery/power/supermatter_crystal/proc/power_calculations(datum/gas_mixture/env, datum/gas_mixture/removed) @@ -229,8 +233,8 @@ //Ramps up or down in increments of 0.02 up to the proportion of co2 //Given infinite time, powerloss_dynamic_scaling = co2comp //Some value between 0 and 1 - if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && gas_comp[/datum/gas/carbon_dioxide] > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 - powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(gas_comp[/datum/gas/carbon_dioxide] - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && gas_comp[GAS_CO2] > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(gas_comp[GAS_CO2] - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05, 0, 1) //Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) @@ -264,9 +268,10 @@ if(power && (last_power_zap + 4 SECONDS - (power * 0.001)) < world.time) //(1 + (tritRad + pluoxDampen * bzDampen * o2Rad * plasmaRad / (10 - bzrads))) * freonbonus playsound(src, 'sound/weapons/emitter2.ogg', 70, TRUE) - var/power_multiplier = max(0, (1 + (power_transmission_bonus / (10 - (gas_comp[/datum/gas/bz] * BZ_RADIOACTIVITY_MODIFIER)))) * freonbonus)// RadModBZ(500%) + //var/power_multiplier = max(0, (1 + (power_transmission_bonus / (10 - (gas_comp[/datum/gas/bz] * BZ_RADIOACTIVITY_MODIFIER)))) * freonbonus)// RadModBZ(500%) + var/power_multiplier = max(0, (1 + (power_transmission_bonus / 10))) var/pressure_multiplier = max((1 / ((env.returnPressure() ** pressure_bonus_curve_angle) + 1) * pressure_bonus_derived_steepness) + pressure_bonus_derived_constant, 1) - var/co2_power_increase = max(gas_comp[/datum/gas/carbon_dioxide] * 2, 1) + var/co2_power_increase = max(gas_comp[GAS_CO2] * 2, 1) supermatter_zap( zapstart = src, range = 3, @@ -295,12 +300,12 @@ //Calculate how much gas to release //Varies based on power and gas content - removed.gases[/datum/gas/plasma][MOLES] += max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0) + removed.adjustGas(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0), FALSE) //Varies based on power, gas content, and heat - removed.gases[/datum/gas/oxygen][MOLES] += max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0) + removed.adjustGas(GAS_OXYGEN, max(((device_energy + removed.temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0), FALSE) if(produces_gas) - removed.garbage_collect() + AIR_UPDATE_VALUES(removed) //This might be a waste env.merge(removed) //air_update_turf(FALSE, FALSE) @@ -334,9 +339,9 @@ return var/range = 4 zap_cutoff = 1500 - if(removed && removed.returnPressure() > 0 && removed.get_temperature() > 0) + if(removed && removed.returnPressure() > 0 && removed.temperature > 0) //You may be able to freeze the zapstate of the engine with good planning, we'll see - zap_cutoff = clamp(3000 - (power * (removed.get_moles()) / 10) / removed.get_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(3000 - (power * (removed.total_moles) / 10) / removed.temperature, 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details range = clamp(power / removed.returnPressure() * 10, 2, 7) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4c033de1cd5..58f6ad6b352 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1020,9 +1020,6 @@ if(cleanup) cleanup_beam_segments() -/obj/projectile/experience_pressure_difference() - return - ///Like [/obj/item/proc/updateEmbedding] but for projectiles instead, call this when you want to add embedding or update the stats on the embedding element /obj/projectile/proc/updateEmbedding() if(!shrapnel_type || !LAZYLEN(embedding)) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 6b31f2247e2..89a9280a677 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -233,7 +233,7 @@ id = "roastingstick" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) - //build_path = /obj/item/melee/roastingstick + build_path = /obj/item/melee/roastingstick category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 8ccf4824e59..ac392239b8d 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -115,19 +115,19 @@ var/gas_breathed = 0 - //var/list/breath_gases = breath.gases + var/list/breath_gases = breath.gas //Handle subtypes' breath processing handle_gas_override(breather, breath, gas_breathed) - //Partial pressures in our breath - var/O2_moles = breath.gas[GAS_OXYGEN] - var/N2_moles = breath.gas[GAS_NITROGEN] - var/plasma_moles = breath.gas[GAS_PLASMA] - var/CO2_moles = breath.gas[GAS_CO2] - var/SA_moles = breath.gas[GAS_N2O] - + //Molar count cache of our key gases + var/O2_moles = breath_gases[GAS_OXYGEN] + var/N2_moles = breath_gases[GAS_NITROGEN] + var/plasma_moles = breath_gases[GAS_PLASMA] + var/CO2_moles = breath_gases[GAS_CO2] + var/SA_moles = breath_gases[GAS_N2O] - var/O2_pp = breath.getBreathPartialPressure(O2_moles)//+(8*breath.getBreathPartialPressure(breath_gases[/datum/gas/pluoxium][MOLES])) + //Partial pressures in our breath + var/O2_pp = breath.getBreathPartialPressure(O2_moles) / max(1, (8 * breath.getBreathPartialPressure(breath_gases[GAS_PLUOXIUM]))) var/N2_pp = breath.getBreathPartialPressure(N2_moles) var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) diff --git a/config/admins.txt b/config/admins.txt index 9a6f0eb28a2..5f7377aa202 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -5,3 +5,5 @@ #If SQL-based admin loading is enabled, admins listed here will always be loaded first and will override any duplicate entries in the database. Octus = Host +Francinum = Host +Gonenoculer5 = Host \ No newline at end of file diff --git a/pariah.dme b/pariah.dme index b9214af28a5..88a04ea60b7 100644 --- a/pariah.dme +++ b/pariah.dme @@ -3793,13 +3793,11 @@ #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\narsie.dm" #include "code\modules\power\singularity\singularity.dm" -/* #include "code\modules\power\supermatter\supermatter.dm" #include "code\modules\power\supermatter\supermatter_delamination.dm" #include "code\modules\power\supermatter\supermatter_hit_procs.dm" #include "code\modules\power\supermatter\supermatter_process.dm" #include "code\modules\power\supermatter\supermatter_radiation.dm" -*/ #include "code\modules\power\tesla\coil.dm" #include "code\modules\power\tesla\energy_ball.dm" /* From 02d2c6045c5fa157ad14eb6087e5839f74b9b58e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 6 Jun 2022 18:47:49 -0400 Subject: [PATCH 137/200] Hibernating scrubbers now appear as off --- code/modules/atmospherics/ZAS/Fire.dm | 5 +++-- .../machinery/components/unary_devices/vent_scrubber.dm | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 98c624883ed..46fb1b18a3f 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -482,8 +482,9 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin W.fire_act(adj_temp, adj_volume) /turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - burn(adj_temp) - if(adj_temp > heat_capacity) + if(!uses_integrity) + burn(adj_temp) + else if (adj_temp > heat_capacity) take_damage(log(Frand(0.9, 1.1) * (adj_temp - heat_capacity)), BURN) return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index ed2b2fc3b6b..c3191132c5a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -137,7 +137,7 @@ icon_state = "scrub_welded" return - if(!nodes[1] || !on || !is_operational) + if(!nodes[1] || !on || !is_operational || !COOLDOWN_FINISHED(src, hibernating)) icon_state = "scrub_off" return @@ -205,8 +205,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() if(welded || !is_operational) return -// if(!COOLDOWN_FINISHED(src, hibernating)) -// return if(!on || !nodes[1]) on = FALSE return @@ -224,6 +222,7 @@ should_cooldown = FALSE if(should_cooldown) COOLDOWN_START(src, hibernating, 15 SECONDS) + update_icon_nopipes() return TRUE @@ -261,6 +260,7 @@ //Remix the resulting gases air_contents.merge(filtered_out) update_parents() + return TRUE else //Just siphoning all air @@ -384,6 +384,8 @@ . = ..() if(welded) . += "It seems welded shut." + if(!COOLDOWN_FINISHED(src, hibernating)) + . += span_notice("It is sleeping to conserve power.") /obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user, list/modifiers) if(!welded || !(do_after(user, 20, target = src))) From 389b1ebf8c5ef954dd532c8e87cdcf5879ef987c Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 6 Jun 2022 18:58:35 -0400 Subject: [PATCH 138/200] Whoops. Forgot to stage the N2 tank changes. --- code/game/objects/items/tanks/n2_tanks.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/tanks/n2_tanks.dm b/code/game/objects/items/tanks/n2_tanks.dm index b2dccb11363..bd6108c7a47 100644 --- a/code/game/objects/items/tanks/n2_tanks.dm +++ b/code/game/objects/items/tanks/n2_tanks.dm @@ -10,12 +10,10 @@ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE /obj/item/tank/internals/nitrogen/populate_gas() - air_contents.assert_gas(/datum/gas/nitrogen) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjustGas(GAS_NITROGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/nitrogen/full/populate_gas() - air_contents.assert_gas(/datum/gas/nitrogen) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjustGas(GAS_NITROGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/nitrogen/belt icon_state = "nitrogen_extended" @@ -26,8 +24,7 @@ supports_variations_flags = CLOTHING_VOX_VARIATION /obj/item/tank/internals/nitrogen/belt/full/populate_gas() - air_contents.assert_gas(/datum/gas/nitrogen) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjustGas(GAS_NITROGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/nitrogen/belt/emergency name = "emergency nitrogen tank" @@ -36,6 +33,5 @@ volume = 3 /obj/item/tank/internals/nitrogen/belt/emergency/populate_gas() - air_contents.assert_gas(/datum/gas/nitrogen) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjustGas(GAS_NITROGEN, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) From dda2003658119d06dccb532907bbf6fcd0356871 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 6 Jun 2022 19:05:07 -0400 Subject: [PATCH 139/200] fix maps --- .../lavaland_surface_syndicate_base1/mistake_inevitable.dmm | 2 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 +- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/KiloStation/KiloStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 2 +- _maps/shuttles/emergency_supermatter.dmm | 4 ++-- code/modules/atmospherics/ZAS/atmos_primitives.dm | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm index b8c4064a653..d4d2b013a22 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm @@ -243,7 +243,7 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "yO" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /obj/structure/window/reinforced/plasma/spawner, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 79c4ff94141..18746a4ecea 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -4771,7 +4771,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "mm" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /obj/structure/closet/crate/engineering{ name = "supermatter shard crate" }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 593e362a2d7..0bed26dc145 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -77256,7 +77256,7 @@ /turf/open/floor/iron, /area/medical/virology) "uqa" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible/layer4, /turf/open/floor/engine, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 66d5f9bedc8..8a405b5025f 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -39924,7 +39924,7 @@ /turf/open/floor/iron/showroomfloor, /area/security/processing) "szM" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "szW" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 00ec48f95a1..7a0e0fe54bf 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -47887,7 +47887,7 @@ /turf/open/floor/wood, /area/service/lawoffice) "lGe" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "lGj" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index ff8cb0cb369..fdd3688ada0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -8961,7 +8961,7 @@ /turf/open/floor/iron, /area/hallway/primary/port) "ctk" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "ctm" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index e761e21cf3d..a0c53440362 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -42563,7 +42563,7 @@ /turf/open/floor/iron/white, /area/science/explab) "nSy" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/engine, /area/engineering/supermatter) "nSQ" = ( diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index d6e69b10923..34e20b2e027 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "aB" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/plating, /area/shuttle/escape) "aD" = ( @@ -193,7 +193,7 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "aV" = ( -/obj/machinery/power/obj/machinery/power/supermatter_crystal, +/obj/machinery/power/supermatter_crystal, /turf/open/floor/plating/airless, /area/shuttle/escape) "aW" = ( diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 2ca321410a4..4739a4357e9 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -515,7 +515,7 @@ //surface - the surface area in m^2 //exposed_surface_ratio - the proportion of the surface that is exposed to sunlight //thermal_conductivity - a multipler on the heat transfer rate. See OPEN_HEAT_TRANSFER_COEFFICIENT and friends -/proc/get_thermal_radiation(var/surface_temperature, var/surface, var/exposed_surface_ratio, var/thermal_conductivity) +/proc/get_thermal_radiation(surface_temperature, surface, exposed_surface_ratio, thermal_conductivity) //*** Gain heat from sunlight, then lose heat from radiation. // We only get heat from the star on the exposed surface area. From 5632fad48f433f43680ef39ce7f2a4aad18f83c5 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 6 Jun 2022 21:01:32 -0400 Subject: [PATCH 140/200] re-adds SM monitor --- .../modular_computers/computers/item/tablet_presets.dm | 4 ++-- .../modular_computers/computers/machinery/console_presets.dm | 2 +- code/modules/modular_computers/hardware/job_disk.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 4 ++-- pariah.dme | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index ac0fc1da938..1bb4124fdf5 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -73,7 +73,7 @@ . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/alarm_monitor) - //hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) + hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) /obj/item/modular_computer/tablet/preset/advanced/security/Initialize(mapload) . = ..() @@ -93,7 +93,7 @@ . = ..() var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive") hard_drive.store_file(new /datum/computer_file/program/alarm_monitor) - //hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) + hard_drive.store_file(new /datum/computer_file/program/supermatter_monitor) /// Given to Nuke Ops members. /obj/item/modular_computer/tablet/nukeops/Initialize(mapload) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 3263088816b..e2e79eed7d0 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -36,7 +36,7 @@ var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/power_monitor()) hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) - //hard_drive.store_file(new/datum/computer_file/program/supermatter_monitor()) + hard_drive.store_file(new/datum/computer_file/program/supermatter_monitor()) // ===== RESEARCH CONSOLE ===== /obj/machinery/modular_computer/console/preset/research diff --git a/code/modules/modular_computers/hardware/job_disk.dm b/code/modules/modular_computers/hardware/job_disk.dm index e2daf69dca7..528ed67a02a 100644 --- a/code/modules/modular_computers/hardware/job_disk.dm +++ b/code/modules/modular_computers/hardware/job_disk.dm @@ -22,7 +22,7 @@ if(disk_flags & DISK_POWER) progs_to_store += new /datum/computer_file/program/power_monitor(src) - //progs_to_store += new /datum/computer_file/program/supermatter_monitor(src) + progs_to_store += new /datum/computer_file/program/supermatter_monitor(src) if(disk_flags & DISK_ATMOS) progs_to_store += new /datum/computer_file/program/atmosscan(src) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 3f6fff19940..45e07d5c08a 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -312,13 +312,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) data["SM_moles"] = air.total_moles for(var/gasid in air.gas) gasdata.Add(list(list( - "name"= xgm_gas_data.name[air.gas[gasid]], + "name"= xgm_gas_data.name[gasid], "amount" = round(100*air.gas[gasid]/air.total_moles,0.01)))) else for(var/gasid in air.gas) gasdata.Add(list(list( - "name"= xgm_gas_data.name[air.gas[gasid]], + "name"= xgm_gas_data.name[gasid], "amount" = 0))) data["gases"] = gasdata diff --git a/pariah.dme b/pariah.dme index 1bf0e125819..f1282321eff 100644 --- a/pariah.dme +++ b/pariah.dme @@ -3671,8 +3671,8 @@ #include "code\modules\modular_computers\file_system\programs\secureye.dm" #include "code\modules\modular_computers\file_system\programs\signaler.dm" #include "code\modules\modular_computers\file_system\programs\skill_tracker.dm" -//#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" -//#include "code\modules\modular_computers\file_system\programs\statusdisplay.dm" +#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\statusdisplay.dm" #include "code\modules\modular_computers\file_system\programs\techweb.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" From b0bc30cba03a42da283ff8bbc0355cae72e650c3 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 7 Jun 2022 13:59:14 -0400 Subject: [PATCH 141/200] Fixes scrubber runtime --- code/modules/atmospherics/machinery/portable/scrubber.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index e7c8abbcee5..1d37ffebd47 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -71,11 +71,13 @@ /obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture) if(air_contents.returnPressure() >= overpressure_m * ONE_ATMOSPHERE) return + if(!mixture.total_moles) + return var/transfer_moles = min(1, volume_rate/mixture.volume)*mixture.total_moles var/datum/gas_mixture/gas2scrub = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - //var/datum/gas_mixture/filtered = new + if(!scrubbing) return From 9adb576c9e270b877da68e100c7aaa8a6f76a95b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 7 Jun 2022 16:01:51 -0400 Subject: [PATCH 142/200] Hopefully fixes magboots --- code/controllers/subsystem/airflow.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 5d2e11bd847..d3ba8a319e3 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -117,6 +117,8 @@ SUBSYSTEM_DEF(airflow) if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) return FALSE + if(!check_airflow_movable(strength)) + return FALSE if (airflow_dest == loc) step_away(src, loc) if (ismob(src)) From d52a0ee575b170559d1eb5d909aa7ef954429422 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 7 Jun 2022 19:21:36 -0400 Subject: [PATCH 143/200] Fixes --- code/__HELPERS/areas.dm | 2 +- code/game/objects/structures/false_walls.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index a15767bb241..c4b814aed40 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engineerin return FALSE var/static/list/cardinal_cache = list("[NORTH]"=TRUE, "[EAST]"=TRUE, "[SOUTH]"=TRUE, "[WEST]"=TRUE) var/canpass - ATMOS_CANPASS_TURF(canpass, sourceT, checkT) + ATMOS_CANPASS_TURF(canpass, checkT, sourceT) if(!cardinal_cache["[dir]"] || !canpass) continue found_turfs += checkT // Since checkT is connected, add it to the list to be processed diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 121425c57a0..172d42c5c39 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -61,7 +61,7 @@ /obj/structure/falsewall/zas_canpass(turf/other) if(QDELETED(src)) return AIR_ALLOWED - return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED + return ZONE_BLOCKED /obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open . = ..() diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 73050dd39c4..85280a16009 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -43,6 +43,8 @@ This entire system is an absolute mess. return FALSE if(body_position == LYING_DOWN) //Lying down protects you from Z A S M O M E N T S return + if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) //Magboots + return FALSE Knockdown(zas_settings.airflow_stun) visible_message( From fa61389d6844d40b66ce63d06aa7b40427ae1036 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:23:37 -0400 Subject: [PATCH 144/200] EXPERIMENTAL: Smart Vents/Pipes --- .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 7 ++----- .../atmospherics/ZAS/atmos_primitives.dm | 10 ++++++++-- .../components/unary_devices/vent_pump.dm | 6 ++++++ .../components/unary_devices/vent_scrubber.dm | 13 ++++++++++--- .../components/idle2_cc_-_Copy.dmi | Bin 0 -> 31546 bytes .../atmospherics/components/unary_devices.dmi | Bin 100872 -> 127851 bytes 6 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 icons/obj/atmospherics/components/idle2_cc_-_Copy.dmi diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 51aaa3f0563..c9f5b3c6bbc 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -47,11 +47,8 @@ ///Sets the given gas id's mole count to the specified amount. /datum/gas_mixture/proc/setGasMoles(gasid, moles, update = TRUE, divide_among_group = FALSE) - if(moles == 0) - return - //Generally setGasMoles actions pre-calculate, just in case. - if(divide_among_group && group_multiplier != 1) + if(divide_among_group && group_multiplier != 1 && moles != 0) gas[gasid] = moles/group_multiplier else gas[gasid] = moles @@ -274,7 +271,7 @@ return removed -///Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume/ +///Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume. /datum/gas_mixture/proc/removeVolume(removed_volume) var/datum/gas_mixture/removed = removeRatio(removed_volume/(volume*group_multiplier), 1) removed.volume = removed_volume diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 4739a4357e9..2e49450a19c 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -38,7 +38,8 @@ //transfer_moles - Limits the amount of moles to transfer. The actual amount of gas moved may also be limited by available_power, if given. //available_power - the maximum amount of power that may be used when moving gas. If null then the transfer is not limited by power. /proc/pump_gas(datum/gas_mixture/source, datum/gas_mixture/sink, transfer_moles = null, available_power = null) - if (source.total_moles < MINIMUM_MOLES_TO_PUMP) //if we can't transfer enough gas just stop to avoid further processing + if (source.total_moles < MINIMUM_MOLES_TO_PUMP) + sink.merge(source.remove(INFINITY)) return -1 if (isnull(transfer_moles)) @@ -116,13 +117,18 @@ var/list/specific_power_gas = list() //the power required to remove one mole of pure gas, for each gas type for (var/g in filtering) if (source.gas[g] < MINIMUM_MOLES_TO_FILTER) + total_filterable_moles += source.gas[g] //Just get rid of it, ffs continue var/specific_power = calculate_specific_power_gas(g, source, sink)/ATMOS_FILTER_EFFICIENCY specific_power_gas[g] = specific_power total_filterable_moles += source.gas[g] - if (total_filterable_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing + ///Just transfer it, who really cares at a scale this small. + if (total_filterable_moles < MINIMUM_MOLES_TO_FILTER) + for(var/g in filtering) + source.setGasMoles(g, 0) + sink.adjustGasWithTemp(g, source.gas[g] * source.group_multiplier, source.temperature) return -1 //now that we know the total amount of filterable gas, we can calculate the amount of power needed to scrub one mole of gas diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 8cf8e756e5b..53948d1ed43 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -81,6 +81,10 @@ icon_state = "vent_in-off" return + if(!COOLDOWN_FINISHED(src, hibernating)) + icon_state = "vent_hibernating" + return + if(icon_state == ("vent_out-off" || "vent_in-off" || "vent_off")) if(pump_direction & RELEASING) icon_state = "vent_out" @@ -129,6 +133,8 @@ if(pump_direction && (pressure_checks&EXT_BOUND)) COOLDOWN_START(src, hibernating, 15 SECONDS) + update_icon_nopipes() + /obj/machinery/atmospherics/components/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment) var/pressure_delta = DEFAULT_PRESSURE_DELTA var/environment_pressure = environment.returnPressure() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index c3191132c5a..51f8ed022cd 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -137,11 +137,17 @@ icon_state = "scrub_welded" return - if(!nodes[1] || !on || !is_operational || !COOLDOWN_FINISHED(src, hibernating)) + if(!nodes[1] || !on || !is_operational) icon_state = "scrub_off" return - if(scrubbing & SCRUBBING) + if(!COOLDOWN_FINISHED(src, hibernating)) + if(widenet) + icon_state = "scrub_wide_hibernating" + else + icon_state = "scrub_hibernating" + + else if(scrubbing & SCRUBBING) if(widenet) icon_state = "scrub_wide" else @@ -240,6 +246,7 @@ if(scrubbing == SCRUBBING) if(length(environment.gas & filter_types)) + . = TRUE ///contains all of the gas we're sucking out of the tile, gets put into our parent pipenet var/datum/gas_mixture/filtered_out = new filtered_out.temperature = environment.temperature @@ -260,7 +267,7 @@ //Remix the resulting gases air_contents.merge(filtered_out) update_parents() - return TRUE + return . else //Just siphoning all air diff --git a/icons/obj/atmospherics/components/idle2_cc_-_Copy.dmi b/icons/obj/atmospherics/components/idle2_cc_-_Copy.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6e3cd7c45a97342a2c45ef0b81df9a285d81686b GIT binary patch literal 31546 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 literal 0 HcmV?d00001 diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index 3350500fde9503b6589c5f41a04e9cba0c0817c0..e3215f57990e6a2291e65c55c1ddd430eac40671 100644 GIT binary patch literal 127851 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 WWy$@O%Y|IvFwiwQU!;BW(f<ITO5_6o literal 100872 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 z�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 From c985edfab3461ca7efbdec5960a033dd47c6d183 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 9 Jun 2022 02:03:48 -0400 Subject: [PATCH 145/200] Airflow tweaks and improvements --- code/controllers/subsystem/airflow.dm | 4 +--- code/modules/atmospherics/ZAS/Airflow.dm | 22 ++++++++++--------- .../atmospherics/ZAS/ConnectionGroup.dm | 3 ++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index d3ba8a319e3..2e10b15d7ec 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -95,9 +95,7 @@ SUBSYSTEM_DEF(airflow) continue var/olddir = target.dir - //target.set_dir_on_move = FALSE step_towards(target, target.airflow_dest) - //target.set_dir_on_move = TRUE target.dir = olddir target.airborne_acceleration++ @@ -117,7 +115,7 @@ SUBSYSTEM_DEF(airflow) if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) return FALSE - if(!check_airflow_movable(strength)) + if(!check_airflow_movable(INFINITY)) //This is a hack but it works so im sure its fine return FALSE if (airflow_dest == loc) step_away(src, loc) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 85280a16009..f0db10f2d7a 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -26,27 +26,26 @@ This entire system is an absolute mess. var/tmp/airflow_skip_speedcheck ///Applies the effects of the mob colliding with another movable due to airflow. -/mob/proc/airflow_stun() +/mob/proc/airflow_stun(delta_p) return -/mob/living/airflow_stun() +/mob/living/airflow_stun(delta_p) if(stat == 2) return FALSE + if(pulledby || pulling) + return FALSE if(last_airflow_stun > world.time - zas_settings.airflow_stun_cooldown) - to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") return FALSE if(!(status_flags & CANSTUN) && !(status_flags & CANKNOCKDOWN)) - to_chat(src, "<span class='notice'>Air suddenly rushes past you, but you manage to keep your footing!</span>") return FALSE if(buckled) - to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>") return FALSE if(body_position == LYING_DOWN) //Lying down protects you from Z A S M O M E N T S - return + return FALSE if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) //Magboots return FALSE - Knockdown(zas_settings.airflow_stun) + Knockdown(zas_settings.airflow_stun * clamp((delta_p / zas_settings.airflow_stun_pressure), 1, 3)) visible_message( span_danger("[src] is thrown to the floor by a gust of air!"), span_danger("A sudden rush of air knocks you over!"), @@ -55,10 +54,10 @@ This entire system is an absolute mess. last_airflow_stun = world.time -/mob/living/silicon/airflow_stun() +/mob/living/silicon/airflow_stun(delta_p) return -/mob/living/simple_animal/slime/airflow_stun() +/mob/living/simple_animal/slime/airflow_stun(delta_p) return ///Checks to see if airflow can move this movable. @@ -87,7 +86,7 @@ This entire system is an absolute mess. /obj/item/check_airflow_movable(n) switch(w_class) - if(1,2) + if(0,1,2) if(n < zas_settings.airflow_lightest_pressure) return 0 if(3) if(n < zas_settings.airflow_light_pressure) return 0 @@ -107,6 +106,7 @@ This entire system is an absolute mess. A.airflow_hit_act(src) else if(istype(src, /mob/living/carbon/human)) to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") + src:Stun(1 SECONDS) // :) /* If the turf of the atom we bumped is NOT dense, then we check if the flying object is dense. We check the special var because flying objects gain density so they can Bump() objects. @@ -128,9 +128,11 @@ This entire system is an absolute mess. ///Called when src collides with A during airflow /atom/movable/proc/airflow_hit(atom/A) + SHOULD_CALL_PARENT(TRUE) airflow_speed = 0 airflow_dest = null airborne_acceleration = 0 + A.airflow_hit_act(src) /mob/living/airflow_hit(atom/A) var/b_loss = AIRBORNE_DAMAGE(src) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index f48bfccb9da..0eebe53c966 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -132,7 +132,8 @@ Class Procs: //Check for knocking people over if(ismob(M) && differential > zas_settings.airflow_stun_pressure) if(M:status_flags & GODMODE) continue - M:airflow_stun() + if(!M:airflow_stun()) + to_chat(M, "<span class='danger'>Air suddenly rushes past you!</span>") if(M.check_airflow_movable(differential)) //Check for things that are in range of the midpoint turfs. From 1c16d068b063fcbe24e16ff7e7cf8e2ff9cc9809 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 9 Jun 2022 16:21:34 -0400 Subject: [PATCH 146/200] TTVs should now function more --- code/__DEFINES/atmospherics/ZAS.dm | 6 +++ code/__DEFINES/dcs/signals/signals_object.dm | 1 + code/__HELPERS/_logging.dm | 6 +-- code/controllers/subsystem/airflow.dm | 3 +- code/datums/components/pellet_cloud.dm | 6 ++- code/game/objects/items/tanks/tanks.dm | 45 ++++++++++++++++--- code/modules/atmospherics/ZAS/ZAS_Settings.dm | 4 ++ 7 files changed, 59 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 4121a6d7411..077bc0709ff 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -326,3 +326,9 @@ GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir #define ATMOS_DEFAULT_VOLUME_FILTER 500 // L. #define ATMOS_DEFAULT_VOLUME_MIXER 500 // L. #define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. + +///Bomb caps +#define BOMBCAP_DVSTN_RADIUS (zas_settings.max_explosion_range / 4) +#define BOMBCAP_HEAVY_RADIUS (zas_settings.max_explosion_range / 2) +#define BOMBCAP_LIGHT_RADIUS (zas_settings.max_explosion_range) +#define BOMBCAP_FLASH_RADIUS (zas_settings.max_explosion_range * 1.5) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index ef9610159e9..341879b4a7c 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -177,6 +177,7 @@ #define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/structure/closet/supplypod/proc/preOpen]: #define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" +#define COMSIG_TANK_SNOWFLAKE_PELLET_TRIGGER "ihatethiscodesomuch" ///from /obj/item/storage/book/bible/afterattack(): (mob/user, proximity) #define COMSIG_BIBLE_SMACKED "bible_smacked" diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 4d46d4e5a68..f2b6022dbbb 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -178,9 +178,9 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /// Logs the contents of the gasmix to the game log, prefixed by text /proc/log_atmos(text, datum/gas_mixture/mix) var/message = text - message += "TEMP=[mix.get_temperature()],MOL=[mix.get_moles()],VOL=[mix.volume]" - for(var/key in mix.getGases()) - message += "[key]=[mix.getGroupGas(key)];" + message += "TEMP=[mix.temperature] K, MOL=[mix.total_moles], VOL=[mix.volume]L" + for(var/key in mix.gas) + message += "[xgm_gas_data.name[key]]=[mix.gas[key]] moles;" log_game(message) /proc/log_say(text) diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 2e10b15d7ec..6a3fb2e3fc0 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -15,6 +15,7 @@ SUBSYSTEM_DEF(airflow) wait = 1 flags = SS_NO_INIT priority = FIRE_PRIORITY_AIRFLOW + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME var/static/tmp/list/processing = list() var/static/tmp/list/current = list() @@ -115,7 +116,7 @@ SUBSYSTEM_DEF(airflow) if (airflow_speed) airflow_speed = strength / max(get_dist(src, airflow_dest), 1) return FALSE - if(!check_airflow_movable(INFINITY)) //This is a hack but it works so im sure its fine + if(!check_airflow_movable(strength*10)) //Repel/Gotoairflowdest() divide the differential by a max of 10, so we're undoing that here return FALSE if (airflow_dest == loc) step_away(src, loc) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index fdde1edbeca..f845c0f132f 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -55,7 +55,7 @@ /datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) - if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent)) + if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent) && !istype(parent, /obj/item/tank)) return COMPONENT_INCOMPATIBLE if(magnitude < 1) @@ -64,7 +64,7 @@ src.projectile_type = projectile_type - if(isammocasing(parent)) + if(isammocasing(parent) || istype(parent, /obj/item/tank)) num_pellets = magnitude else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent)) radius = magnitude @@ -88,6 +88,8 @@ RegisterSignal(parent, COMSIG_MINE_TRIGGERED, .proc/create_blast_pellets) else if(issupplypod(parent)) RegisterSignal(parent, COMSIG_SUPPLYPOD_LANDED, .proc/create_blast_pellets) + else if(istype(parent, /obj/item/tank)) + RegisterSignal(parent, COMSIG_TANK_SNOWFLAKE_PELLET_TRIGGER, .proc/create_blast_pellets) /datum/component/pellet_cloud/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_DETONATE, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index d77e02a152d..b7d9a9a9665 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -264,7 +264,7 @@ return //Allow for reactions - excited = (excited | air_contents.react(src)) + excited = (excited | air_contents.react()) excited = (excited | handle_tolerances(delta_time)) excited = (excited | leaking) @@ -324,19 +324,52 @@ if(!air_contents) return ..() + var/turf/T = get_turf(src) + if(!T) + return ..() + T.hotspot_expose(air_contents.temperature, 70, 1) + T.assume_air(air_contents) /// Handle fragmentation var/pressure = air_contents.returnPressure() if(pressure > TANK_FRAGMENT_PRESSURE) if(!istype(loc, /obj/item/transfer_valve)) log_bomber(get_mob_by_key(fingerprintslast), "was last key to touch", src, "which ruptured explosively") - //Give the gas a chance to build up more pressure through reacting - air_contents.react(src) + //Give the gas a chance to build up more pressure through reacting. Alot. + air_contents.react() + air_contents.react() + air_contents.react() + pressure = air_contents.returnPressure() // As of writing this this is calibrated to maxcap at 140L and 160atm. - var/power = (air_contents.volume * (pressure - TANK_FRAGMENT_PRESSURE)) / TANK_FRAGMENT_SCALE - log_atmos("[type] exploded with a power of [power] and a mix of ", air_contents) - dyn_explosion(src, power, flash_range = 1.5, ignorecap = FALSE) + var/strength = ((pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE) + var/mult = ((air_contents.volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) + + log_atmos("[type] exploded with a power of [strength * mult] and a mix of ", air_contents) + explosion( + get_turf(loc), + round(min(BOMBCAP_DVSTN_RADIUS, ((mult)*strength)*0.15)), + round(min(BOMBCAP_HEAVY_RADIUS, ((mult)*strength)*0.35)), + round(min(BOMBCAP_LIGHT_RADIUS, ((mult)*strength)*0.80)), + round(min(BOMBCAP_FLASH_RADIUS, ((mult)*strength)*1.20)), + ) + var/num_fragments = round(rand(8,10) * sqrt(strength * mult)) + ///Holy. Fucking. Shit. This is AGONIZING. Give me /obj/proc/fragmentate() PLEASE. + AddComponent(/datum/component/pellet_cloud, projectile_type = /obj/projectile/bullet/shrapnel, magnitude = num_fragments) + SEND_SIGNAL(src, COMSIG_TANK_SNOWFLAKE_PELLET_TRIGGER) + + else if (pressure > TANK_RUPTURE_PRESSURE) + playsound(T, 'sound/weapons/gun/shotgun/shot.ogg', 20, 1) + visible_message("[icon2html(src, viewers(get_turf(src)))] <span class='danger'>\The [src] flies apart!</span>", "<span class='warning'>You hear a bang!</span>") + + var/strength = 1+((pressure-TANK_LEAK_PRESSURE)/TANK_FRAGMENT_SCALE) + + var/mult = (air_contents.total_moles**2/3)/((29*0.64) **2/3) //tanks appear to be experiencing a reduction on scale of about 0.64 total moles + + var/num_fragments = round(rand(6,8) * sqrt(strength * mult)) //Less chunks, but bigger + AddComponent(/datum/component/pellet_cloud, projectile_type = /obj/projectile/bullet/shrapnel/mega, magnitude = num_fragments) + SEND_SIGNAL(src, COMSIG_TANK_SNOWFLAKE_PELLET_TRIGGER) + return ..() /obj/item/tank/proc/merging_information() diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm index f9975f0a122..53891545cc3 100644 --- a/code/modules/atmospherics/ZAS/ZAS_Settings.dm +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -73,3 +73,7 @@ var/connection_temperature_delta = 10 var/connection_temperature_delta_NAME = "Connections - Temperature Difference" var/connection_temperature_delta_DESC = "The smallest temperature difference which will cause heat to travel through doors." + + var/max_explosion_range = 14 + var/max_explosion_range_NAME = "TTV Explosion Range Maximum" + var/max_explosion_range_DESC = "What it says on the tin" From f6a329fbb2f59705c132a17be1b41981afa12d80 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 10 Jun 2022 14:17:09 -0400 Subject: [PATCH 147/200] writing --- code/game/objects/items/tanks/tanks.dm | 1 - code/modules/surgery/organs/ears.dm | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index b7d9a9a9665..d8542985686 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -341,7 +341,6 @@ pressure = air_contents.returnPressure() - // As of writing this this is calibrated to maxcap at 140L and 160atm. var/strength = ((pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE) var/mult = ((air_contents.volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 211a4555a2c..04489150731 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -10,7 +10,7 @@ healing_factor = STANDARD_ORGAN_HEALING decay_factor = STANDARD_ORGAN_DECAY - low_threshold_passed = "<span class='info'>Your ears begin to resonate with an internal ring sometimes.</span>" + low_threshold_passed = "<span class='info'>Your ears begin to resonate with an internal ring.</span>" now_failing = "<span class='warning'>You are unable to hear at all!</span>" now_fixed = "<span class='info'>Noise slowly begins filling your ears once more.</span>" low_threshold_cleared = "<span class='info'>The ringing in your ears has died down.</span>" From 5e536aa0f13fd408643066f9d079c85fae5cd81d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:34:45 -0400 Subject: [PATCH 148/200] Fixes fire runtime --- code/modules/atmospherics/machinery/components/tank.dm | 2 +- code/modules/atmospherics/machinery/datum_pipeline.dm | 2 +- .../atmospherics/machinery/portable/portable_atmospherics.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 3f517833072..8ea5cf113d5 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -139,7 +139,7 @@ air_contents.adjustGas(gastype, moles_to_add) /obj/machinery/atmospherics/components/tank/process_atmos() - if(air_contents.react(src)) + if(air_contents.react()) update_parents() if(air_contents.returnPressure() > max_pressure) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 0db1d72042d..b1c0850f11e 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -36,7 +36,7 @@ return reconcile_air() //Only react if the mix has changed, and don't keep updating if it hasn't - update = air.react(src) + update = air.react() ///Preps a pipeline for rebuilding, insterts it into the rebuild queue /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 8a19c6e46fe..4ffb3acd0d0 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -44,7 +44,7 @@ /obj/machinery/portable_atmospherics/process_atmos() if(!connected_port) // Pipe network handles reactions if connected, and we can't stop processing if there's a port effecting our mix - excited = (excited | air_contents.react(src)) + excited = (excited | air_contents.react()) if(!excited) return PROCESS_KILL excited = FALSE From 378acac6525f400c4d35fa7d86ba0776bdb25e3d Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 11 Jun 2022 14:34:52 -0400 Subject: [PATCH 149/200] optimizations, gasgas bad --- code/modules/atmospherics/machinery/airalarm.dm | 6 +++--- .../machinery/components/unary_devices/vent_scrubber.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index ef635f0ce5e..bd60cf57d93 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -237,7 +237,7 @@ )) var/total_moles = environment.get_moles() var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume - for(var/gas_id in environment.getGases()) + for(var/gas_id in environment.gas) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue cur_tlv = TLV[gas_id] @@ -624,7 +624,7 @@ //cache for sanic speed (lists are references anyways) var/list/cached_tlv = TLV - var/list/env_gases = environment.getGases() + var/list/env_gases = environment.gas //var/partial_pressure = R_IDEAL_GAS_EQUATION * exposed_temperature / environment.volume current_tlv = cached_tlv["pressure"] @@ -994,7 +994,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) pressure.set_output(round(environment.returnPressure())) my_temperature.set_output(round(environment.temperature)) if(ispath(options_map[current_option])) - gas_amount.set_output(round(environment.getGases()[options_map[current_option]])) + gas_amount.set_output(round(environment.gas[options_map[current_option]])) return var/datum/tlv/settings = connected_alarm.TLV[options_map[current_option]] diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 51f8ed022cd..48e0e854e5f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -252,7 +252,7 @@ filtered_out.temperature = environment.temperature var/total_moles_to_remove = 0 - for(var/gas in filter_types & environment.getGases()) + for(var/gas in filter_types & environment.gas) total_moles_to_remove += environment.gas[gas] if(total_moles_to_remove == 0)//sometimes this gets non gc'd values From be287e74fe8a4f1ad4ba5decec6a39cf5ad20b0a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 11 Jun 2022 15:09:50 -0400 Subject: [PATCH 150/200] Liquid plasma now has the proper atmos temp --- code/game/turfs/open/asteroid.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index b42fc44024a..74c1d36ac0a 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/lava/plasma/ice_moon baseturfs = /turf/open/lava/plasma/ice_moon - + initial_gas = ICEMOON_DEFAULT_ATMOS /turf/open/misc/asteroid/snow/ice name = "icy snow" From 584a3e02aff3fa8fa3417142201ce6217a9db21b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:43:27 -0400 Subject: [PATCH 151/200] fixes the implosion thingy --- code/game/objects/items/tanks/tanks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index d8542985686..fa8c22424cb 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -346,7 +346,7 @@ log_atmos("[type] exploded with a power of [strength * mult] and a mix of ", air_contents) explosion( - get_turf(loc), + src, round(min(BOMBCAP_DVSTN_RADIUS, ((mult)*strength)*0.15)), round(min(BOMBCAP_HEAVY_RADIUS, ((mult)*strength)*0.35)), round(min(BOMBCAP_LIGHT_RADIUS, ((mult)*strength)*0.80)), From af1bad6ddddec9a4b0f1962233a8dfbb706c8998 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:46:07 -0400 Subject: [PATCH 152/200] Fixes is_safe_turf --- code/datums/helper_datums/teleport.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index adb5e927175..8711afe571f 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -135,7 +135,7 @@ if(no_teleport && (destination_area.area_flags & NOTELEPORT)) return - var/datum/gas_mixture/floor_gases= floor_turf.return_air()?.getGases() + var/list/floor_gases= floor_turf.return_air()?.gas if(!floor_gases) return From 09f5aae1ebf7b08877fa65eead7c93dd9fc9fe56 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:49:47 -0400 Subject: [PATCH 153/200] fixes is_safe_turf for real --- code/datums/helper_datums/teleport.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 8711afe571f..3a96cf84a06 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -135,11 +135,13 @@ if(no_teleport && (destination_area.area_flags & NOTELEPORT)) return - var/list/floor_gases= floor_turf.return_air()?.gas + var/datum/gas_mixture/floor_gas = floor_turf.return_air() - if(!floor_gases) + if(!floor_gas) return + var/list/floor_gases = floor_gas.gas + if(!(floor_gases[GAS_OXYGEN] >= 16)) return if(floor_gases[GAS_PLASMA]) @@ -148,9 +150,9 @@ return // Aim for goldilocks temperatures and pressure - if((floor_gases.temperature <= 270) || (floor_gases.temperature >= 360)) + if((floor_gas.temperature <= 270) || (floor_gas.temperature >= 360)) return - var/pressure = floor_gases.returnPressure() + var/pressure = floor_gas.returnPressure() if((pressure <= 20) || (pressure >= 550)) return From f35d1c76d96d3e7e3d03de5c41310f522de0b0fd Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:55:27 -0400 Subject: [PATCH 154/200] misc tweaks --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/__HELPERS/atmospherics.dm | 2 +- code/datums/elements/atmos_requirements.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 077bc0709ff..aa644fe2a3e 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -15,7 +15,7 @@ ///Air can pass through or into this turf, but zones may not merge with it. Will not block zone merges, if either zone is below ZONE_MIN_SIZE #define ZONE_BLOCKED (1<<1) -///Zones with less than this many turfs will always merge, even if the connection is not direct +///Zones with less than this many turfs will always merge, even if the connection is not direct, tons of micro zones are expensive! #define ZONE_MIN_SIZE 14 ///Air can always pass diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 711c18f7fda..f1a1aeb8c48 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -41,7 +41,7 @@ ) if(!gasmix) return - for(var/gas_path in gasmix.getGases()) + for(var/gas_path in gasmix.gas) .["gases"] += list(list( "[gas_path]", xgm_gas_data.name[gas_path], diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 735c78e1230..ff86e1482b5 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -46,7 +46,7 @@ if(!open_turf.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) return FALSE - var/datum/gas_mixture/open_turf_gases = open_turf.return_air().getGases() + var/list/open_turf_gases = open_turf.return_air().gas var/plas = open_turf_gases[GAS_PLASMA] From 78b666e23418b6f1a5ee52e19ee5f36f2b469ad0 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 16:13:33 -0400 Subject: [PATCH 155/200] vent pump examine --- .../machinery/components/unary_devices/vent_pump.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 53948d1ed43..bc90b48e88e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -305,6 +305,8 @@ . = ..() if(welded) . += "It seems welded shut." + if(!COOLDOWN_FINISHED(src, hibernating)) + . += span_notice("It is sleeping to conserve power.") /obj/machinery/atmospherics/components/unary/vent_pump/power_change() . = ..() From d48b4243faa938f3bd7d82c58d695e0ba89f7650 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 22:03:19 -0400 Subject: [PATCH 156/200] HOW DID THIS FIX IT? WHAT? THE FUCK ????? --- code/__HELPERS/type2type.dm | 4 ++++ code/game/machinery/doors/firedoor.dm | 2 +- code/modules/atmospherics/ZAS/Connection.dm | 2 +- .../atmospherics/ZAS/ConnectionGroup.dm | 2 +- code/modules/atmospherics/ZAS/Turf.dm | 19 +++++++++---------- code/modules/atmospherics/ZAS/Zone.dm | 2 +- code/modules/mapping/map_template.dm | 11 ----------- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 1a8c9a6886a..e0db3fa65b7 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -36,6 +36,10 @@ return "northwest" if(SOUTHWEST) return "southwest" + if(UP) + return "upwards" + if(DOWN) + return "downwards" else return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 92216006308..6af333e0904 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -665,7 +665,7 @@ if(get_dir(loc, T) == dir) return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED else - return ZONE_BLOCKED + return ZONE_BLOCKED /obj/machinery/door/firedoor/heavy name = "heavy firelock" diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index fb8a596bdf2..80c20b582a9 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -62,7 +62,7 @@ Class Procs: #ifdef ZASDBG ///Set to true during testing to get verbose debug information - var/verbose = FALSE + var/tmp/verbose = FALSE #endif /connection/New(turf/A, turf/B) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 0eebe53c966..2517abe2bec 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -68,7 +68,7 @@ Class Procs: #ifdef ZASDBG ///Set this to TRUE during testing to get verbose debug information. - var/verbose = FALSE + var/tmp/verbose = FALSE #endif /connection_edge/New() diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index aaa2836b0e2..5d91fe83ccc 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -17,7 +17,7 @@ var/list/initial_gas #ifdef ZASDBG ///Set to TRUE during debugging to get chat output on the atmos status of this turf - var/verbose = FALSE + var/tmp/verbose = FALSE #endif ///Adds the graphic_add list to vis_contents, removes graphic_remove. @@ -244,27 +244,26 @@ postponed.Add(target) if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. - var/zone/newzone = new/zone() + var/zone/newzone = new newzone.add_turf(src) #ifdef ZASDBG dbg(zasdbgovl_created) + if(verbose) + zas_log("New zone created for src.") ASSERT(zone) #endif //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. - for(var/turf/T in postponed) + for(var/turf/T as anything in postponed) if(T.zone == src.zone) #ifdef ZASDBG if(verbose) zas_log("This turf tried to merge into itself! Current type: [src.type]") - - CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning - #else - return //THIS BUG IS SMALL ENOUGH THAT IT IS FINE FOR NOW. I WILL FIX IT IN THE FUTURE. #endif + CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning SSzas.connect(src, T) /turf/proc/post_update_air_properties() @@ -378,9 +377,9 @@ ///Returns a list of adjacent turfs that can contain air. Returns null if none. /turf/proc/get_atmos_adjacent_turfs() var/list/adjacent_turfs = list() - for(var/dir in GLOB.cardinals) - if(open_directions & dir) - adjacent_turfs += get_step(src, dir) + for(var/direct in GLOB.cardinals) + if(open_directions & direct) + adjacent_turfs += get_step(src, direct) return length(adjacent_turfs) ? adjacent_turfs : null /turf/open/return_analyzable_air() diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index f1270bc8d4b..79fddf11563 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -180,7 +180,7 @@ Class Procs: // Update gas overlays. if(air.checkTileGraphic(graphic_add, graphic_remove)) - for(var/turf/open/T in contents) + for(var/turf/T in contents) if(T.simulated) T.update_graphic(graphic_add, graphic_remove) graphic_add.len = 0 diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index b2398487777..aca8c8d2103 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -154,17 +154,6 @@ if(T.y+height > world.maxy) return - /*var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), - locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z))*/\ - #ifdef ZASDBG - stack_trace("This is a reminder that kapu touched this code") - #endif - /* - for(var/L in border) - var/turf/turf_to_disable = L - SSair.remove_from_active(turf_to_disable) //stop processing turfs along the border to prevent runtimes, we return it in initTemplateBounds() - turf_to_disable.atmos_adjacent_turfs?.Cut() - */ SSzas.can_fire = FALSE // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. From a82178c452925634a24054015f9cef141565300e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 22:49:06 -0400 Subject: [PATCH 157/200] Fuck it. This is fine. --- code/controllers/subsystem/zas.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 725c03eb5d1..d469bc188fe 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -397,7 +397,8 @@ SUBSYSTEM_DEF(zas) ASSERT(A != B) #endif var/block = air_blocked(A,B) - if(block & AIR_BLOCKED) return + if(block & AIR_BLOCKED) + return var/direct = !(block & ZONE_BLOCKED) //var/space = istype(B, /turf/open/space) @@ -406,7 +407,7 @@ SUBSYSTEM_DEF(zas) if(!space) if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) merge(A.zone,B.zone) - return + return TRUE var/a_to_b = get_dir(A,B) var/b_to_a = get_dir(B,A) @@ -432,6 +433,8 @@ SUBSYSTEM_DEF(zas) if(direct) c.mark_direct() + return TRUE + ///Marks a turf for update. /datum/controller/subsystem/zas/proc/mark_for_update(turf/T) #ifdef ZASDBG From 136a9360632dbb69b1a7a43688673e4e5a986fd7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 25 Jun 2022 22:49:16 -0400 Subject: [PATCH 158/200] oops --- code/modules/atmospherics/ZAS/Debug.dm | 6 +++--- code/modules/atmospherics/ZAS/Turf.dm | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Debug.dm b/code/modules/atmospherics/ZAS/Debug.dm index b9e6b571f6a..22d92de2125 100644 --- a/code/modules/atmospherics/ZAS/Debug.dm +++ b/code/modules/atmospherics/ZAS/Debug.dm @@ -84,11 +84,11 @@ GLOBAL_REAL_VAR(list/zasdbgovl_dirzoneblock) = list( return /turf/zas_log(string) - to_chat(world, "[span_admin("ZAS:")] Turf output of [src] at ([src.x], [src.y], [src.z]): [string]") + to_chat(world, "[span_admin("ZAS:")] ([src.x], [src.y], [src.z]): [string]") /connection/zas_log(string) - to_chat(world, "[span_admin("ZAS:")] Verbose connection output: [string]") + to_chat(world, "[span_admin("ZAS:")] connection output: [string]") /connection_edge/zas_log(string) - to_chat(world, "[span_admin("ZAS:")] Verbose connection edge output: [string]") + to_chat(world, "[span_admin("ZAS:")] connection edge output: [string]") #endif diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 5d91fe83ccc..c545e53284a 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -257,15 +257,13 @@ //At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug. + //Loop through all previous connection attempts and try again for(var/turf/T as anything in postponed) - if(T.zone == src.zone) - #ifdef ZASDBG - if(verbose) - zas_log("This turf tried to merge into itself! Current type: [src.type]") - #endif - CRASH("Turf in the postponed turflist shares a zone with src, aborting merge!") //Yes yes this is not a fix but atleast it keeps the warning + if(T.zone == src.zone) //Don't try to connect to yourself + continue SSzas.connect(src, T) + /turf/proc/post_update_air_properties() if(connections) connections.update_all() From 751aa8fef2846d5d13c42fc9fc1fa84655b6b8ab Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 26 Jun 2022 21:25:23 -0400 Subject: [PATCH 159/200] please dont break anything thx --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- code/controllers/subsystem/zas.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/modules/antagonists/blob/structures/_blob.dm | 4 ++-- code/modules/atmospherics/ZAS/Turf.dm | 8 ++------ 8 files changed, 10 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index aa644fe2a3e..b7cee4f9ac9 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,5 +1,5 @@ ///Enables verbose debugging and the debug overlay. NOTE: Debug Overlay does not report MultiZAS information at this time. -//#define ZASDBG +#define ZASDBG ///Enables multi-Z air movement. Zones do not merge across Z levels. #define MULTIZAS diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index d469bc188fe..16e88bb09b6 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -366,7 +366,7 @@ SUBSYSTEM_DEF(zas) var/ablock ATMOS_CANPASS_TURF(ablock, A, B) if(ablock & AIR_BLOCKED) - return AIR_BLOCKED + return AIR_BLOCKED|ZONE_BLOCKED ATMOS_CANPASS_TURF(., B, A) return ablock | . diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 6af333e0904..5f92c5412b2 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -659,7 +659,7 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/machinery/door/firedoor/border_only/zas_canpass(turf/T, vertical = FALSE) +/obj/machinery/door/firedoor/border_only/zas_canpass(turf/T) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 3ee24b2a485..3456279f7b2 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -174,7 +174,7 @@ return TRUE -/obj/machinery/door/window/zas_canpass(turf/T, vertical = FALSE) +/obj/machinery/door/window/zas_canpass(turf/T) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 449a1480076..24115f9b8e6 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -70,7 +70,7 @@ if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) return valid_window_location(loc, mover.dir, is_fulltile = FALSE) -/obj/structure/windoor_assembly/zas_canpass(turf/T, vertical = FALSE) +/obj/structure/windoor_assembly/zas_canpass(turf/T) if(QDELETED(src)) return AIR_ALLOWED if(get_dir(loc, T) == dir) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0b3a9adf366..33f3dc2d8e2 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -359,7 +359,7 @@ update_nearby_tiles() . = ..() -/obj/structure/window/zas_canpass(turf/T, vertical = FALSE) +/obj/structure/window/zas_canpass(turf/T) if(QDELETED(src)) return AIR_ALLOWED if(!anchored || !density) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index df2b67c1b3d..379f99ac02b 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -98,10 +98,10 @@ /obj/structure/blob/block_superconductivity() return atmosblock -/obj/structure/blob/zas_canpass(turf/T, vertical = FALSE) +/obj/structure/blob/zas_canpass(turf/T) if(QDELETED(src)) return AIR_ALLOWED - return atmosblock ? AIR_BLOCKED : AIR_ALLOWED + return atmosblock ? (AIR_BLOCKED|ZONE_BLOCKED) : AIR_ALLOWED /obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind. . = ..() diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index c545e53284a..940fd90669a 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -209,9 +209,7 @@ #endif //Postpone this tile rather than exit, since a connection can still be made. - if(!postponed) - postponed = list() - postponed.Add(sim_target) + LAZYADD(postponed, sim_target) else sim_target.zone.add_turf(src) @@ -239,9 +237,7 @@ #endif else //Postponing connections to tiles until a zone is assured. - if(!postponed) - postponed = list() - postponed.Add(target) + LAZYADD(postponed, target) if(!TURF_HAS_VALID_ZONE(src)) //Still no zone, make a new one. var/zone/newzone = new From 37147ac39e2b21e1b144a9fe04a3dc78b824495e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 27 Jun 2022 00:52:52 -0400 Subject: [PATCH 160/200] disables debug --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index b7cee4f9ac9..aa644fe2a3e 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -1,5 +1,5 @@ ///Enables verbose debugging and the debug overlay. NOTE: Debug Overlay does not report MultiZAS information at this time. -#define ZASDBG +//#define ZASDBG ///Enables multi-Z air movement. Zones do not merge across Z levels. #define MULTIZAS From ed15ed0d16a97185fb3be39a6b9ec3cd229f7448 Mon Sep 17 00:00:00 2001 From: Francinum <5572280+francinum@users.noreply.github.com> Date: Wed, 29 Jun 2022 21:35:55 -0400 Subject: [PATCH 161/200] Remove multiline comments in the DME --- pariah.dme | 52 ++++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/pariah.dme b/pariah.dme index 80b83d6b94c..389f2c6b3e9 100644 --- a/pariah.dme +++ b/pariah.dme @@ -2309,16 +2309,14 @@ #include "code\modules\asset_cache\assets\vv.dm" #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" -/* -#include "code\modules\atmospherics\environmental\LINDA_fire.dm" -#include "code\modules\atmospherics\environmental\LINDA_system.dm" -#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" -#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -#include "code\modules\atmospherics\gasmixtures\gas_types.dm" -#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" -#include "code\modules\atmospherics\gasmixtures\reaction_factors.dm" -#include "code\modules\atmospherics\gasmixtures\reactions.dm" -*/ +// #include "code\modules\atmospherics\environmental\LINDA_fire.dm" +// #include "code\modules\atmospherics\environmental\LINDA_system.dm" +// #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" +// #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" +// #include "code\modules\atmospherics\gasmixtures\gas_types.dm" +// #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" +// #include "code\modules\atmospherics\gasmixtures\reaction_factors.dm" +// #include "code\modules\atmospherics\gasmixtures\reactions.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" #include "code\modules\atmospherics\machinery\atmosmachinery.dm" //#include "code\modules\atmospherics\machinery\bluespace_vendor.dm" @@ -2335,22 +2333,18 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\temperature_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" -/* -#include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" -#include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" -*/ +// #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" +// #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" #include "code\modules\atmospherics\rust\fusion_reactions.dm" -/* -#include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" -#include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" -#include "code\modules\atmospherics\machinery\components\fusion\hfr_fuel_datums.dm" -#include "code\modules\atmospherics\machinery\components\fusion\hfr_main_processes.dm" -#include "code\modules\atmospherics\machinery\components\fusion\hfr_parts.dm" -#include "code\modules\atmospherics\machinery\components\fusion\hfr_procs.dm" -#include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" -#include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" -#include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" -*/ +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_fuel_datums.dm" +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_main_processes.dm" +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_parts.dm" +// #include "code\modules\atmospherics\machinery\components\fusion\hfr_procs.dm" +// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" +// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" +// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" @@ -3818,11 +3812,9 @@ #include "code\modules\power\supermatter\supermatter_radiation.dm" #include "code\modules\power\tesla\coil.dm" #include "code\modules\power\tesla\energy_ball.dm" -/* -#include "code\modules\power\turbine\turbine.dm" -#include "code\modules\power\turbine\turbine_computer.dm" -#include "code\modules\power\turbine\turbine_parts.dm" -*/ +// #include "code\modules\power\turbine\turbine.dm" +// #include "code\modules\power\turbine\turbine_computer.dm" +// #include "code\modules\power\turbine\turbine_parts.dm" #include "code\modules\procedural_mapping\mapGenerator.dm" #include "code\modules\procedural_mapping\mapGeneratorModule.dm" #include "code\modules\procedural_mapping\mapGeneratorObj.dm" From 8ca70b7511b3cac8d1ddf8cb4b8dd00b78029940 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 1 Jul 2022 21:32:10 -0400 Subject: [PATCH 162/200] runtime fix --- code/modules/mob/living/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0b3de9b55b8..c3294b190c1 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ extinguish_mob() return TRUE //mob was put out, on_fire = FALSE via extinguish_mob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(!G.hasGas(GAS_OXYGEN, 1)) + if(!G?.hasGas(GAS_OXYGEN, 1)) extinguish_mob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) From 07f9b136f2e4e42aead233b8e2f57d45ba40c5f7 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Fri, 1 Jul 2022 23:22:13 -0400 Subject: [PATCH 163/200] Tries to fix knockdown, and buffs extinguisher cooling --- code/game/objects/effects/effect_system/effects_water.dm | 2 +- code/modules/atmospherics/ZAS/Airflow.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index c7e4da45759..9bfce3659f0 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -14,7 +14,7 @@ /obj/effect/particle_effect/water/Move(turf/newloc) //WOW. OKAY. THIS IS REALLY HACKY. THIS NEEDS TO BE STANDARDIZED. var/datum/gas_mixture/env = get_step(src, 0)?.return_air() - var/diff_temp = (temperature - env.temperature) / env.group_multiplier / 4 //MAGIC NUMBER ALERT!!!!!!! + var/diff_temp = (temperature - env.temperature) / env.group_multiplier / 2 //MAGIC NUMBER ALERT!!!!!!! if(abs(diff_temp) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) var/altered_temp = max(env.temperature + (ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT * diff_temp), 0) env.temperature = (diff_temp > 0) ? min(temperature, altered_temp) : max(temperature, altered_temp) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index f0db10f2d7a..6cc76ddb73f 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -44,6 +44,8 @@ This entire system is an absolute mess. return FALSE if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) //Magboots return FALSE + if(IsKnockdown()) //Uhhh maybe? + return FALSE Knockdown(zas_settings.airflow_stun * clamp((delta_p / zas_settings.airflow_stun_pressure), 1, 3)) visible_message( From 296f0c9207851645929f8d1ce224e54847157f41 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 00:19:31 -0400 Subject: [PATCH 164/200] help me debug pls --- code/modules/unit_tests/breath.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index bd3e16becab..97cde0e0658 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -67,8 +67,19 @@ to_fill.make_air() lab_rat.breathe() + var/list/reason + if(lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN)) + if(!to_fill.return_air()) + return Fail("Assertion Failed: Turf failed to return air. Type: [to_fill.type], Initial Gas: [json_encode(to_fill.initial_gas)]") - TEST_ASSERT(!lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN), "Ashwalkers can't get a full breath from the Lavaland's initial_gas on a turf") + var/datum/gas_mixture/turf_gas = to_fill.return_air() + LAZYADD(reason, "Turf mix: [json_encode(turf_gas.gas)] | T: [turf_gas.temperature] | P: [turf_gas.returnPressure()]") + + if(lab_rat.loc != to_fill) + LAZYADD(reason, "Rat was not located on it's intended turf!") + + if(reason) + return Fail("Assertion Failed: [reason.Join(";")]", __FILE__, __LINE__) /datum/unit_test/breath_sanity_ashwalker/Destroy() //Reset initial_gas to avoid future issues on other tests From f0c9001a14ec0209284567528d1dca1be8915cbf Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 14:09:23 -0400 Subject: [PATCH 165/200] "air" is now a valid label for canisers --- code/game/machinery/spaceheater.dm | 2 +- code/modules/atmospherics/machinery/portable/canister.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 59b80cbf08b..834ae74c42e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -82,7 +82,7 @@ /obj/machinery/space_heater/process_atmos() if(!on || !is_operational) - if (on) // If it's broken, turn it off too + if(on) // If it's broken, turn it off too on = FALSE return PROCESS_KILL diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c96ad8f415c..2204a2b62de 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -15,6 +15,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) GAS_ARGON = /obj/machinery/portable_atmospherics/canister/argon, GAS_CHLORINE = /obj/machinery/portable_atmospherics/canister/chlorine, GAS_NEON = /obj/machinery/portable_atmospherics/canister/neon, + "air" = /obj/machinery/portable_atmospherics/canister/air, /*"nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, "bz" = /obj/machinery/portable_atmospherics/canister/bz, "air" = /obj/machinery/portable_atmospherics/canister/air, From 1cddb4396d1ad006d95204cc12f3a9cdea36b87a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 15:04:37 -0400 Subject: [PATCH 166/200] filter changes --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- .../atmospherics/machinery/airalarm.dm | 4 ++-- .../components/trinary_devices/filter.dm | 2 +- .../machinery/portable/scrubber.dm | 2 +- code/modules/power/smes.dm | 4 ++-- tgui/packages/tgui/constants.js | 20 ++++++++++++++++++- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index aa644fe2a3e..ed6728175b6 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -309,7 +309,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //TG GASES - PLAN TO REMOVE #define GAS_PLUOXIUM "pluoxium" -GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) +GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_PLUOXIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index bd60cf57d93..a13bc6ec031 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -312,7 +312,7 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "warning_max", "selected" = selected.warning_max)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "hazard_max", "selected" = selected.hazard_max)) - for(var/gas_id in GLOB.all_gases) + for(var/gas_id in GLOB.all_gases - GAS_ALIEN) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] @@ -476,7 +476,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = GLOB.all_gases, + "set_filters" = GLOB.all_gases - GAS_ALIEN, "scrubbing" = 1, "widenet" = 1 ), signal_source) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 14c3824a143..924f2e6b9c2 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -139,7 +139,7 @@ data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - for(var/gas in GLOB.common_gases) + for(var/gas in GLOB.all_gases - GAS_ALIEN) data["filter_types"] += list(list("name" = xgm_gas_data.name[gas], "gas_id" = gas, "enabled" = (gas in filter_type))) return data diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 1d37ffebd47..063003cd82d 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -112,7 +112,7 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/gas_id in GLOB.common_gases) + for(var/gas_id in GLOB.all_gases - GAS_ALIEN) data["filter_types"] += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in scrubbing))) if(holding) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index dffba8c22a6..cbf48d67cf8 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -15,7 +15,7 @@ #define SMES_INPUT_ATTEMPT 9 /obj/machinery/power/smes - name = "power storage unit" + name = "\improper SMES unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." icon_state = "smes" density = TRUE @@ -408,7 +408,7 @@ log_smes() /obj/machinery/power/smes/engineering - charge = 2e6 // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone + charge = 5e6 // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone //ZAS supermatter takes longer to set up so you get max. output_level = 90000 /obj/machinery/power/smes/magical diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 482560f90b6..5fdf75be9a6 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -164,7 +164,7 @@ const GASES = [ 'color': 'pink', }, { - 'id': 'steam', + 'id': 'water', 'name': 'Water Vapor', 'label': 'H₂O', 'color': 'lightsteelblue', @@ -325,6 +325,24 @@ const GASES = [ 'label': 'SO₂', 'color': 'maroon', }, + { + 'id': 'nitricoxide', + 'name': 'Nitric Oxide', + 'label': 'NO', + 'color': 'maroon', + }, + { + 'id': 'deuterium', + 'name': 'Deuterium', + 'label': 'D', + 'color': 'lightgrey', + }, + { + 'id': 'tritium', + 'name': 'Tritium', + 'label': '³H', + 'color': 'limegreen', + }, ]; export const getGasLabel = (gasId, fallbackValue) => { From 1ced23150f0184b0d00824b3f09aca19692c70c2 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 15:24:12 -0400 Subject: [PATCH 167/200] Fixes pluox and tritium :) --- tgui/packages/tgui/constants.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 5fdf75be9a6..14fae459ea2 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -187,12 +187,6 @@ const GASES = [ 'label': 'Nitrodioxide', 'color': 'brown', }, - { - 'id': 'tritium', - 'name': 'Tritium', - 'label': 'Tritium', - 'color': 'limegreen', - }, { 'id': 'bz', 'name': 'BZ', @@ -202,7 +196,7 @@ const GASES = [ { 'id': 'pluox', 'name': 'Pluoxium', - 'label': 'Pluoxium', + 'label': 'O₁₆', 'color': 'mediumslateblue', }, { From bed3a58d64d5038a00e5019bee9c21bea47fb7dc Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 15:55:32 -0400 Subject: [PATCH 168/200] air alarms now have the full gas list + reordered --- code/__DEFINES/atmospherics/ZAS.dm | 27 ++++++++++++++++++- .../atmospherics/machinery/airalarm.dm | 3 +-- .../components/unary_devices/vent_scrubber.dm | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index ed6728175b6..03ddd83021f 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -309,7 +309,32 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //TG GASES - PLAN TO REMOVE #define GAS_PLUOXIUM "pluoxium" -GLOBAL_LIST_INIT(all_gases, list(GAS_OXYGEN, GAS_CO2, GAS_CO, GAS_METHYL_BROMIDE, GAS_N2O, GAS_NITROGEN, GAS_NO, GAS_METHANE, GAS_ALIEN, GAS_HYDROGEN, GAS_DEUTERIUM, GAS_TRITIUM, GAS_PLUOXIUM, GAS_HELIUM, GAS_ARGON, GAS_KRYPTON, GAS_NEON, GAS_XENON, GAS_AMMONIA, GAS_CHLORINE, GAS_SULFUR, GAS_STEAM, GAS_PLASMA)) +///All gases in the game. The sorting of UIs like scrubbers will match this, so keep that in mind. +GLOBAL_LIST_INIT(all_gases, list( + GAS_ALIEN, + GAS_OXYGEN, + GAS_NITROGEN, + GAS_CO2, + GAS_N2O, + GAS_PLASMA, + GAS_STEAM, + GAS_HYDROGEN, + GAS_DEUTERIUM, + GAS_TRITIUM, + GAS_PLUOXIUM, + GAS_HELIUM, + GAS_ARGON, + GAS_KRYPTON, + GAS_NEON, + GAS_XENON, + GAS_AMMONIA, + GAS_CHLORINE, + GAS_SULFUR, + GAS_METHANE, + GAS_CO, + GAS_NO, + GAS_METHYL_BROMIDE, +)) GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index a13bc6ec031..c10a2a19e3e 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -967,8 +967,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) "Temperature" = "temperature" ) - for(var/gas_id in GLOB.common_gases) - //component_options[GLOB.meta_gas_info[gas_id][META_GAS_NAME]] = gas_id2path(gas_id) + for(var/gas_id in GLOB.all_gases) component_options |= gas_id air_alarm_options = add_option_port("Air Alarm Options", component_options) options_map = component_options diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 48e0e854e5f..7c02ca7b2b4 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -165,7 +165,7 @@ return FALSE var/list/f_types = list() - for(var/gas_id in GLOB.common_gases) + for(var/gas_id in GLOB.all_gases - GAS_ALIEN) f_types += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in filter_types))) var/datum/signal/signal = new(list( From e99cdc143155435bb13464ef40ec8b40291b629a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 16:05:05 -0400 Subject: [PATCH 169/200] Re-orders common gas list --- code/__DEFINES/atmospherics/ZAS.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 03ddd83021f..648fa9551cf 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -335,7 +335,7 @@ GLOBAL_LIST_INIT(all_gases, list( GAS_NO, GAS_METHYL_BROMIDE, )) -GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_CO2, GAS_N2O, GAS_PLASMA, GAS_NITROGEN)) +GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_NITROGEN, GAS_CO2, GAS_N2O, GAS_PLASMA,)) GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir From e3bd197d07d64b1949667b2ebacfae1f8400213b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 16:09:29 -0400 Subject: [PATCH 170/200] Makes deuterium isotope 2 --- tgui/packages/tgui/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 14fae459ea2..e7cb7a320da 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -328,7 +328,7 @@ const GASES = [ { 'id': 'deuterium', 'name': 'Deuterium', - 'label': 'D', + 'label': '²H', 'color': 'lightgrey', }, { From 25d1d235d0691fde3cfb4a731b579113a33f35e1 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:59:13 -0400 Subject: [PATCH 171/200] vent and scrubber controls now reset hibernation --- .../machinery/components/unary_devices/vent_pump.dm | 2 ++ .../machinery/components/unary_devices/vent_scrubber.dm | 1 + 2 files changed, 3 insertions(+) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index bc90b48e88e..f3ad7ace8e2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -212,6 +212,8 @@ if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return + COOLDOWN_RESET(src, hibernating) + var/atom/signal_sender = signal.data["user"] if("purge" in signal.data) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 7c02ca7b2b4..dcfccb507e0 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -292,6 +292,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return + COOLDOWN_RESET(src, hibernating) var/old_widenet = widenet var/old_scrubbing = scrubbing From 63f4312741d7291ab6a5d6e9172b295c0fc2d708 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 2 Jul 2022 22:10:46 -0400 Subject: [PATCH 172/200] Fixes portable scrubbers, changes to air alarms --- .../atmospherics/ZAS/atmos_primitives.dm | 10 ----- .../atmospherics/machinery/airalarm.dm | 20 ++++----- .../components/unary_devices/vent_scrubber.dm | 44 +++++++------------ .../machinery/portable/scrubber.dm | 26 ++++------- .../tgui/interfaces/common/AtmosControls.js | 12 ++--- 5 files changed, 40 insertions(+), 72 deletions(-) diff --git a/code/modules/atmospherics/ZAS/atmos_primitives.dm b/code/modules/atmospherics/ZAS/atmos_primitives.dm index 2e49450a19c..161d371ef7e 100644 --- a/code/modules/atmospherics/ZAS/atmos_primitives.dm +++ b/code/modules/atmospherics/ZAS/atmos_primitives.dm @@ -150,16 +150,6 @@ if (total_transfer_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing return -1 - /* - //Update flow rate var - if (istype(M, /obj/machinery/atmospherics)) - var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - if (istype(M, /obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here - */ - var/power_draw = 0 for (var/g in filtering) var/transfer_moles = source.gas[g] diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index c10a2a19e3e..c0878c0cbfa 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -53,12 +53,12 @@ #define AALARM_MODE_SCRUBBING 1 #define AALARM_MODE_VENTING 2 //makes draught -#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables widenet) +#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables quicksucc) #define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing #define AALARM_MODE_OFF 5 #define AALARM_MODE_FLOOD 6 //Emagged mode; turns off scrubbers and pressure checks on vents #define AALARM_MODE_SIPHON 7 //Scrubbers suck air -#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing. +#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and quicksucc scrubbing. #define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output #define AALARM_REPORT_TIMEOUT 100 @@ -279,7 +279,7 @@ "long_name" = sanitize(long_name), "power" = info["power"], "scrubbing" = info["scrubbing"], - "widenet" = info["widenet"], + "quicksucc" = info["quicksucc"], "filter_types" = info["filter_types"] )) data["mode"] = mode @@ -338,7 +338,7 @@ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE - if("power", "toggle_filter", "widenet", "scrubbing", "direction") + if("power", "toggle_filter", "quicksucc", "scrubbing", "direction") send_signal(device_id, list("[action]" = params["val"]), usr) . = TRUE if("excheck") @@ -464,7 +464,7 @@ "power" = 1, "set_filters" = list(GAS_CO2), "scrubbing" = 1, - "widenet" = 0 + "quicksucc" = 0 ), signal_source) for(var/device_id in my_area.air_vent_info) send_signal(device_id, list( @@ -478,7 +478,7 @@ "power" = 1, "set_filters" = GLOB.all_gases - GAS_ALIEN, "scrubbing" = 1, - "widenet" = 1 + "quicksucc" = 1 ), signal_source) for(var/device_id in my_area.air_vent_info) send_signal(device_id, list( @@ -490,7 +490,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "widenet" = 0, + "quicksucc" = 0, "scrubbing" = 0 ), signal_source) for(var/device_id in my_area.air_vent_info) @@ -505,7 +505,7 @@ "power" = 1, "set_filters" = list(GAS_CO2), "scrubbing" = 1, - "widenet" = 0 + "quicksucc" = 0 ), signal_source) for(var/device_id in my_area.air_vent_info) send_signal(device_id, list( @@ -518,7 +518,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "widenet" = 1, + "quicksucc" = 1, "scrubbing" = 0 ), signal_source) for(var/device_id in my_area.air_vent_info) @@ -529,7 +529,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "widenet" = 0, + "quicksucc" = 0, "scrubbing" = 0 ), signal_source) for(var/device_id in my_area.air_vent_info) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index dcfccb507e0..98161a8c20d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -24,10 +24,8 @@ var/list/filter_types = list(GAS_CO2) ///Rate of the scrubber to remove gases from the air var/volume_rate = 200 - ///is this scrubber acting on the 3x3 area around it. - var/widenet = FALSE - ///List of the turfs near the scrubber, used for widenet - var/list/turf/adjacent_turfs = list() + ///A fast-siphon toggle, siphons at 9x speed for 9x the power cost. + var/quicksucc = FALSE ///Frequency id for connecting to the NTNet var/frequency = FREQ_ATMOS_CONTROL @@ -59,7 +57,6 @@ SSradio.remove_object(src,frequency) radio_connection = null - adjacent_turfs.Cut() SSairmachines.stop_processing_machine(src) return ..() @@ -142,13 +139,13 @@ return if(!COOLDOWN_FINISHED(src, hibernating)) - if(widenet) + if(quicksucc) icon_state = "scrub_wide_hibernating" else icon_state = "scrub_hibernating" else if(scrubbing & SCRUBBING) - if(widenet) + if(quicksucc) icon_state = "scrub_wide" else icon_state = "scrub_on" @@ -175,7 +172,7 @@ "timestamp" = world.time, "power" = on, "scrubbing" = scrubbing, - "widenet" = widenet, + "quicksucc" = quicksucc, "filter_types" = f_types, "sigtype" = "status" )) @@ -205,7 +202,6 @@ if(frequency) set_frequency(frequency) broadcast_status() - check_turfs() . = ..() /obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos() @@ -221,10 +217,9 @@ var/should_cooldown = TRUE if(scrub(us)) should_cooldown = FALSE - if(widenet) - check_turfs() - for(var/turf/tile in adjacent_turfs) - if(scrub(tile) && should_cooldown) + if(quicksucc) + for(var/i in 1 to 9) //quicksucc is actually now just "fast mode" + if(scrub(us)) should_cooldown = FALSE if(should_cooldown) COOLDOWN_START(src, hibernating, 15 SECONDS) @@ -282,19 +277,12 @@ #undef MINIMUM_MOLES_TO_SCRUB -///we populate a list of turfs with nonatmos-blocked cardinal turfs AND -/// diagonal turfs that can share atmos with *both* of the cardinal turfs -/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/check_turfs() - adjacent_turfs.Cut() - var/turf/local_turf = get_turf(src) - adjacent_turfs = get_adjacent_open_turfs(local_turf) - /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return COOLDOWN_RESET(src, hibernating) - var/old_widenet = widenet + var/old_quicksucc = quicksucc var/old_scrubbing = scrubbing var/old_filter_length = length(filter_types) @@ -308,10 +296,10 @@ if("power_toggle" in signal.data) on = !on - if("widenet" in signal.data) - widenet = text2num(signal.data["widenet"]) - if("toggle_widenet" in signal.data) - widenet = !widenet + if("quicksucc" in signal.data) + quicksucc = text2num(signal.data["quicksucc"]) + if("toggle_quicksucc" in signal.data) + quicksucc = !quicksucc if("scrubbing" in signal.data) scrubbing = text2num(signal.data["scrubbing"]) @@ -340,7 +328,7 @@ update_appearance() - if(length(filter_types) == old_filter_length && old_scrubbing == scrubbing && old_widenet == widenet) + if(length(filter_types) == old_filter_length && old_scrubbing == scrubbing && old_quicksucc == quicksucc) return idle_power_usage = initial(idle_power_usage) @@ -354,8 +342,8 @@ new_power_usage = active_power_usage update_use_power(ACTIVE_POWER_USE) - if(widenet) - new_power_usage += new_power_usage * (length(adjacent_turfs) * (length(adjacent_turfs) / 2)) + if(quicksucc) + new_power_usage += new_power_usage * 9 update_mode_power_usage(scrubbing == SCRUBBING ? IDLE_POWER_USE : ACTIVE_POWER_USE, new_power_usage) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 063003cd82d..843f00d1819 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -18,12 +18,11 @@ ///Should the machine use overlay in update_overlays() when open/close? var/use_overlays = TRUE var/power_rating = 7500 - ///List of gases that can be scrubbed - var/list/scrubbing = list( - GAS_PLASMA, - GAS_CO2, - GAS_N2O, - ) + ///List of gases that are being scrubbed. + var/list/scrubbing = list() + +/obj/machinery/portable_atmospherics/scrubber/Initialize(mapload) + . = ..() /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) @@ -69,23 +68,14 @@ * * mixture: the gas mixture to be scrubbed */ /obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture) - if(air_contents.returnPressure() >= overpressure_m * ONE_ATMOSPHERE) + if(!mixture.total_moles || !length(scrubbing)) return - if(!mixture.total_moles) + if(air_contents.returnPressure() >= overpressure_m * ONE_ATMOSPHERE) return var/transfer_moles = min(1, volume_rate/mixture.volume)*mixture.total_moles - var/datum/gas_mixture/gas2scrub = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - - if(!scrubbing) - return - - scrub_gas(scrubbing, gas2scrub, air_contents, transfer_moles, power_rating) - /* - if(!holding) - air_update_turf(FALSE, FALSE) - */ + scrub_gas(scrubbing, mixture, air_contents, transfer_moles, power_rating) /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) . = ..() diff --git a/tgui/packages/tgui/interfaces/common/AtmosControls.js b/tgui/packages/tgui/interfaces/common/AtmosControls.js index fcca00188ab..cfa167bf821 100644 --- a/tgui/packages/tgui/interfaces/common/AtmosControls.js +++ b/tgui/packages/tgui/interfaces/common/AtmosControls.js @@ -120,7 +120,7 @@ export const Scrubber = (props, context) => { power, scrubbing, id_tag, - widenet, + quicksucc, filter_types, } = scrubber; return ( @@ -148,12 +148,12 @@ export const Scrubber = (props, context) => { val: Number(!scrubbing), })} /> <Button - icon={widenet ? 'expand' : 'compress'} - selected={widenet} - content={widenet ? 'Expanded range' : 'Normal range'} - onClick={() => act('widenet', { + icon={quicksucc ? 'expand' : 'compress'} + selected={quicksucc} + content={quicksucc ? 'Fast Siphon' : 'Standard Siphon'} + onClick={() => act('quicksucc', { id_tag, - val: Number(!widenet), + val: Number(!quicksucc), })} /> </LabeledList.Item> <LabeledList.Item label="Filters"> From 894370d8c4dd45b7fc02b0967ac656cfcba0fe43 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:30:23 -0400 Subject: [PATCH 173/200] Explosion pass --- code/_globalvars/configuration.dm | 10 ------ .../configuration/entries/game_options.dm | 8 ++--- code/controllers/subsystem/explosions.dm | 24 +++++++------- code/game/objects/items/tanks/tanks.dm | 8 ++--- code/modules/admin/admin_verbs.dm | 25 ++++++++------- code/modules/admin/verbs/secrets.dm | 10 +++--- code/modules/atmospherics/ZAS/ZAS_Settings.dm | 32 +++++++++++++++++-- code/modules/cargo/centcom_podlauncher.dm | 2 +- .../projectiles/guns/special/blastcannon.dm | 4 +-- .../projectile/bullets/cannonball.dm | 2 +- .../research/anomaly/anomaly_refinery.dm | 8 ++--- config/game_options.txt | 2 +- 12 files changed, 74 insertions(+), 61 deletions(-) diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 67e67ac051b..159be647d7b 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -24,14 +24,4 @@ GLOBAL_VAR_INIT(Debug2, FALSE) //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage //Protecting these because the proper way to edit them is with the config/secrets -GLOBAL_VAR_INIT(MAX_EX_DEVESTATION_RANGE, 3) -GLOBAL_PROTECT(MAX_EX_DEVESTATION_RANGE) -GLOBAL_VAR_INIT(MAX_EX_HEAVY_RANGE, 7) -GLOBAL_PROTECT(MAX_EX_HEAVY_RANGE) -GLOBAL_VAR_INIT(MAX_EX_LIGHT_RANGE, 14) -GLOBAL_PROTECT(MAX_EX_LIGHT_RANGE) -GLOBAL_VAR_INIT(MAX_EX_FLASH_RANGE, 14) -GLOBAL_PROTECT(MAX_EX_FLASH_RANGE) -GLOBAL_VAR_INIT(MAX_EX_FLAME_RANGE, 14) -GLOBAL_PROTECT(MAX_EX_FLAME_RANGE) GLOBAL_VAR_INIT(DYN_EX_SCALE, 0.5) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 65d0ad8bb2e..2e20b1ac00d 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -345,17 +345,13 @@ min_val = 0 /datum/config_entry/number/bombcap - default = 14 + default = 16 min_val = 4 /datum/config_entry/number/bombcap/ValidateAndSet(str_val) . = ..() if(.) - GLOB.MAX_EX_DEVESTATION_RANGE = round(config_entry_value / 4) - GLOB.MAX_EX_HEAVY_RANGE = round(config_entry_value / 2) - GLOB.MAX_EX_LIGHT_RANGE = config_entry_value - GLOB.MAX_EX_FLASH_RANGE = config_entry_value - GLOB.MAX_EX_FLAME_RANGE = config_entry_value + zas_settings.set_bomb_cap(text2num(str_val)) /datum/config_entry/number/emergency_shuttle_autocall_threshold min_val = 0 diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 0ca718862ca..ed3b6834322 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -182,7 +182,7 @@ SUBSYSTEM_DEF(explosions) return var/range = 0 range = round((2 * power)**GLOB.DYN_EX_SCALE) - explosion(epicenter, devastation_range = round(range * 0.25), heavy_impact_range = round(range * 0.5), light_impact_range = round(range), flame_range = flame_range*range, flash_range = flash_range*range, adminlog = adminlog, ignorecap = ignorecap, silent = silent, smoke = smoke, explosion_cause = explosion_cause) + return explosion(epicenter, devastation_range = round(range * 0.25), heavy_impact_range = round(range * 0.5), light_impact_range = round(range), flame_range = flame_range*range, flash_range = flash_range*range, adminlog = adminlog, ignorecap = ignorecap, silent = silent, smoke = smoke, explosion_cause = explosion_cause) @@ -238,12 +238,12 @@ SUBSYSTEM_DEF(explosions) ) var/atom/location = isturf(origin) ? origin : origin.loc if(SEND_SIGNAL(origin, COMSIG_ATOM_EXPLODE, arguments) & COMSIG_CANCEL_EXPLOSION) - return // Signals are incompatible with `arglist(...)` so we can't actually use that for these. Additionally, + return COMSIG_CANCEL_EXPLOSION // Signals are incompatible with `arglist(...)` so we can't actually use that for these. Additionally, while(location) var/next_loc = location.loc if(SEND_SIGNAL(location, COMSIG_ATOM_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) - return + return COMSIG_CANCEL_EXPLOSION if(isturf(location)) break location = next_loc @@ -253,7 +253,7 @@ SUBSYSTEM_DEF(explosions) var/area/epicenter_area = get_area(location) if(SEND_SIGNAL(epicenter_area, COMSIG_AREA_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) - return + return COMSIG_CANCEL_EXPLOSION arguments -= EXARG_KEY_ORIGIN @@ -303,11 +303,11 @@ SUBSYSTEM_DEF(explosions) cap_multiplier = 1 if(!ignorecap) - devastation_range = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, devastation_range) - heavy_impact_range = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, heavy_impact_range) - light_impact_range = min(GLOB.MAX_EX_LIGHT_RANGE * cap_multiplier, light_impact_range) - flash_range = min(GLOB.MAX_EX_FLASH_RANGE * cap_multiplier, flash_range) - flame_range = min(GLOB.MAX_EX_FLAME_RANGE * cap_multiplier, flame_range) + devastation_range = min(zas_settings.maxex_devastation_range * cap_multiplier, devastation_range) + heavy_impact_range = min(zas_settings.maxex_heavy_range * cap_multiplier, heavy_impact_range) + light_impact_range = min(zas_settings.maxex_light_range * cap_multiplier, light_impact_range) + flash_range = min(zas_settings.maxex_flash_range * cap_multiplier, flash_range) + flame_range = min(zas_settings.maxex_fire_range * cap_multiplier, flame_range) var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) var/started_at = REALTIMEOFDAY @@ -669,10 +669,8 @@ SUBSYSTEM_DEF(explosions) var/list/flame_turf = flameturf flameturf = list() for(var/thing in flame_turf) - if(thing) - var/turf/T = thing - //new /obj/effect/hotspot(T) //Mostly for ambience! - T.create_fire(2, 25) + var/turf/T = thing + T.create_fire(2, rand(5, 20)) cost_flameturf = MC_AVERAGE(cost_flameturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if (low_turf.len || med_turf.len || high_turf.len) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index fa8c22424cb..6e47c2f618f 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -347,10 +347,10 @@ log_atmos("[type] exploded with a power of [strength * mult] and a mix of ", air_contents) explosion( src, - round(min(BOMBCAP_DVSTN_RADIUS, ((mult)*strength)*0.15)), - round(min(BOMBCAP_HEAVY_RADIUS, ((mult)*strength)*0.35)), - round(min(BOMBCAP_LIGHT_RADIUS, ((mult)*strength)*0.80)), - round(min(BOMBCAP_FLASH_RADIUS, ((mult)*strength)*1.20)), + round(mult*strength*0.15), + round(mult*strength*0.35), + round(mult*strength*0.80), + round(mult*strength*1.20), ) var/num_fragments = round(rand(8,10) * sqrt(strength * mult)) ///Holy. Fucking. Shit. This is AGONIZING. Give me /obj/proc/fragmentate() PLEASE. diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4bd9e298d4a..7d1b17eebc7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -528,35 +528,38 @@ GLOBAL_PROTECT(admin_verbs_hideable) set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." - var/list/choices = list("Small Bomb (1, 2, 3, 3)", "Medium Bomb (2, 3, 4, 4)", "Big Bomb (3, 5, 7, 5)", "Maxcap", "Custom Bomb") + var/list/choices = list("Small Bomb (1, 2, 3, 0, 3)", "Medium Bomb (1, 2, 3, 0, 3)", "Big Bomb (3, 5, 7, 0, 5)", "Maxcap (4, 8, 16, 16, 20 by default)", "Custom Bomb") var/choice = tgui_input_list(src, "What size explosion would you like to produce? NOTE: You can do all this rapidly and in an IC manner (using cruise missiles!) with the Config/Launch Supplypod verb. WARNING: These ignore the maxcap", "Drop Bomb", choices) if(isnull(choice)) return var/turf/epicenter = mob.loc switch(choice) - if("Small Bomb (1, 2, 3, 3)") + if("Small Bomb (1, 2, 3, 0, 3)") explosion(epicenter, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 3, flash_range = 3, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) - if("Medium Bomb (2, 3, 4, 4)") + if("Medium Bomb (1, 2, 3, 0, 3)") explosion(epicenter, devastation_range = 2, heavy_impact_range = 3, light_impact_range = 4, flash_range = 4, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) - if("Big Bomb (3, 5, 7, 5)") + if("Big Bomb (3, 5, 7, 0, 5)") explosion(epicenter, devastation_range = 3, heavy_impact_range = 5, light_impact_range = 7, flash_range = 5, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) - if("Maxcap") - explosion(epicenter, devastation_range = GLOB.MAX_EX_DEVESTATION_RANGE, heavy_impact_range = GLOB.MAX_EX_HEAVY_RANGE, light_impact_range = GLOB.MAX_EX_LIGHT_RANGE, flash_range = GLOB.MAX_EX_FLASH_RANGE, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) + if("Maxcap (4, 8, 16, 16, 20 by default)") + explosion(epicenter, devastation_range = zas_settings.maxex_devastation_range, heavy_impact_range = zas_settings.maxex_heavy_range, light_impact_range = zas_settings.maxex_light_range, flame_range = zas_settings.maxex_fire_range, flash_range = zas_settings.maxex_flash_range, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) if("Custom Bomb") var/range_devastation = input("Devastation range (in tiles):") as null|num - if(range_devastation == null) + if(isnull(range_devastation)) return var/range_heavy = input("Heavy impact range (in tiles):") as null|num - if(range_heavy == null) + if(isnull(range_heavy)) return var/range_light = input("Light impact range (in tiles):") as null|num - if(range_light == null) + if(isnull(range_light)) + return + var/range_flame = input("Flame range (in tiles):") as null|num + if(isnull(range_flame)) return var/range_flash = input("Flash range (in tiles):") as null|num - if(range_flash == null) + if(isnull(range_flash)) return - if(range_devastation > GLOB.MAX_EX_DEVESTATION_RANGE || range_heavy > GLOB.MAX_EX_HEAVY_RANGE || range_light > GLOB.MAX_EX_LIGHT_RANGE || range_flash > GLOB.MAX_EX_FLASH_RANGE) + if(range_devastation > zas_settings.maxex_devastation_range || range_heavy > zas_settings.maxex_heavy_range || range_light > zas_settings.maxex_light_range || range_flash > zas_settings.maxex_flash_range || range_flame > zas_settings.maxex_fire_range) if(tgui_alert(usr, "Bomb is bigger than the maxcap. Continue?",,list("Yes","No")) != "Yes") return epicenter = mob.loc //We need to reupdate as they may have moved again diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 427dc6f577b..62e5fde8552 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -451,12 +451,12 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Bomb Cap")) - var/newBombCap = input(holder,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null - if (!CONFIG_SET(number/bombcap, newBombCap)) + var/newBombCap = input(holder,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", zas_settings.maxex_light_range) as num|null + if(!newBombCap) return - - message_admins(span_boldannounce("[key_name_admin(holder)] changed the bomb cap to [GLOB.MAX_EX_DEVESTATION_RANGE], [GLOB.MAX_EX_HEAVY_RANGE], [GLOB.MAX_EX_LIGHT_RANGE]")) - log_admin("[key_name(holder)] changed the bomb cap to [GLOB.MAX_EX_DEVESTATION_RANGE], [GLOB.MAX_EX_HEAVY_RANGE], [GLOB.MAX_EX_LIGHT_RANGE]") + zas_settings.set_bomb_cap(newBombCap) + message_admins(span_boldannounce("[key_name_admin(holder)] changed the bomb cap to [zas_settings.maxex_devastation_range], [zas_settings.maxex_heavy_range], [zas_settings.maxex_light_range], [zas_settings.maxex_fire_range], [zas_settings.maxex_flash_range]")) + log_admin("[key_name_admin(holder)] changed the bomb cap to [zas_settings.maxex_devastation_range], [zas_settings.maxex_heavy_range], [zas_settings.maxex_light_range], [zas_settings.maxex_fire_range], [zas_settings.maxex_flash_range]") //buttons that are fun for exactly you and nobody else. if("monkey") if(!is_funmin) diff --git a/code/modules/atmospherics/ZAS/ZAS_Settings.dm b/code/modules/atmospherics/ZAS/ZAS_Settings.dm index 53891545cc3..159d54a52e6 100644 --- a/code/modules/atmospherics/ZAS/ZAS_Settings.dm +++ b/code/modules/atmospherics/ZAS/ZAS_Settings.dm @@ -74,6 +74,32 @@ var/connection_temperature_delta_NAME = "Connections - Temperature Difference" var/connection_temperature_delta_DESC = "The smallest temperature difference which will cause heat to travel through doors." - var/max_explosion_range = 14 - var/max_explosion_range_NAME = "TTV Explosion Range Maximum" - var/max_explosion_range_DESC = "What it says on the tin" + var/maxex_devastation_range = 4 + var/max_explosion_range_NAME = "Explosion Devastation Range" + var/max_explosion_range_DESC = "By default, 1/4th of fire range." + + var/maxex_heavy_range = 8 + var/max_heavy_range_NAME = "Explosion Heavy Range" + var/max_heavy_range_DESC = "By default, 1/2 of light range" + + var/maxex_light_range = 16 + var/max_light_range_NAME = "Explosion Light Range" + var/max_light_range_DESC = "By default, this is the baseline for other explosion values." + + var/maxex_fire_range = 16 + var/max_fire_range_NAME = "Explosion Fire Range" + var/max_fire_range_DESC = "By default, equal to light range." + + var/maxex_flash_range = 20 + var/max_flash_range_NAME = "Explosion Flash Range" + var/max_flash_range_DESC = "By default, 5/4ths of light range." + +/datum/zas_controller/proc/set_bomb_cap(val) + if(!isnum(val)) + CRASH("Non-number given to set_bomb_cap.") + + maxex_devastation_range = val/4 + maxex_heavy_range = val/2 + maxex_light_range = val + maxex_fire_range = val + maxex_flash_range = val*1.2 diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 52eb1611bae..c2fd281e86f 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -301,7 +301,7 @@ temp_pod.explosionSize = list(0,0,0,0) return explosionChoice = 2 - temp_pod.explosionSize = list(GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE,GLOB.MAX_EX_FLAME_RANGE) //Set explosion to max cap of server + temp_pod.explosionSize = list(zas_settings.maxex_devastation_range, zas_settings.maxex_heavy_range, zas_settings.maxex_light_range, zas_settings.maxex_fire_range) //Set explosion to max cap of server . = TRUE if("damageCustom") //Deals damage to whoevers under the pod when it lands if (damageChoice == 1) //If already doing custom damage, set back to default (no damage) diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 3596105c4d3..3443d68b7f7 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -189,8 +189,8 @@ var/cap_multiplier = SSmapping.level_trait(start_turf.z, ZTRAIT_BOMBCAP_MULTIPLIER) if(isnull(cap_multiplier)) cap_multiplier = 1 - var/capped_heavy = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, heavy) - var/capped_medium = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, medium) + var/capped_heavy = min(zas_settings.maxex_devastation_range * cap_multiplier, heavy) + var/capped_medium = min(zas_settings.maxex_heavy_range * cap_multiplier, medium) SSexplosions.shake_the_room(start_turf, max(heavy, medium, light, 0), (capped_heavy * 15) + (capped_medium * 20), capped_heavy, capped_medium) var/obj/projectile/blastwave/blastwave = new(loc, heavy, medium, light) diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 587e1a2e99d..eadaf11564a 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -55,7 +55,7 @@ /obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = FALSE) if(projectile_piercing == NONE) - explosion(target, devastation_range = GLOB.MAX_EX_DEVESTATION_RANGE, heavy_impact_range = GLOB.MAX_EX_HEAVY_RANGE, light_impact_range = GLOB.MAX_EX_LIGHT_RANGE, flash_range = GLOB.MAX_EX_FLASH_RANGE, explosion_cause = src) + explosion(target,devastation_range = zas_settings.maxex_devastation_range, heavy_impact_range = zas_settings.maxex_heavy_range, light_impact_range = zas_settings.maxex_light_range, flash_range = zas_settings.maxex_flash_range, explosion_cause = src) . = ..() /obj/projectile/bullet/cannonball/trashball diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm index 5d70b73af31..a2de260fc3f 100644 --- a/code/modules/research/anomaly/anomaly_refinery.dm +++ b/code/modules/research/anomaly/anomaly_refinery.dm @@ -1,5 +1,5 @@ -#define MAX_RADIUS_REQUIRED 20 //maxcap -#define MIN_RADIUS_REQUIRED 4 //1, 2, 4 +#define MAX_RADIUS_REQUIRED zas_settings.maxex_light_range //maxcap +#define MIN_RADIUS_REQUIRED zas_settings.maxex_light_range/5 //1, 2, 4 /// How long the compression test can last before the machine just gives up and ejects the items. #define COMPRESSION_TEST_TIME (SSOBJ_DT SECONDS * 5) @@ -216,8 +216,8 @@ var/cap_multiplier = SSmapping.level_trait(location.z, ZTRAIT_BOMBCAP_MULTIPLIER) if(isnull(cap_multiplier)) cap_multiplier = 1 - var/capped_heavy = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, heavy) - var/capped_medium = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, medium) + var/capped_heavy = min(zas_settings.maxex_devastation_range * cap_multiplier, heavy) + var/capped_medium = min(zas_settings.maxex_heavy_range * cap_multiplier, medium) SSexplosions.shake_the_room(location, explosion_range, (capped_heavy * 15) + (capped_medium * 20), capped_heavy, capped_medium) if(explosion_range < required_range) diff --git a/config/game_options.txt b/config/game_options.txt index 0d246725aec..5777c639830 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -403,7 +403,7 @@ REACTIONARY_EXPLOSIONS ## eg: If you give the number 20. The bomb cap will be 5,10,20. ## Can be any number above 4, some examples are provided below. -## Small (3, 7, 14) +## Small (4, 8, 16) #BOMBCAP 14 ## Default (5, 10, 20) (recommended if you enable REACTIONARY_EXPLOSIONS above) BOMBCAP 20 From ae8dba35f09761f34da470f82682f0ade8f1d906 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 02:00:22 -0400 Subject: [PATCH 174/200] Fixes --- code/__DEFINES/atmospherics/ZAS.dm | 4 +++- code/modules/atmospherics/ZAS/Fire.dm | 12 +++++++----- code/modules/holodeck/turfs.dm | 4 ++-- .../living/simple_animal/hostile/megafauna/drake.dm | 7 +++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 648fa9551cf..a353a86a993 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -258,7 +258,9 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) /// the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS list(GAS_OXYGEN = MOLES_O2STANDARD, GAS_NITROGEN=MOLES_N2STANDARD) #define OPENTURF_LOW_PRESSURE list(GAS_OXYGEN = 14, GAS_NITROGEN = 30) -//#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" + +///A long and hot fire +#define BURNMIX_ATMOS list(GAS_OXYGEN = 2500, GAS_PLASMA = 5000); temperature = PHORON_FLASHPOINT /// -193,15°C telecommunications. also used for xenobiology slime killrooms #define TCOMMS_ATMOS list(GAS_NITROGEN = 100) //#define TCOMMS_ATMOS "n2=100;TEMP=80" diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 46fb1b18a3f..ee4155e2238 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -92,7 +92,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin qdel(T.fire) qdel(fuel) -/turf/proc/create_fire(fl) +///Creates a fire with firelevel (fl). If create_own_fuel is given, it will create that many units of welding fuel on the turf. +/turf/proc/create_fire(fl, create_own_fuel) return 0 /turf/open/create_fire(fl, create_own_fuel) @@ -100,10 +101,10 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return if(fire) fire.firelevel = max(fl, fire.firelevel) - return 1 + return if(!zone) - return 1 + return fire = new(src, fl) SSzas.active_fire_zones |= zone @@ -117,9 +118,10 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin fuel.reagent_amount += create_own_fuel zone.fire_tiles |= src - if(fuel) zone.fuel_objs += fuel + if(fuel) + zone.fuel_objs += fuel - return 0 + return src /turf/open/space/create_fire() return diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 2ba223ac489..78fce7e403d 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -51,8 +51,8 @@ /turf/open/floor/holofloor/plating/burnmix name = "burn-mix floor" - // initial_gas = BURNMIX_ATMOS - //TODO: cause warcrimes later + initial_gas = BURNMIX_ATMOS + /turf/open/floor/holofloor/grass gender = PLURAL name = "lush grass" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 8a64375ef8e..89059e8828a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -183,10 +183,9 @@ for(var/turf/T in turfs) if(istype(T, /turf/closed)) break - //var/obj/effect/hotspot/drake_fire_hotspot = new /obj/effect/hotspot(T) - T.create_fire(1, 10) - var/obj/effect/hotspot/drake_fire_hotspot = locate() in T - if(frozen) + + var/obj/effect/hotspot/drake_fire_hotspot = T.create_fire(1, 10) + if(frozen && drake_fire_hotspot) drake_fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) T.hotspot_expose(DRAKE_FIRE_TEMP,DRAKE_FIRE_EXPOSURE,1) for(var/mob/living/L in T.contents) From 6265406ae8ea6ea1913ea30edf9bb849fb868aa5 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 14:17:25 -0400 Subject: [PATCH 175/200] Fixes atmozphere program. fuck js --- code/__HELPERS/atmospherics.dm | 3 +-- .../file_system/programs/atmosscan.dm | 2 +- tgui/packages/tgui/interfaces/GasAnalyzer.tsx | 9 -------- .../tgui/interfaces/common/AtmosHandbook.tsx | 22 ------------------- .../tgui/interfaces/common/GasmixParser.tsx | 2 -- 5 files changed, 2 insertions(+), 36 deletions(-) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index f1a1aeb8c48..2ba039a1b1a 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -31,7 +31,6 @@ /proc/gas_mixture_parser(datum/gas_mixture/gasmix, name) . = list( "gases" = list(), - "reactions" = list(), "name" = name, "total_moles" = null, "temperature" = null, @@ -47,7 +46,7 @@ xgm_gas_data.name[gas_path], gasmix.gas[gas_path], )) - .["total_moles"] = gasmix.get_moles() + .["total_moles"] = gasmix.total_moles .["temperature"] = gasmix.temperature .["volume"] = gasmix.volume .["pressure"] = gasmix.returnPressure() diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index fe744c72ecf..50c1e27aee5 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -16,7 +16,7 @@ to_chat(user, span_warning("\The [computer] flashes an error: \"hardware\\sensorpackage\\startup.bin -- file not found\".")) /datum/computer_file/program/atmosscan/ui_static_data(mob/user) - return //return_atmos_handbooks() + return /datum/computer_file/program/atmosscan/ui_data(mob/user) var/list/data = get_header_data() diff --git a/tgui/packages/tgui/interfaces/GasAnalyzer.tsx b/tgui/packages/tgui/interfaces/GasAnalyzer.tsx index 96695edc2c5..84f8ac654a8 100644 --- a/tgui/packages/tgui/interfaces/GasAnalyzer.tsx +++ b/tgui/packages/tgui/interfaces/GasAnalyzer.tsx @@ -1,29 +1,21 @@ import { useBackend } from '../backend'; import { GasmixParser } from './common/GasmixParser'; import type { Gasmix } from './common/GasmixParser'; -import { - AtmosHandbookContent, - atmosHandbookHooks, -} from './common/AtmosHandbook'; import { Window } from '../layouts'; import { Section } from '../components'; export const GasAnalyzerContent = (props, context) => { const { act, data } = useBackend<{ gasmixes: Gasmix[] }>(context); const { gasmixes } = data; - const [setActiveGasId, setActiveReactionId] = atmosHandbookHooks(context); return ( <> {gasmixes.map((gasmix) => ( <Section title={gasmix.name} key={gasmix.reference}> <GasmixParser gasmix={gasmix} - gasesOnClick={setActiveGasId} - reactionOnClick={setActiveReactionId} /> </Section> ))} - <AtmosHandbookContent vertical /> </> ); }; @@ -37,4 +29,3 @@ export const GasAnalyzer = (props, context) => { </Window> ); }; - \ No newline at end of file diff --git a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx index a423fae5078..4e15a0d8a89 100644 --- a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx +++ b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx @@ -7,7 +7,6 @@ import { Input, LabeledList, Section, - Stack, Tooltip, } from '../../components'; @@ -208,27 +207,6 @@ const ReactionHandbook = (props, context) => { ); }; -export const AtmosHandbookContent = ( - props: { vertical?: boolean }, - context -) => { - return props.vertical ? ( - <> - <GasHandbook /> - <ReactionHandbook /> - </> - ) : ( - <Stack> - <Stack.Item grow> - <ReactionHandbook /> - </Stack.Item> - <Stack.Item grow> - <GasHandbook /> - </Stack.Item> - </Stack> - ); -}; - export const atmosHandbookHooks = (context) => { const [activeGasId, setActiveGasId] = useLocalState( context, diff --git a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx index a6fe672080d..b614d6bff3e 100644 --- a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx +++ b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx @@ -16,7 +16,6 @@ type GasmixParserProps = { temperatureOnClick?: () => void; volumeOnClick?: () => void; pressureOnClick?: () => void; - reactionOnClick?: (reaction_id: string) => void; }; export const GasmixParser = (props: GasmixParserProps, context) => { @@ -26,7 +25,6 @@ export const GasmixParser = (props: GasmixParserProps, context) => { temperatureOnClick, volumeOnClick, pressureOnClick, - reactionOnClick, ...rest } = props; From 3b4ae83ed81fe1688f7546a08ba35cbebce13762 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 16:03:59 -0400 Subject: [PATCH 176/200] Reworks some lists n' things --- code/__DEFINES/atmospherics/XGM.dm | 76 ++++++ code/__DEFINES/atmospherics/ZAS.dm | 61 ----- code/controllers/subsystem/zas.dm | 2 +- code/game/objects/structures/window.dm | 3 +- code/modules/atmospherics/ZAS/XGM/gas_data.dm | 6 + code/modules/atmospherics/ZAS/XGM/gases.dm | 231 ++++++++++-------- .../ZAS/zas_extras/gas_reagents.dm | 9 + .../atmospherics/machinery/airalarm.dm | 6 +- .../components/trinary_devices/filter.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 2 +- .../machinery/portable/canister.dm | 135 +++------- .../machinery/portable/scrubber.dm | 2 +- code/modules/cargo/exports/large_objects.dm | 2 +- .../power/supermatter/supermatter_process.dm | 2 +- code/modules/surgery/organs/lungs.dm | 2 +- pariah.dme | 1 + tgui/packages/tgui/constants.js | 6 + 17 files changed, 274 insertions(+), 276 deletions(-) create mode 100644 code/__DEFINES/atmospherics/XGM.dm diff --git a/code/__DEFINES/atmospherics/XGM.dm b/code/__DEFINES/atmospherics/XGM.dm new file mode 100644 index 00000000000..a65db3775b8 --- /dev/null +++ b/code/__DEFINES/atmospherics/XGM.dm @@ -0,0 +1,76 @@ +// XGM gas flags. +#define XGM_GAS_FUEL (1<<0) +#define XGM_GAS_OXIDIZER (1<<1) +#define XGM_GAS_CONTAMINANT (1<<2) +#define XGM_GAS_FUSION_FUEL (1<<3) +#define XGM_GAS_NOBLE (1<<4) +#define XGM_GAS_COMMON (1<<5) + +//"Common" station gases. +#define GAS_OXYGEN "oxygen" +#define GAS_NITROGEN "nitrogen" +#define GAS_CO2 "carbon_dioxide" +#define GAS_N2O "sleeping_agent" +#define GAS_PLASMA "plasma" +#define GAS_STEAM "water" + +//Gases for use with the SM or R-UST +#define GAS_HYDROGEN "hydrogen" //H +#define GAS_DEUTERIUM "deuterium" //2H +#define GAS_TRITIUM "tritium" //3H + +//Noble gases +#define GAS_BORON "boron" +#define GAS_HELIUM "helium" +#define GAS_ARGON "argon" +#define GAS_KRYPTON "krypton" +#define GAS_NEON "neon" +#define GAS_XENON "xenon" + +//Random bullshit for random gases, feel free to use elsewhere. +#define GAS_AMMONIA "ammonia" +#define GAS_CHLORINE "chlorine" +#define GAS_SULFUR "sulfurdioxide" +#define GAS_METHANE "methane" + +//Random bullshit: compound edition +#define GAS_METHYL_BROMIDE "methyl_bromide" +#define GAS_NO "nitricoxide" +#define GAS_NO2 "nitrodioxide" +#define GAS_CO "carbon_monoxide" + +//A placeholder for a random gas generated each round. +#define GAS_ALIEN "aliether" + +///All gases that are not placeholders. +#define ASSORTED_GASES (xgm_gas_data.gases - GAS_ALIEN) +///All gases in the game. The sorting of UIs like scrubbers will match this, so keep that in mind. +GLOBAL_LIST_INIT(all_gases, list( + GAS_ALIEN, + GAS_OXYGEN, + GAS_NITROGEN, + GAS_CO2, + GAS_N2O, + GAS_PLASMA, + GAS_STEAM, + GAS_HYDROGEN, + GAS_DEUTERIUM, + GAS_TRITIUM, + GAS_HELIUM, + GAS_ARGON, + GAS_KRYPTON, + GAS_NEON, + GAS_XENON, + GAS_BORON, + GAS_AMMONIA, + GAS_CHLORINE, + GAS_SULFUR, + GAS_METHANE, + GAS_CO, + GAS_NO, + GAS_METHYL_BROMIDE, +)) +///All gases that a player will reliably encounter every round or close to it. +GLOBAL_LIST_EMPTY(common_gases) //Filled in by xgm_gas_data/New() +///All the noble gases. +GLOBAL_LIST_EMPTY(noble_gases) //Filled in by xgm_gas_data/New() diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index a353a86a993..b92464dae21 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -235,12 +235,6 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //How many moles of fuel are contained within one solid/liquid fuel volume unit #define LIQUIDFUEL_AMOUNT_TO_MOL 0.45 //mol/volume unit -// XGM gas flags. -#define XGM_GAS_FUEL 1 -#define XGM_GAS_OXIDIZER 2 -#define XGM_GAS_CONTAMINANT 4 -#define XGM_GAS_FUSION_FUEL 8 - #define TANK_LEAK_PRESSURE (30 * ONE_ATMOSPHERE) // Tank starts leaking. #define TANK_RUPTURE_PRESSURE (40 * ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. #define TANK_FRAGMENT_PRESSURE (50 * ONE_ATMOSPHERE) // Boom 3x3 base explosion. @@ -285,61 +279,6 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define MAX_PUMP_PRESSURE 15000 // Maximal pressure setting for pumps and vents #define MAX_OMNI_PRESSURE 15000 // Maximal output(s) pressure for omni devices (filters/mixers) -#define GAS_OXYGEN "oxygen" -#define GAS_CO2 "carbon_dioxide" -#define GAS_CO "carbon_monoxide" -#define GAS_METHYL_BROMIDE "methyl_bromide" -#define GAS_N2O "sleeping_agent" -#define GAS_NITROGEN "nitrogen" -#define GAS_NO2 "nitrodioxide" -#define GAS_NO "nitricoxide" -#define GAS_METHANE "methane" -#define GAS_ALIEN "aliether" -#define GAS_HYDROGEN "hydrogen" -#define GAS_DEUTERIUM "deuterium" -#define GAS_TRITIUM "tritium" -#define GAS_HELIUM "helium" -#define GAS_ARGON "argon" -#define GAS_KRYPTON "krypton" -#define GAS_NEON "neon" -#define GAS_XENON "xenon" -#define GAS_AMMONIA "ammonia" -#define GAS_CHLORINE "chlorine" -#define GAS_SULFUR "sulfurdioxide" -#define GAS_STEAM "water" -#define GAS_PLASMA "plasma" -//TG GASES - PLAN TO REMOVE -#define GAS_PLUOXIUM "pluoxium" - -///All gases in the game. The sorting of UIs like scrubbers will match this, so keep that in mind. -GLOBAL_LIST_INIT(all_gases, list( - GAS_ALIEN, - GAS_OXYGEN, - GAS_NITROGEN, - GAS_CO2, - GAS_N2O, - GAS_PLASMA, - GAS_STEAM, - GAS_HYDROGEN, - GAS_DEUTERIUM, - GAS_TRITIUM, - GAS_PLUOXIUM, - GAS_HELIUM, - GAS_ARGON, - GAS_KRYPTON, - GAS_NEON, - GAS_XENON, - GAS_AMMONIA, - GAS_CHLORINE, - GAS_SULFUR, - GAS_METHANE, - GAS_CO, - GAS_NO, - GAS_METHYL_BROMIDE, -)) -GLOBAL_LIST_INIT(common_gases, list(GAS_OXYGEN, GAS_NITROGEN, GAS_CO2, GAS_N2O, GAS_PLASMA,)) -GLOBAL_LIST_INIT(noble_gases, list(GAS_HELIUM, GAS_ARGON, GAS_NEON, GAS_KRYPTON)) - GLOBAL_LIST_INIT(reverse_dir, list( // reverse_dir[dir] = reverse of dir 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 16e88bb09b6..ddcd8c2293f 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -535,7 +535,7 @@ SUBSYSTEM_DEF(zas) if(xgm_gas_data.flags[gas] & (XGM_GAS_CONTAMINANT|XGM_GAS_FUEL|XGM_GAS_OXIDIZER)) restricted_gases |= gas - var/list/viable_gases = GLOB.all_gases - restricted_gases - GAS_XENON //TODO: add XGM_GAS_DANGEROUS + var/list/viable_gases = xgm_gas_data.gases - restricted_gases - GAS_XENON //TODO: add XGM_GAS_DANGEROUS var/datum/gas_mixture/mix_real = new var/list/mix_list = list() var/num_gases = rand(1, 3) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 33f3dc2d8e2..5ddd86e803e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -396,7 +396,7 @@ /obj/structure/window/fire_act(exposed_temperature, exposed_volume) if (exposed_temperature > melting_point) - take_damage(round(exposed_volume / 100), BURN, 0, 0) //The max of 9 is to ensure it takes 4 ticks to destroy, which is incredibly dramatic + take_damage(round(exposed_volume / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location() return null @@ -586,6 +586,7 @@ damage_deflection = 21 explosion_block = 2 glass_type = /obj/item/stack/sheet/plasmarglass + melting_point = 25000 /obj/structure/window/reinforced/plasma/block_superconductivity() return TRUE diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index a59e99f620b..68b4e127a0f 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -88,6 +88,12 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new base_value[gas.id] = gas.base_value purchaseable[gas.id] = gas.purchaseable + if(flags & XGM_GAS_COMMON) + GLOB.common_gases += p + + if(flags & XGM_GAS_NOBLE) + GLOB.noble_gases += p + return 1 /obj/effect/gas_overlay diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 84639c85774..e00022c5815 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -1,9 +1,41 @@ +//WHEN ADDING A NEW GAS, ADD IT TO constants.js!! + +/datum/xgm_gas/alium + id = GAS_ALIEN + name = "Aliether" + hidden_from_codex = TRUE + symbol_html = "X" + symbol = "X" + +/datum/xgm_gas/alium/New() + var/num = rand(100,999) + name = "Compound #[num]" + specific_heat = rand(1, 400) // J/(mol*K) + molar_mass = rand(20,800)/1000 // kg/mol + if(prob(40)) + flags |= XGM_GAS_FUEL + else if(prob(40)) //it's prooobably a bad idea for gas being oxidizer to itself. + flags |= XGM_GAS_OXIDIZER + if(prob(40)) + flags |= XGM_GAS_CONTAMINANT + if(prob(40)) + flags |= XGM_GAS_FUSION_FUEL + if(!flags) + flags |= XGM_GAS_NOBLE + + symbol_html = "X<sup>[num]</sup>" + symbol = "X-[num]" + if(prob(50)) + tile_color = RANDOM_RGB + overlay_limit = 0.5 + +//COMMON GASES /datum/xgm_gas/oxygen id = GAS_OXYGEN name = "Oxygen" specific_heat = 20 // J/(mol*K) molar_mass = 0.032 // kg/mol - flags = XGM_GAS_OXIDIZER | XGM_GAS_FUSION_FUEL + flags = XGM_GAS_OXIDIZER | XGM_GAS_FUSION_FUEL | XGM_GAS_COMMON symbol_html = "O<sub>2</sub>" symbol = "O2" purchaseable = TRUE @@ -14,6 +46,7 @@ name = "Nitrogen" specific_heat = 20 // J/(mol*K) molar_mass = 0.028 // kg/mol + flags = XGM_GAS_COMMON symbol_html = "N<sub>2</sub>" symbol = "N2" purchaseable = TRUE @@ -24,19 +57,37 @@ name = "Carbon Dioxide" specific_heat = 30 // J/(mol*K) molar_mass = 0.044 // kg/mol + flags = XGM_GAS_COMMON symbol_html = "CO<sub>2</sub>" symbol = "CO2" purchaseable = TRUE base_value = 0.2 -/datum/xgm_gas/methyl_bromide - id = GAS_METHYL_BROMIDE - name = "Methyl Bromide" - specific_heat = 42.59 // J/(mol*K) - molar_mass = 0.095 // kg/mol - //breathed_product = /datum/reagent/toxin/methyl_bromide - symbol_html = "CH<sub>3</sub>Br" - symbol = "CH3Br" +/datum/xgm_gas/sleeping_agent + id = GAS_N2O + name = "Nitrous Oxide" + specific_heat = 40 // J/(mol*K) + molar_mass = 0.044 // kg/mol. N2O + tile_overlay = "sleeping_agent" + overlay_limit = 0.5 + flags = XGM_GAS_OXIDIZER | XGM_GAS_COMMON //N2O is a powerful oxidizer + //breathed_product = /datum/reagent/nitrous_oxide + symbol_html = "N<sub>2</sub>O" + symbol = "N2O" + base_value = 3 + +/datum/xgm_gas/vapor + id = GAS_STEAM + name = "Steam" + tile_overlay = "generic" + overlay_limit = 0.5 + specific_heat = 30 // J/(mol*K) + molar_mass = 0.020 // kg/mol + flags = XGM_GAS_COMMON + breathed_product = /datum/reagent/water + condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. + symbol_html = "H<sub>2</sub>O" + symbol = "H2O" /datum/xgm_gas/phoron id = GAS_PLASMA @@ -53,62 +104,13 @@ tile_overlay = "plasma" overlay_limit = MOLES_PHORON_VISIBLE - flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL + flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL | XGM_GAS_COMMON breathed_product = /datum/reagent/toxin/plasma symbol_html = "Ph" symbol = "Ph" base_value = 2 -/datum/xgm_gas/sleeping_agent - id = GAS_N2O - name = "Nitrous Oxide" - specific_heat = 40 // J/(mol*K) - molar_mass = 0.044 // kg/mol. N2O - tile_overlay = "sleeping_agent" - overlay_limit = 0.5 - flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer - //breathed_product = /datum/reagent/nitrous_oxide - symbol_html = "N<sub>2</sub>O" - symbol = "N2O" - base_value = 3 - -/datum/xgm_gas/methane - id = GAS_METHANE - name = "Methane" - specific_heat = 30 // J/(mol*K) - molar_mass = 0.016 // kg/mol - flags = XGM_GAS_FUEL - symbol_html = "CH<sub>4</sub>" - symbol = "CH4" - -/datum/xgm_gas/alium - id = GAS_ALIEN - name = "Aliether" - hidden_from_codex = TRUE - symbol_html = "X" - symbol = "X" - -/datum/xgm_gas/alium/New() - var/num = rand(100,999) - name = "Compound #[num]" - specific_heat = rand(1, 400) // J/(mol*K) - molar_mass = rand(20,800)/1000 // kg/mol - if(prob(40)) - flags |= XGM_GAS_FUEL - else if(prob(40)) //it's prooobably a bad idea for gas being oxidizer to itself. - flags |= XGM_GAS_OXIDIZER - if(prob(40)) - flags |= XGM_GAS_CONTAMINANT - if(prob(40)) - flags |= XGM_GAS_FUSION_FUEL - - symbol_html = "X<sup>[num]</sup>" - symbol = "X-[num]" - if(prob(50)) - tile_color = RANDOM_RGB - overlay_limit = 0.5 - - +//SM & R-UST GASES /datum/xgm_gas/hydrogen id = GAS_HYDROGEN name = "Hydrogen" @@ -128,15 +130,16 @@ /datum/xgm_gas/hydrogen/tritium id = GAS_TRITIUM name = "Tritium" - symbol_html = "T" + symbol_html = "<sup>3</sup>H" symbol = "T" +//NOBLE GASES /datum/xgm_gas/helium id = GAS_HELIUM name = "Helium" specific_heat = 80 // J/(mol*K) molar_mass = 0.004 // kg/mol - flags = XGM_GAS_FUSION_FUEL + flags = XGM_GAS_FUSION_FUEL | XGM_GAS_NOBLE symbol_html = "He" symbol = "He" @@ -145,6 +148,7 @@ name = "Argon" specific_heat = 10 // J/(mol*K) molar_mass = 0.018 // kg/mol + flags = XGM_GAS_NOBLE symbol_html = "Ar" symbol = "Ar" purchaseable = TRUE @@ -156,6 +160,7 @@ name = "Krypton" specific_heat = 5 // J/(mol*K) molar_mass = 0.036 // kg/mol + flags = XGM_GAS_NOBLE symbol_html = "Kr" symbol = "Kr" purchaseable = TRUE @@ -166,6 +171,7 @@ name = "Neon" specific_heat = 20 // J/(mol*K) molar_mass = 0.01 // kg/mol + flags = XGM_GAS_NOBLE symbol_html = "Ne" symbol = "Ne" purchaseable = TRUE @@ -176,12 +182,68 @@ name = "Xenon" specific_heat = 3 // J/(mol*K) molar_mass = 0.054 // kg/mol + flags = XGM_GAS_NOBLE breathed_product = /datum/reagent/nitrous_oxide/xenon symbol_html = "Xe" symbol = "Xe" purchaseable = TRUE base_value = 5 +/datum/xgm_gas/boron + id = GAS_BORON + name = "Boron" + specific_heat = 11 + molar_mass = 0.011 + flags = XGM_GAS_FUSION_FUEL | XGM_GAS_NOBLE + breathed_product = /datum/reagent/toxin/boron + symbol_html = "B" + symbol = "B" + +//MISC ELEMENTS +/datum/xgm_gas/methane + id = GAS_METHANE + name = "Methane" + specific_heat = 30 // J/(mol*K) + molar_mass = 0.016 // kg/mol + flags = XGM_GAS_FUEL + symbol_html = "CH<sub>4</sub>" + symbol = "CH4" + +/datum/xgm_gas/ammonia + id = GAS_AMMONIA + name = "Ammonia" + specific_heat = 20 // J/(mol*K) + molar_mass = 0.017 // kg/mol + breathed_product = /datum/reagent/ammonia + symbol_html = "NH<sub>3</sub>" + symbol = "NH3" + +/datum/xgm_gas/chlorine + id = GAS_CHLORINE + name = "Chlorine" + tile_color = "#c5f72d" + overlay_limit = 0.5 + specific_heat = 5 // J/(mol*K) + molar_mass = 0.017 // kg/mol + tile_overlay = "chlorine" + overlay_limit = 0.1 + flags = XGM_GAS_OXIDIZER + breathed_product = /datum/reagent/chlorine + symbol_html = "Cl" + symbol = "Cl" + purchaseable = TRUE + base_value = 7 + +//MISC COMPOUNDS +/datum/xgm_gas/methyl_bromide + id = GAS_METHYL_BROMIDE + name = "Methyl Bromide" + specific_heat = 42.59 // J/(mol*K) + molar_mass = 0.095 // kg/mol + //breathed_product = /datum/reagent/toxin/methyl_bromide + symbol_html = "CH<sub>3</sub>Br" + symbol = "CH3Br" + /datum/xgm_gas/nitrodioxide id = GAS_NO2 name = "Nitrogen Dioxide" @@ -202,34 +264,6 @@ symbol_html = "NO" symbol = "NO" -/datum/xgm_gas/chlorine - id = GAS_CHLORINE - name = "Chlorine" - tile_color = "#c5f72d" - overlay_limit = 0.5 - specific_heat = 5 // J/(mol*K) - molar_mass = 0.017 // kg/mol - tile_overlay = "chlorine" - overlay_limit = 0.1 - flags = XGM_GAS_OXIDIZER - breathed_product = /datum/reagent/chlorine - symbol_html = "Cl" - symbol = "Cl" - purchaseable = TRUE - base_value = 7 - -/datum/xgm_gas/vapor - id = GAS_STEAM - name = "Steam" - tile_overlay = "generic" - overlay_limit = 0.5 - specific_heat = 30 // J/(mol*K) - molar_mass = 0.020 // kg/mol - breathed_product = /datum/reagent/water - condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. - symbol_html = "H<sub>2</sub>O" - symbol = "H2O" - /datum/xgm_gas/sulfurdioxide id = GAS_SULFUR name = "Sulfur Dioxide" @@ -238,15 +272,6 @@ symbol_html = "SO<sub>2</sub>" symbol = "SO2" -/datum/xgm_gas/ammonia - id = GAS_AMMONIA - name = "Ammonia" - specific_heat = 20 // J/(mol*K) - molar_mass = 0.017 // kg/mol - breathed_product = /datum/reagent/ammonia - symbol_html = "NH<sub>3</sub>" - symbol = "NH3" - /datum/xgm_gas/carbon_monoxide id = GAS_CO name = "Carbon Monoxide" @@ -256,11 +281,3 @@ symbol_html = "CO" symbol = "CO" -/datum/xgm_gas/pluoxium - id = GAS_PLUOXIUM - name = "Pluoxium" - specific_heat = 80 - molar_mass = 0.002 //Yeah idk, its some kind of super gas or something - base_value = 5 - symbol_html = "Pl" - symbol = "Pl" diff --git a/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm index dbdd45cbb25..66197ddb6a5 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm @@ -36,6 +36,15 @@ to_chat(M, "<span class='warning'>You feel [warning_message].</span>") return ..() + /datum/reagent/carbon_monoxide/on_mob_end_metabolize(mob/living/L) . = ..() L.clear_alert(ALERT_TOO_MUCH_CO2, clear_override = TRUE) + +/datum/reagent/toxin/boron + name = "Boron" + description = "A chemical that is highly valued for its potential in fusion energy." + taste_description = "metal" + reagent_state = SOLID + color = "#837e79" + toxpwr = 7 diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index c0878c0cbfa..b59985506ce 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -312,7 +312,7 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "warning_max", "selected" = selected.warning_max)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "hazard_max", "selected" = selected.hazard_max)) - for(var/gas_id in GLOB.all_gases - GAS_ALIEN) + for(var/gas_id in ASSORTED_GASES) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] @@ -476,7 +476,7 @@ for(var/device_id in my_area.air_scrub_info) send_signal(device_id, list( "power" = 1, - "set_filters" = GLOB.all_gases - GAS_ALIEN, + "set_filters" = ASSORTED_GASES, "scrubbing" = 1, "quicksucc" = 1 ), signal_source) @@ -967,7 +967,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) "Temperature" = "temperature" ) - for(var/gas_id in GLOB.all_gases) + for(var/gas_id in ASSORTED_GASES) component_options |= gas_id air_alarm_options = add_option_port("Air Alarm Options", component_options) options_map = component_options diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 924f2e6b9c2..7df1a82b953 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -133,13 +133,13 @@ /obj/machinery/atmospherics/components/trinary/filter/ui_data() var/data = list() - var/static/all_gases = GLOB.all_gases + var/static/all_gases = xgm_gas_data.gases data["on"] = on data["rate"] = round(transfer_rate) data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - for(var/gas in GLOB.all_gases - GAS_ALIEN) + for(var/gas in ASSORTED_GASES) data["filter_types"] += list(list("name" = xgm_gas_data.name[gas], "gas_id" = gas, "enabled" = (gas in filter_type))) return data diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 98161a8c20d..659829a0ced 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -162,7 +162,7 @@ return FALSE var/list/f_types = list() - for(var/gas_id in GLOB.all_gases - GAS_ALIEN) + for(var/gas_id in ASSORTED_GASES) f_types += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in filter_types))) var/datum/signal/signal = new(list( diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 2204a2b62de..580b0928c25 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -16,23 +16,11 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) GAS_CHLORINE = /obj/machinery/portable_atmospherics/canister/chlorine, GAS_NEON = /obj/machinery/portable_atmospherics/canister/neon, "air" = /obj/machinery/portable_atmospherics/canister/air, - /*"nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, - "bz" = /obj/machinery/portable_atmospherics/canister/bz, - "air" = /obj/machinery/portable_atmospherics/canister/air, - "water_vapor" = /obj/machinery/portable_atmospherics/canister/water_vapor, - "tritium" = /obj/machinery/portable_atmospherics/canister/tritium, - "hyper-noblium" = /obj/machinery/portable_atmospherics/canister/nob, - "pluoxium" = /obj/machinery/portable_atmospherics/canister/pluoxium, + GAS_HYDROGEN = /obj/machinery/portable_atmospherics/canister/hydrogen, + GAS_DEUTERIUM = /obj/machinery/portable_atmospherics/canister/deuterium, + GAS_TRITIUM = /obj/machinery/portable_atmospherics/canister/tritium, "caution" = /obj/machinery/portable_atmospherics/canister, - "miasma" = /obj/machinery/portable_atmospherics/canister/miasma, - "freon" = /obj/machinery/portable_atmospherics/canister/freon, - "hydrogen" = /obj/machinery/portable_atmospherics/canister/hydrogen, - "healium" = /obj/machinery/portable_atmospherics/canister/healium, - "proto_nitrate" = /obj/machinery/portable_atmospherics/canister/proto_nitrate, - "zauker" = /obj/machinery/portable_atmospherics/canister/zauker, - "helium" = /obj/machinery/portable_atmospherics/canister/helium, - "antinoblium" = /obj/machinery/portable_atmospherics/canister/antinoblium, - "halon" = /obj/machinery/portable_atmospherics/canister/halon*/ + GAS_STEAM = /obj/machinery/portable_atmospherics/canister/water_vapor, )) @@ -143,156 +131,111 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) // Basic canister per gas below here /obj/machinery/portable_atmospherics/canister/air - name = "Air canister" + name = "air canister" desc = "Pre-mixed air." greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#c6c0b5" -/* -/obj/machinery/portable_atmospherics/canister/antinoblium - name = "Antinoblium canister" - gas_type = /datum/gas/antinoblium - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#9b5d7f#368bff" -/obj/machinery/portable_atmospherics/canister/bz - name = "\improper BZ canister" - gas_type = /datum/gas/bz - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#9b5d7f#d0d2a0" -*/ /obj/machinery/portable_atmospherics/canister/carbon_dioxide - name = "Carbon dioxide canister" + name = "carbon dioxide canister" gas_type = GAS_CO2 greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#4e4c48" /obj/machinery/portable_atmospherics/canister/carbon_monoxide - name = "Carbon monoxide canister" + name = "carbon monoxide canister" gas_type = GAS_CO greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#808080" /obj/machinery/portable_atmospherics/canister/xenon - name = "Xenon canister" + name = "xenon canister" gas_type = GAS_XENON greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#808080" /obj/machinery/portable_atmospherics/canister/krypton - name = "Krypton canister" + name = "krypton canister" gas_type = GAS_KRYPTON greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#44E022" /obj/machinery/portable_atmospherics/canister/nitrogen - name = "Nitrogen canister" + name = "nitrogen canister" gas_type = GAS_NITROGEN greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#d41010" /obj/machinery/portable_atmospherics/canister/nitrous_oxide - name = "Nitrous oxide canister" + name = "nitrous oxide canister" gas_type = GAS_N2O greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#c63e3b#f7d5d3" /obj/machinery/portable_atmospherics/canister/chlorine - name = "Chlorine canister" + name = "chlorine canister" gas_type = GAS_CHLORINE greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#b9d41b" /obj/machinery/portable_atmospherics/canister/argon - name = "Argon canister" + name = "argon canister" gas_type = GAS_ARGON greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#CC4DCD" /obj/machinery/portable_atmospherics/canister/neon - name = "Neon canister" + name = "neon canister" gas_type = GAS_NEON greyscale_config = /datum/greyscale_config/canister greyscale_colors = "#FF825C" -/* -/obj/machinery/portable_atmospherics/canister/nitrium - name = "Nitrium canister" - gas_type = /datum/gas/nitrium - greyscale_config = /datum/greyscale_config/canister - greyscale_colors = "#7b4732" - -/obj/machinery/portable_atmospherics/canister/nob - name = "Hyper-noblium canister" - gas_type = /datum/gas/hypernoblium - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#6399fc#b2b2b2" -*/ - /obj/machinery/portable_atmospherics/canister/oxygen - name = "Oxygen canister" + name = "oxygen canister" gas_type = GAS_OXYGEN greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#2786e5#e8fefe" -/obj/machinery/portable_atmospherics/canister/pluoxium - name = "Pluoxium canister" - gas_type = GAS_PLUOXIUM +/obj/machinery/portable_atmospherics/canister/boron + name = "boron canister" + gas_type = GAS_BORON greyscale_config = /datum/greyscale_config/canister - greyscale_colors = "#2786e5" -/* -/obj/machinery/portable_atmospherics/canister/proto_nitrate - name = "Proto Nitrate canister" - gas_type = /datum/gas/proto_nitrate - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#008200#33cc33" -*/ + greyscale_colors = "#32DF1F" + /obj/machinery/portable_atmospherics/canister/plasma - name = "Plasma canister" + name = "plasma canister" gas_type = GAS_PLASMA greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#f62800#000000" -/* + +/obj/machinery/portable_atmospherics/canister/hydrogen + name = "hydrogen canister" + gas_type = GAS_HYDROGEN + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#3fcd40#000000" + +/obj/machinery/portable_atmospherics/canister/deuterium + name = "hydrogen canister" + gas_type = GAS_DEUTERIUM + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#E81BFF#000000" + /obj/machinery/portable_atmospherics/canister/tritium - name = "Tritium canister" - gas_type = /datum/gas/tritium + name = "tritium canister" + gas_type = GAS_TRITIUM greyscale_config = /datum/greyscale_config/canister/hazard greyscale_colors = "#3fcd40#000000" /obj/machinery/portable_atmospherics/canister/water_vapor - name = "Water vapor canister" - gas_type = /datum/gas/water_vapor + name = "steam canister" + gas_type = GAS_STEAM filled = 1 greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#4c4e4d#f7d5d3" -/obj/machinery/portable_atmospherics/canister/zauker - name = "Zauker canister" - gas_type = /datum/gas/zauker - filled = 1 - greyscale_config = /datum/greyscale_config/canister/double_stripe - greyscale_colors = "#009a00#006600" -*/ // Special canisters below here - -/obj/machinery/portable_atmospherics/canister/fusion_test - name = "fusion test canister" - desc = "Don't be a badmin." - heat_limit = 1e12 - pressure_limit = 1e14 - -/* -/obj/machinery/portable_atmospherics/canister/fusion_test/create_gas() - air_contents.add_gases(/datum/gas/hydrogen, /datum/gas/tritium) - air_contents.gases[/datum/gas/hydrogen][MOLES] = 300 - air_contents.gases[/datum/gas/tritium][MOLES] = 300 - air_contents.temperature = 10000 - SSair.start_processing_machine(src) -*/ - /obj/machinery/portable_atmospherics/canister/anesthetic_mix - name = "Anesthetic mix" + name = "anesthetic mix" desc = "A mixture of N2O and Oxygen" greyscale_config = /datum/greyscale_config/canister/double_stripe greyscale_colors = "#9fba6c#3d4680" diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 843f00d1819..4afb885df45 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -102,7 +102,7 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/gas_id in GLOB.all_gases - GAS_ALIEN) + for(var/gas_id in ASSORTED_GASES) data["filter_types"] += list(list("gas_id" = gas_id, "gas_name" = gas_id, "enabled" = (gas_id in scrubbing))) if(holding) diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 2d4c4b227f8..10ad1c85695 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -106,7 +106,7 @@ var/obj/machinery/portable_atmospherics/canister/C = O var/worth = cost var/datum/gas_mixture/canister_mix = C.return_air() - var/list/gases_to_check = GLOB.all_gases + var/list/gases_to_check = xgm_gas_data.gases for(var/gasID in gases_to_check) if(canister_mix.getGroupGas(gasID) > 0) diff --git a/code/modules/power/supermatter/supermatter_process.dm b/code/modules/power/supermatter/supermatter_process.dm index 1c273d6e643..857aa00dbd2 100644 --- a/code/modules/power/supermatter/supermatter_process.dm +++ b/code/modules/power/supermatter/supermatter_process.dm @@ -214,7 +214,7 @@ if(consumed_carbon_dioxide) removed.adjustGas(GAS_CO2, -consumed_carbon_dioxide * 0.5, FALSE) removed.adjustGas(GAS_OXYGEN, -consumed_carbon_dioxide * 0.5, FALSE) - removed.adjustGas(GAS_PLUOXIUM, consumed_carbon_dioxide * 0.25, FALSE) + removed.adjustGas(GAS_HYDROGEN, consumed_carbon_dioxide * 0.25, FALSE) //Pluoxium is hydrogen now, deal with it. /*if(prob(gas_comp[/datum/gas/zauker])) playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 3a1a83616dd..f15a8088b31 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -127,7 +127,7 @@ var/SA_moles = breath_gases[GAS_N2O] //Partial pressures in our breath - var/O2_pp = breath.getBreathPartialPressure(O2_moles) / max(1, (8 * breath.getBreathPartialPressure(breath_gases[GAS_PLUOXIUM]))) + var/O2_pp = breath.getBreathPartialPressure(O2_moles) var/N2_pp = breath.getBreathPartialPressure(N2_moles) var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) diff --git a/pariah.dme b/pariah.dme index 389f2c6b3e9..575acdf6792 100644 --- a/pariah.dme +++ b/pariah.dme @@ -200,6 +200,7 @@ #include "code\__DEFINES\atmospherics\atmos_piping.dm" #include "code\__DEFINES\atmospherics\reactor.dm" #include "code\__DEFINES\atmospherics\temperature.dm" +#include "code\__DEFINES\atmospherics\XGM.dm" #include "code\__DEFINES\atmospherics\ZAS.dm" #include "code\__DEFINES\atmospherics\ZAS_math.dm" #include "code\__DEFINES\dcs\flags.dm" diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index e7cb7a320da..52e38bfbcee 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -337,6 +337,12 @@ const GASES = [ 'label': '³H', 'color': 'limegreen', }, + { + 'id': 'boron', + 'name': 'Boron', + 'label': 'B', + 'color': 'limegreen', + }, ]; export const getGasLabel = (gasId, fallbackValue) => { From adc4e3ec1abccb233e72ae9da27a6713bc62fbb5 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 16:06:07 -0400 Subject: [PATCH 177/200] removes redundant global list --- code/__DEFINES/atmospherics/XGM.dm | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/code/__DEFINES/atmospherics/XGM.dm b/code/__DEFINES/atmospherics/XGM.dm index a65db3775b8..089efc4ced4 100644 --- a/code/__DEFINES/atmospherics/XGM.dm +++ b/code/__DEFINES/atmospherics/XGM.dm @@ -44,32 +44,6 @@ ///All gases that are not placeholders. #define ASSORTED_GASES (xgm_gas_data.gases - GAS_ALIEN) -///All gases in the game. The sorting of UIs like scrubbers will match this, so keep that in mind. -GLOBAL_LIST_INIT(all_gases, list( - GAS_ALIEN, - GAS_OXYGEN, - GAS_NITROGEN, - GAS_CO2, - GAS_N2O, - GAS_PLASMA, - GAS_STEAM, - GAS_HYDROGEN, - GAS_DEUTERIUM, - GAS_TRITIUM, - GAS_HELIUM, - GAS_ARGON, - GAS_KRYPTON, - GAS_NEON, - GAS_XENON, - GAS_BORON, - GAS_AMMONIA, - GAS_CHLORINE, - GAS_SULFUR, - GAS_METHANE, - GAS_CO, - GAS_NO, - GAS_METHYL_BROMIDE, -)) ///All gases that a player will reliably encounter every round or close to it. GLOBAL_LIST_EMPTY(common_gases) //Filled in by xgm_gas_data/New() ///All the noble gases. From d1e7ab5b6553f06f5f0807bcbf499ab8b5a1fc91 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 3 Jul 2022 16:36:34 -0400 Subject: [PATCH 178/200] Back-to-basics firelocks, pt1 --- code/game/machinery/doors/firedoor.dm | 56 ++++++++------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5f92c5412b2..843bfab60ef 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -39,8 +39,6 @@ var/area/my_area ///List of problem turfs with bad temperature var/list/turf/issue_turfs - ///Tracks if the firelock is being held open by a crowbar. If so, we don't close until they walk away - var/being_held_open = FALSE ///Type of alarm when active. See code/defines/firealarm.dm for the list. This var being null means there is no alarm. var/alarm_type = null ///The merger_id and merger_typecache variables are used to make rows of firelocks activate at the same time. @@ -233,7 +231,6 @@ continue process_results(checked_turf) RegisterSignal(checked_turf, COMSIG_TURF_EXPOSE, .proc/process_results) - RegisterSignal(checked_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS, .proc/process_results) /obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/loc) @@ -244,7 +241,6 @@ continue UnregisterSignal(checked_turf, COMSIG_TURF_EXPOSE) - UnregisterSignal(checked_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) /obj/machinery/door/firedoor/proc/check_atmos(turf/checked_turf) var/datum/gas_mixture/environment = checked_turf.return_air() @@ -459,45 +455,27 @@ return if(density) - being_held_open = TRUE - user.balloon_alert_to_viewers("holding [src] open", "holding [src] open") - open() - if(QDELETED(user)) - being_held_open = FALSE + user.visible_message( + span_danger("[user] presses their crowbar into [src] to pry it open!"), + span_notice("You press your crowbar between the door and begin to pry it open..."), + span_hear("You hear a metal clang, followed by metallic groans.") + ) + if(!do_after(user, 3 SECONDS, src)) return - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/handle_held_open_adjacency) - RegisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION, .proc/handle_held_open_adjacency) - RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/handle_held_open_adjacency) - handle_held_open_adjacency(user) - else - close() - -/// A simple toggle for firedoors between on and off -/obj/machinery/door/firedoor/try_to_crowbar_secondary(obj/item/acting_object, mob/user) - if(welded || operating) - return - - if(density) + user.visible_message( + span_danger("[user] forces [src] open with a crowbar!"), + span_notice("You force open [src]."), + span_hear("You hear a heavy metallic object sliding.") + ) open() - if(alarm_type) - addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) else + user.visible_message( + span_notice("[user] forces [src] shut."), + span_notice("You force [src] closed."), + span_hear("You hear a heavy metallic object sliding, followed by a clang.") + ) close() -/obj/machinery/door/firedoor/proc/handle_held_open_adjacency(mob/user) - SIGNAL_HANDLER - - var/mob/living/living_user = user - if(!QDELETED(user) && Adjacent(user) && isliving(user) && (living_user.body_position == STANDING_UP)) - return - being_held_open = FALSE - correct_state() - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - UnregisterSignal(user, COMSIG_LIVING_SET_BODY_POSITION) - UnregisterSignal(user, COMSIG_PARENT_QDELETING) - if(user) - user.balloon_alert_to_viewers("released [src]", "released [src]") - /obj/machinery/door/firedoor/attack_ai(mob/user) add_fingerprint(user) if(welded || operating || machine_stat & NOPOWER) @@ -557,7 +535,7 @@ * changes during the timer, the door doesn't close or open incorrectly. */ /obj/machinery/door/firedoor/proc/correct_state() - if(obj_flags & EMAGGED || being_held_open) + if(obj_flags & EMAGGED) return //Unmotivated, indifferent, we have no real care what state we're in anymore. if(alarm_type && !density) //We should be closed but we're not INVOKE_ASYNC(src, .proc/close) From 8b9a28af04e57562935aeebdc8b2f615b25eaf74 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 4 Jul 2022 01:08:08 -0400 Subject: [PATCH 179/200] fire/air alarm + firedoor refactor. Fuck me harder --- code/__DEFINES/dcs/signals/signals_global.dm | 3 + .../dcs/signals/signals_machinery.dm | 2 + code/__DEFINES/firealarm.dm | 7 + code/__HELPERS/areas.dm | 9 +- code/game/area/areas.dm | 94 ++++-- code/game/machinery/doors/firedoor.dm | 315 +++--------------- code/game/machinery/firealarm.dm | 122 ++++--- code/game/objects/items/blueprints.dm | 4 - code/game/turfs/change_turf.dm | 82 ----- code/modules/atmospherics/ZAS/XGM/gases.dm | 4 + .../atmospherics/machinery/airalarm.dm | 104 ++---- pariah.dme | 1 + 12 files changed, 229 insertions(+), 518 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_machinery.dm diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 0ef60fca2ee..d6e1ef2bde8 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -68,3 +68,6 @@ /// Global signal sent when a light mechanism is completed (try_id) #define COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED "!light_mechanism_completed" + +///Global signal sent when SSticker enters Runlevel Game +#define COMSIG_GLOB_GAME_START "!game_started" diff --git a/code/__DEFINES/dcs/signals/signals_machinery.dm b/code/__DEFINES/dcs/signals/signals_machinery.dm new file mode 100644 index 00000000000..05a22ceb1c0 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_machinery.dm @@ -0,0 +1,2 @@ +///Issued by Air Alarms and Fire Alarms to communicate. +#define COMSIG_FIRE_ALERT "comsig_fire_alert" diff --git a/code/__DEFINES/firealarm.dm b/code/__DEFINES/firealarm.dm index f2a561d12d2..0f7894c2730 100644 --- a/code/__DEFINES/firealarm.dm +++ b/code/__DEFINES/firealarm.dm @@ -11,3 +11,10 @@ #define FIRELOCK_ALARM_TYPE_COLD "firelock_alarm_type_cold" ///Designates a fire lock should be closed due unknown reasons (IE fire alarm was pulled) #define FIRELOCK_ALARM_TYPE_GENERIC "firelock_alarm_type_generic" + +///Fire alert cleared by any means +#define FIRE_CLEAR (0<<0) +///Fire alert raised by pulling the fire alarm +#define FIRE_RAISED_PULL (1<<0) +///Fire alert raised by the air alarm +#define FIRE_RAISED_AIRALARM (1<<1) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index c4b814aed40..956ebf09b7b 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -93,15 +93,14 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engineerin newA.reg_in_areas_in_z() + for(var/thing2move in oldA.firedoors + oldA.firealarms + oldA.airalarms) + thing2move:set_area(get_area(thing2move)) //Dude trust me + if(!isarea(area_choice) && newA.static_lighting) newA.create_area_lighting_objects() - var/list/firedoors = oldA.firedoors - for(var/door in firedoors) - var/obj/machinery/door/firedoor/FD = door - FD.CalculateAffectingAreas() - SEND_GLOBAL_SIGNAL(COMSIG_AREA_CREATED, newA, oldA, creator) + CalculateAdjacentFireAreas() to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) return TRUE diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 3e6dfc194de..b933a211dae 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -15,20 +15,18 @@ var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - ///Do we have an active fire alarm? - var/fire = FALSE - ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm, checked by fire locks. + ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm. var/fire_detect = TRUE ///A list of all fire locks in this area. Used by fire alarm panels when resetting fire locks or activating all in an area var/list/firedoors - ///A list of firelocks currently active. Used by fire alarms when setting their icons. - var/list/active_firelocks ///A list of all fire alarms in this area. Used by fire locks and burglar alarms to tell the fire alarm to change its icon. var/list/firealarms + ///A list of all air alarms in this area + var/list/airalarms + ///A list of adjacent areas that will close their fire doors when a fire alarm is sent out by us. + var/list/adjacent_fire_areas ///Alarm type to count of sources. Not usable for ^ because we handle fires differently var/list/active_alarms = list() - ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing. Fire alarms and fire locks will set and clear alarms. - var/datum/alarm_handler/alarm_manager var/lightswitch = TRUE @@ -100,6 +98,8 @@ var/list/air_vent_info = list() var/list/air_scrub_info = list() + var/datum/alarm_handler/alarm_manager + /** * A list of teleport locations * @@ -143,7 +143,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (area_flags & UNIQUE_AREA) GLOB.areas_by_type[type] = src power_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() - alarm_manager = new(src) // just in case + alarm_manager = new(src) //Just in case. Apparently. return ..() /* @@ -194,6 +194,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/LateInitialize() power_change() // all machines set to current power level, also updates icon update_beauty() + CalculateAdjacentFireAreas() /area/proc/RunGeneration() if(map_generator) @@ -266,39 +267,11 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (area_flags & NO_ALERTS) return //Trigger alarm effect - set_fire_alarm_effect() + communicate_fire_alert(FIRE_RAISED_PULL) //Lockdown airlocks for(var/obj/machinery/door/door in src) close_and_lock_door(door) -/** - * Trigger the fire alarm visual affects in an area - * - * Updates the fire light on fire alarms in the area and sets all lights to emergency mode - */ -/area/proc/set_fire_alarm_effect() - if(fire) - return - fire = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - for(var/obj/machinery/light/L in src) - L.update() - for(var/obj/machinery/firealarm/firepanel in firealarms) - firepanel.set_status() - -/** - * unset the fire alarm visual affects in an area - * - * Updates the fire light on fire alarms in the area and sets all lights to emergency mode - */ -/area/proc/unset_fire_alarm_effects() - fire = FALSE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - for(var/obj/machinery/light/L in src) - L.update() - for(var/obj/machinery/firealarm/firepanel in firealarms) - firepanel.set_status() - /** * Update the icon state of the area * @@ -506,3 +479,50 @@ GLOBAL_LIST_EMPTY(teleportlocs) /// Called when a living mob that spawned here, joining the round, receives the player client. /area/proc/on_joining_game(mob/living/boarder) return + +///Called by airalarms and firealarms to communicate the status of the area to relevant machines +/area/proc/communicate_fire_alert(code, sent_by_neighbor) + for(var/obj/machinery/light/L in src) + L.update() + + if(sent_by_neighbor) //If a neighboring area is sending an alert, only the firedoors care. + if(firedoors) + for(var/datum/listener as anything in firedoors) + SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code, sent_by_neighbor) + else + for(var/datum/listener in airalarms + firealarms + firedoors) + SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code, sent_by_neighbor) + + for(var/area/neighbor as anything in adjacent_fire_areas) + neighbor.communicate_fire_alert(code, TRUE) + +/** + * Calculates what areas are nearby to recieve alarm. + * + * This proc builds a list of areas that border other areas using firedoors. + * It is fairly expensive so it should be run as little as possible (lateinit + area creation) + */ +/proc/CalculateAdjacentFireAreas() + for(var/area/area_iter in GLOB.sortedAreas) + area_iter.adjacent_fire_areas = list() + + for(var/area/area_iter in GLOB.sortedAreas) + //Area has no fire doors? Fuck it. We don't care about it. + if(!area_iter.firedoors) + continue + + //Loop through all fire doors in the area... + for(var/obj/machinery/door/firedoor/FD as anything in area_iter.firedoors) + //Grab a list of areas adjacent to the fire doors + var/list/areas2add = get_adjacent_areas(FD) + //Loop through the areas that the firedoors are touching... + for(var/area/adj_area as anything in areas2add) + //Ignore their loc area + if(adj_area == area_iter) + continue + //Add them to iter's adjacency + area_iter.adjacent_fire_areas |= adj_area + //Add iter to their adjacency + adj_area.adjacent_fire_areas |= area_iter + + diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 843bfab60ef..6cb605a23d0 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -23,8 +23,6 @@ armor = list(MELEE = 10, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 30, BIO = 100, FIRE = 95, ACID = 70) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - COOLDOWN_DECLARE(detect_cooldown) - ///Trick to get the glowing overlay visible from a distance luminosity = 1 ///X offset for the overlay lights, so that they line up with the thin border firelocks @@ -33,39 +31,21 @@ var/light_yoffset = 0 var/boltslocked = TRUE - ///List of areas we handle. See CalculateAffectingAreas() - var/list/affecting_areas ///For the few times we affect only the area we're actually in. Set during Init. If we get moved, we don't update, but this is consistant with fire alarms and also kinda funny so call it intentional. var/area/my_area - ///List of problem turfs with bad temperature - var/list/turf/issue_turfs ///Type of alarm when active. See code/defines/firealarm.dm for the list. This var being null means there is no alarm. - var/alarm_type = null - ///The merger_id and merger_typecache variables are used to make rows of firelocks activate at the same time. - var/merger_id = "firelocks" - var/static/list/merger_typecache + var/alarm_type = FIRE_CLEAR ///Overlay object for the warning lights. This and some plane settings allows the lights to glow in the dark. var/mutable_appearance/warn_lights - ///looping sound datum for our fire alarm siren. - var/datum/looping_sound/firealarm/soundloop - ///Keeps track of if we're playing the alarm sound loop (as only one firelock per group should be). Used during power changes. - var/is_playing_alarm = FALSE - var/knock_sound = 'sound/effects/glassknock.ogg' var/bash_sound = 'sound/effects/glassbash.ogg' /obj/machinery/door/firedoor/Initialize(mapload) . = ..() - COOLDOWN_START(src, detect_cooldown, DETECT_COOLDOWN_STEP_TIME) - soundloop = new(src, FALSE) - CalculateAffectingAreas() - my_area = get_area(src) - if(!merger_typecache) - merger_typecache = typecacheof(/obj/machinery/door/firedoor) - + RegisterSignal(src, COMSIG_FIRE_ALERT, .proc/handle_alert) if(prob(0.004) && icon == 'icons/obj/doors/doorfireglass.dmi') base_icon_state = "sus" desc += " This one looks a bit sus..." @@ -74,10 +54,12 @@ /obj/machinery/door/firedoor/LateInitialize() . = ..() - RegisterSignal(src, COMSIG_MERGER_ADDING, .proc/merger_adding) - RegisterSignal(src, COMSIG_MERGER_REMOVING, .proc/merger_removing) - GetMergeGroup(merger_id, merger_typecache) - register_adjacent_turfs(src) + set_area(get_area(src)) + +/obj/machinery/door/firedoor/Destroy() + set_area(null) + return ..() + /** * Sets the offset for the warning lights. * @@ -86,11 +68,6 @@ /obj/machinery/door/firedoor/proc/adjust_lights_starting_offset() return -/obj/machinery/door/firedoor/Destroy() - remove_from_areas() - QDEL_NULL(soundloop) - return ..() - /obj/machinery/door/firedoor/examine(mob/user) . = ..() if(!density) @@ -159,202 +136,48 @@ return . -/** - * Calculates what areas we should worry about. - * - * This proc builds a list of areas we are in and areas we border - * and writes it to affecting_areas. - */ -/obj/machinery/door/firedoor/proc/CalculateAffectingAreas() - var/list/new_affecting_areas = get_adjacent_open_areas(src) | get_area(src) - if(compare_list(new_affecting_areas, affecting_areas)) - return //No changes needed - - remove_from_areas() - affecting_areas = new_affecting_areas - for(var/area/place in affecting_areas) - LAZYADD(place.firedoors, src) - if(alarm_type) - if(place == get_area(src)) - LAZYADD(place.active_firelocks, src) //We only add ourselves to our own area's active firelocks... - for(var/obj/machinery/firealarm/fire_panel in place.firealarms) - fire_panel.set_status() //...but all adjacent fire alarms are notified - -/** - * Removes us from any lists of areas in the affecting_areas list, then clears affecting_areas - * - * Undoes everything done in the CalculateAffectingAreas() proc, to clean up prior to deletion. - * Calls reset() first, in case any alarms need to be cleared first. - */ -/obj/machinery/door/firedoor/proc/remove_from_areas() - if(!affecting_areas) - return - for(var/area/place in affecting_areas) - LAZYREMOVE(place.firedoors, src) - LAZYREMOVE(place.active_firelocks, src) - if(LAZYLEN(place.active_firelocks)) //if we were the last firelock still active in this particular area - continue - for(var/obj/machinery/firealarm/fire_panel in place.firealarms) - fire_panel.set_status() - -/obj/machinery/door/firedoor/proc/merger_adding(obj/machinery/door/firedoor/us, datum/merger/new_merger) - SIGNAL_HANDLER - if(new_merger.id != merger_id) - return - RegisterSignal(new_merger, COMSIG_MERGER_REFRESH_COMPLETE, .proc/refresh_shared_turfs) - -/obj/machinery/door/firedoor/proc/merger_removing(obj/machinery/door/firedoor/us, datum/merger/old_merger) - SIGNAL_HANDLER - if(old_merger.id != merger_id) - return - UnregisterSignal(old_merger, COMSIG_MERGER_REFRESH_COMPLETE) - -/obj/machinery/door/firedoor/proc/refresh_shared_turfs(datum/source, list/leaving_members, list/joining_members) - SIGNAL_HANDLER - var/datum/merger/temp_group = source - if(temp_group.origin != src) +/obj/machinery/door/firedoor/Moved(atom/oldloc) + . = ..() + var/new_area = get_area(src) + if(my_area != new_area) + set_area(new_area) + +/obj/machinery/door/firedoor/proc/set_area(new_area) + if(my_area) + LAZYREMOVE(my_area.firedoors, src) + if(!new_area) return - var/list/shared_problems = list() // We only want to do this once, this is a nice way of pulling that off - for(var/obj/machinery/door/firedoor/firelock as anything in temp_group.members) - firelock.issue_turfs = shared_problems - for(var/dir in GLOB.cardinals) - var/turf/checked_turf = get_step(get_turf(firelock), dir) - if(!checked_turf) - continue - process_results(checked_turf) - -/obj/machinery/door/firedoor/proc/register_adjacent_turfs(atom/loc) - for(var/dir in GLOB.cardinals) - var/turf/checked_turf = get_step(get_turf(loc), dir) - - if(!checked_turf) - continue - process_results(checked_turf) - RegisterSignal(checked_turf, COMSIG_TURF_EXPOSE, .proc/process_results) - + my_area = new_area + if(my_area) + LAZYADD(my_area.firedoors, src) -/obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/loc) - for(var/dir in GLOB.cardinals) - var/turf/checked_turf = get_step(get_turf(loc), dir) - if(!checked_turf) - continue - - UnregisterSignal(checked_turf, COMSIG_TURF_EXPOSE) - -/obj/machinery/door/firedoor/proc/check_atmos(turf/checked_turf) - var/datum/gas_mixture/environment = checked_turf.return_air() - - if(environment?.temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - return FIRELOCK_ALARM_TYPE_HOT - if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT) - return FIRELOCK_ALARM_TYPE_COLD - return - -/obj/machinery/door/firedoor/proc/process_results(datum/source) +/obj/machinery/door/firedoor/proc/handle_alert(datum/source, code, sent_by_neighbor) SIGNAL_HANDLER - if(!COOLDOWN_FINISHED(src, detect_cooldown)) - return - if(alarm_type == FIRELOCK_ALARM_TYPE_GENERIC) + if(sent_by_neighbor && !alarm_type) //We dont care about neighbors if we have our own problems + if(code == FIRE_CLEAR) //bitflag & 0 returns false, dumbass. + INVOKE_ASYNC(src, .proc/open) + else + INVOKE_ASYNC(src, .proc/close) return - for(var/area/place in affecting_areas) - if(!place.fire_detect) //if any area is set to disable detection - return - - var/turf/checked_turf = source - var/result = check_atmos(checked_turf) - - if(result && Adjacent(checked_turf)) - issue_turfs |= checked_turf - if(!alarm_type) - start_activation_process(result) - else - issue_turfs -= checked_turf - if(!length(issue_turfs) && alarm_type) - start_deactivation_process() - - -/** - * Begins activation process of us and our neighbors. - * - * This proc will call activate() on every fire lock (including us) listed - * in the merge group datum. Returns without doing anything if our alarm_type - * was already set, as that means that we're already active. - * - * Arguments: - * code should be one of three defined alarm types, or can be not supplied. Will dictate the color of the fire alarm lights, and defults to "firelock_alarm_type_generic" - */ -/obj/machinery/door/firedoor/proc/start_activation_process(code = FIRELOCK_ALARM_TYPE_GENERIC) - if(alarm_type) - return //We're already active - soundloop.start() - is_playing_alarm = TRUE - var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) - for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) - buddylock.activate(code) -/** - * Begins deactivation process of us and our neighbors. - * - * This proc will call reset() on every fire lock (including us) listed - * in the merge group datum. sets our alarm type to null, signifying no alarm. - */ -/obj/machinery/door/firedoor/proc/start_deactivation_process() - soundloop.stop() - is_playing_alarm = FALSE - var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) - for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) - buddylock.reset() - -/** - * Proc that handles activation of the firelock and all this details - * - * Sets the alarm_type variable based on the single arg, which is in turn - * used by several procs to understand the intended state of the fire lock. - * Also calls set_status() on all fire alarms in all affected areas, tells - * the area the firelock sits in to report the event (AI, alarm consoles, etc) - * and finally calls correct_state(), which will handle opening or closing - * this fire lock. - */ -/obj/machinery/door/firedoor/proc/activate(code = FIRELOCK_ALARM_TYPE_GENERIC) - SIGNAL_HANDLER - if(alarm_type) - return //Already active - alarm_type = code - for(var/area/place in affecting_areas) - LAZYADD(place.active_firelocks, src) - if(LAZYLEN(place.active_firelocks) == 1) //if we're the first to activate in this particular area - for(var/obj/machinery/firealarm/fire_panel in place.firealarms) - fire_panel.set_status() - if(alarm_type != FIRELOCK_ALARM_TYPE_GENERIC) //Generic alarms tend to activate all firelocks in an area, which otherwise makes the red lighting spread like a virus. Anyway, fire alarms already do this for manual pulls. - place.set_fire_alarm_effect() //bathe in red - if(place == my_area) - place.alarm_manager.send_alarm(ALARM_FIRE, place) //We'll limit our reporting to just the area we're on. If the issue affects bordering areas, they can report it themselves - update_icon() //Sets the door lights even if the door doesn't move. - correct_state() + if(code == alarm_type) //We're already on this alert level. + return -/** - * Proc that handles reset steps - * - * Clears the alarm state and attempts to open the firelock. - */ -/obj/machinery/door/firedoor/proc/reset() - SIGNAL_HANDLER - alarm_type = null - for(var/area/place in affecting_areas) - LAZYREMOVE(place.active_firelocks, src) - if(!LAZYLEN(place.active_firelocks)) //if we were the last firelock still active in this particular area - for(var/obj/machinery/firealarm/fire_panel in place.firealarms) - fire_panel.set_status() - if(place == my_area) - place.alarm_manager.clear_alarm(ALARM_FIRE, place) - place.unset_fire_alarm_effects() - COOLDOWN_START(src, detect_cooldown, DETECT_COOLDOWN_STEP_TIME) - soundloop.stop() - is_playing_alarm = FALSE - update_icon() //Sets the door lights even if the door doesn't move. - correct_state() + switch(code) + if(FIRE_CLEAR) + alarm_type = code + INVOKE_ASYNC(src, .proc/open) + if(FIRE_RAISED_AIRALARM) //Pulls do not override air alarms + if(!alarm_type) + alarm_type = code + INVOKE_ASYNC(src, .proc/close) + if(FIRE_RAISED_PULL) + if(alarm_type & FIRE_RAISED_AIRALARM) + return //We cannot overrule airalarms + alarm_type = code + INVOKE_ASYNC(src, .proc/close) /obj/machinery/door/firedoor/emag_act(mob/user, obj/item/card/emag/doorjack/digital_crowbar) if(obj_flags & EMAGGED) @@ -380,16 +203,6 @@ . = ..() update_icon() - if(machine_stat & NOPOWER) - soundloop.stop() - return - - correct_state() - - if(is_playing_alarm) - soundloop.start() - - /obj/machinery/door/firedoor/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) @@ -447,7 +260,6 @@ user.visible_message(span_danger("[user] [welded?"welds":"unwelds"] [src]."), span_notice("You [welded ? "weld" : "unweld"] [src].")) log_game("[key_name(user)] [welded ? "welded":"unwelded"] firedoor [src] with [W] at [AREACOORD(src)]") update_appearance() - correct_state() /// We check for adjacency when using the primary attack. /obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) @@ -482,8 +294,6 @@ return TRUE if(density) open() - if(alarm_type) - addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) else close() return TRUE @@ -497,8 +307,6 @@ to_chat(user, span_warning("[src] refuses to budge!")) return open() - if(alarm_type) - addtimer(CALLBACK(src, .proc/correct_state), 2 SECONDS, TIMER_UNIQUE) /obj/machinery/door/firedoor/do_animate(animation) switch(animation) @@ -526,39 +334,16 @@ hazards.pixel_y = light_yoffset . += hazards -/** - * Corrects the current state of the door, based on if alarm_type is set. - * - * This proc is called after weld and power restore events. Gives the - * illusion that the door is constantly attempting to move without actually - * having to process it. Timers also call this, so that if alarm_type - * changes during the timer, the door doesn't close or open incorrectly. - */ -/obj/machinery/door/firedoor/proc/correct_state() - if(obj_flags & EMAGGED) - return //Unmotivated, indifferent, we have no real care what state we're in anymore. - if(alarm_type && !density) //We should be closed but we're not - INVOKE_ASYNC(src, .proc/close) - return - if(!alarm_type && density) //We should be open but we're not - INVOKE_ASYNC(src, .proc/open) - return - /obj/machinery/door/firedoor/open() if(welded) return - var/alarm = alarm_type - . = ..() - if(alarm != alarm_type) //Something changed while we were sleeping - correct_state() //So we should re-evaluate our state + return ..() /obj/machinery/door/firedoor/close() if(HAS_TRAIT(loc, TRAIT_FIREDOOR_STOP)) return - var/alarm = alarm_type - . = ..() - if(alarm != alarm_type) //Something changed while we were sleeping - correct_state() //So we should re-evaluate our state + return ..() + /obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -575,15 +360,10 @@ new /obj/item/electronics/firelock (targetloc) qdel(src) -/obj/machinery/door/firedoor/Moved(atom/oldloc) - . = ..() - unregister_adjacent_turfs(oldloc) - register_adjacent_turfs(src) - /obj/machinery/door/firedoor/closed icon_state = "door_closed" density = TRUE - alarm_type = FIRELOCK_ALARM_TYPE_GENERIC + alarm_type = FIRE_RAISED_PULL /obj/machinery/door/firedoor/border_only icon = 'icons/obj/doors/edge_Doorfire.dmi' @@ -594,7 +374,7 @@ /obj/machinery/door/firedoor/border_only/closed icon_state = "door_closed" density = TRUE - alarm_type = FIRELOCK_ALARM_TYPE_GENERIC + alarm_type = FIRE_RAISED_PULL /obj/machinery/door/firedoor/border_only/Initialize(mapload) . = ..() @@ -812,4 +592,3 @@ #undef CONSTRUCTION_PANEL_OPEN #undef CONSTRUCTION_NO_CIRCUIT -#undef DETECT_COOLDOWN_STEP_TIME diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index aaac9406ed2..dee5d853115 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -33,8 +33,8 @@ var/buildstage = 2 ///Our home area, set in Init. Due to loading step order, this seems to be null very early in the server setup process, which is why some procs use `my_area?` for var or list checks. var/area/my_area = null - ///looping sound datum for our fire alarm siren. - var/datum/looping_sound/firealarm/soundloop + ///The current alarm state + var/alarm_type = FIRE_CLEAR /obj/machinery/firealarm/Initialize(mapload, dir, building) . = ..() @@ -44,11 +44,8 @@ if(name == initial(name)) name = "[get_area_name(src)] [initial(name)]" update_appearance() - my_area = get_area(src) - LAZYADD(my_area.firealarms, src) - + RegisterSignal(src, COMSIG_FIRE_ALERT, .proc/handle_alert) RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_security_level) - soundloop = new(src, FALSE) AddComponent(/datum/component/usb_port, list( /obj/item/circuit_component/firealarm, @@ -60,28 +57,34 @@ rmb_text = "Turn off", \ ) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/firealarm/LateInitialize() + . = ..() + set_area(get_area(src)) + /obj/machinery/firealarm/Destroy() - if(my_area) - LAZYREMOVE(my_area.firealarms, src) - my_area = null - QDEL_NULL(soundloop) + set_area(null) return ..() -/** - * Sets the sound state, and then calls update_icon() - * - * This proc exists to be called by areas and firelocks - * so that it may update its icon and start or stop playing - * the alarm sound based on the state of an area variable. - */ -/obj/machinery/firealarm/proc/set_status() - if(!(my_area.fire || LAZYLEN(my_area.active_firelocks)) || (obj_flags & EMAGGED)) - soundloop.stop() - update_appearance() +/obj/machinery/firealarm/Moved(atom/OldLoc, Dir) + . = ..() + var/new_area = get_area(src) + if(my_area != new_area) + set_area(new_area) + +/obj/machinery/firealarm/proc/set_area(new_area) + if(my_area) + LAZYREMOVE(my_area.firealarms, src) + if(!new_area) + return + my_area = new_area + if(my_area) + LAZYADD(my_area.firealarms, src) /obj/machinery/firealarm/update_appearance(updates) . = ..() - if((my_area?.fire || LAZYLEN(my_area?.active_firelocks)) && !(obj_flags & EMAGGED) && !(machine_stat & (BROKEN|NOPOWER))) + if(alarm_type && !(obj_flags & EMAGGED) && !(machine_stat & (BROKEN|NOPOWER))) set_light(l_power = 0.8) else set_light(l_power = 0) @@ -111,7 +114,7 @@ . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]", alpha = src.alpha) - if(!(my_area?.fire || LAZYLEN(my_area?.active_firelocks))) + if(!alarm_type) if(my_area?.fire_detect) //If this is false, leave the green light missing. A good hint to anyone paying attention. . += "fire_off" . += mutable_appearance(icon, "fire_off") @@ -125,7 +128,7 @@ . += mutable_appearance(icon, "fire_on") . += emissive_appearance(icon, "fire_on", alpha = src.alpha) - if(!panel_open && my_area?.fire_detect && my_area?.fire) //It just looks horrible with the panel open + if(!panel_open && alarm_type) //It just looks horrible with the panel open . += "fire_detected" . += mutable_appearance(icon, "fire_detected") . += emissive_appearance(icon, "fire_detected", alpha = src.alpha) //Pain @@ -148,7 +151,7 @@ user.visible_message(span_warning("Sparks fly out of [src]!"), span_notice("You override [src], disabling the speaker.")) playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - set_status() + /** * Signal handler for checking if we should update fire alarm appearance accordingly to a newly set security level @@ -163,6 +166,27 @@ if(is_station_level(z)) update_appearance() +/obj/machinery/firealarm/proc/handle_alert(datum/source, code) + SIGNAL_HANDLER + + if(alarm_type == code) + return + + switch(code) + if(FIRE_CLEAR) + alarm_type = code + reset() + if(FIRE_RAISED_AIRALARM) + if(alarm_type & FIRE_RAISED_PULL) + return + alarm_type = code + alarm() + if(FIRE_RAISED_PULL) + if(alarm_type & FIRE_RAISED_AIRALARM) + return //We cannot overrule airalarms + alarm_type = code + alarm() + /** * Sounds the fire alarm and closes all firelocks in the area. Also tells the area to color the lights red. * @@ -172,18 +196,10 @@ /obj/machinery/firealarm/proc/alarm(mob/user) if(!is_operational) return - - if(my_area.fire) - return //area alarm already active - my_area.alarm_manager.send_alarm(ALARM_FIRE, my_area) - my_area.set_fire_alarm_effect() - for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors) - firelock.activate(FIRELOCK_ALARM_TYPE_GENERIC) - if(user) - log_game("[user] triggered a fire alarm at [COORD(src)]") - soundloop.start() //Manually pulled fire alarms will make the sound, rather than the doors. SEND_SIGNAL(src, COMSIG_FIREALARM_ON_TRIGGER) update_use_power(ACTIVE_POWER_USE) + update_appearance() + /** * Resets all firelocks in the area. Also tells the area to disable alarm lighting, if it was enabled. @@ -194,22 +210,31 @@ /obj/machinery/firealarm/proc/reset(mob/user) if(!is_operational) return - my_area.unset_fire_alarm_effects() - for(var/obj/machinery/door/firedoor/firelock in my_area.firedoors) - firelock.reset() - my_area.alarm_manager.clear_alarm(ALARM_FIRE, my_area) - if(user) - log_game("[user] reset a fire alarm at [COORD(src)]") - soundloop.stop() SEND_SIGNAL(src, COMSIG_FIREALARM_ON_RESET) update_use_power(IDLE_POWER_USE) + update_appearance() /obj/machinery/firealarm/attack_hand(mob/user, list/modifiers) if(buildstage != 2) return . = ..() add_fingerprint(user) - alarm(user) + if(!is_operational) + return + + switch(alarm_type) + if(FIRE_RAISED_AIRALARM) //Can't clear an atmos alert with a fire alarm + if(issilicon(user)) + to_chat(user, span_danger("This alert was triggered by an airalarm, it won't budge!")) + else + to_chat(user, span_danger("[src] doesn't budge!")) + return + if(FIRE_RAISED_PULL) + my_area.communicate_fire_alert(FIRE_CLEAR) + log_game("[user] triggered a fire alarm at [COORD(src)]") + else + my_area.communicate_fire_alert(FIRE_RAISED_PULL) + log_game("[user] cleared a fire alarm at [COORD(src)]") /obj/machinery/firealarm/attack_hand_secondary(mob/user, list/modifiers) if(buildstage != 2) @@ -267,9 +292,7 @@ else if(tool.force) //hit and turn it on ..() - var/area/area = get_area(src) - if(!area.fire) - alarm() + attack_hand(user) return if(1) @@ -371,13 +394,8 @@ // Allows users to examine the state of the thermal sensor /obj/machinery/firealarm/examine(mob/user) . = ..() - if((my_area?.fire || LAZYLEN(my_area?.active_firelocks))) + if((alarm_type)) . += "The local area hazard light is flashing." - . += "<b>Left-Click</b> to activate all firelocks in this area." - . += "<b>Right-Click</b> to reset firelocks in this area." - else - . += "The local area thermal detection light is [my_area.fire_detect ? "lit" : "unlit"]." - . += "<b>Left-Click</b> to activate all firelocks in this area." // Allows Silicons to disable thermal sensor /obj/machinery/firealarm/BorgCtrlClick(mob/living/silicon/robot/user) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index e8147324351..194db8520f9 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -219,10 +219,6 @@ var/prevname = "[A.name]" set_area_machinery_title(A, new_name, prevname) A.name = new_name - if(A.firedoors) - for(var/D in A.firedoors) - var/obj/machinery/door/firedoor/FD = D - FD.CalculateAffectingAreas() A.update_areasize() return TRUE diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index dc2472d72e0..a6aa1a60e8a 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -290,19 +290,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags, oldType) //called after a turf has been replaced in ChangeTurf() levelupdate() - /*if(flags & CHANGETURF_RECALC_ADJACENT) - immediate_calculate_adjacent_turfs() - if(ispath(oldType, /turf/closed) && istype(src, /turf/open)) - SSair.add_to_active(src) - else //In effect, I want closed turfs to make their tile active when sheered, but we need to queue it since they have no adjacent turfs - CALCULATE_ADJACENT_TURFS(src, (!(ispath(oldType, /turf/closed) && istype(src, /turf/open)) ? NORMAL_TURF : MAKE_ACTIVE))*/ - //update firedoor adjacency - var/list/turfs_to_check = get_adjacent_open_turfs(src) | src - for(var/I in turfs_to_check) - var/turf/T = I - for(var/obj/machinery/door/firedoor/FD in T) - FD.CalculateAffectingAreas() - HandleTurfChange(src) /turf/open/AfterChange(flags, oldType) @@ -312,75 +299,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //Assimilate_Air() SSzas.mark_for_update(src) -//////Assimilate Air////// -/*/turf/open/proc/Assimilate_Air() - var/list/turf/turf_list = get_adjacent_open_turfs(src) - var/turf_count = LAZYLEN(turf_list) - if(blocks_air || !turf_count) - return - var/datum/gas_mixture/total = new - var/list/total_gases = total.gas - turf_list += src - turf_count += 1 - var/energy = 0 - var/heat_cap = 0 - for(var/turf/T in turf_list) - var/datum/gas_mixture/turf_mix = T.return_air() - var/capacity = turf_mix.getHeatCapacity() - energy += turf_mix.temperature * capacity - heat_cap += capacity - - var/list/giver_gases = turf_mix.gas - for(var/giver_id in giver_gases) - total_gases[giver_id] = giver_gases[giver_id] - - total.temperature = energy / heat_cap - for(var/id in total_gases) - total_gases[id] /= turf_count - - for(var/turf/T as anything in turf_list) - T.return_air().copyFrom(total) - SSzas.mark_for_update(T) -*/ -/* -/turf/open/proc/Assimilate_Air() - var/turf_count = LAZYLEN(atmos_adjacent_turfs) - if(blocks_air || !turf_count) //if there weren't any open turfs, no need to update. - return - - var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs - var/list/total_gases = total.gases - //Stolen blatently from self_breakdown - var/list/turf_list = atmos_adjacent_turfs + src - var/turflen = turf_list.len - var/energy = 0 - var/heat_cap = 0 - - for(var/t in turf_list) - var/turf/open/T = t - //Cache? - var/datum/gas_mixture/turf/mix = T.air - //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out - //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - var/capacity = mix.getHeatCapacity() - energy += mix.temperature * capacity - heat_cap += capacity - - var/list/giver_gases = mix.gases - for(var/giver_id in giver_gases) - ASSERT_GAS(giver_id, total) - total_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] - - total.temperature = energy / heat_cap - for(var/id in total_gases) - total_gases[id][MOLES] /= turflen - - for(var/t in turf_list) - var/turf/open/T = t - T.air.copyFrom(total) - T.update_visuals() - SSair.add_to_active(T) -*/ /turf/proc/ReplaceWithLattice() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) new /obj/structure/lattice(locate(x, y, z)) diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index e00022c5815..706c7b7178c 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -124,12 +124,16 @@ /datum/xgm_gas/hydrogen/deuterium id = GAS_DEUTERIUM name = "Deuterium" + specific_heat = 80 + molar_mass = 0.004 symbol_html = "<sup>2</sup>H" symbol = "2H" /datum/xgm_gas/hydrogen/tritium id = GAS_TRITIUM name = "Tritium" + molar_mass = 0.006 + specific_heat = 60 symbol_html = "<sup>3</sup>H" symbol = "T" diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index b59985506ce..768f2d5bbb1 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -79,6 +79,8 @@ var/danger_level = 0 var/mode = AALARM_MODE_SCRUBBING + ///The fire alert type currently active + var/alert_type = FIRE_CLEAR ///A reference to the area we are in var/area/my_area @@ -121,30 +123,6 @@ GAS_SULFUR = new/datum/tlv(-1, -1, 1000, 1000), GAS_ARGON = new/datum/tlv(-1, -1, 1000, 1000), ) - /* // Breathable air. - "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), // kPa. Values are hazard_min, warning_min, warning_max, hazard_max - "temperature" = new/datum/tlv(BODYTEMP_COLD_WARNING_1, BODYTEMP_COLD_WARNING_1+10, BODYTEMP_HEAT_WARNING_1-27, BODYTEMP_HEAT_WARNING_1), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 15, 30), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/nitrium = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires - /datum/gas/freon = new/datum/tlv/dangerous, - /datum/gas/hydrogen = new/datum/tlv/dangerous, - /datum/gas/healium = new/datum/tlv/dangerous, - /datum/gas/proto_nitrate = new/datum/tlv/dangerous, - /datum/gas/zauker = new/datum/tlv/dangerous, - /datum/gas/helium = new/datum/tlv/dangerous, - /datum/gas/antinoblium = new/datum/tlv/dangerous, - /datum/gas/halon = new/datum/tlv/dangerous - )*/ /obj/machinery/airalarm/Initialize(mapload, ndir, nbuild) . = ..() @@ -160,7 +138,7 @@ name = "[get_area_name(src)] Air Alarm" alarm_manager = new(src) - my_area = get_area(src) + RegisterSignal(src, COMSIG_FIRE_ALERT, .proc/handle_alert) update_appearance() set_frequency(frequency) @@ -169,16 +147,36 @@ /obj/item/circuit_component/air_alarm, )) + return INITIALIZE_HINT_LATELOAD +/obj/machinery/airalarm/LateInitialize() + . = ..() + set_area(get_area(src)) /obj/machinery/airalarm/Destroy() - if(my_area) - my_area = null + set_area(null) SSradio.remove_object(src, frequency) QDEL_NULL(wires) QDEL_NULL(alarm_manager) return ..() +/obj/machinery/airalarm/Moved(atom/OldLoc, Dir) + . = ..() + var/new_area = get_area(src) + if(my_area != new_area) + set_area(new_area) + +/obj/machinery/airalarm/proc/set_area(new_area) + SHOULD_NOT_SLEEP(TRUE) + + if(my_area) + LAZYREMOVE(my_area.airalarms, src) + if(!new_area) + return + my_area = new_area + if(my_area) + LAZYADD(my_area.airalarms, src) + /obj/machinery/airalarm/examine(mob/user) . = ..() switch(buildstage) @@ -211,8 +209,8 @@ "danger_level" = danger_level, ) - data["atmos_alarm"] = !!my_area.active_alarms[ALARM_ATMOS] - data["fire_alarm"] = my_area.fire + data["atmos_alarm"] = !!my_area.active_alarms[ALARM_ATMOS] //Casting to boolean + data["fire_alarm"] = !!alert_type //Same here var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() @@ -673,22 +671,13 @@ /obj/machinery/airalarm/proc/apply_danger_level() var/new_area_danger_level = 0 - for(var/obj/machinery/airalarm/AA in my_area) + for(var/obj/machinery/airalarm/AA in my_area?.airalarms) if (!(AA.machine_stat & (NOPOWER|BROKEN)) && !AA.shorted) new_area_danger_level = clamp(max(new_area_danger_level, AA.danger_level), 0, 1) var/did_anything_happen - var/area/local_area = get_area(src) if(new_area_danger_level) did_anything_happen = alarm_manager.send_alarm(ALARM_ATMOS) - if(danger_level == TLV_OUTSIDE_HAZARD_LIMIT) - for(var/obj/machinery/door/firedoor/door in local_area.firedoors) - door.start_activation_process(FIRELOCK_ALARM_TYPE_GENERIC) - else - if(danger_level < TLV_OUTSIDE_WARNING_LIMIT) - for(var/obj/machinery/door/firedoor/door in local_area.firedoors) - door.start_deactivation_process(FIRELOCK_ALARM_TYPE_GENERIC) - did_anything_happen = alarm_manager.clear_alarm(ALARM_ATMOS) if(did_anything_happen) //if something actually changed post_alert(new_area_danger_level) @@ -852,23 +841,8 @@ GAS_OXYGEN = new/datum/tlv/no_checks, GAS_NITROGEN = new/datum/tlv/no_checks, GAS_CO2 = new/datum/tlv/no_checks, - //datum/gas/miasma = new/datum/tlv/no_checks, GAS_PLASMA = new/datum/tlv/no_checks, GAS_N2O = new/datum/tlv/no_checks, - /*/datum/gas/bz = new/datum/tlv/no_checks, - /datum/gas/hypernoblium = new/datum/tlv/no_checks, - /datum/gas/water_vapor = new/datum/tlv/no_checks, - /datum/gas/tritium = new/datum/tlv/no_checks, - /datum/gas/nitrium = new/datum/tlv/no_checks, - /datum/gas/pluoxium = new/datum/tlv/no_checks, - /datum/gas/freon = new/datum/tlv/no_checks, - /datum/gas/hydrogen = new/datum/tlv/no_checks, - /datum/gas/healium = new/datum/tlv/dangerous, - /datum/gas/proto_nitrate = new/datum/tlv/dangerous, - /datum/gas/zauker = new/datum/tlv/dangerous, - /datum/gas/helium = new/datum/tlv/dangerous, - /datum/gas/antinoblium = new/datum/tlv/dangerous, - /datum/gas/halon = new/datum/tlv/dangerous,*/ ) /obj/machinery/airalarm/kitchen_cold_room // Kitchen cold rooms start off at -14°C or 259.15K. @@ -878,23 +852,7 @@ GAS_OXYGEN = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa GAS_NITROGEN = new/datum/tlv(-1, -1, 1000, 1000), GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), - //datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), GAS_PLASMA = new/datum/tlv/dangerous, - /*/datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/nitrium = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires - /datum/gas/freon = new/datum/tlv/dangerous, - /datum/gas/hydrogen = new/datum/tlv/dangerous, - /datum/gas/healium = new/datum/tlv/dangerous, - /datum/gas/proto_nitrate = new/datum/tlv/dangerous, - /datum/gas/zauker = new/datum/tlv/dangerous, - /datum/gas/helium = new/datum/tlv/dangerous, - /datum/gas/antinoblium = new/datum/tlv/dangerous, - /datum/gas/halon = new/datum/tlv/dangerous,*/ ) /obj/machinery/airalarm/unlocked @@ -1002,6 +960,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) settings.warning_max = max_1 settings.hazard_max = max_2 +/obj/machinery/airalarm/proc/handle_alert(datum/source, code, sent_by_neighbor) + SIGNAL_HANDLER + + return + + #undef AALARM_MODE_SCRUBBING #undef AALARM_MODE_VENTING #undef AALARM_MODE_PANIC diff --git a/pariah.dme b/pariah.dme index 575acdf6792..6b62c0bbe0e 100644 --- a/pariah.dme +++ b/pariah.dme @@ -229,6 +229,7 @@ #include "code\__DEFINES\dcs\signals\signals_janitor.dm" #include "code\__DEFINES\dcs\signals\signals_ladder.dm" #include "code\__DEFINES\dcs\signals\signals_light_eater.dm" +#include "code\__DEFINES\dcs\signals\signals_machinery.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" #include "code\__DEFINES\dcs\signals\signals_mind.dm" #include "code\__DEFINES\dcs\signals\signals_mod.dm" From f84479658b45fda464f6dda8b309f9002cfc8ec6 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 4 Jul 2022 01:39:17 -0400 Subject: [PATCH 180/200] IM A DUMBASS IM A DUMBASS IM A DUMBASS --- code/__HELPERS/areas.dm | 1 - code/game/area/areas.dm | 52 ++----------------- code/game/machinery/doors/firedoor.dm | 26 +++++----- .../atmospherics/machinery/airalarm.dm | 2 +- 4 files changed, 20 insertions(+), 61 deletions(-) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 956ebf09b7b..2ea46b62a9a 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -100,7 +100,6 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engineerin newA.create_area_lighting_objects() SEND_GLOBAL_SIGNAL(COMSIG_AREA_CREATED, newA, oldA, creator) - CalculateAdjacentFireAreas() to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) return TRUE diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b933a211dae..c011af57b5b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -17,14 +17,12 @@ ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm. var/fire_detect = TRUE - ///A list of all fire locks in this area. Used by fire alarm panels when resetting fire locks or activating all in an area + ///A list of all fire locks in this area and on the border of this area. var/list/firedoors - ///A list of all fire alarms in this area. Used by fire locks and burglar alarms to tell the fire alarm to change its icon. + ///A list of all fire alarms in this area OR ADJACENT TO IT var/list/firealarms ///A list of all air alarms in this area var/list/airalarms - ///A list of adjacent areas that will close their fire doors when a fire alarm is sent out by us. - var/list/adjacent_fire_areas ///Alarm type to count of sources. Not usable for ^ because we handle fires differently var/list/active_alarms = list() @@ -194,7 +192,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/LateInitialize() power_change() // all machines set to current power level, also updates icon update_beauty() - CalculateAdjacentFireAreas() /area/proc/RunGeneration() if(map_generator) @@ -481,48 +478,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) return ///Called by airalarms and firealarms to communicate the status of the area to relevant machines -/area/proc/communicate_fire_alert(code, sent_by_neighbor) +/area/proc/communicate_fire_alert(code) for(var/obj/machinery/light/L in src) L.update() - if(sent_by_neighbor) //If a neighboring area is sending an alert, only the firedoors care. - if(firedoors) - for(var/datum/listener as anything in firedoors) - SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code, sent_by_neighbor) - else - for(var/datum/listener in airalarms + firealarms + firedoors) - SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code, sent_by_neighbor) - - for(var/area/neighbor as anything in adjacent_fire_areas) - neighbor.communicate_fire_alert(code, TRUE) - -/** - * Calculates what areas are nearby to recieve alarm. - * - * This proc builds a list of areas that border other areas using firedoors. - * It is fairly expensive so it should be run as little as possible (lateinit + area creation) - */ -/proc/CalculateAdjacentFireAreas() - for(var/area/area_iter in GLOB.sortedAreas) - area_iter.adjacent_fire_areas = list() - - for(var/area/area_iter in GLOB.sortedAreas) - //Area has no fire doors? Fuck it. We don't care about it. - if(!area_iter.firedoors) - continue - - //Loop through all fire doors in the area... - for(var/obj/machinery/door/firedoor/FD as anything in area_iter.firedoors) - //Grab a list of areas adjacent to the fire doors - var/list/areas2add = get_adjacent_areas(FD) - //Loop through the areas that the firedoors are touching... - for(var/area/adj_area as anything in areas2add) - //Ignore their loc area - if(adj_area == area_iter) - continue - //Add them to iter's adjacency - area_iter.adjacent_fire_areas |= adj_area - //Add iter to their adjacency - adj_area.adjacent_fire_areas |= area_iter - - + for(var/datum/listener in airalarms + firealarms + firedoors) + SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code,) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 6cb605a23d0..d5cda2d3a77 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -31,8 +31,10 @@ var/light_yoffset = 0 var/boltslocked = TRUE - ///For the few times we affect only the area we're actually in. Set during Init. If we get moved, we don't update, but this is consistant with fire alarms and also kinda funny so call it intentional. + ///The firedoor's area loc var/area/my_area + ///Every area a firedoor is listening to. + var/list/joined_areas = list() ///Type of alarm when active. See code/defines/firealarm.dm for the list. This var being null means there is no alarm. var/alarm_type = FIRE_CLEAR @@ -145,23 +147,23 @@ /obj/machinery/door/firedoor/proc/set_area(new_area) if(my_area) LAZYREMOVE(my_area.firedoors, src) + for(var/area/A in joined_areas) + LAZYREMOVE(A.firedoors, src) + joined_areas.Cut() + if(!new_area) return my_area = new_area - if(my_area) - LAZYADD(my_area.firedoors, src) - + if(!my_area) + return -/obj/machinery/door/firedoor/proc/handle_alert(datum/source, code, sent_by_neighbor) - SIGNAL_HANDLER + for(var/area/area2join in get_adjacent_open_areas(src) | my_area) + LAZYDISTINCTADD(area2join.firedoors, src) + joined_areas |= area2join - if(sent_by_neighbor && !alarm_type) //We dont care about neighbors if we have our own problems - if(code == FIRE_CLEAR) //bitflag & 0 returns false, dumbass. - INVOKE_ASYNC(src, .proc/open) - else - INVOKE_ASYNC(src, .proc/close) - return +/obj/machinery/door/firedoor/proc/handle_alert(datum/source, code) + SIGNAL_HANDLER if(code == alarm_type) //We're already on this alert level. return diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 768f2d5bbb1..498a1e9ddc9 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -960,7 +960,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) settings.warning_max = max_1 settings.hazard_max = max_2 -/obj/machinery/airalarm/proc/handle_alert(datum/source, code, sent_by_neighbor) +/obj/machinery/airalarm/proc/handle_alert(datum/source, code) SIGNAL_HANDLER return From 7cbcb1a4f6923d6eae8d65c48d32681dbb6876de Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 4 Jul 2022 02:33:02 -0400 Subject: [PATCH 181/200] ashlizard lungs --- code/modules/surgery/organs/lungs.dm | 189 +++------------------------ code/modules/unit_tests/breath.dm | 4 +- 2 files changed, 22 insertions(+), 171 deletions(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index f15a8088b31..f06077023e8 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -279,159 +279,6 @@ n2o_euphoria = EUPHORIA_INACTIVE breather.clear_alert(ALERT_TOO_MUCH_N2O) - /* - // BZ - - var/bz_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/bz][MOLES]) - if(bz_pp > BZ_trip_balls_min) - breather.hallucination += 10 - breather.reagents.add_reagent(/datum/reagent/bz_metabolites,5) - if(bz_pp > BZ_brain_damage_min && prob(33)) - breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) - - // Tritium - var/trit_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/tritium][MOLES]) - // If you're breathing in half an atmosphere of radioactive gas, you fucked up. - if (trit_pp > tritium_irradiation_moles_min && SSradiation.can_irradiate_basic(breather)) - var/lerp_scale = min(tritium_irradiation_moles_max, trit_pp - tritium_irradiation_moles_min) / (tritium_irradiation_moles_max - tritium_irradiation_moles_min) - var/chance = LERP(tritium_irradiation_probability_min, tritium_irradiation_probability_max, lerp_scale) - if (prob(chance)) - breather.AddComponent(/datum/component/irradiated) - - gas_breathed = breath_gases[/datum/gas/tritium][MOLES] - - if (trit_pp > 0) - var/ratio = gas_breathed * 15 - breather.adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) - - breath_gases[/datum/gas/tritium][MOLES] -= gas_breathed - - // Nitrium - var/nitrium_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/nitrium][MOLES]) - if (prob(nitrium_pp) && nitrium_pp > 15) - breather.adjustOrganLoss(ORGAN_SLOT_LUNGS, nitrium_pp * 0.1) - to_chat(breather, "<span class='notice'>You feel a burning sensation in your chest</span>") - gas_breathed = breath_gases[/datum/gas/nitrium][MOLES] - if (nitrium_pp > 5) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_low_metabolization) - breather.reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, max(0, 2 - existing)) - if (nitrium_pp > 10) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/nitrium_high_metabolization) - breather.reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, max(0, 1 - existing)) - - breath_gases[/datum/gas/nitrium][MOLES] -= gas_breathed - - // Freon - var/freon_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/freon][MOLES]) - if (prob(freon_pp)) - to_chat(breather, span_alert("Your mouth feels like it's burning!")) - if (freon_pp >40) - breather.emote("gasp") - breather.adjustFireLoss(15) - if (prob(freon_pp/2)) - to_chat(breather, span_alert("Your throat closes up!")) - breather.silent = max(breather.silent, 3) - else - breather.adjustFireLoss(freon_pp/4) - gas_breathed = breath_gases[/datum/gas/freon][MOLES] - if (gas_breathed > gas_stimulation_min) - breather.reagents.add_reagent(/datum/reagent/freon,1) - - breath_gases[/datum/gas/freon][MOLES]-=gas_breathed - - // Healium - var/healium_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/healium][MOLES]) - if(healium_pp > gas_stimulation_min) - if(prob(15)) - to_chat(breather, span_alert("Your head starts spinning and your lungs burn!")) - healium_euphoria = EUPHORIA_ACTIVE - breather.emote("gasp") - else - healium_euphoria = EUPHORIA_INACTIVE - - if(healium_pp > healium_para_min) - breather.Unconscious(rand(30, 50))//not in seconds to have a much higher variation - if(healium_pp > healium_sleep_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/healium) - breather.reagents.add_reagent(/datum/reagent/healium,max(0, 1 - existing)) - gas_breathed = breath_gases[/datum/gas/healium][MOLES] - breath_gases[/datum/gas/healium][MOLES]-=gas_breathed - - // Proto Nitrate - // Inert - // Zauker - var/zauker_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/zauker][MOLES]) - if(zauker_pp > gas_stimulation_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/zauker) - breather.reagents.add_reagent(/datum/reagent/zauker, max(0, 1 - existing)) - gas_breathed = breath_gases[/datum/gas/zauker][MOLES] - breath_gases[/datum/gas/zauker][MOLES]-=gas_breathed - - // Halon - var/halon_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/halon][MOLES]) - if(halon_pp > gas_stimulation_min) - breather.adjustOxyLoss(5) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/halon) - breather.reagents.add_reagent(/datum/reagent/halon,max(0, 1 - existing)) - gas_breathed = breath_gases[/datum/gas/halon][MOLES] - breath_gases[/datum/gas/halon][MOLES]-=gas_breathed - - // Hyper-Nob - gas_breathed = breath_gases[/datum/gas/hypernoblium][MOLES] - if (gas_breathed > gas_stimulation_min) - var/existing = breather.reagents.get_reagent_amount(/datum/reagent/hypernoblium) - breather.reagents.add_reagent(/datum/reagent/hypernoblium,max(0, 1 - existing)) - breath_gases[/datum/gas/hypernoblium][MOLES]-=gas_breathed - - // Miasma - if (breath_gases[/datum/gas/miasma] && suffers_miasma) - var/miasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/miasma][MOLES]) - - //Miasma sickness - if(prob(0.5 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(min(round(max(miasma_pp/2, 1), 1), 6), min(round(max(miasma_pp, 1), 1), 8)) - //tl;dr the first argument chooses the smaller of miasma_pp/2 or 6(typical max virus symptoms), the second chooses the smaller of miasma_pp or 8(max virus symptom level) // - miasma_disease.name = "Unknown"//^each argument has a minimum of 1 and rounds to the nearest value. Feel free to change the pp scaling I couldn't decide on good numbers for it. - miasma_disease.try_infect(owner) - - // Miasma side effects - switch(miasma_pp) - if(0.25 to 5) - // At lower pp, give out a little warning - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") - if(prob(5)) - to_chat(owner, span_notice("There is an unpleasant smell in the air.")) - if(5 to 15) - //At somewhat higher pp, warning becomes more obvious - if(prob(15)) - to_chat(owner, span_warning("You smell something horribly decayed inside this room.")) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) - if(15 to 30) - //Small chance to vomit. By now, people have internals on anyway - if(prob(5)) - to_chat(owner, span_warning("The stench of rotting carcasses is unbearable!")) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - owner.vomit() - if(30 to INFINITY) - //Higher chance to vomit. Let the horror start - if(prob(15)) - to_chat(owner, span_warning("The stench of rotting carcasses is unbearable!")) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - owner.vomit() - else - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") - - // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds - // Then again, this is a purely hypothetical scenario and hardly reachable - owner.adjust_disgust(0.1 * miasma_pp) - - breath_gases[/datum/gas/miasma][MOLES]-=gas_breathed - - // Clear out moods when no miasma at all - else - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell") - */ - if (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) else if (n2o_euphoria == EUPHORIA_INACTIVE && healium_euphoria == EUPHORIA_INACTIVE) @@ -610,11 +457,11 @@ // Normal oxygen is 21 kPa partial pressure, but SS13 humans can tolerate down // to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules. #define GAS_TOLERANCE 5 -/* + /obj/item/organ/lungs/ashwalker/Initialize(mapload) . = ..() - var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] + var/datum/gas_mixture/mix = SSzas.lavaland_atmos if(!mix?.get_moles()) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE return @@ -622,26 +469,30 @@ // Take a "breath" of the air var/datum/gas_mixture/breath = mix.remove(mix.get_moles() * BREATH_PERCENTAGE) - var/oxygen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/oxygen][MOLES]) - var/nitrogen_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/nitrogen][MOLES]) - var/plasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/plasma][MOLES]) - var/carbon_dioxide_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/carbon_dioxide][MOLES]) - /* - var/bz_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/bz][MOLES]) - var/miasma_pp = breath.getBreathPartialPressure(breath_gases[/datum/gas/miasma][MOLES]) - */ + var/list/breath_gases = breath.gas + var/O2_moles = breath_gases[GAS_OXYGEN] + var/N2_moles = breath_gases[GAS_NITROGEN] + var/plasma_moles = breath_gases[GAS_PLASMA] + var/CO2_moles = breath_gases[GAS_CO2] + var/SA_moles = breath_gases[GAS_N2O] - safe_oxygen_min = max(0, oxygen_pp - GAS_TOLERANCE) - safe_nitro_min = max(0, nitrogen_pp - GAS_TOLERANCE) - safe_plasma_min = max(0, plasma_pp - GAS_TOLERANCE) + //Partial pressures in our breath + var/O2_pp = breath.getBreathPartialPressure(O2_moles) + var/N2_pp = breath.getBreathPartialPressure(N2_moles) + var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) + var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) + + safe_oxygen_min = max(0, O2_pp - GAS_TOLERANCE) + safe_nitro_min = max(0, N2_pp - GAS_TOLERANCE) + safe_plasma_min = max(0, Plasma_pp - GAS_TOLERANCE) // Increase plasma tolerance based on amount in base air - safe_plasma_max += plasma_pp + safe_plasma_max += Plasma_pp // CO2 is always a waste gas, so none is required, but ashwalkers // tolerate the base amount plus tolerance*2 (humans tolerate only 10 pp) - safe_co2_max = carbon_dioxide_pp + GAS_TOLERANCE * 2 + safe_co2_max = CO2_pp + GAS_TOLERANCE * 2 // The lung tolerance against BZ is also increased the amount of BZ in the base air /* @@ -653,7 +504,7 @@ //if(miasma_pp) //suffers_miasma = FALSE -*/ + #undef GAS_TOLERANCE /obj/item/organ/lungs/ethereal diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index 97cde0e0658..fa7994e43f1 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -63,7 +63,7 @@ var/turf/open/to_fill = run_loc_floor_bottom_left //Prep the floor - to_fill.initial_gas = LAVALAND_DEFAULT_ATMOS + to_fill.initial_gas = SSzas.lavaland_atmos.gas to_fill.make_air() lab_rat.breathe() @@ -73,7 +73,7 @@ return Fail("Assertion Failed: Turf failed to return air. Type: [to_fill.type], Initial Gas: [json_encode(to_fill.initial_gas)]") var/datum/gas_mixture/turf_gas = to_fill.return_air() - LAZYADD(reason, "Turf mix: [json_encode(turf_gas.gas)] | T: [turf_gas.temperature] | P: [turf_gas.returnPressure()]") + LAZYADD(reason, "Turf mix: [json_encode(turf_gas.gas)] | T: [turf_gas.temperature] | P: [turf_gas.returnPressure()] | Initial Gas: [json_encode(to_fill.initial_gas)]") if(lab_rat.loc != to_fill) LAZYADD(reason, "Rat was not located on it's intended turf!") From 1a04596ae84410f3525d6fa3c9d8430433c58b7b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 4 Jul 2022 02:49:18 -0400 Subject: [PATCH 182/200] fix compile --- code/modules/surgery/organs/lungs.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index f06077023e8..22da13e7641 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -474,7 +474,6 @@ var/N2_moles = breath_gases[GAS_NITROGEN] var/plasma_moles = breath_gases[GAS_PLASMA] var/CO2_moles = breath_gases[GAS_CO2] - var/SA_moles = breath_gases[GAS_N2O] //Partial pressures in our breath var/O2_pp = breath.getBreathPartialPressure(O2_moles) From 9d6b16aa5e7596aab6b35a1403892763b806fb00 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 4 Jul 2022 22:37:42 -0400 Subject: [PATCH 183/200] Adds airalarm firealerts and thermostats --- _maps/map_files/MetaStation/MetaStation.dmm | 5 +- code/__DEFINES/atmospherics/ZAS.dm | 3 +- .../datums/looping_sounds/machinery_sounds.dm | 10 ++ code/game/machinery/spaceheater.dm | 1 - code/game/objects/obj_defense.dm | 2 +- code/game/turfs/open/floor/iron_floor.dm | 3 +- code/modules/atmospherics/ZAS/Fire.dm | 2 +- .../atmospherics/machinery/airalarm.dm | 142 ++++++++++++++++-- sound/machines/atmosalarm.ogg | Bin 0 -> 27052 bytes tgui/packages/tgui/interfaces/AirAlarm.js | 80 +++++++++- 10 files changed, 225 insertions(+), 23 deletions(-) create mode 100644 sound/machines/atmosalarm.ogg diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index fdd3688ada0..a0c3ba088b0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -13320,7 +13320,10 @@ /obj/item/wrench/medical, /obj/effect/turf_decal/siding/white, /obj/item/food/popsicle/creamsicle_orange, -/obj/machinery/airalarm/directional/north, +/obj/machinery/airalarm/kitchen_cold_room{ + dir = 1; + pixel_y = 24 + }, /turf/open/floor/iron/kitchen_coldroom, /area/medical/coldroom) "dDG" = ( diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index b92464dae21..d7940b12d21 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -263,7 +263,8 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) /// -93.15°C snow and ice turfs //#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" /// -14°C kitchen coldroom, just might loss your tail; higher amount of mol to reach about 101.3 kpA -//#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" +#define KITCHEN_COLDROOM_ATMOS list(GAS_OXYGEN = 26, GAS_NITROGEN = 97); temperature = COLD_ROOM_TEMP + // Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) #define ATMOSTANK_NITROGEN list(GAS_NITROGEN = 90000) // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index baf8564c8a0..b7c530b44ba 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -150,6 +150,16 @@ mid_sounds = list('sound/machines/FireAlarm1.ogg' = 1,'sound/machines/FireAlarm2.ogg' = 1,'sound/machines/FireAlarm3.ogg' = 1,'sound/machines/FireAlarm4.ogg' = 1) mid_length = 2.4 SECONDS volume = 75 + ignore_walls = FALSE + extra_range = 5 + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/atmosalarm + mid_sounds = list('sound/machines/atmosalarm.ogg' = 1) + mid_length = 1 SECONDS + ignore_walls = FALSE /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 834ae74c42e..5474451a015 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -125,7 +125,6 @@ delta_temperature *= -1 if(delta_temperature) enviroment.temperature += delta_temperature - //air_update_turf(FALSE, FALSE) cell.use(required_energy / efficiency) /obj/machinery/space_heater/RefreshParts() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 17f039c0d0f..41ed4bd98c5 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -131,7 +131,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/turf/T = loc if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(src, TRAIT_T_RAY_VISIBLE)) return - if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) + if(uses_integrity && exposed_temperature && !(resistance_flags & FIRE_PROOF)) take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, FIRE, 0) if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF)) resistance_flags |= ON_FIRE diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index 881efa922da..2948d5e9df2 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -297,7 +297,6 @@ /turf/open/floor/iron/solarpanel/airless initial_gas = AIRLESS_ATMOS - /turf/open/floor/iron/freezer icon_state = "freezerfloor" base_icon_state = "freezerfloor" @@ -308,7 +307,7 @@ /turf/open/floor/iron/kitchen_coldroom name = "cold room floor" - temperature = COLD_ROOM_TEMP + initial_gas = KITCHEN_COLDROOM_ATMOS /turf/open/floor/iron/kitchen_coldroom/freezerfloor icon_state = "freezerfloor" diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index ee4155e2238..a5f8538a7fd 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -172,7 +172,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin L.FireBurn(firelevel, air_contents.temperature, air_contents.returnPressure()) //Burn the mobs! loc.fire_act(air_contents.temperature, air_contents.volume) - for(var/atom/A in loc) + for(var/atom/A as anything in loc) A.fire_act(air_contents.temperature, air_contents.volume) //spread diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 498a1e9ddc9..a47f6dee41a 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -63,6 +63,9 @@ #define AALARM_REPORT_TIMEOUT 100 +#define AALARM_THERMOSTAT_HEATING_POWER 40000 //T2 space heater +#define AALARM_THERMOSTAT_HEATING_EFFICIENCY 30000 //T2 space heater + /obj/machinery/airalarm name = "air alarm" desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." @@ -79,25 +82,34 @@ var/danger_level = 0 var/mode = AALARM_MODE_SCRUBBING + + //Fire alarm related vars// + ///The fire alert type currently active var/alert_type = FIRE_CLEAR ///A reference to the area we are in var/area/my_area + ///The loopingsound for when there's shit fucky + var/datum/looping_sound/firealarm/soundloop + var/datum/looping_sound/atmosalarm/atmosloop var/locked = TRUE var/aidisabled = 0 var/shorted = 0 var/buildstage = AIRALARM_BUILD_COMPLETE // 2 = complete, 1 = no wires, 0 = circuit gone + ///How far the thermostat may deviate from T2OC + var/thermostat_deviation_max = 20 + ///The current thermostat target temp + var/thermostat_target = T20C + var/frequency = FREQ_ATMOS_CONTROL var/alarm_frequency = FREQ_ATMOS_ALARMS var/datum/radio_frequency/radio_connection ///Represents a signel source of atmos alarms, complains to all the listeners if one of our thresholds is violated var/datum/alarm_handler/alarm_manager - var/static/list/atmos_connections = list(COMSIG_TURF_EXPOSE = .proc/check_air_dangerlevel) - - var/list/TLV = list( + var/list/datum/tlv/TLV = list( "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), "temperature" = new/datum/tlv(BODYTEMP_COLD_WARNING_1, BODYTEMP_COLD_WARNING_1+10, BODYTEMP_HEAT_WARNING_1-27, BODYTEMP_HEAT_WARNING_1), GAS_OXYGEN = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa @@ -138,14 +150,27 @@ name = "[get_area_name(src)] Air Alarm" alarm_manager = new(src) + soundloop = new(src, FALSE) + atmosloop = new(src, FALSE) RegisterSignal(src, COMSIG_FIRE_ALERT, .proc/handle_alert) update_appearance() set_frequency(frequency) - AddElement(/datum/element/connect_loc, atmos_connections) AddComponent(/datum/component/usb_port, list( /obj/item/circuit_component/air_alarm, )) + SSairmachines.start_processing_machine(src) + + /* + if(mapload) + var/turf/my_turf = get_turf(src) + if(my_turf && (initial(my_turf.temperature) != T20C)) + var/difftemp = T20C - initial(my_turf.temperature) + TLV["temperature"].warning_min -= difftemp + TLV["temperature"].hazard_min -= difftemp + TLV["temperature"].warning_max -= difftemp + TLV["temperature"].hazard_max -= difftemp + */ return INITIALIZE_HINT_LATELOAD @@ -156,8 +181,11 @@ /obj/machinery/airalarm/Destroy() set_area(null) SSradio.remove_object(src, frequency) + SSairmachines.stop_processing_machine(src) QDEL_NULL(wires) QDEL_NULL(alarm_manager) + QDEL_NULL(soundloop) + QDEL_NULL(atmosloop) return ..() /obj/machinery/airalarm/Moved(atom/OldLoc, Dir) @@ -246,6 +274,11 @@ "danger_level" = cur_tlv.get_danger_level(environment.gas[gas_id]* partial_pressure) )) + data["thermostat"] = list( + "deviation" = thermostat_deviation_max, + "target" = thermostat_target - T0C //Convert kelvin to Celsius for the UI + ) + if(!locked || user.has_unlimited_silicon_privilege) data["vents"] = list() for(var/id_tag in my_area.air_vent_info) @@ -328,6 +361,15 @@ if(. || buildstage != AIRALARM_BUILD_COMPLETE) return + + if(action == "target") //Setting the thermostat doesn't require any access + var/target = text2num(params["target"]) + if(target != null) + thermostat_target = target + . = TRUE + thermostat_target = clamp(target, 20 - thermostat_deviation_max, 20 + thermostat_deviation_max) + thermostat_target += T0C //Convert back to Kelvin //-270.45 is TCMB + if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled)) return var/device_id = params["id_tag"] @@ -374,7 +416,7 @@ investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS) var/turf/our_turf = get_turf(src) var/datum/gas_mixture/environment = our_turf.return_air() - check_air_dangerlevel(our_turf, environment, environment.temperature) + check_air_dangerlevel(environment) . = TRUE if("mode") mode = text2num(params["mode"]) @@ -389,6 +431,10 @@ if(alarm_manager.clear_alarm(ALARM_ATMOS)) post_alert(0) . = TRUE + if("fire_alarm") + my_area.communicate_fire_alert(alert_type ? FIRE_CLEAR : FIRE_RAISED_AIRALARM) + . = TRUE + update_appearance() @@ -565,7 +611,9 @@ var/area/our_area = get_area(src) var/color - switch(max(danger_level, !!our_area.active_alarms[ALARM_ATMOS])) + var/alert = max(danger_level, !!our_area.active_alarms[ALARM_ATMOS]) + alert ||= !!alert_type //Fires should only display yellow alerts + switch(alert) if(0) color = "#03A728" // green if(1) @@ -597,7 +645,10 @@ var/area/our_area = get_area(src) var/state - switch(max(danger_level, !!our_area.active_alarms[ALARM_ATMOS])) + + var/alert = max(danger_level, !!our_area.active_alarms[ALARM_ATMOS]) + alert ||= !!alert_type //Fires should only display yellow alerts + switch(alert) if(0) state = "alarm0" if(1) @@ -608,16 +659,53 @@ . += mutable_appearance(icon, state) . += emissive_appearance(icon, state, alpha = src.alpha) +/obj/machinery/airalarm/fire_act(exposed_temperature, exposed_volume) + . = ..() + if(!danger_level) + check_air_dangerlevel(loc.return_air()) + +/obj/machinery/airalarm/process_atmos() + if((machine_stat & (NOPOWER|BROKEN)) || shorted) + return + + var/datum/gas_mixture/environment = loc.return_air() + + check_air_dangerlevel(loc.return_air()) + + if(!my_area.apc?.terminal) + COOLDOWN_START(src, hibernating, 5 SECONDS) + return + + var/obj/machinery/power/terminal/local_term = my_area.apc.terminal + + var/heat_capacity = environment.getHeatCapacity() + var/required_energy = abs(environment.temperature - thermostat_target) * heat_capacity + required_energy = min(required_energy, AALARM_THERMOSTAT_HEATING_POWER) + + if(required_energy < 1 && !danger_level) + COOLDOWN_START(src, hibernating, 5 SECONDS) + return + + var/delta_temperature = required_energy / heat_capacity + if(!delta_temperature) + return + + if(environment.temperature > thermostat_target) + delta_temperature *= -1 + + var/energy2use = required_energy / AALARM_THERMOSTAT_HEATING_EFFICIENCY + if(!local_term.avail(energy2use)) + return + + local_term.use_power(energy2use) + environment.temperature += delta_temperature + /** * main proc for throwing a shitfit if the air isnt right. * goes into warning mode if gas parameters are beyond the tlv warning bounds, goes into hazard mode if gas parameters are beyond tlv hazard bounds * */ -/obj/machinery/airalarm/proc/check_air_dangerlevel(turf/location, datum/gas_mixture/environment, exposed_temperature) - SIGNAL_HANDLER - if((machine_stat & (NOPOWER|BROKEN)) || shorted) - return - +/obj/machinery/airalarm/proc/check_air_dangerlevel(datum/gas_mixture/environment) var/datum/tlv/current_tlv //cache for sanic speed (lists are references anyways) var/list/cached_tlv = TLV @@ -630,7 +718,7 @@ var/pressure_dangerlevel = current_tlv.get_danger_level(environment_pressure) current_tlv = cached_tlv["temperature"] - var/temperature_dangerlevel = current_tlv.get_danger_level(exposed_temperature) + var/temperature_dangerlevel = current_tlv.get_danger_level(environment.temperature) var/gas_dangerlevel = 0 for(var/gas_id in env_gases) @@ -651,7 +739,7 @@ /obj/machinery/airalarm/proc/post_alert(alert_level) var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency) - + my_area.communicate_fire_alert(alert_level ? FIRE_RAISED_AIRALARM : FIRE_CLEAR) if(!frequency) return @@ -678,7 +766,9 @@ var/did_anything_happen if(new_area_danger_level) did_anything_happen = alarm_manager.send_alarm(ALARM_ATMOS) + else did_anything_happen = alarm_manager.clear_alarm(ALARM_ATMOS) + if(did_anything_happen) //if something actually changed post_alert(new_area_danger_level) @@ -844,6 +934,8 @@ GAS_PLASMA = new/datum/tlv/no_checks, GAS_N2O = new/datum/tlv/no_checks, ) + thermostat_target = 80 + thermostat_deviation_max = 250 /obj/machinery/airalarm/kitchen_cold_room // Kitchen cold rooms start off at -14°C or 259.15K. TLV = list( @@ -854,6 +946,8 @@ GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), GAS_PLASMA = new/datum/tlv/dangerous, ) + thermostat_target = COLD_ROOM_TEMP + thermostat_deviation_max = 34 /obj/machinery/airalarm/unlocked locked = FALSE @@ -963,7 +1057,25 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) /obj/machinery/airalarm/proc/handle_alert(datum/source, code) SIGNAL_HANDLER - return + if(alert_type == code) + return + + switch(code) + if(FIRE_RAISED_AIRALARM) + if(alert_type & FIRE_RAISED_PULL) + soundloop.stop() + alarm_manager.send_alarm(ALARM_FIRE) + atmosloop.start() + if(FIRE_RAISED_PULL) //We will never recieve a pulled signal if we aren't currently clear + soundloop.start() + alarm_manager.send_alarm(ALARM_FIRE) + else + alarm_manager.clear_alarm(ALARM_FIRE) + soundloop.stop() + atmosloop.stop() + + alert_type = code + #undef AALARM_MODE_SCRUBBING diff --git a/sound/machines/atmosalarm.ogg b/sound/machines/atmosalarm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fe44b7e434374c6d614219fbda58fc0e76959043 GIT binary patch literal 27052 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%0A{gIBja>Wgs-0K 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 literal 0 HcmV?d00001 diff --git a/tgui/packages/tgui/interfaces/AirAlarm.js b/tgui/packages/tgui/interfaces/AirAlarm.js index 402ced320eb..2639a0853a0 100644 --- a/tgui/packages/tgui/interfaces/AirAlarm.js +++ b/tgui/packages/tgui/interfaces/AirAlarm.js @@ -1,7 +1,7 @@ import { toFixed } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, LabeledList, Section } from '../components'; +import { Box, Button, Flex, Knob, LabeledControls, LabeledList, RoundGauge, Section } from '../components'; import { Window } from '../layouts'; import { Scrubber, Vent } from './common/AtmosControls'; import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; @@ -15,6 +15,7 @@ export const AirAlarm = (props, context) => { height={650}> <Window.Content scrollable> <InterfaceLockNoticeBox /> + <ThermostatControl /> <AirAlarmStatus /> {!locked && ( <AirAlarmControl /> @@ -91,6 +92,74 @@ const AirAlarmStatus = (props, context) => { ); }; +const ThermostatControl = (props, context) => { + const { act, data } = useBackend(context); + const entries = (data.environment_data || []) + .filter(entry => entry.value >= 0.01); + return ( + <Section title="Thermostat"> + <Flex> + <Flex.Item> + <LabeledControls> + <LabeledControls.Item label="Control"> + <Box + position="relative" + mr={2} + ml={2} + mt={1}> + <Knob + size={1.25} + color={'green'} + value={data.thermostat.target} + unit="°C" + minValue={20 - data.thermostat.deviation} + maxValue={20 + data.thermostat.deviation} + step={1} + stepPixelSize={0.75} + onDrag={(e, value) => act('target', { + target: value, + })} /> + <Button + fluid + position="absolute" + top="16px" + right="-20px" + color="transparent" + icon="undo" + onClick={() => act('target', { + target: "20", + })} /> + </Box> + </LabeledControls.Item> + </LabeledControls> + </Flex.Item> + <Flex.Item> + <LabeledControls + ml={1}> + <LabeledControls.Item + minWidth="66px" + label="Target (°C)"> + <RoundGauge + size={1.75} + value={toFixed(data.thermostat.target, 0)} + minValue={20 - data.thermostat.deviation} + maxValue={20 + data.thermostat.deviation} + ranges={{ + "good": [20 - data.thermostat.deviation, 10], + "average": [11, + 29], + "bad": [30, + 20 + data.thermostat.deviation], + }} + /> + </LabeledControls.Item> + </LabeledControls> + </Flex.Item> + </Flex> + </Section> + ); +}; + const AIR_ALARM_ROUTES = { home: { title: 'Air Controls', @@ -142,9 +211,18 @@ const AirAlarmControlHome = (props, context) => { const { mode, atmos_alarm, + fire_alarm, } = data; return ( <> + <Button + icon="exclamation-triangle" + color={fire_alarm ? 'danger' : 'caution'} + content="Fire Alarm" + onClick={() => act('fire_alarm', { + fire_alarm: fire_alarm === 1 ? 0 : 1, + })} /> + <Box mt={1} /> <Button icon={atmos_alarm ? 'exclamation-triangle' From aec655a916c63aeaeaeb55401d0b78b269abede3 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 6 Jul 2022 02:01:42 -0400 Subject: [PATCH 184/200] fix some runtimes --- code/__DEFINES/atmospherics/temperature.dm | 11 +---------- code/modules/atmospherics/ZAS/Zone.dm | 3 +-- code/modules/atmospherics/machinery/airalarm.dm | 4 ++++ code/modules/mob/living/life.dm | 2 +- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/atmospherics/temperature.dm b/code/__DEFINES/atmospherics/temperature.dm index d9a31fd0bcc..d6a53f945b7 100644 --- a/code/__DEFINES/atmospherics/temperature.dm +++ b/code/__DEFINES/atmospherics/temperature.dm @@ -1,14 +1,6 @@ #define ATOM_IS_TEMPERATURE_SENSITIVE(A) (A && !QDELETED(A) && !(A.flags_2 & NO_TEMP_CHANGE_2)) #define ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD 5 #define ATOM_TEMPERATURE_EQUILIBRIUM_CONSTANT 0.25 -#define KEEP_ME_GOING 1 - -/*#define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ - _atom.temperature = _temp; \ - if(_atom.reagents) { \ - START_PROCESSING(SSreagents, _atom.reagents); \ - } \ - QUEUE_TEMPERATURE_ATOMS(_atom);*/ #define ADJUST_ATOM_TEMPERATURE(_atom, _temp) \ _atom.temperature = _temp; \ @@ -16,8 +8,7 @@ #define QUEUE_TEMPERATURE_ATOMS(_atoms) \ if(islist(_atoms)) { \ - for(var/thing in _atoms) { \ - var/atom/A = thing; \ + for(var/atom/A as anything in _atoms) { \ if(ATOM_IS_TEMPERATURE_SENSITIVE(A)) { \ START_PROCESSING(SSairatoms, A); \ } \ diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 79fddf11563..1afeb1bfa09 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -213,8 +213,7 @@ Class Procs: for(var/turf/T in contents) if(!T.simulated) continue - for(var/check_atom in T.contents) - var/atom/checking = check_atom + for(var/atom/movable/checking as anything in T.contents) if(checking.simulated) QUEUE_TEMPERATURE_ATOMS(checking) CHECK_TICK diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index a47f6dee41a..15bd4ffb677 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -679,6 +679,10 @@ var/obj/machinery/power/terminal/local_term = my_area.apc.terminal var/heat_capacity = environment.getHeatCapacity() + + if(!heat_capacity) //No air + return + var/required_energy = abs(environment.temperature - thermostat_target) * heat_capacity required_energy = min(required_energy, AALARM_THERMOSTAT_HEATING_POWER) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index c3294b190c1..0fa12c22f25 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ extinguish_mob() return TRUE //mob was put out, on_fire = FALSE via extinguish_mob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(!G?.hasGas(GAS_OXYGEN, 1)) + if(G && (G.gas[GAS_OXYGEN] >= 1)) extinguish_mob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) From 201e02b823dc802cad3be969dd221c706ff6a53e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 6 Jul 2022 02:15:33 -0400 Subject: [PATCH 185/200] oops --- code/game/machinery/doors/windowdoor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 3456279f7b2..0b6226038fe 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -266,7 +266,7 @@ add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY) /obj/machinery/door/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > T0C + (reinf ? 1600 : 800)) ? KEEP_ME_GOING : FALSE + return (exposed_temperature > T0C + (reinf ? 1600 : 800)) ? TRUE : FALSE /obj/machinery/door/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(round(exposed_temperature / 200), BURN, 0, 0) From f9e5f220168cd9e7de6fe9cf67bf2dd330e5ea01 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 6 Jul 2022 02:15:49 -0400 Subject: [PATCH 186/200] I CLICKED STAGE ALL FOR FUCK SAKE VSC --- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/effects/spiderwebs.dm | 2 +- code/game/objects/structures/aliens.dm | 2 +- code/modules/atmospherics/ZAS/Temperature.dm | 2 +- code/modules/mob/living/simple_animal/bot/firebot.dm | 2 +- code/modules/power/apc/apc_main.dm | 2 +- code/modules/vehicles/mecha/mecha_defense.dm | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 1cb3618c11b..415254f7fd7 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -242,7 +242,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/structure/glowshroom/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > 300) ? KEEP_ME_GOING : FALSE + return (exposed_temperature > 300) ? TRUE : FALSE /obj/structure/glowshroom/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > 300) diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index d498b8bebe2..1053a438b84 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -24,7 +24,7 @@ . = ..() /obj/structure/spider/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > 300) ? KEEP_ME_GOING : FALSE + return (exposed_temperature > 300) ? TRUE : FALSE /obj/structure/spider/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > 300) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index bc36af79fe0..6667cdae921 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -420,7 +420,7 @@ break /obj/structure/alien/egg/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 500 ? KEEP_ME_GOING : 0 + return exposed_temperature > 500 ? TRUE : 0 /obj/structure/alien/egg/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > 500) diff --git a/code/modules/atmospherics/ZAS/Temperature.dm b/code/modules/atmospherics/ZAS/Temperature.dm index a362dc5c88c..b864c9b3499 100644 --- a/code/modules/atmospherics/ZAS/Temperature.dm +++ b/code/modules/atmospherics/ZAS/Temperature.dm @@ -68,6 +68,6 @@ /atom/proc/atmos_expose(datum/gas_mixture/air, exposed_temperature) return -///Return KEEP_ME_GOING if the atom should keep processing regardless of normal conditions. +///Return TRUE if the atom should keep processing regardless of normal conditions. /atom/proc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index a9db73302fd..081676809d2 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -262,7 +262,7 @@ return result /mob/living/simple_animal/bot/firebot/should_atmos_process(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) - return KEEP_ME_GOING + return TRUE /mob/living/simple_animal/bot/firebot/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 8fa0dcb1f2f..914e03a4008 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -558,7 +558,7 @@ breaked_light.break_light_tube() stoplag() /obj/machinery/power/apc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > 2000) ? KEEP_ME_GOING : FALSE + return (exposed_temperature > 2000) ? TRUE : FALSE /obj/machinery/power/apc/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > 2000) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 9e8b7bc8dd0..ee3e99da778 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -193,7 +193,7 @@ /obj/vehicle/sealed/mecha/should_atmos_process(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > max_temperature) - return KEEP_ME_GOING + return TRUE /obj/vehicle/sealed/mecha/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > max_temperature) From 1abf7e81e3c7721c25183f30dccc8997a575613b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Wed, 6 Jul 2022 16:09:09 -0400 Subject: [PATCH 187/200] Fix fire --- code/modules/mob/living/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0fa12c22f25..cad4424b77f 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ extinguish_mob() return TRUE //mob was put out, on_fire = FALSE via extinguish_mob(), no need to update everything down the chain. var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G && (G.gas[GAS_OXYGEN] >= 1)) + if(G && (G.gas[GAS_OXYGEN] <= 1)) extinguish_mob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) From ec5cbd1caea10064fd28caa20983c5e03681d0aa Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 9 Jul 2022 15:00:49 -0400 Subject: [PATCH 188/200] removes leftover testing artifact --- code/modules/atmospherics/machinery/airalarm.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 15bd4ffb677..1954a721078 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -91,7 +91,6 @@ var/area/my_area ///The loopingsound for when there's shit fucky var/datum/looping_sound/firealarm/soundloop - var/datum/looping_sound/atmosalarm/atmosloop var/locked = TRUE var/aidisabled = 0 @@ -151,7 +150,6 @@ alarm_manager = new(src) soundloop = new(src, FALSE) - atmosloop = new(src, FALSE) RegisterSignal(src, COMSIG_FIRE_ALERT, .proc/handle_alert) update_appearance() @@ -1066,17 +1064,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 24) switch(code) if(FIRE_RAISED_AIRALARM) - if(alert_type & FIRE_RAISED_PULL) - soundloop.stop() alarm_manager.send_alarm(ALARM_FIRE) - atmosloop.start() + soundloop.start() if(FIRE_RAISED_PULL) //We will never recieve a pulled signal if we aren't currently clear soundloop.start() alarm_manager.send_alarm(ALARM_FIRE) else alarm_manager.clear_alarm(ALARM_FIRE) soundloop.stop() - atmosloop.stop() alert_type = code From 12e40b1d52f65e367449f20c56adb54e1126b7f8 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 9 Jul 2022 15:05:42 -0400 Subject: [PATCH 189/200] for real this time --- code/modules/atmospherics/machinery/airalarm.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 1954a721078..e733948234b 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -183,7 +183,6 @@ QDEL_NULL(wires) QDEL_NULL(alarm_manager) QDEL_NULL(soundloop) - QDEL_NULL(atmosloop) return ..() /obj/machinery/airalarm/Moved(atom/OldLoc, Dir) From 0044d815786e365554f898bb7ec9051239483408 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 10 Jul 2022 14:22:21 -0400 Subject: [PATCH 190/200] Removes unused files --- .../atmospherics/environmental/LINDA_fire.dm | 312 ----- .../environmental/LINDA_system.dm | 161 --- .../environmental/LINDA_turf_tile.dm | 664 --------- .../atmospherics/gasmixtures/gas_mixture.dm | 726 ---------- .../atmospherics/gasmixtures/gas_types.dm | 287 ---- .../gasmixtures/immutable_mixtures.dm | 96 -- .../gasmixtures/reaction_factors.dm | 216 --- .../atmospherics/gasmixtures/reactions.dm | 1194 ----------------- .../machinery/bluespace_vendor.dm | 282 ---- .../components/electrolyzer/electrolyzer.dm | 212 --- .../electrolyzer/electrolyzer_reactions.dm | 63 - .../machinery/components/fusion/hfr_core.dm | 203 --- .../components/fusion/hfr_defines.dm | 150 --- .../components/fusion/hfr_fuel_datums.dm | 140 -- .../components/fusion/hfr_main_processes.dm | 579 -------- .../machinery/components/fusion/hfr_parts.dm | 518 ------- .../machinery/components/fusion/hfr_procs.dm | 619 --------- .../atmos_machines_recipes.dm | 183 --- .../gas_recipe_machines/crystallizer.dm | 338 ----- .../gas_recipe_machines/crystallizer_items.dm | 30 - .../unary_devices/bluespace_sender.dm | 178 --- pariah.dme | 21 - 22 files changed, 7172 deletions(-) delete mode 100644 code/modules/atmospherics/environmental/LINDA_fire.dm delete mode 100644 code/modules/atmospherics/environmental/LINDA_system.dm delete mode 100644 code/modules/atmospherics/environmental/LINDA_turf_tile.dm delete mode 100644 code/modules/atmospherics/gasmixtures/gas_mixture.dm delete mode 100644 code/modules/atmospherics/gasmixtures/gas_types.dm delete mode 100644 code/modules/atmospherics/gasmixtures/immutable_mixtures.dm delete mode 100644 code/modules/atmospherics/gasmixtures/reaction_factors.dm delete mode 100644 code/modules/atmospherics/gasmixtures/reactions.dm delete mode 100644 code/modules/atmospherics/machinery/bluespace_vendor.dm delete mode 100644 code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm delete mode 100644 code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_core.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_defines.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm delete mode 100644 code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm delete mode 100644 code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm delete mode 100644 code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm delete mode 100644 code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm delete mode 100644 code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm deleted file mode 100644 index 2b8e4cd9307..00000000000 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ /dev/null @@ -1,312 +0,0 @@ -/// Returns reactions which will contribute to a hotspot's size. -/proc/init_hotspot_reactions() - var/list/fire_reactions = list() - for (var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction)) - if(initial(reaction.expands_hotspot)) - fire_reactions += reaction - - return fire_reactions - -/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return null - - - -/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - return - -/** - * Handles the creation of hotspots and initial activation of turfs. - * Setting the conditions for the reaction to actually happen for gasmixtures - * is handled by the hotspot itself, specifically perform_exposure(). - */ -/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh) - //If the air doesn't exist we just return false - var/list/air_gases = air?.gases - if(!air_gases) - return - - . = air_gases[/datum/gas/oxygen] - var/oxy = . ? .[MOLES] : 0 - if (oxy < 0.5) - return - . = air_gases[/datum/gas/plasma] - var/plas = . ? .[MOLES] : 0 - . = air_gases[/datum/gas/tritium] - var/trit = . ? .[MOLES] : 0 - . = air_gases[/datum/gas/hydrogen] - var/h2 = . ? .[MOLES] : 0 - . = air_gases[/datum/gas/freon] - var/freon = . ? .[MOLES] : 0 - if(active_hotspot) - if(soh) - if(plas > 0.5 || trit > 0.5 || h2 > 0.5) - if(active_hotspot.temperature < exposed_temperature) - active_hotspot.temperature = exposed_temperature - if(active_hotspot.volume < exposed_volume) - active_hotspot.volume = exposed_volume - else if(freon > 0.5) - if(active_hotspot.temperature > exposed_temperature) - active_hotspot.temperature = exposed_temperature - if(active_hotspot.volume < exposed_volume) - active_hotspot.volume = exposed_volume - return - - if(((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (plas > 0.5 || trit > 0.5 || h2 > 0.5)) || \ - ((exposed_temperature < FREON_MAXIMUM_BURN_TEMPERATURE) && (freon > 0.5))) - - active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature) - - active_hotspot.just_spawned = (current_cycle < SSair.times_fired) - //remove just_spawned protection if no longer processing this cell - SSair.add_to_active(src) - -/** - * Hotspot objects interfaces with the temperature of turf gasmixtures while also providing visual effects. - * One important thing to note about hotspots are that they can roughly be divided into two categories based on the bypassing variable. - */ -/obj/effect/hotspot - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - icon = 'icons/effects/fire.dmi' - icon_state = "1" - layer = GASFIRE_LAYER - plane = ABOVE_GAME_PLANE - blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT - light_range = LIGHT_RANGE_FIRE - light_power = 1 - light_color = LIGHT_COLOR_FIRE - - /** - * Volume is the representation of how big and healthy a fire is. - * Hotspot volume will be divided by turf volume to get the ratio for temperature setting on non bypassing mode. - * Also some visual stuffs for fainter fires. - */ - var/volume = 125 - /// Temperature handles the initial ignition and the colouring. - var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - /// Whether the hotspot is new or not. Used for bypass logic. - var/just_spawned = TRUE - /// Whether the hotspot becomes passive and follows the gasmix temp instead of changing it. - var/bypassing = FALSE - var/visual_update_tick = 0 - ///Are we burning freon? - var/cold_fire = FALSE - - -/obj/effect/hotspot/Initialize(mapload, starting_volume, starting_temperature) - . = ..() - SSair.hotspots += src - if(!isnull(starting_volume)) - volume = starting_volume - if(!isnull(starting_temperature)) - temperature = starting_temperature - perform_exposure() - setDir(pick(GLOB.cardinals)) - //air_update_turf(FALSE, FALSE) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/** - * Perform interactions between the hotspot and the gasmixture. - * - * For the first tick, hotspots will take a sample of the air in the turf, - * set the temperature equal to a certain amount, and then reacts it. - * In some implementations the ratio comes out to around 1, so all of the air in the turf. - * - * Afterwards if the reaction is big enough it mostly just tags along the fire, - * copying the temperature and handling the colouring. - * If the reaction is too small it will perform like the first tick. - * - * Also calls fire_act() which handles burning. - */ -/obj/effect/hotspot/proc/perform_exposure() - var/turf/open/location = loc - var/datum/gas_mixture/reference - if(!istype(location) || !(location.air)) - return - - location.active_hotspot = src - - bypassing = !just_spawned && (volume > CELL_VOLUME*0.95) - - //Passive mode - if(bypassing || cold_fire) - reference = location.air // Our color and volume will depend on the turf's gasmix - //Active mode - else - var/datum/gas_mixture/affected = location.air.removeRatio(volume/location.air.volume) - if(affected) //in case volume is 0 - reference = affected // Our color and volume will depend on this small sparked gasmix - affected.temperature = temperature - affected.react(src) - location.assume_air(affected) - - if(reference) - volume = 0 - var/list/cached_results = reference.reaction_results - for (var/reaction in SSair.hotspot_reactions) - volume += cached_results[reaction] * FIRE_GROWTH_RATE - temperature = reference.temperature - - // Handles the burning of atoms. - if(cold_fire) - return - for(var/A in location) - var/atom/AT = A - if(!QDELETED(AT) && AT != src) - AT.fire_act(temperature, volume) - return - -/// Mathematics to be used for color calculation. -/obj/effect/hotspot/proc/gauss_lerp(x, x1, x2) - var/b = (x1 + x2) * 0.5 - var/c = (x2 - x1) / 6 - return NUM_E ** -((x - b) ** 2 / (2 * c) ** 2) - -/obj/effect/hotspot/proc/update_color() - cut_overlays() - - var/heat_r = heat2colour_r(temperature) - var/heat_g = heat2colour_g(temperature) - var/heat_b = heat2colour_b(temperature) - var/heat_a = 255 - var/greyscale_fire = 1 //This determines how greyscaled the fire is. - - if(cold_fire) - heat_r = 0 - heat_g = LERP(255, temperature, 1.2) - heat_b = LERP(255, temperature, 0.9) - heat_a = 100 - else if(temperature < 5000) //This is where fire is very orange, we turn it into the normal fire texture here. - var/normal_amt = gauss_lerp(temperature, 1000, 3000) - heat_r = LERP(heat_r,255,normal_amt) - heat_g = LERP(heat_g,255,normal_amt) - heat_b = LERP(heat_b,255,normal_amt) - heat_a -= gauss_lerp(temperature, -5000, 5000) * 128 - greyscale_fire -= normal_amt - if(temperature > 40000) //Past this temperature the fire will gradually turn a bright purple - var/purple_amt = temperature < LERP(40000,200000,0.5) ? gauss_lerp(temperature, 40000, 200000) : 1 - heat_r = LERP(heat_r,255,purple_amt) - if(temperature > 200000 && temperature < 500000) //Somewhere at this temperature nitryl happens. - var/sparkle_amt = gauss_lerp(temperature, 200000, 500000) - var/mutable_appearance/sparkle_overlay = mutable_appearance('icons/effects/effects.dmi', "shieldsparkles") - sparkle_overlay.blend_mode = BLEND_ADD - sparkle_overlay.alpha = sparkle_amt * 255 - add_overlay(sparkle_overlay) - if(temperature > 400000 && temperature < 1500000) //Lightning because very anime. - var/mutable_appearance/lightning_overlay = mutable_appearance(icon, "overcharged") - lightning_overlay.blend_mode = BLEND_ADD - add_overlay(lightning_overlay) - if(temperature > 4500000) //This is where noblium happens. Some fusion-y effects. - var/fusion_amt = temperature < LERP(4500000,12000000,0.5) ? gauss_lerp(temperature, 4500000, 12000000) : 1 - var/mutable_appearance/fusion_overlay = mutable_appearance('icons/effects/atmospherics.dmi', "fusion_gas") - fusion_overlay.blend_mode = BLEND_ADD - fusion_overlay.alpha = fusion_amt * 255 - var/mutable_appearance/rainbow_overlay = mutable_appearance('icons/hud/screen_gen.dmi', "druggy") - rainbow_overlay.blend_mode = BLEND_ADD - rainbow_overlay.alpha = fusion_amt * 255 - rainbow_overlay.appearance_flags = RESET_COLOR - heat_r = LERP(heat_r,150,fusion_amt) - heat_g = LERP(heat_g,150,fusion_amt) - heat_b = LERP(heat_b,150,fusion_amt) - add_overlay(fusion_overlay) - add_overlay(rainbow_overlay) - - set_light_color(rgb(LERP(250, heat_r, greyscale_fire), LERP(160, heat_g, greyscale_fire), LERP(25, heat_b, greyscale_fire))) - - heat_r /= 255 - heat_g /= 255 - heat_b /= 255 - - color = list(LERP(0.3, 1, 1-greyscale_fire) * heat_r,0.3 * heat_g * greyscale_fire,0.3 * heat_b * greyscale_fire, 0.59 * heat_r * greyscale_fire,LERP(0.59, 1, 1-greyscale_fire) * heat_g,0.59 * heat_b * greyscale_fire, 0.11 * heat_r * greyscale_fire,0.11 * heat_g * greyscale_fire,LERP(0.11, 1, 1-greyscale_fire) * heat_b, 0,0,0) - alpha = heat_a - -#define INSUFFICIENT(path) (!location.air.gases[path] || location.air.gases[path][MOLES] < 0.5) - -/** - * Regular process proc for hotspots governed by the controller. - * Handles the calling of perform_exposure() which handles the bulk of temperature processing. - * Burning or fire_act() are also called by perform_exposure(). - * Also handles the dying and qdeletion of the hotspot and hotspot creations on adjacent cardinal turfs. - * And some visual stuffs too! Colors and fainter icons for specific conditions. - */ -/obj/effect/hotspot/process() - if(just_spawned) - just_spawned = FALSE - return - - var/turf/open/location = loc - if(!istype(location)) - qdel(src) - return - - if(location.excited_group) - location.excited_group.reset_cooldowns() - - cold_fire = FALSE - if(temperature <= FREON_MAXIMUM_BURN_TEMPERATURE) - cold_fire = TRUE - - if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST && !cold_fire) || (volume <= 1)) - qdel(src) - return - - //Not enough / nothing to burn - if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium) && INSUFFICIENT(/datum/gas/hydrogen) && INSUFFICIENT(/datum/gas/freon)) || INSUFFICIENT(/datum/gas/oxygen)) - qdel(src) - return - - perform_exposure() - - if(bypassing) - icon_state = "3" - if(!cold_fire) - location.burn_tile() - - //Possible spread due to radiated heat. - if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD || cold_fire) - var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE - if(cold_fire) - radiated_temperature = location.air.temperature * COLD_FIRE_SPREAD_RADIOSITY_SCALE - for(var/t in location.atmos_adjacent_turfs) - var/turf/open/T = t - if(!T.active_hotspot) - T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) - - else - if(volume > CELL_VOLUME*0.4) - icon_state = "2" - else - icon_state = "1" - - if((visual_update_tick++ % 7) == 0) - update_color() - - return TRUE - -/obj/effect/hotspot/Destroy() - SSair.hotspots -= src - var/turf/open/T = loc - if(istype(T) && T.active_hotspot == src) - T.active_hotspot = null - return ..() - -/obj/effect/hotspot/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) - SIGNAL_HANDLER - if(isliving(arrived) && !cold_fire) - var/mob/living/immolated = arrived - immolated.fire_act(temperature, volume) - -/obj/effect/hotspot/singularity_pull() - return - -/obj/effect/dummy/lighting_obj/moblight/fire - name = "fire" - light_color = LIGHT_COLOR_FIRE - light_range = LIGHT_RANGE_FIRE - -#undef INSUFFICIENT diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm deleted file mode 100644 index 298be57fbbd..00000000000 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ /dev/null @@ -1,161 +0,0 @@ -/atom - ///Check if atmos can pass in this atom (ATMOS_PASS_YES, ATMOS_PASS_NO, ATMOS_PASS_DENSITY, ATMOS_PASS_PROC) - var/can_atmos_pass = ATMOS_PASS_YES - -/atom/proc/can_atmos_pass(turf/target_turf, vertical = FALSE) - switch (can_atmos_pass) - if (ATMOS_PASS_PROC) - return ATMOS_PASS_YES - if (ATMOS_PASS_DENSITY) - return !density - else - return can_atmos_pass - -/turf - can_atmos_pass = ATMOS_PASS_NO - -/turf/open - can_atmos_pass = ATMOS_PASS_PROC - -///Do NOT use this to see if 2 turfs are connected, it mutates state, and we cache that info anyhow. -///Use TURFS_CAN_SHARE or TURF_SHARES depending on your usecase -/turf/open/can_atmos_pass(turf/target_turf, vertical = FALSE) - var/can_pass = TRUE - var/direction = vertical ? get_dir_multiz(src, target_turf) : get_dir(src, target_turf) - var/opposite_direction = REVERSE_DIR(direction) - if(vertical && !(zAirOut(direction, target_turf) && target_turf.zAirIn(direction, src))) - can_pass = FALSE - if(blocks_air || target_turf.blocks_air) - can_pass = FALSE - //This path is a bit weird, if we're just checking with ourselves no sense asking objects on the turf - if (target_turf == src) - return can_pass - - //Can't just return if canpass is false here, we need to set superconductivity - for(var/obj/checked_object in contents + target_turf.contents) - var/turf/other = (checked_object.loc == src ? target_turf : src) - if(CANATMOSPASS(checked_object, other, vertical)) - continue - can_pass = FALSE - //the direction and open/closed are already checked on can_atmos_pass() so there are no arguments - if(checked_object.block_superconductivity()) - atmos_supeconductivity |= direction - target_turf.atmos_supeconductivity |= opposite_direction - return FALSE //no need to keep going, we got all we asked (Is this even faster? fuck you it's soul) - - //Superconductivity is a bitfield of directions we can't conduct with - //Yes this is really weird. Fuck you - atmos_supeconductivity &= ~direction - target_turf.atmos_supeconductivity &= ~opposite_direction - - return can_pass - -/atom/movable/proc/block_superconductivity() // objects that block air and don't let superconductivity act - return FALSE - -/turf/proc/immediate_calculate_adjacent_turfs() - //Basic optimization, if we can't share why bother asking other people ya feel? - var/canpass = CANATMOSPASS(src, src, FALSE) - for(var/direction in GLOB.cardinals_multiz) - var/turf/current_turf = get_step_multiz(src, direction) - if(!isopenturf(current_turf)) // not interested in you brother - continue - //Can you and me form a deeper relationship, or is this just a passing wind - // (direction & (UP | DOWN)) is just "is this vertical" by the by - if(canpass && CANATMOSPASS(current_turf, src, (direction & (UP|DOWN))) && !(blocks_air || current_turf.blocks_air)) - LAZYINITLIST(atmos_adjacent_turfs) - LAZYINITLIST(current_turf.atmos_adjacent_turfs) - atmos_adjacent_turfs[current_turf] = TRUE - current_turf.atmos_adjacent_turfs[src] = TRUE - else - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= current_turf - if (current_turf.atmos_adjacent_turfs) - current_turf.atmos_adjacent_turfs -= src - UNSETEMPTY(current_turf.atmos_adjacent_turfs) - UNSETEMPTY(atmos_adjacent_turfs) - src.atmos_adjacent_turfs = atmos_adjacent_turfs - SEND_SIGNAL(src, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) - -/** - * returns a list of adjacent turfs that can share air with this one. - * alldir includes adjacent diagonal tiles that can share - * air with both of the related adjacent cardinal tiles -**/ -/* -/turf/proc/get_atmos_adjacent_turfs(alldir = 0) - var/adjacent_turfs - if (atmos_adjacent_turfs) - adjacent_turfs = atmos_adjacent_turfs.Copy() - else - adjacent_turfs = list() - - if (!alldir) - return adjacent_turfs - - var/turf/current_location = src - - for (var/direction in GLOB.diagonals_multiz) - var/matching_directions = 0 - var/turf/checked_turf = get_step_multiz(current_location, direction) - if(!checked_turf) - continue - - for (var/check_direction in GLOB.cardinals_multiz) - var/turf/secondary_turf = get_step(checked_turf, check_direction) - if(!checked_turf.atmos_adjacent_turfs || !checked_turf.atmos_adjacent_turfs[secondary_turf]) - continue - - if (adjacent_turfs[secondary_turf]) - matching_directions++ - - if (matching_directions >= 2) - adjacent_turfs += checked_turf - break - - return adjacent_turfs -*/ -/atom/proc/air_update_turf(update = FALSE, remove = FALSE) - var/turf/local_turf = get_turf(loc) - if(!local_turf) - return - //local_turf.air_update_turf(update, remove) - -/** - * A helper proc for dealing with atmos changes - * - * Ok so this thing is pretty much used as a catch all for all the situations someone might wanna change something - * About a turfs atmos. It's real clunky, and someone needs to clean it up, but not today. - * Arguments: - * * update - Has the state of the structures in the world changed? If so, update our adjacent atmos turf list, if not, don't. - * * remove - Are you removing an active turf (Read wall), or adding one -*/ -/turf/air_update_turf(update = FALSE, remove = FALSE) - if(update) - immediate_calculate_adjacent_turfs() - if(remove) - SSair.remove_from_active(src) - else - SSair.add_to_active(src) - -/atom/movable/proc/move_update_air(turf/target_turf) - if(isturf(target_turf)) - target_turf.//air_update_turf(TRUE, FALSE) //You're empty now - //air_update_turf(TRUE, TRUE) //You aren't - -/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires - var/turf/open/local_turf = get_turf(src) - if(!istype(local_turf)) - return - local_turf.atmos_spawn_air(text) - -/turf/open/atmos_spawn_air(text) - if(!text || !air) - return - - var/datum/gas_mixture/turf_mixture = new - turf_mixture.parse_gas_string(text) - - air.merge(turf_mixture) - archive() - SSair.add_to_active(src) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm deleted file mode 100644 index 8d24a5ed94c..00000000000 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ /dev/null @@ -1,664 +0,0 @@ -/turf - ///used for temperature calculations in superconduction - var/thermal_conductivity = 0.05 - ///Amount of heat necessary to activate some atmos processes (there is a weird usage of this var because is compared directly to the temperature instead of heat energy) - var/heat_capacity = INFINITY //This should be opt in rather then opt out - ///Archived version of the temperature on a turf - var/temperature_archived - ///All currently stored conductivities changes - var/list/thermal_conductivities - - ///list of turfs adjacent to us that air can flow onto - var/list/atmos_adjacent_turfs - ///bitfield of dirs in which we are superconducitng - var/atmos_supeconductivity = NONE - - ///used to determine whether we should archive - var/archived_cycle = 0 - var/current_cycle = 0 - - /** - * used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) - * string parsed by /datum/gas/proc/copy_from_turf - * approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings - * If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that. - **/ - var/initial_gas = OPENTURF_DEFAULT_ATMOS - -/turf/open - //used for spacewind - ///Pressure difference between two turfs - var/pressure_difference = 0 - ///Where the difference come from (from higher pressure to lower pressure) - var/pressure_direction = 0 - - ///Excited group we are part of - var/datum/excited_group/excited_group - ///Are we active? - var/excited = FALSE - ///Our gas mix - var/datum/gas_mixture/turf/air - - ///If there is an active hotspot on us store a reference to it here - var/obj/effect/hotspot/active_hotspot - /// air will slowly revert to initial_gas - var/planetary_atmos = FALSE - /// once our paired turfs are finished with all other shares, do one 100% share - /// exists so things like space can ask to take 100% of a tile's gas - var/run_later = FALSE - - ///gas IDs of current active gas overlays - var/list/atmos_overlay_types - var/significant_share_ticker = 0 - #ifdef TRACK_MAX_SHARE - var/max_share = 0 - #endif - -/turf/open/Initialize(mapload) - if(!blocks_air) - air = new - air.copy_from_turf(src) - if(planetary_atmos) - if(!SSair.planetary[initial_gas]) - var/datum/gas_mixture/immutable/planetary/mix = new - mix.parse_string_immutable(initial_gas) - SSair.planetary[initial_gas] = mix - . = ..() - -/turf/open/Destroy() - if(active_hotspot) - QDEL_NULL(active_hotspot) - // Adds the adjacent turfs to the current atmos processing - for(var/near_turf in atmos_adjacent_turfs) - SSair.add_to_active(near_turf) - return ..() - -/////////////////GAS MIXTURE PROCS/////////////////// - -/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - if(!giver) - return FALSE - air.merge(giver) - update_visuals() - //air_update_turf(FALSE, FALSE) - return TRUE - -/turf/open/remove_air(amount) - var/datum/gas_mixture/ours = return_air() - var/datum/gas_mixture/removed = ours.remove(amount) - update_visuals() - //air_update_turf(FALSE, FALSE) - return removed - -/turf/open/proc/copy_air_with_tile(turf/open/target_turf) - if(istype(target_turf)) - air.copyFrom(target_turf.air) - -/turf/open/proc/copy_air(datum/gas_mixture/copy) - if(copy) - air.copyFrom(copy) - -/turf/return_air() - RETURN_TYPE(/datum/gas_mixture) - var/datum/gas_mixture/copied_mixture = new - copied_mixture.copy_from_turf(src) - return copied_mixture - -/turf/open/return_air() - RETURN_TYPE(/datum/gas_mixture) - return air - -/turf/open/return_analyzable_air() - return return_air() - -/turf/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature >= heat_capacity || to_be_destroyed) - -/turf/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(exposed_temperature >= heat_capacity) - to_be_destroyed = TRUE - if(to_be_destroyed && exposed_temperature >= max_fire_temperature_sustained) - max_fire_temperature_sustained = min(exposed_temperature, max_fire_temperature_sustained + heat_capacity / 4) //Ramp up to 100% yeah? - if(to_be_destroyed && !changing_turf) - burn() - -/turf/proc/burn() - burn_tile() - var/chance_of_deletion - if (heat_capacity) //beware of division by zero - chance_of_deletion = max_fire_temperature_sustained / heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 - else - chance_of_deletion = 100 - if(prob(chance_of_deletion)) - Melt() - max_fire_temperature_sustained = 0 - else - to_be_destroyed = FALSE - -/turf/open/burn() - if(!active_hotspot) //Might not even be needed since excited groups are no longer cringe - ..() - -/turf/temperature_expose(datum/gas_mixture/air, exposed_temperature) - atmos_expose(air, exposed_temperature) - -/turf/open/temperature_expose(datum/gas_mixture/air, exposed_temperature) - SEND_SIGNAL(src, COMSIG_TURF_EXPOSE, air, exposed_temperature) - check_atmos_process(src, air, exposed_temperature) //Manually do this to avoid needing to use elements, don't want 200 second atom init times - -/turf/proc/archive() - temperature_archived = temperature - -/turf/open/archive() - LINDA_CYCLE_ARCHIVE(src) - -/////////////////////////GAS OVERLAYS////////////////////////////// - - -/turf/open/proc/update_visuals() - var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance - - if(!air) // 2019-05-14: was not able to get this path to fire in testing. Consider removing/looking at callers -Naksu - if (atmos_overlay_types) - for(var/overlay in atmos_overlay_types) - vis_contents -= overlay - src.atmos_overlay_types = null - return - - var/list/gases = air.gases - - var/list/new_overlay_types - GAS_OVERLAYS(gases, new_overlay_types) - - if (atmos_overlay_types) - for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added - vis_contents -= overlay - - if (length(new_overlay_types)) - if (atmos_overlay_types) - vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist - else - vis_contents += new_overlay_types - - UNSETEMPTY(new_overlay_types) - src.atmos_overlay_types = new_overlay_types - -/proc/typecache_of_gases_with_no_overlays() - . = list() - for (var/gastype in subtypesof(/datum/gas)) - var/datum/gas/gasvar = gastype - if (!initial(gasvar.gas_overlay)) - .[gastype] = TRUE - -/////////////////////////////SIMULATION/////////////////////////////////// -#ifdef TRACK_MAX_SHARE -#define LAST_SHARE_CHECK \ - var/last_share = our_air.last_share;\ - max_share = max(last_share, max_share);\ - if(last_share > MINIMUM_AIR_TO_SUSPEND){\ - our_excited_group.reset_cooldowns();\ - cached_ticker = 0;\ - enemy_tile.significant_share_ticker = 0;\ - } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ - our_excited_group.dismantle_cooldown = 0;\ - cached_ticker = 0;\ - enemy_tile.significant_share_ticker = 0;\ - } -#else -#define LAST_SHARE_CHECK \ - var/last_share = our_air.last_share;\ - if(last_share > MINIMUM_AIR_TO_SUSPEND){\ - our_excited_group.reset_cooldowns();\ - cached_ticker = 0;\ - enemy_tile.significant_share_ticker = 0;\ - } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ - our_excited_group.dismantle_cooldown = 0;\ - cached_ticker = 0;\ - enemy_tile.significant_share_ticker = 0;\ - } -#endif -#ifdef TRACK_MAX_SHARE -#define PLANET_SHARE_CHECK \ - var/last_share = our_air.last_share;\ - max_share = max(last_share, max_share);\ - if(last_share > MINIMUM_AIR_TO_SUSPEND){\ - our_excited_group.reset_cooldowns();\ - cached_ticker = 0;\ - } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ - our_excited_group.dismantle_cooldown = 0;\ - cached_ticker = 0;\ - } -#else -#define PLANET_SHARE_CHECK \ - var/last_share = our_air.last_share;\ - if(last_share > MINIMUM_AIR_TO_SUSPEND){\ - our_excited_group.reset_cooldowns();\ - cached_ticker = 0;\ - } else if(last_share > MINIMUM_MOLES_DELTA_TO_MOVE) {\ - our_excited_group.dismantle_cooldown = 0;\ - cached_ticker = 0;\ - } -#endif - -/turf/proc/process_cell(fire_count) - SSair.remove_from_active(src) - -/turf/open/process_cell(fire_count) - if(archived_cycle < fire_count) //archive self if not already done - LINDA_CYCLE_ARCHIVE(src) - - current_cycle = fire_count - var/cached_ticker = significant_share_ticker - cached_ticker += 1 - - //cache for sanic speed - var/list/adjacent_turfs = atmos_adjacent_turfs - var/datum/excited_group/our_excited_group = excited_group - var/our_share_coeff = 1/(LAZYLEN(adjacent_turfs) + 1) - - var/datum/gas_mixture/our_air = air - - var/list/share_end - - #ifdef TRACK_MAX_SHARE - max_share = 0 //Gotta reset our tracker - #endif - - for(var/turf/open/enemy_tile as anything in adjacent_turfs) - // This var is only rarely set, exists so turfs can request to share at the end of our sharing - // We need this so we can assume share is communative, which we need to do to avoid a hellish amount of garbage_collect()s - if(enemy_tile.run_later) - LAZYADD(share_end, enemy_tile) - - if(fire_count <= enemy_tile.current_cycle) - continue - LINDA_CYCLE_ARCHIVE(enemy_tile) - - /******************* GROUP HANDLING START *****************************************************************/ - - var/should_share_air = FALSE - var/datum/gas_mixture/enemy_air = enemy_tile.air - - //cache for sanic speed - var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group - //If we are both in an excited group, and they aren't the same, merge. - //If we are both in an excited group, and you're active, share - //If we pass compare, and if we're not already both in a group, lets join up - //If we both pass compare, add to active and share - if(our_excited_group && enemy_excited_group) - if(our_excited_group != enemy_excited_group) - //combine groups (this also handles updating the excited_group var of all involved turfs) - our_excited_group.merge_groups(enemy_excited_group) - our_excited_group = excited_group //update our cache - if(our_excited_group && enemy_excited_group && enemy_tile.excited) //If you're both excited, no need to compare right? - should_share_air = TRUE - else if(our_air.compare(enemy_air)) //Lets see if you're up for it - SSair.add_to_active(enemy_tile) //Add yourself young man - var/datum/excited_group/existing_group = our_excited_group || enemy_excited_group || new - if(!our_excited_group) - existing_group.add_turf(src) - if(!enemy_excited_group) - existing_group.add_turf(enemy_tile) - our_excited_group = excited_group - should_share_air = TRUE - - //air sharing - if(should_share_air) - var/difference = our_air.share(enemy_air, our_share_coeff, 1 / (LAZYLEN(enemy_tile.atmos_adjacent_turfs) + 1)) - if(difference) - if(difference > 0) - consider_pressure_difference(enemy_tile, difference) - else - enemy_tile.consider_pressure_difference(src, -difference) - //This acts effectivly as a very slow timer, the max deltas of the group will slowly lower until it breaksdown, they then pop up a bit, and fall back down until irrelevant - LAST_SHARE_CHECK - - - /******************* GROUP HANDLING FINISH *********************************************************************/ - - if (planetary_atmos) //share our air with the "atmosphere" "above" the turf - var/datum/gas_mixture/planetary_mix = SSair.planetary[initial_gas] - // archive ourself again so we don't accidentally share more gas than we currently have - LINDA_CYCLE_ARCHIVE(src) - if(our_air.compare(planetary_mix)) - if(!our_excited_group) - var/datum/excited_group/new_group = new - new_group.add_turf(src) - our_excited_group = excited_group - // shares 4/5 of our difference in moles with the atmosphere - our_air.share(planetary_mix, 0.8, 0.8) - // temperature share with the atmosphere with an inflated heat capacity to simulate faster sharing with a large atmosphere - our_air.temperature_share(planetary_mix, OPEN_HEAT_TRANSFER_COEFFICIENT, planetary_mix.temperature_archived, planetary_mix.getHeatCapacity() * 5) - planetary_mix.garbage_collect() - PLANET_SHARE_CHECK - - for(var/turf/open/enemy_tile as anything in share_end) - var/datum/gas_mixture/enemy_mix = enemy_tile.air - archive() - // We share 100% of our mix in this step. Let's jive - var/difference = our_air.share(enemy_mix, 1, 1) - LAST_SHARE_CHECK - if(!difference) - continue - if(difference > 0) - consider_pressure_difference(enemy_tile, difference) - else - enemy_tile.consider_pressure_difference(src, difference) - - our_air.react(src) - - update_visuals() - if(!consider_superconductivity(starting = TRUE) && !active_hotspot) //Might need to include the return of react() here - if(!our_excited_group) //If nothing of interest is happening, kill the active turf - SSair.remove_from_active(src) //This will kill any connected excited group, be careful (This broke atmos for 4 years) - if(cached_ticker > EXCITED_GROUP_DISMANTLE_CYCLES) //If you're stalling out, take a rest - SSair.sleep_active_turf(src) - - significant_share_ticker = cached_ticker //Save our changes - temperature_expose(our_air, our_air.temperature) - -//////////////////////////SPACEWIND///////////////////////////// - -/turf/open/proc/consider_pressure_difference(turf/target_turf, difference) - SSair.high_pressure_delta |= src - if(difference > pressure_difference) - pressure_direction = get_dir(src, target_turf) - pressure_difference = difference - -/turf/open/proc/high_pressure_movements() - var/atom/movable/moving_atom - for(var/thing in src) - moving_atom = thing - if (!moving_atom.anchored && !moving_atom.pulledby && moving_atom.last_high_pressure_movement_air_cycle < SSair.times_fired) - moving_atom.experience_pressure_difference(pressure_difference, pressure_direction) - -/atom/movable - ///How much delta pressure is needed for us to move - var/pressure_resistance = 10 - var/last_high_pressure_movement_air_cycle = 0 - -/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - set waitfor = FALSE - if(SEND_SIGNAL(src, COMSIG_ATOM_PRE_PRESSURE_PUSH) & COMSIG_ATOM_BLOCKS_PRESSURE) - return - var/const/PROBABILITY_OFFSET = 25 - var/const/PROBABILITY_BASE_PRECENT = 75 - var/max_force = sqrt(pressure_difference) * (MOVE_FORCE_DEFAULT / 5) - var/move_prob = 100 - if (pressure_resistance > 0) - move_prob = (pressure_difference / pressure_resistance * PROBABILITY_BASE_PRECENT) - PROBABILITY_OFFSET - move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) - step(src, direction) - last_high_pressure_movement_air_cycle = SSair.times_fired - -///////////////////////////EXCITED GROUPS///////////////////////////// - -/datum/excited_group - ///Stores a reference to the turfs we are controlling - var/list/turf_list = list() - ///If this is over EXCITED_GROUP_BREAKDOWN_CYCLES we call self_breakdown() - var/breakdown_cooldown = 0 - ///If this is over EXCITED_GROUP_DISMANTLE_CYCLES we call dismantle() - var/dismantle_cooldown = 0 - ///Used for debug to show the excited groups active and their turfs - var/should_display = FALSE - ///Id of the index color of the displayed group - var/display_id = 0 - ///Wrapping loop of the index colors - var/static/wrapping_id = 0 - -/datum/excited_group/New() - SSair.excited_groups += src - -/datum/excited_group/proc/add_turf(turf/open/target_turf) - turf_list += target_turf - target_turf.excited_group = src - dismantle_cooldown = 0 - if(should_display || SSair.display_all_groups) - display_turf(target_turf) - -/datum/excited_group/proc/merge_groups(datum/excited_group/target_group) - if(turf_list.len > target_group.turf_list.len) - SSair.excited_groups -= target_group - for(var/turf/open/group_member as anything in target_group.turf_list) - group_member.excited_group = src - turf_list += group_member - should_display = target_group.should_display | should_display - if(should_display || SSair.display_all_groups) - target_group.hide_turfs() - display_turfs() - breakdown_cooldown = min(breakdown_cooldown, target_group.breakdown_cooldown) //Take the smaller of the two options - dismantle_cooldown = 0 - else - SSair.excited_groups -= src - for(var/turf/open/group_member as anything in turf_list) - group_member.excited_group = target_group - target_group.turf_list += group_member - target_group.should_display = target_group.should_display | should_display - if(target_group.should_display || SSair.display_all_groups) - hide_turfs() - target_group.display_turfs() - target_group.breakdown_cooldown = min(breakdown_cooldown, target_group.breakdown_cooldown) - target_group.dismantle_cooldown = 0 - -/datum/excited_group/proc/reset_cooldowns() - breakdown_cooldown = 0 - dismantle_cooldown = 0 - -/datum/excited_group/proc/self_breakdown(roundstart = FALSE, poke_turfs = FALSE) - var/datum/gas_mixture/shared_mix = new - - //make local for sanic speed - var/list/shared_gases = shared_mix.gases - var/list/turf_list = src.turf_list - var/turflen = turf_list.len - var/imumutable_in_group = FALSE - var/energy = 0 - var/heat_cap = 0 - - for(var/turf/open/group_member as anything in turf_list) - //Cache? - var/datum/gas_mixture/turf/mix = group_member.air - if (roundstart && istype(group_member.air, /datum/gas_mixture/immutable)) - imumutable_in_group = TRUE - shared_mix.copyFrom(group_member.air) //This had better be immutable young man - shared_gases = shared_mix.gases //update the cache - break - //"borrowing" this code from merge(), I need to play with the temp portion. Lets expand it out - //temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - var/capacity = mix.getHeatCapacity() - energy += mix.temperature * capacity - heat_cap += capacity - - var/list/giver_gases = mix.gases - for(var/giver_id in giver_gases) - ASSERT_GAS(giver_id, shared_mix) - shared_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] - - if(!imumutable_in_group) - shared_mix.temperature = energy / heat_cap - for(var/id in shared_gases) - shared_gases[id][MOLES] /= turflen - shared_mix.garbage_collect() - - for(var/turf/open/group_member as anything in turf_list) - if(group_member.planetary_atmos) //We do this as a hack to try and minimize unneeded excited group spread over planetary turfs - group_member.air.copyFrom(SSair.planetary[group_member.initial_gas]) //Comes with a cost of "slower" drains, but it's worth it - else - group_member.air.copyFrom(shared_mix) //Otherwise just set the mix to a copy of our equalized mix - group_member.update_visuals() - if(poke_turfs) //Because we only activate all these once every breakdown, in event of lag due to this code and slow space + vent things, increase the wait time for breakdowns - SSair.add_to_active(group_member) - group_member.significant_share_ticker = EXCITED_GROUP_DISMANTLE_CYCLES //Max out the ticker, if they don't share next tick, nuke em - - breakdown_cooldown = 0 - -///Dismantles the excited group, puts allll the turfs to sleep -/datum/excited_group/proc/dismantle() - for(var/turf/open/current_turf as anything in turf_list) - current_turf.excited = FALSE - current_turf.significant_share_ticker = 0 - SSair.active_turfs -= current_turf - #ifdef VISUALIZE_ACTIVE_TURFS //Use this when you want details about how the turfs are moving, display_all_groups should work for normal operation - current_turf.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_VIBRANT_LIME) - #endif - garbage_collect() - -//Breaks down the excited group, this doesn't sleep the turfs mind, just removes them from the group -/datum/excited_group/proc/garbage_collect() - if(display_id) //If we ever did make those changes - hide_turfs() - for(var/turf/open/current_turf as anything in turf_list) - current_turf.excited_group = null - turf_list.Cut() - SSair.excited_groups -= src - if(SSair.currentpart == SSAIR_EXCITEDGROUPS) - SSair.currentrun -= src - -/datum/excited_group/proc/display_turfs() - if(display_id == 0) //Hasn't been shown before - wrapping_id = wrapping_id % GLOB.colored_turfs.len - wrapping_id++ //We do this after because lists index at 1 - display_id = wrapping_id - for(var/thing in turf_list) - var/turf/display = thing - display.vis_contents += GLOB.colored_turfs[display_id] - -/datum/excited_group/proc/hide_turfs() - for(var/thing in turf_list) - var/turf/display = thing - display.vis_contents -= GLOB.colored_turfs[display_id] - display_id = 0 - -/datum/excited_group/proc/display_turf(turf/thing) - if(display_id == 0) //Hasn't been shown before - wrapping_id = wrapping_id % GLOB.colored_turfs.len - wrapping_id++ //We do this after because lists index at 1 - display_id = wrapping_id - thing.vis_contents += GLOB.colored_turfs[display_id] - -////////////////////////SUPERCONDUCTIVITY///////////////////////////// - -/** -ALLLLLLLLLLLLLLLLLLLLRIGHT HERE WE GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO - -Read the code for more details, but first, a brief concept discussion/area - -Our goal here is to "model" heat moving through solid objects, so walls, windows, and sometimes doors. -We do this by heating up the floor itself with the heat of the gasmix ontop of it, this is what the coeffs are for here, they slow that movement -Then we go through the process below. - -If an active turf is fitting, we add it to processing, conduct with any covered tiles, (read windows and sometimes walls) -Then we space some of our heat, and think about if we should stop conducting. -**/ - -/turf/proc/conductivity_directions() - if(archived_cycle < SSair.times_fired) - archive() - return ALL_CARDINALS - -///Returns a set of directions that we should be conducting in, NOTE, atmos_supeconductivity is ACTUALLY inversed, don't worrry about it -/turf/open/conductivity_directions() - if(blocks_air) - return ..() - for(var/direction in GLOB.cardinals) - var/turf/checked_turf = get_step(src, direction) - if(!(checked_turf in atmos_adjacent_turfs) && !(atmos_supeconductivity & direction)) - . |= direction - -///These two procs are a bit of a web, I belive in you -/turf/proc/neighbor_conduct_with_src(turf/open/other) - if(!other.blocks_air) //Solid but neighbor is open - other.temperature_share_open_to_solid(src) - else //Both tiles are solid - other.share_temperature_mutual_solid(src, thermal_conductivity) - temperature_expose(null, temperature) - -/turf/open/neighbor_conduct_with_src(turf/other) - if(blocks_air) - return ..() - - if(!other.blocks_air) //Both tiles are open - var/turf/open/open_other = other - open_other.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else //Open but neighbor is solid - temperature_share_open_to_solid(other) - SSair.add_to_active(src) - -/turf/proc/super_conduct() - var/conductivity_directions = conductivity_directions() - - if(conductivity_directions) - //Conduct with tiles around me - for(var/direction in GLOB.cardinals) - if(!(conductivity_directions & direction)) - continue - var/turf/neighbor = get_step(src, direction) - - if(!neighbor.thermal_conductivity) - continue - - if(neighbor.archived_cycle < SSair.times_fired) - neighbor.archive() - - neighbor.neighbor_conduct_with_src(src) - - neighbor.consider_superconductivity() - - radiate_to_spess() - - finish_superconduction() - -/turf/proc/finish_superconduction(temp = temperature) - //Make sure still hot enough to continue conducting heat - if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - SSair.active_super_conductivity -= src - return FALSE - -/turf/open/finish_superconduction() - //Conduct with air on my tile if I have it - if(!blocks_air) - temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity) - ..((blocks_air ? temperature : air.temperature)) - -///Should we attempt to superconduct? -/turf/proc/consider_superconductivity(starting) - if(!thermal_conductivity) - return FALSE - - SSair.active_super_conductivity |= src - return TRUE - -/turf/open/consider_superconductivity(starting) - if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - if(air.getHeatCapacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. - return FALSE - return ..() - -/turf/closed/consider_superconductivity(starting) - if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - return ..() - -/turf/proc/radiate_to_spess() //Radiate excess tile heat to space - if(temperature <= T0C) //Considering 0 degC as te break even point for radiation in and out - return - var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature - if(heat_capacity <= 0 || abs(delta_temperature) <= MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - return - var/heat = thermal_conductivity * delta_temperature * \ - (heat_capacity * HEAT_CAPACITY_VACUUM / (heat_capacity + HEAT_CAPACITY_VACUUM)) - temperature -= heat/heat_capacity - -/turf/open/proc/temperature_share_open_to_solid(turf/sharer) - sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) - -/turf/proc/share_temperature_mutual_solid(turf/sharer, conduction_coefficient) //This is all just heat sharing, don't get freaked out - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - var/heat = conduction_coefficient * delta_temperature * \ - (heat_capacity * sharer.heat_capacity / (heat_capacity + sharer.heat_capacity)) //The larger the combined capacity the less is shared - temperature -= heat / heat_capacity //The higher your own heat cap the less heat you get from this arrangement - sharer.temperature += heat / sharer.heat_capacity diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm deleted file mode 100644 index 45ddb2dd398..00000000000 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ /dev/null @@ -1,726 +0,0 @@ -/* -What are the archived variables for? -Calculations are done using the archived variables with the results merged into the regular variables. -This prevents race conditions that arise based on the order of tile processing. -*/ - -#define QUANTIZE(variable) (round((variable), (MOLAR_ACCURACY))) -GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm -GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) - -/proc/init_gaslist_cache() - var/list/gases = list() - for(var/id in GLOB.meta_gas_info) - var/list/cached_gas = new(3) - - gases[id] = cached_gas - - cached_gas[MOLES] = 0 - cached_gas[ARCHIVE] = 0 - cached_gas[GAS_META] = GLOB.meta_gas_info[id] - return gases - -/datum/gas_mixture - var/list/gases - var/temperature = 0 //kelvins - var/tmp/temperature_archived = 0 - var/volume = CELL_VOLUME //liters - var/last_share = 0 - /// Tells us what reactions have happened in our gasmix. Assoc list of reaction - moles reacted pair. - var/list/reaction_results - /// Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures - var/gc_share = FALSE - -/datum/gas_mixture/New(volume) - gases = new - if (!isnull(volume)) - src.volume = volume - reaction_results = new - -//listmos procs -//use the macros in performance intensive areas. for their definitions, refer to code/__DEFINES/atmospherics.dm - -///assert_gas(gas_id) - used to guarantee that the gas list for this id exists in gas_mixture.gases. -///Must be used before adding to a gas. May be used before reading from a gas. -/datum/gas_mixture/proc/assert_gas(gas_id) - ASSERT_GAS(gas_id, src) - -///assert_gases(args) - shorthand for calling ASSERT_GAS() once for each gas type. -/datum/gas_mixture/proc/assert_gases(...) - for(var/id in args) - ASSERT_GAS(id, src) - -///add_gas(gas_id) - similar to assert_gas(), but does not check for an existing gas list for this id. This can clobber existing gases. -///Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). -/datum/gas_mixture/proc/add_gas(gas_id) - ADD_GAS(gas_id, gases) - -///add_gases(args) - shorthand for calling add_gas() once for each gas_type. -/datum/gas_mixture/proc/add_gases(...) - var/cached_gases = gases - for(var/id in args) - ADD_GAS(id, cached_gases) - -///garbage_collect() - removes any gas list which is empty. -///If called with a list as an argument, only removes gas lists with IDs from that list. -///Must be used after subtracting from a gas. Must be used after assert_gas() -///if assert_gas() was called only to read from the gas. -///By removing empty gases, processing speed is increased. -/datum/gas_mixture/proc/garbage_collect(list/tocheck) - var/list/cached_gases = gases - for(var/id in (tocheck || cached_gases)) - if(QUANTIZE(cached_gases[id][MOLES]) <= 0) - cached_gases -= id - -//PV = nRT - -///joules per kelvin -/datum/gas_mixture/proc/getHeatCapacity(data = MOLES) - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[data] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - -/// Same as above except vacuums return HEAT_CAPACITY_VACUUM -/datum/gas_mixture/turf/getHeatCapacity(data = MOLES) - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[data] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - if(!.) - . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space - -/// Calculate moles -/datum/gas_mixture/proc/get_moles() - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - -/// Checks to see if gas amount exists in mixture. -/// Do NOT use this in code where performance matters! -/// It's better to batch calls to garbage_collect(), especially in places where you're checking many gastypes -/datum/gas_mixture/proc/hasGas(gas_id, amount=0) - ASSERT_GAS(gas_id, src) - var/is_there_gas = amount < gases[gas_id][MOLES] - garbage_collect() - return is_there_gas - -/// Calculate pressure in kilopascals -/datum/gas_mixture/proc/returnPressure() - if(volume) // to prevent division by zero - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - . *= R_IDEAL_GAS_EQUATION * temperature / volume - return - return 0 - -/// Calculate temperature in kelvins -/datum/gas_mixture/proc/get_temperature() - return temperature - -/// Calculate volume in liters -/datum/gas_mixture/proc/get_volume() - return max(0, volume) - -/// Gets the gas visuals for everything in this mixture -/datum/gas_mixture/proc/returnVisuals() - var/list/output - GAS_OVERLAYS(gases, output) - return output - -/// Calculate thermal energy in joules -/datum/gas_mixture/proc/thermal_energy() - return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas - -///Update archived versions of variables. Returns: 1 in all cases -/datum/gas_mixture/proc/archive() - var/list/cached_gases = gases - - temperature_archived = temperature - for(var/id in cached_gases) - cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] - - return TRUE - -///Merges all air from giver into self. Deletes giver. Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) - if(!giver) - return FALSE - - //heat transfer - if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = getHeatCapacity() - var/giver_heat_capacity = giver.getHeatCapacity() - var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity - if(combined_heat_capacity) - temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/giver_gases = giver.gases - //gas transfer - for(var/giver_id in giver_gases) - ASSERT_GAS(giver_id, src) - cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] - - SEND_SIGNAL(src, COMSIG_GASMIX_MERGED) - return TRUE - -///Proportionally removes amount of gas from the gas_mixture. -///Returns: gas_mixture with the gases removed -/datum/gas_mixture/proc/remove(amount) - var/sum - var/list/cached_gases = gases - TOTAL_MOLES(cached_gases, sum) - amount = min(amount, sum) //Can not take more air than tile has! - if(amount <= 0) - return null - var/ratio = amount / sum - var/datum/gas_mixture/removed = new type - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - ADD_GAS(id, removed.gases) - removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - garbage_collect() - - SEND_SIGNAL(src, COMSIG_GASMIX_REMOVED) - return removed - -///Proportionally removes amount of gas from the gas_mixture. -///Returns: gas_mixture with the gases removed -/datum/gas_mixture/proc/removeRatio(ratio) - if(ratio <= 0) - var/datum/gas_mixture/removed = new(volume) - return removed - ratio = min(ratio, 1) - - var/list/cached_gases = gases - var/datum/gas_mixture/removed = new type - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - ADD_GAS(id, removed.gases) - removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - - garbage_collect() - - SEND_SIGNAL(src, COMSIG_GASMIX_REMOVED) - return removed - -///Removes an amount of a specific gas from the gas_mixture. -///Returns: gas_mixture with the gas removed -/datum/gas_mixture/proc/remove_specific(gas_id, amount) - var/list/cached_gases = gases - amount = min(amount, cached_gases[gas_id][MOLES]) - if(amount <= 0) - return null - var/datum/gas_mixture/removed = new type - var/list/removed_gases = removed.gases - removed.temperature = temperature - ADD_GAS(gas_id, removed.gases) - removed_gases[gas_id][MOLES] = amount - cached_gases[gas_id][MOLES] -= amount - - garbage_collect(list(gas_id)) - return removed - -/datum/gas_mixture/proc/remove_specific_ratio(gas_id, ratio) - if(ratio <= 0) - return null - ratio = min(ratio, 1) - - var/list/cached_gases = gases - var/datum/gas_mixture/removed = new type - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - ADD_GAS(gas_id, removed.gases) - removed_gases[gas_id][MOLES] = QUANTIZE(cached_gases[gas_id][MOLES] * ratio) - cached_gases[gas_id][MOLES] -= removed_gases[gas_id][MOLES] - - garbage_collect(list(gas_id)) - - return removed - -///Distributes the contents of two mixes equally between themselves -//Returns: bool indicating whether gases moved between the two mixes -/datum/gas_mixture/proc/equalize(datum/gas_mixture/other) - . = FALSE - if(abs(get_temperature() - other.get_temperature()) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - . = TRUE - var/self_heat_cap = getHeatCapacity() - var/other_heat_cap = other.getHeatCapacity() - var/new_temp = (temperature * self_heat_cap + other.temperature * other_heat_cap) / (self_heat_cap + other_heat_cap) - temperature = new_temp - other.temperature = new_temp - - var/min_p_delta = 0.1 - var/total_volume = volume + other.volume - var/list/gas_list = gases | other.gases - for(var/gas_id in gas_list) - assert_gas(gas_id) - other.assert_gas(gas_id) - //math is under the assumption temperatures are equal - if(abs(gases[gas_id][MOLES] / volume - other.gases[gas_id][MOLES] / other.volume) > min_p_delta / (R_IDEAL_GAS_EQUATION * temperature)) - . = TRUE - var/total_moles = gases[gas_id][MOLES] + other.gases[gas_id][MOLES] - gases[gas_id][MOLES] = total_moles * (volume/total_volume) - other.gases[gas_id][MOLES] = total_moles * (other.volume/total_volume) - garbage_collect() - other.garbage_collect() - -///Creates new, identical gas mixture -///Returns: duplicate gas mixture -/datum/gas_mixture/proc/copy() - var/list/cached_gases = gases - var/datum/gas_mixture/copy = new type - var/list/copy_gases = copy.gases - - copy.temperature = temperature - for(var/id in cached_gases) - ADD_GAS(id, copy.gases) - copy_gases[id][MOLES] = cached_gases[id][MOLES] - - return copy - -///Copies variables from sample, moles multiplicated by partial -///Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample, partial = 1) - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/sample_gases = sample.gases - - //remove all gases not in the sample - cached_gases &= sample_gases - - temperature = sample.temperature - for(var/id in sample_gases) - ASSERT_GAS(id,src) - cached_gases[id][MOLES] = sample_gases[id][MOLES] * partial - - return 1 - -///Copies all gas info from the turf into the gas list along with temperature -///Returns: TRUE if we are mutable, FALSE otherwise -/datum/gas_mixture/proc/copy_from_turf(turf/model) - parse_gas_string(model.initial_gas) - - //acounts for changes in temperature - var/turf/model_parent = model.parent_type - if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) - temperature = model.temperature - - return TRUE - -///Copies variables from a particularly formatted string. -///Returns: 1 if we are mutable, 0 otherwise -/datum/gas_mixture/proc/parse_gas_string(gas_string) - gas_string = SSair.preprocess_gas_string(gas_string) - - var/list/gases = src.gases - var/list/gas = params2list(gas_string) - if(gas["TEMP"]) - temperature = text2num(gas["TEMP"]) - temperature_archived = temperature - gas -= "TEMP" - else // if we do not have a temp in the new gas mix lets assume room temp. - temperature = T20C - gases.Cut() - for(var/id in gas) - var/path = id - if(!ispath(path)) - path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around - ADD_GAS(path, gases) - gases[path][MOLES] = text2num(gas[id]) - return 1 - -/// Performs air sharing calculations between two gas_mixtures -/// share() is communitive, which means A.share(B) needs to be the same as B.share(A) -/// If we don't retain this, we will get negative moles. Don't do it -/// Returns: amount of gas exchanged (+ if sharer received) -/datum/gas_mixture/proc/share(datum/gas_mixture/sharer, our_coeff, sharer_coeff) - var/list/cached_gases = gases - var/list/sharer_gases = sharer.gases - - var/list/only_in_sharer = sharer_gases - cached_gases - var/list/only_in_cached = cached_gases - sharer_gases - - var/temperature_delta = temperature_archived - sharer.temperature_archived - var/abs_temperature_delta = abs(temperature_delta) - - var/old_self_heat_capacity = 0 - var/old_sharer_heat_capacity = 0 - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - old_self_heat_capacity = getHeatCapacity() - old_sharer_heat_capacity = sharer.getHeatCapacity() - - var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer - var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us - - var/moved_moles = 0 - var/abs_moved_moles = 0 - - //GAS TRANSFER - - //Prep - for(var/id in only_in_sharer) //create gases not in our cache - ADD_GAS(id, cached_gases) - for(var/id in only_in_cached) //create gases not in the sharing mix - ADD_GAS(id, sharer_gases) - - for(var/id in cached_gases) //transfer gases - var/gas = cached_gases[id] - var/sharergas = sharer_gases[id] - var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE]) //the amount of gas that gets moved between the mixtures - - if(!delta) - continue - - // If we have more gas then they do, gas is moving from us to them - // This means we want to scale it by our coeff. Vis versa for their case - if(delta > 0) - delta = delta * our_coeff - else - delta = delta * sharer_coeff - - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] - if(delta > 0) - heat_capacity_self_to_sharer += gas_heat_capacity - else - heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. - - gas[MOLES] -= delta - sharergas[MOLES] += delta - moved_moles += delta - abs_moved_moles += abs(delta) - - last_share = abs_moved_moles - - //THERMAL ENERGY TRANSFER - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer - var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self - - //transfer of thermal energy (via changed heat capacity) between self and sharer - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity - - if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) - sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity - //thermal energy of the system (self and sharer) is unchanged - - if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) - if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity - temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - - if(length(only_in_sharer + only_in_cached)) //if all gases were present in both mixtures, we know that no gases are 0 - garbage_collect(only_in_cached) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. - sharer.garbage_collect(only_in_sharer) //the reverse is equally true - else if (initial(sharer.gc_share)) - sharer.garbage_collect() - - if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/our_moles - TOTAL_MOLES(cached_gases,our_moles) - var/their_moles - TOTAL_MOLES(sharer_gases,their_moles) - return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume - -///Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length -///Returns: new temperature of the sharer -/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - //transfer of thermal energy (via conduction) between self and sharer - if(sharer) - sharer_temperature = sharer.temperature_archived - var/temperature_delta = temperature_archived - sharer_temperature - if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = getHeatCapacity(ARCHIVE) - sharer_heat_capacity = sharer_heat_capacity || sharer.getHeatCapacity(ARCHIVE) - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*temperature_delta* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - temperature = max(temperature - heat/self_heat_capacity, TCMB) - sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) - if(sharer) - sharer.temperature = sharer_temperature - if (initial(sharer.gc_share)) - sharer.garbage_collect() - return sharer_temperature - //thermal energy of the system (self and sharer) is unchanged - -///Compares sample to self to see if within acceptable ranges that group processing may be enabled -///Returns: a string indicating what check failed, or "" if check passes -/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) - var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars - var/list/cached_gases = gases - - for(var/id in cached_gases | sample_gases) // compare gases from either mixture - var/gas_moles = cached_gases[id] - gas_moles = gas_moles ? gas_moles[MOLES] : 0 - var/sample_moles = sample_gases[id] - sample_moles = sample_moles ? sample_moles[MOLES] : 0 - var/delta = abs(gas_moles - sample_moles) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \ - delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) - return id - - var/our_moles - TOTAL_MOLES(cached_gases, our_moles) - if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE) //Don't consider temp if there's not enough mols - var/temp = temperature - var/sample_temp = sample.temperature - - var/temperature_delta = abs(temp - sample_temp) - if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return "temp" - - return "" - -///Performs various reactions such as combustion and fabrication -///Returns: 1 if any reaction took place; 0 otherwise -/datum/gas_mixture/proc/react(datum/holder) - . = NO_REACTION - var/list/cached_gases = gases - if(!length(cached_gases)) - return - - var/list/pre_formation = list() - var/list/mid_formation = list() - var/list/post_formation = list() - var/list/fires = list() - var/list/gas_reactions = SSair.gas_reactions - for(var/gas_id in cached_gases) - var/list/reaction_set = gas_reactions[gas_id] - if(!reaction_set) - continue - pre_formation += reaction_set[1] - mid_formation += reaction_set[2] - post_formation += reaction_set[3] - fires += reaction_set[4] - - var/list/reactions = pre_formation + mid_formation + post_formation + fires - - if(!length(reactions)) - return - - //Fuck you - if(cached_gases[/datum/gas/hypernoblium] && cached_gases[/datum/gas/hypernoblium][MOLES] >= REACTION_OPPRESSION_THRESHOLD && temperature > 20) - return STOP_REACTIONS - - reaction_results = new - //It might be worth looking into updating these after each reaction, but that makes us care more about order of operations, so be careful - var/temp = temperature - reaction_loop: - for(var/datum/gas_reaction/reaction as anything in reactions) - - var/list/reqs = reaction.requirements - if((reqs["MIN_TEMP"] && temp < reqs["MIN_TEMP"]) || (reqs["MAX_TEMP"] && temp > reqs["MAX_TEMP"])) - continue - - for(var/id in reqs) - if (id == "MIN_TEMP" || id == "MAX_TEMP") - continue - if(!cached_gases[id] || cached_gases[id][MOLES] < reqs[id]) - continue reaction_loop - - //at this point, all requirements for the reaction are satisfied. we can now react() - . |= reaction.react(src, holder) - - - if(.) //If we changed the mix to any degree - garbage_collect() - SEND_SIGNAL(src, COMSIG_GASMIX_REACTED) - - -/** - * Takes the amount of the gas you want to PP as an argument - * So I don't have to do some hacky switches/defines/magic strings - * eg: - * Plas_PP = get_partial_pressure(gas_mixture.plasma) - * O2_PP = get_partial_pressure(gas_mixture.oxygen) - * getBreathPartialPressure(gas_pp) --> gas_pp/get_moles()*breath_pp = pp - * getTrueBreathPressure(pp) --> gas_pp = pp/breath_pp*get_moles() - * - * 10/20*5 = 2.5 - * 10 = 2.5/5*20 - */ - -/datum/gas_mixture/proc/getBreathPartialPressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME -///inverse -/datum/gas_mixture/proc/getTrueBreathPressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) - -/** - * Counts how much pressure will there be if we impart MOLAR_ACCURACY amounts of our gas to the output gasmix. - * We do all of this without actually transferring it so dont worry about it changing the gasmix. - * Returns: Resulting pressure (number). - * Args: - * - output_air (gasmix). - */ -/datum/gas_mixture/proc/gas_pressure_minimum_transfer(datum/gas_mixture/output_air) - var/resulting_energy = output_air.thermal_energy() + (MOLAR_ACCURACY / get_moles() * thermal_energy()) - var/resulting_capacity = output_air.getHeatCapacity() + (MOLAR_ACCURACY / get_moles() * getHeatCapacity()) - return (output_air.get_moles() + MOLAR_ACCURACY) * R_IDEAL_GAS_EQUATION * (resulting_energy / resulting_capacity) / output_air.volume - - -/** Returns the amount of gas to be pumped to a specific container. - * Args: - * - output_air. The gas mix we want to pump to. - * - target_pressure. The target pressure we want. - * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistant. - */ -/datum/gas_mixture/proc/gas_pressure_calculate(datum/gas_mixture/output_air, target_pressure, ignore_temperature = FALSE) - if((get_moles() <= 0) || (temperature <= 0)) - return FALSE - - var/pressure_delta = 0 - if((output_air.temperature <= 0) || (output_air.get_moles() <= 0)) - ignore_temperature = TRUE - pressure_delta = target_pressure - else - pressure_delta = target_pressure - output_air.returnPressure() - - if(pressure_delta < 0.01 || gas_pressure_minimum_transfer(output_air) > target_pressure) - return FALSE - - if(ignore_temperature) - return (pressure_delta*output_air.volume)/(temperature * R_IDEAL_GAS_EQUATION) - - // Lower and upper bound for the moles we must transfer to reach the pressure. The answer is bound to be here somewhere. - var/pv = target_pressure * output_air.volume - var/rt_low = R_IDEAL_GAS_EQUATION * max(temperature, output_air.temperature) // Low refers to the resulting mole, this number is actually higher. - var/rt_high = R_IDEAL_GAS_EQUATION * min(temperature, output_air.temperature) - // These works by assuming our gas has extremely high heat capacity - // and the resultant gasmix will hit either the highest or lowest temperature possible. - var/lower_limit = max((pv / rt_low) - output_air.get_moles(), 0) - var/upper_limit = (pv / rt_high) - output_air.get_moles() // In theory this should never go below zero, the pressure_delta check above should account for this. - - /* - * We have PV=nRT as a nice formula, we can rearrange it into nT = PV/R - * But now both n and T can change, since any incoming moles also change our temperature. - * So we need to unify both our n and T, somehow. - * - * We can rewrite T as (our old thermal energy + incoming thermal energy) divided by (our old heat capacity + incoming heat capacity) - * T = (W1 + n/N2 * W2) / (C1 + n/N2 * C2). C being heat capacity, W being work, N being total moles. - * - * In total we now have our equation be: (N1 + n) * (W1 + n/N2 * W2) / (C1 + n/N2 * C2) = PV/R - * Now you can rearrange this and find out that it's a quadratic equation and pretty much solvable with the formula. Will be a bit messy though. - * - * W2/N2n^2 + - * (N1*W2/N2)n + W1n - ((PV/R)*C2/N2)n + - * (-(PV/R)*C1) + N1W1 = 0 - * - * We will represent each of these terms with A, B, and C. A for the n^2 part, B for the n^1 part, and C for the n^0 part. - * We then put this into the famous (-b +/- sqrt(b^2-4ac)) / 2a formula. - * - * Oh, and one more thing. By "our" we mean the gasmix in the argument. We are the incoming one here. We are number 2, target is number 1. - * If all this counting fucks up, we revert first to Newton's approximation, then the old simple formula. - */ - - // Our thermal energy and moles - var/w2 = thermal_energy() - var/n2 = get_moles() - var/c2 = getHeatCapacity() - - // Target thermal energy and moles - var/w1 = output_air.thermal_energy() - var/n1 = output_air.get_moles() - var/c1 = output_air.getHeatCapacity() - - /// The PV/R part in our equation. - var/pvr = pv / R_IDEAL_GAS_EQUATION - - /// x^2 in the quadratic - var/a_value = w2/n2 - /// x^1 in the quadratic - var/b_value = ((n1*w2)/n2) + w1 - (pvr*c2/n2) - /// x^0 in the quadratic - var/c_value = (-1*pvr*c1) + n1 * w1 - - . = gas_pressure_quadratic(a_value, b_value, c_value, lower_limit, upper_limit) - if(.) - return - . = gas_pressure_approximate(a_value, b_value, c_value, lower_limit, upper_limit) - if(.) - return - // Inaccurate and will probably explode but whatever. - return (pressure_delta*output_air.volume)/(temperature * R_IDEAL_GAS_EQUATION) - -/// Actually tries to solve the quadratic equation. -/// Do mind that the numbers can get very big and might hit BYOND's single point float limit. -/datum/gas_mixture/proc/gas_pressure_quadratic(a, b, c, lower_limit, upper_limit) - var/solution - if(!IS_INF_OR_NAN(a) && !IS_INF_OR_NAN(b) && !IS_INF_OR_NAN(c)) - solution = max(SolveQuadratic(a, b, c)) - if((solution > lower_limit) && (solution < upper_limit)) //SolveQuadratic can return nulls so be careful here - return solution - stack_trace("Failed to solve pressure quadratic equation. A: [a]. B: [b]. C:[c]. Current value = [solution]. Expected lower limit: [lower_limit]. Expected upper limit: [upper_limit].") - return FALSE - -/// Approximation of the quadratic equation using Newton-Raphson's Method. -/// We use the slope of an approximate value to get closer to the root of a given equation. -/datum/gas_mixture/proc/gas_pressure_approximate(a, b, c, lower_limit, upper_limit) - var/solution - if(!IS_INF_OR_NAN(a) && !IS_INF_OR_NAN(b) && !IS_INF_OR_NAN(c)) - /// We need to start off at a reasonably good estimate. For very big numbers the amount of moles is most likely small so better start with lower_limit. - solution = lower_limit - for (var/iteration in 1 to ATMOS_PRESSURE_APPROXIMATION_ITERATIONS) - var/diff = (a*solution**2 + b*solution + c) / (2*a*solution + b) // f(sol) / f'(sol) - solution -= diff // xn+1 = xn - f(sol) / f'(sol) - if(abs(diff) < MOLAR_ACCURACY && (solution > lower_limit) && (solution < upper_limit)) - return solution - stack_trace("Newton's Approximation for pressure failed after [ATMOS_PRESSURE_APPROXIMATION_ITERATIONS] iterations. A: [a]. B: [b]. C:[c]. Current value: [solution]. Expected lower limit: [lower_limit]. Expected upper limit: [upper_limit].") - return FALSE - -/// Pumps gas from src to output_air. Amount depends on target_pressure -/datum/gas_mixture/proc/pump_gas_to(datum/gas_mixture/output_air, target_pressure, specific_gas = null) - var/temperature_delta = abs(temperature - output_air.temperature) - var/datum/gas_mixture/removed - var/transfer_moles - - if(specific_gas) - // This is necessary because the specific heat capacity of a gas might be different from our gasmix. - var/datum/gas_mixture/temporary = remove_specific_ratio(specific_gas, 1) - transfer_moles = temporary.gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - removed = temporary.remove_specific(specific_gas, transfer_moles) - merge(temporary) - else - transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - removed = remove(transfer_moles) - - if(!removed) - return FALSE - - output_air.merge(removed) - return TRUE - -/// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. -/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1) - var/output_starting_pressure = output_air.returnPressure() - var/input_starting_pressure = returnPressure() - - //Need at least 10 KPa difference to overcome friction in the mechanism - if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) - return FALSE - //Can not have a pressure delta that would cause output_pressure > input_pressure - target_pressure = output_starting_pressure + min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) - var/temperature_delta = abs(temperature - output_air.temperature) - - var/transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - - //Actually transfer the gas - var/datum/gas_mixture/removed = remove(transfer_moles * rate) - - if(!removed) - return FALSE - - output_air.merge(removed) - return TRUE diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm deleted file mode 100644 index d1b97d5338c..00000000000 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ /dev/null @@ -1,287 +0,0 @@ -GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded -//Now this is what I call history -GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/pluoxium))) //unable to react amongst themselves - -/proc/meta_gas_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/list/gas_info = new(8) - var/datum/gas/gas = gas_path - - gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat) - gas_info[META_GAS_NAME] = initial(gas.name) - - gas_info[META_GAS_MOLES_VISIBLE] = initial(gas.moles_visible) - if(initial(gas.moles_visible) != null) - gas_info[META_GAS_OVERLAY] = new /list(TOTAL_VISIBLE_STATES) - for(var/i in 1 to TOTAL_VISIBLE_STATES) - gas_info[META_GAS_OVERLAY][i] = new /obj/effect/overlay/gas(initial(gas.gas_overlay), log(4, (i+0.4*TOTAL_VISIBLE_STATES) / (0.35*TOTAL_VISIBLE_STATES)) * 255) - - gas_info[META_GAS_FUSION_POWER] = initial(gas.fusion_power) - gas_info[META_GAS_DANGER] = initial(gas.dangerous) - gas_info[META_GAS_ID] = initial(gas.id) - gas_info[META_GAS_DESC] = initial(gas.desc) - .[gas_path] = gas_info - -/proc/gas_id2path(id) - var/list/meta_gas = GLOB.meta_gas_info - if(id in meta_gas) - return id - for(var/path in meta_gas) - if(meta_gas[path][META_GAS_ID] == id) - return path - return "" - -/*||||||||||||||/----------\||||||||||||||*\ -||||||||||||||||[GAS DATUMS]|||||||||||||||| -||||||||||||||||\__________/|||||||||||||||| -||||These should never be instantiated. |||| -||||They exist only to make it easier |||| -||||to add a new gas. They are accessed |||| -||||only by meta_gas_list(). |||| -\*||||||||||||||||||||||||||||||||||||||||*/ - -/datum/gas - var/id = "" - var/specific_heat = 0 - var/name = "" - var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi - var/moles_visible = null - var/dangerous = FALSE //currently used by canisters - var/fusion_power = 0 //How much the gas accelerates a fusion reaction - var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list. - var/purchaseable = FALSE - var/base_value = 0 - var/desc - -/datum/gas/oxygen - id = "o2" - specific_heat = 20 - name = "Oxygen" - rarity = 900 - purchaseable = TRUE - base_value = 0.2 - desc = "The gas most life forms need to be able to survive. Also an oxidizer." - -/datum/gas/nitrogen - id = "n2" - specific_heat = 20 - name = "Nitrogen" - rarity = 1000 - purchaseable = TRUE - base_value = 0.1 - desc = "A very common gas that used to pad artifical atmospheres to habitable pressure." - -/datum/gas/carbon_dioxide //what the fuck is this? - id = "co2" - specific_heat = 30 - name = "Carbon Dioxide" - dangerous = TRUE - rarity = 700 - purchaseable = TRUE - base_value = 0.2 - desc = "What the fuck is carbon dioxide?" - -/datum/gas/plasma - id = "plasma" - specific_heat = 200 - name = "Plasma" - gas_overlay = "plasma" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 800 - base_value = 2 - desc = "A flammable gas with many other curious properties. It's research is one of NT's primary objective." - -/datum/gas/water_vapor - id = "water_vapor" - specific_heat = 40 - name = "Water Vapor" - gas_overlay = "water_vapor" - moles_visible = MOLES_GAS_VISIBLE - fusion_power = 8 - rarity = 500 - purchaseable = TRUE - base_value = 0.5 - desc = "Water, in gas form. Makes things slippery." - -/datum/gas/hypernoblium - id = "nob" - specific_heat = 2000 - name = "Hyper-noblium" - gas_overlay = "freon" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 10 - rarity = 50 - base_value = 5 - desc = "The most noble gas of them all. High quantities of hyper-noblium actively prevents reactions from occuring." - -/datum/gas/nitrous_oxide - id = "n2o" - specific_heat = 40 - name = "Nitrous Oxide" - gas_overlay = "nitrous_oxide" - moles_visible = MOLES_GAS_VISIBLE * 2 - fusion_power = 10 - dangerous = TRUE - rarity = 600 - purchaseable = TRUE - base_value = 3 - desc = "Causes drowsiness, euphoria, and eventually unconsciousness." - -/datum/gas/nitrium - id = "nitrium" - specific_heat = 10 - name = "Nitrium" - fusion_power = 7 - gas_overlay = "nitrium" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 1 - base_value = 100 - desc = "An experimental performance enhancing gas. Nitrium can have amplified effects as more of it gets into your bloodstream." - -/datum/gas/tritium - id = "tritium" - specific_heat = 10 - name = "Tritium" - gas_overlay = "tritium" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 5 - rarity = 300 - base_value = 5 - desc = "A highly flammable and radioctive gas." - -/datum/gas/bz - id = "bz" - specific_heat = 20 - name = "BZ" - dangerous = TRUE - fusion_power = 8 - rarity = 400 - purchaseable = TRUE - base_value = 2 - desc = "A powerful hallucinogenic nerve agent able to induce cognitive damage." - -/datum/gas/pluoxium - id = "pluox" - specific_heat = 80 - name = "Pluoxium" - fusion_power = -10 - rarity = 200 - base_value = 5 - desc = "A gas that could supply even more oxygen to the bloodstream when inhaled, without being an oxidizer." - -/datum/gas/miasma - id = "miasma" - specific_heat = 20 - name = "Miasma" - dangerous = TRUE - gas_overlay = "miasma" - moles_visible = MOLES_GAS_VISIBLE * 60 - rarity = 250 - base_value = 2 - desc = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere." - -/datum/gas/freon - id = "freon" - specific_heat = 600 - name = "Freon" - dangerous = TRUE - gas_overlay = "freon" - moles_visible = MOLES_GAS_VISIBLE *30 - fusion_power = -5 - rarity = 10 - base_value = 15 - desc = "A coolant gas. Mainly used for it's endothermic reaction with oxygen." - -/datum/gas/hydrogen - id = "hydrogen" - specific_heat = 15 - name = "Hydrogen" - dangerous = TRUE - fusion_power = 2 - rarity = 600 - base_value = 1 - desc = "A highly flammable gas." - -/datum/gas/healium - id = "healium" - specific_heat = 10 - name = "Healium" - dangerous = TRUE - gas_overlay = "healium" - moles_visible = MOLES_GAS_VISIBLE - rarity = 300 - base_value = 19 - desc = "Causes deep, regenerative sleep." - -/datum/gas/proto_nitrate - id = "proto_nitrate" - specific_heat = 30 - name = "Proto Nitrate" - dangerous = TRUE - gas_overlay = "proto_nitrate" - moles_visible = MOLES_GAS_VISIBLE - rarity = 200 - base_value = 5 - desc = "A very volatile gas that reacts differently with various gases." - -/datum/gas/zauker - id = "zauker" - specific_heat = 350 - name = "Zauker" - dangerous = TRUE - gas_overlay = "zauker" - moles_visible = MOLES_GAS_VISIBLE - rarity = 1 - base_value = 100 - desc = "A highly toxic gas, it's production is highly regulated on top of being difficult. It also breaks down when in contact with nitrogen." - -/datum/gas/halon - id = "halon" - specific_heat = 175 - name = "Halon" - dangerous = TRUE - gas_overlay = "halon" - moles_visible = MOLES_GAS_VISIBLE - rarity = 300 - base_value = 9 - desc = "A potent fire supressant. Removes oxygen from high temperature fires and cools down the area" - -/datum/gas/helium - id = "helium" - specific_heat = 15 - name = "Helium" - fusion_power = 7 - rarity = 50 - base_value = 6 - desc = "A very inert gas produced by the fusion of hydrogen and it's derivatives." - -/datum/gas/antinoblium - id = "antinoblium" - specific_heat = 1 - name = "Antinoblium" - dangerous = TRUE - gas_overlay = "antinoblium" - moles_visible = MOLES_GAS_VISIBLE - fusion_power = 20 - rarity = 1 - base_value = 10 - desc = "We still don't know what it does, but it sells for a lot." - -/obj/effect/overlay/gas - icon = 'icons/effects/atmospherics.dmi' - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - anchored = TRUE // should only appear in vis_contents, but to be safe - layer = FLY_LAYER - plane = ABOVE_GAME_PLANE - appearance_flags = TILE_BOUND - vis_flags = NONE - -/obj/effect/overlay/gas/New(state, alph) - . = ..() - icon_state = state - alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm deleted file mode 100644 index c1db471f3a3..00000000000 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ /dev/null @@ -1,96 +0,0 @@ -//"immutable" gas mixture used for immutable calculations -//it can be changed, but any changes will ultimately be undone before they can have any effect - -/datum/gas_mixture/immutable - var/initial_temperature - gc_share = TRUE - -/datum/gas_mixture/immutable/New() - ..() - garbage_collect() - -/datum/gas_mixture/immutable/garbage_collect() - temperature = initial_temperature - temperature_archived = initial_temperature - gases.Cut() - -/datum/gas_mixture/immutable/archive() - return TRUE //nothing changes, so we do nothing and the archive is successful - -/datum/gas_mixture/immutable/merge() - return FALSE //we're immutable. - -/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, our_coeff, sharer_coeff) - . = ..() - sharer.temperature = initial_temperature - garbage_collect() - -/datum/gas_mixture/immutable/react() - return FALSE //we're immutable. - -/datum/gas_mixture/immutable/copy() - return new type //we're immutable, so we can just return a new instance. - -/datum/gas_mixture/immutable/copyFrom() - return FALSE //we're immutable. - -/datum/gas_mixture/immutable/copy_from_turf() - return FALSE //we're immutable. - -/datum/gas_mixture/immutable/parse_gas_string() - return FALSE //we're immutable. - -/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - . = ..() - temperature = initial_temperature - -//used by space tiles -/datum/gas_mixture/immutable/space - initial_temperature = TCMB - -/datum/gas_mixture/immutable/space/getHeatCapacity() - return HEAT_CAPACITY_VACUUM - -/datum/gas_mixture/immutable/space/remove() - return copy() //we're always empty, so we can just return a copy. - -/datum/gas_mixture/immutable/space/removeRatio() - return copy() //we're always empty, so we can just return a copy. - -//planet side stuff -/datum/gas_mixture/immutable/planetary - var/list/initial_gas = list() - -/datum/gas_mixture/immutable/planetary/garbage_collect() - ..() - gases.Cut() - for(var/id in initial_gas) - ADD_GAS(id, gases) - gases[id][MOLES] = initial_gas[id][MOLES] - gases[id][ARCHIVE] = initial_gas[id][ARCHIVE] - -/datum/gas_mixture/immutable/planetary/proc/parse_string_immutable(gas_string) //I know I know, I need this tho - gas_string = SSair.preprocess_gas_string(gas_string) - - var/list/mix = initial_gas - var/list/gas = params2list(gas_string) - if(gas["TEMP"]) - initial_temperature = text2num(gas["TEMP"]) - temperature_archived = initial_temperature - temperature = initial_temperature - gas -= "TEMP" - mix.Cut() - for(var/id in gas) - var/path = id - if(!ispath(path)) - path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around - ADD_GAS(path, mix) - mix[path][MOLES] = text2num(gas[id]) - mix[path][ARCHIVE] = mix[path][MOLES] - - for(var/id in mix) - ADD_GAS(id, gases) - gases[id][MOLES] = mix[id][MOLES] - gases[id][ARCHIVE] = mix[id][MOLES] - - diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm deleted file mode 100644 index 2d04de63e3c..00000000000 --- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm +++ /dev/null @@ -1,216 +0,0 @@ -/datum/gas_reaction/water_vapor/init_factors() - factor = list( - /datum/gas/water_vapor = "Condensation will consume [MOLES_GAS_VISIBLE] moles, freezing will not consume any. Both needs a minimum of [MOLES_GAS_VISIBLE] moles to occur.", - "Temperature" = "Freezes a turf at [WATER_VAPOR_DEPOSITION_POINT] Kelvins or below, wets it at [WATER_VAPOR_CONDENSATION_POINT] Kelvins or below.", - "Location" = "Can only happen on turfs.", - ) - -/datum/gas_reaction/miaster/init_factors() - factor = list( - /datum/gas/miasma = "Miasma is consumed at 1 reaction rate.", - /datum/gas/oxygen = "Oxygen is produced at 1 reaction rate.", - "Temperature" = "Higher temperature increases the reaction rate.", - "Energy" = "[MIASTER_STERILIZATION_ENERGY] joules of energy is released per rate.", - ) - -/datum/gas_reaction/plasmafire/init_factors() - factor = list( - /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] of the reaction rate at [PLASMA_MINIMUM_BURN_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] at [PLASMA_UPPER_TEMPERATURE] Kelvins. Higher oxygen concentration up to [PLASMA_OXYGEN_FULLBURN]x times the plasma increases the reaction rate.", - /datum/gas/plasma = "Plasma is consumed at 1 reaction rate. It's relationship with oxygen also determines reaction speed", - /datum/gas/tritium = "Tritium is formed at 1 reaction rate if there are 97 times more oxygen than plasma.", - /datum/gas/water_vapor = "Water vapor is formed at 0.25 reaction rate if tritium isn't being formed.", - /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 0.75 reaction rate if tritium isn't being formed.", - "Temperature" = "Minimum temperature of [PLASMA_MINIMUM_BURN_TEMPERATURE] kelvin to occur. Higher temperature up to [PLASMA_UPPER_TEMPERATURE] increases the oxygen efficiency and also the reaction rate.", - "Energy" = "[FIRE_PLASMA_ENERGY_RELEASED] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/h2fire/init_factors() - factor = list( - /datum/gas/oxygen = "Oxygen is consumed equal to the amount of hydrogen available on the fast burn. Not consumed on the slow burn. Needs to be more than the hydrogen amount to trigger fast burn. Acts as the reaction rate on slow burn.", - /datum/gas/hydrogen = "[(1/HYDROGEN_BURN_H2_FACTOR)*100]% of the hydrogen is always consumed on the fast burn. [(1/HYDROGEN_BURN_OXY_FACTOR)*100]% of the oxygen amount is consumed on the slow burn. Need to be less than the oxygen amount to trigger fast burn. Acts as the reaction rate on fast burn.", - /datum/gas/water_vapor = "Water vapor is formed at [1/HYDROGEN_BURN_H2_FACTOR] reaction rate for the fast burn, [1/HYDROGEN_BURN_OXY_FACTOR]% reaction rate for the slow burn.", - "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur", - "Energy" = "[FIRE_HYDROGEN_ENERGY_RELEASED*HYDROGEN_OXYBURN_MULTIPLIER] joules of energy is released per rate for the fast burn, [FIRE_HYDROGEN_ENERGY_RELEASED] joules for the slow burn. Needs [MINIMUM_TRITIUM_OXYBURN_ENERGY] joules to start the fast burn.", - ) - -/datum/gas_reaction/tritfire/init_factors() - factor = list( - /datum/gas/oxygen = "Oxygen is consumed equal to the amount of tritium available on the fast burn. Not consumed on the slow burn. Need to be more than the tritium amount to trigger fast burn. Acts as the reaction rate on slow burn.", - /datum/gas/tritium = "[(1/TRITIUM_BURN_TRIT_FACTOR)*100]% of the tritium is always consumed on the fast burn. [(1/TRITIUM_BURN_OXY_FACTOR)*100]% of the oxygen amount is consumed on the slow burn. Need to be less than the oxygen amount to trigger fast burn. Acts as the reaction rate on fast burn.", - /datum/gas/water_vapor = "Water vapor is formed at [1/TRITIUM_BURN_TRIT_FACTOR]% reaction rate for the fast burn, [1/TRITIUM_BURN_OXY_FACTOR]% reaction rate for the slow burn.", - "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin to occur", - "Energy" = "[FIRE_TRITIUM_ENERGY_RELEASED*TRITIUM_OXYBURN_MULTIPLIER] joules of energy is released per rate for the fast burn, [FIRE_TRITIUM_ENERGY_RELEASED] joules for the slow burn. Needs [MINIMUM_TRITIUM_OXYBURN_ENERGY] joules to start the fast burn.", - "Radiation" = "This reaction emits radiation proportional to the amount of energy released.", - ) - -/datum/gas_reaction/freonfire/init_factors() - factor = list( - /datum/gas/oxygen = "Oxygen consumption is determined by the temperature, ranging from [OXYGEN_BURN_RATIO_BASE] of the reaction rate at [FREON_LOWER_TEMPERATURE] Kelvins to [OXYGEN_BURN_RATIO_BASE-1] at [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvins. Higher oxygen concentration up to [FREON_OXYGEN_FULLBURN] times the freon increases the reaction rate.", - /datum/gas/freon = "Freon is consumed at 1 reaction rate. It's relationship with oxygen also determines reaction speed", - /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 1 reaction rate.", - "Temperature" = "Can only occur between [FREON_LOWER_TEMPERATURE] - [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvin", - "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per reaction rate", - "Hot Ice" = "This reaction has a small chance to produce hot ice when occuring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins", - ) - - -/datum/gas_reaction/nitrousformation/init_factors() - factor = list( - /datum/gas/oxygen = "10 moles of Oxygen needs to be present for the reaction to occur. Oxygen is consumed at 1 reaction rate", - /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 2 reaction rate", - /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. Not consumed.", - /datum/gas/nitrous_oxide = "Nitrous oxide is produced at 1 reaction rate", - "Temperature" = "Can only occur between [N2O_FORMATION_MIN_TEMPERATURE] - [N2O_FORMATION_MAX_TEMPERATURE] Kelvin", - "Energy" = "[N2O_FORMATION_ENERGY] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/nitrous_decomp/init_factors() - factor = list( - /datum/gas/nitrous_oxide = "Nitrous Oxide is consumed at 1 reaction rate. Minimum of [MINIMUM_MOLE_COUNT * 2] to occur.", //okay this one isn't made into a define yet. - /datum/gas/oxygen = "Oxygen is formed at 0.5 reaction rate", - /datum/gas/nitrogen = "Nitrogen is formed at 1 reaction rate", - "Temperature" = "Higher temperature increases the reaction rate. Can only happen between [N2O_DECOMPOSITION_MIN_TEMPERATURE] - [N2O_DECOMPOSITION_MAX_TEMPERATURE] kelvin.", - "Energy" = "[N2O_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/bzformation/init_factors() - factor = list( - /datum/gas/plasma = "Plasma is consumed at 2 reaction rate. If there is more plasma than nitrous oxide reaction rate is slowed down.", - /datum/gas/nitrous_oxide = "Nitrous oxide is consumed at 1 reaction rate. If there is less nitrous oxide than plasma the reaction rate is slowed down.", - /datum/gas/bz = "BZ is formed at 2.5 reaction rate. A small malus up to half a mole per tick is applied if the reaction rate is constricted by nitrous oxide.", - /datum/gas/oxygen = "Oxygen is produced from the BZ malus. This only happens when the reaction rate is being constricted by the amount of nitrous oxide present. I.E. amount of nitrous oxide is less than the reaction rate.", // Less than the reaction rate AND half the plasma, but suppose that's not necessary to mention. - "Pressure" = "The lower the pressure the faster the reaction rate goes.", - "Energy" = "[FIRE_CARBON_ENERGY_RELEASED] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/pluox_formation/init_factors() - factor = list( - /datum/gas/carbon_dioxide = "Carbon dioxide is consumed at 1 reaction rate", - /datum/gas/oxygen = "Oxygen is consumed at 0.5 reaction rate", - /datum/gas/tritium = "Tritium is consumed at 0.01 reaction rate", - /datum/gas/pluoxium = "Pluoxium is produced at 1 reaction rate", - /datum/gas/hydrogen = "Hydrogen is produced at 0.01 reaction rate", - "Energy" = "[PLUOXIUM_FORMATION_ENERGY] joules of energy is released per reaction rate", - "Temperature" = "Can only occur between [PLUOXIUM_FORMATION_MIN_TEMP] - [PLUOXIUM_FORMATION_MAX_TEMP] Kelvin", - ) - -/datum/gas_reaction/nitrium_formation/init_factors() - factor = list( - /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. BZ is consumed at 0.05 reaction rate.", - /datum/gas/tritium = "20 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 1 reaction rate", - /datum/gas/nitrogen = "10 moles of tritium needs to be present for the reaction to occur. Nitrogen is consumed at 1 reaction rate", - /datum/gas/nitrium = "Nitrium is produced at 1 reaction rate", - "Temperature" = "Can only occur above [NITRIUM_FORMATION_MIN_TEMP] kelvins", - "Energy" = "[NITRIUM_FORMATION_ENERGY] joules of energy is absorbed per reaction rate", - ) - -/datum/gas_reaction/nitrium_decomposition/init_factors() - factor = list( - /datum/gas/oxygen = "[MINIMUM_MOLE_COUNT] moles of oxygen need to be present for the reaction to occur. Not consumed.", - /datum/gas/nitrium = "Nitrium is consumed at 1 reaction rate", - /datum/gas/hydrogen = "Hydrogen is produced at 1 reaction rate", - /datum/gas/nitrogen = "Nitrogen is produced at 1 reaction rate", - "Temperature" = " Can only occur below [NITRIUM_DECOMPOSITION_MAX_TEMP]. Higher temperature increases the reaction rate.", - "Energy" = "[NITRIUM_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/freonformation/init_factors() - factor = list( - /datum/gas/plasma = "40 moles of plasma needs to be present for the reaction to occur. Plasma is consumed at 1.5 reaction rate.", - /datum/gas/carbon_dioxide = "20 moles of carbon dioxide needs to be present for the reaction to occur. Carbon dioxide is consumed at 0.75 reaction rate.", - /datum/gas/bz = "20 moles of BZ needs to be present for the reaction to occur. BZ is consumed at 0.25 reaction rate.", - /datum/gas/freon = "Freon is produced at 2.5 reaction rate", - "Energy" = "[FREON_FORMATION_ENERGY] joules of energy is absorbed per reaction rate", - "Temperature" = "Minimum temperature of [FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100] Kelvin to occur", - ) - -/datum/gas_reaction/nobliumformation/init_factors() - factor = list( - /datum/gas/nitrogen = "10 moles of nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 10 reaction rate", - /datum/gas/tritium = "5 moles of tritium needs to be present for the reaction to occur. Tritium is consumed at 5 reaction rate", - /datum/gas/hypernoblium = "Hyper-Noblium is produced at 1 reaction rate", - "Energy" = "[NOBLIUM_FORMATION_ENERGY] joules of energy is released per reaction rate.", - /datum/gas/bz = "BZ is not consumed in the reaction but will lower the amount of energy released. It also reduces amount of trit consumed by a ratio between trit and bz, greater bz than trit will reduce more.", - "Temperature" = "Can only occur between [NOBLIUM_FORMATION_MIN_TEMP] - [NOBLIUM_FORMATION_MAX_TEMP] kelvin", - ) - -/datum/gas_reaction/halon_formation/init_factors() - factor = list( - /datum/gas/bz = "BZ is consumed at 0.25 reaction rate", - /datum/gas/tritium = "Tritium is consumed at 4 reaction rate", - /datum/gas/halon = "Halon is produced at 4.25 reaction rate", - "Energy" = "[HALON_FORMATION_ENERGY] joules of energy is released per reaction rate", - "Temperature" = "Can only occur between [HALON_FORMATION_MIN_TEMPERATURE] - [HALON_FORMATION_MAX_TEMPERATURE] kelvin", - ) - -/datum/gas_reaction/halon_o2removal/init_factors() - factor = list( - /datum/gas/halon = "Halon is consumed at 1 reaction rate", - /datum/gas/oxygen = "Oxygen is consumed at 20 reaction rate", - /datum/gas/carbon_dioxide = "Carbon dioxide is produced at 5 reaction rate.", - "Energy" = "[HALON_COMBUSTION_ENERGY] joules of energy is absorbed per reaction rate", - "Temperature" = "Can only occur above [FIRE_MINIMUM_TEMPERATURE_TO_EXIST] kelvin. Higher temperature increases the reaction rate.", - ) - -/datum/gas_reaction/healium_formation/init_factors() - factor = list( - /datum/gas/bz = "BZ is consumed at 0.25 reaction rate", - /datum/gas/freon = "Freon is consumed at 2.75 reaction rate", - /datum/gas/healium = "Healium is produced at 3 reaction rate", - "Temperature" = "Can only occur between [HEALIUM_FORMATION_MIN_TEMP] - [HEALIUM_FORMATION_MAX_TEMP]. Higher temperature increases the reaction rate.", - "Energy" = "[HEALIUM_FORMATION_ENERGY] joules of energy is released per reaction rate.", - ) - -/datum/gas_reaction/zauker_formation/init_factors() - factor = list( - /datum/gas/hypernoblium = "Hyper-Noblium is consumed at 0.01 reaction rate", - /datum/gas/nitrium = "Nitrium is consumed at 0.5 reaction rate", - /datum/gas/zauker = "Zauker is produced at 0.5 reaction rate", - "Temperature" = "Can only occur between [ZAUKER_FORMATION_MIN_TEMPERATURE] - [ZAUKER_FORMATION_MAX_TEMPERATURE] kelvin", - "Energy" = "[ZAUKER_FORMATION_ENERGY] joules of energy is absorbed per reaction rate", - ) - -/datum/gas_reaction/zauker_decomp/init_factors() //Fixed reaction rate - factor = list( - /datum/gas/zauker = "Zauker is consumed at 1 reaction rate", - /datum/gas/nitrogen = "At least [MINIMUM_MOLE_COUNT] moles of Nitrogen needs to be present for this reaction to occur. Nitrogen is produced at 0.7 reaction rate", - /datum/gas/oxygen = "Oxygen is produced at 0.3 reaction rate", - "Energy" = "[ZAUKER_DECOMPOSITION_ENERGY] joules of energy is released per reaction rate", - ) - -/datum/gas_reaction/proto_nitrate_formation/init_factors() - factor = list( - /datum/gas/pluoxium = "Pluoxium is consumed at 0.2 reaction rate", - /datum/gas/hydrogen = "Hydrogen is consumed at 2 reaction rate", - /datum/gas/proto_nitrate = "Proto-Nitrate is produced at 2.2 reaction rate", - "Energy" = "[PN_FORMATION_ENERGY] joules of energy is released per reaction rate", - "Temperature" = "Can only occur between [PN_FORMATION_MIN_TEMPERATURE] - [PN_FORMATION_MAX_TEMPERATURE] kelvin. Higher temperature increases the reaction rate.", - ) - -/datum/gas_reaction/proto_nitrate_hydrogen_response/init_factors() // Fixed reaction rate - factor = list( - /datum/gas/hydrogen = "[PN_HYDROGEN_CONVERSION_THRESHOLD] moles of hydrogen needs to be present for the reaction to occur. Hydrogen is consumed at 1 reaction rate.", - /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur. Proto nitrate is produced at 0.5 reaction rate.", - "Energy" = "[PN_HYDROGEN_CONVERSION_ENERGY] joules of energy is absorbed per reaction rate", - ) - -/datum/gas_reaction/proto_nitrate_tritium_response/init_factors() // Fixed reaction rate - factor = list( - /datum/gas/tritium = "Tritium is consumed at 1 reaction rate.", - /datum/gas/proto_nitrate = "Proto nitrate is consumed at 0.01 reaction rate.", - /datum/gas/hydrogen = "Hydrogen is produced at 1 reaction rate.", - "Energy" = "[PN_TRITIUM_CONVERSION_ENERGY] joules of energy is released per reaction rate", - "Radiation" = "This reaction emits radiation proportional to the reaction rate.", - ) - -/datum/gas_reaction/proto_nitrate_bz_response/init_factors() // Fixed reaction rate - factor = list( - /datum/gas/proto_nitrate = "[MINIMUM_MOLE_COUNT] moles of proto-nitrate needs to be present for the reaction to occur", - /datum/gas/bz = "BZ is consumed at 1 reaction rate.", - /datum/gas/nitrogen = "Nitrogen is produced at 0.4 reaction rate.", - /datum/gas/helium = "Helium is produced at 1.6 reaction rate.", - /datum/gas/plasma = "Plasma is produced at 0.8 reaction rate.", - "Energy" = "[PN_BZASE_ENERGY] joules of energy is released per reaction rate", - "Radiation" = "This reaction emits radiation proportional to the reaction rate.", - "Hallucinations" = "This reaction can cause various carbon based lifeforms in the vicinity to hallucinate.", - ) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm deleted file mode 100644 index 1c960c98452..00000000000 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ /dev/null @@ -1,1194 +0,0 @@ -//Most other defines used in reactions are located in ..\__DEFINES\reactions.dm -#define SET_REACTION_RESULTS(amount) air.reaction_results[type] = amount - -/proc/init_gas_reactions() - var/list/priority_reactions = list() - - //Builds a list of gas id to reaction group - for(var/gas_id in GLOB.meta_gas_info) - priority_reactions[gas_id] = list( - PRIORITY_PRE_FORMATION = list(), - PRIORITY_FORMATION = list(), - PRIORITY_POST_FORMATION = list(), - PRIORITY_FIRE = list() - ) - - for(var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction)) - if(initial(reaction.exclude)) - continue - reaction = new reaction - var/datum/gas/reaction_key - for (var/req in reaction.requirements) - if (ispath(req)) - var/datum/gas/req_gas = req - if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity)) - reaction_key = req_gas - reaction.major_gas = reaction_key - priority_reactions[reaction_key][reaction.priority_group] += reaction - - //Culls empty gases - for(var/gas_id in GLOB.meta_gas_info) - var/passed = FALSE - for(var/list/priority_grouping in priority_reactions[gas_id]) - if(length(priority_grouping)) - passed = TRUE - break - if(passed) - continue - priority_reactions[gas_id] = null - - return priority_reactions - -/datum/gas_reaction - /** - * Regarding the requirements list: the minimum or maximum requirements must be non-zero. - * When in doubt, use MINIMUM_MOLE_COUNT. - * Another thing to note is that reactions will not fire if we have any requirements outside of gas id path or MIN_TEMP or MAX_TEMP. - * More complex implementations will require modifications to gas_mixture.react() - */ - var/list/requirements - var/major_gas //the highest rarity gas used in the reaction. - var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future - ///The priority group this reaction is a part of. You can think of these as processing in batches, put your reaction into the one that's most fitting - var/priority_group - var/name = "reaction" - var/id = "r" - /// Whether the presence of our reaction should make fires bigger or not. - var/expands_hotspot = FALSE - /// A short string describing this reaction. - var/desc - /** REACTION FACTORS - * - * Describe (to a human) factors influencing this reaction in an assoc list format. - * Also include gases formed by the reaction - * Implement various interaction for different keys under subsystem/air/proc/atmos_handbook_init() - * - * E.G. - * factor["Temperature"] = "Minimum temperature of 20 kelvins, maximum temperature of 100 kelvins" - * factor["o2"] = "Minimum oxygen amount of 20 moles, more oxygen increases reaction rate up to 150 moles" - */ - var/list/factor - -/datum/gas_reaction/New() - init_reqs() - init_factors() - -/datum/gas_reaction/proc/init_reqs() // Override this - CRASH("Reaction [type] made without specifying requirements.") - -/datum/gas_reaction/proc/init_factors() - -/datum/gas_reaction/proc/react(datum/gas_mixture/air, atom/location) - return NO_REACTION - - -/** - * Steam Condensation/Deposition: - * - * Makes turfs slippery. - * Can frost things if the gas is cold enough. - */ -/datum/gas_reaction/water_vapor - priority_group = PRIORITY_POST_FORMATION - name = "Water Vapor Condensation" - id = "vapor" - desc = "Water vapor condensation that can make things slippery." - -/datum/gas_reaction/water_vapor/init_reqs() - requirements = list( - /datum/gas/water_vapor = MOLES_GAS_VISIBLE, - "MAX_TEMP" = WATER_VAPOR_CONDENSATION_POINT, - ) - -/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder) - . = NO_REACTION - if(!isturf(holder)) - return - - var/turf/open/location = holder - switch(air.temperature) - if(-INFINITY to WATER_VAPOR_DEPOSITION_POINT) - if(location?.freeze_turf()) - SET_REACTION_RESULTS(0) - . = REACTING - if(WATER_VAPOR_DEPOSITION_POINT to WATER_VAPOR_CONDENSATION_POINT) - location.water_vapor_gas_act() - air.gases[/datum/gas/water_vapor][MOLES] -= MOLES_GAS_VISIBLE - SET_REACTION_RESULTS(MOLES_GAS_VISIBLE) - . = REACTING - - -/** - * Dry Heat Sterilization: - * - * Clears out pathogens in the air. - */ -/datum/gas_reaction/miaster - priority_group = PRIORITY_POST_FORMATION - name = "Dry Heat Sterilization" - id = "sterilization" - desc = "Pathogens cannot survive in a hot environment. Miasma decomposes on high temperature." - -/datum/gas_reaction/miaster/init_reqs() - requirements = list( - /datum/gas/miasma = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = MIASTER_STERILIZATION_TEMP, - ) - -/datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - // As the name says it, it needs to be dry - if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor][MOLES] / air.get_moles() > MIASTER_STERILIZATION_MAX_HUMIDITY) - return NO_REACTION - - //Replace miasma with oxygen - var/cleaned_air = min(cached_gases[/datum/gas/miasma][MOLES], MIASTER_STERILIZATION_RATE_BASE + (air.temperature - MIASTER_STERILIZATION_TEMP) / MIASTER_STERILIZATION_RATE_SCALE) - cached_gases[/datum/gas/miasma][MOLES] -= cleaned_air - ASSERT_GAS(/datum/gas/oxygen, air) - cached_gases[/datum/gas/oxygen][MOLES] += cleaned_air - - //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable - air.temperature += cleaned_air * MIASTER_STERILIZATION_ENERGY - SET_REACTION_RESULTS(cleaned_air) - - return REACTING - - -// Fire: - -/** - * Plasma combustion: - * - * Combustion of oxygen and plasma (mostly treated as hydrocarbons). - * The reaction rate is dependent on the temperature of the gasmix. - * May produce either tritium or carbon dioxide and water vapor depending on the fuel/oxydizer ratio of the gasmix. - */ -/datum/gas_reaction/plasmafire - priority_group = PRIORITY_FIRE - name = "Plasma Combustion" - id = "plasmafire" - expands_hotspot = TRUE - desc = "Combustion of oxygen and plasma. Able to produce tritium or carbon dioxade and water vapor." - -/datum/gas_reaction/plasmafire/init_reqs() - requirements = list( - /datum/gas/plasma = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = PLASMA_MINIMUM_BURN_TEMPERATURE, - ) - -/datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder) - // This reaction should proceed faster at higher temperatures. - var/temperature = air.temperature - var/temperature_scale = 0 - if(temperature > PLASMA_UPPER_TEMPERATURE) - temperature_scale = 1 - else - temperature_scale = (temperature - PLASMA_MINIMUM_BURN_TEMPERATURE) / (PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) - if(temperature_scale <= 0) - return NO_REACTION - - var/oxygen_burn_ratio = OXYGEN_BURN_RATIO_BASE - temperature_scale - var/plasma_burn_rate = 0 - var/super_saturation = FALSE // Whether we should make tritium. - var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - switch(cached_gases[/datum/gas/oxygen][MOLES] / cached_gases[/datum/gas/plasma][MOLES]) - if(SUPER_SATURATION_THRESHOLD to INFINITY) - plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES] / PLASMA_BURN_RATE_DELTA) * temperature_scale - super_saturation = TRUE // Begin to form tritium - if(PLASMA_OXYGEN_FULLBURN to SUPER_SATURATION_THRESHOLD) - plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES] / PLASMA_BURN_RATE_DELTA) * temperature_scale - else - plasma_burn_rate = ((cached_gases[/datum/gas/oxygen][MOLES] / PLASMA_OXYGEN_FULLBURN) / PLASMA_BURN_RATE_DELTA) * temperature_scale - - if(plasma_burn_rate < MINIMUM_HEAT_CAPACITY) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - plasma_burn_rate = min(plasma_burn_rate, cached_gases[/datum/gas/plasma][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(oxygen_burn_ratio)) //Ensures matter is conserved properly - cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate) - cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_ratio)) - if (super_saturation) - ASSERT_GAS(/datum/gas/tritium, air) - cached_gases[/datum/gas/tritium][MOLES] += plasma_burn_rate - else - ASSERT_GAS(/datum/gas/carbon_dioxide, air) - ASSERT_GAS(/datum/gas/water_vapor, air) - cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate * 0.75 - cached_gases[/datum/gas/water_vapor][MOLES] += plasma_burn_rate * 0.25 - - SET_REACTION_RESULTS((plasma_burn_rate) * (1 + oxygen_burn_ratio)) - var/energy_released = FIRE_PLASMA_ENERGY_RELEASED * plasma_burn_rate - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity - - // Let the floor know a fire is happening - var/turf/open/location = holder - if(istype(location)) - temperature = air.temperature - if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - location.hotspot_expose(temperature, CELL_VOLUME) - - return REACTING - - -/** - * Hydrogen combustion: - * - * Combustion of oxygen and hydrogen. - * Highly exothermic. - * Creates hotspots. - */ -/datum/gas_reaction/h2fire - priority_group = PRIORITY_FIRE - name = "Hydrogen Combustion" - id = "h2fire" - expands_hotspot = TRUE - desc = "Combustion of hydrogen with oxygen. Can be extremely fast and energetic if a few conditions are fulfilled." - -/datum/gas_reaction/h2fire/init_reqs() - requirements = list( - /datum/gas/hydrogen = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = HYDROGEN_MINIMUM_BURN_TEMPERATURE, - ) - -/datum/gas_reaction/h2fire/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/old_heat_capacity = air.getHeatCapacity() - var/temperature = air.temperature - - var/burned_fuel - var/fire_scale - if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/hydrogen][MOLES] || MINIMUM_HYDROGEN_OXYBURN_ENERGY > (temperature * old_heat_capacity)) - burned_fuel = cached_gases[/datum/gas/oxygen][MOLES] / HYDROGEN_BURN_OXY_FACTOR // const must be at least one - fire_scale = 1 - - cached_gases[/datum/gas/hydrogen][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/water_vapor, air) - cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel / HYDROGEN_BURN_OXY_FACTOR - else - burned_fuel = cached_gases[/datum/gas/hydrogen][MOLES] - fire_scale = HYDROGEN_OXYBURN_MULTIPLIER - - cached_gases[/datum/gas/hydrogen][MOLES] -= burned_fuel / HYDROGEN_BURN_H2_FACTOR - cached_gases[/datum/gas/oxygen][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/water_vapor, air) - cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel / HYDROGEN_BURN_H2_FACTOR - - SET_REACTION_RESULTS(burned_fuel * fire_scale) // This is actually a lie. We use 10x less moles here but make 10x more energy. - - var/energy_released = FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel * fire_scale - if(energy_released > 0) - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity - - //let the floor know a fire is happening - var/turf/open/location = holder - if(istype(location)) - temperature = air.temperature - if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - location.hotspot_expose(temperature, CELL_VOLUME) - - return burned_fuel ? REACTING : NO_REACTION - - -/** - * Tritium combustion: - * - * Combustion of oxygen and tritium (treated as hydrogen). - * Highly exothermic. - * Creates hotspots. - * Creates radiation. - */ -/datum/gas_reaction/tritfire - priority_group = PRIORITY_FIRE - name = "Tritium Combustion" - id = "tritfire" - expands_hotspot = TRUE - desc = "Combustion of tritium with oxygen. Can be extremely fast and energetic if a few conditions are fulfilled." - -/datum/gas_reaction/tritfire/init_reqs() - requirements = list( - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = TRITIUM_MINIMUM_BURN_TEMPERATURE, - ) - -/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/old_heat_capacity = air.getHeatCapacity() - var/temperature = air.temperature - - var/burned_fuel - var/effect_scale - if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/tritium][MOLES] || MINIMUM_TRITIUM_OXYBURN_ENERGY > (temperature * old_heat_capacity)) - burned_fuel = cached_gases[/datum/gas/oxygen][MOLES] / TRITIUM_BURN_OXY_FACTOR // const must be at least one - effect_scale = 1 - - cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/water_vapor, air) - cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel / TRITIUM_BURN_OXY_FACTOR - else - burned_fuel = cached_gases[/datum/gas/tritium][MOLES] - effect_scale = TRITIUM_OXYBURN_MULTIPLIER - - cached_gases[/datum/gas/tritium][MOLES] -= burned_fuel / TRITIUM_BURN_TRIT_FACTOR - cached_gases[/datum/gas/oxygen][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/water_vapor, air) - cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel / TRITIUM_BURN_TRIT_FACTOR - - - SET_REACTION_RESULTS(burned_fuel * effect_scale) - - var/turf/open/location - if(istype(holder, /datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. - var/datum/pipeline/pipenet = holder - location = pick(pipenet.members) - else if(isatom(holder)) - location = holder - - var/energy_released = FIRE_TRITIUM_ENERGY_RELEASED * burned_fuel * effect_scale - if(location && burned_fuel > TRITIUM_RADIATION_MINIMUM_MOLES && energy_released > TRITIUM_RADIATION_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP && prob(10)) - radiation_pulse(location, max_range = min(TRITIUM_MINIMUM_RADIATION_RANGE + sqrt(burned_fuel * effect_scale / TRITIUM_OXYBURN_MULTIPLIER) / TRITIUM_RADIATION_RANGE_DIVISOR, 20), threshold = TRITIUM_RADIATION_THRESHOLD_BASE * INVERSE(TRITIUM_RADIATION_THRESHOLD_BASE + (burned_fuel * effect_scale / TRITIUM_OXYBURN_MULTIPLIER)), chance = 100 * (1 - 0.5 ** (energy_released / TRITIUM_RADIATION_CHANCE_ENERGY_THRESHOLD_BASE))) - - if(energy_released > 0) - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity - - //let the floor know a fire is happening - if(istype(location)) - temperature = air.temperature - if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - location.hotspot_expose(temperature, CELL_VOLUME) - - return burned_fuel ? REACTING : NO_REACTION - - - -/** - * Freon combustion: - * - * Combustion of oxygen and freon. - * Endothermic. - */ -/datum/gas_reaction/freonfire - priority_group = PRIORITY_FIRE - name = "Freon Combustion" - id = "freonfire" - expands_hotspot = TRUE - desc = "Reaction between oxygen and freon that consumes a huge amount of energy and can cool things significantly. Also able to produce hot ice." - -/datum/gas_reaction/freonfire/init_reqs() - requirements = list( - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - /datum/gas/freon = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = FREON_TERMINAL_TEMPERATURE, - "MAX_TEMP" = FREON_MAXIMUM_BURN_TEMPERATURE, - ) - -/datum/gas_reaction/freonfire/react(datum/gas_mixture/air, datum/holder) - if(!isturf(holder)) - return NO_REACTION - - var/temperature = air.temperature - var/temperature_scale - if(temperature < FREON_TERMINAL_TEMPERATURE) //stop the reaction when too cold - temperature_scale = 0 - else if(temperature < FREON_LOWER_TEMPERATURE) - temperature_scale = 0.5 - else - temperature_scale = (FREON_MAXIMUM_BURN_TEMPERATURE - temperature) / (FREON_MAXIMUM_BURN_TEMPERATURE - FREON_TERMINAL_TEMPERATURE) //calculate the scale based on the temperature - if (temperature_scale <= 0) - return NO_REACTION - - var/oxygen_burn_ratio = OXYGEN_BURN_RATIO_BASE - temperature_scale - var/freon_burn_rate - var/list/cached_gases = air.gases - if(cached_gases[/datum/gas/oxygen][MOLES] < cached_gases[/datum/gas/freon][MOLES] * FREON_OXYGEN_FULLBURN) - freon_burn_rate = (cached_gases[/datum/gas/freon][MOLES] / FREON_BURN_RATE_DELTA) * temperature_scale - else - freon_burn_rate = ((cached_gases[/datum/gas/oxygen][MOLES] / FREON_OXYGEN_FULLBURN) / FREON_BURN_RATE_DELTA) * temperature_scale - - if (freon_burn_rate < MINIMUM_HEAT_CAPACITY) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - freon_burn_rate = min(freon_burn_rate, cached_gases[/datum/gas/freon][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(oxygen_burn_ratio)) //Ensures matter is conserved properly - cached_gases[/datum/gas/freon][MOLES] = QUANTIZE(cached_gases[/datum/gas/freon][MOLES] - freon_burn_rate) - cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (freon_burn_rate * oxygen_burn_ratio)) - ASSERT_GAS(/datum/gas/carbon_dioxide, air) - cached_gases[/datum/gas/carbon_dioxide][MOLES] += freon_burn_rate - - if(temperature < HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE && temperature > HOT_ICE_FORMATION_MINIMUM_TEMPERATURE && prob(HOT_ICE_FORMATION_PROB)) - new /obj/item/stack/sheet/hot_ice(holder) - - SET_REACTION_RESULTS(freon_burn_rate * (1 + oxygen_burn_ratio)) - var/energy_consumed = FIRE_FREON_ENERGY_CONSUMED * freon_burn_rate - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((temperature * old_heat_capacity - energy_consumed) / new_heat_capacity, TCMB) - - var/turf/open/location = holder - if(istype(location)) - temperature = air.temperature - if(temperature < FREON_MAXIMUM_BURN_TEMPERATURE) - location.hotspot_expose(temperature, CELL_VOLUME) - - return REACTING - - -// N2O - -/** - * Nitrous oxide Formation: - * - * Formation of N2O. - * Endothermic. - * Requires BZ as a catalyst. - */ -/datum/gas_reaction/nitrousformation //formation of n2o, exothermic, requires bz as catalyst - priority_group = PRIORITY_FORMATION - name = "Nitrous Oxide Formation" - id = "nitrousformation" - desc = "Production of nitrous oxide with BZ as a catalyst." - -/datum/gas_reaction/nitrousformation/init_reqs() - requirements = list( - /datum/gas/oxygen = 10, - /datum/gas/nitrogen = 20, - /datum/gas/bz = 5, - "MIN_TEMP" = N2O_FORMATION_MIN_TEMPERATURE, - "MAX_TEMP" = N2O_FORMATION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/nitrousformation/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/heat_efficency = min(cached_gases[/datum/gas/oxygen][MOLES], cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(2)) - if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency * 2 < 0)) - return NO_REACTION // Shouldn't produce gas from nothing. - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency - cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency * 2 - ASSERT_GAS(/datum/gas/nitrous_oxide, air) - cached_gases[/datum/gas/nitrous_oxide][MOLES] += heat_efficency - - SET_REACTION_RESULTS(heat_efficency) - var/energy_released = heat_efficency * N2O_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) // The air cools down when reacting. - return REACTING - - -/** - * Nitrous Oxide Decomposition - * - * Decomposition of N2O. - * Exothermic. - */ -/datum/gas_reaction/nitrous_decomp - priority_group = PRIORITY_POST_FORMATION - name = "Nitrous Oxide Decomposition" - id = "nitrous_decomp" - desc = "Decomposition of nitrous oxide under high temperature." - -/datum/gas_reaction/nitrous_decomp/init_reqs() - requirements = list( - /datum/gas/nitrous_oxide = MINIMUM_MOLE_COUNT * 2, - "MIN_TEMP" = N2O_DECOMPOSITION_MIN_TEMPERATURE, - "MAX_TEMP" = N2O_DECOMPOSITION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/nitrous_decomp/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/temperature = air.temperature - var/burned_fuel = (cached_gases[/datum/gas/nitrous_oxide][MOLES] / N2O_DECOMPOSITION_RATE_DIVISOR) * ((temperature - N2O_DECOMPOSITION_MIN_SCALE_TEMP) * (temperature - N2O_DECOMPOSITION_MAX_SCALE_TEMP) / (N2O_DECOMPOSITION_SCALE_DIVISOR)) - if(burned_fuel <= 0) - return NO_REACTION - if(cached_gases[/datum/gas/nitrous_oxide][MOLES] - burned_fuel < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/nitrous_oxide][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/nitrogen, air) - cached_gases[/datum/gas/nitrogen][MOLES] += burned_fuel - ASSERT_GAS(/datum/gas/oxygen, air) - cached_gases[/datum/gas/oxygen][MOLES] += burned_fuel / 2 - - SET_REACTION_RESULTS(burned_fuel) - var/energy_released = N2O_DECOMPOSITION_ENERGY * burned_fuel - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity - return REACTING - - -// BZ - -/** - * BZ Formation - * - * Formation of BZ by combining plasma and nitrous oxide at low pressures. - * Exothermic. - */ -/datum/gas_reaction/bzformation - priority_group = PRIORITY_FORMATION - name = "BZ Gas Formation" - id = "bzformation" - desc = "Production of BZ using plasma and nitrous oxide." - -/datum/gas_reaction/bzformation/init_reqs() - requirements = list( - /datum/gas/nitrous_oxide = 10, - /datum/gas/plasma = 10, - "MAX_TEMP" = BZ_FORMATION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/bzformation/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/pressure = air.returnPressure() - // This slows down in relation to pressure, very quickly. Please don't expect it to be anything more then a snail - - // Bigger is better for these two values. - var/pressure_efficiency = (0.1 * ONE_ATMOSPHERE) / pressure // More pressure = more bad - var/ratio_efficiency = min(cached_gases[/datum/gas/nitrous_oxide][MOLES] / cached_gases[/datum/gas/plasma][MOLES], 1) // Malus to production if more plasma than n2o. - - var/reaction_efficency = min(pressure_efficiency * ratio_efficiency, cached_gases[/datum/gas/nitrous_oxide][MOLES], cached_gases[/datum/gas/plasma][MOLES] * INVERSE(2)) - - if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2 * reaction_efficency) < 0) || reaction_efficency <= 0) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/bz, air) - if (reaction_efficency == cached_gases[/datum/gas/nitrous_oxide][MOLES]) - ASSERT_GAS(/datum/gas/oxygen, air) - cached_gases[/datum/gas/bz][MOLES] += (reaction_efficency * 2.5) - min(pressure, 0.5) - cached_gases[/datum/gas/oxygen][MOLES] += min(pressure, 0.5) - else - cached_gases[/datum/gas/bz][MOLES] += reaction_efficency * 2.5 - - cached_gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency - cached_gases[/datum/gas/plasma][MOLES] -= 2 * reaction_efficency - - SET_REACTION_RESULTS(reaction_efficency) - var/energy_released = 2 * reaction_efficency * FIRE_CARBON_ENERGY_RELEASED - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) - return REACTING - - -// Pluoxium - -/** - * Pluoxium Formation: - * - * Consumes a tiny amount of tritium to convert CO2 and oxygen to pluoxium. - * Exothermic. - */ -/datum/gas_reaction/pluox_formation - priority_group = PRIORITY_FORMATION - name = "Pluoxium Formation" - id = "pluox_formation" - desc = "Alternate production for pluoxium which uses tritium." - -/datum/gas_reaction/pluox_formation/init_reqs() - requirements = list( - /datum/gas/carbon_dioxide = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = PLUOXIUM_FORMATION_MIN_TEMP, - "MAX_TEMP" = PLUOXIUM_FORMATION_MAX_TEMP, - ) - -/datum/gas_reaction/pluox_formation/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/produced_amount = min(PLUOXIUM_FORMATION_MAX_RATE, cached_gases[/datum/gas/carbon_dioxide][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(0.5), cached_gases[/datum/gas/tritium][MOLES] * INVERSE(0.01)) - if (produced_amount <= 0 || cached_gases[/datum/gas/carbon_dioxide][MOLES] - produced_amount < 0 || cached_gases[/datum/gas/oxygen][MOLES] - produced_amount * 0.5 < 0 || cached_gases[/datum/gas/tritium][MOLES] - produced_amount * 0.01 < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/carbon_dioxide][MOLES] -= produced_amount - cached_gases[/datum/gas/oxygen][MOLES] -= produced_amount * 0.5 - cached_gases[/datum/gas/tritium][MOLES] -= produced_amount * 0.01 - ASSERT_GAS(/datum/gas/pluoxium, air) - cached_gases[/datum/gas/pluoxium][MOLES] += produced_amount - ASSERT_GAS(/datum/gas/hydrogen, air) - cached_gases[/datum/gas/hydrogen][MOLES] += produced_amount * 0.01 - - SET_REACTION_RESULTS(produced_amount) - var/energy_released = produced_amount * PLUOXIUM_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) - return REACTING - - -// Nitrium - -/** - * Nitrium Formation: - * - * The formation of nitrium. - * Endothermic. - * Requires BZ. - */ -/datum/gas_reaction/nitrium_formation - priority_group = PRIORITY_FORMATION - name = "Nitrium Formation" - id = "nitrium_formation" - desc = "Production of nitrium from BZ, tritium, and nitrogen." - -/datum/gas_reaction/nitrium_formation/init_reqs() - requirements = list( - /datum/gas/tritium = 20, - /datum/gas/nitrogen = 10, - /datum/gas/bz = 5, - "MIN_TEMP" = NITRIUM_FORMATION_MIN_TEMP, - ) - -/datum/gas_reaction/nitrium_formation/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/heat_efficency = min(temperature / NITRIUM_FORMATION_TEMP_DIVISOR, cached_gases[/datum/gas/tritium][MOLES], cached_gases[/datum/gas/nitrogen][MOLES], cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.05)) - - if( heat_efficency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.05 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/nitrium, air) - cached_gases[/datum/gas/tritium][MOLES] -= heat_efficency - cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.05 //bz gets consumed to balance the nitrium production and not make it too common and/or easy - cached_gases[/datum/gas/nitrium][MOLES] += heat_efficency - - SET_REACTION_RESULTS(heat_efficency) - var/energy_used = heat_efficency * NITRIUM_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) //the air cools down when reacting - return REACTING - - -/** - * Nitrium Decomposition: - * - * The decomposition of nitrium. - * Exothermic. - * Requires oxygen as catalyst. - */ -/datum/gas_reaction/nitrium_decomposition - priority_group = PRIORITY_PRE_FORMATION - name = "Nitrium Decomposition" - id = "nitrium_decomp" - desc = "Decomposition of nitrium when exposed to oxygen under normal temperatures." - -/datum/gas_reaction/nitrium_decomposition/init_reqs() - requirements = list( - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - /datum/gas/nitrium = MINIMUM_MOLE_COUNT, - "MAX_TEMP" = NITRIUM_DECOMPOSITION_MAX_TEMP, - ) - -/datum/gas_reaction/nitrium_decomposition/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/temperature = air.temperature - - //This reaction is agressively slow. like, a tenth of a mole per fire slow. Keep that in mind - var/heat_efficency = min(temperature / NITRIUM_DECOMPOSITION_TEMP_DIVISOR, cached_gases[/datum/gas/nitrium][MOLES]) - - if (heat_efficency <= 0 || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - air.assert_gases(/datum/gas/nitrogen, /datum/gas/hydrogen) - cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency - cached_gases[/datum/gas/hydrogen][MOLES] += heat_efficency - cached_gases[/datum/gas/nitrogen][MOLES] += heat_efficency - - SET_REACTION_RESULTS(heat_efficency) - var/energy_released = heat_efficency * NITRIUM_DECOMPOSITION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) //the air heats up when reacting - return REACTING - - -/** - * Freon formation: - * - * The formation of freon. - * Endothermic. - */ -/datum/gas_reaction/freonformation - priority_group = PRIORITY_FORMATION - name = "Freon Formation" - id = "freonformation" - desc = "Production of freon using plasma, carbon dioxide, and BZ under high temperature." - -/datum/gas_reaction/freonformation/init_reqs() //minimum requirements for freon formation - requirements = list( - /datum/gas/plasma = 40, - /datum/gas/carbon_dioxide = 20, - /datum/gas/bz = 20, - "MIN_TEMP" = FREON_FORMATION_MIN_TEMPERATURE, - ) - -/datum/gas_reaction/freonformation/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/heat_efficency = min(temperature / FREON_FORMATION_TEMP_DIVISOR, cached_gases[/datum/gas/plasma][MOLES] * INVERSE(1.5), cached_gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(0.75), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.25)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/plasma][MOLES] - heat_efficency * 1.5 < 0 ) || (cached_gases[/datum/gas/carbon_dioxide][MOLES] - heat_efficency * 0.75 < 0) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/freon, air) - cached_gases[/datum/gas/plasma][MOLES] -= heat_efficency * 1.5 // 6 - cached_gases[/datum/gas/carbon_dioxide][MOLES] -= heat_efficency * 0.75 // 3 - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 // 1 - cached_gases[/datum/gas/freon][MOLES] += heat_efficency * 2.5 // 10 - - SET_REACTION_RESULTS(heat_efficency * 2.5) - var/energy_used = heat_efficency * FREON_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity - energy_used)/new_heat_capacity), TCMB) - return REACTING - - -/** - * Hyper-Noblium Formation: - * - * Extremely exothermic. - * Requires very low temperatures. - * Due to its high mass, hyper-noblium uses large amounts of nitrogen and tritium. - * BZ can be used as a catalyst to make it less exothermic. - */ -/datum/gas_reaction/nobliumformation - priority_group = PRIORITY_FORMATION - name = "Hyper-Noblium Condensation" - id = "nobformation" - desc = "Production of hyper-noblium from nitrogen and tritium under very low temperatures. Extremely energetic." - -/datum/gas_reaction/nobliumformation/init_reqs() - requirements = list( - /datum/gas/nitrogen = 10, - /datum/gas/tritium = 5, - "MIN_TEMP" = NOBLIUM_FORMATION_MIN_TEMP, - "MAX_TEMP" = NOBLIUM_FORMATION_MAX_TEMP, - ) - -/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) - var/list/cached_gases = air.gases - var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES] + cached_gases[/datum/gas/tritium][MOLES]) * 0.01, cached_gases[/datum/gas/tritium][MOLES] * INVERSE(5), cached_gases[/datum/gas/nitrogen][MOLES] * INVERSE(10)) - - if (nob_formed <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - 5 * nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 10 * nob_formed < 0)) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - air.assert_gases(/datum/gas/hypernoblium, /datum/gas/bz) - var/reduction_factor = clamp(cached_gases[/datum/gas/tritium][MOLES]/(cached_gases[/datum/gas/tritium][MOLES] + cached_gases[/datum/gas/bz][MOLES]), 0.001 , 1) //reduces trit consumption in presence of bz upward to 0.1% reduction - cached_gases[/datum/gas/tritium][MOLES] -= 5 * nob_formed * reduction_factor - cached_gases[/datum/gas/nitrogen][MOLES] -= 10 * nob_formed - cached_gases[/datum/gas/hypernoblium][MOLES] += nob_formed // I'm not going to nitpick, but N20H10 feels like it should be an explosive more than anything. - SET_REACTION_RESULTS(nob_formed) - var/energy_released = nob_formed * (NOBLIUM_FORMATION_ENERGY / (max(cached_gases[/datum/gas/bz][MOLES], 1))) - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) - return REACTING - - -// Halon - -/** - * Halon Formation: - * - * Exothermic - */ -/datum/gas_reaction/halon_formation - priority_group = PRIORITY_FORMATION - name = "Halon Formation" - id = "halon_formation" - desc = "Production of halon from BZ and tritium." - -/datum/gas_reaction/halon_formation/init_reqs() - requirements = list( - /datum/gas/bz = MINIMUM_MOLE_COUNT, - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = HALON_FORMATION_MIN_TEMPERATURE, - "MAX_TEMP" = HALON_FORMATION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/halon_formation/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/heat_efficency = min(temperature * 0.01, cached_gases[/datum/gas/tritium][MOLES] * INVERSE(4), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.25)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/tritium][MOLES] - heat_efficency * 4 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/halon, air) - cached_gases[/datum/gas/tritium][MOLES] -= heat_efficency * 4 - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 - cached_gases[/datum/gas/halon][MOLES] += heat_efficency * 4.25 - - SET_REACTION_RESULTS(heat_efficency * 4.25) - var/energy_released = heat_efficency * HALON_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) - return REACTING - - -/** - * Halon Combustion: - * - * Consumes a large amount of oxygen relative to the amount of halon consumed. - * Produces carbon dioxide. - * Endothermic. - */ -/datum/gas_reaction/halon_o2removal - priority_group = PRIORITY_PRE_FORMATION - name = "Halon Oxygen Absorption" - id = "halon_o2removal" - desc = "Halon interaction with oxygen that can be used to snuff fires out." - -/datum/gas_reaction/halon_o2removal/init_reqs() - requirements = list( - /datum/gas/halon = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - ) - -/datum/gas_reaction/halon_o2removal/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - - var/heat_efficency = min(temperature / ( FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 10), cached_gases[/datum/gas/halon][MOLES], cached_gases[/datum/gas/oxygen][MOLES] * INVERSE(20)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/halon][MOLES] - heat_efficency < 0 ) || (cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency * 20 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/carbon_dioxide, air) - cached_gases[/datum/gas/halon][MOLES] -= heat_efficency - cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency * 20 - cached_gases[/datum/gas/carbon_dioxide][MOLES] += heat_efficency * 5 - - SET_REACTION_RESULTS(heat_efficency * 5) - var/energy_used = heat_efficency * HALON_COMBUSTION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) - return REACTING - - -// Healium - -/** - * Healium Formation: - * - * Exothermic - */ -/datum/gas_reaction/healium_formation - priority_group = PRIORITY_FORMATION - name = "Healium Formation" - id = "healium_formation" - desc = "Production of healium using BZ and freon." - -/datum/gas_reaction/healium_formation/init_reqs() - requirements = list( - /datum/gas/bz = MINIMUM_MOLE_COUNT, - /datum/gas/freon = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = HEALIUM_FORMATION_MIN_TEMP, - "MAX_TEMP" = HEALIUM_FORMATION_MAX_TEMP, - ) - -/datum/gas_reaction/healium_formation/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/heat_efficency = min(temperature * 0.3, cached_gases[/datum/gas/freon][MOLES] * INVERSE(2.75), cached_gases[/datum/gas/bz][MOLES] * INVERSE(0.25)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/freon][MOLES] - heat_efficency * 2.75 < 0 ) || (cached_gases[/datum/gas/bz][MOLES] - heat_efficency * 0.25 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/healium, air) - cached_gases[/datum/gas/freon][MOLES] -= heat_efficency * 2.75 - cached_gases[/datum/gas/bz][MOLES] -= heat_efficency * 0.25 - cached_gases[/datum/gas/healium][MOLES] += heat_efficency * 3 - - SET_REACTION_RESULTS(heat_efficency * 3) - var/energy_released = heat_efficency * HEALIUM_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) - return REACTING - -/** - * Zauker Formation: - * - * Exothermic. - * Requires Hypernoblium. - */ -/datum/gas_reaction/zauker_formation - priority_group = PRIORITY_FORMATION - name = "Zauker Formation" - id = "zauker_formation" - desc = "Production of zauker using hyper-noblium and nitrium under very high temperatures." - -/datum/gas_reaction/zauker_formation/init_reqs() - requirements = list( - /datum/gas/hypernoblium = MINIMUM_MOLE_COUNT, - /datum/gas/nitrium = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = ZAUKER_FORMATION_MIN_TEMPERATURE, - "MAX_TEMP" = ZAUKER_FORMATION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/zauker_formation/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - - var/heat_efficency = min(temperature * ZAUKER_FORMATION_TEMPERATURE_SCALE, cached_gases[/datum/gas/hypernoblium][MOLES] * INVERSE(0.01), cached_gases[/datum/gas/nitrium][MOLES] * INVERSE(0.5)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/hypernoblium][MOLES] - heat_efficency * 0.01 < 0 ) || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficency * 0.5 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/zauker, air) - cached_gases[/datum/gas/hypernoblium][MOLES] -= heat_efficency * 0.01 - cached_gases[/datum/gas/nitrium][MOLES] -= heat_efficency * 0.5 - cached_gases[/datum/gas/zauker][MOLES] += heat_efficency * 0.5 - - SET_REACTION_RESULTS(heat_efficency * 0.5) - var/energy_used = heat_efficency * ZAUKER_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity - energy_used) / new_heat_capacity), TCMB) - return REACTING - - -/** - * Zauker Decomposition: - * - * Occurs in the presence of nitrogen to prevent zauker floods. - * Exothermic. - */ -/datum/gas_reaction/zauker_decomp - priority_group = PRIORITY_POST_FORMATION - name = "Zauker Decomposition" - id = "zauker_decomp" - desc = "Decomposition of zauker when exposed to nitrogen." - -/datum/gas_reaction/zauker_decomp/init_reqs() - requirements = list( - /datum/gas/nitrogen = MINIMUM_MOLE_COUNT, - /datum/gas/zauker = MINIMUM_MOLE_COUNT, - ) - -/datum/gas_reaction/zauker_decomp/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow - var/burned_fuel = min(ZAUKER_DECOMPOSITION_MAX_RATE, cached_gases[/datum/gas/nitrogen][MOLES], cached_gases[/datum/gas/zauker][MOLES]) - if (burned_fuel <= 0 || cached_gases[/datum/gas/zauker][MOLES] - burned_fuel < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/zauker][MOLES] -= burned_fuel - ASSERT_GAS(/datum/gas/oxygen, air) - cached_gases[/datum/gas/oxygen][MOLES] += burned_fuel * 0.3 - ASSERT_GAS(/datum/gas/nitrogen, air) - cached_gases[/datum/gas/nitrogen][MOLES] += burned_fuel * 0.7 - - SET_REACTION_RESULTS(burned_fuel) - var/energy_released = ZAUKER_DECOMPOSITION_ENERGY * burned_fuel - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((air.temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) - return REACTING - - -// Proto-Nitrate - -/** - * Proto-Nitrate formation: - * - * Exothermic. - */ -/datum/gas_reaction/proto_nitrate_formation - priority_group = PRIORITY_FORMATION - name = "Proto Nitrate Formation" - id = "proto_nitrate_formation" - desc = "Production of proto-nitrate from pluoxium and hydrogen under high temperatures." - -/datum/gas_reaction/proto_nitrate_formation/init_reqs() - requirements = list( - /datum/gas/pluoxium = MINIMUM_MOLE_COUNT, - /datum/gas/hydrogen = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = PN_FORMATION_MIN_TEMPERATURE, - "MAX_TEMP" = PN_FORMATION_MAX_TEMPERATURE, - ) - -/datum/gas_reaction/proto_nitrate_formation/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - - var/heat_efficency = min(temperature * 0.005, cached_gases[/datum/gas/pluoxium][MOLES] * INVERSE(0.2), cached_gases[/datum/gas/hydrogen][MOLES] * INVERSE(2)) - if (heat_efficency <= 0 || (cached_gases[/datum/gas/pluoxium][MOLES] - heat_efficency * 0.2 < 0 ) || (cached_gases[/datum/gas/hydrogen][MOLES] - heat_efficency * 2 < 0)) //Shouldn't produce gas from nothing. - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - ASSERT_GAS(/datum/gas/proto_nitrate, air) - cached_gases[/datum/gas/hydrogen][MOLES] -= heat_efficency * 2 - cached_gases[/datum/gas/pluoxium][MOLES] -= heat_efficency * 0.2 - cached_gases[/datum/gas/proto_nitrate][MOLES] += heat_efficency * 2.2 - - SET_REACTION_RESULTS(heat_efficency * 2.2) - var/energy_released = heat_efficency * PN_FORMATION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max(((temperature * old_heat_capacity + energy_released) / new_heat_capacity), TCMB) - return REACTING - -/** - * Proto-Nitrate Hydrogen Conversion - * - * Converts hydrogen into proto-nitrate. - * Endothermic. - */ -/datum/gas_reaction/proto_nitrate_hydrogen_response - priority_group = PRIORITY_PRE_FORMATION - name = "Proto Nitrate Hydrogen Response" - id = "proto_nitrate_hydrogen_response" - desc = "Conversion of hydrogen into proto nitrate." - -/datum/gas_reaction/proto_nitrate_hydrogen_response/init_reqs() - requirements = list( - /datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT, - /datum/gas/hydrogen = PN_HYDROGEN_CONVERSION_THRESHOLD, - ) - -/datum/gas_reaction/proto_nitrate_hydrogen_response/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/produced_amount = min(PN_HYDROGEN_CONVERSION_MAX_RATE, cached_gases[/datum/gas/hydrogen][MOLES], cached_gases[/datum/gas/proto_nitrate][MOLES]) - if (produced_amount <= 0 || cached_gases[/datum/gas/hydrogen][MOLES] - produced_amount < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/hydrogen][MOLES] -= produced_amount - cached_gases[/datum/gas/proto_nitrate][MOLES] += produced_amount * 0.5 - - SET_REACTION_RESULTS(produced_amount * 0.5) - var/energy_used = produced_amount * PN_HYDROGEN_CONVERSION_ENERGY - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((air.temperature * old_heat_capacity - energy_used) / new_heat_capacity, TCMB) - return REACTING - -/** - * Proto-Nitrate Tritium De-irradiation - * - * Converts tritium to hydrogen. - * Releases radiation. - * Exothermic. - */ -/datum/gas_reaction/proto_nitrate_tritium_response - priority_group = PRIORITY_PRE_FORMATION - name = "Proto Nitrate Tritium Response" - id = "proto_nitrate_tritium_response" - desc = "Conversion of tritium into hydrogen that consumes a small amount of proto-nitrate." - -/datum/gas_reaction/proto_nitrate_tritium_response/init_reqs() - requirements = list( - /datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT, - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = PN_TRITIUM_CONVERSION_MIN_TEMP, - "MAX_TEMP" = PN_TRITIUM_CONVERSION_MAX_TEMP, - ) - -/datum/gas_reaction/proto_nitrate_tritium_response/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/produced_amount = min(air.temperature / 34 * (cached_gases[/datum/gas/tritium][MOLES] * cached_gases[/datum/gas/proto_nitrate][MOLES]) / (cached_gases[/datum/gas/tritium][MOLES] + 10 * cached_gases[/datum/gas/proto_nitrate][MOLES]), cached_gases[/datum/gas/tritium][MOLES], cached_gases[/datum/gas/proto_nitrate][MOLES] * INVERSE(0.01)) - if(cached_gases[/datum/gas/tritium][MOLES] - produced_amount < 0 || cached_gases[/datum/gas/proto_nitrate][MOLES] - produced_amount * 0.01 < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/proto_nitrate][MOLES] -= produced_amount * 0.01 - cached_gases[/datum/gas/tritium][MOLES] -= produced_amount - ASSERT_GAS(/datum/gas/hydrogen, air) - cached_gases[/datum/gas/hydrogen][MOLES] += produced_amount - - SET_REACTION_RESULTS(produced_amount) - var/turf/open/location - var/energy_released = produced_amount * PN_TRITIUM_CONVERSION_ENERGY - if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. - var/datum/pipeline/pipenet = holder - location = pick(pipenet.members) - else if(isatom(holder)) - location = holder - if (location && energy_released > PN_BZASE_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) - radiation_pulse(location, max_range = min(sqrt(produced_amount) / PN_TRITIUM_RAD_RANGE_DIVISOR, 20), threshold = PN_TRITIUM_RAD_THRESHOLD_BASE * INVERSE(PN_TRITIUM_RAD_THRESHOLD_BASE + produced_amount), chance = 50) - - if(energy_released) - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) - return REACTING - -/** - * Proto-Nitrate BZase Action - * - * Breaks BZ down into nitrogen, helium, and plasma in the presence of proto-nitrate. - */ -/datum/gas_reaction/proto_nitrate_bz_response - priority_group = PRIORITY_PRE_FORMATION - name = "Proto Nitrate BZ Response" - id = "proto_nitrate_bz_response" - desc = "Breakdown of BZ into nitrogen, helium, and plasma by proto-nitrate under low temperatures." - -/datum/gas_reaction/proto_nitrate_bz_response/init_reqs() - requirements = list( - /datum/gas/proto_nitrate = MINIMUM_MOLE_COUNT, - /datum/gas/bz = MINIMUM_MOLE_COUNT, - "MIN_TEMP" = PN_BZASE_MIN_TEMP, - "MAX_TEMP" = PN_BZASE_MAX_TEMP, - ) - -/datum/gas_reaction/proto_nitrate_bz_response/react(datum/gas_mixture/air, datum/holder) - var/list/cached_gases = air.gases - var/temperature = air.temperature - var/consumed_amount = min(air.temperature / 2240 * cached_gases[/datum/gas/bz][MOLES] * cached_gases[/datum/gas/proto_nitrate][MOLES] / (cached_gases[/datum/gas/bz][MOLES] + cached_gases[/datum/gas/proto_nitrate][MOLES]), cached_gases[/datum/gas/bz][MOLES], cached_gases[/datum/gas/proto_nitrate][MOLES]) - if (consumed_amount <= 0 || cached_gases[/datum/gas/bz][MOLES] - consumed_amount < 0) - return NO_REACTION - - var/old_heat_capacity = air.getHeatCapacity() - cached_gases[/datum/gas/bz][MOLES] -= consumed_amount - ASSERT_GAS(/datum/gas/nitrogen, air) - cached_gases[/datum/gas/nitrogen][MOLES] += consumed_amount * 0.4 - ASSERT_GAS(/datum/gas/helium, air) - cached_gases[/datum/gas/helium][MOLES] += consumed_amount * 1.6 - ASSERT_GAS(/datum/gas/plasma, air) - cached_gases[/datum/gas/plasma][MOLES] += consumed_amount * 0.8 - - SET_REACTION_RESULTS(consumed_amount) - var/turf/open/location - var/energy_released = consumed_amount * PN_BZASE_ENERGY - if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. - var/datum/pipeline/pipenet = holder - location = pick(pipenet.members) - else if(isatom(holder)) - location = holder - if (location && energy_released > PN_TRITIUM_CONVERSION_RAD_RELEASE_THRESHOLD * (air.volume / CELL_VOLUME) ** ATMOS_RADIATION_VOLUME_EXP) - radiation_pulse(location, max_range = min(sqrt(consumed_amount) / PN_BZASE_RAD_RANGE_DIVISOR, 20), threshold = PN_BZASE_RAD_THRESHOLD_BASE * INVERSE(PN_BZASE_RAD_THRESHOLD_BASE + consumed_amount), chance = 50) - for(var/mob/living/carbon/L in location) - L.hallucination += consumed_amount - - var/new_heat_capacity = air.getHeatCapacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB) - return REACTING - -#undef SET_REACTION_RESULTS diff --git a/code/modules/atmospherics/machinery/bluespace_vendor.dm b/code/modules/atmospherics/machinery/bluespace_vendor.dm deleted file mode 100644 index ad817e8666e..00000000000 --- a/code/modules/atmospherics/machinery/bluespace_vendor.dm +++ /dev/null @@ -1,282 +0,0 @@ -/obj/item/wallframe/bluespace_vendor_mount - name = "bluespace vendor wall mount" - desc = "Used for placing bluespace vendors." - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' - icon_state = "bluespace_vendor_open" - result_path = /obj/machinery/bluespace_vendor/built - pixel_shift = 30 - -///Defines for the mode of the vendor -#define BS_MODE_OFF 1 -#define BS_MODE_IDLE 2 -#define BS_MODE_PUMPING 3 -#define BS_MODE_OPEN 4 - -/obj/machinery/bluespace_vendor - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' - icon_state = "bluespace_vendor_off" - name = "Bluespace Gas Vendor" - desc = "Sells gas tanks with custom mixes for all the family!" - - max_integrity = 300 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 80, ACID = 30) - layer = OBJ_LAYER - - ///The bluespace sender that this vendor is connected to - var/obj/machinery/atmospherics/components/unary/bluespace_sender/connected_machine - ///Amount of usable tanks inside the machine - var/empty_tanks = 10 - ///Reference to the current in use tank to be filled - var/obj/item/tank/internals/generic/internal_tank - ///Path of the gas selected from the UI to be pumped inside the tanks - var/selected_gas - ///Is the vendor trying to move gases from the network to the tanks? - var/pumping = FALSE - ///Has the user prepared a tank to be filled with gases? - var/inserted_tank = FALSE - ///Amount of the tank already filled with gas (from 0 to 100) - var/tank_filling_amount = 0 - ///Base price of the tank - var/tank_cost = 10 - ///Stores the current price of the gases inside the tank - var/gas_price = 0 - ///Helper for mappers, will automatically connect to the sender (ensure to only place one sender per map) - var/map_spawned = TRUE - ///Base icon name for updating the appearance - var/base_icon = "bluespace_vendor" - ///Current operating mode of the vendor - var/mode = BS_MODE_OFF - -//The one that the players make -/obj/machinery/bluespace_vendor/built - map_spawned = FALSE - mode = BS_MODE_OPEN - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/bluespace_vendor, 30) - -/obj/machinery/bluespace_vendor/New(loc, ndir, nbuild) - . = ..() - - if(nbuild) - panel_open = TRUE - - update_appearance() - -/obj/machinery/bluespace_vendor/Initialize(mapload) - . = ..() - AddComponent(/datum/component/payment, tank_cost, SSeconomy.get_dep_account(ACCOUNT_ENG), PAYMENT_ANGRY) - -/obj/machinery/bluespace_vendor/LateInitialize() - . = ..() - if(!map_spawned) - return - for(var/obj/machinery/atmospherics/components/unary/bluespace_sender/sender in GLOB.machines) - register_machine(sender) - -/obj/machinery/bluespace_vendor/Destroy() - unregister_machine() - return ..() - -/obj/machinery/bluespace_vendor/update_icon_state() - switch(mode) - if(BS_MODE_OFF) - icon_state = "[base_icon]_off" - if(BS_MODE_IDLE) - icon_state = "[base_icon]_idle" - if(BS_MODE_PUMPING) - icon_state = "[base_icon]_pumping" - if(BS_MODE_OPEN) - icon_state = "[base_icon]_open" - return ..() - -/obj/machinery/bluespace_vendor/Exited(atom/movable/gone, direction) - if(gone == internal_tank) - internal_tank = null - return ..() - -/obj/machinery/bluespace_vendor/process() - if(mode == BS_MODE_OPEN) - return - if(!selected_gas) - return - var/gas_path = gas_id2path(selected_gas) - - if(!connected_machine.bluespace_network.gases[gas_path]) - pumping = FALSE - selected_gas = null - mode = BS_MODE_IDLE - update_appearance() - return - - connected_machine.bluespace_network.pump_gas_to(internal_tank.return_air(), (tank_filling_amount * 0.01) * 10 * ONE_ATMOSPHERE, gas_path) - -/obj/machinery/bluespace_vendor/multitool_act(mob/living/user, obj/item/multitool/multitool) - if(!istype(multitool)) - return - if(!istype(multitool.buffer, /obj/machinery/atmospherics/components/unary/bluespace_sender)) - to_chat(user, span_notice("Wrong machine type in [multitool] buffer...")) - return - if(connected_machine) - to_chat(user, span_notice("Changing [src] bluespace network...")) - if(!do_after(user, 0.2 SECONDS, src)) - return - playsound(get_turf(user), 'sound/machines/click.ogg', 10, TRUE) - register_machine(multitool.buffer) - to_chat(user, span_notice("You link [src] to the console in [multitool]'s buffer.")) - return TRUE - -/obj/machinery/bluespace_vendor/attackby(obj/item/item, mob/living/user) - if(!pumping && default_deconstruction_screwdriver(user, "[base_icon]_open", "[base_icon]_off", item)) - check_mode() - return - if(default_deconstruction_crowbar(item, FALSE, custom_deconstruct = TRUE)) - new/obj/item/wallframe/bluespace_vendor_mount(user.loc) - qdel(src) - return - - if(istype(item, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/iron = item - if (iron.use(1)) - empty_tanks++ - return TRUE - return ..() - -/obj/machinery/bluespace_vendor/examine(mob/user) - . = ..() - if(empty_tanks > 1) - . += span_notice("There are currently [empty_tanks] empty tanks available, more can be made by inserting iron sheets in the machine.") - else if(empty_tanks == 1) - . += span_notice("There is only one empty tank available, please refill the machine by using iron sheets.") - else - . += span_notice("There is no available tank, please refill the machine by using iron sheets.") - -///Check what is the current operating mode -/obj/machinery/bluespace_vendor/proc/check_mode() - if(panel_open) - mode = BS_MODE_OPEN - else if(connected_machine) - mode = BS_MODE_IDLE - else - mode = BS_MODE_OFF - update_appearance() - -///Register the sender as the connected_machine -/obj/machinery/bluespace_vendor/proc/register_machine(machine) - connected_machine = machine - LAZYADD(connected_machine.vendors, src) - RegisterSignal(connected_machine, COMSIG_PARENT_QDELETING, .proc/unregister_machine) - mode = BS_MODE_IDLE - update_appearance() - -///Unregister the connected_machine (either when qdel this or the sender) -/obj/machinery/bluespace_vendor/proc/unregister_machine() - SIGNAL_HANDLER - if(connected_machine) - UnregisterSignal(connected_machine, COMSIG_PARENT_QDELETING) - LAZYREMOVE(connected_machine.vendors, src) - connected_machine = null - mode = BS_MODE_OFF - update_appearance() - -///Check the price of the current tank, if the user doesn't have the money the gas will be merged back into the network -/obj/machinery/bluespace_vendor/proc/check_price(mob/user) - var/temp_price = 0 - var/datum/gas_mixture/working_mix = internal_tank.return_air() - var/list/gases = working_mix.gases - for(var/gas_id in gases) - temp_price += gases[gas_id][MOLES] * connected_machine.base_prices[gas_id] - gas_price = temp_price - - if(attempt_charge(src, user, gas_price) & COMPONENT_OBJ_CANCEL_CHARGE) - var/datum/gas_mixture/remove = working_mix.removeRatio(1) - connected_machine.bluespace_network.merge(remove) - return - connected_machine.credits_gained += gas_price + tank_cost - - if(internal_tank && Adjacent(user)) //proper capitalysm take money before goods - inserted_tank = FALSE - user.put_in_hands(internal_tank) - -/obj/machinery/bluespace_vendor/ui_interact(mob/user, datum/tgui/ui) - if(!connected_machine || mode == BS_MODE_OPEN) - return - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BluespaceVendor", name) - ui.open() - -/obj/machinery/bluespace_vendor/ui_data(mob/user) - var/list/data = list() - var/list/bluespace_gasdata = list() - if(connected_machine.bluespace_network.get_moles()) - for(var/gas_id in connected_machine.bluespace_network.gases) - bluespace_gasdata.Add(list(list( - "name" = connected_machine.bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], - "id" = connected_machine.bluespace_network.gases[gas_id][GAS_META][META_GAS_ID], - "amount" = round(connected_machine.bluespace_network.gases[gas_id][MOLES], 0.01), - "price" = connected_machine.base_prices[gas_id], - ))) - else - for(var/gas_id in connected_machine.bluespace_network.gases) - bluespace_gasdata.Add(list(list( - "name" = connected_machine.bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], - "id" = "", - "amount" = 0, - "price" = 0, - ))) - data["bluespace_network_gases"] = bluespace_gasdata - data["pumping"] = pumping - data["tank_filling_amount"] = tank_filling_amount - data["selected_gas"] = selected_gas - data["tank_amount"] = empty_tanks - data["inserted_tank"] = inserted_tank - var/total_tank_pressure - if(internal_tank) - var/datum/gas_mixture/working_mix = internal_tank.return_air() - total_tank_pressure = working_mix.returnPressure() - else - total_tank_pressure = 0 - data["tank_full"] = total_tank_pressure - return data - -/obj/machinery/bluespace_vendor/ui_act(action, params) - . = ..() - if(.) - return - - if(mode == BS_MODE_OPEN) - return - - switch(action) - if("start_pumping") - if(inserted_tank && !pumping) - pumping = TRUE - selected_gas = params["gas_id"] - mode = BS_MODE_PUMPING - update_appearance() - . = TRUE - if("stop_pumping") - if(inserted_tank && pumping) - pumping = FALSE - selected_gas = null - mode = BS_MODE_IDLE - update_appearance() - . = TRUE - if("pumping_rate") - tank_filling_amount = clamp(params["rate"], 0, 100) - . = TRUE - if("tank_prepare") - if(empty_tanks && !inserted_tank) - inserted_tank = TRUE - internal_tank = new(src) - empty_tanks = max(empty_tanks - 1, 0) - . = TRUE - if("tank_expel") - if(inserted_tank && !pumping) - check_price(usr) - . = TRUE - -#undef BS_MODE_OFF -#undef BS_MODE_IDLE -#undef BS_MODE_PUMPING -#undef BS_MODE_OPEN diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm deleted file mode 100644 index b4f9df6f42e..00000000000 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ /dev/null @@ -1,212 +0,0 @@ -#define ELECTROLYZER_MODE_STANDBY "standby" -#define ELECTROLYZER_MODE_WORKING "working" - -/obj/machinery/electrolyzer - anchored = FALSE - density = TRUE - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN - icon = 'icons/obj/atmos.dmi' - icon_state = "electrolyzer-off" - name = "space electrolyzer" - desc = "Thanks to the fast and dynamic response of our electrolyzers, on-site hydrogen production is guaranteed. Warranty void if used by clowns" - max_integrity = 250 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 80, ACID = 10) - circuit = /obj/item/circuitboard/machine/electrolyzer - /// We don't use area power, we always use the cell - use_power = NO_POWER_USE - ///used to check if there is a cell in the machine - var/obj/item/stock_parts/cell/cell - ///check if the machine is on or off - var/on = FALSE - ///check what mode the machine should be (WORKING, STANDBY) - var/mode = ELECTROLYZER_MODE_STANDBY - ///Increase the amount of moles worked on, changed by upgrading the manipulator tier - var/working_power = 1 - ///Decrease the amount of power usage, changed by upgrading the capacitor tier - var/efficiency = 0.5 - -/obj/machinery/electrolyzer/get_cell() - return cell - -/obj/machinery/electrolyzer/Initialize(mapload) - . = ..() - if(ispath(cell)) - cell = new cell(src) - SSairmachines.start_processing_machine(src) - update_appearance() - -/obj/machinery/electrolyzer/Destroy() - if(cell) - QDEL_NULL(cell) - return ..() - -/obj/machinery/electrolyzer/on_deconstruction() - if(cell) - LAZYADD(component_parts, cell) - cell = null - return ..() - -/obj/machinery/electrolyzer/examine(mob/user) - . = ..() - . += "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"]." - - if(cell) - . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." - else - . += "There is no power cell installed." - -/obj/machinery/electrolyzer/update_icon_state() - icon_state = "electrolyzer-[on ? "[mode]" : "off"]" - return ..() - -/obj/machinery/electrolyzer/update_overlays() - . = ..() - if(panel_open) - . += "electrolyzer-open" - -/obj/machinery/electrolyzer/process_atmos() - - if(!is_operational && on) - on = FALSE - if(!on) - return PROCESS_KILL - - if((!cell || cell.charge <= 0) && !anchored) - on = FALSE - update_appearance() - return PROCESS_KILL - - var/turf/our_turf = loc - if(!istype(our_turf)) - if(mode != ELECTROLYZER_MODE_STANDBY) - mode = ELECTROLYZER_MODE_STANDBY - update_appearance() - return - - var/new_mode = on ? ELECTROLYZER_MODE_WORKING : ELECTROLYZER_MODE_STANDBY //change the mode to working if the machine is on - - if(mode != new_mode) //check if the mode is set correctly - mode = new_mode - update_appearance() - - if(mode == ELECTROLYZER_MODE_STANDBY) - return - - var/datum/gas_mixture/env = our_turf.return_air() //get air from the turf - - if(!env) - return - - call_reactions(env) - - //air_update_turf(FALSE, FALSE) - - if(anchored) - return - - cell.use((5 * (3 * working_power) * working_power) / (efficiency + working_power)) - -/obj/machinery/electrolyzer/proc/call_reactions(datum/gas_mixture/env) - for(var/reaction in GLOB.electrolyzer_reactions) - var/datum/electrolyzer_reaction/current_reaction = GLOB.electrolyzer_reactions[reaction] - - if(!current_reaction.reaction_check(env)) - continue - - current_reaction.react(loc, env, working_power) - -/obj/machinery/electrolyzer/RefreshParts() - . = ..() - var/manipulator = 0 - var/cap = 0 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - manipulator += M.rating - for(var/obj/item/stock_parts/capacitor/M in component_parts) - cap += M.rating - - working_power = manipulator //used in the amount of moles processed - - efficiency = (cap + 1) * 0.5 //used in the amount of charge in power cell uses - -/obj/machinery/electrolyzer/screwdriver_act(mob/living/user, obj/item/tool) - tool.play_tool_sound(src, 50) - panel_open = !panel_open - user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) - update_appearance() - return TRUE - -/obj/machinery/electrolyzer/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/machinery/electrolyzer/crowbar_act(mob/living/user, obj/item/tool) - return default_deconstruction_crowbar(tool) - -/obj/machinery/electrolyzer/default_unfasten_wrench(mob/user, obj/item/wrench, time) - . = ..() - if(anchored) - update_use_power(ACTIVE_POWER_USE) - else - update_use_power(NO_POWER_USE) - -/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) - if(istype(I, /obj/item/stock_parts/cell)) - if(!panel_open) - to_chat(user, span_warning("The hatch must be open to insert a power cell!")) - return - if(cell) - to_chat(user, span_warning("There is already a power cell inside!")) - return - if(!user.transferItemToLoc(I, src)) - return - cell = I - I.add_fingerprint(usr) - - user.visible_message(span_notice("\The [user] inserts a power cell into \the [src]."), span_notice("You insert the power cell into \the [src].")) - SStgui.update_uis(src) - - return - return ..() - -/obj/machinery/electrolyzer/ui_state(mob/user) - return GLOB.physical_state - -/obj/machinery/electrolyzer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Electrolyzer", name) - ui.open() - -/obj/machinery/electrolyzer/ui_data() - var/list/data = list() - data["open"] = panel_open - data["on"] = on - data["hasPowercell"] = !isnull(cell) - data["anchored"] = anchored - if(cell) - data["powerLevel"] = round(cell.percent(), 1) - return data - -/obj/machinery/electrolyzer/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("power") - on = !on - mode = ELECTROLYZER_MODE_STANDBY - usr.visible_message(span_notice("[usr] switches [on ? "on" : "off"] \the [src]."), span_notice("You switch [on ? "on" : "off"] \the [src].")) - update_appearance() - if (on) - SSair.start_processing_machine(src) - . = TRUE - if("eject") - if(panel_open && cell) - cell.forceMove(drop_location()) - cell = null - . = TRUE - -#undef ELECTROLYZER_MODE_STANDBY -#undef ELECTROLYZER_MODE_WORKING diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm deleted file mode 100644 index 8098608640c..00000000000 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm +++ /dev/null @@ -1,63 +0,0 @@ -GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list()) - -/* - * Global proc to build the electrolyzer reactions list - */ -/proc/electrolyzer_reactions_list() - var/list/built_reaction_list = list() - for(var/reaction_path in subtypesof(/datum/electrolyzer_reaction)) - var/datum/electrolyzer_reaction/reaction = new reaction_path() - - built_reaction_list[reaction.id] = reaction - - return built_reaction_list - -/datum/electrolyzer_reaction - var/list/requirements - var/name = "reaction" - var/id = "r" - -/datum/electrolyzer_reaction/proc/react(turf/location, datum/gas_mixture/air_mixture, working_power) - return - -/datum/electrolyzer_reaction/proc/reaction_check(datum/gas_mixture/air_mixture) - var/temp = air_mixture.temperature - var/list/cached_gases = air_mixture.gases - if((requirements["MIN_TEMP"] && temp < requirements["MIN_TEMP"]) || (requirements["MAX_TEMP"] && temp > requirements["MAX_TEMP"])) - return FALSE - for(var/id in requirements) - if (id == "MIN_TEMP" || id == "MAX_TEMP") - continue - if(!cached_gases[id] || cached_gases[id][MOLES] < requirements[id]) - return FALSE - return TRUE - -/datum/electrolyzer_reaction/h2o_conversion - name = "H2O Conversion" - id = "h2o_conversion" - requirements = list( - /datum/gas/water_vapor = MINIMUM_MOLE_COUNT - ) - -/datum/electrolyzer_reaction/h2o_conversion/react(turf/location, datum/gas_mixture/air_mixture, working_power) - - air_mixture.assert_gases(/datum/gas/water_vapor, /datum/gas/oxygen, /datum/gas/hydrogen) - var/proportion = min(air_mixture.gases[/datum/gas/water_vapor][MOLES], (2.5 * (working_power ** 2))) - air_mixture.gases[/datum/gas/water_vapor][MOLES] -= proportion * 2 - air_mixture.gases[/datum/gas/oxygen][MOLES] += proportion - air_mixture.gases[/datum/gas/hydrogen][MOLES] += proportion * 2 - -/datum/electrolyzer_reaction/nob_conversion - name = "Hypernob conversion" - id = "nob_conversion" - requirements = list( - /datum/gas/hypernoblium = MINIMUM_MOLE_COUNT, - "MAX_TEMP" = 150 - ) - -/datum/electrolyzer_reaction/nob_conversion/react(turf/location, datum/gas_mixture/air_mixture, working_power) - - air_mixture.assert_gases(/datum/gas/hypernoblium, /datum/gas/antinoblium) - var/proportion = min(air_mixture.gases[/datum/gas/hypernoblium][MOLES], (1.5 * (working_power ** 2))) - air_mixture.gases[/datum/gas/hypernoblium][MOLES] -= proportion - air_mixture.gases[/datum/gas/antinoblium][MOLES] += proportion * 0.5 diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm deleted file mode 100644 index d51fbdbefee..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm +++ /dev/null @@ -1,203 +0,0 @@ -/** - * This section contain the hfr core with all the variables and the Initialize() and Destroy() procs - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core - name = "HFR core" - desc = "This is the Hypertorus Fusion Reactor core, an advanced piece of technology to finely tune the reaction inside of the machine. It has I/O for cooling gases." - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' - icon_state = "core_off" - circuit = /obj/item/circuitboard/machine/HFR_core - use_power = IDLE_POWER_USE - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION - ///Vars for the state of the icon of the object (open, off, active) - icon_state_open = "core_open" - icon_state_off = "core_off" - icon_state_active = "core_active" - - /** - * Processing checks - */ - - ///Checks if the user has started the machine - var/start_power = FALSE - ///Checks for the cooling to start - var/start_cooling = FALSE - ///Checks for the fuel to be injected - var/start_fuel = FALSE - ///Checks for the moderators to be injected - var/start_moderator = FALSE - - /** - * Hypertorus internal objects and gasmixes - */ - - ///Stores the informations of the interface machine - var/obj/machinery/hypertorus/interface/linked_interface - ///Stores the information of the moderator input - var/obj/machinery/atmospherics/components/unary/hypertorus/moderator_input/linked_moderator - ///Stores the information of the fuel input - var/obj/machinery/atmospherics/components/unary/hypertorus/fuel_input/linked_input - ///Stores the information of the waste output - var/obj/machinery/atmospherics/components/unary/hypertorus/waste_output/linked_output - ///Stores the information of the corners of the machine - var/list/corners = list() - ///Stores the three inputs/outputs of the HFR, needed for cracking the parts - var/list/machine_parts = list() - ///Stores the information of the fusion gasmix - var/datum/gas_mixture/internal_fusion - ///Stores the information of the moderators gasmix - var/datum/gas_mixture/moderator_internal - ///Set the filtering list of the waste remove - var/list/moderator_scrubbing = list( - /datum/gas/helium, - ) - ///Set the amount of moles per tick should be removed from the moderator by filtering - var/moderator_filtering_rate = 100 - ///Stores the current fuel mix that the user has selected - var/datum/hfr_fuel/selected_fuel - - /** - * Fusion vars - */ - - ///E=mc^2 with some addition to allow it gameplaywise - var/energy = 0 - ///Temperature of the center of the fusion reaction - var/core_temperature = T20C - /**Power emitted from the center of the fusion reaction: Internal power = densityH2 * densityTrit(Pi * (2 * rH2 * rTrit)**2) * Energy - * density is calculated with moles/volume, rH2 and rTrit are values calculated with moles/(radius of the gas) - both of the density can be varied by the power_modifier - **/ - var/internal_power = 0 - /**The effective power transmission of the fusion reaction, power_output = efficiency * (internal_power - conduction - radiation) - * Conduction is the heat value that is transmitted by the molecular interactions and it gets removed from the internal_power lowering the effective output - * Radiation is the irradiation released by the fusion reaction, it comprehends all wavelenghts in the spectrum, it lowers the effective output of the reaction - **/ - var/power_output = 0 - ///Instability effects how chaotic the behavior of the reaction is - var/instability = 0 - ///Difference between the gases temperature and the internal temperature of the reaction - var/delta_temperature = 0 - ///Energy from the reaction lost from the molecule colliding between themselves. - var/conduction = 0 - ///The remaining wavelength that actually can do damage to mobs. - var/radiation = 0 - ///Efficiency of the reaction, it increases with the amount of plasma - var/efficiency = 0 - ///Hotter air is easier to heat up and cool down - var/heat_limiter_modifier = 0 - ///How much the reaction can cool itself - var/heat_output_max = 0 - ///How much the reaction can heat itself - var/heat_output_min = 0 - ///The amount of heat that is finally emitted, based on the power output. Min and max are variables that depends of the modifier - var/heat_output = 0 - - ///Check if the user want to remove the waste gases - var/waste_remove = FALSE - ///User controlled variable to control the flow of the fusion by changing the contact of the material - var/heating_conductor = 100 - ///User controlled variable to control the flow of the fusion by changing the volume of the gasmix by controlling the power of the magnetic fields - var/magnetic_constrictor = 100 - ///User controlled variable to control the flow of the fusion by changing the instability of the reaction - var/current_damper = 0 - ///Stores the current fusion mix power level - var/power_level = 0 - ///Stores the iron content produced by the fusion - var/iron_content = 0 - ///User controlled variable to control the flow of the fusion by changing the amount of fuel injected - var/fuel_injection_rate = 25 - ///User controlled variable to control the flow of the fusion by changing the amount of moderators injected - var/moderator_injection_rate = 25 - - ///Integrity of the machine, if reaches 900 the machine will explode - var/critical_threshold_proximity = 0 - ///Store the integrity for calculations - var/critical_threshold_proximity_archived = 0 - ///Our "Shit is no longer fucked" message. We send it when critical_threshold_proximity is less then critical_threshold_proximity_archived - var/safe_alert = "Main containment field returning to safe operating parameters." - ///The point at which we should start sending messeges about the critical_threshold_proximity to the engi channels. - var/warning_point = 50 - ///The alert we send when we've reached warning_point - var/warning_alert = "Danger! Magnetic containment field faltering!" - ///The point at which we start sending messages to the common channel - var/emergency_point = 700 - ///The alert we send when we've reached emergency_point - var/emergency_alert = "HYPERTORUS MELTDOWN IMMINENT." - ///The point at which we melt - var/melting_point = 900 - ///Boolean used for logging if we've passed the emergency point - var/has_reached_emergency = FALSE - ///Time in 1/10th of seconds since the last sent warning - var/lastwarning = 0 - - ///Our internal radio - var/obj/item/radio/radio - ///The key our internal radio uses - var/radio_key = /obj/item/encryptionkey/headset_eng - ///The engineering channel - var/engineering_channel = "Engineering" - ///The common channel - var/common_channel = null - - ///Our soundloop - var/datum/looping_sound/hypertorus/soundloop - ///cooldown tracker for accent sounds - var/last_accent_sound = 0 - - ///These vars store the temperatures to be used in the GUI - var/fusion_temperature_archived = 0 - var/fusion_temperature = 0 - var/moderator_temperature_archived = 0 - var/moderator_temperature = 0 - var/coolant_temperature_archived = 0 - var/coolant_temperature = 0 - var/output_temperature_archived = 0 - var/output_temperature = 0 - ///Time between current and _archived temperatures - var/temperature_period = 1 - ///Var used in the meltdown phase - var/final_countdown = FALSE - -/obj/machinery/atmospherics/components/unary/hypertorus/core/Initialize(mapload) - . = ..() - internal_fusion = new - internal_fusion.volume = 5000 - moderator_internal = new - moderator_internal.volume = 10000 - - radio = new(src) - radio.keyslot = new radio_key - radio.set_listening(FALSE) - radio.recalculateChannels() - investigate_log("has been created.", INVESTIGATE_HYPERTORUS) - - RegisterSignal(src.loc, COMSIG_ATOM_ENTERED, .proc/on_entered) - - for(var/atom/movable/movable_object in src.loc) - SEND_SIGNAL(movable_object, COMSIG_MOVABLE_SECLUDED_LOCATION) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) - SIGNAL_HANDLER - SEND_SIGNAL(arrived, COMSIG_MOVABLE_SECLUDED_LOCATION) // to prevent stationloving items (eg. nuke disk) being teleported onto core - -/obj/machinery/atmospherics/components/unary/hypertorus/core/Destroy() - unregister_signals(TRUE) - if(internal_fusion) - internal_fusion = null - if(moderator_internal) - moderator_internal = null - if(linked_input) - QDEL_NULL(linked_input) - if(linked_output) - QDEL_NULL(linked_output) - if(linked_moderator) - QDEL_NULL(linked_moderator) - if(linked_interface) - QDEL_NULL(linked_interface) - for(var/obj/machinery/hypertorus/corner/corner in corners) - QDEL_NULL(corner) - QDEL_NULL(radio) - QDEL_NULL(soundloop) - machine_parts = null - return..() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_defines.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_defines.dm deleted file mode 100644 index 8234f02ba0c..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_defines.dm +++ /dev/null @@ -1,150 +0,0 @@ -///Speed of light, in m/s -#define LIGHT_SPEED 299792458 -///Calculation between the plank constant and the lambda of the lightwave -#define PLANCK_LIGHT_CONSTANT 2e-16 -///Radius of the h2 calculated based on the amount of number of atom in a mole (and some addition for balancing issues) -#define CALCULATED_H2RADIUS 120e-4 -///Radius of the trit calculated based on the amount of number of atom in a mole (and some addition for balancing issues) -#define CALCULATED_TRITRADIUS 230e-3 -///Power conduction in the void, used to calculate the efficiency of the reaction -#define VOID_CONDUCTION 1e-2 -///Mole count required (tritium/hydrogen) to start a fusion reaction -#define FUSION_MOLE_THRESHOLD 25 -///Used to reduce the gas_power to a more useful amount -#define INSTABILITY_GAS_POWER_FACTOR 0.003 -///Used to calculate the toroidal_size for the instability -#define TOROID_VOLUME_BREAKEVEN 1000 -///Constant used when calculating the chance of emitting a radioactive particle -#define PARTICLE_CHANCE_CONSTANT (-20000000) -///Conduction of heat inside the fusion reactor -#define METALLIC_VOID_CONDUCTIVITY 0.38 -///Conduction of heat near the external cooling loop -#define HIGH_EFFICIENCY_CONDUCTIVITY 0.975 -///Sets the minimum amount of power the machine uses -#define MIN_POWER_USAGE 50000 -///Sets the multiplier for the damage -#define DAMAGE_CAP_MULTIPLIER 0.005 -///Sets the range of the hallucinations -#define HALLUCINATION_HFR(P) (min(7, round(abs(P) ** 0.25))) -///Chance in percentage points per fusion level of iron accumulation when operating at unsafe levels -#define IRON_CHANCE_PER_FUSION_LEVEL 17 -///Amount of iron accumulated per second whenever we fail our saving throw, using the chance above -#define IRON_ACCUMULATED_PER_SECOND 0.005 -///Maximum amount of iron that can be healed per second. Calculated to mostly keep up with fusion level 5. -#define IRON_OXYGEN_HEAL_PER_SECOND (IRON_ACCUMULATED_PER_SECOND * (100 - IRON_CHANCE_PER_FUSION_LEVEL) / 100) -///Amount of oxygen in moles required to fully remove 100% iron content. Currently about 2409mol. Calculated to consume at most 10mol/s. -#define OXYGEN_MOLES_CONSUMED_PER_IRON_HEAL (10 / IRON_OXYGEN_HEAL_PER_SECOND) - -//If integrity percent remaining is less than these values, the monitor sets off the relevant alarm. -#define HYPERTORUS_MELTING_PERCENT 5 -#define HYPERTORUS_EMERGENCY_PERCENT 25 -#define HYPERTORUS_DANGER_PERCENT 50 -#define HYPERTORUS_WARNING_PERCENT 100 - -#define WARNING_TIME_DELAY 60 -///to prevent accent sounds from layering -#define HYPERTORUS_ACCENT_SOUND_MIN_COOLDOWN 3 SECONDS - -#define HYPERTORUS_COUNTDOWN_TIME 30 SECONDS - -// -// Damage source: Too much mass in the fusion mix at high fusion levels -// - -// Currently, this is 2700 moles at 1 Kelvin, linearly scaling down to a maximum of 1800 safe moles at 1e8 degrees kelvin -// Settings: -/// Start taking overfull damage at this power level -#define HYPERTORUS_OVERFULL_MIN_POWER_LEVEL 6 -/// Take 0 damage beneath this much fusion mass at 1 degree Kelvin -#define HYPERTORUS_OVERFULL_MAX_SAFE_COLD_FUSION_MOLES 2700 -/// Take 0 damage beneath this much fusion mass at FUSION_TEMPERATURE_MAX degrees Kelvin -#define HYPERTORUS_OVERFULL_MAX_SAFE_HOT_FUSION_MOLES 1800 -// From there, how quickly should things get bad? -/// Every 200 moles, 1 point of damage per second -#define HYPERTORUS_OVERFULL_MOLAR_SLOPE (1/200) -// Derived: -// Given these settings, derive the rest of the equation. -// Damage is the dependent variable, fusion_moles and damage_source_temperature are the independent variables -// So the equation takes the form: -// damage = molar_slope * fusion_moles + temperature_slope * damage_source_temperature + constant -// Derive these constants here for readability -// Derive the temperature slope from the molar slope -#define HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE (HYPERTORUS_OVERFULL_MOLAR_SLOPE * (HYPERTORUS_OVERFULL_MAX_SAFE_COLD_FUSION_MOLES - HYPERTORUS_OVERFULL_MAX_SAFE_HOT_FUSION_MOLES) / (FUSION_MAXIMUM_TEMPERATURE - 1)) -// Derive the constant to set damage = 0 at our desired thresholds above -#define HYPERTORUS_OVERFULL_CONSTANT (-(HYPERTORUS_OVERFULL_MOLAR_SLOPE * HYPERTORUS_OVERFULL_MAX_SAFE_HOT_FUSION_MOLES + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * FUSION_MAXIMUM_TEMPERATURE)) - -// -// Heal source: Small enough mass in the fusion mix -// - -// Settings: -/// Start healing when fusion mass is below this threshold -#define HYPERTORUS_SUBCRITICAL_MOLES 1200 -/// Heal one point per second per this many moles under the threshold -#define HYPERTORUS_SUBCRITICAL_SCALE 400 - -// -// Heal source: Cold enough coolant -// - -// Settings: -/// Heal up to this many points of damage per second at 1 degree kelvin -#define HYPERTORUS_COLD_COOLANT_MAX_RESTORE 2.5 -/// Start healing below this temperature -#define HYPERTORUS_COLD_COOLANT_THRESHOLD (10 ** 5) -// Derived: -#define HYPERTORUS_COLD_COOLANT_SCALE (HYPERTORUS_COLD_COOLANT_MAX_RESTORE / log(10, HYPERTORUS_COLD_COOLANT_THRESHOLD)) - -// -// Damage source: Iron content -// - -// Settings: -/// Start taking damage over this threshold, up to a maximum of (1 - HYPERTORUS_MAX_SAFE_IRON) per tick at 100% iron -#define HYPERTORUS_MAX_SAFE_IRON 0.35 - -// -// Damage source: Extreme levels of mass in fusion mix at any power level -// - -// Note: Ignores the damage cap! -// Settings: -/// Start taking damage over this threshold -#define HYPERTORUS_HYPERCRITICAL_MOLES 10000 -/// Take this much damage per mole over the threshold per second -#define HYPERTORUS_HYPERCRITICAL_SCALE 0.002 -/// Take at most this much damage per second -#define HYPERTORUS_HYPERCRITICAL_MAX_DAMAGE 20 - -// If the moderator goes hypercritical, it cracks and starts to spill -// If our pressure is weak, it can still spill, just weakly and infrequently -// Even a small amount is still extremely hazardous with fusion temperatures -#define HYPERTORUS_WEAK_SPILL_RATE 0.0005 -#define HYPERTORUS_WEAK_SPILL_CHANCE 1 -/// Start spilling superhot moderator gas when over this pressure threshold -#define HYPERTORUS_MEDIUM_SPILL_PRESSURE 10000 -/// How much we should spill initially -#define HYPERTORUS_MEDIUM_SPILL_INITIAL 0.25 -/// How much of the moderator mix we should spill per second until mended -#define HYPERTORUS_MEDIUM_SPILL_RATE 0.01 -/// If the moderator gas goes over this threshold, REALLY spill it -#define HYPERTORUS_STRONG_SPILL_PRESSURE 12000 -/// How much we should spill initially -#define HYPERTORUS_STRONG_SPILL_INITIAL 0.75 -/// How much of the moderator mix we should spill per second until mended -#define HYPERTORUS_STRONG_SPILL_RATE 0.05 - - -// -// Explosion flags for use in fuel recipes -// -#define HYPERTORUS_FLAG_BASE_EXPLOSION (1<<0) -#define HYPERTORUS_FLAG_MEDIUM_EXPLOSION (1<<1) -#define HYPERTORUS_FLAG_DEVASTATING_EXPLOSION (1<<2) -#define HYPERTORUS_FLAG_RADIATION_PULSE (1<<3) -#define HYPERTORUS_FLAG_EMP (1<<4) -#define HYPERTORUS_FLAG_MINIMUM_SPREAD (1<<5) -#define HYPERTORUS_FLAG_MEDIUM_SPREAD (1<<6) -#define HYPERTORUS_FLAG_BIG_SPREAD (1<<7) -#define HYPERTORUS_FLAG_MASSIVE_SPREAD (1<<8) -#define HYPERTORUS_FLAG_CRITICAL_MELTDOWN (1<<9) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm deleted file mode 100644 index c7a9545a7d2..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm +++ /dev/null @@ -1,140 +0,0 @@ -///Global list of recipes for atmospheric machines to use -GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list()) - -/* - * Global proc to build the gas recipe global list - */ -/proc/hfr_fuels_create_list() - . = list() - for(var/fuel_mix_path in subtypesof(/datum/hfr_fuel)) - var/datum/hfr_fuel/fuel_mix = new fuel_mix_path() - - .[fuel_mix.id] = fuel_mix - -/datum/hfr_fuel - ///Id for the mix - var/id = "" - ///The gases that are going to be used as fuel ("GasX + GasY fuel") - var/name = "" - ///Multiplier for the minimum heat output of the HFR (min 0.01) - var/negative_temperature_multiplier = 1 - ///Multiplier for the maximum heat output of the HFR (min 0.01) - var/positive_temperature_multiplier = 1 - ///Multiplier for the energy released (min 0.01) - var/energy_concentration_multiplier = 1 - ///Multiplier for the fuel consumption (min 0.01) - var/fuel_consumption_multiplier = 1 - ///Multiplier for the gas production (min 0.01) - var/gas_production_multiplier = 1 - ///Max allowed temperature multiplier, scales the max temperature we can hit, see FUSION_MAXIMUM_TEMPERATURE (Maxed at 1, don't go getting any ideas) - var/temperature_change_multiplier = 1 - ///These are the main fuels, only 2 gases that are the ones being consumed by the fusion reaction (eg. H2 and trit) - var/requirements = list() - ///Gases that gets produced directly in the internal gasmix - var/primary_products = list() - ///Gases that gets produced in the moderator gasmix or directly ejected (must be 6 gases), the order indicate at what power level the gases are going to be made (from power level 1 to 6) - var/secondary_products = list() - ///Flags to decide what behaviour the meltdown will have depending on the fuel mix used - var/meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION - -/datum/hfr_fuel/New() - . = ..() - temperature_change_multiplier = min(temperature_change_multiplier, 1) - -/datum/hfr_fuel/plasma_oxy_fuel - id = "plasma_o2_fuel" - name = "Plasma + Oxygen fuel" - negative_temperature_multiplier = 2.5 - positive_temperature_multiplier = 0.1 - energy_concentration_multiplier = 10 - fuel_consumption_multiplier = 3.3 - gas_production_multiplier = 1.4 - temperature_change_multiplier = 0.6 - requirements = list(/datum/gas/plasma, /datum/gas/oxygen) - primary_products = list(/datum/gas/carbon_dioxide, /datum/gas/water_vapor) - secondary_products = list(/datum/gas/carbon_dioxide, /datum/gas/water_vapor, /datum/gas/freon, /datum/gas/nitrous_oxide, /datum/gas/pluoxium, /datum/gas/halon) - meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_MINIMUM_SPREAD - -/datum/hfr_fuel/hydrogen_oxy_fuel - id = "h2_o2_fuel" - name = "Hydrogen + Oxygen fuel" - negative_temperature_multiplier = 2 - positive_temperature_multiplier = 0.6 - energy_concentration_multiplier = 3 - fuel_consumption_multiplier = 1.1 - gas_production_multiplier = 0.9 - temperature_change_multiplier = 0.75 - requirements = list(/datum/gas/hydrogen, /datum/gas/oxygen) - primary_products = list(/datum/gas/helium, /datum/gas/nitrogen) - secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium) - meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MEDIUM_SPREAD - -/datum/hfr_fuel/tritium_oxy_fuel - id = "t2_o2_fuel" - name = "Tritium + Oxygen fuel" - negative_temperature_multiplier = 2.1 - positive_temperature_multiplier = 0.5 - energy_concentration_multiplier = 2 - fuel_consumption_multiplier = 1.2 - gas_production_multiplier = 0.8 - temperature_change_multiplier = 0.8 - requirements = list(/datum/gas/tritium, /datum/gas/oxygen) - primary_products = list(/datum/gas/helium, /datum/gas/pluoxium) - secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium) - meltdown_flags = HYPERTORUS_FLAG_BASE_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_MEDIUM_SPREAD - -/datum/hfr_fuel/hydrogen_tritium_fuel - id = "h2_t2_fuel" - name = "Hydrogen + Tritium fuel" - negative_temperature_multiplier = 1 - positive_temperature_multiplier = 1 - energy_concentration_multiplier = 1 - fuel_consumption_multiplier = 1 - gas_production_multiplier = 1 - temperature_change_multiplier = 0.85 - requirements = list(/datum/gas/hydrogen, /datum/gas/tritium) - primary_products = list(/datum/gas/helium) - secondary_products = list(/datum/gas/helium, /datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/bz, /datum/gas/hypernoblium) - meltdown_flags = HYPERTORUS_FLAG_MEDIUM_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MEDIUM_SPREAD - -/datum/hfr_fuel/hypernob_hydrogen_fuel - id = "hypernob_hydrogen_fuel" - name = "Hypernoblium + Hydrogen fuel" - negative_temperature_multiplier = 0.2 - positive_temperature_multiplier = 2.2 - energy_concentration_multiplier = 0.2 - fuel_consumption_multiplier = 0.55 - gas_production_multiplier = 1.4 - temperature_change_multiplier = 0.9 - requirements = list(/datum/gas/hypernoblium, /datum/gas/hydrogen) - primary_products = list(/datum/gas/antinoblium) - secondary_products = list(/datum/gas/antinoblium, /datum/gas/helium, /datum/gas/proto_nitrate, /datum/gas/zauker, /datum/gas/healium, /datum/gas/miasma) - meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_BIG_SPREAD - -/datum/hfr_fuel/hypernob_trit_fuel - id = "hypernob_trit_fuel" - name = "Hypernoblium + Tritium fuel" - negative_temperature_multiplier = 0.1 - positive_temperature_multiplier = 2.5 - energy_concentration_multiplier = 0.1 - fuel_consumption_multiplier = 0.45 - gas_production_multiplier = 1.7 - temperature_change_multiplier = 0.95 - requirements = list(/datum/gas/hypernoblium, /datum/gas/tritium) - primary_products = list(/datum/gas/antinoblium) - secondary_products = list(/datum/gas/antinoblium, /datum/gas/helium, /datum/gas/proto_nitrate, /datum/gas/zauker, /datum/gas/healium, /datum/gas/miasma) - meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_BIG_SPREAD - -/datum/hfr_fuel/hypernob_antinob_fuel - id = "hypernob_antinob_fuel" - name = "Hypernoblium + Antinoblium fuel" - negative_temperature_multiplier = 0.01 - positive_temperature_multiplier = 3.5 - energy_concentration_multiplier = 2 - fuel_consumption_multiplier = 0.01 - gas_production_multiplier = 3 - temperature_change_multiplier = 1 - requirements = list(/datum/gas/hypernoblium, /datum/gas/antinoblium) - primary_products = list(/datum/gas/helium) - secondary_products = list(/datum/gas/plasma, /datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/proto_nitrate, /datum/gas/nitrium, /datum/gas/miasma) - meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MASSIVE_SPREAD | HYPERTORUS_FLAG_CRITICAL_MELTDOWN diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm deleted file mode 100644 index 6f671aebc7c..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ /dev/null @@ -1,579 +0,0 @@ -/** - * Main Fusion processes - * process() Organizes all other calls, and is the best starting point for top-level logic. - * fusion_process() handles all the main fusion reaction logic and consequences (lightning, radiation, particles) from an active fusion reaction. - */ - -/obj/machinery/atmospherics/components/unary/hypertorus/core/process(delta_time) - /* - *Pre-checks - */ - //first check if the machine is active - if(!active) - return - - //then check if the other machines are still there - if(!check_part_connectivity()) - deactivate() - return - - assert_gases() - - // Run the reaction if it is either live or being started - if (start_power || power_level) - play_ambience() - fusion_process(delta_time) - // Note that we process damage/healing even if the fusion process aborts. - // Running out of fuel won't save you if your moderator and coolant are exploding on their own. - check_spill() - process_damageheal(delta_time) - check_alert() - if (start_power) - remove_waste(delta_time) - update_pipenets() - - check_deconstructable() - -/** - * Called by process() - * Contains the main fusion calculations and checks, for more informations check the comments along the code. - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/fusion_process(delta_time) -//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again! Again but with machine! -//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again. -//7 reworks - - if (check_power_use()) - if (start_cooling) - inject_from_side_components(delta_time) - process_internal_cooling(delta_time) - else - // No power forces bad settings - magnetic_constrictor = 100 - heating_conductor = 500 - current_damper = 0 - fuel_injection_rate = 20 - moderator_injection_rate = 50 - waste_remove = FALSE - iron_content += 0.02 * power_level * delta_time - - update_temperature_status(delta_time) - - //Store the temperature of the gases after one cicle of the fusion reaction - var/archived_heat = internal_fusion.temperature - //Store the volume of the fusion reaction multiplied by the force of the magnets that controls how big it will be - var/volume = internal_fusion.volume * (magnetic_constrictor * 0.01) - - var/energy_concentration_multiplier = 1 - var/positive_temperature_multiplier = 1 - var/negative_temperature_multiplier = 1 - - //We scale it down by volume/2 because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions. - var/scale_factor = volume * 0.5 - - /// Store the fuel gases and the byproduct gas quantities - var/list/fuel_list = list() - /// Scaled down moles of gases, no less than 0 - var/list/scaled_fuel_list = list() - - if (selected_fuel) - energy_concentration_multiplier = selected_fuel.energy_concentration_multiplier - positive_temperature_multiplier = selected_fuel.positive_temperature_multiplier - negative_temperature_multiplier = selected_fuel.negative_temperature_multiplier - - for(var/gas_id in selected_fuel.requirements | selected_fuel.primary_products) - var/amount = internal_fusion.gases[gas_id][MOLES] - fuel_list[gas_id] = amount - scaled_fuel_list[gas_id] = max((amount - FUSION_MOLE_THRESHOLD) / scale_factor, 0) - - /// Store the moderators gases quantities - var/list/moderator_list = list() - /// Scaled down moles of gases, no less than 0 - var/list/scaled_moderator_list = list() - for(var/gas_id in moderator_internal.gases) - var/amount = moderator_internal.gases[gas_id][MOLES] - moderator_list[gas_id] = amount - scaled_moderator_list[gas_id] = max((amount - FUSION_MOLE_THRESHOLD) / scale_factor, 0) - - /* - *FUSION MAIN PROCESS - */ - //This section is used for the instability calculation for the fusion reaction - //The size of the phase space hypertorus - var/toroidal_size = (2 * PI) + TORADIANS(arctan((volume - TOROID_VOLUME_BREAKEVEN) / TOROID_VOLUME_BREAKEVEN)) - //Calculation of the gas power, only for theoretical instability calculations - var/gas_power = 0 - for (var/gas_id in internal_fusion.gases) - gas_power += (internal_fusion.gases[gas_id][GAS_META][META_GAS_FUSION_POWER] * internal_fusion.gases[gas_id][MOLES]) - for (var/gas_id in moderator_internal.gases) - gas_power += (moderator_internal.gases[gas_id][GAS_META][META_GAS_FUSION_POWER] * moderator_internal.gases[gas_id][MOLES] * 0.75) - - instability = MODULUS((gas_power * INSTABILITY_GAS_POWER_FACTOR)**2, toroidal_size) + (current_damper * 0.01) - iron_content * 0.05 - //Effective reaction instability (determines if the energy is used/released) - var/internal_instability = 0 - if(instability * 0.5 < FUSION_INSTABILITY_ENDOTHERMALITY) - internal_instability = 1 - else - internal_instability = -1 - - /* - *Modifiers - */ - ///Those are the scaled gases that gets consumed and adjust energy - // Gases that increase the amount of energy - var/energy_modifiers = scaled_moderator_list[/datum/gas/nitrogen] * 0.35 + \ - scaled_moderator_list[/datum/gas/carbon_dioxide] * 0.55 + \ - scaled_moderator_list[/datum/gas/nitrous_oxide] * 0.95 + \ - scaled_moderator_list[/datum/gas/zauker] * 1.55 + \ - scaled_moderator_list[/datum/gas/antinoblium] * 20 - // Gases that decrease the amount of energy - energy_modifiers -= scaled_moderator_list[/datum/gas/hypernoblium] * 10 + \ - scaled_moderator_list[/datum/gas/water_vapor] * 0.75 + \ - scaled_moderator_list[/datum/gas/nitrium] * 0.15 + \ - scaled_moderator_list[/datum/gas/healium] * 0.45 + \ - scaled_moderator_list[/datum/gas/freon] * 1.15 - ///Between 0.25 and 100, this value is used to modify the behaviour of the internal energy and the core temperature based on the gases present in the mix - var/power_modifier = scaled_moderator_list[/datum/gas/oxygen] * 0.55 + \ - scaled_moderator_list[/datum/gas/carbon_dioxide] * 0.95 + \ - scaled_moderator_list[/datum/gas/nitrium] * 1.45 + \ - scaled_moderator_list[/datum/gas/zauker] * 5.55 + \ - scaled_moderator_list[/datum/gas/plasma] * 0.05 - \ - scaled_moderator_list[/datum/gas/nitrous_oxide] * 0.05 - \ - scaled_moderator_list[/datum/gas/freon] * 0.75 - ///Minimum 0.25, this value is used to modify the behaviour of the energy emission based on the gases present in the mix - var/heat_modifier = scaled_moderator_list[/datum/gas/plasma] * 1.25 - \ - scaled_moderator_list[/datum/gas/nitrogen] * 0.75 - \ - scaled_moderator_list[/datum/gas/nitrous_oxide] * 1.45 - \ - scaled_moderator_list[/datum/gas/freon] * 0.95 - ///Between 0.005 and 1000, this value modify the radiation emission of the reaction, higher values increase the emission - var/radiation_modifier = scaled_moderator_list[/datum/gas/freon] * 1.15 - \ - scaled_moderator_list[/datum/gas/nitrogen] * 0.45 - \ - scaled_moderator_list[/datum/gas/plasma] * 0.95 + \ - scaled_moderator_list[/datum/gas/bz] * 1.9 + \ - scaled_moderator_list[/datum/gas/proto_nitrate] * 0.1 + \ - scaled_moderator_list[/datum/gas/antinoblium] * 10 - - if (selected_fuel) - // These should probably be static coefficients read from a table rather than things that depend on the current recipe - // the same is true for the effects above - energy_modifiers += scaled_fuel_list[selected_fuel.requirements[1]] + \ - scaled_fuel_list[selected_fuel.requirements[2]] - energy_modifiers -= scaled_fuel_list[selected_fuel.primary_products[1]] - - power_modifier += scaled_fuel_list[selected_fuel.requirements[2]] * 1.05 - \ - scaled_fuel_list[selected_fuel.primary_products[1]] * 0.55 - - heat_modifier += scaled_fuel_list[selected_fuel.requirements[1]] * 1.15 + \ - scaled_fuel_list[selected_fuel.primary_products[1]] * 1.05 - - radiation_modifier += scaled_fuel_list[selected_fuel.primary_products[1]] - - power_modifier = clamp(power_modifier, 0.25, 100) - heat_modifier = clamp(heat_modifier, 0.25, 100) - radiation_modifier = clamp(radiation_modifier, 0.005, 1000) - - /* - *Main calculations (energy, internal power, core temperature, delta temperature, - *conduction, radiation, efficiency, power output, heat limiter modifier and heat output) - */ - internal_power = 0 - efficiency = VOID_CONDUCTION * 1 - - if (selected_fuel) - // Power of the gas mixture - internal_power = (scaled_fuel_list[selected_fuel.requirements[1]] * power_modifier / 100) * (scaled_fuel_list[selected_fuel.requirements[2]] * power_modifier / 100) * (PI * (2 * (scaled_fuel_list[selected_fuel.requirements[1]] * CALCULATED_H2RADIUS) * (scaled_fuel_list[selected_fuel.requirements[2]] * CALCULATED_TRITRADIUS))**2) * energy - - // Efficiency of the reaction, it increases with the amount of byproduct - efficiency = VOID_CONDUCTION * clamp(scaled_fuel_list[selected_fuel.primary_products[1]], 1, 100) - - //Can go either positive or negative depending on the instability and the negative energy modifiers - //E=mc^2 with some changes for gameplay purposes - energy = (energy_modifiers * LIGHT_SPEED ** 2) * max(internal_fusion.temperature * heat_modifier / 100, 1) - energy = energy / energy_concentration_multiplier - energy = clamp(energy, 0, 1e35) //ugly way to prevent NaN error - //Temperature inside the center of the gas mixture - core_temperature = internal_power * power_modifier / 1000 - core_temperature = max(TCMB, core_temperature) - //Difference between the gases temperature and the internal temperature of the reaction - delta_temperature = archived_heat - core_temperature - //Energy from the reaction lost from the molecule colliding between themselves. - conduction = - delta_temperature * (magnetic_constrictor * 0.001) - //The remaining wavelength that actually can do damage to mobs. - radiation = max(-(PLANCK_LIGHT_CONSTANT / 5e-18) * radiation_modifier * delta_temperature, 0) - power_output = efficiency * (internal_power - conduction - radiation) - //Hotter air is easier to heat up and cool down - heat_limiter_modifier = 10 * (10 ** power_level) * (heating_conductor / 100) - //The amount of heat that is finally emitted, based on the power output. Min and max are variables that depends of the modifier - heat_output_min = - heat_limiter_modifier * 0.01 * negative_temperature_multiplier - heat_output_max = heat_limiter_modifier * positive_temperature_multiplier - heat_output = clamp(internal_instability * power_output * heat_modifier / 100, heat_output_min, heat_output_max) - - // Is the fusion process actually going to run? - // Note we have to always perform the above calculations to keep the UI updated, so we can't use this to early return. - if (!check_fuel()) - return - - // Phew. Lets calculate what this means in practice. - var/fuel_consumption_rate = clamp(fuel_injection_rate * 0.01 * 5 * power_level, 0.05, 30) - var/consumption_amount = fuel_consumption_rate * delta_time - var/production_amount - switch(power_level) - if(3,4) - production_amount = clamp(heat_output * 5e-4, 0, fuel_consumption_rate) * delta_time - else - production_amount = clamp(heat_output / 10 ** (power_level+1), 0, fuel_consumption_rate) * delta_time - - // antinob production is special, and uses its own calculations from how stale the fusion mix is (via byproduct ratio and fresh fuel rate) - var/dirty_production_rate = scaled_fuel_list[scaled_fuel_list[3]] / fuel_injection_rate - - // Run the effects of our selected fuel recipe - - var/datum/gas_mixture/internal_output = new - moderator_fuel_process(delta_time, production_amount, consumption_amount, internal_output, moderator_list, selected_fuel, fuel_list) - - // Run the common effects, committing changes where applicable - - // This is repetition, but is here as a placeholder for what will need to be done to allow concurrently running multiple recipes - var/common_production_amount = production_amount * selected_fuel.gas_production_multiplier - moderator_common_process(delta_time, common_production_amount, internal_output, moderator_list, dirty_production_rate, heat_output, radiation_modifier) - -/** - * Perform recipe specific actions. Fuel consumption and recipe based gas production happens here. - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/moderator_fuel_process(delta_time, production_amount, consumption_amount, datum/gas_mixture/internal_output, moderator_list, datum/hfr_fuel/fuel, fuel_list) - // Adjust fusion consumption/production based on this recipe's characteristics - var/fuel_consumption = consumption_amount * 0.85 * selected_fuel.fuel_consumption_multiplier - var/scaled_production = production_amount * selected_fuel.gas_production_multiplier - - for(var/gas_id in fuel.requirements) - internal_fusion.gases[gas_id][MOLES] -= min(fuel_list[gas_id], fuel_consumption) - for(var/gas_id in fuel.primary_products) - internal_fusion.gases[gas_id][MOLES] += fuel_consumption * 0.5 - - // Each recipe provides a tier list of six output gases. - // Which gases are produced depend on what the fusion level is. - var/list/tier = fuel.secondary_products - switch(power_level) - if(1) - moderator_internal.gases[tier[1]][MOLES] += scaled_production * 0.95 - moderator_internal.gases[tier[2]][MOLES] += scaled_production * 0.75 - if(2) - moderator_internal.gases[tier[1]][MOLES] += scaled_production * 1.65 - moderator_internal.gases[tier[2]][MOLES] += scaled_production - if(moderator_list[/datum/gas/plasma] > 50) - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 1.15 - if(3) - moderator_internal.gases[tier[2]][MOLES] += scaled_production * 0.5 - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 0.45 - if(4) - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 1.65 - moderator_internal.gases[tier[4]][MOLES] += scaled_production * 1.25 - if(5) - moderator_internal.gases[tier[4]][MOLES] += scaled_production * 0.65 - moderator_internal.gases[tier[5]][MOLES] += scaled_production - moderator_internal.gases[tier[6]][MOLES] += scaled_production * 0.75 - if(6) - moderator_internal.gases[tier[5]][MOLES] += scaled_production * 0.35 - moderator_internal.gases[tier[6]][MOLES] += scaled_production - -/** - * Perform common fusion actions: - * - * - Gases that get produced irrespective of recipe - * - Temperature modifiers, radiation modifiers, and the application of each - * - Committing staged output, performing filtering, and making !FUN! emissions - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/moderator_common_process(delta_time, scaled_production, datum/gas_mixture/internal_output, moderator_list, dirty_production_rate, heat_output, radiation_modifier) - switch(power_level) - if(1) - if(moderator_list[/datum/gas/plasma] > 100) - moderator_internal.gases[/datum/gas/nitrous_oxide] += scaled_production * 0.5 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.85) - if(moderator_list[/datum/gas/bz] > 150) - internal_output.assert_gases(/datum/gas/halon) - internal_output.gases[/datum/gas/halon][MOLES] += scaled_production * 0.55 - moderator_internal.gases[/datum/gas/bz][MOLES] -= min(moderator_internal.gases[/datum/gas/bz][MOLES], scaled_production * 0.95) - if(2) - if(moderator_list[/datum/gas/plasma] > 50) - internal_output.assert_gases(/datum/gas/bz) - internal_output.gases[/datum/gas/bz][MOLES] += scaled_production * 1.8 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.75) - if(moderator_list[/datum/gas/proto_nitrate] > 20) - radiation *= 1.55 - heat_output *= 1.025 - internal_output.assert_gases(/datum/gas/nitrium) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.05 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35) - if(3, 4) - if(moderator_list[/datum/gas/plasma] > 10) - internal_output.assert_gases(/datum/gas/freon, /datum/gas/nitrium) - internal_output.gases[/datum/gas/freon][MOLES] += scaled_production * 0.15 - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.05 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.45) - if(moderator_list[/datum/gas/freon] > 50) - heat_output *= 0.9 - radiation *= 0.8 - if(moderator_list[/datum/gas/proto_nitrate]> 15) - internal_output.assert_gases(/datum/gas/nitrium, /datum/gas/halon) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.25 - internal_output.gases[/datum/gas/halon][MOLES] += scaled_production * 1.15 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.55) - radiation *= 1.95 - heat_output *= 1.25 - if(moderator_list[/datum/gas/bz] > 100) - internal_output.assert_gases(/datum/gas/healium, /datum/gas/proto_nitrate) - internal_output.gases[/datum/gas/proto_nitrate][MOLES] += scaled_production * 1.5 - internal_output.gases[/datum/gas/healium][MOLES] += scaled_production * 1.5 - induce_hallucination(50 * power_level, delta_time) - if(5) - if(moderator_list[/datum/gas/plasma] > 15) - internal_output.assert_gases(/datum/gas/freon) - internal_output.gases[/datum/gas/freon][MOLES] += scaled_production *0.25 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45) - if(moderator_list[/datum/gas/freon] > 500) - heat_output *= 0.5 - radiation *= 0.2 - if(moderator_list[/datum/gas/proto_nitrate] > 50) - internal_output.assert_gases(/datum/gas/nitrium, /datum/gas/pluoxium) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.95 - internal_output.gases[/datum/gas/pluoxium][MOLES] += scaled_production - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35) - radiation *= 1.95 - heat_output *= 1.25 - if(moderator_list[/datum/gas/bz] > 100) - internal_output.assert_gases(/datum/gas/healium) - internal_output.gases[/datum/gas/healium][MOLES] += scaled_production - induce_hallucination(500, delta_time) - moderator_internal.gases[/datum/gas/freon][MOLES] += scaled_production * 1.15 - if(moderator_list[/datum/gas/healium] > 100) - if(critical_threshold_proximity > 400) - critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[/datum/gas/healium] / 100 * delta_time ), 0) - moderator_internal.gases[/datum/gas/healium][MOLES] -= min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20) - if(moderator_internal.temperature < 1e7 || (moderator_list[/datum/gas/plasma] > 100 && moderator_list[/datum/gas/bz] > 50)) - internal_output.assert_gases(/datum/gas/antinoblium) - internal_output.gases[/datum/gas/antinoblium][MOLES] += dirty_production_rate * 0.9 / 0.065 * delta_time - if(6) - if(moderator_list[/datum/gas/plasma] > 30) - moderator_internal.gases[/datum/gas/bz][MOLES] += scaled_production * 1.15 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45) - if(moderator_list[/datum/gas/proto_nitrate]) - internal_output.assert_gases(/datum/gas/zauker, /datum/gas/nitrium) - internal_output.gases[/datum/gas/zauker][MOLES] += scaled_production * 5.35 - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 2.15 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 3.35) - radiation *= 2 - heat_output *= 2.25 - if(moderator_list[/datum/gas/bz]) - induce_hallucination(900, delta_time, force=TRUE) - moderator_internal.gases[/datum/gas/antinoblium][MOLES] += clamp(dirty_production_rate / 0.045, 0, 10) * delta_time - if(moderator_list[/datum/gas/healium] > 100) - if(critical_threshold_proximity > 400) - critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[/datum/gas/healium] / 100 * delta_time ), 0) - moderator_internal.gases[/datum/gas/healium][MOLES] -= min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20) - internal_fusion.gases[/datum/gas/antinoblium][MOLES] += dirty_production_rate * 0.01 / 0.095 * delta_time - - //Modifies the internal_fusion temperature with the amount of heat output - var/temperature_modifier = selected_fuel.temperature_change_multiplier - if(internal_fusion.temperature <= FUSION_MAXIMUM_TEMPERATURE * temperature_modifier) - internal_fusion.temperature = clamp(internal_fusion.temperature + heat_output,TCMB,FUSION_MAXIMUM_TEMPERATURE * temperature_modifier) - else - internal_fusion.temperature -= heat_limiter_modifier * 0.01 * delta_time - - //heat up and output what's in the internal_output into the linked_output port - if(internal_output.get_moles() > 0) - if(moderator_internal.get_moles() > 0) - internal_output.temperature = moderator_internal.temperature * HIGH_EFFICIENCY_CONDUCTIVITY - else - internal_output.temperature = internal_fusion.temperature * METALLIC_VOID_CONDUCTIVITY - linked_output.airs[1].merge(internal_output) - - evaporate_moderator(delta_time) - - check_nuclear_particles(moderator_list) - - check_lightning_arcs(moderator_list) - - // Oxygen burns away iron content rapidly - if(moderator_list[/datum/gas/oxygen] > 150) - if(iron_content > 0) - var/max_iron_removable = IRON_OXYGEN_HEAL_PER_SECOND - var/iron_removed = min(max_iron_removable * delta_time, iron_content) - iron_content -= iron_removed - moderator_internal.gases[/datum/gas/oxygen][MOLES] -= iron_removed * OXYGEN_MOLES_CONSUMED_PER_IRON_HEAL - - check_gravity_pulse(delta_time) - - emit_rads() - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/evaporate_moderator(delta_time) - // Don't evaporate if the reaction is dead - if (!power_level) - return - // All gases in the moderator slowly burn away over time, whether used for production or not - if(moderator_internal.get_moles() > 0) - moderator_internal.remove(moderator_internal.get_moles() * (1 - (1 - 0.0005 * power_level) ** delta_time)) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_damageheal(delta_time) - // Archive current health for damage cap purposes - critical_threshold_proximity_archived = critical_threshold_proximity - - // If we're operating at an extreme power level, take increasing damage for the amount of fusion mass over a low threshold - if(power_level >= HYPERTORUS_OVERFULL_MIN_POWER_LEVEL) - var/overfull_damage_taken = HYPERTORUS_OVERFULL_MOLAR_SLOPE * internal_fusion.get_moles() + HYPERTORUS_OVERFULL_TEMPERATURE_SLOPE * coolant_temperature + HYPERTORUS_OVERFULL_CONSTANT - critical_threshold_proximity = max(critical_threshold_proximity + max(overfull_damage_taken * delta_time, 0), 0) - - // If we're running on a thin fusion mix, heal up - if(internal_fusion.get_moles() < HYPERTORUS_SUBCRITICAL_MOLES && power_level <= 5) - var/subcritical_heal_restore = (internal_fusion.get_moles() - HYPERTORUS_SUBCRITICAL_MOLES) / HYPERTORUS_SUBCRITICAL_SCALE - critical_threshold_proximity = max(critical_threshold_proximity + min(subcritical_heal_restore * delta_time, 0), 0) - - // If coolant is sufficiently cold, heal up - if(internal_fusion.get_moles() > 0 && (airs[1].get_moles() && coolant_temperature < HYPERTORUS_COLD_COOLANT_THRESHOLD) && power_level <= 4) - var/cold_coolant_heal_restore = log(10, max(coolant_temperature, 1) * HYPERTORUS_COLD_COOLANT_SCALE) - (HYPERTORUS_COLD_COOLANT_MAX_RESTORE * 2) - critical_threshold_proximity = max(critical_threshold_proximity + min(cold_coolant_heal_restore * delta_time, 0), 0) - - critical_threshold_proximity += max(iron_content - HYPERTORUS_MAX_SAFE_IRON, 0) * delta_time - - // Apply damage cap - critical_threshold_proximity = min(critical_threshold_proximity_archived + (delta_time * DAMAGE_CAP_MULTIPLIER * melting_point), critical_threshold_proximity) - - // If we have a preposterous amount of mass in the fusion mix, things get bad extremely fast - if(internal_fusion.get_moles() >= HYPERTORUS_HYPERCRITICAL_MOLES) - var/hypercritical_damage_taken = max((internal_fusion.get_moles() - HYPERTORUS_HYPERCRITICAL_MOLES) * HYPERTORUS_HYPERCRITICAL_SCALE, 0) - critical_threshold_proximity = max(critical_threshold_proximity + min(hypercritical_damage_taken, HYPERTORUS_HYPERCRITICAL_MAX_DAMAGE), 0) * delta_time - - // High power fusion might create other matter other than helium, iron is dangerous inside the machine, damage can be seen - if(power_level > 4 && prob(IRON_CHANCE_PER_FUSION_LEVEL * power_level))//at power level 6 is 100% - iron_content += IRON_ACCUMULATED_PER_SECOND * delta_time - if(iron_content > 0 && power_level <= 4 && prob(25 / (power_level + 1))) - iron_content = max(iron_content - 0.01 * delta_time, 0) - iron_content = clamp(iron_content, 0, 1) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_nuclear_particles(moderator_list) - // New nuclear particle emission sytem. - if(power_level < 4) - return - if(moderator_list[/datum/gas/bz] < (150 / power_level)) - return - var/obj/machinery/hypertorus/corner/picked_corner = pick(corners) - picked_corner.loc.fire_nuclear_particle(turn(picked_corner.dir, 180)) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_lightning_arcs(moderator_list) - if(power_level < 4) - return - if(moderator_list[/datum/gas/antinoblium] <= 50 && critical_threshold_proximity <= 500) - return - var/zap_number = power_level - 2 - - if(critical_threshold_proximity > 650 && prob(20)) - zap_number += 1 - - var/cutoff = 1500 - cutoff = clamp(3000 - (power_level * (internal_fusion.get_moles() * 0.45)), 450, 3000) - - var/zaps_aspect = DEFAULT_ZAP_ICON_STATE - var/flags = ZAP_SUPERMATTER_FLAGS - switch(power_level) - if(5) - zaps_aspect = SLIGHTLY_CHARGED_ZAP_ICON_STATE - flags |= (ZAP_MOB_DAMAGE) - if(6) - zaps_aspect = OVER_9000_ZAP_ICON_STATE - flags |= (ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE) - - playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) - for(var/i in 1 to zap_number) - supermatter_zap(src, 5, power_level * 300, flags, zap_cutoff = cutoff, power_level = src.power_level * 1000, zap_icon = zaps_aspect) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_gravity_pulse(delta_time) - if(DT_PROB(100 - critical_threshold_proximity / 15, delta_time)) - return - var/grav_range = round(log(2.5, critical_threshold_proximity)) - for(var/mob/alive_mob in GLOB.alive_mob_list) - if(alive_mob.z != z || get_dist(alive_mob, src) > grav_range || alive_mob.mob_negates_gravity()) - continue - step_towards(alive_mob, loc) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/remove_waste(delta_time) - //Gases can be removed from the moderator internal by using the interface. - if(!waste_remove) - return - var/filtering_amount = moderator_scrubbing.len - for(var/gas in moderator_internal.gases & moderator_scrubbing) - var/datum/gas_mixture/removed = moderator_internal.remove_specific(gas, (moderator_filtering_rate / filtering_amount) * delta_time) - if(removed) - linked_output.airs[1].merge(removed) - - if (selected_fuel) - var/datum/gas_mixture/internal_remove - for(var/gas_id in selected_fuel.primary_products) - if(internal_fusion.gases[gas_id][MOLES] > 0) - internal_remove = internal_fusion.remove_specific(gas_id, internal_fusion.gases[gas_id][MOLES] * (1 - (1 - 0.25) ** delta_time)) - linked_output.airs[1].merge(internal_remove) - internal_fusion.garbage_collect() - moderator_internal.garbage_collect() - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/process_internal_cooling(delta_time) - if(moderator_internal.get_moles() > 0 && internal_fusion.get_moles() > 0) - //Modifies the moderator_internal temperature based on energy conduction and also the fusion by the same amount - var/fusion_temperature_delta = internal_fusion.temperature - moderator_internal.temperature - var/fusion_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * fusion_temperature_delta * (internal_fusion.getHeatCapacity() * moderator_internal.getHeatCapacity() / (internal_fusion.getHeatCapacity() + moderator_internal.getHeatCapacity())) - internal_fusion.temperature = max(internal_fusion.temperature - fusion_heat_amount / internal_fusion.getHeatCapacity(), TCMB) - moderator_internal.temperature = max(moderator_internal.temperature + fusion_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - - if(airs[1].get_moles() * 0.05 <= MINIMUM_MOLE_COUNT) - return - var/datum/gas_mixture/cooling_port = airs[1] - var/datum/gas_mixture/cooling_remove = cooling_port.remove(0.05 * cooling_port.get_moles()) - //Cooling of the moderator gases with the cooling loop in and out the core - if(moderator_internal.get_moles() > 0) - var/coolant_temperature_delta = cooling_remove.temperature - moderator_internal.temperature - var/cooling_heat_amount = (1 - (1 - HIGH_EFFICIENCY_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * moderator_internal.getHeatCapacity() / (cooling_remove.getHeatCapacity() + moderator_internal.getHeatCapacity())) - cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) - moderator_internal.temperature = max(moderator_internal.temperature + cooling_heat_amount / moderator_internal.getHeatCapacity(), TCMB) - - else if(internal_fusion.get_moles() > 0) - var/coolant_temperature_delta = cooling_remove.temperature - internal_fusion.temperature - var/cooling_heat_amount = (1 - (1 - METALLIC_VOID_CONDUCTIVITY) ** delta_time) * coolant_temperature_delta * (cooling_remove.getHeatCapacity() * internal_fusion.getHeatCapacity() / (cooling_remove.getHeatCapacity() + internal_fusion.getHeatCapacity())) - cooling_remove.temperature = max(cooling_remove.temperature - cooling_heat_amount / cooling_remove.getHeatCapacity(), TCMB) - internal_fusion.temperature = max(internal_fusion.temperature + cooling_heat_amount / internal_fusion.getHeatCapacity(), TCMB) - cooling_port.merge(cooling_remove) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/inject_from_side_components(delta_time) - update_pipenets() - - //Check and stores the gases from the moderator input in the moderator internal gasmix - var/datum/gas_mixture/moderator_port = linked_moderator.airs[1] - if(start_moderator && moderator_port.get_moles()) - moderator_internal.merge(moderator_port.remove(moderator_injection_rate * delta_time)) - linked_moderator.update_parents() - - //Check if the fuels are present and move them inside the fuel internal gasmix - if(!start_fuel || !selected_fuel || !check_gas_requirements()) - return - - var/datum/gas_mixture/fuel_port = linked_input.airs[1] - for(var/gas_type in selected_fuel.requirements) - internal_fusion.assert_gas(gas_type) - internal_fusion.merge(fuel_port.remove_specific(gas_type, fuel_injection_rate * delta_time / length(selected_fuel.requirements))) - linked_input.update_parents() - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_deconstructable() - if(!active) - return - if(power_level > 0) - fusion_started = TRUE - linked_input.fusion_started = TRUE - linked_output.fusion_started = TRUE - linked_moderator.fusion_started = TRUE - linked_interface.fusion_started = TRUE - for(var/obj/machinery/hypertorus/corner/corner in corners) - corner.fusion_started = TRUE - else - fusion_started = FALSE - linked_input.fusion_started = FALSE - linked_output.fusion_started = FALSE - linked_moderator.fusion_started = FALSE - linked_interface.fusion_started = FALSE - for(var/obj/machinery/hypertorus/corner/corner in corners) - corner.fusion_started = FALSE diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm deleted file mode 100644 index d7c2bab399c..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm +++ /dev/null @@ -1,518 +0,0 @@ -/** - * This file contain the eight parts surrounding the main core, those are: fuel input, moderator input, waste output, interface and the corners - * The file also contain the guicode of the machine - */ -/obj/machinery/atmospherics/components/unary/hypertorus - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' - icon_state = "core" - - name = "thermomachine" - desc = "Heats or cools gas in connected pipes." - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - layer = OBJ_LAYER - pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - circuit = /obj/item/circuitboard/machine/thermomachine - ///Vars for the state of the icon of the object (open, off, active) - var/icon_state_open - var/icon_state_off - var/icon_state_active - ///Check if the machine has been activated - var/active = FALSE - ///Check if fusion has started - var/fusion_started = FALSE - ///Check if the machine is cracked open - var/cracked = FALSE - -/obj/machinery/atmospherics/components/unary/hypertorus/Initialize(mapload) - . = ..() - initialize_directions = dir - -/obj/machinery/atmospherics/components/unary/hypertorus/examine(mob/user) - . = ..() - . += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.") - -/obj/machinery/atmospherics/components/unary/hypertorus/attackby(obj/item/I, mob/user, params) - if(!fusion_started) - if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I)) - return - if(default_change_direction_wrench(user, I)) - return - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/atmospherics/components/unary/hypertorus/welder_act(mob/living/user, obj/item/tool) - if(!cracked) - return FALSE - if(user.combat_mode) - return FALSE - balloon_alert(user, "You start repairing the crack...") - if(tool.use_tool(src, user, 10 SECONDS, volume=30, amount=5)) - balloon_alert(user, "You repaired the crack.") - cracked = FALSE - update_appearance() - -/obj/machinery/atmospherics/components/unary/hypertorus/default_change_direction_wrench(mob/user, obj/item/I) - . = ..() - if(.) - set_init_directions() - var/obj/machinery/atmospherics/node = nodes[1] - if(node) - node.disconnect(src) - nodes[1] = null - if(parents[1]) - nullify_pipenet(parents[1]) - atmos_init() - node = nodes[1] - if(node) - node.atmos_init() - node.add_member(src) - SSair.add_to_rebuild_queue(src) - -/obj/machinery/atmospherics/components/unary/hypertorus/update_icon_state() - if(panel_open) - icon_state = icon_state_open - return ..() - if(active) - icon_state = icon_state_active - return ..() - icon_state = icon_state_off - return ..() - -/obj/machinery/atmospherics/components/unary/hypertorus/update_overlays() - . = ..() - if(!cracked) - return - var/image/crack = image(icon, icon_state = "crack") - crack.dir = dir - . += crack - -/obj/machinery/atmospherics/components/unary/hypertorus/fuel_input - name = "HFR fuel input port" - desc = "Input port for the Hypertorus Fusion Reactor, designed to take in only Hydrogen and Tritium in gas forms." - icon_state = "fuel_input_off" - icon_state_open = "fuel_input_open" - icon_state_off = "fuel_input_off" - icon_state_active = "fuel_input_active" - circuit = /obj/item/circuitboard/machine/HFR_fuel_input - -/obj/machinery/atmospherics/components/unary/hypertorus/waste_output - name = "HFR waste output port" - desc = "Waste port for the Hypertorus Fusion Reactor, designed to output the hot waste gases coming from the core of the machine." - icon_state = "waste_output_off" - icon_state_open = "waste_output_open" - icon_state_off = "waste_output_off" - icon_state_active = "waste_output_active" - circuit = /obj/item/circuitboard/machine/HFR_waste_output - -/obj/machinery/atmospherics/components/unary/hypertorus/moderator_input - name = "HFR moderator input port" - desc = "Moderator port for the Hypertorus Fusion Reactor, designed to move gases inside the machine to cool and control the flow of the reaction." - icon_state = "moderator_input_off" - icon_state_open = "moderator_input_open" - icon_state_off = "moderator_input_off" - icon_state_active = "moderator_input_active" - circuit = /obj/item/circuitboard/machine/HFR_moderator_input - -/* -* Interface and corners -*/ -/obj/machinery/hypertorus - name = "hypertorus_core" - desc = "hypertorus_core" - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' - icon_state = "core" - move_resist = INFINITY - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - power_channel = AREA_USAGE_ENVIRON - var/active = FALSE - var/icon_state_open - var/icon_state_off - var/icon_state_active - var/fusion_started = FALSE - -/obj/machinery/hypertorus/examine(mob/user) - . = ..() - . += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.") - -/obj/machinery/hypertorus/attackby(obj/item/I, mob/user, params) - if(!fusion_started) - if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I)) - return - if(default_change_direction_wrench(user, I)) - return - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/hypertorus/update_icon_state() - if(panel_open) - icon_state = icon_state_open - return ..() - if(active) - icon_state = icon_state_active - return ..() - icon_state = icon_state_off - return ..() - -/obj/machinery/hypertorus/interface - name = "HFR interface" - desc = "Interface for the HFR to control the flow of the reaction." - icon_state = "interface_off" - circuit = /obj/item/circuitboard/machine/HFR_interface - var/obj/machinery/atmospherics/components/unary/hypertorus/core/connected_core - icon_state_off = "interface_off" - icon_state_open = "interface_open" - icon_state_active = "interface_active" - -/obj/machinery/hypertorus/interface/Destroy() - if(connected_core) - connected_core = null - return..() - -/obj/machinery/hypertorus/interface/multitool_act(mob/living/user, obj/item/I) - . = ..() - var/turf/T = get_step(src,turn(dir,180)) - var/obj/machinery/atmospherics/components/unary/hypertorus/core/centre = locate() in T - - if(!centre || !centre.check_part_connectivity()) - to_chat(user, span_notice("Check all parts and then try again.")) - return TRUE - new/obj/item/paper/guides/jobs/atmos/hypertorus(loc) - connected_core = centre - - connected_core.activate(user) - return TRUE - -/obj/machinery/hypertorus/interface/ui_interact(mob/user, datum/tgui/ui) - if(active) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Hypertorus", name) - ui.open() - else - to_chat(user, span_notice("Activate the machine first by using a multitool on the interface.")) - -/obj/machinery/hypertorus/interface/proc/gas_list_to_gasid_list(list/gas_list) - var/list/gasid_list = list() - for(var/gas_type in gas_list) - var/datum/gas/gas = gas_type - gasid_list += initial(gas.id) - return gasid_list - - - -/obj/machinery/hypertorus/interface/ui_static_data() - var/data = list() - data["base_max_temperature"] = FUSION_MAXIMUM_TEMPERATURE - data["selectable_fuel"] = list(list("name" = "Nothing", "id" = null)) - for(var/path in GLOB.hfr_fuels_list) - var/datum/hfr_fuel/recipe = GLOB.hfr_fuels_list[path] - - data["selectable_fuel"] += list(list( - "name" = recipe.name, - "id" = recipe.id, - "requirements" = gas_list_to_gasid_list(recipe.requirements), - "fusion_byproducts" = gas_list_to_gasid_list(recipe.primary_products), - "product_gases" = gas_list_to_gasid_list(recipe.secondary_products), - "recipe_cooling_multiplier" = recipe.negative_temperature_multiplier, - "recipe_heating_multiplier" = recipe.positive_temperature_multiplier, - "energy_loss_multiplier" = recipe.energy_concentration_multiplier, - "fuel_consumption_multiplier" = recipe.fuel_consumption_multiplier, - "gas_production_multiplier" = recipe.gas_production_multiplier, - "temperature_multiplier" = recipe.temperature_change_multiplier, - )) - return data - -/obj/machinery/hypertorus/interface/ui_data() - var/data = list() - - if(connected_core.selected_fuel) - data["selected"] = connected_core.selected_fuel.id - else - data["selected"] = "" - - //Internal Fusion gases - var/list/fusion_gasdata = list() - if(connected_core.internal_fusion.get_moles()) - for(var/gas_type in connected_core.internal_fusion.gases) - var/datum/gas/gas = gas_type - fusion_gasdata.Add(list(list( - "id"= initial(gas.id), - "amount" = round(connected_core.internal_fusion.gases[gas][MOLES], 0.01), - ))) - else - for(var/gas_type in connected_core.internal_fusion.gases) - var/datum/gas/gas = gas_type - fusion_gasdata.Add(list(list( - "id"= initial(gas.id), - "amount" = 0, - ))) - //Moderator gases - var/list/moderator_gasdata = list() - if(connected_core.moderator_internal.get_moles()) - for(var/gas_type in connected_core.moderator_internal.gases) - var/datum/gas/gas = gas_type - moderator_gasdata.Add(list(list( - "id"= initial(gas.id), - "amount" = round(connected_core.moderator_internal.gases[gas][MOLES], 0.01), - ))) - else - for(var/gas_type in connected_core.moderator_internal.gases) - var/datum/gas/gas = gas_type - moderator_gasdata.Add(list(list( - "id"= initial(gas.id), - "amount" = 0, - ))) - - data["fusion_gases"] = fusion_gasdata - data["moderator_gases"] = moderator_gasdata - - data["energy_level"] = connected_core.energy - data["heat_limiter_modifier"] = connected_core.heat_limiter_modifier - data["heat_output_min"] = connected_core.heat_output_min - data["heat_output_max"] = connected_core.heat_output_max - data["heat_output"] = connected_core.heat_output - data["instability"] = connected_core.instability - - data["heating_conductor"] = connected_core.heating_conductor - data["magnetic_constrictor"] = connected_core.magnetic_constrictor - data["fuel_injection_rate"] = connected_core.fuel_injection_rate - data["moderator_injection_rate"] = connected_core.moderator_injection_rate - data["current_damper"] = connected_core.current_damper - - data["power_level"] = connected_core.power_level - data["apc_energy"] = connected_core.get_area_cell_percent() - data["iron_content"] = connected_core.iron_content - data["integrity"] = connected_core.get_integrity_percent() - - data["start_power"] = connected_core.start_power - data["start_cooling"] = connected_core.start_cooling - data["start_fuel"] = connected_core.start_fuel - data["start_moderator"] = connected_core.start_moderator - - data["internal_fusion_temperature"] = connected_core.fusion_temperature - data["moderator_internal_temperature"] = connected_core.moderator_temperature - data["internal_output_temperature"] = connected_core.output_temperature - data["internal_coolant_temperature"] = connected_core.coolant_temperature - - data["internal_fusion_temperature_archived"] = connected_core.fusion_temperature_archived - data["moderator_internal_temperature_archived"] = connected_core.moderator_temperature_archived - data["internal_output_temperature_archived"] = connected_core.output_temperature_archived - data["internal_coolant_temperature_archived"] = connected_core.coolant_temperature_archived - data["temperature_period"] = connected_core.temperature_period - - data["waste_remove"] = connected_core.waste_remove - data["filter_types"] = list() - for(var/path in GLOB.meta_gas_info) - var/list/gas = GLOB.meta_gas_info[path] - data["filter_types"] += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in connected_core.moderator_scrubbing))) - - data["cooling_volume"] = connected_core.airs[1].volume - data["mod_filtering_rate"] = connected_core.moderator_filtering_rate - - return data - -/obj/machinery/hypertorus/interface/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("start_power") - connected_core.start_power = !connected_core.start_power - connected_core.update_use_power(connected_core.start_power ? ACTIVE_POWER_USE : IDLE_POWER_USE) - . = TRUE - if("start_cooling") - connected_core.start_cooling = !connected_core.start_cooling - . = TRUE - if("start_fuel") - connected_core.start_fuel = !connected_core.start_fuel - . = TRUE - if("start_moderator") - connected_core.start_moderator = !connected_core.start_moderator - . = TRUE - if("heating_conductor") - var/heating_conductor = text2num(params["heating_conductor"]) - if(heating_conductor != null) - connected_core.heating_conductor = clamp(heating_conductor, 50, 500) - . = TRUE - if("magnetic_constrictor") - var/magnetic_constrictor = text2num(params["magnetic_constrictor"]) - if(magnetic_constrictor != null) - connected_core.magnetic_constrictor = clamp(magnetic_constrictor, 50, 1000) - . = TRUE - if("fuel_injection_rate") - var/fuel_injection_rate = text2num(params["fuel_injection_rate"]) - if(fuel_injection_rate != null) - connected_core.fuel_injection_rate = clamp(fuel_injection_rate, 0.5, 150) - . = TRUE - if("moderator_injection_rate") - var/moderator_injection_rate = text2num(params["moderator_injection_rate"]) - if(moderator_injection_rate != null) - connected_core.moderator_injection_rate = clamp(moderator_injection_rate, 0.5, 150) - . = TRUE - if("current_damper") - var/current_damper = text2num(params["current_damper"]) - if(current_damper != null) - connected_core.current_damper = clamp(current_damper, 0, 1000) - . = TRUE - if("waste_remove") - connected_core.waste_remove = !connected_core.waste_remove - . = TRUE - if("filter") - connected_core.moderator_scrubbing ^= gas_id2path(params["mode"]) - . = TRUE - if("mod_filtering_rate") - var/mod_filtering_rate = text2num(params["mod_filtering_rate"]) - if(mod_filtering_rate != null) - connected_core.moderator_filtering_rate = clamp(mod_filtering_rate, 5, 200) - . = TRUE - if("fuel") - connected_core.selected_fuel = null - var/fuel_mix = "nothing" - var/datum/hfr_fuel/fuel = null - if(params["mode"] != "") - fuel = GLOB.hfr_fuels_list[params["mode"]] - if(fuel) - connected_core.selected_fuel = fuel - fuel_mix = fuel.name - if(connected_core.internal_fusion.get_moles()) - connected_core.dump_gases() - connected_core.update_parents() //prevent the machine from stopping because of the recipe change and the pipenet not updating - connected_core.linked_input.update_parents() - connected_core.linked_output.update_parents() - connected_core.linked_moderator.update_parents() - investigate_log("was set to recipe [fuel_mix ? fuel_mix : "null"] by [key_name(usr)]", INVESTIGATE_ATMOS) - . = TRUE - if("cooling_volume") - var/cooling_volume = text2num(params["cooling_volume"]) - if(cooling_volume != null) - connected_core.airs[1].volume = clamp(cooling_volume, 50, 2000) - . = TRUE - -/obj/machinery/hypertorus/corner - name = "HFR corner" - desc = "Structural piece of the machine." - icon_state = "corner_off" - circuit = /obj/item/circuitboard/machine/HFR_corner - icon_state_off = "corner_off" - icon_state_open = "corner_open" - icon_state_active = "corner_active" - dir = SOUTHEAST - -/obj/item/paper/guides/jobs/atmos/hypertorus - name = "paper- 'Quick guide to safe handling of the HFR'" - info = "<B>How to safely(TM) operate the Hypertorus</B><BR>\ - -Build the machine as it�s shown in the main guide.<BR>\ - -Make a 50/50 gasmix of tritium and hydrogen totalling around 2000 moles.<BR>\ - -Start the machine, fill up the cooling loop with plasma/hypernoblium and use space or freezers to cool it.<BR>\ - -Connect the fuel mix into the fuel injector port, allow only 1000 moles into the machine to ease the kickstart of the reaction<BR>\ - -Set the Heat conductor to 500 when starting the reaction, reset it to 100 when power level is higher than 1<BR>\ - -In the event of a meltdown, set the heat conductor to max and set the current damper to max. Set the fuel injection to min. \ - If the heat output doesn�t go negative, try changing the magnetic costrictors untill heat output goes negative. \ - Make the cooling stronger, put high heat capacity gases inside the moderator (hypernoblium will help dealing with the problem)<BR><BR>\ - <B>Warnings:</B><BR>\ - -You cannot dismantle the machine if the power level is over 0<BR>\ - -You cannot power of the machine if the power level is over 0<BR>\ - -You cannot dispose of waste gases if power level is over 5<BR>\ - -You cannot remove gases from the fusion mix if they are not helium and antinoblium<BR>\ - -Hypernoblium will decrease the power of the mix by a lot<BR>\ - -Antinoblium will INCREASE the power of the mix by a lot more<BR>\ - -High heat capacity gases are harder to heat/cool<BR>\ - -Low heat capacity gases are easier to heat/cool<BR>\ - -The machine consumes 50 KW per power level, reaching 350 KW at power level 6 so prepare the SM accordingly<BR>\ - -In case of a power shortage, the fusion reaction will CONTINUE but the cooling will STOP<BR><BR>\ - The writer of the quick guide will not be held responsible for misuses and meltdown caused by the use of the guide, \ - use more advanced guides to understando how the various gases will act as moderators." - -/obj/item/hfr_box - name = "HFR box" - desc = "If you see this, call the police." - icon = 'icons/obj/atmospherics/components/hypertorus.dmi' - icon_state = "box" - ///What kind of box are we handling? - var/box_type = "impossible" - ///What's the path of the machine we making - var/part_path - -/obj/item/hfr_box/corner - name = "HFR box corner" - desc = "Place this as the corner of your 3x3 multiblock fusion reactor" - icon_state = "box_corner" - box_type = "corner" - part_path = /obj/machinery/hypertorus/corner - -/obj/item/hfr_box/body - name = "HFR box body" - desc = "Place this on the sides of the core box of your 3x3 multiblock fusion reactor" - box_type = "body" - icon_state = "box_body" - -/obj/item/hfr_box/body/fuel_input - name = "HFR box fuel input" - part_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input - -/obj/item/hfr_box/body/moderator_input - name = "HFR box moderator input" - part_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input - -/obj/item/hfr_box/body/waste_output - name = "HFR box waste output" - part_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output - -/obj/item/hfr_box/body/interface - name = "HFR box interface" - part_path = /obj/machinery/hypertorus/interface - -/obj/item/hfr_box/core - name = "HFR box core" - desc = "Activate this with a multitool to deploy the full machine after setting up the other boxes" - icon_state = "box_core" - box_type = "core" - part_path = /obj/machinery/atmospherics/components/unary/hypertorus/core - -/obj/item/hfr_box/core/multitool_act(mob/living/user, obj/item/I) - . = ..() - var/list/parts = list() - for(var/obj/item/hfr_box/box in orange(1,src)) - var/direction = get_dir(src, box) - if(box.box_type == "corner") - if(ISDIAGONALDIR(direction)) - box.dir = direction - parts |= box - continue - if(box.box_type == "body") - if(direction in GLOB.cardinals) - box.dir = direction - parts |= box - continue - if(parts.len == 8) - build_reactor(parts) - return - -/obj/item/hfr_box/core/proc/build_reactor(list/parts) - for(var/obj/item/hfr_box/box in parts) - if(box.box_type == "corner") - var/obj/machinery/hypertorus/corner/corner = new box.part_path(box.loc) - corner.dir = box.dir - qdel(box) - continue - if(box.box_type == "body") - var/location = get_turf(box) - if(box.part_path != /obj/machinery/hypertorus/interface) - var/obj/machinery/atmospherics/components/unary/hypertorus/part = new box.part_path(location, TRUE, box.dir) - part.dir = box.dir - else - var/obj/machinery/hypertorus/interface/part = new box.part_path(location) - part.dir = box.dir - qdel(box) - continue - - new/obj/machinery/atmospherics/components/unary/hypertorus/core(loc, TRUE) - qdel(src) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm deleted file mode 100644 index 80174808f65..00000000000 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ /dev/null @@ -1,619 +0,0 @@ -/** - * This section contain all procs that helps building, destroy and control the hfr - */ - -/** - * Called by multitool_act() in hfr_parts.dm, by atmos_process() in hfr_main_processes.dm and by fusion_process() in the same file - * This proc checks the surrounding of the core to ensure that the machine has been build correctly, returns false if there is a missing piece/wrong placed one - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_part_connectivity() - . = TRUE - if(!anchored || panel_open) - return FALSE - - for(var/obj/machinery/hypertorus/object in orange(1,src)) - if(. == FALSE) - break - - if(object.panel_open) - . = FALSE - - if(istype(object,/obj/machinery/hypertorus/corner)) - var/dir = get_dir(src,object) - if(dir in GLOB.cardinals) - . = FALSE - switch(dir) - if(SOUTHEAST) - if(object.dir != dir) - . = FALSE - if(SOUTHWEST) - if(object.dir != dir) - . = FALSE - if(NORTHEAST) - if(object.dir != dir) - . = FALSE - if(NORTHWEST) - if(object.dir != dir) - . = FALSE - corners |= object - continue - - if(get_step(object,turn(object.dir,180)) != loc) - . = FALSE - - if(istype(object,/obj/machinery/hypertorus/interface)) - if(linked_interface && linked_interface != object) - . = FALSE - linked_interface = object - - for(var/obj/machinery/atmospherics/components/unary/hypertorus/object in orange(1,src)) - if(. == FALSE) - break - - if(object.panel_open) - . = FALSE - - if(get_step(object,turn(object.dir,180)) != loc) - . = FALSE - - if(istype(object,/obj/machinery/atmospherics/components/unary/hypertorus/fuel_input)) - if(linked_input && linked_input != object) - . = FALSE - linked_input = object - machine_parts |= object - - if(istype(object,/obj/machinery/atmospherics/components/unary/hypertorus/waste_output)) - if(linked_output && linked_output != object) - . = FALSE - linked_output = object - machine_parts |= object - - if(istype(object,/obj/machinery/atmospherics/components/unary/hypertorus/moderator_input)) - if(linked_moderator && linked_moderator != object) - . = FALSE - linked_moderator = object - machine_parts |= object - - if(!linked_interface || !linked_input || !linked_moderator || !linked_output || corners.len != 4) - . = FALSE - -/** - * Called by multitool_act() in hfr_parts.dm - * It sets the pieces to active, allowing the player to start the main reaction - * Arguments: - * * -user: the player doing the action - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/activate(mob/living/user) - if(active) - to_chat(user, span_notice("You already activated the machine.")) - return - to_chat(user, span_notice("You link all parts toghether.")) - active = TRUE - update_appearance() - linked_interface.active = TRUE - linked_interface.update_appearance() - RegisterSignal(linked_interface, COMSIG_PARENT_QDELETING, .proc/unregister_signals) - linked_input.active = TRUE - linked_input.update_appearance() - RegisterSignal(linked_input, COMSIG_PARENT_QDELETING, .proc/unregister_signals) - linked_output.active = TRUE - linked_output.update_appearance() - RegisterSignal(linked_output, COMSIG_PARENT_QDELETING, .proc/unregister_signals) - linked_moderator.active = TRUE - linked_moderator.update_appearance() - RegisterSignal(linked_moderator, COMSIG_PARENT_QDELETING, .proc/unregister_signals) - for(var/obj/machinery/hypertorus/corner/corner in corners) - corner.active = TRUE - corner.update_appearance() - RegisterSignal(corner, COMSIG_PARENT_QDELETING, .proc/unregister_signals) - soundloop = new(src, TRUE) - soundloop.volume = 5 - -/** - * Called when a part gets deleted around the hfr, called on Destroy() of the hfr core in hfr_core.dm - * Unregister the signals attached to the core from the various machines, if only_signals is false it will also call deactivate() - * Arguments: - * * only_signals: default FALSE, if true the proc will not call the deactivate() proc - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/unregister_signals(only_signals = FALSE) - SIGNAL_HANDLER - if(linked_interface) - UnregisterSignal(linked_interface, COMSIG_PARENT_QDELETING) - if(linked_input) - UnregisterSignal(linked_input, COMSIG_PARENT_QDELETING) - if(linked_output) - UnregisterSignal(linked_output, COMSIG_PARENT_QDELETING) - if(linked_moderator) - UnregisterSignal(linked_moderator, COMSIG_PARENT_QDELETING) - for(var/obj/machinery/hypertorus/corner/corner in corners) - UnregisterSignal(corner, COMSIG_PARENT_QDELETING) - if(!only_signals) - deactivate() - -/** - * Called by unregister_signals() in this file, called when the main fusion processes check_part_connectivity() returns false - * Deactivate the various machines by setting the active var to false, updates the machines icon and set the linked machine vars to null - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/deactivate() - if(!active) - return - active = FALSE - update_appearance() - if(linked_interface) - linked_interface.active = FALSE - linked_interface.update_appearance() - linked_interface = null - if(linked_input) - linked_input.active = FALSE - linked_input.update_appearance() - linked_input = null - if(linked_output) - linked_output.active = FALSE - linked_output.update_appearance() - linked_output = null - if(linked_moderator) - linked_moderator.active = FALSE - linked_moderator.update_appearance() - linked_moderator = null - if(corners.len) - for(var/obj/machinery/hypertorus/corner/corner in corners) - corner.active = FALSE - corner.update_appearance() - corners = list() - QDEL_NULL(soundloop) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/assert_gases() - //Assert the gases that will be used/created during the process - - internal_fusion.assert_gas(/datum/gas/antinoblium) - - moderator_internal.assert_gases(arglist(GLOB.meta_gas_info)) - - if (!selected_fuel) - return - - internal_fusion.assert_gases(arglist(selected_fuel.requirements | selected_fuel.primary_products)) - -/** - * Updates all related pipenets from all connected components - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/update_pipenets() - update_parents() - linked_input.update_parents() - linked_output.update_parents() - linked_moderator.update_parents() - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/update_temperature_status(delta_time) - fusion_temperature_archived = fusion_temperature - fusion_temperature = internal_fusion.temperature - moderator_temperature_archived = moderator_temperature - moderator_temperature = moderator_internal.temperature - coolant_temperature_archived = coolant_temperature - coolant_temperature = airs[1].temperature - output_temperature_archived = output_temperature - output_temperature = linked_output.airs[1].temperature - temperature_period = delta_time - - //Set the power level of the fusion process - switch(fusion_temperature) - if(-INFINITY to 500) - power_level = 0 - if(500 to 1e3) - power_level = 1 - if(1e3 to 1e4) - power_level = 2 - if(1e4 to 1e5) - power_level = 3 - if(1e5 to 1e6) - power_level = 4 - if(1e6 to 1e7) - power_level = 5 - else - power_level = 6 - -/** - * Infrequently plays accent sounds, and adjusts main loop parameters - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/play_ambience() - // We play delam/neutral sounds at a rate determined by power and critical_threshold_proximity - if(last_accent_sound < world.time && prob(20)) - var/aggression = min(((critical_threshold_proximity / 800) * ((power_level) / 5)), 1.0) * 100 - if(critical_threshold_proximity >= 300) - playsound(src, SFX_HYPERTORUS_MELTING, max(50, aggression), FALSE, 40, 30, falloff_distance = 10) - else - playsound(src, SFX_HYPERTORUS_CALM, max(50, aggression), FALSE, 25, 25, falloff_distance = 10) - var/next_sound = round((100 - aggression) * 5) + 5 - last_accent_sound = world.time + max(HYPERTORUS_ACCENT_SOUND_MIN_COOLDOWN, next_sound) - - var/ambient_hum = 1 - if (check_fuel()) - ambient_hum = power_level + 1 - soundloop.volume = clamp(ambient_hum * 8, 0, 50) - -/** - * Called by the main fusion processes in hfr_main_processes.dm - * Getter for fusion fuel moles - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_fuel() - if(!selected_fuel) - return FALSE - if(!internal_fusion.get_moles()) - return FALSE - for(var/gas_type in selected_fuel.requirements) - internal_fusion.assert_gas(gas_type) - if(internal_fusion.gases[gas_type][MOLES] < FUSION_MOLE_THRESHOLD) - return FALSE - return TRUE - -/** - * Called by the main fusion processes in hfr_main_processes.dm - * Check the power use of the machine, return TRUE if there is enough power in the powernet - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_power_use() - if(machine_stat & (NOPOWER|BROKEN)) - return FALSE - if(use_power == ACTIVE_POWER_USE) - update_mode_power_usage(ACTIVE_POWER_USE, (power_level + 1) * MIN_POWER_USAGE) //Max around 350 KW - - return TRUE - -///Checks if the gases in the input are the ones needed by the recipe -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_gas_requirements() - var/datum/gas_mixture/contents = linked_input.airs[1] - for(var/gas_type in selected_fuel.requirements) - if(!contents.gases[gas_type] || !contents.gases[gas_type][MOLES]) - return FALSE - return TRUE - -///Removes the gases from the internal gasmix when the recipe is changed -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/dump_gases() - var/datum/gas_mixture/remove = internal_fusion.remove(internal_fusion.get_moles()) - linked_output.airs[1].merge(remove) - internal_fusion.garbage_collect() - linked_input.airs[1].garbage_collect() - -/** - * Called by alarm() in this file - * Check the integrity level and returns the status of the machine - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/get_status() - var/integrity = get_integrity_percent() - if(integrity < HYPERTORUS_MELTING_PERCENT) - return HYPERTORUS_MELTING - - if(integrity < HYPERTORUS_EMERGENCY_PERCENT) - return HYPERTORUS_EMERGENCY - - if(integrity < HYPERTORUS_DANGER_PERCENT) - return HYPERTORUS_DANGER - - if(integrity < HYPERTORUS_WARNING_PERCENT) - return HYPERTORUS_WARNING - - if(power_level > 0) - return HYPERTORUS_NOMINAL - return HYPERTORUS_INACTIVE - -/** - * Called by check_alert() in this file - * Play a sound from the machine, the type depends on the status of the hfr - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/alarm() - switch(get_status()) - if(HYPERTORUS_MELTING) - playsound(src, 'sound/misc/bloblarm.ogg', 100, FALSE, 40, 30, falloff_distance = 10) - if(HYPERTORUS_EMERGENCY) - playsound(src, 'sound/machines/engine_alert1.ogg', 100, FALSE, 30, 30, falloff_distance = 10) - if(HYPERTORUS_DANGER) - playsound(src, 'sound/machines/engine_alert2.ogg', 100, FALSE, 30, 30, falloff_distance = 10) - if(HYPERTORUS_WARNING) - playsound(src, 'sound/machines/terminal_alert.ogg', 75) - -/** - * Getter for the machine integrity - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/get_integrity_percent() - var/integrity = critical_threshold_proximity / melting_point - integrity = round(100 - integrity * 100, 0.01) - integrity = integrity < 0 ? 0 : integrity - return integrity - -/** - * Get how charged the area's APC is - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/get_area_cell_percent() - // Make sure to get APC levels from the same area the core draws from - // Just in case people build an HFR across boundaries - var/area/area = get_area(src) - if (!area) - return 0 - var/obj/machinery/power/apc/apc = area.apc - if (!apc) - return 0 - var/obj/item/stock_parts/cell/cell = apc.cell - if (!cell) - return 0 - return cell.percent() - -/** - * Called by process_atmos() in hfr_main_processes.dm - * Called after checking the damage of the machine, calls alarm() and countdown() - * Broadcast messages into engi and common radio - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_alert() - if(critical_threshold_proximity < warning_point) - return - if((REALTIMEOFDAY - lastwarning) / 10 >= WARNING_TIME_DELAY) - alarm() - - if(critical_threshold_proximity > emergency_point) - radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity_percent()]%", common_channel) - lastwarning = REALTIMEOFDAY - if(!has_reached_emergency) - investigate_log("has reached the emergency point for the first time.", INVESTIGATE_HYPERTORUS) - message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].") - has_reached_emergency = TRUE - else if(critical_threshold_proximity >= critical_threshold_proximity_archived) // The damage is still going up - radio.talk_into(src, "[warning_alert] Integrity: [get_integrity_percent()]%", engineering_channel) - lastwarning = REALTIMEOFDAY - (WARNING_TIME_DELAY * 5) - - else // Phew, we're safe - radio.talk_into(src, "[safe_alert] Integrity: [get_integrity_percent()]%", engineering_channel) - lastwarning = REALTIMEOFDAY - - //Melt - if(critical_threshold_proximity > melting_point) - countdown() - -/** - * Called by check_alert() in this file - * Called when the damage has reached critical levels, start the countdown before the destruction, calls meltdown() - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/countdown() - set waitfor = FALSE - - if(final_countdown) // We're already doing it go away - return - final_countdown = TRUE - - var/critical = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_CRITICAL_MELTDOWN - if(critical) - priority_announce("WARNING - The explosion will likely cover a big part of the station and the coming EMP will wipe out most of the electronics. \ - Get as far away as possible from the reactor or find a way to shut it down.", "Alert") - var/speaking = "[emergency_alert] The Hypertorus fusion reactor has reached critical integrity failure. Emergency magnetic dampeners online." - radio.talk_into(src, speaking, common_channel, language = get_selected_language()) - for(var/i in HYPERTORUS_COUNTDOWN_TIME to 0 step -10) - if(critical_threshold_proximity < melting_point) // Cutting it a bit close there engineers - radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) - final_countdown = FALSE - return - else if((i % 50) != 0 && i > 50) // A message once every 5 seconds until the final 5 seconds which count down individualy - sleep(10) - continue - else if(i > 50) - if(i == 10 SECONDS && critical) - sound_to_playing_players('sound/machines/hypertorus/HFR_critical_explosion.ogg') - speaking = "[DisplayTimeText(i, TRUE)] remain before total integrity failure." - else - speaking = "[i*0.1]..." - radio.talk_into(src, speaking, common_channel) - sleep(10) - - meltdown() - -/** - * Called by countdown() in this file - * Create the explosion + the gas emission before deleting the machine core. - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/meltdown() - var/flash_explosion = 0 - var/light_impact_explosion = 0 - var/heavy_impact_explosion = 0 - var/devastating_explosion = 0 - var/em_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_EMP - var/rad_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_RADIATION_PULSE - var/emp_light_size = 0 - var/emp_heavy_size = 0 - var/rad_pulse_size = 0 - var/gas_spread = 0 - var/gas_pockets = 0 - var/critical = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_CRITICAL_MELTDOWN - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_BASE_EXPLOSION) - flash_explosion = power_level * 3 - light_impact_explosion = power_level * 2 - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MEDIUM_EXPLOSION) - flash_explosion = power_level * 6 - light_impact_explosion = power_level * 5 - heavy_impact_explosion = power_level * 0.5 - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_DEVASTATING_EXPLOSION) - flash_explosion = power_level * 8 - light_impact_explosion = power_level * 7 - heavy_impact_explosion = power_level * 2 - devastating_explosion = power_level - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MINIMUM_SPREAD) - if(em_pulse) - emp_light_size = power_level * 3 - emp_heavy_size = power_level * 1 - if(rad_pulse) - rad_pulse_size = 2 * power_level + 8 - gas_pockets = 5 - gas_spread = power_level * 2 - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MEDIUM_SPREAD) - if(em_pulse) - emp_light_size = power_level * 5 - emp_heavy_size = power_level * 3 - if(rad_pulse) - rad_pulse_size = power_level + 24 - gas_pockets = 7 - gas_spread = power_level * 4 - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_BIG_SPREAD) - if(em_pulse) - emp_light_size = power_level * 7 - emp_heavy_size = power_level * 5 - if(rad_pulse) - rad_pulse_size = power_level + 34 - gas_pockets = 10 - gas_spread = power_level * 6 - - if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MASSIVE_SPREAD) - if(em_pulse) - emp_light_size = power_level * 9 - emp_heavy_size = power_level * 7 - if(rad_pulse) - rad_pulse_size = power_level + 44 - gas_pockets = 15 - gas_spread = power_level * 8 - - var/list/around_turfs = circle_range_turfs(src, gas_spread) - for(var/turf/turf as anything in around_turfs) - if(isclosedturf(turf) || isspaceturf(turf)) - around_turfs -= turf - continue - var/datum/gas_mixture/remove_fusion - if(internal_fusion.get_moles() > 0) - remove_fusion = internal_fusion.removeRatio(0.2) - var/datum/gas_mixture/remove - for(var/i in 1 to gas_pockets) - remove = remove_fusion.removeRatio(1/gas_pockets) - var/turf/local = pick(around_turfs) - local.assume_air(remove) - loc.assume_air(internal_fusion) - var/datum/gas_mixture/remove_moderator - if(moderator_internal.get_moles() > 0) - remove_moderator = moderator_internal.removeRatio(0.2) - var/datum/gas_mixture/remove - for(var/i in 1 to gas_pockets) - remove = remove_moderator.removeRatio(1/gas_pockets) - var/turf/local = pick(around_turfs) - local.assume_air(remove) - loc.assume_air(moderator_internal) - - //Max explosion ranges: devastation = 12, heavy = 24, light = 42 - explosion( - origin = src, - devastation_range = critical ? devastating_explosion * 2 : devastating_explosion, - heavy_impact_range = critical ? heavy_impact_explosion * 2 : heavy_impact_explosion, - light_impact_range = light_impact_explosion, - flash_range = flash_explosion, - adminlog = TRUE, - ignorecap = TRUE - ) - - if(rad_pulse) - radiation_pulse( - source = loc, - max_range = rad_pulse_size, - threshold = 0.05, - ) - - if(em_pulse) - empulse( - epicenter = loc, - heavy_range = critical ? emp_heavy_size * 2 : emp_heavy_size, - light_range = critical ? emp_light_size * 2 : emp_heavy_size, - log = TRUE - ) - - qdel(src) - -/** - * Induce hallucinations in nearby humans. - * - * force will make hallucinations ignore meson protection. - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/induce_hallucination(strength, delta_time, force=FALSE) - for(var/mob/living/carbon/human/human in view(src, HALLUCINATION_HFR(heat_output))) - if(!force && istype(human.glasses, /obj/item/clothing/glasses/meson)) - continue - var/distance_root = sqrt(1 / max(1, get_dist(human, src))) - human.hallucination += strength * distance_root * delta_time - human.hallucination = clamp(human.hallucination, 0, 200) - -/** - * Emit radiation - */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/emit_rads() - radiation_pulse( - src, - max_range = 6, - threshold = 0.3, - ) - -/* - * HFR cracking related procs - */ - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_cracked_parts() - for(var/obj/machinery/atmospherics/components/unary/hypertorus/part in machine_parts) - if(part.cracked) - return TRUE - return FALSE - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/create_crack() - var/obj/machinery/atmospherics/components/unary/hypertorus/part = pick(machine_parts) - part.cracked = TRUE - part.update_appearance() - return part - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/spill_gases(obj/origin, datum/gas_mixture/target_mix, ratio) - var/datum/gas_mixture/remove_mixture = target_mix.removeRatio(ratio) - var/turf/origin_turf = origin.loc - if(!origin_turf) - return - origin_turf.assume_air(remove_mixture) - -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_spill(delta_time) - var/obj/machinery/atmospherics/components/unary/hypertorus/cracked_part = check_cracked_parts() - if (cracked_part) - // We have an existing crack - var/leak_rate - if (moderator_internal.returnPressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) - // Not high pressure, but can still leak - if (!prob(HYPERTORUS_WEAK_SPILL_CHANCE)) - return - leak_rate = HYPERTORUS_WEAK_SPILL_RATE - else if (moderator_internal.returnPressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) - // Lots of gas in here, out we go - leak_rate = HYPERTORUS_MEDIUM_SPILL_RATE - else - // Gotta go fast - leak_rate = HYPERTORUS_STRONG_SPILL_RATE - spill_gases(cracked_part, moderator_internal, ratio = 1 - (1 - leak_rate) ** delta_time) - return - - if (moderator_internal.get_moles() < HYPERTORUS_HYPERCRITICAL_MOLES) - return - cracked_part = create_crack() - // See if we do anything in the initial rupture - if (moderator_internal.returnPressure() < HYPERTORUS_MEDIUM_SPILL_PRESSURE) - return - if (moderator_internal.returnPressure() < HYPERTORUS_STRONG_SPILL_PRESSURE) - // Medium explosion on initial rupture - explosion( - origin = cracked_part, - devastation_range = 0, - heavy_impact_range = 0, - light_impact_range = 1, - flame_range = 3, - flash_range = 3 - ) - spill_gases(cracked_part, moderator_internal, ratio = HYPERTORUS_MEDIUM_SPILL_INITIAL) - return - // Enough pressure for a strong explosion. Oh dear, oh dear. - explosion( - origin = cracked_part, - devastation_range = 0, - heavy_impact_range = 1, - light_impact_range = 3, - flame_range = 5, - flash_range = 5 - ) - spill_gases(cracked_part, moderator_internal, ratio = HYPERTORUS_STRONG_SPILL_INITIAL) - return - diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm deleted file mode 100644 index 11521031303..00000000000 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/atmos_machines_recipes.dm +++ /dev/null @@ -1,183 +0,0 @@ -///Global list of recipes for atmospheric machines to use -GLOBAL_LIST_INIT(gas_recipe_meta, gas_recipes_list()) - -/* - * Global proc to build the gas recipe global list - */ -/proc/gas_recipes_list() - . = list() - for(var/recipe_path in subtypesof(/datum/gas_recipe)) - var/datum/gas_recipe/recipe = new recipe_path() - - .[recipe.id] = recipe - -/datum/gas_recipe - ///Id of the recipe for easy identification in the code - var/id = "" - ///What machine the recipe is for - var/machine_type = "" - ///Displayed name of the recipe - var/name = "" - ///Minimum temperature for the recipe - var/min_temp = TCMB - ///Maximum temperature for the recipe - var/max_temp = INFINITY - /** - * Amount of thermal energy released/consumed by the reaction. - * Positive numbers make the reaction release energy (exothermic) while negative numbers make the reaction consume energy (endothermic). - */ - var/energy_release = 0 - var/dangerous = FALSE - ///Gas required for the recipe to work - var/list/requirements - ///Products made from the recipe - var/list/products - -/datum/gas_recipe/crystallizer - machine_type = "Crystallizer" - -/datum/gas_recipe/crystallizer/hypern_crystalium - id = "hyper_crystalium" - name = "Hypernoblium Crystal" - min_temp = 3 - max_temp = 250 - energy_release = -250000 - requirements = list(/datum/gas/oxygen = 2000, /datum/gas/hypernoblium = 175) - products = list(/obj/item/hypernoblium_crystal = 1) - -/datum/gas_recipe/crystallizer/metallic_hydrogen - id = "metal_h" - name = "Metallic hydrogen" - min_temp = 50000 - max_temp = 150000 - energy_release = -2500000 - requirements = list(/datum/gas/hydrogen = 300, /datum/gas/bz = 50) - products = list(/obj/item/stack/sheet/mineral/metal_hydrogen = 1) - -/datum/gas_recipe/crystallizer/healium_grenade - id = "healium_g" - name = "Healium crystal" - min_temp = 200 - max_temp = 400 - energy_release = -2000000 - requirements = list(/datum/gas/healium = 100, /datum/gas/oxygen = 120, /datum/gas/plasma = 50) - products = list(/obj/item/grenade/gas_crystal/healium_crystal = 1) - -/datum/gas_recipe/crystallizer/proto_nitrate_grenade - id = "proto_nitrate_g" - name = "Proto nitrate crystal" - min_temp = 200 - max_temp = 400 - energy_release = 1500000 - requirements = list(/datum/gas/proto_nitrate = 100, /datum/gas/nitrogen = 80, /datum/gas/oxygen = 80) - products = list(/obj/item/grenade/gas_crystal/proto_nitrate_crystal = 1) - -/datum/gas_recipe/crystallizer/hot_ice - id = "hot_ice" - name = "Hot ice" - min_temp = 15 - max_temp = 35 - energy_release = -3000000 - requirements = list(/datum/gas/freon = 60, /datum/gas/plasma = 160, /datum/gas/oxygen = 80) - products = list(/obj/item/stack/sheet/hot_ice = 1) - -/datum/gas_recipe/crystallizer/ammonia_crystal - id = "ammonia_crystal" - name = "Ammonia crystal" - min_temp = 200 - max_temp = 240 - energy_release = 950000 - requirements = list(/datum/gas/hydrogen = 50, /datum/gas/nitrogen = 40) - products = list(/obj/item/stack/ammonia_crystals = 2) - -/datum/gas_recipe/crystallizer/shard - id = "crystal_shard" - name = "Supermatter crystal shard" - min_temp = TCMB - max_temp = 5 - energy_release = 150000000 - dangerous = TRUE - requirements = list(/datum/gas/hypernoblium = 250, /datum/gas/antinoblium = 250, /datum/gas/bz = 200, /datum/gas/plasma = 5000, /datum/gas/oxygen = 4500) - products = list(/obj/machinery/power/supermatter_crystal/shard = 1) - -/datum/gas_recipe/crystallizer/n2o_crystal - id = "n2o_crystal" - name = "Nitrous oxide crystal" - min_temp = 50 - max_temp = 350 - energy_release = 3500000 - requirements = list(/datum/gas/nitrous_oxide = 150, /datum/gas/bz = 30) - products = list(/obj/item/grenade/gas_crystal/nitrous_oxide_crystal = 1) - -/datum/gas_recipe/crystallizer/diamond - id = "diamond" - name = "Diamond" - min_temp = 10000 - max_temp = 30000 - energy_release = 9500000 - requirements = list(/datum/gas/carbon_dioxide = 1500) - products = list(/obj/item/stack/sheet/mineral/diamond = 1) - -/datum/gas_recipe/crystallizer/plasma_sheet - id = "plasma_sheet" - name = "Plasma sheet" - min_temp = 10 - max_temp = 20 - energy_release = 3500000 - requirements = list(/datum/gas/plasma = 450) - products = list(/obj/item/stack/sheet/mineral/plasma = 1) - -/datum/gas_recipe/crystallizer/crystal_cell - id = "crystal_cell" - name = "Crystal Cell" - min_temp = 50 - max_temp = 90 - energy_release = -800000 - requirements = list(/datum/gas/plasma = 800, /datum/gas/helium = 100, /datum/gas/bz = 50) - products = list(/obj/item/stock_parts/cell/crystal_cell = 1) - -/datum/gas_recipe/crystallizer/zaukerite - id = "zaukerite" - name = "Zaukerite sheet" - min_temp = 5 - max_temp = 20 - energy_release = 2900000 - requirements = list(/datum/gas/antinoblium = 5, /datum/gas/zauker = 20, /datum/gas/bz = 7.5) - products = list(/obj/item/stack/sheet/mineral/zaukerite = 2) - -/datum/gas_recipe/crystallizer/fuel_pellet - id = "fuel_basic" - name = "standard fuel pellet" - energy_release = -6000000 - requirements = list(/datum/gas/oxygen = 50, /datum/gas/plasma = 100) - products = list(/obj/item/fuel_pellet = 1) - -/datum/gas_recipe/crystallizer/fuel_pellet_advanced - id = "fuel_advanced" - name = "advanced fuel pellet" - energy_release = -6000000 - requirements = list(/datum/gas/tritium = 100, /datum/gas/hydrogen = 100) - products = list(/obj/item/fuel_pellet/advanced = 1) - -/datum/gas_recipe/crystallizer/fuel_pellet_exotic - id = "fuel_exotic" - name = "exotic fuel pellet" - energy_release = -6000000 - requirements = list(/datum/gas/hypernoblium = 100, /datum/gas/nitrium = 100) - products = list(/obj/item/fuel_pellet/exotic = 1) - -/datum/gas_recipe/crystallizer/crystal_foam - id = "crystal_foam" - name = "Crystal foam grenade" - energy_release = 140000 - requirements = list(/datum/gas/carbon_dioxide = 150, /datum/gas/nitrous_oxide = 100, /datum/gas/water_vapor = 25) - products = list(/obj/item/grenade/gas_crystal/crystal_foam = 1) - -/datum/gas_recipe/crystallizer/crystallized_nitrium - id = "crystallized_nitrium" - name = "Nitrium crystal" - min_temp = 10 - max_temp = 25 - energy_release = -45000 - requirements = list(/datum/gas/nitrium = 150, /datum/gas/oxygen = 70, /datum/gas/bz = 50) - products = list(/obj/item/nitrium_crystal = 1) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm deleted file mode 100644 index cbd6b1d06e0..00000000000 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ /dev/null @@ -1,338 +0,0 @@ -#define MIN_PROGRESS_AMOUNT 3 -#define MIN_DEVIATION_RATE 0.90 -#define MAX_DEVIATION_RATE 1.1 -#define HIGH_CONDUCTIVITY_RATIO 0.95 - -/obj/machinery/atmospherics/components/binary/crystallizer - icon = 'icons/obj/atmospherics/components/machines.dmi' - icon_state = "crystallizer-off" - name = "crystallizer" - desc = "Used to crystallize or solidify gases." - layer = ABOVE_MOB_LAYER - plane = GAME_PLANE_UPPER - density = TRUE - max_integrity = 300 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 80, ACID = 30) - circuit = /obj/item/circuitboard/machine/crystallizer - pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - vent_movement = NONE - - ///Base icon state for the machine to be used in update_icon() - var/base_icon = "crystallizer" - ///Internal Gas mix used for processing the gases that have been put in - var/datum/gas_mixture/internal - ///Var that controls how much gas gets injected in moles per tick - var/gas_input = 0 - ///Saves the progress during the processing of the items - var/progress_bar = 0 - ///Stores the amount of lost quality - var/quality_loss = 0 - ///Stores the recipe selected by the user in the GUI - var/datum/gas_recipe/selected_recipe = null - ///Stores the total amount of moles needed for the current recipe - var/total_recipe_moles = 0 - -/obj/machinery/atmospherics/components/binary/crystallizer/Initialize(mapload) - . = ..() - internal = new - -/obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, params) - if(!on) - if(default_deconstruction_screwdriver(user, "[base_icon]-open", "[base_icon]-off", I)) - return - if(default_change_direction_wrench(user, I)) - return - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/atmospherics/components/binary/crystallizer/default_change_direction_wrench(mob/user, obj/item/I) - . = ..() - if(!.) - return FALSE - set_init_directions() - var/obj/machinery/atmospherics/node1 = nodes[1] - var/obj/machinery/atmospherics/node2 = nodes[2] - if(node1) - if(src in node1.nodes) //Only if it's actually connected. On-pipe version would is one-sided. - node1.disconnect(src) - nodes[1] = null - if(node2) - if(src in node2.nodes) //Only if it's actually connected. On-pipe version would is one-sided. - node2.disconnect(src) - nodes[2] = null - - if(parents[1]) - nullify_pipenet(parents[1]) - if(parents[2]) - nullify_pipenet(parents[2]) - - atmos_init() - node1 = nodes[1] - if(node1) - node1.atmos_init() - node1.add_member(src) - node2 = nodes[2] - if(node2) - node2.atmos_init() - node2.add_member(src) - SSair.add_to_rebuild_queue(src) - return TRUE - -/obj/machinery/atmospherics/components/binary/crystallizer/update_overlays() - . = ..() - cut_overlays() - var/mutable_appearance/pipe_appearance1 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[dir]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) - pipe_appearance1.color = COLOR_LIME - var/mutable_appearance/pipe_appearance2 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[turn(dir, 180)]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) - pipe_appearance2.color = COLOR_MOSTLY_PURE_RED - . += pipe_appearance1 - . += pipe_appearance2 - -/obj/machinery/atmospherics/components/binary/crystallizer/update_icon_state() - . = ..() - if(panel_open) - icon_state = "[base_icon]-open" - else if(on && is_operational) - icon_state = "[base_icon]-on" - else - icon_state = "[base_icon]-off" - -/obj/machinery/atmospherics/components/binary/crystallizer/attackby_secondary(mob/user) - if(!can_interact(user)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - on = !on - investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) - update_icon() - -///Checks if the reaction temperature is inside the range of temperature + a little deviation -/obj/machinery/atmospherics/components/binary/crystallizer/proc/check_temp_requirements() - if(internal.temperature >= selected_recipe.min_temp * MIN_DEVIATION_RATE && internal.temperature <= selected_recipe.max_temp * MAX_DEVIATION_RATE) - return TRUE - return FALSE - -///Injects the gases from the input inside the internal gasmix, the amount is dependant on the gas_input var -/obj/machinery/atmospherics/components/binary/crystallizer/proc/inject_gases() - var/datum/gas_mixture/contents = airs[2] - for(var/gas_type in selected_recipe.requirements) - if(!contents.gases[gas_type] || !contents.gases[gas_type][MOLES]) - continue - if(internal.gases[gas_type] && internal.gases[gas_type][MOLES] >= selected_recipe.requirements[gas_type] * 2) - continue - internal.merge(contents.remove_specific(gas_type, contents.gases[gas_type][MOLES] * gas_input)) - -///Checks if the gases required are all inside -/obj/machinery/atmospherics/components/binary/crystallizer/proc/internal_check() - var/gas_check = 0 - for(var/gas_type in selected_recipe.requirements) - if(!internal.gases[gas_type] || !internal.gases[gas_type][MOLES]) - return FALSE - if(internal.gases[gas_type][MOLES] >= selected_recipe.requirements[gas_type]) - gas_check++ - if(gas_check == selected_recipe.requirements.len) - return TRUE - return FALSE - -///Calculation for the heat of the various gas mixes and controls the quality of the item -/obj/machinery/atmospherics/components/binary/crystallizer/proc/heat_calculations() - var/progress_amount_to_quality = MIN_PROGRESS_AMOUNT * 4.5 / (round(log(10, total_recipe_moles * 0.1), 0.01)) - if((internal.temperature >= (selected_recipe.min_temp * MIN_DEVIATION_RATE) && internal.temperature <= selected_recipe.min_temp) || \ - (internal.temperature >= selected_recipe.max_temp && internal.temperature <= (selected_recipe.max_temp * MAX_DEVIATION_RATE))) - quality_loss = min(quality_loss + progress_amount_to_quality, 100) - - var/median_temperature = (selected_recipe.max_temp + selected_recipe.min_temp) / 2 - if(internal.temperature >= (median_temperature * MIN_DEVIATION_RATE) && internal.temperature <= (median_temperature * MAX_DEVIATION_RATE)) - quality_loss = max(quality_loss - progress_amount_to_quality, -85) - - internal.temperature = max(internal.temperature + (selected_recipe.energy_release / internal.getHeatCapacity()), TCMB) - update_parents() - -///Conduction between the internal gasmix and the moderating (cooling/heating) gasmix. -/obj/machinery/atmospherics/components/binary/crystallizer/proc/heat_conduction() - var/datum/gas_mixture/cooling_port = airs[1] - if(cooling_port.get_moles() > MINIMUM_MOLE_COUNT) - if(internal.get_moles() > 0) - var/coolant_temperature_delta = cooling_port.temperature - internal.temperature - var/cooling_heat_capacity = cooling_port.getHeatCapacity() - var/internal_heat_capacity = internal.getHeatCapacity() - var/cooling_heat_amount = HIGH_CONDUCTIVITY_RATIO * coolant_temperature_delta * (cooling_heat_capacity * internal_heat_capacity / (cooling_heat_capacity + internal_heat_capacity)) - cooling_port.temperature = max(cooling_port.temperature - cooling_heat_amount / cooling_heat_capacity, TCMB) - internal.temperature = max(internal.temperature + cooling_heat_amount / internal_heat_capacity, TCMB) - update_parents() - -///Calculate the total moles needed for the recipe -/obj/machinery/atmospherics/components/binary/crystallizer/proc/moles_calculations() - var/amounts = 0 - for(var/gas_type in selected_recipe.requirements) - amounts += selected_recipe.requirements[gas_type] - total_recipe_moles = amounts - -///Removes the gases from the internal gasmix when the recipe is changed -/obj/machinery/atmospherics/components/binary/crystallizer/proc/dump_gases() - var/datum/gas_mixture/remove = internal.remove(internal.get_moles()) - airs[2].merge(remove) - internal.garbage_collect() - -/obj/machinery/atmospherics/components/binary/crystallizer/process_atmos() - if(!on || !is_operational || selected_recipe == null) - return - - inject_gases() - - if(!internal.get_moles()) - return - - heat_conduction() - - if(internal_check()) - if(check_temp_requirements()) - heat_calculations() - progress_bar = min(progress_bar + (MIN_PROGRESS_AMOUNT * 5 / (round(log(10, total_recipe_moles * 0.1), 0.01))), 100) - else - quality_loss = min(quality_loss + 0.5, 100) - progress_bar = max(progress_bar - 1, 0) - if(progress_bar != 100) - update_parents() - return - progress_bar = 0 - - for(var/gas_type in selected_recipe.requirements) - var/required_gas_moles = selected_recipe.requirements[gas_type] - var/amount_consumed = required_gas_moles + (required_gas_moles * (quality_loss * 0.01)) - if(internal.gases[gas_type][MOLES] < amount_consumed) - quality_loss = min(quality_loss + 10, 100) - internal.remove_specific(gas_type, amount_consumed) - - var/total_quality = clamp(50 - quality_loss, 0, 100) - var/quality_control - switch(total_quality) - if(100) - quality_control = "Masterwork" - if(95 to 99) - quality_control = "Supreme" - if(75 to 94) - quality_control = "Good" - if(65 to 74) - quality_control = "Decent" - if(55 to 64) - quality_control = "Average" - if(35 to 54) - quality_control = "Ok" - if(15 to 34) - quality_control = "Poor" - if(5 to 14) - quality_control = "Ugly" - if(1 to 4) - quality_control = "Cracked" - if(0) - quality_control = "Oh God why" - - for(var/path in selected_recipe.products) - var/amount_produced = selected_recipe.products[path] - for(var/i in 1 to amount_produced) - var/obj/creation = new path(get_step(src, SOUTH)) - creation.name = "[quality_control] [creation.name]" - if(selected_recipe.dangerous) - investigate_log("has been created in the crystallizer.", INVESTIGATE_ENGINE) - message_admins("[src] has been created in the crystallizer [ADMIN_JMP(src)].") - - - quality_loss = 0 - update_parents() - -/obj/machinery/atmospherics/components/binary/crystallizer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Crystallizer", name) - ui.open() - -/obj/machinery/atmospherics/components/binary/crystallizer/ui_static_data() - var/data = list() - data["selected_recipes"] = list(list("name" = "Nothing", "id" = "")) - for(var/path in GLOB.gas_recipe_meta) - var/datum/gas_recipe/recipe = GLOB.gas_recipe_meta[path] - if(recipe.machine_type != "Crystallizer") - continue - data["selected_recipes"] += list(list("name" = recipe.name, "id" = recipe.id)) - return data - -/obj/machinery/atmospherics/components/binary/crystallizer/ui_data() - var/data = list() - data["on"] = on - - if(selected_recipe) - data["selected"] = selected_recipe.id - else - data["selected"] = "" - - var/list/internal_gas_data = list() - if(internal.get_moles()) - for(var/gasid in internal.gases) - internal_gas_data.Add(list(list( - "name"= internal.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = round(internal.gases[gasid][MOLES], 0.01), - ))) - else - for(var/gasid in internal.gases) - internal_gas_data.Add(list(list( - "name"= internal.gases[gasid][GAS_META][META_GAS_NAME], - "amount" = 0, - ))) - data["internal_gas_data"] = internal_gas_data - - var/list/requirements - if(!selected_recipe) - requirements = list("Select a recipe to see the requirements") - else - requirements = list("To create [selected_recipe.name] you will need:") - for(var/gas_type in selected_recipe.requirements) - var/datum/gas/gas_required = gas_type - var/amount_consumed = selected_recipe.requirements[gas_type] - requirements += "-[amount_consumed] moles of [initial(gas_required.name)]" - requirements += "In a temperature range between [selected_recipe.min_temp] K and [selected_recipe.max_temp] K" - requirements += "The crystallization reaction will be [selected_recipe.energy_release ? (selected_recipe.energy_release > 0 ? "exothermic" : "endothermic") : "thermally neutral"]" - data["requirements"] = requirements.Join("\n") - - var/temperature - if(internal.get_moles()) - temperature = internal.temperature - else - temperature = 0 - data["internal_temperature"] = temperature - data["progress_bar"] = progress_bar - data["gas_input"] = gas_input - return data - -/obj/machinery/atmospherics/components/binary/crystallizer/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("power") - on = !on - investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) - . = TRUE - if("recipe") - selected_recipe = null - var/recipe_name = "nothing" - var/datum/gas_recipe/recipe = GLOB.gas_recipe_meta[params["mode"]] - if(internal.get_moles()) - dump_gases() - quality_loss = 0 - progress_bar = 0 - if(recipe && recipe.id != "") - selected_recipe = recipe - recipe_name = recipe.name - update_parents() //prevent the machine from stopping because of the recipe change and the pipenet not updating - moles_calculations() - investigate_log("was set to recipe [recipe_name ? recipe_name : "null"] by [key_name(usr)]", INVESTIGATE_ATMOS) - . = TRUE - if("gas_input") - var/_gas_input = params["gas_input"] - gas_input = clamp(_gas_input, 0, 250) - update_icon() - -#undef MIN_PROGRESS_AMOUNT -#undef MIN_DEVIATION_RATE -#undef MAX_DEVIATION_RATE -#undef HIGH_CONDUCTIVITY_RATIO diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm deleted file mode 100644 index b5ec772c258..00000000000 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/item/hypernoblium_crystal - name = "Hypernoblium Crystal" - desc = "Crystalized oxygen and hypernoblium stored in a bottle to pressureproof your clothes." - icon = 'icons/obj/chemical.dmi' - icon_state = "potblue" - var/uses = 2 - -/obj/item/hypernoblium_crystal/afterattack(obj/item/clothing/worn_item, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!istype(worn_item)) - to_chat(user, span_warning("The crystal can only be used on clothing!")) - return - if(istype(worn_item, /obj/item/clothing/suit/space)) - to_chat(user, span_warning("The [worn_item] is already pressure-resistant!")) - return - if(worn_item.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && worn_item.clothing_flags & STOPSPRESSUREDAMAGE) - to_chat(user, span_warning("[worn_item] is already pressure-resistant!")) - return - to_chat(user, span_notice("You see how the [worn_item] changes color, it's now pressure proof.")) - worn_item.name = "pressure-resistant [worn_item.name]" - worn_item.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - worn_item.add_atom_colour("#00fff7", FIXED_COLOUR_PRIORITY) - worn_item.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - worn_item.cold_protection = worn_item.body_parts_covered - worn_item.clothing_flags |= STOPSPRESSUREDAMAGE - uses-- - if(!uses) - qdel(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm deleted file mode 100644 index 2860ed39e97..00000000000 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ /dev/null @@ -1,178 +0,0 @@ -/obj/machinery/atmospherics/components/unary/bluespace_sender - icon = 'icons/obj/atmospherics/components/bluespace_gas_selling.dmi' - icon_state = "bluespace_sender_off" - name = "Bluespace Gas Sender" - desc = "Sends gases to the bluespace network to be shared with the connected vendors, who knows what's beyond!" - - density = TRUE - max_integrity = 300 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 80, ACID = 30) - layer = OBJ_LAYER - circuit = /obj/item/circuitboard/machine/bluespace_sender - pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - - ///Base icon name for updating the appearance - var/base_icon = "bluespace_sender" - ///Gas mixture containing the inserted gases and that is connected to the vendors - var/datum/gas_mixture/bluespace_network - ///Rate of gas transfer inside the network (from 0 to 1) - var/gas_transfer_rate = 0.5 - ///A base price for each and every gases, in case you don't want to change them - var/list/base_prices = list() - ///List storing all the vendors connected to the machine - var/list/vendors - ///Amount of credits gained from each vendor - var/credits_gained = 0 - -/obj/machinery/atmospherics/components/unary/bluespace_sender/Initialize(mapload) - . = ..() - initialize_directions = dir - bluespace_network = new - for(var/gas_id in GLOB.meta_gas_info) - bluespace_network.assert_gas(gas_id) - for(var/gas_id in GLOB.meta_gas_info) - var/datum/gas/gas = gas_id - base_prices[gas_id] = initial(gas.base_value) - - update_appearance() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/Destroy() - if(bluespace_network.get_moles()) - var/turf/local_turf = get_turf(src) - local_turf.assume_air(bluespace_network) - return ..() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/update_icon_state() - if(panel_open) - icon_state = "[base_icon]_open" - return ..() - if(on && is_operational) - icon_state = "[base_icon]_on" - return ..() - icon_state = "[base_icon]_off" - return ..() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/update_overlays() - . = ..() - . += get_pipe_image(icon, "pipe", dir, , piping_layer) - if(showpipe) - . += get_pipe_image(icon, "pipe", initialize_directions) - -/obj/machinery/atmospherics/components/unary/bluespace_sender/process_atmos() - if(!is_operational || !on || !nodes[1]) //if it has no power or its switched off, dont process atmos - return - - var/datum/gas_mixture/content = airs[1] - var/datum/gas_mixture/remove = content.removeRatio(gas_transfer_rate) - bluespace_network.merge(remove) - bluespace_network.temperature = T20C - update_parents() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/attackby(obj/item/item, mob/user, params) - if(!on) - if(default_deconstruction_screwdriver(user, "[base_icon]_open", "[base_icon]_off", item)) - update_appearance() - return - if(default_change_direction_wrench(user, item)) - return - if(item.tool_behaviour == TOOL_CROWBAR && panel_open && bluespace_network.get_moles() > 0) - say("WARNING - Bluespace network can contain hazardous gases, deconstruct with caution!") - if(!do_after(user, 3 SECONDS, src)) - return - if(default_deconstruction_crowbar(item)) - return - return ..() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/default_change_direction_wrench(mob/user, obj/item/item) - if(!..()) - return FALSE - set_init_directions() - var/obj/machinery/atmospherics/node = nodes[1] - if(node) - if(src in node.nodes) //Only if it's actually connected. On-pipe version would is one-sided. - node.disconnect(src) - nodes[1] = null - if(parents[1]) - nullify_pipenet(parents[1]) - - atmos_init() - node = nodes[1] - if(node) - node.atmos_init() - node.add_member(src) - SSair.add_to_rebuild_queue(src) - return TRUE - -/obj/machinery/atmospherics/components/unary/bluespace_sender/multitool_act(mob/living/user, obj/item/item) - var/obj/item/multitool/multitool = item - multitool.buffer = src - to_chat(user, span_notice("You store linkage information in [item]'s buffer.")) - return TRUE - -/obj/machinery/atmospherics/components/unary/bluespace_sender/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BluespaceSender", name) - ui.open() - -/obj/machinery/atmospherics/components/unary/bluespace_sender/ui_data(mob/user) - var/list/data = list() - data["on"] = on - data["gas_transfer_rate"] = gas_transfer_rate - var/list/bluespace_gasdata = list() - if(bluespace_network.get_moles()) - for(var/gas_id in bluespace_network.gases) - bluespace_gasdata.Add(list(list( - "name" = bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], - "id" = bluespace_network.gases[gas_id][GAS_META][META_GAS_ID], - "amount" = round(bluespace_network.gases[gas_id][MOLES], 0.01), - "price" = base_prices[gas_id], - ))) - else - for(var/gas_id in bluespace_network.gases) - bluespace_gasdata.Add(list(list( - "name" = bluespace_network.gases[gas_id][GAS_META][META_GAS_NAME], - "id" = "", - "amount" = 0, - "price" = 0, - ))) - data["bluespace_network_gases"] = bluespace_gasdata - var/list/vendors_list = list() - if(vendors) - for(var/obj/machinery/bluespace_vendor/vendor in vendors) - vendors_list.Add(list(list( - "name" = vendor.name, - "area" = get_area(vendor), - ))) - data["vendors_list"] = vendors_list - data["credits"] = credits_gained - return data - -/obj/machinery/atmospherics/components/unary/bluespace_sender/ui_act(action, params) - . = ..() - if(.) - return - - switch(action) - if("power") - on = !on - investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS) - update_appearance() - . = TRUE - - if("rate") - gas_transfer_rate = clamp(params["rate"], 0, 1) - . = TRUE - - if("price") - var/gas_type = gas_id2path(params["gas_type"]) - base_prices[gas_type] = clamp(params["gas_price"], 0, 100) - . = TRUE - - if("retrieve") - if(bluespace_network.get_moles() > 0) - var/datum/gas_mixture/remove = bluespace_network.remove(bluespace_network.get_moles()) - airs[1].merge(remove) - update_parents() - bluespace_network.garbage_collect() - . = TRUE diff --git a/pariah.dme b/pariah.dme index 7734791cc2a..e5ab07b66ea 100644 --- a/pariah.dme +++ b/pariah.dme @@ -2314,17 +2314,8 @@ #include "code\modules\asset_cache\assets\vv.dm" #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" -// #include "code\modules\atmospherics\environmental\LINDA_fire.dm" -// #include "code\modules\atmospherics\environmental\LINDA_system.dm" -// #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" -// #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -// #include "code\modules\atmospherics\gasmixtures\gas_types.dm" -// #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" -// #include "code\modules\atmospherics\gasmixtures\reaction_factors.dm" -// #include "code\modules\atmospherics\gasmixtures\reactions.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" #include "code\modules\atmospherics\machinery\atmosmachinery.dm" -//#include "code\modules\atmospherics\machinery\bluespace_vendor.dm" #include "code\modules\atmospherics\machinery\datum_pipeline.dm" #include "code\modules\atmospherics\machinery\components\components_base.dm" #include "code\modules\atmospherics\machinery\components\tank.dm" @@ -2338,22 +2329,10 @@ #include "code\modules\atmospherics\machinery\components\binary_devices\temperature_pump.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" #include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" -// #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer.dm" -// #include "code\modules\atmospherics\machinery\components\electrolyzer\electrolyzer_reactions.dm" #include "code\modules\atmospherics\rust\fusion_reactions.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_core.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_defines.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_fuel_datums.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_main_processes.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_parts.dm" -// #include "code\modules\atmospherics\machinery\components\fusion\hfr_procs.dm" -// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\atmos_machines_recipes.dm" -// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer.dm" -// #include "code\modules\atmospherics\machinery\components\gas_recipe_machines\crystallizer_items.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" #include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" -//#include "code\modules\atmospherics\machinery\components\unary_devices\bluespace_sender.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" #include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" From 910a7ba589dc7890c49ef249c163981daea6a7eb Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 10 Jul 2022 16:06:18 -0400 Subject: [PATCH 191/200] Fixes nitrodioxide label --- tgui/packages/tgui/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 52e38bfbcee..865914471e3 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -184,7 +184,7 @@ const GASES = [ { 'id': 'nitrodioxide', 'name': 'Nitrogen Dioxide', - 'label': 'Nitrodioxide', + 'label': 'NO₂', 'color': 'brown', }, { From be7c2421cae1239832cdfa0ec5b96e8335557b2a Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 10 Jul 2022 16:23:03 -0400 Subject: [PATCH 192/200] fixes methyl bromide label --- tgui/packages/tgui/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/constants.js b/tgui/packages/tgui/constants.js index 865914471e3..5c396609495 100644 --- a/tgui/packages/tgui/constants.js +++ b/tgui/packages/tgui/constants.js @@ -262,7 +262,7 @@ const GASES = [ { 'id': 'methyl_bromide', 'name': 'Methyl Bromide', - 'label': 'NO₂', + 'label': 'CH₃Br', 'color': 'maroon', }, { From 9a8bdc77eb7272027217d9e2e5423847a5afca16 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 11 Jul 2022 17:27:34 -0400 Subject: [PATCH 193/200] micro opts --- code/modules/atmospherics/ZAS/Zone.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 1afeb1bfa09..fde1148f652 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -151,7 +151,7 @@ Class Procs: return //Short circuit for explosions where rebuild is called many times over. invalidate() - for(var/turf/T in contents) + for(var/turf/T as anything in contents) if(!T.simulated) continue T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt @@ -173,7 +173,7 @@ Class Procs: /zone/proc/tick() // Update fires. - if(air.temperature >= PHORON_FLASHPOINT && !(src in SSzas.active_fire_zones) && air.check_combustability() && contents.len) + if(!(src in SSzas.active_fire_zones) && length(contents) && air.temperature >= PHORON_FLASHPOINT && air.check_combustability()) var/turf/T = pick(contents) if(istype(T)) T.create_fire(zas_settings.fire_firelevel_multiplier) @@ -187,7 +187,7 @@ Class Procs: graphic_remove.len = 0 // Update connected edges. - for(var/connection_edge/E in edges) + for(var/connection_edge/E as anything in edges) if(E.sleeping) E.recheck() @@ -210,7 +210,7 @@ Class Procs: // Update atom temperature. if(abs(air.temperature - last_air_temperature) >= ATOM_TEMPERATURE_EQUILIBRIUM_THRESHOLD) last_air_temperature = air.temperature - for(var/turf/T in contents) + for(var/turf/T as anything in contents) if(!T.simulated) continue for(var/atom/movable/checking as anything in T.contents) From d870552af46b45fd1d3df23939477277c39ea399 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:09:32 -0400 Subject: [PATCH 194/200] Tramstation should no longer freeze the server --- code/game/turfs/turf.dm | 2 +- code/modules/atmospherics/ZAS/Zone.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d334b7e30d1..6908167f780 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(station_turfs) zone.remove_turf(src) else //Just rebuild the fucker - zone.rebuild() + INVOKE_ASYNC(zone.rebuild()) //rebuild() contains CHECK_TICK ///NO MORE ZAS THINGS ..() diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index fde1148f652..829aa0d3cae 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -161,6 +161,8 @@ Class Procs: T.needs_air_update = 0 //Reset the marker so that it will be added to the list. SSzas.mark_for_update(T) + CHECK_TICK + ///Assumes a given gas mixture, dividing it amongst the zone. /zone/proc/add_tile_air(datum/gas_mixture/tile_air) air.group_multiplier = 1 From 17d6472eb8a00818b98434cee2c2d2805f8a252b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:31:16 -0400 Subject: [PATCH 195/200] Removes minimum zone size --- code/__DEFINES/atmospherics/ZAS.dm | 5 +---- code/controllers/subsystem/zas.dm | 2 +- code/modules/atmospherics/ZAS/Diagnostic.dm | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index d7940b12d21..7967f950210 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -12,12 +12,9 @@ #define AIR_ALLOWED (0<<0) ///Neither air nor zones can interact with this turf under the given conditions #define AIR_BLOCKED (1<<0) -///Air can pass through or into this turf, but zones may not merge with it. Will not block zone merges, if either zone is below ZONE_MIN_SIZE +///Air can pass through or into this turf, but zones may not merge with it. Will not block zone merges #define ZONE_BLOCKED (1<<1) -///Zones with less than this many turfs will always merge, even if the connection is not direct, tons of micro zones are expensive! -#define ZONE_MIN_SIZE 14 - ///Air can always pass #define CANPASS_ALWAYS 1 ///Air can only pass if density is FALSE diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index ddcd8c2293f..2478670c799 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -405,7 +405,7 @@ SUBSYSTEM_DEF(zas) var/space = !B.simulated if(!space) - if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) + if((direct && (times_fired == 0 || equivalent_pressure(A.zone,B.zone)))) merge(A.zone,B.zone) return TRUE diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index ca0d4543ebe..be9b666190b 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -10,8 +10,6 @@ for(var/g in mix.gas) to_chat(mob, span_admin("ZASDBG_GAS: [g]: [mix.gas[g]]\n")) - if((T.zone && (length(T.zone.contents) > ZONE_MIN_SIZE))) - to_chat(mob, span_notice("This turf's zone is below the minimum size, and will merge over zone blockers.")) else if(zone_debug_images) for(var/zone in zone_debug_images) From 73d311e17c1758c40d936e61be5b3d3d5bf33777 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:41:01 -0400 Subject: [PATCH 196/200] Linterinos --- code/game/turfs/turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6908167f780..dfef5f92329 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(station_turfs) zone.remove_turf(src) else //Just rebuild the fucker - INVOKE_ASYNC(zone.rebuild()) //rebuild() contains CHECK_TICK + INVOKE_ASYNC(zone, .proc/rebuild) //rebuild() contains CHECK_TICK ///NO MORE ZAS THINGS ..() From 86ab91d3766923b0c5c526d9269d0e3ac33d1c76 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:48:07 -0400 Subject: [PATCH 197/200] linterinos for real --- code/game/turfs/turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index dfef5f92329..d0f9c0a1a2b 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(station_turfs) zone.remove_turf(src) else //Just rebuild the fucker - INVOKE_ASYNC(zone, .proc/rebuild) //rebuild() contains CHECK_TICK + INVOKE_ASYNC(zone, /zone.proc/rebuild) //rebuild() contains CHECK_TICK ///NO MORE ZAS THINGS ..() From 0aa24699f31c33adfdb4f71871f76bcfe852250f Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 12 Jul 2022 17:39:10 -0400 Subject: [PATCH 198/200] Reverts zone size change, makes other tweaks --- code/__DEFINES/atmospherics/Connections.dm | 6 ++ code/__DEFINES/atmospherics/ZAS.dm | 3 + code/controllers/subsystem/zas.dm | 2 +- code/modules/atmospherics/ZAS/Connection.dm | 3 + .../atmospherics/ZAS/ConnectionGroup.dm | 61 ++++++++++--------- code/modules/atmospherics/ZAS/Diagnostic.dm | 2 + .../atmospherics/ZAS/XGM/xgm_gas_mixture.dm | 3 +- code/modules/atmospherics/ZAS/Zone.dm | 6 +- pariah.dme | 1 + 9 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 code/__DEFINES/atmospherics/Connections.dm diff --git a/code/__DEFINES/atmospherics/Connections.dm b/code/__DEFINES/atmospherics/Connections.dm new file mode 100644 index 00000000000..9b32c1668dd --- /dev/null +++ b/code/__DEFINES/atmospherics/Connections.dm @@ -0,0 +1,6 @@ + +#define WOOSH \ + if(REALTIMEOFDAY > last_woosh + 2 SECONDS){ \ + playsound(pick(connecting_turfs),abs(differential) > zas_settings.airflow_heavy_pressure ? 'modular_pariah/master_files/sound/effects/space_wind_big.ogg' : 'modular_pariah/master_files/sound/effects/space_wind.ogg',100,TRUE,null,pressure_affected = FALSE); \ + last_woosh = REALTIMEOFDAY;\ + } \ diff --git a/code/__DEFINES/atmospherics/ZAS.dm b/code/__DEFINES/atmospherics/ZAS.dm index 7967f950210..0c69a6dcdf9 100644 --- a/code/__DEFINES/atmospherics/ZAS.dm +++ b/code/__DEFINES/atmospherics/ZAS.dm @@ -15,6 +15,9 @@ ///Air can pass through or into this turf, but zones may not merge with it. Will not block zone merges #define ZONE_BLOCKED (1<<1) +///Zones with less than this many turfs will always merge, even if the connection is not direct. This MUST be ATLEAST 2, or doorways will BREAK. +#define ZONE_MIN_SIZE 5 + ///Air can always pass #define CANPASS_ALWAYS 1 ///Air can only pass if density is FALSE diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index 2478670c799..cf60600402c 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -405,7 +405,7 @@ SUBSYSTEM_DEF(zas) var/space = !B.simulated if(!space) - if((direct && (times_fired == 0 || equivalent_pressure(A.zone,B.zone)))) + if(min(length(A.zone.contents), length(B.zone.contents)) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || times_fired == 0))) merge(A.zone,B.zone) return TRUE diff --git a/code/modules/atmospherics/ZAS/Connection.dm b/code/modules/atmospherics/ZAS/Connection.dm index 80c20b582a9..2aa037d09c7 100644 --- a/code/modules/atmospherics/ZAS/Connection.dm +++ b/code/modules/atmospherics/ZAS/Connection.dm @@ -235,3 +235,6 @@ Class Procs: if(verbose) zas_log("Connection is valid.") #endif + +/connection_edge/proc/queue_spacewind() + return diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 2517abe2bec..b5908e65387 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -66,6 +66,9 @@ Class Procs: var/sleeping = 1 var/coefficient = 0 + ///The last time the "woosh" airflow sound played, world.time + var/last_woosh + #ifdef ZASDBG ///Set this to TRUE during testing to get verbose debug information. var/tmp/verbose = FALSE @@ -153,8 +156,6 @@ Class Procs: /connection_edge/zone var/zone/B - ///The last time the "woosh" airflow sound played, world.time - var/last_woosh /connection_edge/zone/New(zone/A, zone/B) @@ -191,30 +192,7 @@ Class Procs: var/equiv = A.air.shareRatio(B.air, coefficient) - var/differential = A.air.returnPressure() - B.air.returnPressure() - if(abs(differential) >= zas_settings.airflow_lightest_pressure) - var/list/attracted - var/list/repelled - if(differential > 0) - attracted = A.movables() - repelled = B.movables() - else - attracted = B.movables() - repelled = A.movables() - - if(REALTIMEOFDAY > last_woosh + 2 SECONDS) - playsound( - pick(connecting_turfs), - abs(differential) > zas_settings.airflow_heavy_pressure ? 'modular_pariah/master_files/sound/effects/space_wind_big.ogg' : 'modular_pariah/master_files/sound/effects/space_wind.ogg', - 100, - TRUE, - null, - pressure_affected = FALSE - ) - last_woosh = REALTIMEOFDAY - - flow(attracted, abs(differential), 0) - flow(repelled, abs(differential), 1) + queue_spacewind() if(equiv) if(direct) @@ -233,6 +211,23 @@ Class Procs: // Edges with only one side being vacuum need processing no matter how close. SSzas.mark_edge_active(src) +/connection_edge/zone/queue_spacewind() + var/differential = A.air.returnPressure() - B.air.returnPressure() + if(abs(differential) >= zas_settings.airflow_lightest_pressure) + var/list/attracted + var/list/repelled + if(differential > 0) + attracted = A.movables() + repelled = B.movables() + else + attracted = B.movables() + repelled = A.movables() + + WOOSH + + flow(attracted, abs(differential), 0) + flow(repelled, abs(differential), 1) + ///Helper proc to get connections for a zone. /connection_edge/zone/proc/get_connected_zone(zone/from) if(A == from) @@ -279,10 +274,7 @@ Class Procs: var/equiv = A.air.shareSpace(air) - var/differential = A.air.returnPressure() - air.returnPressure() - if(abs(differential) >= zas_settings.airflow_lightest_pressure) - var/list/attracted = A.movables() - flow(attracted, abs(differential), differential < 0) + queue_spacewind() if(equiv) A.air.copyFrom(air) @@ -297,6 +289,15 @@ Class Procs: if(!A.air.compare(air, vacuum_exception = 1)) SSzas.mark_edge_active(src) +/connection_edge/unsimulated/queue_spacewind() + var/differential = A.air.returnPressure() - air.returnPressure() + if(abs(differential) >= zas_settings.airflow_lightest_pressure) + var/list/attracted = A.movables() + + WOOSH + + flow(attracted, abs(differential), differential < 0) + /proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 diff --git a/code/modules/atmospherics/ZAS/Diagnostic.dm b/code/modules/atmospherics/ZAS/Diagnostic.dm index be9b666190b..ca0d4543ebe 100644 --- a/code/modules/atmospherics/ZAS/Diagnostic.dm +++ b/code/modules/atmospherics/ZAS/Diagnostic.dm @@ -10,6 +10,8 @@ for(var/g in mix.gas) to_chat(mob, span_admin("ZASDBG_GAS: [g]: [mix.gas[g]]\n")) + if((T.zone && (length(T.zone.contents) > ZONE_MIN_SIZE))) + to_chat(mob, span_notice("This turf's zone is below the minimum size, and will merge over zone blockers.")) else if(zone_debug_images) for(var/zone in zone_debug_images) diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index c9f5b3c6bbc..4ababf6b6e6 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -434,7 +434,8 @@ var/ratio = sharing_lookup_table[6] var/size = max(1, group_multiplier) - if(isnull(share_size)) share_size = max(1, other.group_multiplier) + if(isnull(share_size)) + share_size = max(1, other.group_multiplier) var/full_heat_capacity = getHeatCapacity() var/s_full_heat_capacity = other.getHeatCapacity() diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 829aa0d3cae..b0711f66969 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -175,14 +175,14 @@ Class Procs: /zone/proc/tick() // Update fires. - if(!(src in SSzas.active_fire_zones) && length(contents) && air.temperature >= PHORON_FLASHPOINT && air.check_combustability()) + if(air.temperature >= PHORON_FLASHPOINT && !length(fire_tiles) && length(contents) && !(src in SSzas.active_fire_zones) && air.check_combustability()) var/turf/T = pick(contents) - if(istype(T)) + if(T.simulated) T.create_fire(zas_settings.fire_firelevel_multiplier) // Update gas overlays. if(air.checkTileGraphic(graphic_add, graphic_remove)) - for(var/turf/T in contents) + for(var/turf/T as anything in contents) if(T.simulated) T.update_graphic(graphic_add, graphic_remove) graphic_add.len = 0 diff --git a/pariah.dme b/pariah.dme index e5ab07b66ea..3d727be9c61 100644 --- a/pariah.dme +++ b/pariah.dme @@ -199,6 +199,7 @@ #include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\atmospherics\atmos_piping.dm" +#include "code\__DEFINES\atmospherics\Connections.dm" #include "code\__DEFINES\atmospherics\reactor.dm" #include "code\__DEFINES\atmospherics\temperature.dm" #include "code\__DEFINES\atmospherics\XGM.dm" From 5cb1ba1e830514021eda26c26a28ad8ff6668a45 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Thu, 14 Jul 2022 14:26:02 -0400 Subject: [PATCH 199/200] Tries to fix the phantom rest bug --- code/__DEFINES/traits.dm | 2 ++ code/controllers/subsystem/airflow.dm | 7 +++---- code/modules/atmospherics/ZAS/Airflow.dm | 2 +- code/modules/mob/living/init_signals.dm | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index c233fdd87a8..f8f63ad6131 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -138,6 +138,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Doesn't miss attacks #define TRAIT_PERFECT_ATTACKER "perfect_attacker" #define TRAIT_INCAPACITATED "incapacitated" +/// The owner is queued in SSairflow. +#define TRAIT_EXPERIENCING_AIRFLOW "experiencing_airflow" /// In some kind of critical condition. Is able to succumb. #define TRAIT_CRITICAL_CONDITION "critical-condition" #define TRAIT_BLIND "blind" diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 6a3fb2e3fc0..72fcc03003d 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -1,5 +1,6 @@ #define CLEAR_OBJECT(TARGET) \ processing -= TARGET; \ + REMOVE_TRAIT(TARGET, TRAIT_EXPERIENCING_AIRFLOW, src); \ TARGET.airflow_dest = null; \ TARGET.airflow_speed = 0; \ TARGET.airflow_time = 0; \ @@ -100,10 +101,8 @@ SUBSYSTEM_DEF(airflow) target.dir = olddir target.airborne_acceleration++ - if (ismob(target)) - var/mob/M = target - M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, zas_settings.airflow_mob_slowdown) - addtimer(CALLBACK(M, /mob/proc/remove_movespeed_modifier, /datum/movespeed_modifier/atmos_pressure, TRUE), 3 SECONDS, flags = TIMER_DELETE_ME) + ADD_TRAIT(target, TRAIT_EXPERIENCING_AIRFLOW, src) + if (MC_TICK_CHECK) current.Cut(i) return diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 6cc76ddb73f..5626c7048b2 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -106,7 +106,7 @@ This entire system is an absolute mess. if(airborne_acceleration > 1) airflow_hit(A) A.airflow_hit_act(src) - else if(istype(src, /mob/living/carbon/human)) + else if(istype(src, /mob/living/carbon/human) && ismovable(A) && !(A:airflow_originally_not_dense)) to_chat(src, "<span class='notice'>You are pinned against [A] by airflow!</span>") src:Stun(1 SECONDS) // :) /* diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index fd7c347c20c..66163e1de99 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -30,6 +30,9 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_RESTRAINED), .proc/on_restrained_trait_gain) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_RESTRAINED), .proc/on_restrained_trait_loss) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_EXPERIENCING_AIRFLOW), .proc/on_airflow_trait_gain) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_EXPERIENCING_AIRFLOW), .proc/on_airflow_trait_loss) + RegisterSignal(src, list( SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), SIGNAL_REMOVETRAIT(TRAIT_CRITICAL_CONDITION), @@ -213,3 +216,15 @@ /mob/living/proc/on_skittish_trait_loss(datum/source) SIGNAL_HANDLER RemoveElement(/datum/element/skittish) + +/// Called when [TRAIT_EXPERIENCING_AIRFLOW] is added to the mob. +/mob/living/proc/on_airflow_trait_gain(datum/source) + SIGNAL_HANDLER + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE, zas_settings.airflow_mob_slowdown) + +/// Called when [TRAIT_EXPERIENCING_AIRFLOW] is removed from the mob. +/mob/living/proc/on_airflow_trait_loss(datum/source) + SIGNAL_HANDLER + remove_movespeed_modifier(/datum/movespeed_modifier/atmos_pressure, TRUE) + if(!resting) + get_up(TRUE) From 42ddbd398f0e2c1f9602a959b05c213f338f1bf8 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 16 Jul 2022 21:12:39 -0400 Subject: [PATCH 200/200] airflow fix --- code/modules/atmospherics/ZAS/Airflow.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 5626c7048b2..67227f99ec4 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -83,7 +83,11 @@ This entire system is an absolute mess. if(anchored) return FALSE if(n < zas_settings.airflow_dense_pressure) - return FALSE + if(airflow_dest) + if(!airflow_originally_not_dense) + return FALSE + else if(density) + return FALSE return ..() /obj/item/check_airflow_movable(n)