diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 77f195b9c79..55acfd5c3d3 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -20,9 +20,7 @@ Pipelines + Other Objects -> Pipe network
var/initialize_directions = 0
var/pipe_color
var/obj/item/pipe/stored
-
var/welded = 0 //Used on pumps and scrubbers
-
var/global/list/iconsetids = list()
var/global/list/pipeimages = list()
@@ -36,11 +34,27 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/New()
..()
-
+ SSair.atmos_machinery += src
SetInitDirections()
if(can_unwrench)
stored = new(src, make_from=src)
+/obj/machinery/atmospherics/Destroy()
+ SSair.atmos_machinery -= src
+ if (stored)
+ qdel(stored)
+ stored = null
+ ..()
+
+//this is called just after the air controller sets up turfs
+/obj/machinery/atmospherics/proc/atmosinit()
+ return
+
+//object initializion. done well after air is setup (build_network needs all pipes to be init'ed with atmosinit before hand)
+/obj/machinery/atmospherics/initialize()
+ ..()
+ build_network() //make sure to build our pipe nets
+
/obj/machinery/atmospherics/proc/SetInitDirections()
return
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index a869677a1c4..0fb64c3b1c4 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -74,7 +74,7 @@
nullifyPipenet(parent2)
..()
-/obj/machinery/atmospherics/binary/initialize()
+/obj/machinery/atmospherics/binary/atmosinit()
var/node2_connect = dir
var/node1_connect = turn(dir, 180)
@@ -93,6 +93,7 @@
showpipe = 1
update_icon()
+ ..()
/obj/machinery/atmospherics/binary/construction()
..()
diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
index 675590c6796..0d93a55d0ad 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
@@ -50,7 +50,7 @@
else
last_pressure_delta = 0
-/obj/machinery/atmospherics/binary/circulator/process()
+/obj/machinery/atmospherics/binary/circulator/process_atmos()
..()
update_icon()
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 81874319732..496d11b61ff 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -53,7 +53,7 @@
else
icon_state = "vent_in"
-/obj/machinery/atmospherics/binary/dp_vent_pump/process()
+/obj/machinery/atmospherics/binary/dp_vent_pump/process_atmos()
..()
if(!on)
@@ -133,11 +133,15 @@
return 1
-/obj/machinery/atmospherics/binary/dp_vent_pump/initialize()
+/obj/machinery/atmospherics/binary/dp_vent_pump/atmosinit()
..()
if(frequency)
set_frequency(frequency)
+/obj/machinery/atmospherics/binary/dp_vent_pump/initialize()
+ ..()
+ broadcast_status()
+
/obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index ba6c6e60bfd..c9429803684 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -32,7 +32,7 @@ Passive gate is similar to the regular pump except:
if(on & !(stat & NOPOWER))
overlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', "passgate_on")
-/obj/machinery/atmospherics/binary/passive_gate/process()
+/obj/machinery/atmospherics/binary/passive_gate/process_atmos()
..()
if(!on)
return 0
@@ -108,7 +108,7 @@ Passive gate is similar to the regular pump except:
else
ui.push_data(data)
-/obj/machinery/atmospherics/binary/passive_gate/initialize()
+/obj/machinery/atmospherics/binary/passive_gate/atmosinit()
..()
if(frequency)
set_frequency(frequency)
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index e1069c9f1ae..85c5f1cf903 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -41,7 +41,7 @@ Thus, the two variables affect pump operation are set in New():
icon_state = "pump_[on?"on":"off"]"
-/obj/machinery/atmospherics/binary/pump/process()
+/obj/machinery/atmospherics/binary/pump/process_atmos()
// ..()
if(stat & (NOPOWER|BROKEN))
return 0
@@ -116,7 +116,7 @@ Thus, the two variables affect pump operation are set in New():
else
ui.push_data(data)
-/obj/machinery/atmospherics/binary/pump/initialize()
+/obj/machinery/atmospherics/binary/pump/atmosinit()
..()
if(frequency)
set_frequency(frequency)
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 9d66f6c88bd..be8fbdc6ab0 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -41,7 +41,7 @@ Thus, the two variables affect pump operation are set in New():
icon_state = "volpump_[on?"on":"off"]"
-/obj/machinery/atmospherics/binary/volume_pump/process()
+/obj/machinery/atmospherics/binary/volume_pump/process_atmos()
// ..()
if(stat & (NOPOWER|BROKEN))
return
@@ -112,7 +112,7 @@ Thus, the two variables affect pump operation are set in New():
else
ui.push_data(data)
-/obj/machinery/atmospherics/binary/volume_pump/initialize()
+/obj/machinery/atmospherics/binary/volume_pump/atmosinit()
..()
set_frequency(frequency)
diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm
index 4f9a62ea92d..b506bf17071 100644
--- a/code/ATMOSPHERICS/components/portables_connector.dm
+++ b/code/ATMOSPHERICS/components/portables_connector.dm
@@ -24,7 +24,7 @@
state = "pipe_exposed"
underlays += getpipeimage('icons/obj/atmospherics/binary_devices.dmi', state, initialize_directions, col)
-/obj/machinery/atmospherics/unary/portables_connector/process()
+/obj/machinery/atmospherics/unary/portables_connector/process_atmos()
if(!connected_device)
return
parent.update = 1
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 985904f3bcd..7efeee86379 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -69,7 +69,7 @@ Filter types:
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/trinary/filter/process()
+/obj/machinery/atmospherics/trinary/filter/process_atmos()
..()
if(!on)
return 0
@@ -143,7 +143,7 @@ Filter types:
return 1
-/obj/machinery/atmospherics/trinary/filter/initialize()
+/obj/machinery/atmospherics/trinary/filter/atmosinit()
set_frequency(frequency)
return ..()
@@ -216,4 +216,4 @@ Filter types:
if ((M.client && M.machine == src))
src.attack_hand(M)
*/
- return
\ No newline at end of file
+ return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 8726dac92da..e80c0c7654b 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -40,7 +40,7 @@
..()
air3.volume = 300
-/obj/machinery/atmospherics/trinary/mixer/process()
+/obj/machinery/atmospherics/trinary/mixer/process_atmos()
..()
if(!on)
return 0
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index 0db4482b153..c0faefa71d6 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -94,7 +94,7 @@ Housekeeping and pipe network stuff below
nullifyPipenet(parent3)
..()
-/obj/machinery/atmospherics/trinary/initialize()
+/obj/machinery/atmospherics/trinary/atmosinit()
//Mixer:
//1 and 2 is input
@@ -131,6 +131,7 @@ Housekeeping and pipe network stuff below
break
update_icon()
+ ..()
/obj/machinery/atmospherics/trinary/construction()
..()
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index dd518949b65..23f54001d7f 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -22,7 +22,7 @@
return
-/obj/machinery/atmospherics/unary/cold_sink/process()
+/obj/machinery/atmospherics/unary/cold_sink/process_atmos()
..()
if(!on)
return 0
diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
index 1c85c1c2049..61a35798bbd 100644
--- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
@@ -20,7 +20,7 @@
return
-/obj/machinery/atmospherics/unary/heat_exchanger/initialize()
+/obj/machinery/atmospherics/unary/heat_exchanger/atmosinit()
if(!partner)
var/partner_connect = turn(dir,180)
@@ -32,7 +32,7 @@
..()
-/obj/machinery/atmospherics/unary/heat_exchanger/process()
+/obj/machinery/atmospherics/unary/heat_exchanger/process_atmos()
..()
if(!partner)
return 0
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index 88e7e22e967..e24457b54ef 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -24,7 +24,7 @@
return
-/obj/machinery/atmospherics/unary/heat_reservoir/process()
+/obj/machinery/atmospherics/unary/heat_reservoir/process_atmos()
..()
if(!on)
return 0
diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index 226c5dbc365..523c42439a0 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -38,7 +38,7 @@
update_icon()
-/obj/machinery/atmospherics/unary/outlet_injector/process()
+/obj/machinery/atmospherics/unary/outlet_injector/process_atmos()
..()
injecting = 0
@@ -101,12 +101,14 @@
return 1
-/obj/machinery/atmospherics/unary/outlet_injector/initialize()
+/obj/machinery/atmospherics/unary/outlet_injector/atmosinit()
+ set_frequency(frequency)
..()
- set_frequency(frequency)
- spawn(rand(25,50))
- broadcast_status()
+/obj/machinery/atmospherics/unary/outlet_injector/initialize()
+ ..()
+ broadcast_status()
+
/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
index 0103a1966cd..75e71181778 100644
--- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
+++ b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
@@ -28,7 +28,7 @@
air_contents.volume = 50
-/obj/machinery/atmospherics/unary/oxygen_generator/process()
+/obj/machinery/atmospherics/unary/oxygen_generator/process_atmos()
..()
if(!on)
return 0
diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm
index 5c3286df0cf..ed6f483cd47 100644
--- a/code/ATMOSPHERICS/components/unary/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary/unary_base.dm
@@ -60,7 +60,7 @@ Housekeeping and pipe network stuff below
..()
-/obj/machinery/atmospherics/unary/initialize()
+/obj/machinery/atmospherics/unary/atmosinit()
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
node = target
@@ -68,6 +68,7 @@ Housekeeping and pipe network stuff below
if(level == 2)
showpipe = 1
update_icon()
+ ..()
/obj/machinery/atmospherics/unary/construction()
..()
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 17076ed8694..e573ba60528 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -84,7 +84,7 @@
else
icon_state = "vent_in"
-/obj/machinery/atmospherics/unary/vent_pump/process()
+/obj/machinery/atmospherics/unary/vent_pump/process_atmos()
..()
if(stat & (NOPOWER|BROKEN))
return
@@ -181,14 +181,16 @@
return 1
-/obj/machinery/atmospherics/unary/vent_pump/initialize()
- ..()
-
+/obj/machinery/atmospherics/unary/vent_pump/atmosinit()
//some vents work his own spesial way
radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
+ ..()
+/obj/machinery/atmospherics/unary/vent_pump/initialize()
+ ..()
+ broadcast_status()
/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index f9ccca6c829..a6fe9999dca 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -98,14 +98,18 @@
return 1
-/obj/machinery/atmospherics/unary/vent_scrubber/initialize()
- ..()
+/obj/machinery/atmospherics/unary/vent_scrubber/atmosinit()
radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null
if (frequency)
set_frequency(frequency)
+ ..()
+/obj/machinery/atmospherics/unary/vent_scrubber/initialize()
+ ..()
+ broadcast_status()
-/obj/machinery/atmospherics/unary/vent_scrubber/process()
+
+/obj/machinery/atmospherics/unary/vent_scrubber/process_atmos()
..()
if(stat & (NOPOWER|BROKEN))
return
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index 25ee7f8c956..eb11358a81f 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -38,6 +38,7 @@
update_icon_nopipes()
parent1.update = 0
parent2.update = 0
+ parent1.reconcile_air()
investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", "atmos")
return
@@ -64,7 +65,7 @@
close()
else
open()
- parent1.reconcile_air()
+
/obj/machinery/atmospherics/binary/valve/digital // can be controlled by AI
name = "digital valve"
diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index d09df8ed19e..f2c7f6b5f8e 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -10,10 +10,10 @@
var/alert_pressure = 0
/datum/pipeline/New()
- SSpipe.networks += src
+ SSair.networks += src
/datum/pipeline/Destroy()
- SSpipe.networks -= src
+ SSair.networks -= src
if(air && air.volume)
temporarily_store_air()
for(var/obj/machinery/atmospherics/pipe/P in members)
@@ -22,10 +22,11 @@
A.nullifyPipenet(src)
..()
-/datum/pipeline/process()//This use to be called called from the pipe networks
+/datum/pipeline/process()
if(update)
update = 0
reconcile_air()
+
return
/*
//Check to see if pressure is within acceptable limits
diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm
index 678ef6660c0..8b264a7db2a 100644
--- a/code/ATMOSPHERICS/he_pipes.dm
+++ b/code/ATMOSPHERICS/he_pipes.dm
@@ -36,7 +36,7 @@
if(SOUTHWEST)
initialize_directions_he = SOUTH|WEST
-/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize()
+/obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmosinit()
normalize_dir()
var/N = 2
for(var/D in cardinal)
@@ -51,8 +51,9 @@
node2 = target
break
update_icon()
+ ..()
-/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
+/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process_atmos()
var/environment_temperature = 0
var/datum/gas_mixture/pipe_air = return_air()
@@ -69,15 +70,18 @@
parent.temperature_interact(loc, volume, thermal_conductivity)
- //Burn any mobs buckled to ourselves based on our temperature
+ //heatup/cooldown any mobs buckled to ourselves based on our temperature
if(buckled_mob)
var/hc = pipe_air.heat_capacity()
var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500)
pipe_air.temperature = avg_temp
buckled_mob.bodytemperature = avg_temp
+/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
+ var/datum/gas_mixture/pipe_air = return_air()
+ //Burn any mobs buckled to ourselves based on our temperature
+ if(buckled_mob)
var/heat_limit = 1000
-
if(pipe_air.temperature > heat_limit + 1)
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest")
@@ -131,7 +135,7 @@
var/have_node2 = node2?1:0
icon_state = "exposed[have_node1][have_node2]"
-/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize()
+/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/atmosinit()
for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions))
if(target.initialize_directions & get_dir(target,src))
node1 = target
@@ -141,4 +145,4 @@
node2 = target
break
update_icon()
- return
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index a11c06a97a3..8b80ff0b044 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -38,7 +38,7 @@
if(WEST)
initialize_directions = NORTH|EAST|SOUTH
-/obj/machinery/atmospherics/pipe/manifold/initialize()
+/obj/machinery/atmospherics/pipe/manifold/atmosinit()
for(var/D in cardinal)
if(D == dir)
continue
@@ -54,6 +54,7 @@
var/turf/T = src.loc // hide if turf is not intact
hide(T.intact)
update_icon()
+ ..()
/obj/machinery/atmospherics/pipe/manifold/Destroy()
if(node1)
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm
index b1e8844c230..3a5ff5c735a 100644
--- a/code/ATMOSPHERICS/pipes/manifold4w.dm
+++ b/code/ATMOSPHERICS/pipes/manifold4w.dm
@@ -28,7 +28,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/SetInitDirections()
return
-/obj/machinery/atmospherics/pipe/manifold4w/initialize()
+/obj/machinery/atmospherics/pipe/manifold4w/atmosinit()
for(var/D in cardinal)
for(var/obj/machinery/atmospherics/target in get_step(src, D))
if(target.initialize_directions & get_dir(target,src))
@@ -45,6 +45,7 @@
var/turf/T = src.loc // hide if turf is not intact
hide(T.intact)
update_icon()
+ ..()
/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated))
diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm
index 3ce6e094a79..ccd3e147980 100644
--- a/code/ATMOSPHERICS/pipes/simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple.dm
@@ -53,7 +53,7 @@ The regular pipe you see everywhere, including bent ones.
if(SOUTHWEST)
initialize_directions = SOUTH|WEST
-/obj/machinery/atmospherics/pipe/simple/initialize()
+/obj/machinery/atmospherics/pipe/simple/atmosinit()
normalize_dir()
var/N = 2
for(var/D in cardinal)
@@ -70,6 +70,7 @@ The regular pipe you see everywhere, including bent ones.
var/turf/T = loc // hide if turf is not intact
hide(T.intact)
update_icon()
+ ..()
/obj/machinery/atmospherics/pipe/simple/Destroy()
if(node1)
diff --git a/code/ATMOSPHERICS/pipes/vent.dm b/code/ATMOSPHERICS/pipes/vent.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index a8e338695bf..8570657c508 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -30,7 +30,7 @@
if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5)
return 0
- active_hotspot = new(src)
+ active_hotspot = PoolOrNew(/obj/effect/hotspot, src)
active_hotspot.temperature = exposed_temperature
active_hotspot.volume = exposed_volume
@@ -142,16 +142,17 @@
// Garbage collect itself by nulling reference to it
/obj/effect/hotspot/proc/Kill()
- SSair.hotspots -= src
- DestroyTurf()
- qdel(src)
+ PlaceInPool(src)
/obj/effect/hotspot/Destroy()
+ SSair.hotspots -= src
+ DestroyTurf()
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.active_hotspot == src)
T.active_hotspot = null
loc = null
+ return QDEL_HINT_PUTINPOOL
/obj/effect/hotspot/proc/DestroyTurf()
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index f5d7d5fd1c0..d0abe20a58a 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -66,7 +66,7 @@ turf/simulated/New()
turf/simulated/Del()
if(active_hotspot)
- qdel(active_hotspot)
+ active_hotspot.Kill()
..()
turf/simulated/assume_air(datum/gas_mixture/giver)
@@ -274,11 +274,11 @@ atom/movable/var/pressure_resistance = 5
atom/movable/var/last_forced_movement = 0
atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
- if(last_forced_movement >= SSair.times_fired)
+ if(last_forced_movement >= world.time-10)
return 0
else if(!anchored)
if(pressure_difference > pressure_resistance)
- last_forced_movement = SSair.times_fired
+ last_forced_movement = world.time
spawn step(src, direction)
return 1
diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm
new file mode 100644
index 00000000000..feb949b3241
--- /dev/null
+++ b/code/__DEFINES/qdel.dm
@@ -0,0 +1,10 @@
+//defines that give qdel hints. these can be given as a return in destory() or by calling
+
+
+#define QDEL_HINT_QUEUE 0 //qdel should queue the object for deletion.
+#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory.
+#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
+#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference.
+#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
+#define QDEL_HINT_PUTINPOOL 5 //qdel will put this object in the atom pool.
+
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index fbde37f1d94..30350b2e9c2 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -200,5 +200,4 @@ Reharging stations are available in robotics, the dormitory's bathrooms. and the
return usr.client.Click(master, location, control, params)
/obj/screen/alert/Destroy()
- PlaceInPool(src)
- return 1 // Don't destroy me, I have a family!
\ No newline at end of file
+ return QDEL_HINT_PUTINPOOL //Don't destroy me, I have a family!
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index cd9aced630c..5cff548b620 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -23,22 +23,31 @@ var/global/datum/controller/game_controller/master_controller = new()
init_subtypes(/datum/subsystem, subsystems)
master_controller = src
+ calculateGCD()
+
/*
calculate the longest number of ticks the MC can wait between each cycle without causing subsystems to not fire on schedule
-Note: you can set the datum's defined processing_interval to some integer to set an -absolute- minimum wait duration.
*/
+/datum/controller/game_controller/proc/calculateGCD()
var/GCD
for(var/datum/subsystem/SS in subsystems)
if(SS.wait)
- GCD = Gcd(SS.wait, GCD)
+ GCD = Gcd(round(SS.wait*10), GCD)
GCD = round(GCD)
- if(GCD > processing_interval)
- processing_interval = GCD
+ if(GCD < world.tick_lag*10)
+ GCD = world.tick_lag*10
+ processing_interval = GCD/10
-/datum/controller/game_controller/proc/setup()
+/datum/controller/game_controller/proc/setup(zlevel)
+ if (zlevel && zlevel > 0 && zlevel <= world.maxz)
+ for(var/datum/subsystem/S in subsystems)
+ S.Initialize(world.timeofday, zlevel)
+ sleep(-1)
+ return
world << "Initializing Subsystems..."
+
//sort subsystems by priority, so they initialize in the correct order
sortTim(subsystems, /proc/cmp_subsystem_priority)
@@ -49,7 +58,7 @@ Note: you can set the datum's defined processing_interval to some integer to set
//Eventually all this other setup stuff should be contained in subsystems and done in subsystem.Initialize()
for(var/datum/subsystem/S in subsystems)
- S.Initialize(world.timeofday)
+ S.Initialize(world.timeofday, zlevel)
sleep(-1)
world << "Initializations complete"
@@ -74,7 +83,6 @@ Note: you can set the datum's defined processing_interval to some integer to set
SS.next_fire = timer
var/start_time
- var/cpu
while(1) //far more efficient than recursively calling ourself
if(processing_interval > 0)
@@ -85,16 +93,19 @@ Note: you can set the datum's defined processing_interval to some integer to set
for(var/datum/subsystem/SS in subsystems)
if(SS.can_fire > 0)
if(SS.next_fire <= world.time)
- SS.next_fire += SS.wait
-
timer = world.timeofday
- cpu = world.cpu
last_thing_processed = SS.type
SS.last_fire = world.time
SS.fire()
- SS.cpu = MC_AVERAGE(SS.cpu, world.cpu - cpu)
SS.cost = MC_AVERAGE(SS.cost, world.timeofday - timer)
+ if (SS.dynamic_wait)
+ var/oldwait = SS.wait
+ SS.wait = min(max(round(SS.cost*SS.dwait_delta, 0.1),SS.dwait_lower),SS.dwait_upper)
+ if (oldwait != SS.wait)
+ calculateGCD()
+ SS.next_fire += SS.wait
++SS.times_fired
+
sleep(-1)
cost = MC_AVERAGE(cost, world.timeofday - start_time)
@@ -108,7 +119,7 @@ Note: you can set the datum's defined processing_interval to some integer to set
/datum/controller/game_controller/proc/roundHasStarted()
for(var/datum/subsystem/SS in subsystems)
SS.can_fire = 1
- SS.next_fire = world.time
+ SS.next_fire = world.time + rand(0,SS.wait)
/datum/controller/game_controller/proc/Recover()
var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n"
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 19c086efa23..5c74da6d84d 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -3,12 +3,19 @@ var/datum/subsystem/air/SSair
/datum/subsystem/air
name = "Air"
priority = 20
+ cost = 5
+ wait = 5
+ dynamic_wait = 1
+ dwait_lower = 5
+ dwait_upper = 50
var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
var/cost_hotspots = 0
var/cost_superconductivity = 0
+ var/cost_pipenets = 0
+ var/cost_atmos_machinery = 0
var/obj/effect/overlay/plasma_overlay //overlay for plasma
var/obj/effect/overlay/sleeptoxin_overlay //overlay for sleeptoxin
@@ -16,6 +23,9 @@ var/datum/subsystem/air/SSair
var/list/excited_groups = list()
var/list/active_turfs = list()
var/list/hotspots = list()
+ var/list/networks = list()
+ var/list/obj/machinery/atmos_machinery = list()
+
//Special functions lists
var/list/turf/simulated/active_super_conductivity = list()
@@ -28,14 +38,39 @@ var/datum/subsystem/air/SSair
plasma_overlay = new /obj/effect/overlay{icon='icons/effects/tile_effects.dmi';mouse_opacity=0;layer=5;icon_state="plasma"}()
sleeptoxin_overlay = new /obj/effect/overlay{icon='icons/effects/tile_effects.dmi';mouse_opacity=0;layer=5;icon_state="sleeping_agent"}()
+/datum/subsystem/air/stat_entry(msg)
+ msg += "C:{"
+ msg += "AT:[round(cost_turfs,0.01)]|"
+ msg += "EG:[round(cost_groups,0.01)]|"
+ msg += "HP:[round(cost_highpressure,0.01)]|"
+ msg += "HS:[round(cost_hotspots,0.01)]|"
+ msg += "SC:[round(cost_superconductivity,0.01)]|"
+ msg += "PN:[round(cost_pipenets,0.01)]|"
+ msg += "AM:[round(cost_atmos_machinery,0.01)]"
+ msg += "} "
+ msg += "AT:[active_turfs.len]|"
+ msg += "EG:[excited_groups.len]|"
+ msg += "HS:[hotspots.len]|"
+ msg += "AS:[active_super_conductivity.len]"
+ ..(msg)
-/datum/subsystem/air/Initialize()
- setup_allturfs()
+
+/datum/subsystem/air/Initialize(timeofday, zlevel)
+ setup_allturfs(zlevel)
+ setup_atmos_machinery(zlevel)
..()
#define MC_AVERAGE(average, current) (0.8*(average) + 0.2*(current))
/datum/subsystem/air/fire()
var/timer = world.timeofday
+ process_pipenets()
+ cost_pipenets = MC_AVERAGE(cost_pipenets, (world.timeofday - timer))
+
+ timer = world.timeofday
+ process_atmos_machinery()
+ cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, (world.timeofday - timer))
+
+ timer = world.timeofday
process_active_turfs()
cost_turfs = MC_AVERAGE(cost_turfs, (world.timeofday - timer))
@@ -55,9 +90,29 @@ var/datum/subsystem/air/SSair
process_super_conductivity()
cost_superconductivity = MC_AVERAGE(cost_superconductivity, (world.timeofday - timer))
+
#undef MC_AVERAGE
+
+/datum/subsystem/air/proc/process_pipenets()
+ var/i=1
+ for(var/thing in networks)
+ if(thing)
+ thing:process()
+ ++i
+ continue
+ networks.Cut(i, i+1)
+
+
+/datum/subsystem/air/proc/process_atmos_machinery()
+ var/seconds = wait * 0.1
+ for(var/obj/machinery/M in atmos_machinery)
+ if(M && (M.process_atmos(seconds) != PROCESS_KILL))
+ continue
+ atmos_machinery.Remove(M)
+
+
/datum/subsystem/air/proc/process_super_conductivity()
for(var/turf/simulated/T in active_super_conductivity)
T.super_conduct()
@@ -102,9 +157,26 @@ var/datum/subsystem/air/SSair
if(istype(S))
add_to_active(S)
+/datum/subsystem/air/proc/process_excited_groups()
+ for(var/datum/excited_group/EG in excited_groups)
+ EG.breakdown_cooldown ++
+ if(EG.breakdown_cooldown == 10)
+ EG.self_breakdown()
+ return
+ if(EG.breakdown_cooldown > 20)
+ EG.dismantle()
-/datum/subsystem/air/proc/setup_allturfs()
- for(var/turf/simulated/T in world)
+/datum/subsystem/air/proc/setup_allturfs(z_level)
+ var/z_start = 1
+ var/z_finish = world.maxz
+ if(1 <= z_level && z_level <= world.maxz)
+ z_level = round(z_level)
+ z_start = z_level
+ z_finish = z_level
+
+ var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
+
+ for(var/turf/simulated/T in turfs_to_init)
T.CalculateAdjacentTurfs()
if(!T.blocks_air)
if(T.air.check_tile_graphic())
@@ -124,11 +196,8 @@ var/datum/subsystem/air/SSair
T.excited = 1
active_turfs |= T
-/datum/subsystem/air/proc/process_excited_groups()
- for(var/datum/excited_group/EG in excited_groups)
- EG.breakdown_cooldown ++
- if(EG.breakdown_cooldown == 10)
- EG.self_breakdown()
- return
- if(EG.breakdown_cooldown > 20)
- EG.dismantle()
\ No newline at end of file
+/datum/subsystem/air/proc/setup_atmos_machinery(z_level)
+ for (var/obj/machinery/atmospherics/AM in atmos_machinery)
+ if (z_level && AM.z != z_level)
+ continue
+ AM.atmosinit()
\ No newline at end of file
diff --git a/code/controllers/subsystem/bots.dm b/code/controllers/subsystem/bots.dm
index 5b49ac0fc08..3a4d79d1cf3 100644
--- a/code/controllers/subsystem/bots.dm
+++ b/code/controllers/subsystem/bots.dm
@@ -9,6 +9,9 @@ var/datum/subsystem/bots/SSbot
/datum/subsystem/bots/New()
NEW_SS_GLOBAL(SSbot)
+/datum/subsystem/bots/stat_entry(msg)
+ ..("P:[processing.len]")
+
/datum/subsystem/bots/fire()
var/seconds = wait * 0.1
var/i=1
diff --git a/code/controllers/subsystem/diseases.dm b/code/controllers/subsystem/diseases.dm
index 1febced4242..d28785d947f 100644
--- a/code/controllers/subsystem/diseases.dm
+++ b/code/controllers/subsystem/diseases.dm
@@ -9,6 +9,8 @@ var/datum/subsystem/diseases/SSdisease
/datum/subsystem/diseases/New()
NEW_SS_GLOBAL(SSdisease)
+/datum/subsystem/diseases/stat_entry(msg)
+ ..("P:[processing.len]")
/datum/subsystem/diseases/fire()
var/i=1
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 929d2078bb2..e2dfe59a2eb 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -19,7 +19,9 @@ var/datum/subsystem/events/SSevent
NEW_SS_GLOBAL(SSevent)
-/datum/subsystem/events/Initialize()
+/datum/subsystem/events/Initialize(time, zlevel)
+ if (zlevel)
+ return ..()
for(var/type in typesof(/datum/round_event_control))
var/datum/round_event_control/E = new type()
if(!E.typepath)
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 6ebee701170..a99ac70899f 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -3,79 +3,122 @@ var/datum/subsystem/garbage_collector/SSgarbage
/datum/subsystem/garbage_collector
name = "Garbage"
can_fire = 1
- wait = 60
- priority = 21
+ wait = 5
+ priority = -1
- var/collection_timeout = 300 //deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
- var/max_checks_multiplier = 5 //multiplier (per-decisecond) for calculating max number of tests per SS tick. These tests check if our GC'd objects are actually GC'd
- var/max_forcedel_multiplier = 1 //multiplier (per-decisecond) for calculating max number of force del() calls per SS tick.
+ var/collection_timeout = 300// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
+ var/max_run_time = 2 // how long, in deciseconds, can we run before waiting for the next tick
+ var/delslasttick = 0 // number of del()'s we've done this tick
+ var/gcedlasttick = 0 // number of things that gc'ed last tick
+ var/totaldels = 0
+ var/totalgcs = 0
- var/dels = 0 // number of del()'s we've done this tick
- var/list/destroyed = list() // list of refID's of things that should be garbage collected
+ var/list/queue = list() // list of refID's of things that should be garbage collected
// refID's are associated with the time at which they time out and need to be manually del()
// we do this so we aren't constantly locating them and preventing them from being gc'd
- var/list/logging = list() // list of all types that have failed to GC associated with the number of times that's happened.
+
+ var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened.
// the types are stored as strings
+
/datum/subsystem/garbage_collector/New()
NEW_SS_GLOBAL(SSgarbage)
+/datum/subsystem/garbage_collector/stat_entry(msg)
+ msg += "Q:[queue.len]|D:[delslasttick]|G:[gcedlasttick]|"
+ msg += "GR:"
+ if (!(delslasttick+gcedlasttick))
+ msg += "n/a|"
+ else
+ msg += "[round((gcedlasttick/(delslasttick+gcedlasttick))*100, 0.01)]%|"
+
+ msg += "TD:[totaldels]|TG:[totalgcs]|"
+ if (!(totaldels+totalgcs))
+ msg += "n/a|"
+ else
+ msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%"
+ ..(msg)
+
/datum/subsystem/garbage_collector/fire()
- dels = 0
-
+ delslasttick = 0
+ gcedlasttick = 0
+ var/time_to_stop = world.timeofday + max_run_time
var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del()
- var/checkRemain = max_checks_multiplier * wait
- var/maxDels = max_forcedel_multiplier * wait
- while(destroyed.len && --checkRemain >= 0)
- if(dels >= maxDels)
-// testing("GC: Reached max force dels per tick [dels] vs [GC_FORCE_DEL_PER_TICK]")
- break // Server's already pretty pounded, everything else can wait 2 seconds
- var/refID = destroyed[1]
- var/GCd_at_time = destroyed[refID]
+
+ while(queue.len && world.timeofday < time_to_stop)
+ var/refID = queue[1]
+ if (!refID)
+ queue.Cut(1, 2)
+ continue
+
+ var/GCd_at_time = queue[refID]
if(GCd_at_time > time_to_kill)
-// testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + GC_COLLECTION_TIMEOUT]")
break // Everything else is newer, skip them
- var/atom/A = locate(refID)
-// testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]")
- if(A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake
- // Something's still referring to the qdel'd object. Kill it.
- testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --")
- logging["[A.type]"]++
+
+ var/atom/A
+ if (!istext(refID))
del(A)
- ++dels
-// else
-// testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]")
- destroyed.Cut(1, 2)
+ else
+ A = locate(refID)
+ if (A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake
+ // Something's still referring to the qdel'd object. Kill it.
+ testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --")
+ didntgc["[A.type]"]++
+ del(A)
+ ++delslasttick
+ ++totaldels
+ else
+ ++gcedlasttick
+ ++totalgcs
+
+ queue.Cut(1, 2)
-/datum/subsystem/garbage_collector/proc/AddTrash(datum/A)
- if(!istype(A) || !isnull(A.gc_destroyed))
+/datum/subsystem/garbage_collector/proc/Queue(datum/A, harddel = 0)
+ if (!istype(A) || !isnull(A.gc_destroyed))
return
-// testing("GC: AddTrash([A.type])")
A.gc_destroyed = world.time
- destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list.
- destroyed["\ref[A]"] = world.time
+ queue -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list.
+ queue["\ref[A]"] = world.time
+
+/datum/subsystem/garbage_collector/proc/HardQueue(datum/A, harddel = 0)
+ if (!istype(A) || !isnull(A.gc_destroyed))
+ return
+ A.gc_destroyed = world.time
+ queue -= A // Removing any previous references that were GC'd so that the current object will be at the end of the list.
+ queue[A] = world.time
// Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
/proc/qdel(var/datum/A)
- if(!A)
+ if (!A)
return
- if(!istype(A))
+ if (!istype(A))
//warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
del(A)
- SSgarbage.dels++
- else if(isnull(A.gc_destroyed))
+ else if (isnull(A.gc_destroyed))
// Let our friend know they're about to get fucked up.
- . = !A.Destroy()
- if(. && A)
- if(!isturf(A))
- SSgarbage.AddTrash(A)
- else
+ var/hint = A.Destroy()
+ if (!A)
+ return
+ switch (hint)
+ if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion.
+ SSgarbage.Queue(A)
+ if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory.
+ return
+ if (QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
+ return
+ if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate()
+ SSgarbage.HardQueue(A)
+ if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
del(A)
+ if (QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
+ PlaceInPool(A,0)
+ else
+ SSgarbage.Queue(A)
// Default implementation of clean-up code.
// This should be overridden to remove all references pointing to the object being destroyed.
@@ -83,7 +126,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
/datum/proc/Destroy()
//del(src)
tag = null
- return 0
+ return QDEL_HINT_QUEUE
/datum/var/gc_destroyed //Time when this object was destroyed.
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index a6ecefc1f02..9c99ca405a0 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -13,7 +13,9 @@ var/datum/subsystem/job/SSjob
NEW_SS_GLOBAL(SSjob)
-/datum/subsystem/job/Initialize()
+/datum/subsystem/job/Initialize(timeofday, zlevel)
+ if (zlevel)
+ return ..()
SetupOccupations()
LoadJobs("config/jobs.txt")
..()
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 0aacf50f5b6..c2a0c3df334 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -6,6 +6,7 @@ var/datum/subsystem/lighting/SSlighting
name = "Lighting"
wait = 5
priority = 1
+ dynamic_wait = 1
var/list/changed_lights = list() //list of all datum/light_source that need updating
var/changed_lights_workload = 0 //stats on the largest number of lights (max changed_lights.len)
@@ -20,7 +21,7 @@ var/datum/subsystem/lighting/SSlighting
/datum/subsystem/lighting/stat_entry()
- stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) L:[round(changed_lights_workload,1)]/T:[round(changed_turfs_workload,1)]")
+ ..("L:[round(changed_lights_workload,1)]|T:[round(changed_turfs_workload,1)]")
//Workhorse of lighting. It cycles through each light that needs updating. It updates their
diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm
index 15976cf1b53..76e38207551 100644
--- a/code/controllers/subsystem/machines.dm
+++ b/code/controllers/subsystem/machines.dm
@@ -17,7 +17,7 @@ var/datum/subsystem/machines/SSmachine
/datum/subsystem/machines/stat_entry()
- stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%)\t[processing.len]")
+ ..("P:[processing.len]")
/datum/subsystem/machines/fire()
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index 064b8b2b5f5..9bae03b30a4 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -10,7 +10,7 @@ var/datum/subsystem/mobs/SSmob
/datum/subsystem/mobs/stat_entry()
- stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) [mob_list.len]")
+ ..("P:[mob_list.len]")
/datum/subsystem/mobs/fire()
diff --git a/code/controllers/subsystem/nanoUI.dm b/code/controllers/subsystem/nanoUI.dm
index e8452ce5054..017556248b5 100644
--- a/code/controllers/subsystem/nanoUI.dm
+++ b/code/controllers/subsystem/nanoUI.dm
@@ -30,11 +30,11 @@ var/datum/subsystem/nano/SSnano
//Ignore directories
if(copytext(filename, length(filename)) != "/")
if(fexists(path + filename))
- asset_files.Add(fcopy_rsc(path + filename))
+ asset_files.Add(fcopy_rsc(path + filename))
/datum/subsystem/nano/stat_entry()
- stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) [processing_uis.len]")
+ ..("P:[processing_uis.len]")
/datum/subsystem/nano/fire()
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 92fbccae6b6..55a11252c35 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -23,7 +23,7 @@ var/datum/subsystem/npcpool/SSbp
/datum/subsystem/npcpool/stat_entry()
- stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) (T:[botPool_l.len + botPool_l_non.len] | D: [needsDelegate.len] | A: [needsAssistant.len + needsHelp_non.len] | U: [canBeUsed.len + canBeUsed_non.len])")
+ ..("T:[botPool_l.len + botPool_l_non.len]|D:[needsDelegate.len]|A:[needsAssistant.len + needsHelp_non.len]|U:[canBeUsed.len + canBeUsed_non.len]")
/datum/subsystem/npcpool/fire()
@@ -40,7 +40,7 @@ var/datum/subsystem/npcpool/SSbp
for(var/obj/machinery/bot/check in botPool_l_non)
if(!check)
botPool_l_non.Cut(npcCount,npcCount+1)
-
+ continue
if(check.hacked)
needsHelp_non |= check
else if(check.frustration > 5) //average for most bots
@@ -53,9 +53,10 @@ var/datum/subsystem/npcpool/SSbp
//SNPC handling
for(var/mob/living/carbon/human/interactive/check in botPool_l)
- var/checkInRange = view(MAX_RANGE_FIND,check)
if(!check)
botPool_l.Cut(npcCount,npcCount+1)
+ continue
+ var/checkInRange = view(MAX_RANGE_FIND,check)
if(!(locate(check.TARGET) in checkInRange))
needsDelegate |= check
@@ -70,7 +71,11 @@ var/datum/subsystem/npcpool/SSbp
npcCount++
if(needsDelegate.len)
+ npcCount = 1 //reset the count
for(var/mob/living/carbon/human/interactive/check in needsDelegate)
+ if(!check)
+ needsDelegate.Cut(npcCount,npcCount+1)
+ continue
if(canBeUsed.len)
var/mob/living/carbon/human/interactive/candidate = pick(canBeUsed)
var/facCount = 0
@@ -87,9 +92,14 @@ var/datum/subsystem/npcpool/SSbp
needsDelegate -= check
canBeUsed -= candidate
candidate.eye_color = "red"
+ npcCount++
if(needsAssistant.len)
+ npcCount = 1 //reset the count
for(var/mob/living/carbon/human/interactive/check in needsAssistant)
+ if(!check)
+ needsAssistant.Cut(npcCount,npcCount+1)
+ continue
if(canBeUsed.len)
var/mob/living/carbon/human/interactive/candidate = pick(canBeUsed)
var/facCount = 0
@@ -106,11 +116,18 @@ var/datum/subsystem/npcpool/SSbp
needsAssistant -= check
canBeUsed -= candidate
candidate.eye_color = "yellow"
+ npcCount++
if(needsHelp_non.len)
+ npcCount = 1 //reset the count
for(var/obj/machinery/bot/B in needsHelp_non)
+ if (!B)
+ needsHelp_non.Cut(npcCount,npcCount+1)
+ continue
if(canBeUsed_non.len)
var/obj/machinery/bot/candidate = pick(canBeUsed_non)
candidate.call_bot(B,get_turf(B),FALSE)
canBeUsed_non -= B
needsHelp_non -= candidate
+ npcCount++
+
diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm
index 34104df2e0d..ccd49428120 100644
--- a/code/controllers/subsystem/objects.dm
+++ b/code/controllers/subsystem/objects.dm
@@ -13,16 +13,20 @@ var/datum/subsystem/objects/SSobj
/datum/subsystem/objects/New()
NEW_SS_GLOBAL(SSobj)
-/datum/subsystem/objects/Initialize()
+/datum/subsystem/objects/Initialize(timeofday, zlevel)
for(var/atom/movable/AM in world)
+ if (zlevel && AM.z != zlevel)
+ continue
AM.initialize()
+ if (zlevel)
+ return ..()
for(var/turf/simulated/floor/F in world)
F.MakeDirty()
..()
/datum/subsystem/objects/stat_entry()
- stat(name, "[round(cost,0.001)]ds\t(CPU:[round(cpu,1)]%)\t[processing.len]")
+ ..("P:[processing.len]")
/datum/subsystem/objects/fire()
@@ -35,12 +39,3 @@ var/datum/subsystem/objects/SSobj
SSobj.processing.Cut(i, i+1)
-/* This is FPSS13 code, has not yet been ported/implemented
-/obj/New()
- ..()
- if(map_ready)
- spawn(0)
- if(garbage_collecting)
- return
- initialize()
-*/
\ No newline at end of file
diff --git a/code/controllers/subsystem/pipenets.dm b/code/controllers/subsystem/pipenets.dm
deleted file mode 100644
index eb0c3fa5639..00000000000
--- a/code/controllers/subsystem/pipenets.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-var/datum/subsystem/pipenets/SSpipe
-
-/datum/subsystem/pipenets
- name = "Pipenets"
- priority = 11
-
- var/list/networks = list()
-
-/datum/subsystem/pipenets/New()
- NEW_SS_GLOBAL(SSpipe)
-
-/datum/subsystem/pipenets/Initialize()
- set background = BACKGROUND_ENABLED
-
- //is it possible to combine all these procs into initialize() ??
- for(var/obj/machinery/atmospherics/M in world)
- M.build_network()
-
- for(var/obj/machinery/atmospherics/unary/U in world)
- if(istype(U, /obj/machinery/atmospherics/unary/vent_pump))
- var/obj/machinery/atmospherics/unary/vent_pump/V = U
- V.broadcast_status()
- else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber))
- var/obj/machinery/atmospherics/unary/vent_scrubber/V = U
- V.broadcast_status()
-
- ..()
-
-/datum/subsystem/pipenets/fire()
- var/i=1
- for(var/thing in networks)
- if(thing)
- thing:process()
- ++i
- continue
- networks.Cut(i, i+1)
diff --git a/code/controllers/subsystem/power.dm b/code/controllers/subsystem/power.dm
index e48a6f465e8..65f6fc16430 100644
--- a/code/controllers/subsystem/power.dm
+++ b/code/controllers/subsystem/power.dm
@@ -9,10 +9,25 @@ var/datum/subsystem/power/SSpower
/datum/subsystem/power/New()
NEW_SS_GLOBAL(SSpower)
-/datum/subsystem/power/Initialize()
- makepowernets()
+/datum/subsystem/power/stat_entry(msg)
+ ..("P:[powernets.len]")
+
+/datum/subsystem/power/Initialize(timeofday, zlevel)
+ makepowernets(zlevel)
..()
+// rebuild all power networks from scratch - only called at world creation or by the admin verb
+/datum/subsystem/power/proc/makepowernets(zlevel)
+ for(var/datum/powernet/PN in powernets)
+ qdel(PN)
+ powernets.Cut()
+
+ for(var/obj/structure/cable/PC in cable_list)
+ if(!PC.powernet)
+ var/datum/powernet/NewPN = new()
+ NewPN.add_cable(PC)
+ propagate_network(PC,PC.powernet)
+
/datum/subsystem/power/fire()
for(var/datum/powernet/Powernet in powernets)
Powernet.reset()
\ No newline at end of file
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 53c501c11ff..6d04a0f9c71 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -39,7 +39,9 @@ var/datum/subsystem/shuttle/SSshuttle
NEW_SS_GLOBAL(SSshuttle)
-/datum/subsystem/shuttle/Initialize()
+/datum/subsystem/shuttle/Initialize(timeofday, zlevel)
+ if (zlevel)
+ return ..()
if(!emergency)
WARNING("No /obj/docking_port/mobile/emergency placed on the map!")
if(!supply)
diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm
index 8637aff5efd..d04b0369eed 100644
--- a/code/controllers/subsystem/sun.dm
+++ b/code/controllers/subsystem/sun.dm
@@ -19,6 +19,9 @@ var/datum/subsystem/sun/SSsun
if(prob(50)) // same chance to rotate clockwise than counter-clockwise
rate = -rate
+/datum/subsystem/sun/stat_entry(msg)
+ ..("P:[solars.len]")
+
/datum/subsystem/sun/fire()
angle = (360 + angle + rate * 6) % 360 // increase/decrease the angle to the sun, adjusted by the rate
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index e7aac1357b1..842837fbee7 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -51,7 +51,9 @@ var/datum/subsystem/ticker/ticker
if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
login_music = 'sound/ambience/clown.ogg'
-/datum/subsystem/ticker/Initialize()
+/datum/subsystem/ticker/Initialize(timeofday, zlevel)
+ if (zlevel)
+ return ..()
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
setupGenetics()
diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm
index 47eaadb43e5..4aac392f453 100644
--- a/code/controllers/subsystems.dm
+++ b/code/controllers/subsystems.dm
@@ -2,17 +2,20 @@
/datum/subsystem
//things you will want to define
- var/name //name of the subsystem
- var/priority = 0 //priority affects order of initialization. Higher priorities are initialized first, lower priorities later. Can be decimal and negative values.
- var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer.
+ var/name //name of the subsystem
+ var/priority = 0 //priority affects order of initialization. Higher priorities are initialized first, lower priorities later. Can be decimal and negative values.
+ var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer.
+ var/dynamic_wait = 0 //changes the wait based on the amount of time it took to process
+ var/dwait_upper = 20 //longest wait can be under dynamic_wait
+ var/dwait_lower = 5 //shortest wait can be under dynamic_wait
+ var/dwait_delta = 3 //How much should processing time effect dwait. or basically: wait = cost*dwait_delta
//things you will probably want to leave alone
- var/can_fire = 0 //prevent fire() calls
- var/last_fire = 0 //last world.time we called fire()
- var/next_fire = 0 //scheduled world.time for next fire()
- var/cpu = 0 //cpu-usage stats (somewhat vague)
- var/cost = 0 //average time to execute
- var/times_fired = 0 //number of times we have called fire()
+ var/can_fire = 0 //prevent fire() calls
+ var/last_fire = 0 //last world.time we called fire()
+ var/next_fire = 0 //scheduled world.time for next fire()
+ var/cost = 0 //average time to execute
+ var/times_fired = 0 //number of times we have called fire()
//used to initialize the subsystem BEFORE the map has loaded
/datum/subsystem/New()
@@ -25,15 +28,22 @@
can_fire = 0
//used to initialize the subsystem AFTER the map has loaded
-/datum/subsystem/proc/Initialize(start_timeofday)
+/datum/subsystem/proc/Initialize(start_timeofday, zlevel)
var/time = (world.timeofday - start_timeofday) / 10
var/msg = "Initialized [name] SubSystem within [time] seconds"
+ if (zlevel)
+ testing(msg)
+ return
world << "[msg]"
world.log << msg
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
-/datum/subsystem/proc/stat_entry()
- stat(name, "[round(cost,0.001)]ds\t(CPU:[round(cpu,1)]%)")
+/datum/subsystem/proc/stat_entry(msg)
+ var/dwait = ""
+ if (dynamic_wait)
+ dwait = "DWait:[wait]ds "
+
+ stat(name, "[round(cost,0.001)]ds\t[dwait][msg]")
//could be used to postpone a costly subsystem for one cycle
//for instance, during cpu intensive operations like explosions
diff --git a/code/datums/debug.dm b/code/datums/debug.dm
new file mode 100644
index 00000000000..28235903616
--- /dev/null
+++ b/code/datums/debug.dm
@@ -0,0 +1,2 @@
+/datum/debug
+ var/list/debuglist
\ No newline at end of file
diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm
deleted file mode 100644
index d54c5327ec5..00000000000
--- a/code/datums/mixed.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/datum/powernet
- var/list/cables = list() // all cables & junctions
- var/list/nodes = list() // all connected machines
-
- var/load = 0 // the current load on the powernet, increased by each machine at processing
- var/newavail = 0 // what available power was gathered last tick, then becomes...
- var/avail = 0 //...the current available power in the powernet
- var/viewload = 0 // the load as it appears on the power console (gradually updated)
- var/number = 0 // Unused //TODEL
- var/netexcess = 0 // excess power on the powernet (typically avail-load)
-
-/*Powernet procs :
-
-In modules/power/power.dm :
-
-/datum/powernet/New()
-/datum/powernet/Destroy()
-/datum/powernet/proc/is_empty()
-/datum/powernet/proc/remove_cable(var/obj/structure/cable/C)
-/datum/powernet/proc/add_cable(var/obj/structure/cable/C)
-/datum/powernet/proc/remove_machine(var/obj/machinery/power/M)
-/datum/powernet/proc/add_machine(var/obj/machinery/power/M)
-/datum/powernet/proc/reset()
-/datum/powernet/proc/get_electrocute_damage()
-
-
-*/
-
-/datum/debug
- var/list/debuglist
\ No newline at end of file
diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm
index 65205fc29f3..e8fbf90d805 100644
--- a/code/datums/spells/trigger.dm
+++ b/code/datums/spells/trigger.dm
@@ -12,10 +12,11 @@
var/spell_to_add = text2path(spell)
new spell_to_add(src) //should result in adding to contents, needs testing
-/obj/effect/proc_holder/spell/targeted/trigger/Destroy() //I think this entire proc is unnecessary but ok
+/obj/effect/proc_holder/spell/targeted/trigger/Destroy()
for(var/spell in contents)
qdel(spell)
-
+ linked_spells = null
+ starting_spells = null
..()
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 86f153923a5..41ebb2b02b2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -82,6 +82,11 @@
qdel(AM)
loc = null
invisibility = 101
+ if (pulledby)
+ if (pulledby.pulling == src)
+ pulledby.pulling = null
+ pulledby = null
+
// Previously known as HasEntered()
// This is automatically called when something enters your square
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 04508a5e2d0..7dcd49f1821 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -113,6 +113,7 @@
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
if(factory)
factory.spores -= src
+ factory = null
if(contents)
for(var/mob/M in contents)
M.loc = src.loc
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index b57568953fa..4988e1cedea 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -38,6 +38,7 @@
blob_cores -= src
if(overmind)
overmind.blob_core = null
+ overmind = null
SSobj.processing.Remove(src)
..()
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 872dafad212..3ab5874c176 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -17,6 +17,7 @@
for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores)
if(spore.factory == src)
spore.factory = null
+ spores = null
..()
/obj/effect/blob/factory/PulseAnimation(var/activate = 0)
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index e9d0eb6217c..a9e9bb233ae 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -192,7 +192,7 @@
var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B))
if(blobber)
- B.Destroy()
+ qdel(B)
blobber.color = blob_reagent_datum.color
blobber.overmind = src
blob_mobs.Add(blobber)
@@ -243,7 +243,7 @@
src << "Unable to remove this blob."
return
- B.Destroy()
+ qdel(B)
return
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 3364fe864a7..7c34125c02c 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -258,7 +258,7 @@ This is here to make the tiles around the station mininuke change when it's arme
var/turf/disk_loc = get_turf(src)
if(disk_loc.z > ZLEVEL_CENTCOM)
get(src, /mob) << "You can't help but feel that you just lost something back there..."
- Destroy()
+ qdel(src)
/obj/item/weapon/disk/nuclear/Destroy()
if(blobstart.len > 0)
@@ -267,7 +267,7 @@ This is here to make the tiles around the station mininuke change when it's arme
var/turf/diskturf = get_turf(src)
message_admins("[src] has been destroyed in ([diskturf.x], [diskturf.y] ,[diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).")
log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y] ,[diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
- del(src) //Needed to clear all references to it
+ return QDEL_HINT_HARDDEL_NOW
else
ERROR("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.")
- return 1 // Cancel destruction.
+ return QDEL_HINT_LETMELIVE // Cancel destruction.
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index 12ee237aa0d..26ded6705f1 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -23,6 +23,7 @@
/obj/machinery/bluespace_beacon/Destroy()
if(Beacon)
qdel(Beacon)
+ Beacon = null
..()
// update the invisibility and icon
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index c6c097368c8..66be318890e 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -113,6 +113,7 @@
..()
src.updateUsrDialog()
+
/obj/machinery/atmospherics/unary/cold_sink/freezer/power_change()
..()
if(stat & NOPOWER)
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 46230274a91..6020d4dad4d 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -29,7 +29,7 @@ obj/machinery/air_sensor
obj/machinery/air_sensor/update_icon()
icon_state = "gsensor[on]"
-obj/machinery/air_sensor/process()
+obj/machinery/air_sensor/process_atmos()
if(on)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
@@ -73,7 +73,7 @@ obj/machinery/air_sensor/initialize()
obj/machinery/air_sensor/New()
..()
-
+ SSair.atmos_machinery += src
if(radio_controller)
set_frequency(frequency)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index eea599dd0f0..1ee28a02cbf 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -18,6 +18,7 @@
var/release_log = ""
var/update_flag = 0
+
/obj/machinery/portable_atmospherics/canister/sleeping_agent
name = "canister: \[N2O\]"
icon_state = "redws"
@@ -123,6 +124,7 @@ update_flag
if (src.health <= 10)
var/atom/location = src.loc
location.assume_air(air_contents)
+ air_update_turf()
src.destroyed = 1
playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
@@ -138,9 +140,9 @@ update_flag
else
return 1
-/obj/machinery/portable_atmospherics/canister/process()
+/obj/machinery/portable_atmospherics/canister/process_atmos()
if (destroyed)
- return
+ return PROCESS_KILL
..()
@@ -174,9 +176,9 @@ update_flag
can_label = 1
else
can_label = 0
-
+/obj/machinery/portable_atmospherics/canister/process()
src.updateDialog()
- return
+ return ..()
/obj/machinery/portable_atmospherics/canister/return_air()
return air_contents
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 059464d70e9..d8ba823694b 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -14,6 +14,7 @@
/obj/machinery/meter/New()
..()
+ SSair.atmos_machinery += src
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
return 1
@@ -21,7 +22,7 @@
if (!target)
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
-/obj/machinery/meter/process()
+/obj/machinery/meter/process_atmos()
if(!target)
icon_state = "meterX"
return 0
@@ -114,6 +115,7 @@
return 1
// TURF METER - REPORTS A TILE'S AIR CONTENTS
+// why are you yelling?
/obj/machinery/meter/turf/New()
..()
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index b2dac4a8317..25a2aa88a2d 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -10,25 +10,26 @@
var/destroyed = 0
var/maximum_pressure = 90*ONE_ATMOSPHERE
+ var/lastupdate = 0
/obj/machinery/portable_atmospherics/New()
..()
-
+ SSair.atmos_machinery += src
air_contents.volume = volume
air_contents.temperature = T20C
-
return 1
-/obj/machinery/portable_atmospherics/process()
- if(!connected_port) //only react when pipe_network will ont it do it for you
+/obj/machinery/portable_atmospherics/process_atmos()
+ if(!connected_port) //only react when pipe_network will not it do it for you
//Allow for reactions
air_contents.react()
else
update_icon()
-
+/obj/machinery/portable_atmospherics/process()
+ return
/obj/machinery/portable_atmospherics/Destroy()
- del(air_contents)
-
+ qdel(air_contents)
+ SSair.atmos_machinery -= src
..()
/obj/machinery/portable_atmospherics/update_icon()
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 2b128e89f67..5f5519fa105 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -43,7 +43,7 @@
..(severity)
-/obj/machinery/portable_atmospherics/pump/process()
+/obj/machinery/portable_atmospherics/pump/process_atmos()
..()
if(on)
var/datum/gas_mixture/environment
@@ -85,7 +85,8 @@
air_contents.merge(removed)
//src.update_icon()
-
+/obj/machinery/portable_atmospherics/pump/process()
+ ..()
src.updateDialog()
return
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index d3a59024b15..52cd6e636db 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -89,7 +89,7 @@
return
-/obj/machinery/portable_atmospherics/scrubber/process()
+/obj/machinery/portable_atmospherics/scrubber/process_atmos()
..()
if(on)
@@ -139,10 +139,15 @@
environment.merge(removed)
else
loc.assume_air(removed)
- //src.update_icon()
+
+/obj/machinery/portable_atmospherics/scrubber/process_atmos()
+ ..()
src.updateDialog()
return
+
+
+
/obj/machinery/portable_atmospherics/scrubber/return_air()
return air_contents
diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm
index 1ce8af7c88c..26bd2cff6c1 100644
--- a/code/game/machinery/atmoalter/zvent.dm
+++ b/code/game/machinery/atmoalter/zvent.dm
@@ -9,7 +9,7 @@
var/on = 0
var/volume_rate = 800
-/obj/machinery/zvent/process()
+/obj/machinery/zvent/process_atmos()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
if (istype(loc,/turf/simulated)) //if we're not on a valid turf, forget it
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 9e33f0731db..cd6adb4f1e4 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -108,6 +108,8 @@
if(radio_controller)
radio_controller.remove_object(src,beacon_freq)
radio_controller.remove_object(src,control_freq)
+ qdel(Radio)
+ qdel(botcard)
..()
/obj/machinery/bot/proc/add_to_beacons() //Master radio control for bots. Must be placed in the bot's local New() to support map spawned bots.
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 851bf6e643f..68cb12834c7 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -25,7 +25,7 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+
/obj/machinery/atmospherics/unary/cryo_cell/construction()
..(dir,dir)
@@ -40,10 +40,19 @@
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
var/turf/T = loc
T.contents += contents
- var/obj/item/weapon/reagent_containers/glass/B = beaker
+
if(beaker)
- B.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
+ beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
+ beaker = null
..()
+/obj/machinery/atmospherics/unary/cryo_cell/process_atmos()
+ ..()
+ if(air_contents)
+ temperature_archived = air_contents.temperature
+ heat_gas_contents()
+ expel_gas()
+ if(abs(temperature_archived-air_contents.temperature) > 1)
+ parent.update = 1
/obj/machinery/atmospherics/unary/cryo_cell/process()
..()
@@ -54,19 +63,13 @@
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
if(!node || !is_operational())
return
+
if(!on)
updateDialog()
return
- if(air_contents)
- temperature_archived = air_contents.temperature
- heat_gas_contents()
- expel_gas()
-
- if(occupant)
- process_occupant()
- if(abs(temperature_archived-air_contents.temperature) > 1)
- parent.update = 1
+ if(air_contents && occupant)
+ process_occupant()
updateDialog()
return 1
diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm
index 5db76850d2d..0264ae95312 100644
--- a/code/game/machinery/doors/alarmlock.dm
+++ b/code/game/machinery/doors/alarmlock.dm
@@ -17,6 +17,7 @@
/obj/machinery/door/airlock/alarmlock/Destroy()
if(radio_controller)
radio_controller.remove_object(src,air_frequency)
+ air_connection = null
..()
/obj/machinery/door/airlock/alarmlock/initialize()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 93331e30e07..fc6dc1d20ab 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -22,9 +22,11 @@
density = 0
if(health == 0)
playsound(src, "shatter", 70, 1)
+ electronics = null
..()
+
/obj/machinery/door/window/proc/open_and_close()
open()
if(src.check_access(null))
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4949aa3024b..1755e4b2823 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -82,9 +82,12 @@ Class Procs:
Called by machine to assign a value to the uid variable.
process() 'game/machinery/machine.dm'
- Called by the 'master_controller' once per game tick for each machine that is listed in the 'machines' list.
+ Called by the 'machinery subsystem' once per machinery tick for each machine that is listed in its 'machines' list.
- is_operational()
+ process_atmos()
+ Called by the 'air subsystem' once per atmos tick for each machine that is listed in its 'atmos_machines' list.
+
+ is_operational()
Returns 0 if the machine is unpowered, broken or undergoing maintenance, something else if not
Compiled by Aygar
@@ -132,6 +135,9 @@ Class Procs:
/obj/machinery/process()//If you dont use process or power why are you here
return PROCESS_KILL
+/obj/machinery/proc/process_atmos()//If you dont use process why are you here
+ return PROCESS_KILL
+
/obj/machinery/emp_act(severity)
if(use_power && stat == 0)
use_power(7500/severity)
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 490280f4edc..41ebba50ddb 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -46,6 +46,7 @@
if(radio_controller)
radio_controller.remove_object(src, freq)
..()
+ center = null
// update the invisibility and icon
/obj/machinery/magnetic_module/hide(var/intact)
@@ -244,6 +245,8 @@
if(radio_controller)
radio_controller.remove_object(src, frequency)
..()
+ magnets = null
+ rpath = null
/obj/machinery/magnetic_controller/process()
if(magnets.len == 0 && autolink)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index d374dfb6480..cd04b4d4a43 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -184,6 +184,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/Destroy()
allCasters -= src
+ viewing_channel = null
+ photo = null
..()
/obj/machinery/newscaster/update_icon()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 714d70e0907..188190756d7 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -143,6 +143,7 @@
/obj/machinery/porta_turret/Destroy()
//deletes its own cover with it
qdel(cover)
+ cover = null
..()
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 9692acc5ca6..2e8aeeecb69 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -142,6 +142,7 @@
/obj/machinery/shieldgen/Destroy()
for(var/obj/machinery/shield/shield_tile in deployed_shields)
qdel(shield_tile)
+ deployed_shields = null
..()
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 0c31ede202a..68d59a62423 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -20,6 +20,11 @@
/obj/machinery/computer/teleporter/initialize()
link_power_station()
+/obj/machinery/computer/teleporter/Destroy()
+ if (power_station)
+ power_station.teleporter_console = null
+ power_station = null
+
/obj/machinery/computer/teleporter/proc/link_power_station()
if(power_station)
return
@@ -258,6 +263,11 @@
/obj/machinery/teleport/hub/initialize()
link_power_station()
+/obj/machinery/teleport/hub/Destroy()
+ if (power_station)
+ power_station.teleporter_hub = null
+ power_station = null
+
/obj/machinery/teleport/hub/RefreshParts()
var/A = 0
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
@@ -372,7 +382,12 @@
/obj/machinery/teleport/station/Destroy()
if(teleporter_hub)
+ teleporter_hub.power_station = null
teleporter_hub.update_icon()
+ teleporter_hub = null
+ if (teleporter_console)
+ teleporter_console.power_station = null
+ teleporter_console = null
..()
/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W, mob/user, params)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 75f81e40bb8..a2d76e96a5a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -82,6 +82,7 @@
coin = null
..()
+
/obj/machinery/vending/snack/Destroy()
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
S.loc = get_turf(src)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 52818f4c72a..15dadd6456d 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -23,6 +23,7 @@
/obj/mecha/combat/marauder/Destroy()
qdel(smoke_system)
+ smoke_system = null
..()
/obj/mecha/combat/marauder/seraph
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 6d62cbeebfb..9fdbd663d65 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -187,6 +187,7 @@
loc = null
for (var/obj/structure/alien/weeds/W in range(1,T))
W.updateWeedOverlays()
+ linked_node = null
..()
/obj/structure/alien/weeds/proc/Life()
diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm
index 4b51be4a825..5778ec117d5 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/Cleanable/aliens.dm
@@ -16,6 +16,7 @@
/obj/effect/decal/cleanable/xenoblood/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
+ viruses = null
..()
/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(var/list/directions)
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index f7b073c5fc7..c2054cf07a0 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -14,6 +14,7 @@
/obj/effect/decal/cleanable/blood/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
+ viruses = null
..()
/obj/effect/decal/cleanable/blood/New()
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index c6bb4c6a737..71d209de6a6 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -106,6 +106,7 @@
/obj/effect/decal/cleanable/vomit/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
+ viruses = null
..()
/obj/effect/decal/cleanable/tomato_smudge
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm
index 5f9eda868f6..d7710921b4e 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/Cleanable/robots.dm
@@ -58,6 +58,7 @@
/obj/effect/decal/cleanable/oil/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
+ viruses = null
..()
/obj/effect/decal/cleanable/oil/streak
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index e150828bc99..eb84812588f 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -15,8 +15,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/effect/Destroy()
..()
- PlaceInPool(src)
- return 1
+ return QDEL_HINT_PUTINPOOL
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index d8a4a1804a6..2d7cba31150 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -227,9 +227,9 @@
R.my_atom = chemholder
/datum/effect/effect/system/chem_smoke_spread/Destroy()
- PlaceInPool(chemholder)
chemholder = null
..()
+ return QDEL_HINT_PUTINPOOL
/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
if(n > 20)
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 05b07ef92b4..ae8595b7e96 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -83,6 +83,9 @@
start_landmarks_list += src
return 1
+/obj/effect/landmark/start/Destroy()
+ ..()
+ start_landmarks_list -= src
//Costume spawner landmarks
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index ded891ee6cd..780c9a58ab8 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -33,6 +33,7 @@
else if(istype(creator, /obj/item/weapon/gun/energy/wormhole_projector))
var/obj/item/weapon/gun/energy/wormhole_projector/P = creator
P.portal_destroyed(src)
+ creator = null
return ..()
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 45efaba9b5e..5257103ec88 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -103,7 +103,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(T)
if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density)
- new/obj/effect/hotspot(T) //Mostly for ambience!
+ PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience!
if(dist > 0)
T.ex_act(dist)
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index b1ab40cb28b..2be31698d51 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -26,6 +26,7 @@
H.med_hud_set_status()
spawn(0)
RemoveInfectionImages(affected_mob)
+ affected_mob = null
..()
/obj/item/body_egg/process()
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 64c7c3d270f..f4953c98812 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -49,7 +49,8 @@
qdel(expansion)
expansion = null
del(src)
-/* Easier to just call del() than this nonsense
+//Easier to just call del() than this nonsense
+// ya no, del() takes 0.8ds to run on avg. this takes less than 0.01
get_cameras()
for(var/cam_tag in bugged_cameras)
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
@@ -59,7 +60,7 @@
if(tracking)
tracking = null
..()
-*/
+
/obj/item/device/camera_bug/interact(var/mob/user = usr)
var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index f758904770d..f80ec37a5cf 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -25,8 +25,6 @@
return
/obj/item/stack/Destroy()
- if (is_cyborg)
- return // Not supposed to be destroyed
if (usr && usr.machine==src)
usr << browse(null, "window=stack")
src.loc = null
diff --git a/code/game/pooling/atom_pool.dm b/code/game/pooling/atom_pool.dm
index e35e80d4854..19bdbdf22b6 100644
--- a/code/game/pooling/atom_pool.dm
+++ b/code/game/pooling/atom_pool.dm
@@ -9,6 +9,17 @@ Creation/Deletion is laggy, so let's reduce reuse and recycle!
Locked to /atom/movable and it's subtypes due to Loc being a const var on /atom
but being read&write on /movable due to how they... move.
+Usage:
+
+To get a object, just called PoolOrNew(type, list of args to pass to New)
+
+To put a object back in the pool, call place in pool.
+This will call destroy on the object, set its loc to null,
+and reset all of its vars to their default
+
+You can override your object's destroy to return QDEL_HINT_PLACEINPOOL
+to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice)
+
*/
var/global/list/GlobalPool = list()
@@ -67,7 +78,7 @@ var/global/list/GlobalPool = list()
-/proc/PlaceInPool(var/atom/movable/AM)
+/proc/PlaceInPool(var/atom/movable/AM, destroy = 1)
if(!istype(AM))
return
@@ -79,7 +90,9 @@ var/global/list/GlobalPool = list()
GlobalPool[AM.type] |= AM
- AM.Destroy()
+ if (destroy)
+ AM.Destroy()
+
AM.ResetVars()
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 7b5c0627eac..07f5ad2b6a9 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -18,6 +18,8 @@
if(config)
if(config.starlight)
update_starlight()
+/turf/space/Destroy()
+ return QDEL_HINT_LETMELIVE
/turf/space/proc/update_starlight()
if(config)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 061a8db5665..424dcb2c80a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -28,6 +28,8 @@
for(var/atom/movable/AM in src)
Entered(AM)
return
+/turf/Destroy()
+ return QDEL_HINT_HARDDEL_NOW
// Adds the adjacent turfs to the current atmos processing
/turf/Del()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 0e489180a1e..6524d509250 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -581,7 +581,7 @@ var/global/floorIsLava = 0
set name="Start Now"
if(ticker.current_state == GAME_STATE_PREGAME)
ticker.can_fire = 1
- ticker.current_state = GAME_STATE_SETTING_UP
+ ticker.timeLeft = 0
log_admin("[usr.key] has started the game.")
message_admins("[usr.key] has started the game.")
feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index b77f5bd6afe..89fea828905 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1079,8 +1079,8 @@ var/global/list/g_fancy_list_of_types = null
var/dat = "List of things that failed to GC this round
"
- for(var/path in SSgarbage.logging)
- dat += "[path] - [SSgarbage.logging[path]] times
"
+ for(var/path in SSgarbage.didntgc)
+ dat += "[path] - [SSgarbage.didntgc[path]] times
"
usr << browse(dat, "window=dellog")
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index 803f7f5ab1a..9222cd16304 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -63,7 +63,7 @@
new_holder.mind.objectives += O
new_holder.attack_log += "\[[time_stamp()]\] Won with greentext!!!"
color_altered_mobs -= new_holder
- Destroy()
+ qdel(src)
if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped
last_holder << "A sudden wave of failure washes over you..."
diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm
index 7c7eb7264a5..0eaa7f94b23 100644
--- a/code/modules/lighting/lighting_system.dm
+++ b/code/modules/lighting/lighting_system.dm
@@ -224,7 +224,7 @@
anchored = 1
/atom/movable/light/Destroy()
- return 1
+ return QDEL_HINT_LETMELIVE
/atom/movable/light/Move()
return 0
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c1a0e21b364..e0269ea62f0 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -49,6 +49,7 @@
/mob/living/carbon/human/Destroy()
for(var/atom/movable/organelle in organs)
qdel(organelle)
+ organs = list()
return ..()
/mob/living/carbon/human/Stat()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8c64cbf773e..5ef8323ec04 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -23,16 +23,16 @@ Sorry Giacom. Please don't be mad :(
/mob/living/Destroy()
- . = ..()
+ ..()
for(var/mob/living/simple_animal/drone/D in player_list)
for(var/image/I in staticOverlays)
D.staticOverlays.Remove(I)
D.client.images.Remove(I)
- del(I)
+ qdel(I)
staticOverlays.len = 0
- del(src)
+ return QDEL_HINT_HARDDEL_NOW
/mob/living/proc/generateStaticOverlay()
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index d24c734f219..33ba6d1056f 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -59,6 +59,7 @@
/mob/living/silicon/ai/Destroy()
eyeobj.ai = null
qdel(eyeobj) // No AI, no Eye
+ eyeobj = null
..()
/atom/proc/move_camera_by_click()
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index da4cfbc7225..6468170f288 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -216,17 +216,7 @@
return .
-// rebuild all power networks from scratch - only called at world creation or by the admin verb
-/datum/subsystem/power/proc/makepowernets()
- for(var/datum/powernet/PN in powernets)
- del(PN)
- powernets.Cut()
- for(var/obj/structure/cable/PC in cable_list)
- if(!PC.powernet)
- var/datum/powernet/NewPN = new()
- NewPN.add_cable(PC)
- propagate_network(PC,PC.powernet)
//remove the old powernet and replace it with a new one throughout the network.
/proc/propagate_network(var/obj/O, var/datum/powernet/PN)
@@ -350,87 +340,6 @@
cell.use(drained_energy)
return drained_energy
-////////////////////////////////////////////
-// POWERNET DATUM PROCS
-// each contiguous network of cables & nodes
-////////////////////////////////////////////
-
-/datum/powernet/New()
- SSpower.powernets += src
-
-/datum/powernet/Destroy()
- SSpower.powernets -= src
-
-/datum/powernet/proc/is_empty()
- return !cables.len && !nodes.len
-
-//remove a cable from the current powernet
-//if the powernet is then empty, delete it
-//Warning : this proc DON'T check if the cable exists
-/datum/powernet/proc/remove_cable(var/obj/structure/cable/C)
- cables -= C
- C.powernet = null
- if(is_empty())//the powernet is now empty...
- qdel(src)///... delete it
-
-//add a cable to the current powernet
-//Warning : this proc DON'T check if the cable exists
-/datum/powernet/proc/add_cable(var/obj/structure/cable/C)
- if(C.powernet)// if C already has a powernet...
- if(C.powernet == src)
- return
- else
- C.powernet.remove_cable(C) //..remove it
- C.powernet = src
- cables +=C
-
-//remove a power machine from the current powernet
-//if the powernet is then empty, delete it
-//Warning : this proc DON'T check if the machine exists
-/datum/powernet/proc/remove_machine(var/obj/machinery/power/M)
- nodes -=M
- M.powernet = null
- if(is_empty())//the powernet is now empty...
- qdel(src)///... delete it
-
-
-//add a power machine to the current powernet
-//Warning : this proc DON'T check if the machine exists
-/datum/powernet/proc/add_machine(var/obj/machinery/power/M)
- if(M.powernet)// if M already has a powernet...
- if(M.powernet == src)
- return
- else
- M.disconnect_from_network()//..remove it
- M.powernet = src
- nodes[M] = M
-
-//handles the power changes in the powernet
-//called every ticks by the powernet controller
-/datum/powernet/proc/reset()
-
- //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES
- netexcess = avail - load
-
- if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle
- for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
- S.restore() // and restore some of the power that was used
-
- //updates the viewed load (as seen on power computers)
- viewload = 0.8*viewload + 0.2*load
- viewload = round(viewload)
-
- //reset the powernet
- load = 0
- avail = newavail
- newavail = 0
-
-/datum/powernet/proc/get_electrocute_damage()
- if(avail >= 1000)
- return Clamp(round(avail/10000), 10, 90) + rand(-5,5)
- else
- return 0
-
////////////////////////////////////////////////
// Misc.
///////////////////////////////////////////////
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
new file mode 100644
index 00000000000..ac2b5ea3985
--- /dev/null
+++ b/code/modules/power/powernet.dm
@@ -0,0 +1,90 @@
+////////////////////////////////////////////
+// POWERNET DATUM
+// each contiguous network of cables & nodes
+/////////////////////////////////////
+/datum/powernet
+ var/list/cables = list() // all cables & junctions
+ var/list/nodes = list() // all connected machines
+
+ var/load = 0 // the current load on the powernet, increased by each machine at processing
+ var/newavail = 0 // what available power was gathered last tick, then becomes...
+ var/avail = 0 //...the current available power in the powernet
+ var/viewload = 0 // the load as it appears on the power console (gradually updated)
+ var/number = 0 // Unused //TODEL
+ var/netexcess = 0 // excess power on the powernet (typically avail-load)///////
+
+/datum/powernet/New()
+ SSpower.powernets += src
+
+/datum/powernet/Destroy()
+ SSpower.powernets -= src
+
+/datum/powernet/proc/is_empty()
+ return !cables.len && !nodes.len
+
+//remove a cable from the current powernet
+//if the powernet is then empty, delete it
+//Warning : this proc DON'T check if the cable exists
+/datum/powernet/proc/remove_cable(var/obj/structure/cable/C)
+ cables -= C
+ C.powernet = null
+ if(is_empty())//the powernet is now empty...
+ qdel(src)///... delete it
+
+//add a cable to the current powernet
+//Warning : this proc DON'T check if the cable exists
+/datum/powernet/proc/add_cable(var/obj/structure/cable/C)
+ if(C.powernet)// if C already has a powernet...
+ if(C.powernet == src)
+ return
+ else
+ C.powernet.remove_cable(C) //..remove it
+ C.powernet = src
+ cables +=C
+
+//remove a power machine from the current powernet
+//if the powernet is then empty, delete it
+//Warning : this proc DON'T check if the machine exists
+/datum/powernet/proc/remove_machine(var/obj/machinery/power/M)
+ nodes -=M
+ M.powernet = null
+ if(is_empty())//the powernet is now empty...
+ qdel(src)///... delete it
+
+
+//add a power machine to the current powernet
+//Warning : this proc DON'T check if the machine exists
+/datum/powernet/proc/add_machine(var/obj/machinery/power/M)
+ if(M.powernet)// if M already has a powernet...
+ if(M.powernet == src)
+ return
+ else
+ M.disconnect_from_network()//..remove it
+ M.powernet = src
+ nodes[M] = M
+
+//handles the power changes in the powernet
+//called every ticks by the powernet controller
+/datum/powernet/proc/reset()
+
+ //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES
+ netexcess = avail - load
+
+ if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle
+ for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
+ S.restore() // and restore some of the power that was used
+
+ //updates the viewed load (as seen on power computers)
+ viewload = 0.8*viewload + 0.2*load
+ viewload = round(viewload)
+
+ //reset the powernet
+ load = 0
+ avail = newavail
+ newavail = 0
+
+/datum/powernet/proc/get_electrocute_damage()
+ if(avail >= 1000)
+ return Clamp(round(avail/10000), 10, 90) + rand(-5,5)
+ else
+ return 0
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 88bacc76790..4618586611b 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -63,8 +63,7 @@
return //don't want the emitters to miss
obj/item/projectile/beam/emitter/Destroy()
- PlaceInPool(src)
- return 1 //cancels the GCing
+ return QDEL_HINT_PUTINPOOL
/obj/item/projectile/lasertag
name = "laser tag beam"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 09cae327199..647210069ac 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -72,7 +72,7 @@
..()
var/turf/location = get_turf(src)
if(location)
- new /obj/effect/hotspot(location)
+ PoolOrNew(/obj/effect/hotspot, location)
location.hotspot_expose(700, 50, 1)
/obj/item/projectile/bullet/incendiary/shell/dragonsbreath
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index e10d2af11ec..11a8bdf76de 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -317,13 +317,13 @@ datum/reagent/consumable/cornoil/reaction_turf(var/turf/simulated/T, var/volume)
src = null
if(volume >= 3)
T.MakeSlippery()
- var/hotspot = (locate(/obj/effect/hotspot) in T)
+ var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
lowertemp.react()
T.assume_air(lowertemp)
- qdel(hotspot)
+ hotspot.Kill()
datum/reagent/consumable/enzyme
name = "Universal Enzyme"
diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
index 43650c72067..80502dd8bdf 100644
--- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
@@ -129,13 +129,13 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
- var/hotspot = (locate(/obj/effect/hotspot) in T)
+ var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !istype(T, /turf/space))
if(T.air)
var/datum/gas_mixture/G = T.air
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
- qdel(hotspot)
+ hotspot.Kill()
return
/*
diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
index a5704d0b950..82327767644 100644
--- a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
@@ -59,7 +59,7 @@ datum/reagent/nitroglycerin
else if(prob(volume))
F.burn_tile()
if(istype(F, /turf/simulated/floor/))
- new /obj/effect/hotspot(F)
+ PoolOrNew(/obj/effect/hotspot, F)
if(istype(T, /turf/simulated/wall/))
var/turf/simulated/wall/W = T
if(prob(volume/10))
@@ -69,7 +69,7 @@ datum/reagent/nitroglycerin
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(5)
M.IgniteMob()
- new /obj/effect/hotspot(M.loc)
+ PoolOrNew(/obj/effect/hotspot, M.loc)
/datum/reagent/sorium
name = "Sorium"
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
index 737f9bb5e92..4a3983597f8 100644
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
@@ -109,7 +109,7 @@
/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf in range(1,T))
- new /obj/effect/hotspot(turf)
+ PoolOrNew(/obj/effect/hotspot, turf)
holder.chem_temp = 1000 // hot as shit
/datum/chemical_reaction/sorium
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 4a52b739b77..62a2d254e78 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -19,98 +19,98 @@
var/dheight = 0 //position relative to covered area, parallel to dir
//these objects are indestructable
- Destroy()
- return 1
+/obj/docking_port/Destroy()
+ return QDEL_HINT_LETMELIVE
- //returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
- proc/return_coords(_x, _y, _dir)
- if(!_dir)
- _dir = dir
- if(!_x)
- _x = x
- if(!_y)
- _y = y
+//returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
+/obj/docking_port/proc/return_coords(_x, _y, _dir)
+ if(!_dir)
+ _dir = dir
+ if(!_x)
+ _x = x
+ if(!_y)
+ _y = y
- //byond's sin and cos functions are inaccurate. This is faster and perfectly accurate
- var/cos = 1
- var/sin = 0
- switch(_dir)
- if(WEST)
- cos = 0
- sin = 1
- if(SOUTH)
- cos = -1
- sin = 0
- if(EAST)
- cos = 0
- sin = -1
+ //byond's sin and cos functions are inaccurate. This is faster and perfectly accurate
+ var/cos = 1
+ var/sin = 0
+ switch(_dir)
+ if(WEST)
+ cos = 0
+ sin = 1
+ if(SOUTH)
+ cos = -1
+ sin = 0
+ if(EAST)
+ cos = 0
+ sin = -1
- return list(
- _x + (-dwidth*cos) - (-dheight*sin),
- _y + (-dwidth*sin) + (-dheight*cos),
- _x + (-dwidth+width-1)*cos - (-dheight+height-1)*sin,
- _y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos
- )
+ return list(
+ _x + (-dwidth*cos) - (-dheight*sin),
+ _y + (-dwidth*sin) + (-dheight*cos),
+ _x + (-dwidth+width-1)*cos - (-dheight+height-1)*sin,
+ _y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos
+ )
- //returns turfs within our projected rectangle in a specific order.
- //this ensures that turfs are copied over in the same order, regardless of any rotation
- proc/return_ordered_turfs(_x, _y, _z, _dir)
- if(!_dir)
- _dir = dir
- if(!_x)
- _x = x
- if(!_y)
- _y = y
- if(!_z)
- _z = z
- var/cos = 1
- var/sin = 0
- switch(_dir)
- if(WEST)
- cos = 0
- sin = 1
- if(SOUTH)
- cos = -1
- sin = 0
- if(EAST)
- cos = 0
- sin = -1
+//returns turfs within our projected rectangle in a specific order.
+//this ensures that turfs are copied over in the same order, regardless of any rotation
+/obj/docking_port/proc/return_ordered_turfs(_x, _y, _z, _dir)
+ if(!_dir)
+ _dir = dir
+ if(!_x)
+ _x = x
+ if(!_y)
+ _y = y
+ if(!_z)
+ _z = z
+ var/cos = 1
+ var/sin = 0
+ switch(_dir)
+ if(WEST)
+ cos = 0
+ sin = 1
+ if(SOUTH)
+ cos = -1
+ sin = 0
+ if(EAST)
+ cos = 0
+ sin = -1
- . = list()
+ . = list()
- var/xi
- var/yi
- for(var/dx=0, dx S.dwidth)
- return 2
- if(width-dwidth > S.width-S.dwidth)
- return 3
- if(dheight > S.dheight)
- return 4
- if(height-dheight > S.height-S.dheight)
- return 5
- //check the dock isn't occupied
- if(S.get_docked())
- return 6
- return 0 //0 means we can dock
+//this is to check if this shuttle can physically dock at dock S
+/obj/docking_port/mobile/proc/canDock(obj/docking_port/stationary/S)
+ if(!istype(S))
+ return 1
+ if(istype(S, /obj/docking_port/stationary/transit))
+ return 0
+ //check dock is big enough to contain us
+ if(dwidth > S.dwidth)
+ return 2
+ if(width-dwidth > S.width-S.dwidth)
+ return 3
+ if(dheight > S.dheight)
+ return 4
+ if(height-dheight > S.height-S.dheight)
+ return 5
+ //check the dock isn't occupied
+ if(S.get_docked())
+ return 6
+ return 0 //0 means we can dock
- //call the shuttle to destination S
- proc/request(obj/docking_port/stationary/S)
- if(canDock(S))
- ERROR("[type](\"[name]\") cannot dock at [S]\")")
- return 1 //we can't dock at S
+//call the shuttle to destination S
+/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S)
+ if(canDock(S))
+ ERROR("[type](\"[name]\") cannot dock at [S]\")")
+ return 1 //we can't dock at S
- switch(mode)
- if(SHUTTLE_CALL)
- if(S == destination)
- if(world.time <= timer)
- timer = world.time
- else
- destination = S
+ switch(mode)
+ if(SHUTTLE_CALL)
+ if(S == destination)
+ if(world.time <= timer)
timer = world.time
- if(SHUTTLE_RECALL)
- if(S == destination)
- timer = world.time - timeLeft(1)
- else
- destination = S
- timer = world.time
- mode = SHUTTLE_CALL
else
destination = S
- mode = SHUTTLE_CALL
timer = world.time
- enterTransit() //hyperspace
+ if(SHUTTLE_RECALL)
+ if(S == destination)
+ timer = world.time - timeLeft(1)
+ else
+ destination = S
+ timer = world.time
+ mode = SHUTTLE_CALL
+ else
+ destination = S
+ mode = SHUTTLE_CALL
+ timer = world.time
+ enterTransit() //hyperspace
- //recall the shuttle to where it was previously
- proc/cancel()
- if(mode != SHUTTLE_CALL)
- return
+//recall the shuttle to where it was previously
+/obj/docking_port/mobile/proc/cancel()
+ if(mode != SHUTTLE_CALL)
+ return
- timer = world.time - timeLeft(1)
- mode = SHUTTLE_RECALL
+ timer = world.time - timeLeft(1)
+ mode = SHUTTLE_RECALL
- proc/enterTransit()
- previous = null
+/obj/docking_port/mobile/proc/enterTransit()
+ previous = null
// if(!destination)
// return
- var/obj/docking_port/stationary/S0 = get_docked()
- var/obj/docking_port/stationary/S1 = findTransitDock()
- if(S1)
- if(dock(S1))
- WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
- else
- previous = S0
+ var/obj/docking_port/stationary/S0 = get_docked()
+ var/obj/docking_port/stationary/S1 = findTransitDock()
+ if(S1)
+ if(dock(S1))
+ WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
else
- WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
+ previous = S0
+ else
+ WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
- //this is the main proc. It instantly moves our mobile port to stationary port S1
- //it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
- proc/dock(obj/docking_port/stationary/S1)
- . = canDock(S1)
- if(.)
- ERROR("[type](\"[name]\") cannot dock at [S1]")
- return .
+//this is the main proc. It instantly moves our mobile port to stationary port S1
+//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
+/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1)
+ . = canDock(S1)
+ if(.)
+ ERROR("[type](\"[name]\") cannot dock at [S1]")
+ return .
- if(canMove())
- return -1
+ if(canMove())
+ return -1
- closePortDoors()
+ closePortDoors()
// //rotate transit docking ports, so we don't need zillions of variants
// if(istype(S1, /obj/docking_port/stationary/transit))
// S1.dir = turn(NORTH, -travelDir)
- var/obj/docking_port/stationary/S0 = get_docked()
- var/turf_type = /turf/space
- var/area_type = /area/space
- if(S0)
- if(S0.turf_type)
- turf_type = S0.turf_type
- if(S0.area_type)
- area_type = S0.area_type
+ var/obj/docking_port/stationary/S0 = get_docked()
+ var/turf_type = /turf/space
+ var/area_type = /area/space
+ if(S0)
+ if(S0.turf_type)
+ turf_type = S0.turf_type
+ if(S0.area_type)
+ area_type = S0.area_type
- var/list/L0 = return_ordered_turfs()
- var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
-
- //remove area surrounding docking port
- if(areaInstance.contents.len)
- var/area/A0 = locate("[area_type]")
- if(!A0)
- A0 = new area_type(null)
- for(var/turf/T0 in L0)
- A0.contents += T0
-
- //move or squish anything in the way ship at destination
- roadkill(L1, S1.dir)
-
- for(var/i=1, i<=L0.len, ++i)
- var/turf/T0 = L0[i]
- if(!istype(T0, /turf/simulated/shuttle)) //only move shuttle turfs!
- continue
-
- var/turf/T1 = L1[i]
- if(!T1)
- continue
-
- T0.copyTurf(T1)
- areaInstance.contents += T1
-
- //copy over air
- if(istype(T1, /turf/simulated))
- var/turf/simulated/Ts1 = T1
- Ts1.copy_air_with_tile(T0)
-
- //move mobile to new location
- loc = S1.loc
- dir = S1.dir
-
- //move all objects
- for(var/obj/O in T0)
- if(O.invisibility >= 101)
- continue
- if(O == T0.lighting_object)
- continue
- O.loc = T1
-
- //close open doors
- if(istype(O, /obj/machinery/door))
- var/obj/machinery/door/Door = O
- spawn(-1)
- if(Door)
- Door.close()
-
- for(var/mob/M in T0)
- if(!M.move_on_shuttle)
- continue
- M.loc = T1
-
- //docking turbulence
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 2, 1) // turn it down a bit come on
- else
- shake_camera(M, 7, 1)
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(3)
-
- T0.ChangeTurf(turf_type)
-
- //air system updates
- for(var/turf/T1 in L1)
- T1.redraw_lighting()
- SSair.remove_from_active(T1)
- T1.CalculateAdjacentTurfs()
- SSair.add_to_active(T1,1)
+ var/list/L0 = return_ordered_turfs()
+ var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
+ //remove area surrounding docking port
+ if(areaInstance.contents.len)
+ var/area/A0 = locate("[area_type]")
+ if(!A0)
+ A0 = new area_type(null)
for(var/turf/T0 in L0)
- T0.redraw_lighting()
- SSair.remove_from_active(T0)
- T0.CalculateAdjacentTurfs()
- SSair.add_to_active(T0,1)
+ A0.contents += T0
-/*
- if(istype(S1, /obj/docking_port/stationary/transit))
- var/d = turn(dir, 180 + travelDir)
- for(var/turf/space/transit/T in S1.return_ordered_turfs())
- T.pushdirection = d
- T.update_icon()
-*/
+ //move or squish anything in the way ship at destination
+ roadkill(L1, S1.dir)
- proc/findTransitDock()
- var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
- if(T && !canDock(T))
- return T
- /* commented out due to issues with rotation
- for(var/obj/docking_port/stationary/transit/S in SSshuttle.transit)
- if(S.id)
+ for(var/i=1, i<=L0.len, ++i)
+ var/turf/T0 = L0[i]
+ if(!istype(T0, /turf/simulated/shuttle)) //only move shuttle turfs!
+ continue
+
+ var/turf/T1 = L1[i]
+ if(!T1)
+ continue
+
+ T0.copyTurf(T1)
+ areaInstance.contents += T1
+
+ //copy over air
+ if(istype(T1, /turf/simulated))
+ var/turf/simulated/Ts1 = T1
+ Ts1.copy_air_with_tile(T0)
+
+ //move mobile to new location
+ loc = S1.loc
+ dir = S1.dir
+
+ //move all objects
+ for(var/obj/O in T0)
+ if(O.invisibility >= 101)
continue
- if(!canDock(S))
- return S
- */
+ if(O == T0.lighting_object)
+ continue
+ O.loc = T1
-
- //shuttle-door closing is handled in the dock() proc whilst looping through turfs
- //this one closes the door where we are docked at, if there is one there.
- proc/closePortDoors()
- var/turf/T = get_step(loc, turn(dir,180))
- if(T)
- var/obj/machinery/door/Door = locate() in T
- if(Door)
+ //close open doors
+ if(istype(O, /obj/machinery/door))
+ var/obj/machinery/door/Door = O
spawn(-1)
- Door.close()
+ if(Door)
+ Door.close()
- proc/roadkill(list/L, dir, x, y)
- for(var/turf/T in L)
- for(var/atom/movable/AM in T)
- if(ismob(AM))
- if(istype(AM, /mob/living))
- var/mob/living/M = AM
- M.Paralyse(10)
- M.take_organ_damage(80)
- M.anchored = 0
+ for(var/mob/M in T0)
+ if(!M.move_on_shuttle)
+ continue
+ M.loc = T1
+
+ //docking turbulence
+ if(M.client)
+ spawn(0)
+ if(M.buckled)
+ shake_camera(M, 2, 1) // turn it down a bit come on
else
- continue
+ shake_camera(M, 7, 1)
+ if(istype(M, /mob/living/carbon))
+ if(!M.buckled)
+ M.Weaken(3)
+
+ T0.ChangeTurf(turf_type)
+
+ //air system updates
+ for(var/turf/T1 in L1)
+ T1.redraw_lighting()
+ SSair.remove_from_active(T1)
+ T1.CalculateAdjacentTurfs()
+ SSair.add_to_active(T1,1)
+
+ for(var/turf/T0 in L0)
+ T0.redraw_lighting()
+ SSair.remove_from_active(T0)
+ T0.CalculateAdjacentTurfs()
+ SSair.add_to_active(T0,1)
- if(!AM.anchored)
- step(AM, dir)
- else
- qdel(AM)
/*
- //used to check if atom/A is within the shuttle's bounding box
- proc/onShuttleCheck(atom/A)
- var/turf/T = get_turf(A)
- if(!T)
- return 0
-
- var/list/L = return_coords()
- if(L[1] > L[3])
- L.Swap(1,3)
- if(L[2] > L[4])
- L.Swap(2,4)
-
- if(L[1] <= T.x && T.x <= L[3])
- if(L[2] <= T.y && T.y <= L[4])
- return 1
- return 0
+ if(istype(S1, /obj/docking_port/stationary/transit))
+ var/d = turn(dir, 180 + travelDir)
+ for(var/turf/space/transit/T in S1.return_ordered_turfs())
+ T.pushdirection = d
+ T.update_icon()
+*/
+
+/obj/docking_port/mobile/proc/findTransitDock()
+ var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
+ if(T && !canDock(T))
+ return T
+/* commented out due to issues with rotation
+ for(var/obj/docking_port/stationary/transit/S in SSshuttle.transit)
+ if(S.id)
+ continue
+ if(!canDock(S))
+ return S
*/
- //used by shuttle subsystem to check timers
- proc/check()
- var/timeLeft = timeLeft(1)
- if(timeLeft <= 0)
- switch(mode)
- if(SHUTTLE_CALL)
- if(dock(destination))
- setTimer(20) //can't dock for some reason, try again in 2 seconds
- return
- if(SHUTTLE_RECALL)
- if(dock(previous))
- setTimer(20) //can't dock for some reason, try again in 2 seconds
- return
- mode = SHUTTLE_IDLE
- timer = 0
- destination = null
- proc/setTimer(wait)
- if(timer <= 0)
- timer = world.time
- timer += wait - timeLeft(1)
+//shuttle-door closing is handled in the dock() proc whilst looping through turfs
+//this one closes the door where we are docked at, if there is one there.
+/obj/docking_port/mobile/proc/closePortDoors()
+ var/turf/T = get_step(loc, turn(dir,180))
+ if(T)
+ var/obj/machinery/door/Door = locate() in T
+ if(Door)
+ spawn(-1)
+ Door.close()
- //returns timeLeft
- proc/timeLeft(divisor)
- if(divisor <= 0)
- divisor = 10
- if(!timer)
- return round(callTime/divisor, 1)
- return max( round((timer+callTime-world.time)/divisor,1), 0 )
+/obj/docking_port/mobile/proc/roadkill(list/L, dir, x, y)
+ for(var/turf/T in L)
+ for(var/atom/movable/AM in T)
+ if(ismob(AM))
+ if(istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.Paralyse(10)
+ M.take_organ_damage(80)
+ M.anchored = 0
+ else
+ continue
- proc/getStatusText()
- var/obj/docking_port/stationary/dockedAt = get_docked()
- . = (dockedAt && dockedAt.name) ? dockedAt.name : "unknown"
- if(istype(dockedAt, /obj/docking_port/stationary/transit))
- var/obj/docking_port/stationary/dst
- if(mode == SHUTTLE_RECALL)
- dst = previous
+ if(!AM.anchored)
+ step(AM, dir)
else
- dst = destination
- . += " towards [dst ? dst.name : "unknown location"] ([timeLeft(600)]mins)"
+ qdel(AM)
+/*
+//used to check if atom/A is within the shuttle's bounding box
+/obj/docking_port/mobile/proc/onShuttleCheck(atom/A)
+ var/turf/T = get_turf(A)
+ if(!T)
+ return 0
+
+ var/list/L = return_coords()
+ if(L[1] > L[3])
+ L.Swap(1,3)
+ if(L[2] > L[4])
+ L.Swap(2,4)
+
+ if(L[1] <= T.x && T.x <= L[3])
+ if(L[2] <= T.y && T.y <= L[4])
+ return 1
+ return 0
+*/
+//used by shuttle subsystem to check timers
+/obj/docking_port/mobile/proc/check()
+ var/timeLeft = timeLeft(1)
+ if(timeLeft <= 0)
+ switch(mode)
+ if(SHUTTLE_CALL)
+ if(dock(destination))
+ setTimer(20) //can't dock for some reason, try again in 2 seconds
+ return
+ if(SHUTTLE_RECALL)
+ if(dock(previous))
+ setTimer(20) //can't dock for some reason, try again in 2 seconds
+ return
+ mode = SHUTTLE_IDLE
+ timer = 0
+ destination = null
+
+
+/obj/docking_port/mobile/proc/setTimer(wait)
+ if(timer <= 0)
+ timer = world.time
+ timer += wait - timeLeft(1)
+
+//returns timeLeft
+/obj/docking_port/mobile/proc/timeLeft(divisor)
+ if(divisor <= 0)
+ divisor = 10
+ if(!timer)
+ return round(callTime/divisor, 1)
+ return max( round((timer+callTime-world.time)/divisor,1), 0 )
+
+/obj/docking_port/mobile/proc/getStatusText()
+ var/obj/docking_port/stationary/dockedAt = get_docked()
+ . = (dockedAt && dockedAt.name) ? dockedAt.name : "unknown"
+ if(istype(dockedAt, /obj/docking_port/stationary/transit))
+ var/obj/docking_port/stationary/dst
+ if(mode == SHUTTLE_RECALL)
+ dst = previous
+ else
+ dst = destination
+ . += " towards [dst ? dst.name : "unknown location"] ([timeLeft(600)]mins)"
/obj/machinery/computer/shuttle
name = "Shuttle Console"
diff --git a/html/changelogs/MrStonedOne-pr-9231-mc-subsystem.yml b/html/changelogs/MrStonedOne-pr-9231-mc-subsystem.yml
new file mode 100644
index 00000000000..722b0637bbf
--- /dev/null
+++ b/html/changelogs/MrStonedOne-pr-9231-mc-subsystem.yml
@@ -0,0 +1,43 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: MrStonedOne
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Fuck you and your tab-less "y m l"
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - experiment: "MasterController and subsystem rejiggering!"
+ - rscadd: "The MC can now dynamcially change the rate a subsystem is triggered based on how laggy it's being. This has been applied to atmos to allow for faster air processing without lagging the server"
+ - tweak: "Pipes and atmos machinery now processes in tune with air, rather than seperately."
+ - bugfix: "Fixed hotspots and fire causing more lag than they needed to"
+ - bugfix: "Fixed some objects not getting garbage collected because they didn't properly clear references in Destory()"
+ - tweak: "The qdel subsystem will now limit its processing time to a 5th of a second each tick to prevent lag when a lot of deletes happen"
+ - bugfix: "Fixed the ticker not showing a tip of the round if an admin forces the round to start immediately"
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 33764a17413..7a35fa2dc48 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -28,6 +28,7 @@
#include "code\__DEFINES\math.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\preferences.dm"
+#include "code\__DEFINES\qdel.dm"
#include "code\__DEFINES\say.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\stat.dm"
@@ -90,7 +91,6 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\ATMOSPHERICS\atmospherics.dm"
-#include "code\ATMOSPHERICS\datum_pipe_network.dm"
#include "code\ATMOSPHERICS\datum_pipeline.dm"
#include "code\ATMOSPHERICS\he_pipes.dm"
#include "code\ATMOSPHERICS\pipes.dm"
@@ -118,7 +118,6 @@
#include "code\ATMOSPHERICS\pipes\manifold4w.dm"
#include "code\ATMOSPHERICS\pipes\simple.dm"
#include "code\ATMOSPHERICS\pipes\tank.dm"
-#include "code\ATMOSPHERICS\pipes\vent.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\failsafe.dm"
#include "code\controllers\master_controller.dm"
@@ -137,7 +136,6 @@
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\objects.dm"
#include "code\controllers\subsystem\pai.dm"
-#include "code\controllers\subsystem\pipenets.dm"
#include "code\controllers\subsystem\power.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\server_maintenance.dm"
@@ -152,11 +150,11 @@
#include "code\datums\computerfiles.dm"
#include "code\datums\datacore.dm"
#include "code\datums\datumvars.dm"
+#include "code\datums\debug.dm"
#include "code\datums\gas_mixture.dm"
#include "code\datums\hud.dm"
#include "code\datums\martial.dm"
#include "code\datums\mind.dm"
-#include "code\datums\mixed.dm"
#include "code\datums\modules.dm"
#include "code\datums\mutations.dm"
#include "code\datums\recipe.dm"
@@ -1306,6 +1304,7 @@
#include "code\modules\power\lighting.dm"
#include "code\modules\power\port_gen.dm"
#include "code\modules\power\power.dm"
+#include "code\modules\power\powernet.dm"
#include "code\modules\power\smes.dm"
#include "code\modules\power\solar.dm"
#include "code\modules\power\switch.dm"