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 ? "[active_edges.len]" : "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, "You stay upright as the air rushes past you.") + return 0 + if(buckled) + to_chat(src, "Air suddenly rushes past you!") + return 0 + if(!lying) + to_chat(src, "The sudden rush of air knocks you over!") + 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, "Air suddenly rushes past you!") + 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, "You are pinned against [A] by airflow!") + 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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("[src] slams into [A]!",1,"You hear a loud slam!",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, "Your skin burns!") + 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, "High levels of toxins cause you to spontaneously mutate!") + 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, "Your eyes burn!") + 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, "You are blinded!") + 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] - JMP) 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, "You stay upright as the air rushes past you.") return 0 if(buckled) to_chat(src, "Air suddenly rushes past you!") return 0 - if(!lying) + if(!body_position == LYING_DOWN) to_chat(src, "The sudden rush of air knocks you over!") - 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, "Air suddenly rushes past you!") 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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("[src] slams into [A]!",1,"You hear a loud slam!",2) +/mob/living/carbon/human/airflow_hit(atom/A) + for(var/mob/M in hearers(src)) + M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",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, "Your skin burns!") 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 = "O2" + 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 = "N2" + 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 = "CO2" + 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 = "CH3Br" + 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 = "N2O" + 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 = "CH4" + 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[num]" + 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 = "H2" + 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 = "NO2" + 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 = "H2O" + 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 = "SO2" + 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 = "NH3" + 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 ? "[active_edges.len]" : "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 ? "[active_edges.len]" : "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("Initiating restart of atmosphere. The server may lag a bit.") + 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("Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") 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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("[src] slams into [A]!",1,"You hear a loud slam!",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.
" 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)]%
" + dat += "[env_gases[id]]: [round(gas_level*100, 0.01)]%
" dat += "Temperature: [round(environment.temperature-T0C)]°C
" dat += "
" 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("Initiating restart of atmosphere. The server may lag a bit.") + to_chat(world, "Initiating restart of atmosphere. The server may lag a bit.") 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("Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") + to_chat(world, "Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") 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 --- 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 opened by [key_name(usr)], starting a transfer into \the [holding || "air"].
" 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)] opened a canister that contains the following:" admin_msg = "[key_name(usr)] opened 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 "
[round(S.get_integrity_percent(), 1)]%
" + */ /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)] opened 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 = "CH3Br" 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)V=-0C=1w$Gr-GAQT4B+4~e9x<`MjODN%>?;vRDP=QLleuLXN0-N5AgR+L+ zSZaQ5NUXz1?8~7gNGvn46!V!{Pi?+MNN`Rp%Vz+>H3d$P#0h+fM3zl+5 zLI3~)7fD1xR9J=WR)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 z&DrixS2w(nuQ;A~HZ{A$$Rwh)0?qC)I?5?2B-v3;iM>D-l6W>9<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 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#H!Q}a@bGLx0KI8!o)|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+AtAxzUk4zay~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(TPBFWVnOL=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*0ZukfWZ6?^_6J1Q0l z-ar+z2%vFDQ+bHVOsS{q-dUWKPw*8&h3_Wv3cs2u{fjQ&HvkctdBagPlTvz+u?c(r zyk&q4U9N^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+~+1>va!kk{Xzw;rk!UG9QWaUzAc#f zMBGQw4S 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%s6SGmp)1y?jfFDZ*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^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`&=!jlZGMh**k0yLOKPJx+Gp%;xgwtTs6 z`*6ki-v{=-|9_Tug-Ue6{rTsgv0ce4NYCGYgm*>G!m|fs1>=(%X6fu*AKv=?nV?R8 zLgBL?ZlSXm?|yW?gHem~^S|j8EZoo7pvEHEfSozdtJTHHcBHP)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<#0m)&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 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>-OxPuwmh!*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>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, "Initiating restart of atmosphere. The server may lag a bit.") sleep(10) @@ -50,3 +53,4 @@ to_chat(usr, "\[5/5\] - ZAS Rebooted") to_chat(world, "Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") + 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 [e.file], line [e.line]: [html_encode(e.name)] [error_entry.make_link(viewtext)]") + //log_admin("Runtime in [e.file], line [e.line]: [html_encode(e.name)] [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 wrenched 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, "The sudden rush of air knocks you over!") - 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 ? "[active_edges.len]" : "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 ? "[active_edges.len]" : "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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
dau1T>pHSbg1I4>PP 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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 opened by [key_name(usr)], starting a transfer into \the [holding || "air"].
" 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 ? "[active_edges.len]" : "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 ? "[active_edges.len]" : "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 = "N2O" @@ -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 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#H!Q}a@bGLx0KI8!o)|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+AtAxzUk4zay~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(TPBFWVnOL=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*0ZukfWZ6?^_6J1Q0l z-ar+z2%vFDQ+bHVOsS{q-dUWKPw*8&h3_Wv3cs2u{fjQ&HvkctdBagPlTvz+u?c(r zyk&q4U9N^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("[user] [attack_verb] open the [src]!") + else + user.visible_message("[user] [attack_verb] at [src]!") + + +/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, "The inflatable wall is too torn to be inflated!") + 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, "The inflatable door is too torn to be inflated!") + 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 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 SKYzp!ekvqrT;qy^asLgDgdF8^DTU$vq~7m&T^ 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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("[user] [attack_verb] open the [src]!") @@ -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 = "O2" 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 = "H2O" 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 = "SO2" @@ -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, "You feel [warning_message].") + + 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 ? "[active_edges.len]" : "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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 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, "You are pinned against [A] by airflow!") - 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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("\The [src] slams into \a [A]!",1,"You hear a loud slam!",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("[src] slams into [A]!",1,"You hear a loud slam!",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, "You are pinned against [A] by airflow!") - 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 += "Cold loop
" t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
" + t += "Pressure Inlet: [round(cold_circ_air2.returnPressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.returnPressure(), 0.1)] kPa
" t += "Hot loop
" t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" + t += "Pressure Inlet: [round(hot_circ_air2.returnPressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.returnPressure(), 0.1)] kPa
" t += "" 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, "You feel a burning sensation in your chest") @@ -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 = {"Name: [chassis.name]
Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
- Airtank: [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa
+ Airtank: [chassis.internal_tank ? "[round(chassis.returnPressure(), 0.01)]" : "Not Equipped"] kPa
Pilot: [chassis.return_drivers() || "None"]
Location: [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 = "O2" symbol = "O2" - + purchaseable = TRUE /datum/xgm_gas/nitrogen id = GAS_NITROGEN @@ -15,6 +15,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N2" symbol = "N2" + purchaseable = TRUE /datum/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -23,6 +24,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "CO2" 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 = "O2" symbol = "O2" purchaseable = TRUE + base_value = 0.2 /datum/xgm_gas/nitrogen id = GAS_NITROGEN @@ -16,6 +17,7 @@ symbol_html = "N2" symbol = "N2" purchaseable = TRUE + base_value = 0.1 /datum/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -25,6 +27,7 @@ symbol_html = "CO2" 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 = "N2O" 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 = "N2O" 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 = "N2O" 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 ( @@ -70,10 +65,7 @@ export const AtmosControlConsole = (props, context) => { }> {!!selectedChamber && !!selectedChamber.gasmix ? ( + gasmix={selectedChamber.gasmix} /> ) : ( {'No Sensors Detected!'} )} @@ -171,7 +163,6 @@ export const AtmosControlConsole = (props, context) => { )} - ); 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'} - {detailedReactions ? ( - reactions.map((reaction) => ( - - ) : (reaction[1]) - }> - {reaction[2]} - - )) - ) : ( - - {reactions.length - ? reactions.map((reaction) => - reactionOnClick ? ( - -