Files
Yogstation/code/controllers/subsystem/garbage.dm
2017-03-22 11:27:49 -04:00

1039 lines
29 KiB
Plaintext

var/datum/controller/subsystem/garbage/SSgarbage
/datum/controller/subsystem/garbage
name = "Garbage"
priority = 15
wait = 5
flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
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/highest_del_time = 0
var/highest_del_tickusage = 0
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/tobequeued = list() //We store the references of things to be added to the queue seperately so we can spread out GC overhead over a few ticks
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
var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call
var/list/noqdelhint = list()// list of all types that do not return a QDEL_HINT
// all types that did not respect qdel(A, force=TRUE) and returned one
// of the immortality qdel hints
var/list/noforcerespect = list()
#ifdef TESTING
var/list/qdel_list = list() // list of all types that have been qdel()eted
#endif
/datum/controller/subsystem/garbage/New()
NEW_SS_GLOBAL(SSgarbage)
/datum/controller/subsystem/garbage/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/controller/subsystem/garbage/fire()
HandleToBeQueued()
if(state == SS_RUNNING)
HandleQueue()
//If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond.
//Don't attempt to optimize, not worth the effort.
/datum/controller/subsystem/garbage/proc/HandleToBeQueued()
var/list/tobequeued = src.tobequeued
var/starttime = world.time
var/starttimeofday = world.timeofday
while(tobequeued.len && starttime == world.time && starttimeofday == world.timeofday)
if (MC_TICK_CHECK)
break
var/ref = tobequeued[1]
Queue(ref)
tobequeued.Cut(1, 2)
/datum/controller/subsystem/garbage/proc/HandleQueue()
delslasttick = 0
gcedlasttick = 0
var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del()
var/list/queue = src.queue
var/starttime = world.time
var/starttimeofday = world.timeofday
while(queue.len && starttime == world.time && starttimeofday == world.timeofday)
if (MC_TICK_CHECK)
break
var/refID = queue[1]
if (!refID)
queue.Cut(1, 2)
continue
var/GCd_at_time = queue[refID]
if(GCd_at_time > time_to_kill)
break // Everything else is newer, skip them
queue.Cut(1, 2)
var/datum/A
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
#ifdef GC_FAILURE_HARD_LOOKUP
A.find_references()
#endif
// Something's still referring to the qdel'd object. Kill it.
var/type = A.type
testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --")
didntgc["[type]"]++
var/time = world.timeofday
var/tick = world.tick_usage
var/ticktime = world.time
del(A)
tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100))
if (tick > highest_del_tickusage)
highest_del_tickusage = tick
time = world.timeofday - time
if (!time && TICK_DELTA_TO_MS(tick) > 1)
time = TICK_DELTA_TO_MS(tick)/100
if (time > highest_del_time)
highest_del_time = time
if (time > 10)
log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)")
message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).")
postpone(time/5)
break
++delslasttick
++totaldels
else
++gcedlasttick
++totalgcs
/datum/controller/subsystem/garbage/proc/QueueForQueuing(datum/A)
if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
tobequeued += A
A.gc_destroyed = GC_QUEUED_FOR_QUEUING
/datum/controller/subsystem/garbage/proc/Queue(datum/A)
if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0))
return
if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL)
del(A)
return
var/gctime = world.time
var/refid = "\ref[A]"
A.gc_destroyed = gctime
if (queue[refid])
queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list.
queue[refid] = gctime
/datum/controller/subsystem/garbage/proc/HardQueue(datum/A)
if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
tobequeued += A
A.gc_destroyed = GC_QUEUED_FOR_HARD_DEL
/datum/controller/subsystem/garbage/Recover()
if (istype(SSgarbage.queue))
queue |= SSgarbage.queue
if (istype(SSgarbage.tobequeued))
tobequeued |= SSgarbage.tobequeued
// 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(datum/D, force=FALSE)
if(!D)
return
#ifdef TESTING
SSgarbage.qdel_list += "[D.type]"
#endif
if(!istype(D))
del(D)
else if(isnull(D.gc_destroyed))
D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED
var/start_time = world.time
var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up.
if(world.time != start_time)
SSgarbage.sleptDestroy["[D.type]"]++
if(!D)
return
switch(hint)
if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion.
SSgarbage.QueueForQueuing(D)
if (QDEL_HINT_IWILLGC)
D.gc_destroyed = world.time
return
if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory.
if(!force)
D.gc_destroyed = null //clear the gc variable (important!)
return
// Returning LETMELIVE after being told to force destroy
// indicates the objects Destroy() does not respect force
if(!SSgarbage.noforcerespect["[D.type]"])
SSgarbage.noforcerespect["[D.type]"] = "[D.type]"
testing("WARNING: [D.type] has been force deleted, but is \
returning an immortal QDEL_HINT, indicating it does \
not respect the force flag for qdel(). It has been \
placed in the queue, further instances of this type \
will also be queued.")
SSgarbage.QueueForQueuing(D)
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(D)
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
del(D)
if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
SSgarbage.QueueForQueuing(D)
#ifdef TESTING
D.find_references()
#endif
else
if(!SSgarbage.noqdelhint["[D.type]"])
SSgarbage.noqdelhint["[D.type]"] = "[D.type]"
testing("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.")
SSgarbage.QueueForQueuing(D)
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
// Default implementation of clean-up code.
// This should be overridden to remove all references pointing to the object being destroyed.
// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
/datum/proc/Destroy(force=FALSE)
tag = null
var/list/timers = active_timers
active_timers = null
for(var/thing in timers)
var/datum/timedevent/timer = thing
if (timer.spent)
continue
qdel(timer)
return QDEL_HINT_QUEUE
/datum/var/gc_destroyed //Time when this object was destroyed.
#ifdef TESTING
/datum/var/running_find_references
/datum/var/last_find_references = 0
/datum/verb/find_refs()
set category = "Debug"
set name = "Find References"
set background = 1
set src in world
find_references(FALSE)
/datum/proc/find_references(skip_alert)
running_find_references = type
if(usr && usr.client)
if(usr.client.running_find_references)
testing("CANCELLED search for references to a [usr.client.running_find_references].")
usr.client.running_find_references = null
running_find_references = null
//restart the garbage collector
SSgarbage.can_fire = 1
SSgarbage.next_fire = world.time + world.tick_lag
return
if(!skip_alert)
if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
running_find_references = null
return
//this keeps the garbage collector from failing to collect objects being searched for in here
SSgarbage.can_fire = 0
if(usr && usr.client)
usr.client.running_find_references = type
testing("Beginning search for references to a [type].")
last_find_references = world.time
find_references_in_globals()
for(var/datum/thing in world)
DoSearchVar(thing, "WorldRef: [thing]")
testing("Completed search for references to a [type].")
if(usr && usr.client)
usr.client.running_find_references = null
running_find_references = null
//restart the garbage collector
SSgarbage.can_fire = 1
SSgarbage.next_fire = world.time + world.tick_lag
/client/verb/purge_all_destroyed_objects()
set category = "Debug"
if(SSgarbage)
while(SSgarbage.queue.len)
var/datum/o = locate(SSgarbage.queue[1])
if(istype(o) && o.gc_destroyed)
del(o)
SSgarbage.totaldels++
SSgarbage.queue.Cut(1, 2)
/datum/verb/qdel_then_find_references()
set category = "Debug"
set name = "qdel() then Find References"
set background = 1
set src in world
qdel(src)
if(!running_find_references)
find_references(TRUE)
/client/verb/show_qdeleted()
set category = "Debug"
set name = "Show qdel() Log"
set desc = "Render the qdel() log and display it"
var/dat = "<B>List of things that have been qdel()eted this round</B><BR><BR>"
var/tmplist = list()
for(var/elem in SSgarbage.qdel_list)
if(!(elem in tmplist))
tmplist[elem] = 0
tmplist[elem]++
for(var/path in tmplist)
dat += "[path] - [tmplist[path]] times<BR>"
usr << browse(dat, "window=qdeletedlog")
#define SearchVar(X) DoSearchVar(X, "Global: " + #X)
/datum/proc/DoSearchVar(X, Xname)
if(usr && usr.client && !usr.client.running_find_references) return
if(istype(X, /datum))
var/datum/D = X
if(D.last_find_references == last_find_references)
return
D.last_find_references = last_find_references
for(var/V in D.vars)
for(var/varname in D.vars)
var/variable = D.vars[varname]
if(variable == src)
testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]")
else if(islist(variable))
if(src in variable)
testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]")
#ifdef GC_FAILURE_HARD_LOOKUP
for(var/I in variable)
DoSearchVar(I, TRUE)
else
DoSearchVar(variable, "[Xname]: [varname]")
#endif
else if(islist(X))
if(src in X)
testing("Found [src.type] \ref[src] in list [Xname].")
#ifdef GC_FAILURE_HARD_LOOKUP
for(var/I in X)
DoSearchVar(I, Xname + ": list")
#else
CHECK_TICK
#endif
//if find_references isn't working for some datum
//update this list using tools/DMTreeToGlobalsList
/datum/proc/find_references_in_globals()
SearchVar(clockwork_construction_value)
SearchVar(clockwork_caches)
SearchVar(clockwork_daemons)
SearchVar(clockwork_generals_invoked)
SearchVar(all_clockwork_objects)
SearchVar(all_clockwork_mobs)
SearchVar(clockwork_component_cache)
SearchVar(ratvar_awakens)
SearchVar(clockwork_gateway_activated)
SearchVar(all_scripture)
SearchVar(pointed_types)
SearchVar(bloody_footprints_cache)
SearchVar(ghost_accs_options)
SearchVar(ghost_others_options)
SearchVar(special_roles)
SearchVar(string_cache)
SearchVar(string_filename_current_key)
SearchVar(cmp_field)
SearchVar(friendly_animal_types)
SearchVar(humanoid_icon_cache)
SearchVar(freeze_item_icons)
SearchVar(E)
SearchVar(Sqrt2)
SearchVar(sqrtTable)
SearchVar(gaussian_next)
SearchVar(skin_tones)
SearchVar(species_list)
SearchVar(roundstart_species)
SearchVar(church_name)
SearchVar(command_name)
SearchVar(religion_name)
SearchVar(syndicate_name)
SearchVar(syndicate_code_phrase)
SearchVar(syndicate_code_response)
SearchVar(zero_character_only)
SearchVar(hex_characters)
SearchVar(alphabet)
SearchVar(binary)
SearchVar(can_embed_types)
SearchVar(WALLITEMS)
SearchVar(WALLITEMS_EXTERNAL)
SearchVar(WALLITEMS_INVERSE)
SearchVar(sortInstance)
SearchVar(config)
SearchVar(host)
SearchVar(join_motd)
SearchVar(station_name)
SearchVar(game_version)
SearchVar(changelog_hash)
SearchVar(ooc_allowed)
SearchVar(dooc_allowed)
SearchVar(abandon_allowed)
SearchVar(enter_allowed)
SearchVar(guests_allowed)
SearchVar(shuttle_frozen)
SearchVar(shuttle_left)
SearchVar(tinted_weldhelh)
SearchVar(Debug)
SearchVar(Debug2)
SearchVar(comms_key)
SearchVar(comms_allowed)
SearchVar(medal_hub)
SearchVar(medal_pass)
SearchVar(medals_enabled)
SearchVar(MAX_EX_DEVESTATION_RANGE)
SearchVar(MAX_EX_HEAVY_RANGE)
SearchVar(MAX_EX_LIGHT_RANGE)
SearchVar(MAX_EX_FLASH_RANGE)
SearchVar(MAX_EX_FLAME_RANGE)
SearchVar(DYN_EX_SCALE)
SearchVar(sqladdress)
SearchVar(sqlport)
SearchVar(sqlfdbkdb)
SearchVar(sqlfdbklogin)
SearchVar(sqlfdbkpass)
SearchVar(sqlfdbktableprefix)
SearchVar(dbcon)
SearchVar(master_mode)
SearchVar(secret_force_mode)
SearchVar(wavesecret)
SearchVar(start_state)
SearchVar(NEARSIGHTBLOCK)
SearchVar(EPILEPSYBLOCK)
SearchVar(COUGHBLOCK)
SearchVar(TOURETTESBLOCK)
SearchVar(NERVOUSBLOCK)
SearchVar(BLINDBLOCK)
SearchVar(DEAFBLOCK)
SearchVar(HULKBLOCK)
SearchVar(TELEBLOCK)
SearchVar(FIREBLOCK)
SearchVar(XRAYBLOCK)
SearchVar(CLUMSYBLOCK)
SearchVar(STRANGEBLOCK)
SearchVar(RACEBLOCK)
SearchVar(bad_se_blocks)
SearchVar(good_se_blocks)
SearchVar(op_se_blocks)
SearchVar(NULLED_SE)
SearchVar(NULLED_UI)
SearchVar(global_mutations)
SearchVar(bad_mutations)
SearchVar(good_mutations)
SearchVar(not_good_mutations)
SearchVar(diary)
SearchVar(diaryofmeanpeople)
SearchVar(href_logfile)
SearchVar(bombers)
SearchVar(admin_log)
SearchVar(lastsignalers)
SearchVar(lawchanges)
SearchVar(combatlog)
SearchVar(IClog)
SearchVar(OOClog)
SearchVar(adminlog)
SearchVar(active_turfs_startlist)
SearchVar(admin_notice)
SearchVar(timezoneOffset)
SearchVar(fileaccess_timer)
SearchVar(TAB)
SearchVar(data_core)
SearchVar(CELLRATE)
SearchVar(CHARGELEVEL)
SearchVar(powernets)
SearchVar(hair_styles_list)
SearchVar(hair_styles_male_list)
SearchVar(hair_styles_female_list)
SearchVar(facial_hair_styles_list)
SearchVar(facial_hair_styles_male_list)
SearchVar(facial_hair_styles_female_list)
SearchVar(underwear_list)
SearchVar(underwear_m)
SearchVar(underwear_f)
SearchVar(undershirt_list)
SearchVar(undershirt_m)
SearchVar(undershirt_f)
SearchVar(socks_list)
SearchVar(body_markings_list)
SearchVar(tails_list_lizard)
SearchVar(animated_tails_list_lizard)
SearchVar(snouts_list)
SearchVar(horns_list)
SearchVar(frills_list)
SearchVar(spines_list)
SearchVar(legs_list)
SearchVar(animated_spines_list)
SearchVar(tails_list_human)
SearchVar(animated_tails_list_human)
SearchVar(ears_list)
SearchVar(wings_list)
SearchVar(wings_open_list)
SearchVar(r_wings_list)
SearchVar(ghost_forms_with_directions_list)
SearchVar(ghost_forms_with_accessories_list)
SearchVar(security_depts_prefs)
SearchVar(backbaglist)
SearchVar(uplink_spawn_loc_list)
SearchVar(female_clothing_icons)
SearchVar(hit_appends)
SearchVar(scarySounds)
SearchVar(TAGGERLOCATIONS)
SearchVar(guitar_notes)
SearchVar(station_prefixes)
SearchVar(station_names)
SearchVar(station_suffixes)
SearchVar(greek_letters)
SearchVar(phonetic_alphabet)
SearchVar(numbers_as_words)
SearchVar(station_numerals)
SearchVar(cardinal)
SearchVar(alldirs)
SearchVar(diagonals)
SearchVar(accessable_z_levels)
SearchVar(global_map)
SearchVar(landmarks_list)
SearchVar(start_landmarks_list)
SearchVar(department_security_spawns)
SearchVar(generic_event_spawns)
SearchVar(monkeystart)
SearchVar(wizardstart)
SearchVar(newplayer_start)
SearchVar(latejoin)
SearchVar(prisonwarp)
SearchVar(holdingfacility)
SearchVar(xeno_spawn)
SearchVar(tdome1)
SearchVar(tdome2)
SearchVar(tdomeobserve)
SearchVar(tdomeadmin)
SearchVar(prisonsecuritywarp)
SearchVar(prisonwarped)
SearchVar(blobstart)
SearchVar(secequipment)
SearchVar(deathsquadspawn)
SearchVar(emergencyresponseteamspawn)
SearchVar(ruin_landmarks)
SearchVar(awaydestinations)
SearchVar(sortedAreas)
SearchVar(transit_markers)
SearchVar(clients)
SearchVar(admins)
SearchVar(deadmins)
SearchVar(directory)
SearchVar(stealthminID)
SearchVar(player_list)
SearchVar(mob_list)
SearchVar(living_mob_list)
SearchVar(dead_mob_list)
SearchVar(joined_player_list)
SearchVar(silicon_mobs)
SearchVar(pai_list)
SearchVar(ai_names)
SearchVar(wizard_first)
SearchVar(wizard_second)
SearchVar(ninja_titles)
SearchVar(ninja_names)
SearchVar(commando_names)
SearchVar(first_names_male)
SearchVar(first_names_female)
SearchVar(last_names)
SearchVar(lizard_names_male)
SearchVar(lizard_names_female)
SearchVar(clown_names)
SearchVar(mime_names)
SearchVar(carp_names)
SearchVar(golem_names)
SearchVar(plasmaman_names)
SearchVar(verbs)
SearchVar(adjectives)
SearchVar(cable_list)
SearchVar(portals)
SearchVar(airlocks)
SearchVar(mechas_list)
SearchVar(shuttle_caller_list)
SearchVar(machines)
SearchVar(syndicate_shuttle_boards)
SearchVar(navbeacons)
SearchVar(teleportbeacons)
SearchVar(deliverybeacons)
SearchVar(deliverybeacontags)
SearchVar(nuke_list)
SearchVar(alarmdisplay)
SearchVar(chemical_reactions_list)
SearchVar(chemical_reagents_list)
SearchVar(materials_list)
SearchVar(tech_list)
SearchVar(surgeries_list)
SearchVar(crafting_recipes)
SearchVar(rcd_list)
SearchVar(apcs_list)
SearchVar(tracked_implants)
SearchVar(tracked_chem_implants)
SearchVar(poi_list)
SearchVar(pinpointer_list)
SearchVar(zombie_infection_list)
SearchVar(meteor_list)
SearchVar(poll_ignore)
SearchVar(typecache_mob)
SearchVar(tk_maxrange)
SearchVar(Failsafe)
SearchVar(Master)
SearchVar(MC_restart_clear)
SearchVar(MC_restart_timeout)
SearchVar(MC_restart_count)
SearchVar(CURRENT_TICKLIMIT)
SearchVar(SSacid)
SearchVar(SSair)
SearchVar(SSassets)
SearchVar(SSaugury)
SearchVar(SScommunications)
SearchVar(SSdisease)
SearchVar(SSevents)
SearchVar(SSfire_burning)
SearchVar(SSgarbage)
SearchVar(SSicon_smooth)
SearchVar(SSipintel)
SearchVar(SSjob)
SearchVar(SSlighting)
SearchVar(SSmachine)
SearchVar(SSmapping)
SearchVar(SSminimap)
SearchVar(SSmob)
SearchVar(SSnpc)
SearchVar(SSorbit)
SearchVar(SSpai)
SearchVar(pai_card_list)
SearchVar(SSparallax)
SearchVar(SSpersistence)
SearchVar(SSping)
SearchVar(SSradio)
SearchVar(SSreligion)
SearchVar(SSserver)
SearchVar(SSshuttle)
SearchVar(SSspacedrift)
SearchVar(SSsqueak)
SearchVar(SSstickyban)
SearchVar(SSsun)
SearchVar(SStgui)
SearchVar(SSthrowing)
SearchVar(round_start_time)
SearchVar(SSticker)
SearchVar(SStimer)
SearchVar(SSvote)
SearchVar(SSweather)
SearchVar(SSfastprocess)
SearchVar(SSflightpacks)
SearchVar(SSobj)
SearchVar(SSprocessing)
SearchVar(record_id_num)
SearchVar(emote_list)
SearchVar(huds)
SearchVar(diseases)
SearchVar(archive_diseases)
SearchVar(advance_cures)
SearchVar(list_symptoms)
SearchVar(dictionary_symptoms)
SearchVar(SYMPTOM_ACTIVATION_PROB)
SearchVar(revdata)
SearchVar(all_status_effects)
SearchVar(wire_colors)
SearchVar(wire_color_directory)
SearchVar(wire_name_directory)
SearchVar(blood_splatter_icons)
SearchVar(all_radios)
SearchVar(radiochannels)
SearchVar(radiochannelsreverse)
SearchVar(SYND_FREQ)
SearchVar(SUPP_FREQ)
SearchVar(SERV_FREQ)
SearchVar(SCI_FREQ)
SearchVar(COMM_FREQ)
SearchVar(MED_FREQ)
SearchVar(ENG_FREQ)
SearchVar(SEC_FREQ)
SearchVar(CENTCOM_FREQ)
SearchVar(AIPRIV_FREQ)
SearchVar(RADIO_TO_AIRALARM)
SearchVar(RADIO_FROM_AIRALARM)
SearchVar(RADIO_CHAT)
SearchVar(RADIO_ATMOSIA)
SearchVar(RADIO_NAVBEACONS)
SearchVar(RADIO_AIRLOCK)
SearchVar(RADIO_MAGNETS)
SearchVar(pointers)
SearchVar(freqtospan)
SearchVar(teleportlocs)
SearchVar(the_station_areas)
SearchVar(possible_items)
SearchVar(possible_items_special)
SearchVar(blobs)
SearchVar(blob_cores)
SearchVar(overminds)
SearchVar(blob_nodes)
SearchVar(blobs_legit)
SearchVar(possible_changeling_IDs)
SearchVar(slots)
SearchVar(slot2slot)
SearchVar(slot2type)
SearchVar(hivemind_bank)
SearchVar(blacklisted_pylon_turfs)
SearchVar(non_revealed_runes)
SearchVar(teleport_runes)
SearchVar(wall_runes)
SearchVar(whiteness)
SearchVar(allDevils)
SearchVar(lawlorify)
SearchVar(gang_name_pool)
SearchVar(gang_colors_pool)
SearchVar(borers)
SearchVar(total_borer_hosts_needed)
SearchVar(bomb_set)
SearchVar(hsboxspawn)
SearchVar(multiverse)
SearchVar(announcement_systems)
SearchVar(doppler_arrays)
SearchVar(HOLOPAD_MODE)
SearchVar(holopads)
SearchVar(news_network)
SearchVar(allCasters)
SearchVar(SAFETY_COOLDOWN)
SearchVar(req_console_assistance)
SearchVar(req_console_supplies)
SearchVar(req_console_information)
SearchVar(allConsoles)
SearchVar(time_last_changed_position)
SearchVar(CALL_SHUTTLE_REASON_LENGTH)
SearchVar(crewmonitor)
SearchVar(possible_uplinker_IDs)
SearchVar(airlock_overlays)
SearchVar(pipeID2State)
SearchVar(telecomms_list)
SearchVar(recentmessages)
SearchVar(message_delay)
SearchVar(year)
SearchVar(year_integer)
SearchVar(explosionid)
SearchVar(fire_overlay)
SearchVar(acid_overlay)
SearchVar(BUMP_TELEPORTERS)
SearchVar(blacklisted_glowshroom_turfs)
SearchVar(PDAs)
SearchVar(rod_recipes)
SearchVar(glass_recipes)
SearchVar(reinforced_glass_recipes)
SearchVar(human_recipes)
SearchVar(corgi_recipes)
SearchVar(monkey_recipes)
SearchVar(xeno_recipes)
SearchVar(sinew_recipes)
SearchVar(sandstone_recipes)
SearchVar(sandbag_recipes)
SearchVar(diamond_recipes)
SearchVar(uranium_recipes)
SearchVar(plasma_recipes)
SearchVar(gold_recipes)
SearchVar(silver_recipes)
SearchVar(clown_recipes)
SearchVar(titanium_recipes)
SearchVar(plastitanium_recipes)
SearchVar(snow_recipes)
SearchVar(abductor_recipes)
SearchVar(metal_recipes)
SearchVar(plasteel_recipes)
SearchVar(wood_recipes)
SearchVar(cloth_recipes)
SearchVar(cardboard_recipes)
SearchVar(runed_metal_recipes)
SearchVar(brass_recipes)
SearchVar(disposalpipeID2State)
SearchVar(RPD_recipes)
SearchVar(biblenames)
SearchVar(biblestates)
SearchVar(bibleitemstates)
SearchVar(globalBlankCanvases)
SearchVar(crematoriums)
SearchVar(icons_to_ignore_at_floor_init)
SearchVar(js_byjax)
SearchVar(js_dropdowns)
SearchVar(BSACooldown)
SearchVar(admin_ranks)
SearchVar(admin_verbs_default)
SearchVar(admin_verbs_admin)
SearchVar(admin_verbs_ban)
SearchVar(admin_verbs_sounds)
SearchVar(admin_verbs_fun)
SearchVar(admin_verbs_spawn)
SearchVar(admin_verbs_server)
SearchVar(admin_verbs_debug)
SearchVar(admin_verbs_possess)
SearchVar(admin_verbs_permissions)
SearchVar(admin_verbs_rejuv)
SearchVar(admin_verbs_hideable)
SearchVar(create_object_html)
SearchVar(create_object_forms)
SearchVar(admin_datums)
SearchVar(CMinutes)
SearchVar(Banlist)
SearchVar(whitelist)
SearchVar(TYPES_SHORTCUTS)
SearchVar(intercom_range_display_status)
SearchVar(admin_verbs_debug_mapping)
SearchVar(say_disabled)
SearchVar(VVlocked)
SearchVar(VVicon_edit_lock)
SearchVar(VVckey_edit)
SearchVar(VVpixelmovement)
SearchVar(highlander)
SearchVar(admin_sound)
SearchVar(custom_outfits)
SearchVar(meta_gas_info)
SearchVar(gaslist_cache)
SearchVar(hardcoded_gases)
SearchVar(pipenetwarnings)
SearchVar(the_gateway)
SearchVar(potentialRandomZlevels)
SearchVar(use_preloader)
SearchVar(_preloader)
SearchVar(swapmaps_iconcache)
SearchVar(SWAPMAPS_SAV)
SearchVar(SWAPMAPS_TEXT)
SearchVar(swapmaps_mode)
SearchVar(swapmaps_compiled_maxx)
SearchVar(swapmaps_compiled_maxy)
SearchVar(swapmaps_compiled_maxz)
SearchVar(swapmaps_initialized)
SearchVar(swapmaps_loaded)
SearchVar(swapmaps_byname)
SearchVar(sc_safecode1)
SearchVar(sc_safecode2)
SearchVar(sc_safecode3)
SearchVar(sc_safecode4)
SearchVar(sc_safecode5)
SearchVar(exports_list)
SearchVar(clientmessages)
SearchVar(preferences_datums)
SearchVar(ghost_forms)
SearchVar(ghost_orbits)
SearchVar(normal_ooc_colour)
SearchVar(damaged_clothes_icons)
SearchVar(emojis)
SearchVar(non_fakeattack_weapons)
SearchVar(cards_against_space)
SearchVar(chem_t1_reagents)
SearchVar(chem_t2_reagents)
SearchVar(chem_t3_reagents)
SearchVar(chem_t4_reagents)
SearchVar(ENGSEC)
SearchVar(CAPTAIN)
SearchVar(HOS)
SearchVar(WARDEN)
SearchVar(DETECTIVE)
SearchVar(OFFICER)
SearchVar(CHIEF)
SearchVar(ENGINEER)
SearchVar(ATMOSTECH)
SearchVar(ROBOTICIST)
SearchVar(AI)
SearchVar(CYBORG)
SearchVar(MEDSCI)
SearchVar(RD)
SearchVar(SCIENTIST)
SearchVar(CHEMIST)
SearchVar(CMO)
SearchVar(DOCTOR)
SearchVar(GENETICIST)
SearchVar(VIROLOGIST)
SearchVar(CIVILIAN)
SearchVar(HOP)
SearchVar(BARTENDER)
SearchVar(BOTANIST)
SearchVar(COOK)
SearchVar(JANITOR)
SearchVar(LIBRARIAN)
SearchVar(QUARTERMASTER)
SearchVar(CARGOTECH)
SearchVar(MINER)
SearchVar(LAWYER)
SearchVar(CHAPLAIN)
SearchVar(CLOWN)
SearchVar(MIME)
SearchVar(ASSISTANT)
SearchVar(assistant_occupations)
SearchVar(command_positions)
SearchVar(engineering_positions)
SearchVar(medical_positions)
SearchVar(science_positions)
SearchVar(supply_positions)
SearchVar(civilian_positions)
SearchVar(security_positions)
SearchVar(nonhuman_positions)
SearchVar(cap_expand)
SearchVar(cmo_expand)
SearchVar(hos_expand)
SearchVar(hop_expand)
SearchVar(rd_expand)
SearchVar(ce_expand)
SearchVar(qm_expand)
SearchVar(sec_expand)
SearchVar(engi_expand)
SearchVar(atmos_expand)
SearchVar(doc_expand)
SearchVar(mine_expand)
SearchVar(chef_expand)
SearchVar(borg_expand)
SearchVar(available_depts)
SearchVar(cachedbooks)
SearchVar(total_extraction_beacons)
SearchVar(next_mob_id)
SearchVar(firstname)
SearchVar(ghost_darkness_images)
SearchVar(ghost_images_full)
SearchVar(ghost_images_default)
SearchVar(ghost_images_simple)
SearchVar(department_radio_keys)
SearchVar(crit_allowed_modes)
SearchVar(ventcrawl_machinery)
SearchVar(posibrain_notif_cooldown)
SearchVar(NO_SLIP_WHEN_WALKING)
SearchVar(SLIDE)
SearchVar(GALOSHES_DONT_HELP)
SearchVar(SLIDE_ICE)
SearchVar(limb_icon_cache)
SearchVar(MIN_IMPREGNATION_TIME)
SearchVar(MAX_IMPREGNATION_TIME)
SearchVar(MIN_ACTIVE_TIME)
SearchVar(MAX_ACTIVE_TIME)
SearchVar(default_martial_art)
SearchVar(plasmaman_on_fire)
SearchVar(ai_list)
SearchVar(announcing_vox)
SearchVar(VOX_CHANNEL)
SearchVar(VOX_DELAY)
SearchVar(vox_sounds)
SearchVar(CHUNK_SIZE)
SearchVar(cameranet)
SearchVar(mulebot_count)
SearchVar(MAX_CHICKENS)
SearchVar(chicken_count)
SearchVar(parasites)
SearchVar(protected_objects)
SearchVar(AISwarmers)
SearchVar(AISwarmersByType)
SearchVar(AISwarmerCapsByType)
SearchVar(slime_colours)
SearchVar(global_modular_computers)
SearchVar(file_uid)
SearchVar(nttransfer_uid)
SearchVar(ntnet_card_uid)
SearchVar(ntnet_global)
SearchVar(ntnrc_uid)
SearchVar(employmentCabinets)
SearchVar(cable_coil_recipes)
SearchVar(gravity_generators)
SearchVar(POWER_IDLE)
SearchVar(POWER_UP)
SearchVar(POWER_DOWN)
SearchVar(GRAV_NEEDS_SCREWDRIVER)
SearchVar(GRAV_NEEDS_WELDING)
SearchVar(GRAV_NEEDS_PLASTEEL)
SearchVar(GRAV_NEEDS_WRENCH)
SearchVar(rad_collectors)
SearchVar(blacklisted_tesla_types)
SearchVar(TOUCH)
SearchVar(INGEST)
SearchVar(VAPOR)
SearchVar(PATCH)
SearchVar(INJECT)
SearchVar(chemical_mob_spawn_meancritters)
SearchVar(chemical_mob_spawn_nicecritters)
SearchVar(message_servers)
SearchVar(blackbox)
SearchVar(keycard_events)
SearchVar(blacklisted_cargo_types)
SearchVar(z_levels_list)
SearchVar(spells)
SearchVar(non_simple_animals)
SearchVar(FrozenAccounts)
SearchVar(stockExchange)
SearchVar(stun_words)
SearchVar(weaken_words)
SearchVar(sleep_words)
SearchVar(vomit_words)
SearchVar(silence_words)
SearchVar(hallucinate_words)
SearchVar(wakeup_words)
SearchVar(heal_words)
SearchVar(hurt_words)
SearchVar(bleed_words)
SearchVar(burn_words)
SearchVar(hot_words)
SearchVar(cold_words)
SearchVar(repulse_words)
SearchVar(attract_words)
SearchVar(whoareyou_words)
SearchVar(saymyname_words)
SearchVar(knockknock_words)
SearchVar(statelaws_words)
SearchVar(move_words)
SearchVar(left_words)
SearchVar(right_words)
SearchVar(up_words)
SearchVar(down_words)
SearchVar(walk_words)
SearchVar(run_words)
SearchVar(helpintent_words)
SearchVar(disarmintent_words)
SearchVar(grabintent_words)
SearchVar(harmintent_words)
SearchVar(throwmode_words)
SearchVar(flip_words)
SearchVar(speak_words)
SearchVar(rest_words)
SearchVar(getup_words)
SearchVar(sit_words)
SearchVar(stand_words)
SearchVar(dance_words)
SearchVar(jump_words)
SearchVar(salute_words)
SearchVar(deathgasp_words)
SearchVar(clap_words)
SearchVar(honk_words)
SearchVar(multispin_words)
SearchVar(GPS_list)
SearchVar(uplinks)
SearchVar(uplink_items)
#endif